From c16462a0ce956b5a40bdfeb5db6c227c6e2a7cd7 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Fri, 30 Jun 2023 23:59:29 +0200 Subject: [PATCH 001/114] Experimental GIF support --- platformio.ini | 2 + wled00/FX.cpp | 12 +++++ wled00/FX.h | 2 +- wled00/fcn_declare.h | 11 ++++- wled00/image_loader.cpp | 104 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 wled00/image_loader.cpp diff --git a/platformio.ini b/platformio.ini index d3b71d3c4..1fd4d1aa2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -240,6 +240,8 @@ default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv lib_deps = https://github.com/lorol/LITTLEFS.git https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 + bitbank2/AnimatedGIF@^1.4.7 + pixelmatix/GifDecoder@^1.1.0 ${env.lib_deps} diff --git a/wled00/FX.cpp b/wled00/FX.cpp index f5fefd5b4..2db036e8c 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -4189,6 +4189,16 @@ uint16_t mode_washing_machine(void) { static const char _data_FX_MODE_WASHING_MACHINE[] PROGMEM = "Washing Machine@!,!;;!"; +/* + Image effect + Draws a .gif image from filesystem on the matrix/strip +*/ +uint16_t mode_image(void) { + renderImageToSegment(SEGMENT); + return FRAMETIME; +} +static const char _data_FX_MODE_IMAGE[] PROGMEM = "Image@;;;12"; + /* Blends random colors across palette Modified, originally by Mark Kriegsman https://gist.github.com/kriegsman/1f7ccbbfa492a73c015e @@ -7734,6 +7744,8 @@ void WS2812FX::setupEffectData() { addEffect(FX_MODE_DANCING_SHADOWS, &mode_dancing_shadows, _data_FX_MODE_DANCING_SHADOWS); addEffect(FX_MODE_WASHING_MACHINE, &mode_washing_machine, _data_FX_MODE_WASHING_MACHINE); + addEffect(FX_MODE_IMAGE, &mode_image, _data_FX_MODE_IMAGE); + addEffect(FX_MODE_BLENDS, &mode_blends, _data_FX_MODE_BLENDS); addEffect(FX_MODE_TV_SIMULATOR, &mode_tv_simulator, _data_FX_MODE_TV_SIMULATOR); addEffect(FX_MODE_DYNAMIC_SMOOTH, &mode_dynamic_smooth, _data_FX_MODE_DYNAMIC_SMOOTH); diff --git a/wled00/FX.h b/wled00/FX.h index 19b1fc4ac..045e3fc18 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -242,7 +242,7 @@ #define FX_MODE_CHUNCHUN 111 #define FX_MODE_DANCING_SHADOWS 112 #define FX_MODE_WASHING_MACHINE 113 -// #define FX_MODE_CANDY_CANE 114 // removed in 0.14! +#define FX_MODE_IMAGE 114 // was Candy Cane #define FX_MODE_BLENDS 115 #define FX_MODE_TV_SIMULATOR 116 #define FX_MODE_DYNAMIC_SMOOTH 117 // candidate for removal (check3 in dynamic) diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index c67fdbf38..72d589d49 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -5,6 +5,8 @@ * All globally accessible functions are declared here */ +#include "FX.h" + //alexa.cpp #ifndef WLED_DISABLE_ALEXA void onAlexaChange(EspalexaDevice* dev); @@ -103,6 +105,14 @@ void onHueConnect(void* arg, AsyncClient* client); void sendHuePoll(); void onHueData(void* arg, AsyncClient* client, void *data, size_t len); +//image_loader.cpp +bool fileSeekCallback(unsigned long position); +unsigned long filePositionCallback(void); +int fileReadCallback(void); +int fileReadBlockCallback(void * buffer, int numberOfBytes); +int fileSizeCallback(void); +bool renderImageToSegment(Segment &seg); + //improv.cpp enum ImprovRPCType { Command_Wifi = 0x01, @@ -140,7 +150,6 @@ void handleIR(); #include "ESPAsyncWebServer.h" #include "src/dependencies/json/ArduinoJson-v6.h" #include "src/dependencies/json/AsyncJson-v6.h" -#include "FX.h" bool deserializeSegment(JsonObject elem, byte it, byte presetId = 0); bool deserializeState(JsonObject root, byte callMode = CALL_MODE_DIRECT_CHANGE, byte presetId = 0); diff --git a/wled00/image_loader.cpp b/wled00/image_loader.cpp new file mode 100644 index 000000000..b26f6fe1d --- /dev/null +++ b/wled00/image_loader.cpp @@ -0,0 +1,104 @@ +#include "GifDecoder.h" +#include "wled.h" + +File file; +char lastFilename[34] = "/"; +GifDecoder<64, 64, 12, true> decoder; +bool gifDecodeFailed = false; +long lastFrameDisplayTime = 0, currentFrameDelay = 0; + +bool fileSeekCallback(unsigned long position) { + return file.seek(position); +} + +unsigned long filePositionCallback(void) { + return file.position(); +} + +int fileReadCallback(void) { + return file.read(); +} + +int fileReadBlockCallback(void * buffer, int numberOfBytes) { + return file.read((uint8_t*)buffer, numberOfBytes); +} + +int fileSizeCallback(void) { + return file.size(); +} + +bool openGif(const char *filename) { + file = WLED_FS.open(filename, "r"); + + if (!file) return false; + return true; +} + +Segment* activeSeg; +uint16_t gifWidth, gifHeight; +uint16_t fillPixX, fillPixY; + +void screenClearCallback(void) { + activeSeg->fill(0); +} + +void updateScreenCallback(void) {} + +void drawPixelCallback(int16_t x, int16_t y, uint8_t red, uint8_t green, uint8_t blue) { + // simple nearest-neighbor scaling + int16_t outY = y * activeSeg->height() / gifHeight; + int16_t outX = x * activeSeg->width() / gifWidth; + // set multiple pixels if upscaling + for (int16_t i = 0; i < (activeSeg->width()+(gifWidth-1)) / gifWidth; i++) { + for (int16_t j = 0; j < (activeSeg->height()+(gifHeight-1)) / gifHeight; j++) { + activeSeg->setPixelColorXY(outX + i, outY + j, red, green, blue); + } + } +} + +// renders an image (.gif only; .bmp and .fseq to be added soon) from FS to a segment +bool renderImageToSegment(Segment &seg) { + if (!seg.name) return false; + activeSeg = &seg; + + if (strncmp(lastFilename +1, seg.name, 32) != 0) { + Serial.println("segname changed"); + strncpy(lastFilename +1, seg.name, 32); + gifDecodeFailed = false; + if (strcmp(lastFilename + strlen(lastFilename) - 4, ".gif") != 0) { + //DEBUG_PRINTLN(F("Image file not found or not a .gif")); + gifDecodeFailed = true; + return false; + } + if (file) file.close(); + Serial.print("opening gif: "); + Serial.println(openGif(lastFilename)); + if (!file) { gifDecodeFailed = true; return false; } + decoder.setScreenClearCallback(screenClearCallback); + decoder.setUpdateScreenCallback(updateScreenCallback); + decoder.setDrawPixelCallback(drawPixelCallback); + decoder.setFileSeekCallback(fileSeekCallback); + decoder.setFilePositionCallback(filePositionCallback); + decoder.setFileReadCallback(fileReadCallback); + decoder.setFileReadBlockCallback(fileReadBlockCallback); + decoder.setFileSizeCallback(fileSizeCallback); + Serial.println("Starting decoding"); + if(decoder.startDecoding() < 0) { gifDecodeFailed = true; return false; } + Serial.println("Decoding started"); + } + + if (gifDecodeFailed) return false; + if (!file) { gifDecodeFailed = true; return false; } + + if((millis() - lastFrameDisplayTime) > currentFrameDelay) { + decoder.getSize(&gifWidth, &gifHeight); + fillPixX = (seg.width()+(gifWidth-1)) / gifWidth; + fillPixY = (seg.height()+(gifHeight-1)) / gifHeight; + Serial.println("decoding frame"); + int result = decoder.decodeFrame(false); + if (result < 0) { gifDecodeFailed = true; return false; } + currentFrameDelay = decoder.getFrameDelay_ms(); + lastFrameDisplayTime = millis(); + } + return true; +} \ No newline at end of file From 7119999df8055d6bbca9d0bba459ecb1aea57346 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Sat, 1 Jul 2023 13:20:10 +0200 Subject: [PATCH 002/114] Gamma and speed control --- wled00/FX.cpp | 7 ++++++- wled00/image_loader.cpp | 19 ++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 2db036e8c..abdbe5da8 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -4194,10 +4194,15 @@ static const char _data_FX_MODE_WASHING_MACHINE[] PROGMEM = "Washing Machine@!,! Draws a .gif image from filesystem on the matrix/strip */ uint16_t mode_image(void) { + SEGMENT.setUpLeds(); // temporary per-segment buffering renderImageToSegment(SEGMENT); + for (uint16_t i = 0; i < SEGLEN; i++) { + SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i)); // temporary, refresh all LEDs for lossy ABL + } + return FRAMETIME; } -static const char _data_FX_MODE_IMAGE[] PROGMEM = "Image@;;;12"; +static const char _data_FX_MODE_IMAGE[] PROGMEM = "Image@!,;;;12;sx=128"; /* Blends random colors across palette diff --git a/wled00/image_loader.cpp b/wled00/image_loader.cpp index b26f6fe1d..ad4ca0753 100644 --- a/wled00/image_loader.cpp +++ b/wled00/image_loader.cpp @@ -3,7 +3,7 @@ File file; char lastFilename[34] = "/"; -GifDecoder<64, 64, 12, true> decoder; +GifDecoder<64,64,12,true> decoder; bool gifDecodeFailed = false; long lastFrameDisplayTime = 0, currentFrameDelay = 0; @@ -51,7 +51,7 @@ void drawPixelCallback(int16_t x, int16_t y, uint8_t red, uint8_t green, uint8_t // set multiple pixels if upscaling for (int16_t i = 0; i < (activeSeg->width()+(gifWidth-1)) / gifWidth; i++) { for (int16_t j = 0; j < (activeSeg->height()+(gifHeight-1)) / gifHeight; j++) { - activeSeg->setPixelColorXY(outX + i, outY + j, red, green, blue); + activeSeg->setPixelColorXY(outX + i, outY + j, gamma8(red), gamma8(green), gamma8(blue)); } } } @@ -62,7 +62,7 @@ bool renderImageToSegment(Segment &seg) { activeSeg = &seg; if (strncmp(lastFilename +1, seg.name, 32) != 0) { - Serial.println("segname changed"); + //Serial.println("segname changed"); strncpy(lastFilename +1, seg.name, 32); gifDecodeFailed = false; if (strcmp(lastFilename + strlen(lastFilename) - 4, ".gif") != 0) { @@ -71,9 +71,11 @@ bool renderImageToSegment(Segment &seg) { return false; } if (file) file.close(); - Serial.print("opening gif: "); - Serial.println(openGif(lastFilename)); + //Serial.print("opening gif: "); + //Serial.println(openGif(lastFilename)); + openGif(lastFilename); if (!file) { gifDecodeFailed = true; return false; } + //decoder = new GifDecoder<64,64,12,true>(); decoder.setScreenClearCallback(screenClearCallback); decoder.setUpdateScreenCallback(updateScreenCallback); decoder.setDrawPixelCallback(drawPixelCallback); @@ -90,11 +92,14 @@ bool renderImageToSegment(Segment &seg) { if (gifDecodeFailed) return false; if (!file) { gifDecodeFailed = true; return false; } - if((millis() - lastFrameDisplayTime) > currentFrameDelay) { + // speed 0 = half speed, 128 = normal, 255 = as fast as possible + // TODO: 0 = 4x slow, 64 = 2x slow, 128 = normal, 192 = 2x fast, 255 = 4x fast + uint32_t wait = currentFrameDelay * 2 - seg.speed * currentFrameDelay / 128; + + if((millis() - lastFrameDisplayTime) > wait) { decoder.getSize(&gifWidth, &gifHeight); fillPixX = (seg.width()+(gifWidth-1)) / gifWidth; fillPixY = (seg.height()+(gifHeight-1)) / gifHeight; - Serial.println("decoding frame"); int result = decoder.decodeFrame(false); if (result < 0) { gifDecodeFailed = true; return false; } currentFrameDelay = decoder.getFrameDelay_ms(); From ed69692f08d25b3334df7eea5bab07d17a2c5e55 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Sat, 1 Jul 2023 15:36:41 +0200 Subject: [PATCH 003/114] Dynamic --- wled00/image_loader.cpp | 44 +++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/wled00/image_loader.cpp b/wled00/image_loader.cpp index ad4ca0753..af9075485 100644 --- a/wled00/image_loader.cpp +++ b/wled00/image_loader.cpp @@ -3,7 +3,7 @@ File file; char lastFilename[34] = "/"; -GifDecoder<64,64,12,true> decoder; +GifDecoder<320,320,12,true>* decoder; bool gifDecodeFailed = false; long lastFrameDisplayTime = 0, currentFrameDelay = 0; @@ -75,35 +75,45 @@ bool renderImageToSegment(Segment &seg) { //Serial.println(openGif(lastFilename)); openGif(lastFilename); if (!file) { gifDecodeFailed = true; return false; } - //decoder = new GifDecoder<64,64,12,true>(); - decoder.setScreenClearCallback(screenClearCallback); - decoder.setUpdateScreenCallback(updateScreenCallback); - decoder.setDrawPixelCallback(drawPixelCallback); - decoder.setFileSeekCallback(fileSeekCallback); - decoder.setFilePositionCallback(filePositionCallback); - decoder.setFileReadCallback(fileReadCallback); - decoder.setFileReadBlockCallback(fileReadBlockCallback); - decoder.setFileSizeCallback(fileSizeCallback); + if (!decoder) decoder = new GifDecoder<320,320,12,true>(); + decoder->setScreenClearCallback(screenClearCallback); + decoder->setUpdateScreenCallback(updateScreenCallback); + decoder->setDrawPixelCallback(drawPixelCallback); + decoder->setFileSeekCallback(fileSeekCallback); + decoder->setFilePositionCallback(filePositionCallback); + decoder->setFileReadCallback(fileReadCallback); + decoder->setFileReadBlockCallback(fileReadBlockCallback); + decoder->setFileSizeCallback(fileSizeCallback); Serial.println("Starting decoding"); - if(decoder.startDecoding() < 0) { gifDecodeFailed = true; return false; } + if(decoder->startDecoding() < 0) { gifDecodeFailed = true; return false; } Serial.println("Decoding started"); } if (gifDecodeFailed) return false; - if (!file) { gifDecodeFailed = true; return false; } + if (!file || !decoder) { gifDecodeFailed = true; return false; } - // speed 0 = half speed, 128 = normal, 255 = as fast as possible + // speed 0 = half speed, 128 = normal, 255 = full FX FPS // TODO: 0 = 4x slow, 64 = 2x slow, 128 = normal, 192 = 2x fast, 255 = 4x fast uint32_t wait = currentFrameDelay * 2 - seg.speed * currentFrameDelay / 128; - if((millis() - lastFrameDisplayTime) > wait) { - decoder.getSize(&gifWidth, &gifHeight); + if((millis() - lastFrameDisplayTime) >= wait) { + decoder->getSize(&gifWidth, &gifHeight); fillPixX = (seg.width()+(gifWidth-1)) / gifWidth; fillPixY = (seg.height()+(gifHeight-1)) / gifHeight; - int result = decoder.decodeFrame(false); + int result = decoder->decodeFrame(false); if (result < 0) { gifDecodeFailed = true; return false; } - currentFrameDelay = decoder.getFrameDelay_ms(); + long lastFrameDelay = currentFrameDelay; + currentFrameDelay = decoder->getFrameDelay_ms(); + long tooSlowBy = (millis() - lastFrameDisplayTime) - wait; // if last frame was longer than intended, compensate + currentFrameDelay -= tooSlowBy; + //currentFrameDelay -= LASTFRAMEDELAY; lastFrameDisplayTime = millis(); } return true; +} + +void endPlayback() { + if (file) file.close(); + delete decoder; + gifDecodeFailed = false; } \ No newline at end of file From 2f9c126d34ecc2f1c69c56824aa96000c37f30d4 Mon Sep 17 00:00:00 2001 From: Aircoookie <21045690+Aircoookie@users.noreply.github.com> Date: Mon, 31 Jul 2023 18:13:03 +0200 Subject: [PATCH 004/114] GIF Error codes --- wled00/fcn_declare.h | 4 +++- wled00/image_loader.cpp | 45 ++++++++++++++++++++++++++--------------- wled00/wled.h | 2 ++ 3 files changed, 34 insertions(+), 17 deletions(-) diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 72d589d49..df793a5a7 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -106,12 +106,14 @@ void sendHuePoll(); void onHueData(void* arg, AsyncClient* client, void *data, size_t len); //image_loader.cpp +#ifndef WLED_DISABLE_GIF bool fileSeekCallback(unsigned long position); unsigned long filePositionCallback(void); int fileReadCallback(void); int fileReadBlockCallback(void * buffer, int numberOfBytes); int fileSizeCallback(void); -bool renderImageToSegment(Segment &seg); +byte renderImageToSegment(Segment &seg); +#endif //improv.cpp enum ImprovRPCType { diff --git a/wled00/image_loader.cpp b/wled00/image_loader.cpp index af9075485..038a7d0b3 100644 --- a/wled00/image_loader.cpp +++ b/wled00/image_loader.cpp @@ -1,3 +1,5 @@ +#ifndef WLED_DISABLE_GIF + #include "GifDecoder.h" #include "wled.h" @@ -56,26 +58,34 @@ void drawPixelCallback(int16_t x, int16_t y, uint8_t red, uint8_t green, uint8_t } } +#define IMAGE_ERROR_NONE 0 +#define IMAGE_ERROR_NO_NAME 1 +#define IMAGE_ERROR_SEG_LIMIT 2 +#define IMAGE_ERROR_UNSUPPORTED_FORMAT 3 +#define IMAGE_ERROR_FILE_MISSING 4 +#define IMAGE_ERROR_DECODER_ALLOC 5 +#define IMAGE_ERROR_GIF_DECODE 6 +#define IMAGE_ERROR_FRAME_DECODE 7 +#define IMAGE_ERROR_PREV 255 + // renders an image (.gif only; .bmp and .fseq to be added soon) from FS to a segment -bool renderImageToSegment(Segment &seg) { - if (!seg.name) return false; +byte renderImageToSegment(Segment &seg) { + if (!seg.name) return IMAGE_ERROR_NO_NAME; + if (activeSeg && activeSeg != &seg) return IMAGE_ERROR_SEG_LIMIT; // only one segment at a time activeSeg = &seg; - if (strncmp(lastFilename +1, seg.name, 32) != 0) { - //Serial.println("segname changed"); + if (strncmp(lastFilename +1, seg.name, 32) != 0) { // segment name changed, load new image strncpy(lastFilename +1, seg.name, 32); gifDecodeFailed = false; if (strcmp(lastFilename + strlen(lastFilename) - 4, ".gif") != 0) { - //DEBUG_PRINTLN(F("Image file not found or not a .gif")); gifDecodeFailed = true; - return false; + return IMAGE_ERROR_UNSUPPORTED_FORMAT; } if (file) file.close(); - //Serial.print("opening gif: "); - //Serial.println(openGif(lastFilename)); openGif(lastFilename); - if (!file) { gifDecodeFailed = true; return false; } + if (!file) { gifDecodeFailed = true; return IMAGE_ERROR_FILE_MISSING; } if (!decoder) decoder = new GifDecoder<320,320,12,true>(); + if (!decoder) { gifDecodeFailed = true; return IMAGE_ERROR_DECODER_ALLOC; } decoder->setScreenClearCallback(screenClearCallback); decoder->setUpdateScreenCallback(updateScreenCallback); decoder->setDrawPixelCallback(drawPixelCallback); @@ -85,12 +95,13 @@ bool renderImageToSegment(Segment &seg) { decoder->setFileReadBlockCallback(fileReadBlockCallback); decoder->setFileSizeCallback(fileSizeCallback); Serial.println("Starting decoding"); - if(decoder->startDecoding() < 0) { gifDecodeFailed = true; return false; } + if(decoder->startDecoding() < 0) { gifDecodeFailed = true; return IMAGE_ERROR_GIF_DECODE; } Serial.println("Decoding started"); } - if (gifDecodeFailed) return false; - if (!file || !decoder) { gifDecodeFailed = true; return false; } + if (gifDecodeFailed) return IMAGE_ERROR_PREV; + if (!file) { gifDecodeFailed = true; return IMAGE_ERROR_FILE_MISSING; } + if (!decoder) { gifDecodeFailed = true; return IMAGE_ERROR_DECODER_ALLOC; } // speed 0 = half speed, 128 = normal, 255 = full FX FPS // TODO: 0 = 4x slow, 64 = 2x slow, 128 = normal, 192 = 2x fast, 255 = 4x fast @@ -101,19 +112,21 @@ bool renderImageToSegment(Segment &seg) { fillPixX = (seg.width()+(gifWidth-1)) / gifWidth; fillPixY = (seg.height()+(gifHeight-1)) / gifHeight; int result = decoder->decodeFrame(false); - if (result < 0) { gifDecodeFailed = true; return false; } + if (result < 0) { gifDecodeFailed = true; return IMAGE_ERROR_FRAME_DECODE; } long lastFrameDelay = currentFrameDelay; currentFrameDelay = decoder->getFrameDelay_ms(); long tooSlowBy = (millis() - lastFrameDisplayTime) - wait; // if last frame was longer than intended, compensate currentFrameDelay -= tooSlowBy; - //currentFrameDelay -= LASTFRAMEDELAY; lastFrameDisplayTime = millis(); } return true; } -void endPlayback() { +void endImagePlayback() { if (file) file.close(); delete decoder; gifDecodeFailed = false; -} \ No newline at end of file + activeSeg = nullptr; +} + +#endif \ No newline at end of file diff --git a/wled00/wled.h b/wled00/wled.h index 152110b2a..74360e00a 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -78,6 +78,8 @@ #ifndef WLED_DISABLE_ESPNOW #include #endif + #undef WLED_DISABLE_GIF + #define WLED_DISABLE_GIF #else // ESP32 #include // ensure we have the correct "Serial" on new MCUs (depends on ARDUINO_USB_MODE and ARDUINO_USB_CDC_ON_BOOT) #include From 6be5360bdd44f13d73d235afc3e1944bd5d4cde8 Mon Sep 17 00:00:00 2001 From: cschwinne Date: Tue, 1 Aug 2023 00:48:18 +0200 Subject: [PATCH 005/114] Remove temp workaround --- wled00/FX.cpp | 5 ----- wled00/image_loader.cpp | 1 + 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index db7c4037e..58eb73ec8 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -4192,12 +4192,7 @@ static const char _data_FX_MODE_WASHING_MACHINE[] PROGMEM = "Washing Machine@!,! Draws a .gif image from filesystem on the matrix/strip */ uint16_t mode_image(void) { - SEGMENT.setUpLeds(); // temporary per-segment buffering renderImageToSegment(SEGMENT); - for (uint16_t i = 0; i < SEGLEN; i++) { - SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i)); // temporary, refresh all LEDs for lossy ABL - } - return FRAMETIME; } static const char _data_FX_MODE_IMAGE[] PROGMEM = "Image@!,;;;12;sx=128"; diff --git a/wled00/image_loader.cpp b/wled00/image_loader.cpp index 038a7d0b3..500fbc2dd 100644 --- a/wled00/image_loader.cpp +++ b/wled00/image_loader.cpp @@ -127,6 +127,7 @@ void endImagePlayback() { delete decoder; gifDecodeFailed = false; activeSeg = nullptr; + lastFilename[0] = '\0'; } #endif \ No newline at end of file From 26ab1bfd4f54d2107aba37c4e9819f8fbdce00d1 Mon Sep 17 00:00:00 2001 From: skinnyquiver Date: Mon, 4 Dec 2023 19:17:15 -0600 Subject: [PATCH 006/114] [Feat] Adds new esp32s3dev_16MB_PSRAM_opi dev board to work with LilyGo T7_s3 ESP32-S3-WROOM-1-N16R8 --- platformio.ini | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index f3caa585e..b7cd10684 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,8 +11,8 @@ # CI binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth # ESP32 variant builds are temporarily excluded from CI due to toolchain issues on the GitHub Actions Linux environment -default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi - +default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi, esp32s3dev_16MB_PSRAM_opi +; default_envs = esp32s3dev_16MB_PSRAM_opi # Release binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB @@ -524,6 +524,29 @@ board_build.f_flash = 80000000L board_build.flash_mode = qio monitor_filters = esp32_exception_decoder +[env:esp32s3dev_16MB_PSRAM_opi] +board = esp32-s3-devkitc-1 +board_build.arduino.memory_type = qio_opi +platform = ${esp32s3.platform} +platform_packages = ${esp32s3.platform_packages} +upload_speed = 921600 +framework = arduino + +# Configure options for the N16R8V variant +build_flags= ${common.build_flags} ${esp32s3.build_flags} + -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 + -D ARDUINO_USB_CDC_ON_BOOT=0 -D ARDUINO_USB_MODE=1 ;; for boards with serial-to-USB chip + ;-D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") + ; -D WLED_RELEASE_NAME=ESP32-S3_PSRAM + -D WLED_USE_PSRAM -DBOARD_HAS_PSRAM ; tells WLED that PSRAM shall be used + -D BOARD_HAS_PSRAM +lib_deps = ${esp32s3.lib_deps} +board_build.partitions = tools/WLED_ESP32_16MB.CSV +board_upload.flash_size = 16MB +board_build.f_flash = 80000000L +board_build.flash_mode = qio +monitor_filters = esp32_exception_decoder + [env:esp32s3dev_8MB_PSRAM_qspi] ;; ESP32-TinyS3 development board, with 8MB FLASH and PSRAM (memory_type: qio_qspi) extends = env:esp32s3dev_8MB_PSRAM_opi From aeb9e2ad9fd79f1352475185a2927025c6192836 Mon Sep 17 00:00:00 2001 From: skinnyquiver Date: Mon, 4 Dec 2023 19:24:35 -0600 Subject: [PATCH 007/114] [fix] Removes additional default envs line --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index b7cd10684..fd5a27702 100644 --- a/platformio.ini +++ b/platformio.ini @@ -12,7 +12,7 @@ # CI binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth # ESP32 variant builds are temporarily excluded from CI due to toolchain issues on the GitHub Actions Linux environment default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi, esp32s3dev_16MB_PSRAM_opi -; default_envs = esp32s3dev_16MB_PSRAM_opi + # Release binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB From 90d696d8263a8d47a8b73962dc794b11ee709b87 Mon Sep 17 00:00:00 2001 From: David Rasch Date: Tue, 5 Dec 2023 10:54:32 -0500 Subject: [PATCH 008/114] fix(esp32c3-2mb): correct flash size for c3 board with only 2MB --- platformio.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platformio.ini b/platformio.ini index f3caa585e..7d65ac07d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -642,6 +642,8 @@ upload_speed = 115200 lib_deps = ${esp32c3.lib_deps} board_build.partitions = tools/WLED_ESP32_2MB_noOTA.csv board_build.flash_mode = dio +board_upload.flash_size = 2MB +board_upload.maximum_size = 2097152 [env:wemos_shield_esp32] board = esp32dev From 84802d9065789d8f2938648ecbf617780e5a6e82 Mon Sep 17 00:00:00 2001 From: skinnyquiver Date: Tue, 5 Dec 2023 10:36:31 -0600 Subject: [PATCH 009/114] [fix] Uses extends as per softhack007 comment --- platformio.ini | 25 ++++--------------------- 1 file changed, 4 insertions(+), 21 deletions(-) diff --git a/platformio.ini b/platformio.ini index fd5a27702..21ca6ea97 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,7 +11,7 @@ # CI binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth # ESP32 variant builds are temporarily excluded from CI due to toolchain issues on the GitHub Actions Linux environment -default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi, esp32s3dev_16MB_PSRAM_opi +default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi # Release binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB @@ -42,6 +42,7 @@ default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32d ; default_envs = esp32s2_saola ; default_envs = esp32c3dev ; default_envs = lolin_s2_mini +; default_envs = esp32s3dev_16MB_PSRAM_opi src_dir = ./wled00 data_dir = ./wled00/data @@ -525,27 +526,9 @@ board_build.flash_mode = qio monitor_filters = esp32_exception_decoder [env:esp32s3dev_16MB_PSRAM_opi] -board = esp32-s3-devkitc-1 -board_build.arduino.memory_type = qio_opi -platform = ${esp32s3.platform} -platform_packages = ${esp32s3.platform_packages} -upload_speed = 921600 -framework = arduino - -# Configure options for the N16R8V variant -build_flags= ${common.build_flags} ${esp32s3.build_flags} - -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D WLED_WATCHDOG_TIMEOUT=0 - -D ARDUINO_USB_CDC_ON_BOOT=0 -D ARDUINO_USB_MODE=1 ;; for boards with serial-to-USB chip - ;-D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") - ; -D WLED_RELEASE_NAME=ESP32-S3_PSRAM - -D WLED_USE_PSRAM -DBOARD_HAS_PSRAM ; tells WLED that PSRAM shall be used - -D BOARD_HAS_PSRAM -lib_deps = ${esp32s3.lib_deps} -board_build.partitions = tools/WLED_ESP32_16MB.CSV +extends = env:esp32s3dev_8MB_PSRAM_opi +board_build.partitions = tools/WLED_ESP32_16MB.csv board_upload.flash_size = 16MB -board_build.f_flash = 80000000L -board_build.flash_mode = qio -monitor_filters = esp32_exception_decoder [env:esp32s3dev_8MB_PSRAM_qspi] ;; ESP32-TinyS3 development board, with 8MB FLASH and PSRAM (memory_type: qio_qspi) From 809a294f9d80463b8073d30c5c4978ae2924c9cd Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Fri, 22 Dec 2023 15:43:31 +0100 Subject: [PATCH 010/114] Fix Pixel Magic button. --- wled00/data/index.htm | 2 +- wled00/html_ui.h | 2665 ++++++++++++++++++++--------------------- 2 files changed, 1333 insertions(+), 1334 deletions(-) diff --git a/wled00/data/index.htm b/wled00/data/index.htm index e6ce04896..7665a6e5d 100644 --- a/wled00/data/index.htm +++ b/wled00/data/index.htm @@ -200,7 +200,7 @@
- +
diff --git a/wled00/html_ui.h b/wled00/html_ui.h index 941869572..ededcc1e9 100644 --- a/wled00/html_ui.h +++ b/wled00/html_ui.h @@ -7,9 +7,9 @@ */ // Autogenerated from wled00/data/index.htm, do not edit!! -const uint16_t PAGE_index_L = 32025; +const uint16_t PAGE_index_L = 32008; const uint8_t PAGE_index[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xcc, 0xbd, 0xe9, 0x76, 0xe2, 0xca, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xcc, 0xbd, 0xe9, 0x76, 0xe2, 0xca, 0xb2, 0x30, 0xf8, 0xdf, 0x4f, 0xa1, 0x52, 0xed, 0xe3, 0x82, 0x8d, 0x0c, 0x62, 0x34, 0x43, 0x61, 0x5f, 0x8c, 0xe7, 0xd9, 0xc6, 0x73, 0xdd, 0x5a, 0xb7, 0x04, 0x24, 0x20, 0x5b, 0x48, 0xb2, 0x24, 0x06, 0x9b, 0xe2, 0x3e, 0x46, 0xaf, 0xd5, 0x2f, 0xd0, 0x3f, 0xba, 0xdf, 0xaa, 0x9f, 0xa4, 0x23, @@ -680,1335 +680,1334 @@ const uint8_t PAGE_index[] PROGMEM = { 0x09, 0xf5, 0x92, 0x21, 0x9f, 0x1a, 0xe7, 0x17, 0x1a, 0xe2, 0xcc, 0x86, 0x21, 0x3d, 0xcf, 0x73, 0x9f, 0x83, 0x0c, 0xf7, 0xc8, 0x2c, 0x9d, 0x4e, 0x0b, 0x0b, 0x22, 0x3b, 0x85, 0x61, 0x41, 0x84, 0xe7, 0xb7, 0xb8, 0x88, 0xfd, 0x99, 0x1e, 0x87, 0x53, 0x97, 0x07, 0x8e, 0xcc, 0x63, 0x48, 0x9b, - 0x4d, 0x34, 0xcb, 0x5f, 0x3c, 0x6c, 0xb8, 0xc4, 0x48, 0x51, 0x67, 0x4a, 0x5f, 0xed, 0xdc, 0x80, - 0x90, 0x18, 0x73, 0xea, 0x10, 0xa1, 0x7a, 0xff, 0x98, 0xc5, 0xa3, 0xfa, 0xb5, 0xbf, 0xd1, 0xf7, - 0x07, 0x47, 0x10, 0x1d, 0x98, 0xba, 0xf4, 0xc0, 0x19, 0xba, 0x47, 0x10, 0x4b, 0xa0, 0x61, 0x67, - 0x4d, 0x65, 0x25, 0xba, 0x08, 0xff, 0x3a, 0x34, 0xee, 0x9a, 0xb2, 0x77, 0x81, 0x45, 0xd6, 0xf5, - 0x91, 0xa6, 0x49, 0x08, 0x98, 0xd6, 0x72, 0x60, 0x67, 0xeb, 0x93, 0xb4, 0x45, 0x86, 0xc6, 0x98, - 0x1c, 0x39, 0x64, 0x98, 0x10, 0x27, 0x1a, 0x41, 0x2a, 0x98, 0x8a, 0x49, 0xd8, 0xfa, 0x5e, 0x47, - 0xc4, 0x76, 0x8e, 0x6d, 0x43, 0x4f, 0xcc, 0xac, 0x21, 0x02, 0x5d, 0xfd, 0x22, 0x87, 0xbf, 0x38, - 0xcb, 0x13, 0x8d, 0x94, 0x2b, 0xca, 0x12, 0x9f, 0x80, 0xdd, 0xc1, 0x08, 0xd7, 0x56, 0x23, 0x5c, - 0xce, 0x6f, 0x2e, 0x61, 0x33, 0x11, 0x7a, 0xdf, 0x03, 0xb9, 0xb1, 0xe3, 0xd8, 0x22, 0x7f, 0x36, - 0x12, 0x63, 0xca, 0xee, 0x4d, 0xc5, 0x38, 0x7e, 0xdf, 0x65, 0x5c, 0x0a, 0x3f, 0x2c, 0xe2, 0x72, - 0xfc, 0x35, 0xd6, 0xa0, 0x30, 0x74, 0x0f, 0x55, 0x96, 0xb2, 0x14, 0xb7, 0x59, 0xf4, 0x39, 0xf8, - 0xf7, 0xd9, 0x0b, 0xf3, 0x7d, 0x5d, 0xc1, 0x5d, 0xbc, 0x02, 0x52, 0xff, 0xa8, 0x9b, 0x10, 0x99, - 0xa7, 0xa3, 0x2d, 0x26, 0xd3, 0x14, 0x30, 0xfc, 0x70, 0x31, 0x7e, 0xc5, 0x18, 0x32, 0x14, 0xd8, - 0x37, 0x58, 0x2b, 0x6d, 0x6d, 0x64, 0xd5, 0xbf, 0x2d, 0x2d, 0xce, 0xa6, 0xd7, 0xaf, 0xf1, 0x3f, - 0xcb, 0xb3, 0x38, 0xaa, 0x5b, 0x0a, 0x10, 0x5b, 0x98, 0x09, 0x11, 0xbd, 0xde, 0x70, 0x08, 0xee, - 0xba, 0x0f, 0x7b, 0xb2, 0x7b, 0x67, 0x90, 0x1e, 0xfb, 0x8b, 0x52, 0x83, 0x8b, 0xa6, 0x7f, 0x90, - 0xf9, 0xed, 0x3f, 0xfc, 0xff, 0xc3, 0xf6, 0x02, 0xfd, 0xda, 0x0e, 0xd1, 0xb1, 0x8b, 0x39, 0x0f, - 0x16, 0xf6, 0x1e, 0x0c, 0x28, 0x28, 0x73, 0x89, 0x9a, 0xbd, 0x07, 0x16, 0x73, 0xb7, 0xa4, 0x17, - 0x3b, 0xe8, 0xb4, 0x65, 0xf7, 0xf3, 0x8d, 0x72, 0x2d, 0x4c, 0xb5, 0xb4, 0x4c, 0xdb, 0x98, 0xba, - 0x02, 0x54, 0x4f, 0x73, 0xea, 0xa2, 0x5f, 0x34, 0x64, 0xd8, 0x60, 0x1d, 0xec, 0x4f, 0x3d, 0x3a, - 0x08, 0x9b, 0x21, 0x7c, 0x2f, 0x4e, 0x14, 0x9f, 0xbc, 0x71, 0x7b, 0x03, 0x76, 0xd1, 0x1e, 0x80, - 0x29, 0xef, 0x8a, 0xc2, 0x22, 0x90, 0x02, 0xa5, 0x02, 0x80, 0xb4, 0x9c, 0xcb, 0x95, 0x96, 0xc2, - 0xb9, 0xc6, 0x03, 0x4a, 0x4b, 0xf2, 0xa6, 0x87, 0xbf, 0x0c, 0xe5, 0x5a, 0x14, 0xcc, 0x00, 0xca, - 0x6c, 0x2c, 0x94, 0x14, 0xc0, 0x4a, 0x21, 0xe7, 0x03, 0xb8, 0xb6, 0x0a, 0x93, 0xb4, 0xe4, 0x27, - 0x00, 0x5c, 0xfb, 0x3c, 0x1e, 0x03, 0x00, 0x73, 0x4b, 0x00, 0x84, 0xe5, 0x52, 0x29, 0xe5, 0x3f, - 0x37, 0xd5, 0xb4, 0xe0, 0x4a, 0x00, 0xd7, 0xfe, 0xea, 0x44, 0x07, 0x00, 0xde, 0x19, 0xcb, 0xc9, - 0xb1, 0x52, 0xce, 0x17, 0x3e, 0x07, 0x21, 0x16, 0xfc, 0x1f, 0x23, 0xc5, 0x7d, 0xd8, 0xdb, 0x96, - 0x4d, 0x33, 0xf4, 0x5c, 0xfc, 0x1c, 0x1d, 0xd2, 0x92, 0xff, 0x14, 0x1d, 0x46, 0x8f, 0xf5, 0x28, - 0x43, 0x90, 0x63, 0x2c, 0x76, 0x51, 0xe6, 0xcb, 0x9f, 0xc3, 0xaf, 0xf1, 0x32, 0x36, 0x0c, 0x92, - 0xbc, 0x13, 0x4f, 0xcc, 0xce, 0xe7, 0x8a, 0x1f, 0x9f, 0xb0, 0xf3, 0x4a, 0x8b, 0x7b, 0x32, 0x68, - 0x12, 0x34, 0x78, 0xad, 0x34, 0xfb, 0xd1, 0x32, 0xae, 0x45, 0xf4, 0x33, 0xc7, 0xee, 0xff, 0xa8, - 0x59, 0xf4, 0x93, 0xa7, 0xee, 0xcc, 0x5c, 0x18, 0x8c, 0x8b, 0xca, 0x00, 0x01, 0x7a, 0x43, 0x06, - 0x44, 0x57, 0x2e, 0xb0, 0x71, 0x58, 0x71, 0xf6, 0x43, 0x0e, 0x3d, 0xd9, 0xbf, 0x38, 0x41, 0xfc, - 0xfc, 0x50, 0x10, 0xa8, 0xa8, 0x4d, 0x77, 0xba, 0x82, 0x5c, 0xf9, 0xf4, 0x04, 0x05, 0x00, 0x1c, - 0xe1, 0xe6, 0x64, 0xab, 0xce, 0x5b, 0xec, 0x79, 0x10, 0x37, 0x49, 0x7e, 0xc1, 0xbf, 0xea, 0x1e, - 0x21, 0xff, 0xaf, 0x75, 0x8f, 0x58, 0x66, 0xe6, 0xe6, 0xb1, 0x4e, 0x31, 0x97, 0xf5, 0x27, 0x4a, - 0xf5, 0x86, 0xb6, 0xf4, 0x8c, 0x9c, 0xd6, 0xca, 0x45, 0x0f, 0x00, 0xdc, 0xad, 0x67, 0xe5, 0x8c, - 0x85, 0x74, 0x82, 0xbf, 0x78, 0xe2, 0xd2, 0xcc, 0xc6, 0x1e, 0x46, 0xf1, 0x87, 0x06, 0x23, 0xdb, - 0x31, 0x86, 0xd4, 0xac, 0xf2, 0xd7, 0x96, 0xce, 0x5a, 0xbc, 0x6f, 0xc3, 0x5f, 0x31, 0xa0, 0xbb, - 0xf3, 0xb1, 0xf6, 0xb7, 0x27, 0x24, 0x32, 0x1f, 0x39, 0xa0, 0x63, 0x36, 0x1e, 0x21, 0xbb, 0x7a, - 0x22, 0xf2, 0x91, 0x45, 0xc3, 0xcd, 0xc3, 0xda, 0xea, 0x89, 0xf0, 0x3c, 0xb3, 0xfe, 0x22, 0x13, - 0x6b, 0xe6, 0x3e, 0xe0, 0x60, 0xee, 0x3c, 0xe4, 0xfe, 0x19, 0x1e, 0x26, 0xff, 0x0f, 0x72, 0xb0, - 0x4f, 0x4c, 0x44, 0x5e, 0xdc, 0x72, 0xe7, 0x21, 0xb7, 0x7a, 0x1e, 0x0a, 0x7f, 0x7b, 0x41, 0xc8, - 0xa4, 0xfc, 0xb7, 0x16, 0x44, 0xfe, 0x93, 0x0b, 0x22, 0xff, 0x99, 0x05, 0x91, 0xcf, 0xfe, 0x6f, - 0xbd, 0x1e, 0x0a, 0xc1, 0x7a, 0xc8, 0x2f, 0x9b, 0x87, 0xde, 0xd4, 0x30, 0x03, 0x1d, 0xc6, 0xbd, - 0x86, 0x4d, 0xf5, 0xb4, 0x90, 0x5c, 0x05, 0x19, 0x72, 0x54, 0xa4, 0x32, 0x38, 0xe1, 0x39, 0xde, - 0x99, 0xd0, 0xb5, 0xab, 0x7d, 0xc0, 0x51, 0xa1, 0x6d, 0x77, 0x2f, 0xdc, 0x6a, 0xd2, 0x86, 0x83, - 0xc5, 0x1b, 0x4c, 0x1f, 0xed, 0xf2, 0xc2, 0x77, 0x94, 0xe3, 0xe4, 0xa1, 0xd0, 0xec, 0x5d, 0xd0, - 0x01, 0x24, 0xb2, 0x12, 0x3d, 0x00, 0x74, 0x6f, 0x5d, 0xfd, 0x25, 0x51, 0x6d, 0x2d, 0x3c, 0xea, - 0x6c, 0x44, 0x48, 0xfb, 0x70, 0xd0, 0xf9, 0x42, 0x9b, 0x1b, 0xf4, 0xda, 0xb2, 0x69, 0xf2, 0x06, - 0x9d, 0xf5, 0x06, 0x9d, 0x5b, 0x3a, 0xe8, 0x9c, 0xb8, 0x28, 0xeb, 0xc7, 0x0d, 0x3a, 0xf7, 0xe9, - 0x41, 0xaf, 0xad, 0x12, 0xa1, 0x01, 0xb2, 0xdc, 0x5f, 0x19, 0x34, 0x53, 0x92, 0x0b, 0x9d, 0x0f, - 0xa6, 0x9a, 0x1f, 0x74, 0xce, 0x1b, 0x74, 0x3e, 0x32, 0xe8, 0xb5, 0x60, 0xd4, 0xf9, 0xc5, 0xa9, - 0x8e, 0x1b, 0x74, 0x7e, 0xc9, 0xa0, 0x3f, 0xa5, 0xd8, 0x2c, 0xd5, 0x88, 0x11, 0x8c, 0x16, 0xe9, - 0x0f, 0x31, 0xac, 0xf9, 0x47, 0xd6, 0x1e, 0xf7, 0xee, 0x47, 0x54, 0x09, 0x8f, 0xb0, 0x3b, 0x76, - 0x1d, 0x84, 0x63, 0x77, 0xec, 0x6b, 0x4a, 0xe2, 0xd6, 0xb2, 0xa2, 0xb9, 0xe5, 0x26, 0x47, 0xdb, - 0x5d, 0x38, 0x96, 0x0d, 0x6f, 0x9c, 0x44, 0x67, 0x01, 0xc8, 0x54, 0x9a, 0xbb, 0x26, 0x80, 0x20, - 0xc1, 0x76, 0x07, 0x10, 0x63, 0x3d, 0xdf, 0xba, 0x09, 0x62, 0x02, 0x84, 0xbc, 0x20, 0x1d, 0xc7, - 0x43, 0x3b, 0xbb, 0x23, 0x11, 0xf0, 0x37, 0xca, 0xf0, 0x4a, 0xc5, 0x74, 0xd1, 0x73, 0xf6, 0x92, - 0xd3, 0xd9, 0x80, 0xcf, 0xa5, 0x37, 0x81, 0xfa, 0xf5, 0xb6, 0x6d, 0xd6, 0x98, 0x6f, 0x34, 0x9a, - 0xbf, 0xa8, 0x47, 0x29, 0xfd, 0x18, 0x99, 0x4f, 0x4e, 0x2e, 0x09, 0xd1, 0x02, 0x91, 0x61, 0x5f, - 0x5a, 0x08, 0xf4, 0x87, 0xd8, 0x36, 0x5f, 0x35, 0x71, 0xc5, 0x99, 0x4a, 0x57, 0xdc, 0x72, 0x1b, - 0xe2, 0x4e, 0x53, 0x96, 0x19, 0xd4, 0xd8, 0x25, 0x9e, 0x78, 0x83, 0x5a, 0xac, 0x3d, 0x6d, 0x6d, - 0x89, 0xbd, 0x9e, 0xce, 0x7f, 0xf2, 0x9b, 0xb0, 0xc4, 0x58, 0xef, 0x66, 0xc7, 0x88, 0x17, 0xbc, - 0xdd, 0xeb, 0x73, 0x66, 0xaf, 0xb5, 0x4f, 0xda, 0xea, 0x17, 0x4c, 0xf5, 0x14, 0x88, 0x88, 0xad, - 0xca, 0x55, 0xb1, 0xc3, 0x06, 0x78, 0x86, 0x3e, 0x24, 0xa3, 0x80, 0x9e, 0x97, 0xed, 0x1e, 0xe6, - 0x47, 0x44, 0xbd, 0xd4, 0x53, 0x98, 0x7e, 0x88, 0xd1, 0x70, 0xf9, 0x82, 0x5b, 0xc7, 0xf3, 0x61, - 0x0f, 0x8a, 0x68, 0xaa, 0xfe, 0xc2, 0x1f, 0x1d, 0x19, 0x26, 0xd1, 0x6f, 0x94, 0x76, 0x62, 0xb9, - 0xff, 0xba, 0xb7, 0xe5, 0xc4, 0xfa, 0xaf, 0x33, 0x47, 0xe4, 0x78, 0xcf, 0xf9, 0x85, 0x4e, 0xd7, - 0x16, 0x7a, 0xcd, 0x7e, 0xc2, 0x6b, 0x7e, 0xb1, 0x53, 0xd7, 0x68, 0xbc, 0xf6, 0xc9, 0x6e, 0x17, - 0x7a, 0xcd, 0x2d, 0xbd, 0x1d, 0xe1, 0x6f, 0x35, 0xb1, 0xb7, 0x40, 0xfc, 0xd5, 0xff, 0x37, 0x47, - 0x9b, 0x5f, 0x36, 0x5a, 0x9f, 0xd7, 0xc7, 0xde, 0xb1, 0x61, 0xe4, 0xb3, 0xb6, 0xfa, 0x8e, 0x80, - 0xfb, 0x71, 0x96, 0xf0, 0x21, 0x3d, 0xbb, 0x45, 0xa4, 0xa0, 0x49, 0x35, 0x6c, 0x03, 0xb6, 0xf6, - 0xf0, 0x8b, 0x3c, 0x37, 0x98, 0x85, 0x77, 0xc6, 0x92, 0x8b, 0xd5, 0xfc, 0x08, 0x67, 0xab, 0xae, - 0x7a, 0x44, 0xea, 0xe0, 0xa5, 0x4e, 0x7f, 0x41, 0xd0, 0x5b, 0xea, 0x31, 0x34, 0x18, 0x9c, 0x6d, - 0x08, 0xf4, 0xcb, 0x38, 0x9f, 0xbd, 0xbf, 0x22, 0xd0, 0xf8, 0x47, 0x0c, 0x5f, 0x78, 0x80, 0xb2, - 0x16, 0x39, 0x5f, 0xf0, 0x81, 0x18, 0xf6, 0xd9, 0x21, 0xef, 0xb0, 0xef, 0xd5, 0x9f, 0xa8, 0xa2, - 0xa0, 0x68, 0x8e, 0xeb, 0x82, 0x8f, 0xd6, 0x9e, 0x2a, 0xfd, 0xc2, 0x48, 0xc6, 0xd4, 0xfb, 0xb5, - 0xb6, 0x62, 0x93, 0x52, 0x41, 0x52, 0xef, 0x76, 0x2e, 0xae, 0x27, 0xf2, 0xc9, 0x41, 0xdf, 0x68, - 0xc0, 0x7f, 0xe7, 0xad, 0xdb, 0xc1, 0xde, 0x6d, 0x1f, 0x9e, 0x76, 0x64, 0x7c, 0xdf, 0x6f, 0x36, - 0x1e, 0xe1, 0xa7, 0x59, 0xdc, 0x1f, 0xf5, 0x8a, 0x98, 0xd0, 0x78, 0x38, 0x6f, 0x5d, 0xcb, 0x47, - 0x0d, 0xcb, 0x2e, 0x74, 0x4a, 0x57, 0x98, 0x70, 0xad, 0x5f, 0xdd, 0x66, 0x77, 0xa0, 0xcc, 0xf4, - 0x79, 0x32, 0x2e, 0x3f, 0x5e, 0xdd, 0x62, 0xe2, 0x71, 0x67, 0x6f, 0xf0, 0xd4, 0x99, 0x34, 0x1a, - 0xbb, 0xf6, 0x19, 0xbc, 0x6e, 0xee, 0x36, 0x3a, 0xdd, 0xf1, 0xeb, 0x01, 0x56, 0xd8, 0x69, 0xb7, - 0x6e, 0xaf, 0x77, 0xee, 0x9a, 0x83, 0x1b, 0xed, 0xb1, 0xd2, 0xde, 0x35, 0x1a, 0x93, 0xdd, 0xb3, - 0xf3, 0xfb, 0x4d, 0xbd, 0xa2, 0x4f, 0x9a, 0xaa, 0xf9, 0xe6, 0x5c, 0x9d, 0x17, 0x9e, 0xca, 0x4e, - 0xdb, 0xba, 0x39, 0x1c, 0xee, 0x0e, 0xf7, 0x0b, 0xc6, 0xe5, 0xfb, 0x9b, 0xd6, 0x9d, 0x5c, 0xbf, - 0x9a, 0xd9, 0x56, 0xab, 0xab, 0xdf, 0x65, 0xce, 0x47, 0x4f, 0xa3, 0xf7, 0x57, 0x62, 0x35, 0x76, - 0xde, 0xa6, 0x0f, 0xef, 0xfa, 0xce, 0x24, 0xaf, 0xf6, 0x5f, 0xc8, 0xfe, 0x5e, 0xef, 0xe1, 0xed, - 0x76, 0x34, 0x38, 0xc9, 0xbc, 0xed, 0x9f, 0xc9, 0xcd, 0xe9, 0x71, 0xef, 0xed, 0xf5, 0xe1, 0x69, - 0xef, 0xa2, 0x53, 0xca, 0xb4, 0xac, 0x4a, 0xa6, 0xdd, 0xdb, 0x1c, 0x1d, 0x35, 0x8b, 0xe7, 0x93, - 0xee, 0xa6, 0x61, 0x9d, 0x8d, 0x1b, 0x97, 0x74, 0x2c, 0x7b, 0xda, 0xfe, 0xcd, 0x4b, 0x6b, 0x74, - 0x35, 0x6c, 0x36, 0x45, 0x3c, 0x1b, 0x8b, 0xba, 0x04, 0x8f, 0xc3, 0x9c, 0x2b, 0xe4, 0x21, 0x13, - 0xbb, 0xa7, 0xba, 0x77, 0x7e, 0x79, 0xda, 0xe1, 0x4f, 0x9e, 0xe8, 0x86, 0xda, 0x03, 0xba, 0x1e, - 0xac, 0x3c, 0x02, 0x8b, 0x69, 0x25, 0x42, 0x81, 0x47, 0x3a, 0x30, 0x48, 0xbd, 0x43, 0x04, 0x3c, - 0x83, 0xf8, 0x8b, 0x6d, 0x79, 0xe7, 0x79, 0xb8, 0x3a, 0x13, 0xfe, 0x31, 0x1e, 0x53, 0x4c, 0xc4, - 0xa4, 0x24, 0xfe, 0x97, 0x4d, 0x34, 0xf4, 0xc0, 0xd9, 0xba, 0xa5, 0x49, 0xf4, 0x9e, 0x5f, 0xcc, - 0xf5, 0xa0, 0xb8, 0x3e, 0xa8, 0x28, 0x81, 0xab, 0x36, 0x2c, 0x4d, 0x74, 0xf4, 0x1e, 0x95, 0x23, - 0xd8, 0xf8, 0xdb, 0x86, 0xe1, 0x44, 0x1a, 0xf5, 0x8f, 0x83, 0x29, 0x72, 0x79, 0xc1, 0x6f, 0x20, - 0x6e, 0x9d, 0x81, 0x0a, 0x21, 0x4c, 0x54, 0x67, 0xe0, 0xe6, 0x30, 0xe7, 0x00, 0xc5, 0x72, 0x70, - 0x4d, 0xc0, 0x22, 0x2e, 0x17, 0x6a, 0xb0, 0x36, 0xf6, 0xf7, 0xe4, 0xbd, 0x9a, 0xbb, 0xb9, 0xac, - 0x09, 0xed, 0x37, 0xa1, 0xa1, 0x5a, 0x1d, 0xc3, 0x30, 0x5e, 0x54, 0x42, 0x2f, 0xe4, 0x3a, 0x03, - 0x22, 0x7c, 0x57, 0x04, 0x7a, 0x76, 0x29, 0x0e, 0x1c, 0xc7, 0xb4, 0xab, 0x99, 0x0c, 0x1e, 0x10, - 0xa6, 0x41, 0x87, 0xea, 0x18, 0x23, 0xcb, 0x26, 0x69, 0xf4, 0x9f, 0x31, 0x33, 0x20, 0xb6, 0x28, - 0x16, 0xe0, 0xa5, 0x2e, 0xfe, 0x97, 0x7b, 0x5f, 0x65, 0x8d, 0x5e, 0x75, 0xec, 0x18, 0xc3, 0xe1, - 0x48, 0xa7, 0x96, 0x19, 0x65, 0x6b, 0xd9, 0x36, 0xa6, 0xb3, 0x5b, 0x62, 0xff, 0x2e, 0x2f, 0x58, - 0x76, 0xab, 0xec, 0xb3, 0xcc, 0x00, 0x3f, 0x89, 0x25, 0x6e, 0x51, 0xb0, 0x55, 0x97, 0x54, 0xec, - 0x05, 0xea, 0xd6, 0x17, 0xa9, 0xdb, 0xf5, 0x41, 0xf2, 0x0e, 0xaf, 0x97, 0x7c, 0x73, 0x53, 0xfc, - 0x2c, 0xd5, 0xa2, 0x14, 0xe0, 0x0f, 0x65, 0x91, 0xf2, 0xe3, 0xa5, 0xe5, 0xa1, 0x36, 0xc6, 0x63, - 0x81, 0xb5, 0x28, 0x0e, 0x7d, 0xb8, 0x59, 0xbe, 0x0b, 0xe3, 0x62, 0xf0, 0x19, 0x7c, 0x8e, 0x1d, - 0x59, 0xd4, 0x9b, 0x1d, 0xef, 0xb8, 0x2e, 0x4e, 0x55, 0x04, 0xe1, 0x83, 0x51, 0x9f, 0x44, 0x0e, - 0xd3, 0x91, 0x48, 0xd7, 0xfc, 0x66, 0x34, 0x60, 0x12, 0xdb, 0x01, 0x6f, 0xc0, 0x7f, 0x6b, 0xc2, - 0x8d, 0x21, 0x8c, 0x6c, 0x22, 0xb4, 0x47, 0xaa, 0x86, 0xa1, 0x77, 0x05, 0xc2, 0x76, 0x6e, 0x89, - 0xa6, 0xa2, 0x9c, 0x04, 0x5d, 0x5b, 0x20, 0xc1, 0xba, 0x17, 0xd9, 0x05, 0xd8, 0x6f, 0x60, 0x45, - 0xb2, 0xba, 0x8f, 0xc6, 0x48, 0xe8, 0x40, 0x19, 0x8b, 0x38, 0x23, 0x4b, 0x17, 0xd0, 0x7b, 0x8b, - 0x00, 0x17, 0x57, 0x87, 0x84, 0x9e, 0xee, 0x22, 0x6d, 0x63, 0x64, 0x0e, 0x1b, 0xaf, 0xf3, 0x22, - 0x55, 0xe3, 0xb7, 0x71, 0x00, 0xf9, 0xf4, 0x19, 0x85, 0x52, 0xbc, 0x6a, 0x0c, 0xc4, 0x6a, 0xe9, - 0xc4, 0x4a, 0xaf, 0xb1, 0x15, 0xb5, 0x30, 0x59, 0x21, 0xdf, 0x24, 0xe7, 0xd4, 0xb0, 0xa8, 0x44, - 0x72, 0xe1, 0x41, 0x65, 0x50, 0x67, 0xd3, 0x15, 0x4b, 0x7e, 0xb1, 0x7e, 0x8e, 0xaf, 0x3f, 0xd2, - 0xf1, 0x86, 0xb9, 0x45, 0x97, 0xba, 0xdf, 0x0e, 0xb7, 0xb8, 0xd7, 0x82, 0xd5, 0xbd, 0xb6, 0x6f, - 0x58, 0x30, 0x7c, 0xdb, 0x11, 0x4c, 0x62, 0xa1, 0xe3, 0x19, 0xd2, 0xaa, 0x24, 0xa8, 0xa0, 0x44, - 0xe0, 0xe7, 0xf4, 0x70, 0xd1, 0x11, 0x1a, 0x63, 0x04, 0xf0, 0x40, 0xf1, 0x61, 0xf4, 0x7a, 0xee, - 0xb0, 0x01, 0x2d, 0x43, 0x44, 0x82, 0x0d, 0xab, 0x17, 0x58, 0xe1, 0x64, 0x40, 0x74, 0x1a, 0xf0, - 0x02, 0x70, 0x01, 0x68, 0x4e, 0x2f, 0x78, 0x0f, 0xab, 0xc1, 0xb4, 0x23, 0xce, 0xc4, 0x98, 0x89, - 0x5e, 0x18, 0x96, 0x9c, 0x0c, 0x26, 0x7f, 0xcd, 0x9f, 0xfd, 0xef, 0xee, 0xc5, 0xe6, 0xb5, 0x31, - 0xa0, 0x5e, 0x33, 0x3a, 0xaa, 0x29, 0x4d, 0xee, 0x25, 0xde, 0x33, 0x41, 0x9a, 0xd8, 0x52, 0x07, - 0x2f, 0xa2, 0x49, 0xd4, 0x8c, 0x63, 0x4b, 0x0e, 0x73, 0x32, 0x40, 0x67, 0x85, 0xfa, 0x97, 0x2c, - 0xfe, 0x98, 0xb0, 0x96, 0x0d, 0xc6, 0x8b, 0xaa, 0xa2, 0xa4, 0xda, 0x17, 0x3a, 0x66, 0xe8, 0x5a, - 0x03, 0x7f, 0x54, 0xfb, 0x74, 0xcc, 0x7e, 0x51, 0x2c, 0x60, 0x4f, 0x74, 0x25, 0xe1, 0xa3, 0xfd, - 0xa6, 0x77, 0x5a, 0x80, 0x15, 0xef, 0xf9, 0xa6, 0xaf, 0x5d, 0x93, 0x0e, 0x94, 0x97, 0xa5, 0x81, - 0x62, 0x53, 0x8f, 0x52, 0xcc, 0x82, 0xe7, 0xeb, 0x83, 0x1d, 0xf7, 0xa9, 0xd9, 0xbc, 0x61, 0xcd, - 0xef, 0x8e, 0xac, 0x7a, 0x49, 0x86, 0x87, 0x1b, 0xc5, 0xaa, 0xe3, 0x2f, 0xde, 0xc3, 0xa4, 0x2d, - 0x91, 0xfe, 0x29, 0xaa, 0x66, 0xb2, 0xe4, 0x85, 0xa9, 0xda, 0xe7, 0x5f, 0x2e, 0x15, 0x0d, 0xde, - 0x3a, 0xf0, 0x8a, 0x3f, 0x23, 0x0b, 0xc3, 0x5c, 0x32, 0x11, 0xad, 0xbe, 0x01, 0xe3, 0x01, 0x89, - 0x8a, 0xed, 0x17, 0xb4, 0x4a, 0xbf, 0x69, 0x00, 0x0d, 0xc0, 0x23, 0x30, 0x58, 0xff, 0xd1, 0x98, - 0xc0, 0x34, 0xdf, 0xea, 0x30, 0x37, 0x5d, 0x78, 0x85, 0xae, 0x40, 0xb0, 0xc4, 0x74, 0xf6, 0x63, - 0x76, 0x3c, 0x40, 0xd8, 0x13, 0x45, 0x03, 0x36, 0x3b, 0x81, 0x4c, 0xc7, 0xaa, 0x6f, 0x4a, 0xdd, - 0x7a, 0x17, 0x74, 0x22, 0x14, 0x45, 0xa5, 0xde, 0x14, 0xa5, 0x99, 0xfa, 0x8f, 0x9f, 0x92, 0x89, - 0x1b, 0x6b, 0x7d, 0x36, 0x97, 0x88, 0xf7, 0xa0, 0x79, 0x0f, 0x66, 0xf0, 0x74, 0x5e, 0x17, 0x45, - 0xc9, 0x3c, 0xc2, 0x6e, 0xce, 0x47, 0x43, 0xfc, 0x19, 0x3a, 0xf5, 0x2c, 0xfe, 0x3d, 0x6d, 0xb1, - 0xb7, 0x53, 0xe8, 0x09, 0x81, 0x81, 0x1f, 0x64, 0x64, 0x58, 0x4b, 0xb5, 0xcf, 0x10, 0x86, 0x21, - 0x02, 0x30, 0x1c, 0xc0, 0x9f, 0x89, 0x7d, 0x6d, 0x62, 0xa1, 0x4e, 0xaf, 0x5f, 0x9f, 0x39, 0x78, - 0x35, 0xb4, 0x3a, 0x43, 0x31, 0xaa, 0x0a, 0xb2, 0x95, 0xf5, 0x22, 0x4a, 0xed, 0x7e, 0x75, 0x36, - 0xb2, 0xb4, 0xaa, 0x28, 0xce, 0x25, 0x45, 0x33, 0x07, 0x0a, 0x64, 0xf7, 0xab, 0xe9, 0x92, 0x04, - 0x52, 0x6d, 0x35, 0x5d, 0x9e, 0x4b, 0xcc, 0xef, 0x13, 0x13, 0xa1, 0x08, 0xbe, 0x0e, 0xcd, 0x2a, - 0x8b, 0x62, 0x63, 0x57, 0x67, 0xec, 0xda, 0x62, 0x15, 0x26, 0xd1, 0xea, 0xb7, 0xab, 0xd0, 0xf1, - 0xeb, 0x08, 0x52, 0xf0, 0x7d, 0x40, 0xa6, 0xf0, 0x0e, 0x23, 0xa3, 0xaa, 0x29, 0xa6, 0x98, 0x9d, - 0x21, 0x30, 0x63, 0x2c, 0x64, 0xaa, 0x5d, 0x4c, 0x00, 0x94, 0x6b, 0x44, 0xaf, 0xb2, 0x69, 0x34, - 0x27, 0x96, 0xfb, 0x44, 0xa6, 0x26, 0x3e, 0x75, 0x6c, 0x5a, 0x6b, 0xd0, 0x55, 0xde, 0x6c, 0x7c, - 0x07, 0xf4, 0x91, 0x1e, 0xa6, 0xa8, 0x5d, 0xdb, 0xb0, 0xb0, 0x1d, 0x80, 0x06, 0x54, 0xd4, 0xfa, - 0x8f, 0x1f, 0xb2, 0x94, 0xcd, 0x4a, 0xb9, 0x82, 0x54, 0x90, 0xfc, 0x5d, 0x52, 0xf1, 0x77, 0xd2, - 0x74, 0x1f, 0xb6, 0xe1, 0x51, 0x3b, 0xad, 0x1a, 0x99, 0xe9, 0x50, 0xb1, 0xd3, 0x20, 0x47, 0x8a, - 0x3f, 0x25, 0xa8, 0x93, 0x93, 0xb2, 0x9b, 0x52, 0x36, 0xa8, 0x42, 0xc5, 0x4c, 0x3b, 0x4d, 0x91, - 0xd0, 0x31, 0xd0, 0x1b, 0x20, 0x0d, 0x83, 0xcd, 0x14, 0x2a, 0x59, 0xfc, 0x97, 0xcd, 0xe5, 0xd3, - 0xcf, 0x26, 0xad, 0x9a, 0x93, 0x73, 0x45, 0x29, 0x2f, 0xe5, 0xb0, 0x89, 0xd5, 0x1d, 0x12, 0x98, - 0x19, 0xe0, 0x68, 0x6e, 0x97, 0x50, 0xaf, 0x00, 0x55, 0xf2, 0xd9, 0xbf, 0x58, 0x4f, 0x96, 0x4a, - 0x30, 0xb4, 0x8f, 0x21, 0x2d, 0x66, 0x4b, 0xf8, 0x6f, 0xb3, 0x92, 0xf3, 0x20, 0xc5, 0x0f, 0x1d, - 0x64, 0x3f, 0x51, 0x33, 0x9b, 0xad, 0xe0, 0xbf, 0x72, 0x59, 0x96, 0x59, 0xd5, 0x9f, 0xb5, 0xde, - 0x48, 0xa7, 0xb1, 0xc0, 0x85, 0x01, 0x48, 0x22, 0x1a, 0xb9, 0xf3, 0xa3, 0xea, 0x34, 0xa9, 0x11, - 0x2a, 0x91, 0x9c, 0x7d, 0xe9, 0xa6, 0x59, 0x1c, 0xc3, 0xf5, 0x75, 0x9d, 0x4c, 0x04, 0xe0, 0x20, - 0xf8, 0xe9, 0x45, 0x6f, 0x49, 0x6d, 0xe5, 0x49, 0x7e, 0x7d, 0x3d, 0x24, 0x48, 0xce, 0xfd, 0x36, - 0x6d, 0x50, 0x45, 0x13, 0x44, 0x72, 0x92, 0x33, 0x10, 0x65, 0xdc, 0xf5, 0xb1, 0xa7, 0x11, 0xfc, - 0x49, 0xd3, 0x3d, 0x32, 0x0d, 0x4b, 0xf4, 0xd2, 0x02, 0x69, 0xcf, 0x72, 0xde, 0x68, 0xc1, 0xa0, - 0x2e, 0x7a, 0xb5, 0x90, 0xe4, 0xcc, 0xdd, 0x69, 0xba, 0x69, 0x90, 0x7a, 0xdc, 0xaa, 0x3b, 0x6f, - 0x34, 0x8b, 0x2b, 0xba, 0xb7, 0xd3, 0x3c, 0x5f, 0x52, 0xd8, 0xde, 0x79, 0x6b, 0x22, 0x2b, 0x3d, - 0x07, 0xdd, 0x29, 0x54, 0x49, 0xb5, 0xf7, 0x86, 0x26, 0xf6, 0xea, 0x57, 0x93, 0xeb, 0xf5, 0xfa, - 0x45, 0xfb, 0x19, 0x3f, 0x51, 0xf0, 0x42, 0xde, 0x6c, 0xc8, 0x49, 0x33, 0x07, 0x50, 0xbe, 0x12, - 0x14, 0xe0, 0xaa, 0x90, 0xf5, 0x75, 0xd1, 0xa0, 0x55, 0xc4, 0x7a, 0x1d, 0x0d, 0x2b, 0x46, 0x0f, - 0xd3, 0xbe, 0x34, 0x2c, 0x4b, 0x79, 0x4b, 0xab, 0x36, 0xfd, 0x8d, 0x74, 0x0b, 0x8b, 0x9c, 0x58, - 0x6a, 0x27, 0x68, 0xe5, 0x0b, 0xa4, 0x29, 0xe7, 0x09, 0x53, 0x01, 0x39, 0x6f, 0x1f, 0x83, 0xd6, - 0x40, 0x56, 0x72, 0x7d, 0x5d, 0x45, 0xbb, 0x0d, 0xb0, 0xcb, 0x48, 0xf5, 0xeb, 0x7e, 0x9b, 0x7a, - 0xcd, 0x87, 0x01, 0xa7, 0x95, 0x8f, 0x74, 0xa8, 0x9a, 0xb6, 0xa0, 0x6e, 0x38, 0xa5, 0xbf, 0x90, - 0xd2, 0xe6, 0x9a, 0x84, 0x15, 0xdd, 0x72, 0xac, 0xa0, 0x39, 0xbc, 0x4a, 0x97, 0x10, 0x53, 0xd0, - 0x50, 0x4a, 0x94, 0xf0, 0xb7, 0xef, 0xfe, 0xb6, 0x53, 0x62, 0x52, 0x0c, 0xd5, 0xc3, 0x4b, 0xe0, - 0x7e, 0xbd, 0x74, 0x2e, 0x9b, 0x2b, 0xfd, 0x19, 0x02, 0x24, 0x95, 0xde, 0xcc, 0x16, 0x73, 0x7f, - 0x86, 0x40, 0x49, 0xa5, 0xe5, 0xcd, 0x5c, 0x28, 0x8d, 0x07, 0x06, 0x8f, 0x26, 0x5a, 0xa7, 0xd8, - 0x28, 0xec, 0x57, 0x82, 0x53, 0x27, 0x69, 0x64, 0xa6, 0x90, 0x9a, 0x9e, 0x6c, 0x73, 0x55, 0xfc, - 0xc4, 0x64, 0x15, 0xf8, 0x0b, 0x8a, 0xb6, 0x3a, 0x11, 0xbf, 0xd4, 0xd1, 0xf3, 0xaf, 0x09, 0x8c, - 0x6b, 0x04, 0x7b, 0x42, 0x0b, 0xe9, 0x0b, 0xe7, 0x10, 0x2d, 0x5d, 0x2d, 0x1a, 0x85, 0xb1, 0xc6, - 0x76, 0x1d, 0x98, 0x1f, 0x1e, 0x8d, 0x5e, 0x63, 0xc9, 0xed, 0x84, 0xfd, 0xfb, 0x37, 0xbc, 0x33, - 0xca, 0xa4, 0xac, 0xaf, 0xee, 0x0d, 0xd2, 0x2f, 0xb4, 0x95, 0xcd, 0x6d, 0x6e, 0xd3, 0xbb, 0x00, - 0x62, 0x95, 0x5e, 0x99, 0x00, 0xb5, 0xc4, 0xab, 0x12, 0xf8, 0xb9, 0xd7, 0xbd, 0xbd, 0x6e, 0x7d, - 0xdd, 0xd9, 0x92, 0xb7, 0x7f, 0x45, 0xdd, 0xde, 0xb3, 0x65, 0x7a, 0xab, 0x56, 0xf8, 0x63, 0xe6, - 0x61, 0xdf, 0xef, 0x60, 0x2e, 0xe4, 0xe5, 0x7f, 0x49, 0x88, 0xdd, 0xc4, 0x1f, 0x33, 0x67, 0x2e, - 0xf9, 0x7f, 0x92, 0xc9, 0x5f, 0xd5, 0x85, 0xd2, 0xc9, 0x6a, 0xc2, 0x1f, 0x54, 0xd0, 0x67, 0x02, - 0x76, 0x82, 0x58, 0xb0, 0x7e, 0xc5, 0x34, 0xfb, 0x4b, 0x5a, 0x1c, 0xb6, 0x13, 0x33, 0x4c, 0x6e, - 0x96, 0x14, 0xd3, 0xd4, 0xde, 0x9a, 0xbd, 0x3e, 0x70, 0x87, 0x0e, 0x0b, 0x43, 0x20, 0x6a, 0x28, - 0xdf, 0xc2, 0x22, 0xa8, 0xc3, 0x06, 0x94, 0xa6, 0xfb, 0x4f, 0x1a, 0xb7, 0x9f, 0x64, 0x0d, 0xc5, - 0x10, 0xc2, 0xa5, 0xd2, 0x0e, 0xd2, 0xed, 0x7e, 0x0d, 0xe0, 0xa4, 0xfc, 0x41, 0xa4, 0xa1, 0x30, - 0x45, 0xc9, 0x2d, 0xeb, 0xd0, 0xb2, 0xb8, 0xfd, 0xa4, 0xd9, 0x9e, 0x52, 0xf3, 0x4a, 0x39, 0x6d, - 0x53, 0x94, 0x9c, 0x6d, 0x31, 0x4b, 0xbf, 0x57, 0xee, 0x7f, 0xb4, 0x1c, 0x9f, 0x00, 0x48, 0xfa, - 0x8c, 0xe1, 0xb0, 0x69, 0x78, 0x25, 0x7c, 0x80, 0x99, 0xf1, 0xaa, 0xb6, 0xdd, 0xaa, 0x7e, 0x78, - 0x4a, 0x41, 0xf6, 0xaa, 0xb8, 0xe1, 0x98, 0xf8, 0xc2, 0x83, 0x2e, 0x2d, 0x4c, 0xfd, 0x62, 0xa1, - 0x18, 0x25, 0x2e, 0x2e, 0x7b, 0xe8, 0xd0, 0x6c, 0x99, 0x76, 0x5b, 0x0c, 0xf5, 0xe3, 0x6c, 0xb4, - 0x45, 0x29, 0x18, 0x2b, 0xe5, 0xbf, 0x69, 0xd8, 0x61, 0x83, 0x12, 0x76, 0xdf, 0x64, 0x25, 0xe8, - 0x08, 0xd9, 0x86, 0xb8, 0xcd, 0xba, 0xa8, 0xba, 0x3d, 0x42, 0x61, 0x15, 0xfd, 0x49, 0xc2, 0xce, - 0xa3, 0xe8, 0x5a, 0xe0, 0x7b, 0x8e, 0xde, 0xaa, 0x80, 0x7d, 0x51, 0x3a, 0x6e, 0x5d, 0x9c, 0xc3, - 0xbc, 0xe1, 0xf7, 0x58, 0xd5, 0xde, 0x5b, 0x02, 0x9a, 0x4d, 0x26, 0x7d, 0x31, 0x01, 0x98, 0x57, - 0xd7, 0x5e, 0x5f, 0x67, 0xca, 0xf3, 0xed, 0x11, 0xcf, 0x97, 0x3d, 0xc7, 0xf0, 0x99, 0x0f, 0x08, - 0xdb, 0xe8, 0xd3, 0xb0, 0x9b, 0xd7, 0xbf, 0xc4, 0x24, 0x4a, 0xc1, 0x8c, 0x87, 0x5a, 0x71, 0x63, - 0x50, 0xcc, 0xc2, 0x93, 0x5e, 0x5f, 0x46, 0x0d, 0xdb, 0x4c, 0x18, 0xa9, 0xba, 0xf9, 0xcb, 0x5a, - 0xf5, 0x1c, 0x36, 0x66, 0x11, 0x4a, 0xe0, 0x40, 0x63, 0x09, 0xcb, 0x1a, 0xa0, 0xf7, 0x04, 0x16, - 0x06, 0x07, 0xb4, 0xbf, 0x38, 0x38, 0x48, 0x8c, 0x6d, 0xc5, 0xa5, 0x6b, 0x60, 0x44, 0x04, 0xf8, - 0x02, 0x4f, 0xa7, 0xe2, 0x57, 0x42, 0x78, 0x7a, 0xe8, 0x6c, 0xf4, 0x30, 0x91, 0x5e, 0x6c, 0xe2, - 0x12, 0x73, 0x98, 0xd8, 0xed, 0x76, 0x43, 0x89, 0x79, 0x4c, 0x6c, 0xb7, 0xdb, 0xa1, 0xc4, 0x02, - 0x26, 0x2a, 0x8a, 0x12, 0x4a, 0x2c, 0x62, 0x62, 0xa5, 0x52, 0x09, 0x25, 0x96, 0xe2, 0x12, 0xcb, - 0x98, 0x58, 0x2e, 0x97, 0x43, 0x89, 0x6d, 0x4c, 0x2c, 0x14, 0x0a, 0xa1, 0xc4, 0x0e, 0x26, 0xe6, - 0xf3, 0xf9, 0x50, 0x22, 0xc1, 0xc4, 0x6c, 0x36, 0x1b, 0x4a, 0xec, 0x62, 0x62, 0x2e, 0x97, 0x0b, - 0x25, 0x5a, 0x14, 0xce, 0x5c, 0xb8, 0x64, 0x9f, 0x96, 0x54, 0xc2, 0x89, 0x1a, 0x4d, 0x2c, 0x75, - 0x42, 0x89, 0x06, 0x24, 0xd2, 0x2f, 0x3b, 0xe6, 0xe4, 0x82, 0x24, 0x04, 0x7f, 0xe4, 0x74, 0x25, - 0x19, 0x2a, 0x68, 0xb7, 0x5d, 0x7c, 0xe6, 0x23, 0xc9, 0x03, 0x37, 0xbd, 0x14, 0x4a, 0x77, 0xda, - 0x4b, 0x1a, 0x76, 0xbf, 0xa2, 0xbd, 0xd1, 0x4e, 0x26, 0x23, 0x15, 0x14, 0xaf, 0x46, 0x76, 0x53, - 0x96, 0x84, 0xe0, 0xcf, 0xf2, 0x1a, 0x83, 0x4f, 0xf5, 0x41, 0x3d, 0x71, 0xa9, 0xb1, 0x33, 0xe9, - 0xb2, 0x53, 0xe6, 0xa9, 0x86, 0x66, 0x58, 0x8c, 0xc7, 0x9d, 0x90, 0xd3, 0x65, 0x28, 0x57, 0x8d, - 0x12, 0x54, 0x14, 0xfd, 0x94, 0xa0, 0xd8, 0xde, 0x12, 0x21, 0xa8, 0xe8, 0x9c, 0xe4, 0xe3, 0xa6, - 0xb4, 0x10, 0x37, 0xf9, 0x94, 0xa0, 0x8a, 0xc5, 0xe2, 0x22, 0x41, 0x95, 0x4a, 0xa5, 0x4f, 0x12, - 0x54, 0x94, 0x72, 0x29, 0x41, 0x75, 0x3a, 0x9d, 0x45, 0x82, 0x8a, 0x2e, 0x91, 0x6e, 0xdc, 0x6a, - 0xa0, 0x04, 0x45, 0x0a, 0xb9, 0x45, 0x82, 0x2a, 0x90, 0xdc, 0x22, 0x41, 0x15, 0xca, 0x4a, 0x3c, - 0x41, 0xe5, 0x61, 0x22, 0xbc, 0x7f, 0x4b, 0xa8, 0x09, 0x90, 0x19, 0x4b, 0x4d, 0x90, 0x5e, 0x5c, - 0x42, 0x4d, 0x7c, 0xab, 0x9f, 0x21, 0x25, 0x39, 0x07, 0x54, 0xe4, 0xff, 0xf9, 0x04, 0x29, 0x15, - 0xb3, 0x92, 0xe0, 0xfd, 0xfb, 0x2c, 0x1d, 0x8d, 0x74, 0xd8, 0x07, 0x44, 0x8e, 0x4f, 0xa1, 0x19, - 0x6b, 0xa7, 0x1f, 0x08, 0x4c, 0xb4, 0x6a, 0xbb, 0x8f, 0x7d, 0xd6, 0xbb, 0xe9, 0x8e, 0x45, 0x80, - 0xf9, 0xbb, 0xa2, 0x30, 0x6d, 0x52, 0x4c, 0xd6, 0xd4, 0x5e, 0xc2, 0x4e, 0xa3, 0xd9, 0x9d, 0x48, - 0x22, 0xf0, 0x68, 0xf2, 0xfb, 0xb7, 0xaf, 0x37, 0x80, 0x9e, 0x67, 0x8f, 0x86, 0x69, 0x73, 0x00, - 0xea, 0xbf, 0x9d, 0xc9, 0x56, 0x72, 0x72, 0x26, 0x2b, 0x97, 0x65, 0xe4, 0xe4, 0xd0, 0x03, 0x6e, - 0xcf, 0x7a, 0xdd, 0x53, 0x02, 0x6a, 0x3d, 0xc3, 0x4a, 0x50, 0x23, 0x83, 0x00, 0x52, 0x2f, 0x68, - 0x68, 0xbf, 0x7f, 0xff, 0xf8, 0xc9, 0x0a, 0x29, 0x75, 0x10, 0x37, 0xb5, 0x1f, 0xf2, 0xcf, 0x6d, - 0x1d, 0x45, 0xf1, 0xfd, 0x91, 0xa6, 0x3d, 0x82, 0xfc, 0x93, 0x48, 0x56, 0x31, 0x51, 0x32, 0xfc, - 0x36, 0x12, 0x8a, 0xa4, 0xfd, 0xc8, 0xfe, 0x84, 0x3f, 0xb9, 0x9f, 0x49, 0x49, 0x0d, 0xd2, 0x0d, - 0x00, 0x13, 0xb7, 0x3c, 0xfa, 0xa2, 0x62, 0x23, 0xf4, 0x29, 0x99, 0xd2, 0x7e, 0xe4, 0xa1, 0xa4, - 0xbe, 0x55, 0x37, 0x40, 0x1d, 0xf9, 0x5e, 0x57, 0x41, 0xd8, 0x61, 0x83, 0xd1, 0x7e, 0x14, 0x7e, - 0x26, 0xe7, 0x73, 0x1b, 0xbd, 0xf6, 0xf7, 0xf0, 0x4b, 0xdd, 0x68, 0x7e, 0x26, 0x3a, 0xb1, 0x12, - 0xd4, 0xd4, 0x07, 0xf2, 0x45, 0x7d, 0xcb, 0x1d, 0x01, 0x27, 0x69, 0x47, 0xf7, 0xea, 0x76, 0x1f, - 0x3a, 0xa6, 0xe2, 0xb8, 0x0e, 0x42, 0x73, 0x42, 0xaf, 0xa7, 0x4b, 0x49, 0xc9, 0x53, 0x56, 0xdc, - 0x40, 0x73, 0x75, 0xdd, 0x4f, 0x09, 0x44, 0xab, 0x23, 0xd4, 0xb8, 0xea, 0xbf, 0x40, 0xc5, 0x06, - 0xf9, 0x8a, 0x42, 0x44, 0x25, 0x2b, 0x76, 0x0b, 0x84, 0x4e, 0x4a, 0x70, 0x7a, 0x93, 0x0c, 0xc9, - 0x5a, 0xa2, 0x17, 0x1c, 0xb5, 0x03, 0xd2, 0x75, 0x64, 0x66, 0x5b, 0x2f, 0xaa, 0xde, 0x6c, 0xb5, - 0x70, 0x7a, 0x61, 0xd6, 0xbe, 0x30, 0x9d, 0x88, 0xe1, 0xd8, 0xa9, 0x47, 0xd4, 0x9c, 0x1b, 0xa5, - 0x4f, 0x95, 0x1c, 0x34, 0x40, 0xc3, 0x3a, 0x43, 0x44, 0xc7, 0x90, 0x00, 0x1e, 0x84, 0x01, 0x0d, - 0xd8, 0x69, 0xb5, 0x0b, 0xf3, 0x0f, 0xfb, 0x1f, 0xd1, 0xf0, 0x44, 0xf3, 0x0d, 0x3f, 0xbe, 0x4c, - 0x80, 0xb4, 0x20, 0x29, 0x38, 0x20, 0xce, 0x80, 0x72, 0x8e, 0x29, 0x91, 0xc0, 0x5e, 0x00, 0x54, - 0x1a, 0x73, 0x80, 0xc6, 0xd2, 0x34, 0xe2, 0x64, 0x5d, 0xc4, 0x3b, 0x69, 0x80, 0x15, 0x8c, 0x94, - 0xa7, 0x77, 0x9b, 0x03, 0x55, 0xeb, 0x26, 0x6c, 0x98, 0x8d, 0x40, 0x45, 0x63, 0x95, 0x7d, 0x65, - 0x21, 0x01, 0xb2, 0xcd, 0xb6, 0x67, 0x68, 0x4a, 0x89, 0x99, 0x8c, 0x98, 0xa2, 0xb6, 0xaa, 0xaa, - 0x28, 0x26, 0x53, 0x24, 0xa8, 0x67, 0xe8, 0x68, 0x2c, 0x4d, 0x30, 0xea, 0x26, 0xf5, 0xc8, 0x75, - 0x1f, 0x24, 0x65, 0x74, 0x06, 0x26, 0x55, 0xa4, 0xe3, 0x34, 0x6d, 0x0c, 0x90, 0x9a, 0xa4, 0x86, - 0x2c, 0x59, 0x4a, 0xd0, 0x26, 0xeb, 0x21, 0x31, 0xaa, 0xef, 0x89, 0x51, 0x90, 0x7a, 0x64, 0x82, - 0x54, 0x0b, 0xb2, 0x2f, 0x2b, 0x06, 0xb5, 0x41, 0x21, 0x4c, 0x88, 0xfb, 0xd0, 0x1e, 0x0d, 0x00, - 0x96, 0x16, 0x2e, 0x35, 0xfc, 0x9a, 0xb5, 0x40, 0x23, 0xff, 0xb2, 0x98, 0x82, 0x47, 0x97, 0x5f, - 0xc4, 0x65, 0x82, 0x19, 0x6b, 0x51, 0xa2, 0xad, 0x25, 0x93, 0x35, 0x90, 0x4f, 0x88, 0xaf, 0xc5, - 0x98, 0x8a, 0x33, 0xa0, 0xdf, 0xc3, 0xb2, 0xeb, 0x34, 0x8e, 0x6d, 0x87, 0xa0, 0xf7, 0x4e, 0x1a, - 0x90, 0x65, 0xdf, 0xab, 0xce, 0x00, 0xb0, 0x2a, 0x26, 0xb7, 0x37, 0xb2, 0xd5, 0xb1, 0xa1, 0x76, - 0x05, 0x19, 0x08, 0xc4, 0x04, 0x1d, 0x9c, 0xa6, 0xd6, 0x7c, 0x73, 0x5c, 0x30, 0x40, 0xd6, 0x07, - 0x24, 0x0c, 0x0c, 0xdb, 0xc1, 0x66, 0x53, 0x20, 0xbf, 0x63, 0x10, 0xc9, 0x6d, 0x90, 0xad, 0x52, - 0xec, 0x11, 0x31, 0x09, 0xf3, 0xc3, 0x34, 0xd8, 0x2d, 0x19, 0x14, 0x55, 0x54, 0x90, 0x6c, 0x5c, - 0x94, 0x09, 0x17, 0x3f, 0xb4, 0x95, 0x54, 0x1d, 0x7a, 0x49, 0x61, 0x7a, 0xb2, 0xea, 0xf2, 0x01, - 0x5c, 0xee, 0x5e, 0xaf, 0xb0, 0x08, 0x58, 0xe9, 0xe4, 0x9c, 0x51, 0x5d, 0x3c, 0x36, 0x03, 0xa1, - 0x34, 0x59, 0x73, 0xa0, 0x0e, 0x9a, 0xa1, 0x40, 0xcd, 0xed, 0x93, 0x5d, 0x42, 0x4c, 0x7c, 0x63, - 0xb2, 0x2a, 0x5d, 0x79, 0x09, 0x50, 0x5b, 0xf0, 0xd6, 0x13, 0xea, 0xfe, 0xb7, 0x8e, 0xaa, 0x81, - 0xa4, 0x9b, 0x10, 0x1d, 0x6b, 0x44, 0xc4, 0xfa, 0x92, 0xd6, 0xcd, 0xce, 0x50, 0x84, 0x89, 0xfa, - 0x92, 0x39, 0x33, 0xda, 0x6a, 0x06, 0x34, 0x3a, 0xdb, 0x49, 0xe8, 0xca, 0x58, 0xed, 0x2b, 0x50, - 0x32, 0x3d, 0xb2, 0x89, 0xd5, 0xe8, 0xc3, 0x24, 0xc1, 0x8a, 0xc5, 0xe5, 0xb6, 0xb2, 0x15, 0x28, - 0x13, 0x0d, 0x12, 0xc7, 0xc9, 0x7f, 0x81, 0x64, 0x4e, 0xed, 0x51, 0xdb, 0x3d, 0xe2, 0x74, 0x06, - 0xc1, 0x41, 0xd4, 0x00, 0xe3, 0x76, 0x43, 0x7a, 0xfa, 0xd9, 0x36, 0x74, 0x40, 0xef, 0x6c, 0x48, - 0x9c, 0x81, 0xd1, 0xad, 0x8a, 0x50, 0x02, 0xd6, 0x2e, 0x72, 0x12, 0x3d, 0x01, 0x7c, 0x86, 0xd0, - 0x02, 0x89, 0x64, 0x90, 0x32, 0x8b, 0x5a, 0x04, 0x00, 0x47, 0x68, 0xd4, 0x02, 0xdd, 0x3e, 0x99, - 0x06, 0x62, 0x86, 0x5e, 0xb0, 0x14, 0x5a, 0x7b, 0x0d, 0xe0, 0x0c, 0x9a, 0xd1, 0x4f, 0x88, 0xe7, - 0x86, 0xa0, 0x60, 0x69, 0x97, 0xbd, 0xd2, 0x9e, 0xd1, 0x80, 0x1c, 0x82, 0x22, 0x2d, 0xec, 0xb2, - 0xaf, 0x77, 0xd9, 0x94, 0x61, 0x90, 0x6e, 0x5a, 0xc4, 0x26, 0x7b, 0xaa, 0x0e, 0x4b, 0xf2, 0x2d, - 0x91, 0x48, 0x42, 0xab, 0xee, 0x1e, 0xc1, 0xc9, 0xe2, 0xfd, 0x34, 0x30, 0x2a, 0x28, 0x57, 0x5d, - 0x96, 0x15, 0x20, 0x02, 0x16, 0xfa, 0xfa, 0x3a, 0xcf, 0x8b, 0x44, 0x5c, 0xff, 0x4d, 0xb6, 0xfc, - 0xf9, 0x6b, 0xd2, 0x92, 0xeb, 0x3f, 0xe8, 0x1e, 0xb6, 0x63, 0x0a, 0xb3, 0x61, 0x2e, 0xa7, 0x98, - 0xcb, 0xa1, 0x43, 0x57, 0x13, 0x77, 0x21, 0xd2, 0x07, 0x78, 0xff, 0x01, 0x6d, 0xd5, 0xfc, 0x3b, - 0x7b, 0xe6, 0x2e, 0xc5, 0xf9, 0x79, 0xfc, 0x45, 0x38, 0x96, 0x1a, 0x36, 0x48, 0x25, 0xe7, 0x12, - 0x9e, 0xa8, 0xcf, 0xe9, 0xff, 0x18, 0xe5, 0xb9, 0x84, 0xd7, 0x8d, 0xd9, 0x2e, 0x82, 0xc8, 0xd2, - 0xcc, 0x11, 0x4b, 0x94, 0xe2, 0x6d, 0x63, 0xd2, 0x97, 0xac, 0xbb, 0x55, 0x77, 0xc6, 0x3e, 0x4f, - 0xf7, 0xf6, 0x08, 0x99, 0x2a, 0xb3, 0xc8, 0x80, 0x01, 0x10, 0xeb, 0xad, 0x45, 0x31, 0x65, 0x58, - 0x0d, 0x4d, 0x4b, 0x7c, 0xe3, 0x62, 0xb4, 0xba, 0x9e, 0x94, 0x3f, 0xbf, 0x25, 0xfd, 0xed, 0x14, - 0x8f, 0x11, 0x04, 0x3b, 0xa9, 0xc7, 0x40, 0xe6, 0x18, 0xa3, 0xce, 0x00, 0xcf, 0x07, 0x50, 0x03, - 0xa5, 0x54, 0xbc, 0x43, 0xfd, 0x26, 0x61, 0x43, 0x5c, 0x56, 0x1a, 0x38, 0x4c, 0xa4, 0x6c, 0xc0, - 0x5c, 0x23, 0x13, 0x46, 0xbc, 0x8d, 0x85, 0xd9, 0xd3, 0x02, 0xb7, 0x89, 0x00, 0x36, 0x1b, 0x61, - 0x73, 0x92, 0x76, 0xcc, 0xad, 0x37, 0xa5, 0x83, 0xf1, 0xf4, 0xa1, 0x2c, 0x33, 0x91, 0xff, 0xfe, - 0xed, 0xfc, 0x20, 0x3f, 0xa3, 0x97, 0xe9, 0xbc, 0x42, 0x1c, 0x83, 0x77, 0xfd, 0x30, 0x88, 0xe4, - 0xd4, 0x01, 0x9f, 0x33, 0x56, 0x7b, 0x7d, 0xfd, 0x8b, 0x03, 0x8c, 0x59, 0x6d, 0xa1, 0x9b, 0x27, - 0xec, 0x53, 0xff, 0xd5, 0x8c, 0xb9, 0xd6, 0x66, 0x0f, 0x0d, 0xc3, 0x01, 0x69, 0x0a, 0xa7, 0x01, - 0x0a, 0x2c, 0x1a, 0x14, 0x41, 0xe0, 0x52, 0x45, 0x89, 0x35, 0xb2, 0x40, 0x9e, 0x84, 0x37, 0x68, - 0x60, 0x78, 0x7a, 0xe6, 0x79, 0xe1, 0xc1, 0x81, 0x4c, 0x8c, 0xcd, 0xad, 0xeb, 0xc4, 0x91, 0x5c, - 0xd8, 0xf2, 0x9b, 0xe1, 0xed, 0xdb, 0x02, 0xc9, 0xcd, 0x9d, 0x74, 0x5a, 0x91, 0x39, 0x79, 0xd0, - 0xad, 0x16, 0xbf, 0x6f, 0x79, 0x78, 0x73, 0x76, 0x4a, 0x77, 0xdc, 0x30, 0x4a, 0x80, 0x65, 0x13, - 0xf4, 0xfb, 0x00, 0xc6, 0x8d, 0x40, 0xc0, 0x72, 0xa0, 0xbe, 0x20, 0x1e, 0x89, 0xbb, 0x47, 0x33, - 0xc8, 0xc9, 0x59, 0xf7, 0x8a, 0xae, 0x0e, 0xe9, 0xde, 0xe7, 0x1a, 0xbd, 0xbc, 0xc3, 0x9b, 0x7a, - 0x74, 0x5d, 0xc4, 0xcd, 0x11, 0xeb, 0x61, 0x2e, 0xe5, 0x2a, 0xb0, 0x1a, 0x24, 0x18, 0x22, 0xcf, - 0x6f, 0x48, 0x04, 0x1f, 0x9c, 0x3b, 0x4a, 0x72, 0x16, 0x20, 0x48, 0x6c, 0x02, 0x42, 0x88, 0xab, - 0x6a, 0x1b, 0x02, 0xd5, 0xe4, 0x85, 0x9e, 0x02, 0x9b, 0x66, 0xf7, 0x0b, 0xcc, 0x85, 0xcc, 0xeb, - 0xd0, 0x11, 0xaf, 0x16, 0x52, 0x2f, 0x92, 0xbc, 0x4f, 0x64, 0x3c, 0x8e, 0x1c, 0x0e, 0x58, 0x37, - 0xba, 0xa2, 0x9d, 0x70, 0x11, 0x83, 0xac, 0x32, 0x1e, 0x27, 0xcb, 0x86, 0xee, 0x2c, 0x1d, 0xba, - 0x14, 0x97, 0xe5, 0x76, 0x33, 0x97, 0x42, 0x24, 0x01, 0x8c, 0xea, 0x1a, 0xcf, 0x0a, 0x87, 0xc4, - 0xb5, 0x8e, 0x32, 0xb0, 0x03, 0x23, 0x24, 0x4a, 0xd8, 0x67, 0xb0, 0xad, 0xa7, 0x7b, 0x9a, 0x01, - 0xcb, 0xc3, 0xc9, 0x94, 0x4b, 0x05, 0x44, 0xab, 0xce, 0xa7, 0x26, 0x9c, 0x0d, 0x9a, 0xfc, 0xa7, - 0x9d, 0xcc, 0xe4, 0x4b, 0x98, 0xad, 0xc5, 0x67, 0x6f, 0x60, 0xee, 0x9f, 0x7a, 0x32, 0x53, 0xc2, - 0x0d, 0xa9, 0x6e, 0x6f, 0xdb, 0x29, 0x51, 0x10, 0x53, 0x89, 0x2c, 0xec, 0xd9, 0x68, 0x36, 0x79, - 0x13, 0xf1, 0x24, 0xe7, 0x0d, 0x16, 0x63, 0x4a, 0x94, 0x04, 0x11, 0x3f, 0x92, 0xe6, 0x5a, 0x7f, - 0x95, 0x54, 0x5d, 0xff, 0xfd, 0xdb, 0xde, 0xd6, 0xfd, 0x0a, 0xfa, 0xb6, 0x38, 0x30, 0x46, 0x48, - 0x52, 0xf8, 0x03, 0x55, 0xa0, 0xb4, 0xf4, 0x05, 0xd8, 0xb8, 0x0e, 0xa8, 0x84, 0xe2, 0xd8, 0x00, - 0xa0, 0x62, 0xab, 0x58, 0x81, 0x75, 0x66, 0xb3, 0x34, 0x2d, 0x45, 0x9d, 0x20, 0x31, 0xfd, 0x3b, - 0x82, 0x82, 0x86, 0x4b, 0xcc, 0xe7, 0xca, 0xbb, 0xe9, 0x98, 0xe2, 0x6c, 0x94, 0xe4, 0x3f, 0xb1, - 0x8a, 0x4d, 0x50, 0xf9, 0x53, 0x38, 0x03, 0xb5, 0x0e, 0xbc, 0xc2, 0x98, 0xe0, 0x3a, 0x42, 0xc3, - 0xac, 0xe8, 0x09, 0x7c, 0xbf, 0xbe, 0x3b, 0xd6, 0xd6, 0x77, 0xa7, 0xeb, 0x1d, 0x6c, 0xbe, 0x90, - 0x37, 0xa7, 0x2b, 0x6e, 0xfd, 0x31, 0x23, 0xf3, 0xef, 0x19, 0xa7, 0xcb, 0x67, 0x8d, 0x15, 0x8d, - 0x65, 0x39, 0x73, 0x10, 0xa5, 0xdd, 0xec, 0x0c, 0x54, 0xff, 0x15, 0x9a, 0x9d, 0x53, 0xee, 0xcc, - 0xee, 0x32, 0xc1, 0xe6, 0x87, 0xd4, 0xb3, 0x3e, 0xaf, 0xa2, 0x87, 0xad, 0xf4, 0x08, 0x2e, 0xe9, - 0x80, 0x74, 0xb8, 0xbe, 0x4e, 0x52, 0x29, 0x0f, 0x67, 0x64, 0x2b, 0x57, 0xc4, 0xa1, 0x90, 0x3a, - 0xfc, 0x26, 0x25, 0x4e, 0xe0, 0xa4, 0x9e, 0xb4, 0xb7, 0xd0, 0x24, 0xc7, 0x0e, 0x81, 0x52, 0x7f, - 0x99, 0x08, 0xa9, 0xda, 0xfd, 0x95, 0x64, 0xf1, 0x96, 0x6a, 0x5f, 0x68, 0xcb, 0x3f, 0x9c, 0x9f, - 0xbf, 0x7f, 0xcb, 0x5f, 0xb0, 0x75, 0xec, 0x63, 0x3b, 0x28, 0x8a, 0x1f, 0x81, 0x80, 0xc2, 0xc1, - 0xd2, 0x77, 0xb0, 0xcb, 0x6d, 0x7a, 0x9b, 0xad, 0x5c, 0xae, 0x09, 0x47, 0xbb, 0xc2, 0x70, 0x64, - 0x3b, 0x42, 0x9b, 0x08, 0x90, 0x2e, 0x18, 0xa0, 0x46, 0x11, 0xdb, 0x4e, 0xe3, 0xc4, 0x56, 0x57, - 0xb4, 0xf2, 0xcb, 0xab, 0x8f, 0xe7, 0xd9, 0x13, 0x4b, 0xc5, 0x08, 0xbb, 0xc2, 0x1f, 0x33, 0x93, - 0x4a, 0xfe, 0x4e, 0x72, 0xfe, 0x85, 0xc3, 0x91, 0xe9, 0x9e, 0x79, 0xb8, 0xc3, 0x70, 0x7d, 0x4f, - 0x81, 0x46, 0x88, 0x87, 0x06, 0x3a, 0x86, 0xf5, 0x75, 0x36, 0x14, 0xf2, 0x33, 0x78, 0x4a, 0xeb, - 0xd4, 0x88, 0x1c, 0xbc, 0xc2, 0xf4, 0xf3, 0x87, 0x10, 0x97, 0x9a, 0xf2, 0x86, 0xde, 0x95, 0xdc, - 0x21, 0x84, 0x5f, 0xd6, 0x74, 0xf3, 0xb8, 0xd6, 0xbc, 0xa4, 0xb4, 0x69, 0x73, 0xe0, 0x29, 0xa6, - 0x7a, 0xa7, 0x68, 0x9e, 0x6e, 0x43, 0x0b, 0x83, 0x8c, 0xe7, 0x55, 0x4a, 0xba, 0xa7, 0x11, 0xa2, - 0x6b, 0x15, 0x76, 0x4f, 0x66, 0x80, 0x42, 0xd4, 0xbe, 0x9e, 0xc0, 0x83, 0x53, 0xaf, 0xa0, 0x37, - 0x1a, 0x27, 0x0d, 0xea, 0xc1, 0x36, 0xfd, 0x5b, 0x4d, 0x74, 0x09, 0xc6, 0xf2, 0x80, 0x34, 0x5d, - 0xf2, 0x1f, 0xcd, 0xe0, 0xf1, 0x55, 0x8b, 0x1a, 0x4f, 0x1d, 0x7e, 0xf1, 0xbf, 0x6a, 0x1e, 0xee, - 0x3e, 0xc4, 0xd4, 0xab, 0xb6, 0xcd, 0x3d, 0xe3, 0xe1, 0x69, 0x40, 0x4b, 0xe6, 0x4e, 0xe7, 0xc5, - 0xa7, 0x4c, 0xa6, 0x99, 0xa3, 0x7d, 0xb7, 0x46, 0xdc, 0xaf, 0x2d, 0x25, 0xa8, 0x91, 0x9e, 0x38, - 0x2d, 0xef, 0x8b, 0xbc, 0xd7, 0xf4, 0xcc, 0x4d, 0x96, 0x2a, 0xf4, 0x3f, 0x14, 0x4f, 0xc8, 0x94, - 0x74, 0x9a, 0xc6, 0x70, 0x08, 0x12, 0x08, 0xee, 0x45, 0xe6, 0x1b, 0x8a, 0x5d, 0x3c, 0x33, 0x36, - 0x55, 0xe6, 0x80, 0x80, 0x11, 0xd8, 0xdb, 0x86, 0x62, 0x01, 0x17, 0xe6, 0x06, 0x62, 0xd2, 0x39, - 0xa7, 0x3c, 0x38, 0xa0, 0x04, 0x3c, 0x7f, 0x85, 0xa5, 0x59, 0x73, 0xac, 0xb7, 0x59, 0xc2, 0x5e, - 0x25, 0x9f, 0x81, 0xbc, 0xec, 0x69, 0x10, 0x59, 0x99, 0x92, 0x04, 0x32, 0x78, 0x57, 0x5e, 0x4d, - 0xce, 0xe6, 0x4c, 0x9f, 0xfe, 0xc5, 0xbb, 0xbc, 0xd2, 0xaf, 0xd5, 0x74, 0x44, 0x20, 0x4a, 0xb2, - 0xfd, 0x2d, 0x1c, 0x69, 0xa2, 0x5a, 0x0e, 0x7f, 0xcf, 0x53, 0xa0, 0xdf, 0xab, 0x15, 0xbf, 0x55, - 0xbf, 0xf9, 0xae, 0x0d, 0xfe, 0x69, 0x77, 0x2d, 0xe4, 0xa5, 0x5b, 0x13, 0xe3, 0x2f, 0xaf, 0xd7, - 0x3e, 0x68, 0x79, 0xbe, 0xf5, 0xab, 0xa6, 0xa7, 0x60, 0x61, 0x8a, 0xe8, 0xb9, 0x32, 0x50, 0xc6, - 0x44, 0xd0, 0x0d, 0x17, 0x29, 0xb6, 0xf0, 0x46, 0x9c, 0x2f, 0xb0, 0xe0, 0xdc, 0x98, 0xf1, 0x20, - 0xff, 0x5a, 0x44, 0x98, 0x28, 0x36, 0x3a, 0xc1, 0xa8, 0xb6, 0x3d, 0x22, 0x54, 0xa2, 0xc6, 0x05, - 0xf6, 0x06, 0x6c, 0xd4, 0xab, 0x05, 0x9b, 0x1c, 0xca, 0x06, 0xd0, 0xaa, 0xe8, 0xf9, 0xd4, 0x88, - 0x12, 0xeb, 0xe3, 0x10, 0x38, 0x12, 0x7e, 0xfb, 0xc7, 0x6d, 0x4a, 0xb5, 0x05, 0x14, 0x16, 0x46, - 0xa6, 0x5b, 0x95, 0xde, 0xbb, 0x45, 0x01, 0x4a, 0xc1, 0x84, 0xb1, 0x6a, 0x8c, 0x6c, 0xe6, 0x01, - 0xa5, 0x69, 0x0a, 0x3b, 0x56, 0x19, 0xc3, 0x36, 0x8a, 0xdf, 0xf1, 0xa0, 0xde, 0x36, 0xc2, 0x7f, - 0xea, 0x82, 0x20, 0x24, 0x5a, 0xa0, 0xe7, 0x00, 0x08, 0x8a, 0xd7, 0xc8, 0x44, 0xd5, 0xd8, 0x25, - 0x05, 0x01, 0x7d, 0xa7, 0xa9, 0xff, 0x98, 0xe1, 0xf2, 0x02, 0x42, 0x9d, 0x4f, 0x58, 0x9f, 0x49, - 0x18, 0xd8, 0xa1, 0x0b, 0x85, 0xe2, 0xc1, 0x61, 0x30, 0xf7, 0x14, 0x3c, 0x21, 0x10, 0x5e, 0x74, - 0x63, 0x02, 0x7c, 0xd4, 0x30, 0xba, 0xe8, 0xa5, 0xe3, 0x80, 0x0a, 0x8d, 0xa3, 0xf8, 0xf6, 0xdd, - 0xfb, 0xb0, 0x00, 0x73, 0x59, 0xee, 0xd0, 0x1b, 0x05, 0x5e, 0xda, 0x56, 0x00, 0xd7, 0x4a, 0xbf, - 0x1d, 0x97, 0xf0, 0xd1, 0x15, 0xd9, 0x7c, 0x0b, 0x11, 0xa7, 0xef, 0x71, 0xf3, 0x2d, 0x29, 0x51, - 0x14, 0x52, 0xff, 0x17, 0x91, 0x89, 0xd1, 0xae, 0x0b, 0x39, 0xc7, 0xee, 0x74, 0xc9, 0x97, 0xc3, - 0xe8, 0xca, 0x61, 0xcc, 0xb7, 0x6e, 0x47, 0xcc, 0x24, 0x1e, 0x9d, 0x10, 0x6a, 0x6e, 0xa1, 0xfc, - 0x04, 0x38, 0x32, 0xfa, 0x51, 0xd4, 0xa9, 0x0a, 0x42, 0x9f, 0xb7, 0xe4, 0xa4, 0xb7, 0x98, 0x0d, - 0x73, 0x84, 0xd1, 0xa3, 0xbc, 0x6a, 0x5f, 0x5c, 0x55, 0x05, 0x09, 0x0f, 0x7e, 0x25, 0xaa, 0x84, - 0x13, 0xa0, 0xba, 0x04, 0x88, 0xb1, 0x90, 0xf0, 0xa5, 0xee, 0xe6, 0x82, 0x28, 0x12, 0xd1, 0x08, - 0x5d, 0xa2, 0xf8, 0x48, 0x21, 0x14, 0x0b, 0x72, 0x81, 0x9a, 0x28, 0x10, 0xd5, 0x23, 0x7b, 0x7b, - 0x26, 0x57, 0x67, 0xf3, 0x79, 0x35, 0x46, 0x4f, 0x64, 0x3e, 0x23, 0x24, 0x04, 0x4f, 0x14, 0xde, - 0xb0, 0xce, 0xc8, 0x2f, 0x71, 0x90, 0x5c, 0xa3, 0xca, 0x1f, 0x1e, 0xb3, 0x05, 0xf2, 0x11, 0x01, - 0xd6, 0x92, 0x8c, 0x5a, 0x99, 0x7c, 0xe5, 0xcb, 0xc3, 0x5f, 0x64, 0x90, 0x08, 0x64, 0xc6, 0xf3, - 0x20, 0x5a, 0x31, 0xca, 0x04, 0xa8, 0x3f, 0x2f, 0x20, 0x8a, 0x44, 0x84, 0x47, 0xc9, 0x1f, 0x26, - 0x37, 0x4e, 0xe6, 0xff, 0xe2, 0x32, 0x75, 0x50, 0x5b, 0x2c, 0x15, 0xfb, 0x4f, 0x06, 0x63, 0xf5, - 0x23, 0xe4, 0x84, 0x06, 0xcb, 0x0b, 0xea, 0xc8, 0x8a, 0x16, 0x07, 0x8b, 0x07, 0x67, 0xdc, 0x99, - 0x57, 0x64, 0xa8, 0xa0, 0x45, 0xae, 0x1a, 0xa4, 0xeb, 0x0b, 0xf7, 0x0f, 0x8d, 0x91, 0x7c, 0x30, - 0x46, 0xd7, 0x67, 0xfe, 0x1f, 0x1f, 0x22, 0x55, 0x83, 0x57, 0x0d, 0x93, 0xb9, 0x28, 0xfd, 0x43, - 0xa3, 0x4c, 0xb8, 0x0e, 0x4f, 0x84, 0xda, 0x7f, 0xd3, 0xf6, 0x40, 0xed, 0x61, 0x51, 0x96, 0x9a, - 0x1e, 0xe9, 0x2c, 0x41, 0xac, 0x7d, 0xa9, 0x89, 0xe1, 0x81, 0x06, 0x8e, 0x52, 0x7f, 0x63, 0xc8, - 0xb8, 0xf3, 0x20, 0x2c, 0x2e, 0x61, 0x4b, 0xe6, 0xd5, 0x29, 0xb4, 0x14, 0xb8, 0xb3, 0x78, 0x38, - 0xbe, 0x3a, 0xf5, 0x37, 0x60, 0xd8, 0xf1, 0x80, 0x31, 0x40, 0x41, 0xdf, 0x28, 0x06, 0xd8, 0xf1, - 0x85, 0x45, 0x83, 0x65, 0xa1, 0xcf, 0x51, 0x82, 0xba, 0xa2, 0xd4, 0xb7, 0xc8, 0x0f, 0xf9, 0xe7, - 0x96, 0x83, 0x96, 0x31, 0x89, 0x20, 0x6b, 0x8c, 0xbb, 0x87, 0x73, 0x85, 0x8e, 0x50, 0x14, 0xef, - 0x78, 0x17, 0xe0, 0x1b, 0xc2, 0x41, 0xf1, 0x90, 0x84, 0x1a, 0xbf, 0x96, 0x86, 0x10, 0x12, 0xf0, - 0xc3, 0xe1, 0xee, 0xf5, 0x1c, 0x90, 0x73, 0xa1, 0x8b, 0xf9, 0xab, 0xd6, 0x16, 0xbd, 0x00, 0x7a, - 0x98, 0x94, 0xfb, 0xb9, 0x8d, 0x7f, 0x50, 0xa0, 0x08, 0xbb, 0xfe, 0x31, 0x2e, 0x90, 0x70, 0xab, - 0xc1, 0xd6, 0x88, 0x92, 0xf2, 0x8f, 0xec, 0xcf, 0xb9, 0xcf, 0x5b, 0x7f, 0xd5, 0x18, 0x3b, 0x7d, - 0xd5, 0x16, 0xc3, 0xd9, 0x78, 0xdf, 0x45, 0x83, 0xb9, 0x40, 0x03, 0xa5, 0x10, 0x5b, 0xd2, 0xd7, - 0x8c, 0xfc, 0xc2, 0x7c, 0x8b, 0x9c, 0x3a, 0x3b, 0x5f, 0xc0, 0xb7, 0xcf, 0x8a, 0x3d, 0x2e, 0x9c, - 0x60, 0x1c, 0x8d, 0x33, 0xff, 0xad, 0x96, 0x37, 0x92, 0x4c, 0xb0, 0x4b, 0xce, 0x5c, 0x59, 0x8d, - 0x09, 0x57, 0xf2, 0x4f, 0x57, 0x0c, 0x04, 0x4d, 0xc6, 0x8e, 0x2e, 0x29, 0x56, 0x01, 0x14, 0x6d, - 0x3a, 0x79, 0x9d, 0xa1, 0x79, 0x99, 0xf4, 0xe8, 0x81, 0x09, 0x28, 0x48, 0x18, 0xdc, 0x61, 0x45, - 0xc2, 0x75, 0xb4, 0xb3, 0xd9, 0x4c, 0x51, 0xf1, 0x93, 0x79, 0xf6, 0xe0, 0x61, 0x44, 0x32, 0x89, - 0xdb, 0x90, 0xaa, 0x83, 0x90, 0xcf, 0x8c, 0xce, 0xbe, 0xca, 0x87, 0x87, 0x17, 0x4c, 0xc5, 0x57, - 0xea, 0x58, 0x12, 0xe4, 0xbd, 0x9a, 0x02, 0x7b, 0x0b, 0x90, 0x8d, 0x39, 0xb2, 0x07, 0x89, 0x1f, - 0x44, 0x52, 0x24, 0x4f, 0xea, 0xc6, 0x53, 0x0a, 0x96, 0x0c, 0x2b, 0xde, 0x49, 0xc5, 0x08, 0x49, - 0x34, 0x6e, 0x8e, 0x47, 0x03, 0x64, 0x6e, 0x88, 0x5b, 0xbf, 0x02, 0xb3, 0x9b, 0xa9, 0x76, 0x51, - 0xde, 0x8a, 0xd6, 0x53, 0x7d, 0x9d, 0x09, 0xf7, 0xcd, 0x5f, 0x31, 0x2d, 0xa3, 0x39, 0x58, 0xf0, - 0x63, 0xe6, 0xc4, 0x53, 0x0e, 0x99, 0x27, 0xb1, 0x99, 0x90, 0x1c, 0xbf, 0x2d, 0xfa, 0xee, 0xc5, - 0xdf, 0xc2, 0xe1, 0xa3, 0xbe, 0x31, 0x97, 0xee, 0x3c, 0x0b, 0x9b, 0x80, 0x1a, 0xca, 0xdc, 0xd3, - 0x38, 0x48, 0x72, 0x8e, 0xe2, 0x40, 0xd4, 0x31, 0xd9, 0xff, 0xa0, 0xa0, 0xd0, 0xd3, 0x2c, 0x6e, - 0x88, 0x3a, 0x66, 0x84, 0x83, 0x33, 0xb4, 0x08, 0x48, 0xf3, 0x90, 0x97, 0xca, 0xca, 0xf2, 0xdc, - 0x8b, 0x54, 0xd7, 0x71, 0xbf, 0x87, 0xc2, 0x9c, 0x63, 0xe3, 0x3a, 0x88, 0xb4, 0x8e, 0xee, 0x84, - 0x5e, 0x23, 0x5c, 0xfb, 0x8c, 0x7e, 0xa3, 0xcd, 0xe7, 0x2b, 0x6e, 0x84, 0x0e, 0x6c, 0x38, 0x32, - 0x29, 0xa0, 0x32, 0xf2, 0xb1, 0x88, 0xbc, 0xc6, 0xfd, 0xb6, 0x03, 0x98, 0xdc, 0x19, 0xa0, 0x4e, - 0x9b, 0xa9, 0xd4, 0x7c, 0x89, 0x00, 0xe3, 0xd0, 0xfc, 0x2d, 0x79, 0x3b, 0x41, 0x05, 0x11, 0x2a, - 0x49, 0xac, 0xaf, 0xcb, 0xee, 0x6f, 0x62, 0xb9, 0x87, 0x07, 0x9a, 0x46, 0x51, 0x08, 0x70, 0x97, - 0x03, 0x50, 0x1e, 0xf5, 0x1f, 0x5d, 0x5e, 0x7e, 0xc1, 0x1b, 0x84, 0xad, 0x8a, 0xa4, 0x67, 0x85, - 0xc5, 0xb6, 0xaa, 0x21, 0x59, 0xc1, 0x37, 0xd9, 0x5e, 0x36, 0x12, 0xc1, 0xa6, 0x84, 0x0c, 0x93, - 0xb1, 0x86, 0x68, 0xf8, 0x31, 0xb6, 0xb2, 0x31, 0xfa, 0x18, 0xaf, 0x60, 0xb0, 0xc5, 0xd1, 0x33, - 0xe8, 0x11, 0xa4, 0xe7, 0xa1, 0x4a, 0xdc, 0xd5, 0x4a, 0xd2, 0x48, 0x85, 0xb5, 0x85, 0xf3, 0x2f, - 0x1e, 0x41, 0x4e, 0x7a, 0x48, 0xb7, 0x84, 0xcc, 0x8f, 0xff, 0x1c, 0xe5, 0xe5, 0x82, 0xbc, 0x81, - 0x3f, 0xbd, 0x1e, 0xfc, 0x2d, 0xc8, 0xf8, 0x52, 0xe8, 0xb6, 0xe1, 0xa5, 0x40, 0xe8, 0x4b, 0xa5, - 0x87, 0x39, 0xbd, 0x0a, 0x7d, 0xe9, 0x29, 0xf4, 0xa5, 0x57, 0x2a, 0xe1, 0x4b, 0xaf, 0x82, 0x75, - 0xb2, 0xf9, 0x2c, 0xbc, 0xec, 0x6e, 0x56, 0x76, 0x7f, 0x66, 0xf0, 0x6c, 0x67, 0xc9, 0xd1, 0x9b, - 0x1f, 0x4b, 0x14, 0x9d, 0xae, 0xe9, 0x77, 0xd7, 0x99, 0x4b, 0x16, 0x9e, 0xbe, 0x8a, 0xbb, 0x14, - 0xbc, 0x36, 0x9a, 0xd7, 0xea, 0xf5, 0x3a, 0xce, 0xd3, 0x32, 0xf7, 0xc5, 0x55, 0xcd, 0x90, 0x34, - 0x7e, 0x68, 0x84, 0x2a, 0x4d, 0x62, 0x02, 0xbf, 0x3a, 0x94, 0x04, 0xd5, 0xdb, 0xa1, 0x87, 0x47, - 0x5e, 0xa2, 0x9b, 0xd2, 0x4d, 0x33, 0xbe, 0xef, 0x04, 0x2e, 0xc9, 0x84, 0x7a, 0xef, 0x00, 0x2b, - 0x80, 0x97, 0x90, 0x1f, 0x35, 0x8a, 0x90, 0x96, 0xe7, 0xa0, 0xec, 0x96, 0x82, 0x37, 0xa0, 0x51, - 0xea, 0x37, 0x4c, 0xd2, 0x3d, 0x3b, 0x8d, 0x32, 0x23, 0x93, 0x99, 0xb9, 0xaf, 0x03, 0x79, 0x23, - 0x77, 0xaf, 0xe5, 0xd7, 0x7d, 0x37, 0x21, 0xbd, 0xdb, 0x01, 0xfa, 0x44, 0x61, 0xc1, 0x75, 0x75, - 0x42, 0xaf, 0x62, 0xbf, 0x65, 0x20, 0xa7, 0xe9, 0x76, 0xe8, 0x2d, 0x3d, 0xa9, 0x52, 0x9f, 0xe3, - 0x55, 0x45, 0x06, 0x50, 0x24, 0x81, 0x3e, 0xca, 0xc3, 0x09, 0x1e, 0x3d, 0x0d, 0x71, 0xaf, 0xdd, - 0x4e, 0x70, 0x81, 0xca, 0xe4, 0xdd, 0xc5, 0xad, 0x89, 0x85, 0x29, 0xe3, 0xc3, 0xb1, 0x65, 0x77, - 0x63, 0xb7, 0xa5, 0xc5, 0x82, 0xb9, 0x55, 0x05, 0x93, 0xd5, 0x15, 0x3d, 0x2f, 0x6f, 0x33, 0xfb, - 0x29, 0x10, 0x73, 0x4b, 0x4b, 0x25, 0x17, 0x37, 0x47, 0x6f, 0x9d, 0x70, 0x5b, 0x19, 0x4c, 0x98, - 0x45, 0xc8, 0x80, 0x28, 0x66, 0x06, 0xbf, 0xd1, 0x57, 0xb3, 0xeb, 0x76, 0xda, 0x31, 0xf6, 0xd5, - 0x29, 0xe9, 0x26, 0xb2, 0x49, 0x77, 0xff, 0x72, 0x91, 0x6b, 0x4e, 0x2c, 0x49, 0xab, 0x8b, 0xe7, - 0x86, 0x23, 0xe0, 0x97, 0xe5, 0x68, 0x93, 0x5d, 0xb1, 0xa6, 0x6f, 0x65, 0x49, 0x7e, 0x5b, 0xab, - 0x27, 0x74, 0xf8, 0x7f, 0xa6, 0x0e, 0x2f, 0x49, 0xbf, 0x09, 0xc8, 0x93, 0xb7, 0xe5, 0x6a, 0x36, - 0x99, 0x4c, 0x89, 0x42, 0x43, 0xac, 0xea, 0x38, 0x1d, 0x09, 0x5a, 0xb6, 0x28, 0xff, 0x49, 0x2d, - 0x91, 0xd4, 0x96, 0x0d, 0x15, 0x61, 0x59, 0x63, 0xa1, 0x61, 0x43, 0xf4, 0xf6, 0x38, 0x26, 0x30, - 0x91, 0xf4, 0x28, 0x89, 0xbb, 0x27, 0x32, 0x5e, 0xe7, 0x07, 0x50, 0xe3, 0x4f, 0x50, 0x23, 0xa3, - 0x42, 0x2d, 0x94, 0x49, 0xda, 0xb0, 0x25, 0x6e, 0x2b, 0xa9, 0xba, 0x67, 0x02, 0x84, 0xa2, 0xf4, - 0x10, 0x1a, 0xf7, 0xd4, 0x6a, 0x38, 0x9d, 0xf5, 0x60, 0xd4, 0xc5, 0x93, 0xd1, 0x68, 0xa0, 0xbc, - 0x8c, 0xc4, 0x1a, 0x49, 0x83, 0x12, 0x9b, 0xa6, 0x67, 0x1b, 0xee, 0x89, 0xa8, 0x9c, 0xce, 0x16, - 0xd2, 0xd4, 0xfa, 0x0b, 0xe5, 0x0e, 0x0d, 0x10, 0x23, 0xe9, 0xa2, 0xea, 0xe8, 0x34, 0x05, 0x1f, - 0xd8, 0xee, 0x37, 0x06, 0xe6, 0x8c, 0x95, 0xe7, 0x02, 0xc8, 0x4d, 0xc6, 0xdc, 0xd7, 0xca, 0xbf, - 0xd3, 0x4f, 0x62, 0x22, 0xab, 0xfe, 0x63, 0xa6, 0xcc, 0xe9, 0x0f, 0xba, 0x3b, 0xd4, 0x95, 0x6d, - 0x51, 0xac, 0x7e, 0xf3, 0xcd, 0x91, 0x86, 0x86, 0x37, 0x31, 0xea, 0xb9, 0xad, 0xef, 0x03, 0xcb, - 0x33, 0x32, 0x78, 0xb7, 0x75, 0xfc, 0xaf, 0xab, 0xbb, 0x5f, 0xc3, 0x93, 0x6b, 0xcc, 0x4b, 0x1e, - 0xbf, 0x87, 0xbc, 0xf8, 0xf1, 0x56, 0x4c, 0xa5, 0xda, 0xb2, 0x6b, 0xae, 0xfc, 0xc6, 0x3a, 0xcd, - 0x15, 0x4b, 0xeb, 0x78, 0x2e, 0xe4, 0x6c, 0x7b, 0x08, 0x10, 0x77, 0x49, 0x7b, 0xd4, 0x17, 0xa5, - 0x6f, 0x2b, 0x42, 0x4c, 0xc6, 0xde, 0xd1, 0x9b, 0xfd, 0xe7, 0xb7, 0x2e, 0x56, 0xfd, 0xcf, 0x6f, - 0xd5, 0x6f, 0xa9, 0x44, 0x36, 0x57, 0x76, 0x1b, 0x16, 0x7b, 0x0a, 0x30, 0x6c, 0xd8, 0x99, 0xe9, - 0x29, 0x6a, 0x32, 0xf5, 0x8d, 0x8a, 0x85, 0xd1, 0x4d, 0x33, 0x5c, 0x05, 0xf4, 0xd5, 0x2a, 0x8d, - 0x74, 0x0b, 0xc5, 0x83, 0xcf, 0xca, 0x85, 0xee, 0x6c, 0x7d, 0x43, 0xc3, 0x31, 0x1b, 0x84, 0x0f, - 0xfa, 0xce, 0x48, 0xd5, 0xd0, 0x99, 0x22, 0x3d, 0x56, 0xbb, 0xc9, 0x48, 0x5e, 0x4b, 0xed, 0x83, - 0xd4, 0x4e, 0x6f, 0xbf, 0xa0, 0x7c, 0x8d, 0xa5, 0x26, 0x6a, 0x4f, 0x4d, 0xdb, 0x34, 0x3d, 0x25, - 0xfe, 0x4b, 0xa0, 0x7e, 0xc5, 0x34, 0xcd, 0xb2, 0x6d, 0x55, 0x12, 0x85, 0xee, 0xce, 0x10, 0x78, - 0x65, 0xa4, 0x9d, 0x5b, 0x13, 0xcd, 0xee, 0xa2, 0x14, 0x31, 0xc1, 0xa7, 0x47, 0x34, 0x3d, 0x19, - 0x2d, 0x7e, 0x43, 0x0b, 0x03, 0x33, 0xc6, 0xcc, 0x48, 0x1e, 0xc6, 0xe6, 0x12, 0x70, 0x75, 0xc1, - 0x5a, 0x83, 0xee, 0x5e, 0x76, 0xbc, 0xce, 0x48, 0xda, 0xb4, 0x2d, 0x65, 0xb8, 0x1d, 0x2e, 0x79, - 0xd9, 0xba, 0x6e, 0x9c, 0x89, 0x52, 0xc2, 0xcd, 0xa5, 0x4b, 0x32, 0xc9, 0xad, 0x47, 0xb7, 0x89, - 0x45, 0xb4, 0xec, 0x01, 0x33, 0x1d, 0xe2, 0x72, 0x14, 0xdc, 0xeb, 0x27, 0xa2, 0xa4, 0x45, 0x61, - 0x69, 0x00, 0x91, 0xc2, 0xbe, 0x2d, 0xec, 0x5f, 0xb6, 0x10, 0x5c, 0xba, 0xa4, 0x7b, 0xa6, 0x1d, - 0x2d, 0x76, 0xd6, 0x68, 0x0a, 0xc0, 0x46, 0xf0, 0x1a, 0x15, 0x16, 0x1b, 0x2a, 0x9d, 0x85, 0x41, - 0xa9, 0x1a, 0xb1, 0xdf, 0x6c, 0xd8, 0xfb, 0xb1, 0x00, 0x30, 0xfc, 0x51, 0x0a, 0xcf, 0xf0, 0xe9, - 0xa3, 0x93, 0x42, 0x10, 0x11, 0xd1, 0xdc, 0xe2, 0x06, 0xd1, 0xe5, 0x4f, 0x56, 0x30, 0xc3, 0x0a, - 0xc1, 0x42, 0xff, 0xd7, 0x22, 0xde, 0xf7, 0xf4, 0xb1, 0x6a, 0x19, 0xfa, 0x90, 0x82, 0x4f, 0xd2, - 0x78, 0xe9, 0x9e, 0x9e, 0x29, 0xa0, 0xa7, 0x8a, 0x45, 0xe0, 0x91, 0x4e, 0x9f, 0x36, 0x51, 0x4d, - 0xf4, 0x04, 0xa7, 0xb5, 0x81, 0xd0, 0xe9, 0x2a, 0xfb, 0xc5, 0x78, 0xe2, 0xcb, 0x38, 0xbc, 0xb9, - 0x53, 0xb1, 0x9b, 0x4a, 0xd1, 0x68, 0x7b, 0x0a, 0x8a, 0x2c, 0xf1, 0xcf, 0x8f, 0x44, 0x8e, 0x49, - 0x32, 0x8f, 0x22, 0xdf, 0x87, 0xc2, 0x35, 0x9a, 0xb9, 0x35, 0x5b, 0x2a, 0x9e, 0xe4, 0xf5, 0xd1, - 0xdd, 0x20, 0x14, 0xb9, 0x86, 0x77, 0x3b, 0xf1, 0x18, 0xaf, 0x77, 0x4d, 0x9c, 0x67, 0xbe, 0x54, - 0xba, 0xb7, 0xfd, 0x7d, 0x30, 0x74, 0xfe, 0x9a, 0xe0, 0xaf, 0x09, 0x85, 0xef, 0x06, 0xb9, 0x57, - 0x82, 0x50, 0xfc, 0xea, 0xbb, 0xfa, 0x83, 0x57, 0x38, 0x95, 0xa2, 0x6d, 0x6a, 0x81, 0xc6, 0xa0, - 0xa7, 0x61, 0x95, 0xd4, 0xa8, 0x47, 0x42, 0xd0, 0x08, 0x95, 0xfb, 0xb8, 0x36, 0xb5, 0x14, 0x10, - 0x96, 0xb6, 0x85, 0x0d, 0x63, 0x16, 0xb6, 0xaf, 0x25, 0x69, 0x4b, 0x0a, 0x33, 0x1a, 0x43, 0xfb, - 0x62, 0x4a, 0x4b, 0x4a, 0x46, 0xfd, 0xcb, 0x17, 0x05, 0x0f, 0x60, 0xe2, 0x4f, 0xcb, 0x7c, 0x65, - 0xed, 0xf7, 0x6f, 0xbc, 0xca, 0xa0, 0xad, 0xaf, 0xf3, 0x7e, 0xc6, 0x90, 0x8d, 0x1e, 0x56, 0x62, - 0xf0, 0x89, 0x69, 0xb1, 0x66, 0x4f, 0x54, 0x94, 0xbc, 0x74, 0x14, 0x25, 0x93, 0xb3, 0x0e, 0xfa, - 0xba, 0x64, 0xab, 0x6a, 0xe8, 0x48, 0xb3, 0xd6, 0xb6, 0x88, 0xf2, 0x52, 0xa3, 0x79, 0x39, 0x3e, - 0xaf, 0x1f, 0xce, 0xcb, 0xf3, 0x79, 0x5a, 0x52, 0x9c, 0x23, 0xfc, 0x96, 0xab, 0x9b, 0xb8, 0x52, - 0x34, 0xe8, 0x00, 0xda, 0x3c, 0x88, 0x49, 0xd5, 0xb6, 0x17, 0x79, 0x14, 0x17, 0x01, 0x49, 0x80, - 0xed, 0x4e, 0xf8, 0x63, 0xa6, 0xa7, 0x0d, 0x7d, 0x1b, 0x0f, 0x8e, 0x45, 0xa6, 0x0a, 0xfb, 0x12, - 0xb9, 0x36, 0x87, 0x02, 0x61, 0x05, 0x07, 0x50, 0x77, 0x39, 0xb1, 0x12, 0x98, 0x97, 0x8c, 0xf0, - 0xb4, 0xe5, 0x71, 0xac, 0xf8, 0xe8, 0x49, 0xac, 0x5d, 0xfa, 0x0d, 0x93, 0xd5, 0x91, 0xf8, 0x48, - 0x1f, 0xaf, 0x05, 0xb0, 0x8e, 0xfe, 0x4a, 0x48, 0xb1, 0x25, 0xdf, 0xc0, 0xc3, 0x61, 0x42, 0xaf, - 0x30, 0xbc, 0xcc, 0xd6, 0x87, 0x91, 0x94, 0xf8, 0xbf, 0xa0, 0x31, 0xd6, 0x75, 0xb6, 0x6d, 0x4a, - 0x5d, 0xfa, 0x64, 0x98, 0x92, 0xe9, 0x25, 0x3d, 0x4a, 0x7d, 0x37, 0xed, 0x51, 0x1a, 0xd5, 0x41, - 0x1e, 0x03, 0x92, 0xf8, 0x3e, 0x9c, 0xfc, 0x39, 0x1c, 0x48, 0x3d, 0x98, 0x1a, 0x16, 0x0d, 0x27, - 0x14, 0x03, 0xc7, 0xfd, 0x02, 0x2c, 0xde, 0x88, 0xc5, 0xab, 0x88, 0x44, 0x40, 0x2d, 0xf1, 0x0c, - 0x77, 0x4c, 0xb1, 0xab, 0x5a, 0xec, 0x90, 0x42, 0x9c, 0x2f, 0x09, 0xda, 0xc8, 0xa1, 0x10, 0xda, - 0x89, 0xa0, 0x0c, 0x1a, 0xf4, 0xf0, 0x85, 0xa3, 0x85, 0x02, 0xdb, 0xa2, 0x1b, 0xcf, 0x86, 0xce, - 0xec, 0xd6, 0x07, 0xb1, 0x8b, 0xbc, 0x78, 0x36, 0xbf, 0xa4, 0xf1, 0x07, 0xa0, 0x9f, 0xa9, 0xa8, - 0xdf, 0x7c, 0x0c, 0xe3, 0x30, 0xfa, 0x4d, 0xc3, 0x33, 0x95, 0x87, 0x70, 0xa8, 0xfe, 0x5d, 0x00, - 0x07, 0x28, 0xda, 0x0d, 0x91, 0xc5, 0x8c, 0xd0, 0xcd, 0xe7, 0x73, 0x98, 0xfe, 0x04, 0x4e, 0x1f, - 0x17, 0x51, 0xfa, 0x18, 0xc2, 0xe9, 0xe3, 0xdf, 0x85, 0x78, 0xf8, 0x4f, 0xa1, 0xf4, 0x71, 0x01, - 0xa5, 0x21, 0x08, 0x87, 0x7f, 0x17, 0x42, 0xc6, 0x0f, 0xdb, 0x61, 0x7e, 0x42, 0x7b, 0x54, 0x4c, - 0xbc, 0x71, 0x4d, 0xc3, 0x85, 0xc2, 0x33, 0x7e, 0x1b, 0xd1, 0xe4, 0x22, 0xb7, 0x6a, 0x6d, 0x6d, - 0xc3, 0x76, 0x63, 0x3a, 0xed, 0x51, 0x06, 0x29, 0x64, 0x77, 0x85, 0xfd, 0x07, 0x2a, 0x20, 0xf2, - 0x0b, 0x8d, 0x68, 0x1b, 0x26, 0x74, 0xcb, 0xce, 0xe5, 0xc2, 0xa9, 0xa1, 0xee, 0xb2, 0xb9, 0xe8, - 0x08, 0xb3, 0x39, 0x8f, 0xe1, 0x7c, 0x77, 0x03, 0x8b, 0x05, 0x9f, 0x40, 0xfc, 0x63, 0x06, 0x9c, - 0x18, 0x86, 0x9d, 0xcd, 0x6d, 0xe3, 0x59, 0x39, 0xbb, 0xad, 0xca, 0x46, 0x4e, 0xe3, 0xa5, 0xdb, - 0xdf, 0x33, 0xac, 0x4e, 0xb4, 0x6e, 0x16, 0xeb, 0x66, 0x97, 0xd5, 0xdd, 0x51, 0xac, 0x65, 0x15, - 0x73, 0x58, 0x31, 0xb7, 0xac, 0x62, 0xc3, 0xea, 0x2c, 0xab, 0x98, 0xc7, 0x8a, 0xf9, 0x65, 0x15, - 0x9b, 0xf4, 0xce, 0x76, 0x50, 0x37, 0xc3, 0xb2, 0x23, 0xbc, 0xe8, 0xc8, 0x9d, 0x1f, 0x3a, 0x1b, - 0xb6, 0x8e, 0x68, 0x53, 0x63, 0xa7, 0xa2, 0x85, 0x62, 0x89, 0x60, 0xab, 0xc3, 0xbf, 0x3b, 0x0f, - 0x76, 0x74, 0xed, 0xb6, 0xd4, 0x0f, 0x67, 0xc1, 0x56, 0x17, 0x11, 0x49, 0x14, 0xa8, 0xa9, 0x7f, - 0x3c, 0x0b, 0x31, 0x75, 0xef, 0xc9, 0xbd, 0xaa, 0x69, 0xd7, 0x46, 0xe7, 0xe5, 0xd1, 0x18, 0x7d, - 0x80, 0x99, 0x5a, 0xd4, 0x4c, 0x07, 0xc3, 0xa0, 0x86, 0x26, 0x68, 0x5f, 0xc3, 0x73, 0xa1, 0x21, - 0xee, 0xe1, 0xa4, 0xbf, 0x2d, 0x86, 0xfa, 0x80, 0x5c, 0x63, 0x3b, 0xd8, 0xd8, 0x17, 0x36, 0x40, - 0x97, 0xee, 0xf1, 0x9e, 0x33, 0xdd, 0x42, 0xe0, 0x01, 0x4d, 0x54, 0x31, 0x2b, 0x99, 0xc5, 0xe1, - 0xde, 0xfa, 0x78, 0x05, 0xdb, 0x44, 0x0b, 0x63, 0x16, 0xe5, 0x11, 0x7e, 0x09, 0x43, 0xca, 0xdf, - 0x5b, 0xc3, 0x91, 0xe1, 0x2f, 0x98, 0x27, 0xb1, 0xa3, 0xbd, 0xa9, 0x3f, 0x8b, 0x4b, 0x2c, 0x7e, - 0xd6, 0x7b, 0x08, 0x5c, 0xfa, 0x1e, 0xd8, 0xfb, 0xd0, 0x01, 0x8e, 0xca, 0x89, 0xf0, 0xeb, 0xfa, - 0x45, 0x26, 0x92, 0xb5, 0x20, 0x46, 0x2f, 0x6d, 0xbc, 0x46, 0x45, 0x03, 0x1c, 0x0b, 0xd4, 0xde, - 0xb6, 0x5d, 0x33, 0x0d, 0xfb, 0x85, 0x66, 0x41, 0x72, 0x02, 0x9c, 0x17, 0xb2, 0x78, 0x43, 0x0c, - 0x03, 0x30, 0xe2, 0x4f, 0x3e, 0x57, 0x14, 0xe7, 0x54, 0x90, 0xf8, 0x95, 0x02, 0x71, 0x49, 0xdf, - 0x86, 0x7f, 0x55, 0x2f, 0x76, 0x9a, 0x80, 0xc2, 0x59, 0xea, 0x5b, 0xc8, 0x94, 0x68, 0x98, 0x8c, - 0xd2, 0x3f, 0x84, 0x8d, 0x25, 0xe3, 0x16, 0x8d, 0x6e, 0x6b, 0x4a, 0x9f, 0x9e, 0x04, 0xe3, 0x81, - 0xf7, 0xd6, 0xb7, 0xd4, 0xaf, 0x28, 0x12, 0xfa, 0x6e, 0x10, 0x2d, 0xef, 0x2c, 0x9c, 0xaa, 0x9d, - 0xb0, 0x43, 0xcf, 0x6b, 0xbc, 0x51, 0x15, 0x23, 0xc5, 0xe9, 0x64, 0xea, 0x84, 0xe5, 0xe4, 0x45, - 0x07, 0xba, 0x6f, 0x08, 0xe1, 0x37, 0x17, 0x1d, 0xb9, 0xcd, 0xf2, 0x1f, 0xb3, 0x16, 0x35, 0x1e, - 0xa6, 0xf1, 0xd3, 0x25, 0xcd, 0x81, 0x62, 0x35, 0xd1, 0x41, 0x96, 0x52, 0x55, 0x4a, 0x6c, 0x88, - 0xe9, 0x8e, 0x9b, 0xd4, 0x40, 0x6f, 0xcf, 0xa4, 0x87, 0x8e, 0x5f, 0x91, 0x71, 0x6f, 0x74, 0xbc, - 0x10, 0x7a, 0x94, 0x2c, 0x42, 0xa0, 0x7a, 0xf2, 0x61, 0x2f, 0x59, 0x0b, 0x0b, 0x6e, 0x07, 0x96, - 0x49, 0xe7, 0x46, 0x92, 0x03, 0x70, 0x1a, 0x5e, 0xc8, 0x94, 0x15, 0x0d, 0x59, 0x4b, 0x1b, 0xca, - 0x06, 0x0d, 0xed, 0x7c, 0xa2, 0xa1, 0xfe, 0xd2, 0x86, 0x72, 0x41, 0x43, 0xcd, 0x4f, 0x34, 0xa4, - 0x2d, 0x6d, 0x28, 0x1f, 0x34, 0xb4, 0xeb, 0x37, 0xc4, 0x31, 0x09, 0xe1, 0xd7, 0xe2, 0x84, 0xc7, - 0x18, 0xd2, 0x5d, 0xc2, 0x5f, 0x6e, 0x4a, 0xd7, 0xe2, 0xcd, 0xe8, 0x71, 0xad, 0xc7, 0x5a, 0xd1, - 0xb5, 0x58, 0x0b, 0xba, 0x16, 0xb5, 0x9e, 0xc3, 0x42, 0x88, 0x5e, 0x63, 0xb4, 0xa8, 0xf7, 0x7e, - 0x94, 0xcf, 0xa9, 0x7a, 0x08, 0x70, 0x78, 0x65, 0xb0, 0x2c, 0x04, 0xa3, 0xf3, 0x68, 0xc8, 0x99, - 0x3a, 0xa1, 0x1a, 0x4e, 0xec, 0xf7, 0x79, 0x82, 0xcf, 0xf3, 0xfc, 0x31, 0x13, 0x89, 0x6d, 0x96, - 0x73, 0xa5, 0x92, 0x58, 0xaf, 0xdb, 0x54, 0x6d, 0xdd, 0xce, 0xe7, 0xaa, 0xa5, 0xc2, 0x9c, 0x17, - 0xaf, 0xdd, 0x35, 0x8b, 0x1c, 0x34, 0x14, 0xf5, 0x8e, 0x7e, 0x03, 0x48, 0x40, 0x6e, 0x94, 0x4e, - 0xa7, 0xc5, 0x8c, 0x6b, 0x36, 0xf2, 0x11, 0x05, 0x9a, 0x21, 0x8d, 0x31, 0xe8, 0x00, 0x41, 0xa3, - 0x0b, 0x1a, 0x40, 0xee, 0x74, 0xb7, 0xfe, 0x98, 0x8d, 0xb6, 0xc5, 0x16, 0x8a, 0xd8, 0xc2, 0x03, - 0x7a, 0x90, 0xd0, 0xa7, 0xd3, 0xbd, 0x5d, 0x91, 0x79, 0xab, 0x71, 0xa5, 0x78, 0x1c, 0x01, 0xbc, - 0xdb, 0xe2, 0x3d, 0x5a, 0x92, 0x68, 0x1d, 0xe0, 0x11, 0x50, 0x79, 0xa1, 0x00, 0x8b, 0xe7, 0x03, - 0xea, 0xa4, 0x57, 0x28, 0xb6, 0x5d, 0x94, 0xc8, 0x2f, 0x7a, 0x3d, 0xbc, 0x0d, 0xc4, 0x79, 0xc8, - 0x71, 0x20, 0xba, 0x08, 0xe6, 0x18, 0x6e, 0x98, 0xcf, 0xaf, 0x8c, 0x80, 0xf8, 0xc7, 0x2c, 0x31, - 0xda, 0x1e, 0x4e, 0xaa, 0x9e, 0x3d, 0x3a, 0xb9, 0x91, 0x9d, 0x73, 0xca, 0x4a, 0x67, 0xbe, 0xa0, - 0xf4, 0x9c, 0x12, 0x3d, 0x50, 0x87, 0xfc, 0x6f, 0x2c, 0x41, 0x67, 0xec, 0x1b, 0x4b, 0x1e, 0x57, - 0xe7, 0x46, 0xf1, 0x01, 0x80, 0xe4, 0x03, 0x00, 0x43, 0xf0, 0xf1, 0xc0, 0x75, 0x37, 0x12, 0x51, - 0x9c, 0x76, 0xaa, 0x72, 0xf2, 0x1f, 0x00, 0x59, 0xc0, 0x5e, 0x3d, 0x9f, 0x26, 0xa4, 0xd9, 0x0d, - 0x45, 0x53, 0xfb, 0x7a, 0x15, 0x79, 0xba, 0xe5, 0xa0, 0x23, 0x13, 0x6e, 0x87, 0x58, 0x68, 0x9c, - 0xa2, 0x66, 0x48, 0x31, 0xd5, 0xc3, 0xa4, 0xc5, 0x91, 0xd2, 0x96, 0x98, 0x9d, 0x78, 0x61, 0x53, - 0x37, 0x7a, 0xd1, 0x91, 0x73, 0x54, 0x6c, 0xf4, 0x56, 0x8d, 0x83, 0x33, 0x3e, 0xc2, 0xf2, 0x84, - 0x1e, 0x5c, 0x2b, 0xe7, 0x16, 0x23, 0xd0, 0x47, 0xcf, 0xd3, 0x12, 0x00, 0x5b, 0xc0, 0x91, 0x78, - 0x48, 0x8d, 0x9e, 0x1e, 0xd1, 0x3d, 0xa2, 0x5d, 0xd0, 0x2f, 0x1f, 0xa6, 0xb0, 0x0f, 0x66, 0xef, - 0x5b, 0x4a, 0x4b, 0x7d, 0xb3, 0x1f, 0x57, 0xce, 0xdf, 0xb7, 0x54, 0x62, 0x38, 0xd8, 0xc8, 0xa2, - 0xed, 0xd1, 0x1b, 0xde, 0xb7, 0x94, 0x89, 0x6f, 0x31, 0x83, 0xa3, 0x0d, 0x2e, 0x99, 0x25, 0x37, - 0x6f, 0x2b, 0x00, 0xf5, 0x03, 0xc0, 0xc8, 0x47, 0x80, 0x0d, 0x07, 0x21, 0xa0, 0x12, 0xfd, 0x45, - 0x7a, 0x32, 0xab, 0x68, 0x2b, 0xff, 0xf7, 0x81, 0x15, 0x96, 0xd3, 0x12, 0x6c, 0xff, 0x43, 0x8f, - 0x88, 0x06, 0xf0, 0xe0, 0x4f, 0x80, 0x48, 0x99, 0xac, 0x3f, 0xb3, 0x07, 0x18, 0x17, 0x0c, 0x36, - 0x6d, 0x7f, 0xfc, 0x2d, 0xbc, 0x80, 0xc0, 0xbd, 0x87, 0xa7, 0x4e, 0xfc, 0xd4, 0xda, 0xeb, 0x5b, - 0x66, 0x2c, 0x92, 0xb2, 0xbc, 0x3d, 0x83, 0xa3, 0x4a, 0x28, 0xff, 0xbf, 0x80, 0x23, 0xd8, 0x66, - 0x67, 0xe5, 0xd4, 0x45, 0xa1, 0x82, 0xf2, 0xff, 0x08, 0x54, 0x9f, 0x30, 0xd2, 0x33, 0x93, 0xd0, - 0x32, 0xd9, 0xd5, 0xff, 0x0e, 0x93, 0x1f, 0x49, 0x97, 0xee, 0xb2, 0xf1, 0x1f, 0x7f, 0xe3, 0xe6, - 0xcb, 0xb3, 0xad, 0x86, 0xb7, 0xd4, 0x81, 0xd0, 0x0e, 0xeb, 0x42, 0x40, 0x91, 0xa2, 0xbf, 0xc9, - 0x27, 0xe8, 0xd6, 0xd0, 0x4b, 0xc2, 0xc3, 0xfa, 0x7a, 0x7f, 0xc3, 0xdc, 0xca, 0xae, 0xaf, 0x77, - 0x37, 0x3a, 0x5b, 0xd9, 0xed, 0x36, 0x25, 0x9c, 0x04, 0x49, 0x37, 0x46, 0x5d, 0xd5, 0xb8, 0x26, - 0xec, 0x2e, 0xc6, 0xfa, 0x7a, 0x24, 0x81, 0x9a, 0xdb, 0xc4, 0xea, 0x11, 0x6e, 0xe4, 0x2b, 0x4c, - 0x02, 0x21, 0x00, 0xda, 0xce, 0x50, 0x74, 0xfb, 0xa6, 0x21, 0x77, 0x4d, 0x83, 0x9e, 0x46, 0x30, - 0xab, 0x81, 0x1b, 0x60, 0x0c, 0xfb, 0x06, 0xee, 0xb9, 0x5a, 0x03, 0xa1, 0x0b, 0xc4, 0x31, 0x23, - 0xba, 0xdd, 0x8d, 0xe9, 0xaf, 0xaa, 0x6f, 0x28, 0x7e, 0x3b, 0x66, 0x48, 0x03, 0x81, 0xd5, 0xb0, - 0x85, 0x27, 0x3a, 0x1f, 0xb7, 0x1c, 0x67, 0xf1, 0x09, 0xb5, 0x1c, 0xb1, 0xf9, 0xd0, 0x96, 0x91, - 0x0f, 0xfe, 0x75, 0x0d, 0xa7, 0x8b, 0x61, 0x42, 0x51, 0x84, 0x5f, 0x4e, 0x3d, 0x2e, 0x64, 0x16, - 0x13, 0xb9, 0xfc, 0xcf, 0xde, 0x9a, 0xa0, 0x93, 0xba, 0x51, 0xca, 0xf0, 0xf2, 0x0e, 0x77, 0x12, - 0x64, 0x7e, 0x8a, 0xc8, 0x42, 0x9f, 0x47, 0x0c, 0x7c, 0x82, 0x3e, 0x03, 0x4a, 0x37, 0x04, 0xca, - 0x2e, 0x75, 0xc0, 0xe1, 0x00, 0xe8, 0xf2, 0xca, 0xe0, 0xd6, 0x5f, 0xfc, 0xda, 0x58, 0x48, 0x1f, - 0x5e, 0x94, 0x1d, 0x81, 0xe4, 0x2c, 0x64, 0x6b, 0xcc, 0x1f, 0x74, 0xee, 0xd9, 0xbd, 0x17, 0x1d, - 0x2a, 0x5c, 0x13, 0x3b, 0x6f, 0x41, 0xdf, 0xaa, 0xb3, 0xf3, 0xf0, 0x5a, 0x70, 0xb3, 0x4b, 0x73, - 0x0f, 0x69, 0x41, 0xad, 0xc4, 0xab, 0xa9, 0x49, 0xcf, 0x8b, 0xd4, 0x7b, 0xf7, 0x42, 0x69, 0xa3, - 0x3f, 0xb3, 0x6f, 0xf9, 0x57, 0xea, 0x72, 0x4d, 0xf9, 0x5e, 0xc7, 0x41, 0xd6, 0x94, 0x54, 0x2a, - 0x19, 0x18, 0xdf, 0x15, 0x6c, 0x20, 0x60, 0x20, 0x8a, 0x7f, 0x9b, 0x88, 0x9a, 0x7a, 0xa9, 0xbf, - 0x3e, 0x5d, 0x0b, 0x0a, 0xda, 0x8e, 0x7f, 0x25, 0xfd, 0xce, 0xfb, 0x16, 0xd6, 0x5d, 0x72, 0x8a, - 0xfc, 0x85, 0xaf, 0x07, 0x80, 0xfd, 0xf2, 0xa1, 0x82, 0x95, 0xfb, 0x39, 0xe0, 0xb3, 0x49, 0x76, - 0x9d, 0xdb, 0x3d, 0x80, 0xf8, 0x9e, 0x0b, 0x8a, 0xf6, 0xbb, 0xa0, 0x96, 0xc2, 0x48, 0x96, 0xf5, - 0x0e, 0xdc, 0x92, 0x0b, 0x09, 0xe4, 0x55, 0x92, 0xd1, 0xf6, 0xed, 0xba, 0xd9, 0x26, 0x7d, 0x30, - 0xfa, 0xa6, 0xbc, 0xf4, 0x94, 0x5b, 0xfa, 0x42, 0xed, 0xca, 0x5f, 0x34, 0x76, 0xeb, 0x33, 0xbc, - 0x4f, 0xf2, 0xcd, 0xb3, 0x91, 0x22, 0x48, 0x73, 0xdb, 0xbb, 0x46, 0x91, 0x84, 0x8d, 0x34, 0xb5, - 0xac, 0x14, 0xf1, 0x4b, 0x7d, 0xf7, 0xe4, 0xbc, 0x00, 0x22, 0x6b, 0x71, 0x74, 0x71, 0x47, 0xf9, - 0x7e, 0x98, 0xf1, 0xa8, 0xfb, 0x83, 0x87, 0x32, 0x60, 0x8c, 0xe1, 0x40, 0x2f, 0x52, 0xf8, 0xa6, - 0x26, 0xba, 0x34, 0x98, 0x76, 0x12, 0xed, 0x03, 0xf8, 0xe0, 0x7b, 0xc3, 0x7b, 0x37, 0x92, 0xbf, - 0x9d, 0xd2, 0xd8, 0xdf, 0x55, 0x16, 0x16, 0x3c, 0xc6, 0x6e, 0x65, 0xf7, 0x79, 0x9e, 0x13, 0x39, - 0xcd, 0x65, 0x81, 0xc3, 0xff, 0xf3, 0x5b, 0xd5, 0xc7, 0x01, 0xf7, 0x49, 0xef, 0x18, 0x63, 0x56, - 0x60, 0x83, 0xda, 0xba, 0x75, 0xdb, 0xec, 0xfa, 0xa6, 0xa7, 0x6f, 0x35, 0xff, 0x98, 0x9e, 0xfa, - 0x33, 0x0a, 0x0c, 0x64, 0x7a, 0x48, 0x45, 0xbd, 0x11, 0xc3, 0x6d, 0xfd, 0x31, 0x73, 0xd2, 0x6a, - 0x77, 0x8e, 0x8e, 0x60, 0x72, 0xbd, 0x8e, 0xcf, 0xdb, 0xa2, 0x6b, 0x97, 0x10, 0xab, 0x4e, 0x1a, - 0x6f, 0x52, 0x80, 0xbe, 0xe4, 0x86, 0x36, 0x4f, 0x61, 0x7e, 0x4a, 0x64, 0x7e, 0xce, 0x73, 0xbf, - 0xcb, 0x5f, 0x35, 0x42, 0x9d, 0xb8, 0x43, 0x36, 0x2f, 0xd7, 0x9b, 0xdb, 0xad, 0x19, 0xf2, 0x17, - 0x8c, 0xe4, 0x2c, 0x9b, 0x3b, 0xce, 0x35, 0x31, 0xa6, 0x2c, 0x47, 0x7d, 0x8b, 0x27, 0x7d, 0xbe, - 0x4f, 0xad, 0xeb, 0xf4, 0x49, 0x7d, 0x70, 0x25, 0x7a, 0xde, 0x47, 0x3c, 0xdf, 0x54, 0xff, 0x54, - 0x12, 0xef, 0x19, 0x38, 0xdf, 0x89, 0x3b, 0xa9, 0x35, 0x07, 0xd6, 0x3c, 0xf9, 0xe1, 0xfc, 0xac, - 0xcf, 0xd4, 0x6e, 0x15, 0x1f, 0xd0, 0x7d, 0x01, 0x35, 0x43, 0xf6, 0x92, 0xfd, 0x39, 0xc7, 0x36, - 0x78, 0x07, 0x51, 0xea, 0xde, 0x44, 0xaf, 0xa3, 0x6b, 0x04, 0x03, 0x4f, 0x29, 0x16, 0x49, 0x38, - 0x34, 0x31, 0x89, 0xbe, 0x0a, 0x9e, 0xf3, 0x2b, 0xb6, 0x27, 0xb3, 0x96, 0xc4, 0x16, 0xde, 0xde, - 0x15, 0xe7, 0x01, 0x10, 0xf4, 0x4e, 0x25, 0xf1, 0xe8, 0x09, 0x2f, 0xe6, 0x4b, 0x3a, 0xfc, 0xd0, - 0x6b, 0xdd, 0xa2, 0x20, 0xa2, 0xc7, 0x87, 0xc8, 0x62, 0x36, 0xd0, 0xce, 0x54, 0xbd, 0x4b, 0xa6, - 0x17, 0xbd, 0x84, 0x78, 0xdd, 0xba, 0xdb, 0x15, 0x93, 0xdf, 0x65, 0xea, 0xbf, 0x18, 0x26, 0x5a, - 0xe6, 0x59, 0x8b, 0xde, 0xea, 0xcc, 0x09, 0xd7, 0x25, 0x5a, 0xec, 0x04, 0x23, 0x33, 0xb0, 0x54, - 0xbc, 0xb0, 0xc2, 0x32, 0xb6, 0xc5, 0x5a, 0xed, 0x4b, 0x2d, 0x0b, 0x62, 0x83, 0x97, 0x51, 0x63, - 0xd8, 0x41, 0x7f, 0x09, 0x6d, 0xfb, 0xc7, 0xcf, 0xaa, 0xe6, 0x5d, 0x48, 0xaf, 0xd1, 0xc0, 0x12, - 0x8e, 0x5b, 0xf1, 0x7b, 0xfe, 0xf7, 0x6f, 0xea, 0x53, 0x41, 0xdd, 0x55, 0xa1, 0x1c, 0xfe, 0x7a, - 0x45, 0x25, 0x7a, 0xf7, 0x31, 0xe6, 0xfe, 0x39, 0x8d, 0xbf, 0xe5, 0x45, 0x41, 0xa3, 0x17, 0xcf, - 0xdd, 0xfb, 0x14, 0xc1, 0xa7, 0xf1, 0xbc, 0xe3, 0x4f, 0xbf, 0xa3, 0x82, 0xdf, 0x51, 0xfe, 0xe7, - 0x36, 0xc8, 0xa1, 0x55, 0x7c, 0xa8, 0xc9, 0xf4, 0x5e, 0x57, 0x02, 0x3d, 0x55, 0x92, 0x92, 0xc2, - 0xf5, 0x95, 0x50, 0x00, 0x4f, 0x1d, 0x6d, 0x84, 0xe1, 0x5d, 0x41, 0x3e, 0x0c, 0x3a, 0x60, 0x9f, - 0xb4, 0xc3, 0xc2, 0x41, 0x7e, 0x96, 0xcf, 0xa7, 0x5f, 0x94, 0x0b, 0xe7, 0xe7, 0xb8, 0x7c, 0xf6, - 0x41, 0xb7, 0x70, 0xfe, 0x98, 0xcf, 0xa7, 0x9f, 0x53, 0x0b, 0xe7, 0xf7, 0xc2, 0xf9, 0xc5, 0x1a, - 0xfa, 0x06, 0x39, 0xa9, 0x7a, 0x1f, 0xaf, 0xe9, 0xe2, 0x8e, 0x02, 0x44, 0x8d, 0x8e, 0x7c, 0x87, - 0xce, 0x50, 0x4b, 0xe0, 0x67, 0x35, 0x25, 0x22, 0xe9, 0x12, 0x8a, 0x27, 0xfb, 0x0f, 0x80, 0x45, - 0xea, 0x49, 0xc0, 0x36, 0x44, 0xef, 0x93, 0x95, 0xfc, 0x7e, 0x18, 0xe3, 0x82, 0xeb, 0xbb, 0xce, - 0x33, 0x2f, 0x7b, 0xdf, 0x25, 0xdb, 0x7d, 0x0b, 0x79, 0x38, 0x67, 0x7f, 0x46, 0xc9, 0x97, 0xba, - 0xc0, 0xba, 0x65, 0x3d, 0x02, 0xfe, 0x21, 0x4b, 0x3e, 0x6f, 0xf8, 0xe9, 0xc5, 0xf4, 0x02, 0xb2, - 0xf4, 0x17, 0x12, 0xd2, 0x30, 0xad, 0x82, 0x9c, 0x26, 0x7e, 0x60, 0xee, 0x05, 0x02, 0x51, 0x42, - 0xbf, 0x65, 0x09, 0xbb, 0xa1, 0x63, 0xbc, 0xf4, 0x92, 0x7f, 0x45, 0x3f, 0x08, 0x69, 0xd2, 0x43, - 0x44, 0x57, 0x45, 0xfa, 0x63, 0x06, 0xad, 0x42, 0xd9, 0x4b, 0x48, 0x6c, 0xda, 0x76, 0x82, 0xba, - 0x65, 0xfb, 0xfe, 0x98, 0xbf, 0xe8, 0x36, 0xc8, 0x7c, 0x30, 0xbd, 0x8f, 0x06, 0x87, 0xf8, 0xce, - 0x17, 0x2f, 0xdc, 0x9f, 0x77, 0xdc, 0x0f, 0x53, 0xe2, 0x7b, 0xc0, 0xe1, 0x17, 0x57, 0xa9, 0xc5, - 0x25, 0xe9, 0xbb, 0x2b, 0x00, 0x63, 0x20, 0xdf, 0x17, 0x0b, 0x00, 0xbb, 0x4b, 0x79, 0x0e, 0x09, - 0x0b, 0xa1, 0x35, 0x00, 0x10, 0xdf, 0x51, 0xda, 0x07, 0x82, 0x8f, 0x88, 0x81, 0x57, 0x56, 0xd3, - 0xc6, 0xc8, 0x71, 0xa1, 0xfa, 0x00, 0x4d, 0xb0, 0x41, 0x6f, 0x10, 0x49, 0xfc, 0x6f, 0xc1, 0xfd, - 0xb8, 0x8d, 0x98, 0x42, 0x7e, 0xf0, 0xdf, 0xe2, 0xbf, 0x83, 0x35, 0xda, 0x26, 0x8f, 0x36, 0xce, - 0x57, 0xc2, 0x22, 0x5d, 0x4b, 0x99, 0xb8, 0x85, 0xfd, 0x88, 0x1b, 0x31, 0xf7, 0xd7, 0xc5, 0xaf, - 0xee, 0xf0, 0x84, 0x34, 0x75, 0x61, 0x4e, 0xd6, 0x78, 0x2f, 0x7a, 0x81, 0x04, 0x5e, 0x1b, 0x04, - 0x16, 0x70, 0xa8, 0x7a, 0x42, 0x4c, 0xfb, 0x30, 0x26, 0x31, 0x02, 0x9c, 0x17, 0x77, 0xae, 0x1e, - 0x99, 0x5d, 0x3f, 0xc2, 0x9f, 0xda, 0x4d, 0x86, 0xe3, 0x88, 0xf0, 0xc5, 0x98, 0x93, 0x39, 0x1f, - 0xdb, 0x36, 0xb8, 0xa6, 0x1b, 0xa4, 0x21, 0x3f, 0x43, 0x17, 0x6f, 0xc7, 0xbb, 0x52, 0xe8, 0xca, - 0x00, 0x55, 0x81, 0x6e, 0xf8, 0xb5, 0x6c, 0xdd, 0xe7, 0x33, 0xe8, 0x98, 0x09, 0x84, 0x59, 0xa7, - 0x24, 0x1a, 0xe6, 0xa9, 0x74, 0x5d, 0xb8, 0xf9, 0xe8, 0x8d, 0x0b, 0xa8, 0x4c, 0x7a, 0xf7, 0xbd, - 0x5d, 0xff, 0xf2, 0x80, 0x72, 0xbc, 0xf6, 0x18, 0xbd, 0xb0, 0x2d, 0x59, 0xab, 0x3b, 0x1e, 0x67, - 0x55, 0x24, 0x43, 0x52, 0x25, 0x0b, 0xe4, 0xb7, 0xda, 0x02, 0xef, 0xd6, 0x92, 0x49, 0xab, 0xce, - 0xf9, 0xee, 0xa0, 0xd3, 0x79, 0x06, 0x3a, 0xfb, 0x13, 0x23, 0x18, 0x48, 0xcc, 0xf1, 0x5c, 0x32, - 0xea, 0x18, 0x31, 0x47, 0x52, 0xeb, 0x18, 0x0e, 0x87, 0x46, 0x1a, 0x11, 0x30, 0x14, 0x8a, 0x85, - 0xfc, 0x3a, 0xa9, 0x20, 0x6c, 0xae, 0x6f, 0x9f, 0xa2, 0x77, 0x8d, 0x61, 0x02, 0x5d, 0x47, 0x16, - 0xd3, 0xd4, 0xc5, 0xb4, 0x20, 0x68, 0x09, 0xa1, 0x1d, 0x6d, 0x64, 0x5d, 0x0f, 0x44, 0x76, 0x15, - 0xde, 0x66, 0xc2, 0x27, 0xd0, 0xb2, 0x45, 0xf4, 0x9a, 0xc2, 0xf9, 0xb9, 0xe0, 0x66, 0xe2, 0x4d, - 0x99, 0x85, 0xdd, 0xc5, 0x67, 0xf5, 0xb1, 0xd7, 0xf8, 0xac, 0x76, 0x72, 0xfe, 0x05, 0x66, 0xa2, - 0x6e, 0x01, 0x8e, 0x43, 0x08, 0x20, 0x19, 0x0f, 0x9b, 0x14, 0x05, 0x78, 0x15, 0x9e, 0xba, 0xd5, - 0xbb, 0xb1, 0x0c, 0x15, 0x0c, 0x63, 0x68, 0xe0, 0x1f, 0x75, 0x9e, 0xc4, 0x80, 0x8a, 0xf3, 0x7f, - 0x01, 0x59, 0xbb, 0x97, 0x8e, 0x03, 0x1f, 0xbd, 0xaa, 0x10, 0x8d, 0xc1, 0x88, 0xc1, 0xab, 0xd1, - 0xe2, 0x25, 0x61, 0xbc, 0x9e, 0x67, 0x43, 0xa5, 0x81, 0x22, 0x6a, 0xbf, 0xc2, 0xc4, 0xb6, 0xb8, - 0x40, 0xe9, 0xc5, 0x66, 0xe0, 0xcf, 0xb8, 0x2d, 0x4b, 0x4a, 0xe8, 0x86, 0x73, 0x64, 0x25, 0x32, - 0xb9, 0x0a, 0xcf, 0x0d, 0x69, 0x88, 0x72, 0xd7, 0xd2, 0x47, 0x4f, 0xec, 0x50, 0xdf, 0xc2, 0xfb, - 0xcd, 0x78, 0xa4, 0xc6, 0x39, 0x25, 0xd2, 0x3c, 0x10, 0xad, 0xd0, 0xee, 0xa4, 0xa0, 0x7d, 0xe9, - 0xdb, 0xdc, 0xd0, 0x9b, 0x4c, 0xf9, 0xfa, 0x63, 0xa6, 0xcf, 0x69, 0xe8, 0xc6, 0xa4, 0x7f, 0xc2, - 0xe7, 0xea, 0x69, 0x6e, 0xaa, 0xb0, 0xf2, 0xc3, 0xbb, 0xf1, 0xc7, 0x4f, 0x91, 0x13, 0x41, 0x5a, - 0x95, 0xb3, 0xa1, 0x20, 0x80, 0x28, 0x74, 0xe0, 0x33, 0x99, 0x8b, 0xe1, 0x93, 0x3e, 0x5a, 0x38, - 0xac, 0x07, 0x2f, 0xfb, 0xa2, 0x6f, 0xa8, 0x5e, 0xf0, 0x3d, 0x5f, 0x76, 0xbb, 0x3b, 0x74, 0x10, - 0xe2, 0x1e, 0xf7, 0x83, 0x4e, 0xee, 0xab, 0x82, 0xfe, 0x74, 0xb4, 0x11, 0x48, 0x5c, 0xf3, 0xae, - 0xdb, 0x12, 0x71, 0x5d, 0x96, 0x72, 0x55, 0xe6, 0x81, 0x94, 0xab, 0xba, 0xeb, 0x7b, 0xaf, 0x75, - 0x99, 0xcf, 0x89, 0x9e, 0x5f, 0x12, 0xfb, 0xc9, 0x87, 0x32, 0x37, 0x5a, 0x5e, 0x7e, 0xc1, 0xcd, - 0x2f, 0x44, 0xf2, 0xf3, 0x6e, 0x7e, 0xd1, 0xcd, 0x2f, 0x86, 0xf3, 0x9b, 0x5e, 0x7e, 0x96, 0xe5, - 0x97, 0xf9, 0xce, 0xe9, 0x51, 0x84, 0x4b, 0x82, 0xe2, 0x36, 0x3f, 0x02, 0x3d, 0x74, 0xab, 0x58, - 0xc4, 0x90, 0x42, 0xf4, 0x5a, 0x20, 0xa6, 0x6f, 0x83, 0x6c, 0x67, 0x56, 0xd9, 0xf3, 0xe2, 0xa6, - 0xce, 0x42, 0xd5, 0xd3, 0x58, 0xba, 0x8c, 0xe7, 0x00, 0xf5, 0xe9, 0xf8, 0x07, 0x24, 0x3a, 0x64, - 0x22, 0x20, 0x75, 0x62, 0x89, 0xa4, 0xaf, 0xcb, 0xa2, 0x17, 0x9b, 0x9b, 0xf8, 0x17, 0x64, 0x56, - 0xaf, 0x99, 0x24, 0x34, 0xa9, 0xb0, 0x44, 0x97, 0x1d, 0xac, 0x38, 0x3d, 0xc2, 0x43, 0xf2, 0x5c, - 0x79, 0x5d, 0xa1, 0x91, 0xa3, 0xe8, 0xc9, 0x04, 0x9e, 0xd0, 0xf0, 0xc7, 0x48, 0xd6, 0xd0, 0xb9, - 0xe9, 0x6b, 0x89, 0x6f, 0xb0, 0x5c, 0x61, 0x90, 0xf3, 0x6f, 0xf4, 0x73, 0x56, 0xc9, 0x9a, 0x18, - 0x76, 0xd2, 0xa2, 0x77, 0x75, 0x3d, 0x6f, 0xc4, 0x5f, 0x71, 0x37, 0x4c, 0xfd, 0xfb, 0x51, 0xb4, - 0x99, 0xd0, 0x77, 0xa5, 0xdd, 0x0f, 0xc0, 0xbb, 0xf7, 0xc3, 0xbf, 0xd1, 0xd0, 0xe5, 0x99, 0x8c, - 0xd7, 0x21, 0xf5, 0x87, 0xe5, 0xc8, 0xb3, 0xed, 0x51, 0x20, 0x9b, 0x12, 0x25, 0xe9, 0xde, 0xa8, - 0xc1, 0xf2, 0x63, 0xb5, 0xfb, 0x3d, 0x97, 0x97, 0x37, 0xb3, 0x79, 0x19, 0x07, 0x43, 0xb8, 0x8b, - 0x55, 0xd2, 0x2f, 0xa8, 0x41, 0xc9, 0x30, 0x9b, 0xdb, 0x74, 0x07, 0x0c, 0x55, 0xd1, 0x89, 0x41, - 0x65, 0x7a, 0x14, 0xad, 0xbe, 0x2d, 0x9e, 0x67, 0x1a, 0x62, 0x95, 0x3e, 0xcf, 0xe9, 0xc8, 0x40, - 0xa0, 0x4a, 0xa5, 0xe6, 0x04, 0x9d, 0xed, 0xbf, 0xcb, 0xdb, 0x36, 0xc8, 0x82, 0xa1, 0xcf, 0x64, - 0xe0, 0x2d, 0x5d, 0xd8, 0x95, 0xd0, 0xdc, 0xd7, 0x4d, 0x8b, 0x55, 0x99, 0x7a, 0xef, 0x25, 0xb0, - 0xd8, 0xb9, 0x21, 0x18, 0x78, 0x9d, 0x38, 0xf8, 0x56, 0x82, 0xd0, 0x43, 0x7e, 0x96, 0x46, 0x41, - 0x1c, 0x95, 0x3a, 0xdf, 0xcb, 0x59, 0xe0, 0x3c, 0x39, 0x9b, 0xcc, 0x09, 0xd5, 0xaf, 0x54, 0x45, - 0x7f, 0x4e, 0x3a, 0x9b, 0x73, 0x56, 0x52, 0x67, 0xf7, 0x76, 0x22, 0xde, 0x9b, 0x7a, 0x48, 0x6a, - 0xb2, 0xc3, 0xf7, 0x0a, 0xdd, 0x8f, 0x25, 0xc4, 0x5e, 0x28, 0x64, 0x9f, 0x96, 0xf8, 0xd4, 0x7d, - 0x42, 0xff, 0xe2, 0xfa, 0x48, 0xeb, 0xd2, 0x90, 0xf8, 0xd8, 0xb6, 0x80, 0x8d, 0x0b, 0x28, 0x53, - 0xb0, 0x18, 0x22, 0xb1, 0x17, 0x0d, 0xe3, 0x3e, 0x92, 0x23, 0x85, 0xd7, 0x87, 0x27, 0xb1, 0x49, - 0xe4, 0x83, 0x3b, 0x95, 0x0b, 0x41, 0x70, 0xa8, 0x21, 0x87, 0xc9, 0x13, 0x2c, 0x86, 0x14, 0x71, - 0xa5, 0x85, 0x5a, 0x10, 0xc2, 0x0b, 0x51, 0x8a, 0xfd, 0x7c, 0xd6, 0x7d, 0x15, 0x6f, 0xad, 0xe1, - 0xd2, 0x04, 0xdd, 0x67, 0x69, 0x80, 0x62, 0x87, 0x3a, 0xc3, 0x7a, 0x21, 0x6b, 0xee, 0x90, 0xf3, - 0xd2, 0x20, 0xb3, 0x7d, 0x31, 0xe9, 0xad, 0x74, 0x92, 0x1e, 0x28, 0x76, 0xc3, 0x71, 0x2c, 0x15, - 0xc8, 0x10, 0x72, 0x87, 0xca, 0x54, 0x4c, 0x02, 0xb7, 0x50, 0xbc, 0x24, 0x7a, 0x03, 0x84, 0x19, - 0x0d, 0xaa, 0xb0, 0xa5, 0x7b, 0x11, 0x48, 0x78, 0xdf, 0x5f, 0x9a, 0x99, 0x81, 0x25, 0xa7, 0x7f, - 0xa7, 0x81, 0x2f, 0x60, 0xa1, 0xe5, 0x98, 0xf4, 0xa2, 0xd5, 0x17, 0xa2, 0x13, 0x57, 0x58, 0x70, - 0x62, 0x76, 0xa4, 0xdd, 0xee, 0x27, 0x29, 0xbd, 0xfc, 0xcb, 0x4b, 0xe8, 0x6c, 0x94, 0xdc, 0x94, - 0xe4, 0xaf, 0xda, 0xb2, 0x40, 0x78, 0xda, 0x9c, 0x19, 0xd4, 0x42, 0x68, 0x5b, 0x86, 0x41, 0x3f, - 0x72, 0x1d, 0xfb, 0xf6, 0x23, 0x43, 0x9c, 0xe2, 0x6a, 0x71, 0xbe, 0x0c, 0xef, 0x59, 0x45, 0x82, - 0x40, 0xaf, 0x5c, 0x54, 0x23, 0x1a, 0xa8, 0x35, 0xcd, 0x3e, 0x8e, 0xf2, 0x77, 0xbb, 0x8c, 0x0b, - 0x31, 0xc4, 0x7d, 0x9c, 0xd2, 0x0d, 0x9e, 0x13, 0x21, 0x1c, 0x34, 0x07, 0x72, 0xd1, 0xf9, 0x98, - 0xf9, 0x8a, 0xa0, 0x85, 0xcb, 0xa3, 0x9f, 0x48, 0xdc, 0x98, 0x48, 0x29, 0x77, 0x54, 0xa0, 0x54, - 0xc7, 0x96, 0x08, 0x6c, 0x60, 0x8b, 0x27, 0x76, 0x4e, 0x95, 0x46, 0x9b, 0xb1, 0x37, 0x3c, 0x9b, - 0x68, 0xa8, 0xe9, 0xc7, 0x5f, 0x28, 0x2d, 0x86, 0xda, 0xc2, 0x24, 0xa3, 0x1e, 0x01, 0x00, 0x04, - 0xb2, 0x48, 0x87, 0x20, 0x98, 0xf2, 0x29, 0x46, 0x0f, 0x92, 0x3a, 0x4c, 0x02, 0x1c, 0xbe, 0xb4, - 0x1e, 0x0f, 0x61, 0x9d, 0x77, 0x83, 0xd7, 0x5d, 0x16, 0x51, 0x52, 0xb5, 0xcf, 0x70, 0xcf, 0x70, - 0xb6, 0xea, 0xd4, 0xbf, 0x34, 0x89, 0xfc, 0x4b, 0x73, 0xaf, 0xeb, 0xcb, 0x92, 0x96, 0x66, 0x5f, - 0x6f, 0x80, 0x5f, 0x55, 0xc7, 0xd8, 0xd4, 0x6c, 0x76, 0x59, 0x76, 0x16, 0xb4, 0x65, 0xcc, 0xa6, - 0xbf, 0x2c, 0xdb, 0xa0, 0x0f, 0xcc, 0x53, 0xd5, 0xa0, 0x99, 0x9e, 0x05, 0x70, 0x23, 0x2b, 0xa9, - 0x41, 0x66, 0x8a, 0xbe, 0x71, 0xd9, 0x52, 0x67, 0x7d, 0xbd, 0xb3, 0xc4, 0xe2, 0xd9, 0x5d, 0x5f, - 0xef, 0x2e, 0xc9, 0x02, 0xa1, 0xd3, 0x5a, 0x6a, 0x8d, 0x62, 0x42, 0x71, 0xa4, 0xe1, 0x88, 0xb1, - 0x31, 0xd2, 0x76, 0x24, 0x37, 0xd2, 0x3c, 0xd7, 0x33, 0x9d, 0x39, 0x4e, 0x5a, 0xd6, 0x3c, 0x7a, - 0xe0, 0xc4, 0x64, 0x65, 0x29, 0x05, 0x18, 0x40, 0x01, 0x35, 0xfd, 0xcf, 0xba, 0xba, 0x61, 0xd0, - 0x86, 0xcc, 0xd0, 0xc4, 0xe1, 0xb1, 0x0c, 0x53, 0x8c, 0x81, 0x44, 0xf0, 0x1c, 0x08, 0x8a, 0xa1, - 0xe1, 0xd2, 0x5c, 0x5f, 0x37, 0x97, 0x0f, 0x96, 0x0b, 0x23, 0xea, 0x9b, 0x1b, 0xc2, 0x3a, 0xdc, - 0x2f, 0xaa, 0xc3, 0xfd, 0xe0, 0x04, 0xd9, 0xe0, 0xa3, 0x1c, 0x73, 0xf1, 0x27, 0xeb, 0xd2, 0x61, - 0x72, 0x83, 0xbd, 0x44, 0x03, 0xa4, 0xdb, 0xaf, 0xbb, 0xd9, 0xdc, 0x90, 0xa9, 0x23, 0xe9, 0x21, - 0xd0, 0xa9, 0x13, 0x27, 0x34, 0xa4, 0xd3, 0xf0, 0x9e, 0xbe, 0xc9, 0xeb, 0xff, 0xfd, 0x3f, 0xfe, - 0x2f, 0xb4, 0x78, 0x6d, 0xeb, 0x4b, 0xc1, 0xaf, 0xea, 0xcb, 0x2e, 0x63, 0x31, 0x9b, 0xa2, 0x89, - 0x17, 0x92, 0x57, 0xdc, 0xea, 0xf2, 0x00, 0x70, 0xcc, 0x5f, 0x21, 0x33, 0x3b, 0x65, 0x67, 0x26, - 0xc8, 0xda, 0xec, 0x56, 0x72, 0x92, 0x5a, 0xe4, 0xf4, 0xad, 0xec, 0xb6, 0x59, 0xc7, 0xb8, 0x4b, - 0x20, 0xc7, 0xd9, 0x62, 0x15, 0x3d, 0x05, 0xb1, 0xfd, 0xba, 0x98, 0xa5, 0x4e, 0x1b, 0xb0, 0x3a, - 0x61, 0x2b, 0xf9, 0x12, 0x1a, 0x59, 0xdf, 0x82, 0x96, 0x19, 0x67, 0xef, 0xc7, 0x2f, 0x79, 0x5a, - 0xc2, 0x23, 0x83, 0xd1, 0x12, 0xc6, 0x61, 0x76, 0xfc, 0x32, 0x68, 0x05, 0xc3, 0x8b, 0x03, 0xfd, - 0xba, 0x7b, 0x5f, 0xac, 0xc7, 0xd8, 0x7f, 0x87, 0xc0, 0x8e, 0xa6, 0x67, 0x12, 0xfd, 0xd4, 0x08, - 0x14, 0x55, 0xf7, 0x23, 0x03, 0x3d, 0x7a, 0x98, 0xb0, 0x95, 0xfd, 0xfd, 0x7b, 0xb4, 0x25, 0xe3, - 0xb3, 0x09, 0x32, 0x84, 0x00, 0x1a, 0x44, 0x6f, 0x2e, 0x8c, 0x55, 0xcb, 0x19, 0x29, 0x5a, 0x12, - 0xd4, 0x27, 0x6a, 0xd2, 0xf7, 0xd6, 0x32, 0x2b, 0x25, 0x0a, 0x3f, 0xf0, 0x6e, 0xa9, 0xf9, 0x33, - 0x82, 0x29, 0xa0, 0xc3, 0x50, 0x84, 0x22, 0x33, 0xca, 0x21, 0xf1, 0x76, 0x29, 0x93, 0x21, 0x6b, - 0xc4, 0x0b, 0x2d, 0x87, 0xf7, 0x50, 0xc5, 0x64, 0xd8, 0x7c, 0x44, 0x92, 0xb1, 0x71, 0xbb, 0x3c, - 0x7f, 0xc8, 0x24, 0x57, 0x1b, 0x2f, 0xcf, 0xff, 0xd5, 0xda, 0x30, 0x5f, 0xa1, 0x2f, 0xc3, 0xe0, - 0xed, 0xff, 0x70, 0x7c, 0xa7, 0x50, 0xf6, 0xdc, 0xf8, 0x45, 0x23, 0x59, 0x3a, 0x51, 0x62, 0x09, - 0x9a, 0x94, 0x12, 0xcb, 0xea, 0xbe, 0x6a, 0xed, 0x5f, 0x34, 0xd2, 0xe4, 0xf2, 0xca, 0xf3, 0x28, - 0x9a, 0x30, 0xae, 0xc1, 0x8c, 0xbb, 0xb5, 0x79, 0x69, 0x4c, 0x88, 0xe5, 0xd9, 0xbd, 0x71, 0xaf, - 0xaa, 0xe3, 0x67, 0x78, 0xb6, 0xbd, 0x10, 0x7a, 0x18, 0xd2, 0x8b, 0xbf, 0xe3, 0xa9, 0x85, 0x8a, - 0xea, 0x5a, 0x63, 0x59, 0xc9, 0xd6, 0x9b, 0xde, 0x09, 0x95, 0xf5, 0xbe, 0xd8, 0x13, 0xaa, 0xc0, - 0x60, 0x6a, 0xf9, 0xeb, 0xda, 0x0f, 0xbf, 0xd0, 0x0a, 0x3e, 0xb9, 0x83, 0x06, 0x96, 0x04, 0xf7, - 0x09, 0x9e, 0xc5, 0x43, 0x31, 0x77, 0xff, 0xdc, 0xc1, 0x33, 0xa5, 0xa5, 0xb9, 0x2d, 0x93, 0x20, - 0x42, 0x96, 0xe6, 0x1f, 0x79, 0x5f, 0x9d, 0x5f, 0x51, 0xa6, 0x99, 0x5d, 0x95, 0x99, 0x5b, 0x95, - 0x99, 0xc7, 0x4c, 0xef, 0x1b, 0x0a, 0x89, 0x25, 0xa5, 0xae, 0x57, 0xb4, 0x70, 0xb0, 0x22, 0x6f, - 0x87, 0x06, 0x34, 0x08, 0x3e, 0xcc, 0xb0, 0xa4, 0xd8, 0xbd, 0x98, 0xe4, 0x3f, 0x94, 0xc0, 0xc5, - 0xa7, 0x67, 0xe6, 0xc4, 0x09, 0x5e, 0x56, 0x59, 0x38, 0xc2, 0xf2, 0x9a, 0x8d, 0x1e, 0x60, 0xb1, - 0x2a, 0x6d, 0x45, 0x8b, 0xab, 0xd1, 0x6c, 0xde, 0xc4, 0x96, 0x1f, 0x90, 0xe9, 0x64, 0xa1, 0x3c, - 0xc1, 0xd8, 0xff, 0xb1, 0xc5, 0xd9, 0x07, 0x81, 0xe2, 0x3a, 0xa0, 0x78, 0x04, 0xc1, 0x8b, 0x16, - 0x88, 0xef, 0x6a, 0xd9, 0x68, 0xd8, 0x67, 0x2c, 0x56, 0xd6, 0xb5, 0xff, 0x8d, 0xba, 0xe3, 0x15, - 0x75, 0x63, 0x2b, 0xbc, 0xac, 0xee, 0x6c, 0x05, 0x36, 0xad, 0x7e, 0x7b, 0x65, 0x5d, 0x82, 0xdf, - 0x1d, 0x88, 0xad, 0xf9, 0xda, 0xb1, 0x37, 0x26, 0x2b, 0xea, 0xd1, 0x0f, 0x2f, 0x45, 0x6b, 0x72, - 0xd7, 0xf8, 0xdd, 0x47, 0x1a, 0xf3, 0xd2, 0xb2, 0x13, 0x0b, 0xf2, 0x6a, 0x74, 0xfd, 0x86, 0xa2, - 0xdc, 0x05, 0x76, 0x6b, 0x69, 0x71, 0xe3, 0xfe, 0xc5, 0xc2, 0x96, 0x32, 0x7b, 0x90, 0x67, 0xa5, - 0xfe, 0xf9, 0xc3, 0x37, 0x16, 0x11, 0xb6, 0xf7, 0xdb, 0x74, 0xcb, 0xe6, 0x8f, 0xd7, 0x99, 0x05, - 0x71, 0x51, 0x0e, 0xe0, 0x98, 0x33, 0x7e, 0x5b, 0x68, 0x25, 0xfb, 0x96, 0x9c, 0x0f, 0x85, 0x10, - 0xd6, 0x3f, 0x32, 0xdd, 0xcf, 0x95, 0x5c, 0xce, 0x9b, 0x39, 0x71, 0x3a, 0x6a, 0xf3, 0xc4, 0xfb, - 0xd0, 0x28, 0x4a, 0x91, 0xef, 0xa5, 0xa4, 0x16, 0xd6, 0x19, 0x22, 0x32, 0x1f, 0xd9, 0xca, 0xad, - 0xaf, 0xd3, 0x28, 0x21, 0x2b, 0x8a, 0xe4, 0xb1, 0x48, 0xee, 0xe7, 0x6a, 0xd1, 0x53, 0x08, 0x5d, - 0xa2, 0xd4, 0x92, 0x62, 0x96, 0xda, 0x8c, 0x3c, 0xc3, 0x29, 0x96, 0x44, 0xca, 0xf8, 0xe0, 0x80, - 0x74, 0x91, 0xa3, 0xf3, 0x71, 0xe9, 0x3c, 0x51, 0x4f, 0x42, 0x4d, 0x77, 0xc5, 0xbc, 0xf7, 0xa6, - 0xfc, 0x94, 0x47, 0xe5, 0x3e, 0x0c, 0x95, 0xe0, 0x2c, 0xcc, 0xbd, 0xbd, 0xd0, 0x64, 0x68, 0xee, - 0x5d, 0x82, 0x59, 0x35, 0xf9, 0x5e, 0xf0, 0x53, 0xf6, 0x91, 0x47, 0x16, 0xd8, 0xc8, 0xbf, 0x1a, - 0xff, 0x37, 0x84, 0x53, 0x3d, 0x39, 0xd3, 0x57, 0xec, 0xeb, 0x18, 0x22, 0x83, 0x1e, 0x23, 0x5f, - 0x2a, 0x16, 0x8c, 0xda, 0xc1, 0x85, 0x14, 0xb4, 0xe2, 0xa9, 0xcd, 0x24, 0xe6, 0x64, 0x84, 0x3f, - 0x10, 0x61, 0x56, 0x7f, 0x77, 0xce, 0xa8, 0x82, 0x18, 0xcc, 0x99, 0x61, 0x3a, 0xe1, 0x28, 0x33, - 0xfc, 0x97, 0x8e, 0x20, 0x93, 0x3b, 0x6e, 0xad, 0x11, 0xee, 0x2c, 0x84, 0x9e, 0x6d, 0x82, 0xbc, - 0xe7, 0x7e, 0x0f, 0xef, 0xf7, 0xef, 0xac, 0xff, 0x0c, 0x19, 0x5f, 0xf0, 0x50, 0x14, 0x03, 0xef, - 0xe6, 0x7f, 0x06, 0x32, 0xb3, 0x4c, 0xcf, 0x88, 0x7f, 0xff, 0x66, 0x6e, 0x1a, 0x98, 0xc7, 0xfe, - 0x06, 0x25, 0x60, 0x7b, 0xdc, 0xaa, 0xcb, 0xd1, 0xd4, 0x2c, 0x95, 0xb4, 0x97, 0x90, 0x55, 0x95, - 0x2c, 0x8f, 0xb6, 0xe0, 0x6a, 0xfe, 0xfa, 0xe7, 0xe4, 0x7e, 0xa3, 0x1e, 0x71, 0xf5, 0x59, 0x0c, - 0x97, 0xdc, 0x55, 0xc7, 0x3f, 0xa2, 0xf7, 0xbb, 0xbc, 0x80, 0xc9, 0x1c, 0x92, 0x8d, 0xa4, 0xb2, - 0xa8, 0x29, 0x2c, 0x87, 0xb3, 0xba, 0x64, 0x68, 0xb5, 0xbf, 0x02, 0x91, 0x77, 0xc7, 0xe9, 0x43, - 0x70, 0xfe, 0xcf, 0xff, 0x1b, 0xc1, 0x59, 0x5f, 0x0f, 0xa5, 0xfd, 0x3f, 0x7f, 0x13, 0xc5, 0x9c, - 0xec, 0xe8, 0x6e, 0x10, 0xd7, 0x18, 0x02, 0x90, 0x59, 0x87, 0xd9, 0xfe, 0x43, 0xbf, 0x1f, 0xba, - 0x18, 0xec, 0xc4, 0x8b, 0x49, 0x42, 0x1d, 0x3e, 0x40, 0xbe, 0x40, 0xbe, 0xe1, 0x5e, 0x7b, 0x01, - 0x48, 0x44, 0x5a, 0x10, 0xad, 0x69, 0x8f, 0x09, 0xd9, 0x9c, 0x26, 0x69, 0x40, 0x01, 0x3f, 0x05, - 0xbf, 0x5d, 0x9a, 0x14, 0xfd, 0x15, 0xad, 0xa9, 0xe6, 0x36, 0xfd, 0x8b, 0xa1, 0x68, 0xfd, 0x73, - 0x7e, 0x74, 0x40, 0xb2, 0x41, 0x57, 0xc0, 0x2b, 0x24, 0x82, 0x98, 0xb2, 0x5d, 0x37, 0x1c, 0x2d, - 0x7c, 0x2f, 0xfc, 0x17, 0xfb, 0xfa, 0x2b, 0xfd, 0x88, 0x26, 0x51, 0x69, 0x7c, 0x43, 0x84, 0x02, - 0x63, 0x46, 0xa6, 0xb5, 0xe1, 0x9c, 0x9e, 0x91, 0xe0, 0xe1, 0x80, 0x6b, 0x97, 0x0c, 0x3e, 0x8b, - 0xb9, 0x28, 0xa0, 0xb0, 0xf1, 0xd0, 0xc1, 0x44, 0x76, 0x45, 0x2e, 0x0e, 0xe7, 0xd0, 0xbc, 0x64, - 0xc8, 0x41, 0x25, 0xc0, 0x13, 0xb0, 0xd8, 0xf7, 0x05, 0x61, 0x61, 0xd0, 0x43, 0x70, 0xdd, 0x0f, - 0x0e, 0xe8, 0x07, 0xf8, 0xc5, 0x13, 0xe6, 0xad, 0xc0, 0x31, 0x87, 0x06, 0x7f, 0x62, 0x13, 0x0c, - 0xe3, 0xa7, 0x75, 0xc2, 0x57, 0x62, 0x40, 0x87, 0x75, 0x62, 0x92, 0x6b, 0xd3, 0xba, 0xbd, 0x55, - 0xd8, 0x5c, 0x5f, 0xb7, 0xbf, 0x17, 0xcb, 0xbf, 0x7f, 0xdb, 0x5b, 0xa5, 0x02, 0x3e, 0x57, 0xb2, - 0xf8, 0x5c, 0x29, 0xe1, 0x73, 0x36, 0x97, 0xc7, 0x97, 0x5c, 0xb1, 0xb8, 0x2d, 0xd6, 0x01, 0xfe, - 0x2d, 0x51, 0x7a, 0xab, 0xeb, 0xb4, 0x92, 0x4e, 0x2b, 0xe9, 0xb4, 0x92, 0x4e, 0x2b, 0xe9, 0xb4, - 0x92, 0xce, 0x2a, 0xe9, 0x7c, 0x25, 0x37, 0x10, 0x6a, 0x22, 0x41, 0xa1, 0xf3, 0x82, 0xae, 0x6e, - 0x8b, 0xdf, 0xc5, 0xea, 0x34, 0x99, 0x72, 0x87, 0x19, 0xb1, 0xfc, 0xd3, 0xf3, 0xcc, 0x70, 0xd9, - 0xb7, 0x64, 0x8a, 0x8d, 0x83, 0x05, 0x42, 0x94, 0xa5, 0x99, 0xce, 0x9c, 0x35, 0xaa, 0x5f, 0x64, - 0xde, 0x72, 0x3a, 0x54, 0x5e, 0xc8, 0x7d, 0x2b, 0x41, 0xb1, 0x3a, 0xb1, 0x7f, 0xff, 0xf6, 0x8f, - 0xcb, 0x27, 0xf6, 0x77, 0x99, 0xb7, 0x9e, 0x12, 0x0c, 0x31, 0xba, 0xed, 0x5b, 0x8c, 0x27, 0x18, - 0x8c, 0xc6, 0x22, 0xf4, 0x16, 0xc6, 0xff, 0x57, 0xdc, 0x95, 0x3f, 0xb7, 0x6d, 0x64, 0xe9, 0xdf, - 0xf7, 0xaf, 0xa0, 0x90, 0xc4, 0x02, 0x22, 0x48, 0x06, 0x29, 0xcb, 0xe3, 0x80, 0x82, 0x58, 0x8e, - 0x8f, 0x1d, 0xd5, 0x38, 0x8e, 0x36, 0xf2, 0x24, 0xe3, 0x72, 0xa9, 0x56, 0x24, 0xd5, 0x94, 0x58, - 0x86, 0x00, 0x06, 0x80, 0x0e, 0x87, 0xe2, 0xff, 0xbe, 0xef, 0xe8, 0x13, 0x00, 0x0f, 0xc5, 0x99, - 0xd9, 0xaa, 0xc4, 0x22, 0x1a, 0xdd, 0x8d, 0xbe, 0xfb, 0xbd, 0xd7, 0xaf, 0xbf, 0xcf, 0x27, 0xca, - 0x01, 0x2f, 0xf4, 0xee, 0x08, 0xa6, 0xf8, 0x0e, 0x49, 0x48, 0xbc, 0x9d, 0x1a, 0xcd, 0x83, 0xa1, - 0x39, 0xa0, 0xc4, 0x7d, 0xf8, 0x1a, 0x31, 0x85, 0xfc, 0x26, 0x46, 0xa7, 0xd0, 0xe1, 0x82, 0x08, - 0xf3, 0xf6, 0x46, 0xd3, 0x6c, 0x58, 0x7c, 0xf9, 0x40, 0x07, 0x59, 0x84, 0x9b, 0x3f, 0xba, 0x81, - 0x45, 0xbc, 0xf0, 0xc2, 0xbb, 0x72, 0x0f, 0x41, 0x0d, 0xca, 0x12, 0x0d, 0x93, 0x68, 0x0d, 0xc6, - 0xb5, 0x58, 0x72, 0xa8, 0x69, 0x0b, 0x39, 0xcc, 0x58, 0x3a, 0x7f, 0xfd, 0x91, 0x12, 0x69, 0x8e, - 0x0d, 0x0b, 0xb6, 0x8c, 0x13, 0x04, 0x7c, 0x94, 0x4c, 0xe8, 0x0d, 0xc1, 0xdc, 0xc1, 0xa5, 0xb6, - 0xe0, 0xe8, 0x82, 0xd0, 0x7a, 0x60, 0x0e, 0x10, 0x8b, 0x85, 0x54, 0xb1, 0x9c, 0x84, 0x75, 0x8b, - 0xb6, 0x82, 0x93, 0xdf, 0x14, 0x72, 0x3c, 0xd5, 0xf3, 0x11, 0x36, 0x07, 0xc4, 0x30, 0x28, 0x07, - 0xbe, 0x01, 0x64, 0x82, 0xc9, 0xc7, 0x14, 0xad, 0x4f, 0x9e, 0x38, 0x00, 0x34, 0x65, 0x10, 0xc4, - 0x16, 0xee, 0x81, 0x12, 0xcf, 0x08, 0x05, 0x74, 0x20, 0xff, 0xc6, 0x55, 0xdf, 0x59, 0x5a, 0xca, - 0x30, 0x43, 0xe0, 0xfc, 0xe1, 0xc5, 0x29, 0xa1, 0x1c, 0x65, 0xb0, 0x06, 0x2d, 0xb8, 0x61, 0x89, - 0x24, 0x9a, 0x9a, 0xf5, 0xd1, 0x70, 0xe9, 0x4c, 0x5a, 0xba, 0xb3, 0x73, 0x78, 0xe0, 0x60, 0x54, - 0xf2, 0xb8, 0x0a, 0xbb, 0x07, 0x68, 0xdf, 0xbf, 0x63, 0x0a, 0x15, 0xf9, 0x31, 0x44, 0x8b, 0xa7, - 0x6f, 0x29, 0xba, 0xd3, 0x42, 0xfc, 0x5e, 0xbe, 0x13, 0x97, 0xc3, 0x14, 0xa4, 0x0d, 0xc7, 0x97, - 0x41, 0x95, 0x54, 0xe1, 0xb9, 0xd3, 0xfe, 0x2b, 0x07, 0x25, 0x1f, 0xbb, 0x8b, 0xbd, 0xf2, 0x66, - 0x3c, 0x86, 0x61, 0xa1, 0x42, 0xa3, 0x3e, 0x11, 0xdd, 0xa2, 0x07, 0x74, 0x58, 0xd7, 0x5e, 0xa5, - 0xa9, 0x52, 0xe0, 0x2d, 0x7d, 0xe2, 0xc1, 0x15, 0x7b, 0x59, 0x8a, 0x11, 0x99, 0xb4, 0x96, 0x9e, - 0x2e, 0x6e, 0x0a, 0x49, 0x5d, 0x4b, 0x8f, 0x15, 0x47, 0x7d, 0x3b, 0x44, 0x04, 0x7b, 0x0c, 0x98, - 0xc0, 0x2f, 0xc3, 0x8f, 0x2b, 0xf6, 0x6e, 0x2e, 0x66, 0x78, 0xb9, 0x2e, 0xbb, 0xa8, 0x51, 0xd6, - 0x82, 0x12, 0x93, 0xd2, 0xbe, 0x30, 0x2b, 0x63, 0xfc, 0x8d, 0x0c, 0xb3, 0x72, 0x11, 0x27, 0xca, - 0x6b, 0x2e, 0x5c, 0x55, 0xe9, 0x52, 0x55, 0xc5, 0xd3, 0x6e, 0x14, 0xb6, 0x60, 0x5d, 0xc8, 0xc1, - 0x11, 0xc1, 0xca, 0x14, 0x49, 0xf2, 0x43, 0xad, 0x35, 0x26, 0x86, 0x78, 0x57, 0xb3, 0xeb, 0xd6, - 0x1c, 0xe3, 0x7c, 0x03, 0x72, 0x61, 0xbb, 0xc8, 0x41, 0xdb, 0x45, 0x64, 0xe9, 0xa2, 0xd7, 0x9f, - 0xaa, 0x33, 0xe4, 0x92, 0x31, 0x77, 0x58, 0x69, 0x07, 0x40, 0x83, 0x5e, 0x97, 0xd1, 0x8d, 0x29, - 0x06, 0x88, 0x4f, 0x20, 0x73, 0x1d, 0xf2, 0xf6, 0x50, 0xe1, 0x52, 0xd9, 0x93, 0x62, 0x94, 0x43, - 0x57, 0x47, 0x86, 0xcd, 0xf1, 0x27, 0x2b, 0xe3, 0x33, 0x59, 0xee, 0x87, 0x64, 0x6b, 0xcb, 0xef, - 0x3e, 0x49, 0x8d, 0x36, 0x4d, 0x21, 0x3d, 0x19, 0x02, 0x35, 0xa1, 0xe7, 0x67, 0x4f, 0x34, 0x74, - 0x86, 0x6f, 0x3e, 0x5e, 0xe5, 0xb3, 0x5d, 0xeb, 0x69, 0x58, 0x54, 0xc1, 0xf7, 0xee, 0xeb, 0x8f, - 0x03, 0xf7, 0xb1, 0x16, 0xfd, 0x63, 0xdc, 0x05, 0x41, 0x55, 0x36, 0x93, 0xfc, 0x7b, 0x38, 0x1c, - 0x0c, 0x63, 0xf9, 0x5b, 0x9f, 0x76, 0x60, 0xa2, 0x92, 0x4e, 0x7d, 0xd0, 0x18, 0x88, 0xfe, 0x76, - 0x6d, 0xf5, 0x1b, 0x5a, 0x15, 0x6b, 0xd4, 0xab, 0x56, 0x2d, 0x55, 0xab, 0x05, 0x8e, 0xe0, 0xa1, - 0xda, 0xa5, 0xac, 0x93, 0xb4, 0xf7, 0x79, 0x47, 0x75, 0xb9, 0x3c, 0x3c, 0x33, 0x06, 0x25, 0x78, - 0x24, 0xb0, 0xe9, 0x4b, 0x6b, 0x7f, 0x6e, 0xf3, 0xe8, 0xd9, 0x83, 0xc1, 0x03, 0xc3, 0x09, 0xba, - 0xff, 0xcd, 0x50, 0x1e, 0x99, 0xad, 0x10, 0x3f, 0x14, 0x7a, 0x53, 0x9b, 0x82, 0x64, 0xfc, 0x60, - 0x72, 0xf9, 0xcd, 0xdd, 0x6e, 0x5f, 0x1c, 0xa1, 0x57, 0xcc, 0xee, 0x6e, 0x90, 0x3b, 0x7e, 0x22, - 0xc9, 0x10, 0xad, 0x1c, 0x10, 0x44, 0xa4, 0x50, 0x8e, 0x9f, 0x88, 0x79, 0xd5, 0xad, 0xbd, 0x1a, - 0x99, 0x57, 0xbd, 0xb3, 0xd0, 0xd7, 0xa3, 0xe1, 0x61, 0xab, 0x41, 0x84, 0x49, 0xd8, 0x51, 0x76, - 0xda, 0x3b, 0x93, 0x16, 0x59, 0xa4, 0x24, 0xd9, 0x68, 0x4e, 0x20, 0xe2, 0xe4, 0x46, 0xad, 0xe9, - 0x4c, 0x90, 0x4b, 0x5a, 0x99, 0x6f, 0x21, 0xcd, 0xb8, 0x42, 0xd1, 0x0d, 0xfe, 0x90, 0xa0, 0x6c, - 0x9b, 0x6e, 0x5e, 0xea, 0x59, 0x48, 0xef, 0x83, 0xb0, 0x69, 0xd9, 0xd2, 0xef, 0xcb, 0xfb, 0xb0, - 0xdd, 0xae, 0xa5, 0x63, 0x4c, 0x9d, 0x18, 0x68, 0xd5, 0x32, 0x99, 0x77, 0x07, 0xf8, 0x4f, 0x1c, - 0x85, 0x35, 0xd3, 0x96, 0x89, 0xd1, 0xc3, 0x18, 0xbd, 0x5a, 0x8c, 0x7d, 0x3b, 0xc6, 0x3e, 0xc6, - 0xd8, 0x57, 0x31, 0x48, 0x51, 0xfb, 0xb9, 0x6b, 0x3b, 0x94, 0x6f, 0x0d, 0xf7, 0xf2, 0xae, 0xfd, - 0xb6, 0x57, 0x7f, 0xdb, 0xb3, 0xdf, 0xee, 0xd7, 0xdf, 0xee, 0xc3, 0x94, 0x27, 0x3e, 0x05, 0x02, - 0x39, 0x94, 0xbf, 0x79, 0x33, 0x9d, 0xa2, 0xc3, 0xa0, 0x72, 0xdd, 0x50, 0x2f, 0xd8, 0x87, 0x22, - 0x42, 0xf0, 0x18, 0x73, 0x22, 0x7c, 0x8d, 0x27, 0x39, 0x9d, 0x89, 0x46, 0x39, 0xda, 0x72, 0x90, - 0x66, 0xba, 0x04, 0x51, 0x83, 0x20, 0x68, 0x22, 0xcb, 0x6f, 0x2e, 0xaf, 0x3a, 0xe5, 0x0c, 0x04, - 0x09, 0x44, 0x99, 0x2e, 0x11, 0xdf, 0x9b, 0x21, 0x0e, 0x6b, 0x49, 0x08, 0xb9, 0x46, 0xe2, 0xdf, - 0xe3, 0x17, 0xe4, 0x11, 0xba, 0x13, 0x87, 0x10, 0x6c, 0x7e, 0x9a, 0x32, 0x79, 0xfd, 0xb4, 0x60, - 0x76, 0x1d, 0x37, 0xca, 0x0f, 0x18, 0xe5, 0xa5, 0x55, 0xb2, 0x0e, 0x55, 0xa3, 0x03, 0x03, 0xae, - 0x93, 0x8f, 0x61, 0x15, 0xc7, 0xd3, 0xfb, 0x85, 0x35, 0x37, 0x69, 0x6f, 0x27, 0x04, 0x25, 0x8a, - 0xb8, 0xe3, 0xc5, 0xf0, 0x30, 0xa5, 0x23, 0x68, 0x35, 0x91, 0x2d, 0x0a, 0xf3, 0x21, 0x48, 0x1a, - 0xa9, 0xcd, 0x70, 0x3e, 0xdc, 0x9b, 0xdc, 0x87, 0x35, 0xbf, 0x3c, 0x77, 0x76, 0x3b, 0xcc, 0xb9, - 0x0d, 0xa5, 0x55, 0x1e, 0x4c, 0x6e, 0xea, 0x1d, 0xec, 0x9e, 0x58, 0xd6, 0xbd, 0x84, 0xc3, 0xd2, - 0x04, 0x91, 0xeb, 0x09, 0x32, 0x53, 0x7c, 0x3a, 0x8b, 0x4b, 0xdb, 0x37, 0x98, 0xfc, 0x8b, 0x33, - 0x99, 0x82, 0x7d, 0x76, 0x11, 0xbb, 0x12, 0xe3, 0xe1, 0x5f, 0xcb, 0x37, 0x38, 0x1c, 0xea, 0x78, - 0x87, 0x3d, 0x15, 0xb3, 0x2b, 0x63, 0x76, 0x9d, 0x98, 0xb9, 0x89, 0xb9, 0xaf, 0x62, 0xf6, 0x64, - 0x4c, 0xd7, 0xdf, 0x58, 0xfb, 0x54, 0xc3, 0x7a, 0x03, 0xe2, 0x76, 0xbf, 0x44, 0xf7, 0x3b, 0x1e, - 0x7c, 0xd6, 0x9c, 0x20, 0xbd, 0xa4, 0xb0, 0x43, 0x88, 0x71, 0x14, 0x83, 0xfb, 0x5b, 0x15, 0x0a, - 0xe4, 0xbe, 0x00, 0xf1, 0xfa, 0xc5, 0xa0, 0x17, 0x1f, 0x80, 0xe6, 0x9c, 0xaa, 0x16, 0x2a, 0xd9, - 0x89, 0x39, 0x85, 0x15, 0x7e, 0xe0, 0x3b, 0xa1, 0x5b, 0x2a, 0xb8, 0xb0, 0xb4, 0x1c, 0x0c, 0x88, - 0xed, 0x80, 0x88, 0xb8, 0x3c, 0xb8, 0x97, 0x60, 0xd4, 0xe2, 0xe2, 0x10, 0x77, 0xed, 0xb0, 0xa9, - 0x5e, 0x12, 0x62, 0x8f, 0xbd, 0x3e, 0xbd, 0x1d, 0xbf, 0xdc, 0x85, 0x8d, 0x74, 0xba, 0x02, 0xdd, - 0x70, 0xba, 0xc4, 0xf4, 0x03, 0x5d, 0xaf, 0x0b, 0x79, 0x20, 0x15, 0xc3, 0xc9, 0x7d, 0x3e, 0xab, - 0x5a, 0x3d, 0xef, 0x51, 0x3a, 0xb1, 0x5a, 0x90, 0xfd, 0x18, 0xf7, 0xc9, 0x81, 0xf1, 0x60, 0x47, - 0x1c, 0xa6, 0xda, 0x43, 0x92, 0xfc, 0xb8, 0xd3, 0x4f, 0x10, 0x78, 0x26, 0x21, 0x1d, 0x31, 0xcb, - 0x1d, 0xb1, 0xee, 0x2a, 0x06, 0xc4, 0x92, 0xcd, 0x2c, 0x6c, 0x5d, 0x10, 0xda, 0x4e, 0x67, 0xe7, - 0xfd, 0x4c, 0xd7, 0x0a, 0xbc, 0x98, 0x9f, 0x41, 0x40, 0x1b, 0x95, 0x55, 0xe1, 0x47, 0x61, 0xf7, - 0x39, 0xd4, 0x73, 0xc9, 0xb7, 0xec, 0x2a, 0x9b, 0x7b, 0x03, 0xcd, 0x8a, 0x52, 0x3c, 0x55, 0x4b, - 0xad, 0x1a, 0x6a, 0x47, 0x57, 0x73, 0xce, 0x56, 0x77, 0xd1, 0xb0, 0xc6, 0x49, 0x89, 0x84, 0x08, - 0x8c, 0x0e, 0x18, 0xe0, 0xd5, 0x87, 0x83, 0xbe, 0xf2, 0x05, 0xae, 0x19, 0x3b, 0xbe, 0x61, 0x83, - 0x5a, 0xc7, 0x36, 0x74, 0xb1, 0x75, 0xcc, 0xb1, 0x64, 0x81, 0x46, 0x83, 0xfc, 0xc1, 0x0b, 0x28, - 0x06, 0xee, 0x46, 0xb8, 0x25, 0x14, 0xb0, 0x58, 0xfb, 0xe3, 0xf0, 0x6f, 0x07, 0xd2, 0x7a, 0x36, - 0x43, 0x27, 0xaf, 0x4b, 0xfc, 0xe7, 0x06, 0x04, 0xb9, 0x49, 0x82, 0x3b, 0x53, 0xad, 0x97, 0x5a, - 0xf6, 0x61, 0xc7, 0xff, 0x14, 0xb3, 0xb9, 0x35, 0xbb, 0x35, 0x34, 0x5f, 0x9f, 0xdc, 0xbb, 0xd4, - 0xc4, 0xe7, 0x3e, 0xc5, 0x79, 0x4d, 0xeb, 0xc5, 0xed, 0xf2, 0x8e, 0xbc, 0x75, 0xac, 0x8e, 0x50, - 0x1e, 0x1a, 0xf9, 0x9c, 0x12, 0xbf, 0x72, 0x45, 0xbf, 0x4d, 0xbf, 0xa1, 0x8f, 0x89, 0xd5, 0xd7, - 0x57, 0xe1, 0x15, 0xc7, 0xe6, 0x23, 0xc5, 0x4b, 0xbc, 0xd9, 0x9a, 0x78, 0x3b, 0xb4, 0xa2, 0x5c, - 0x32, 0xcd, 0x0c, 0x77, 0xe1, 0xad, 0x3b, 0x6b, 0xc4, 0xc0, 0x7b, 0x7b, 0x4f, 0x73, 0x05, 0x7e, - 0xfd, 0x78, 0x89, 0xb3, 0xa3, 0x24, 0x70, 0xa5, 0xc9, 0x16, 0xc2, 0x8e, 0x5b, 0xfb, 0x36, 0x1e, - 0x99, 0xa2, 0xa3, 0x15, 0x66, 0x52, 0x0d, 0x9c, 0xaa, 0xd8, 0x47, 0xbd, 0xb5, 0x7a, 0x74, 0x43, - 0xfb, 0x83, 0x1e, 0x4c, 0x3a, 0xb1, 0xd3, 0x45, 0xdc, 0xd0, 0xc7, 0x34, 0x45, 0x5b, 0x16, 0xe1, - 0xf2, 0x32, 0x06, 0x0b, 0xd5, 0x21, 0xef, 0x1a, 0xa0, 0xb8, 0x33, 0xea, 0xf9, 0x6b, 0x6d, 0x93, - 0x47, 0xe6, 0xa2, 0x91, 0xb1, 0xd0, 0xf3, 0x69, 0xa6, 0x3e, 0xb3, 0x42, 0xaa, 0xac, 0xbc, 0x76, - 0xd1, 0x22, 0xa7, 0x7b, 0x16, 0x7c, 0xe6, 0x8b, 0xbf, 0x03, 0x86, 0xb9, 0xbe, 0xae, 0xd9, 0x4f, - 0xbc, 0x69, 0x86, 0xce, 0x3f, 0xbb, 0x6c, 0x38, 0x09, 0xed, 0x5c, 0x30, 0x95, 0x31, 0x56, 0x25, - 0x5e, 0xa0, 0x0e, 0x4c, 0x8f, 0x93, 0xc6, 0xab, 0x3e, 0x1d, 0x38, 0x83, 0x1c, 0x0c, 0x5d, 0xce, - 0x3f, 0xa7, 0x19, 0xfa, 0x9a, 0x87, 0x7a, 0x52, 0x51, 0x12, 0x39, 0x2c, 0x8e, 0xb1, 0x6d, 0x83, - 0xa0, 0x8f, 0x61, 0x89, 0xf5, 0x02, 0xf6, 0x5d, 0x48, 0x7f, 0x1c, 0x2c, 0x9c, 0xca, 0x6c, 0xc9, - 0xda, 0x0c, 0x46, 0x56, 0x03, 0x61, 0x40, 0x6c, 0x07, 0x6c, 0x37, 0x80, 0xe4, 0x44, 0x2a, 0xef, - 0xdc, 0xda, 0x10, 0x19, 0xc4, 0x7a, 0x2d, 0x6f, 0x48, 0x8e, 0xf6, 0x19, 0x05, 0x9a, 0xf4, 0xd2, - 0x8e, 0x3c, 0xd0, 0xd8, 0xe6, 0xa1, 0xf3, 0xef, 0xc8, 0x9a, 0x04, 0x0f, 0xbc, 0xae, 0xb8, 0x1d, - 0x36, 0xba, 0x81, 0x0d, 0x56, 0xd8, 0xba, 0x96, 0x42, 0xdb, 0xed, 0x5b, 0xfa, 0xac, 0xb9, 0x36, - 0x66, 0x91, 0x5c, 0x3c, 0x4e, 0xe3, 0xfe, 0x02, 0x1a, 0xf7, 0x16, 0x0c, 0x45, 0xfd, 0x89, 0x60, - 0x6e, 0x59, 0x29, 0x1e, 0x1e, 0x6c, 0x03, 0x46, 0x83, 0x53, 0xeb, 0x0e, 0xb6, 0xb9, 0x3b, 0x34, - 0xd3, 0x83, 0xb6, 0xef, 0x6b, 0xb5, 0x3c, 0xac, 0x33, 0x04, 0x2c, 0xc2, 0x7d, 0xb1, 0x1f, 0x28, - 0x26, 0x77, 0x8e, 0x92, 0xc8, 0xb4, 0xa8, 0x94, 0x7f, 0x21, 0xad, 0x3c, 0x49, 0x12, 0x6d, 0xbb, - 0xd9, 0xfb, 0xf9, 0xe4, 0xcd, 0x7b, 0x90, 0x27, 0x60, 0x66, 0xcf, 0xf2, 0x12, 0xf1, 0x07, 0xd0, - 0x77, 0x90, 0x14, 0x74, 0x74, 0xe9, 0xba, 0x45, 0xa2, 0x4a, 0xc6, 0xf6, 0xb4, 0x89, 0xb3, 0xd0, - 0x7c, 0xb2, 0x97, 0xe5, 0x77, 0x7e, 0xf0, 0x14, 0xf1, 0x6e, 0xa5, 0x2e, 0xa9, 0x15, 0xe3, 0x3e, - 0xed, 0x7d, 0xb0, 0x92, 0x4e, 0x2f, 0x60, 0x37, 0xe5, 0x1f, 0x8a, 0x1c, 0xd2, 0x56, 0xa5, 0x15, - 0x5d, 0xad, 0x1e, 0xa7, 0xdd, 0xe8, 0x7b, 0xe5, 0x82, 0xd3, 0x1f, 0x6e, 0x81, 0x66, 0x4d, 0x57, - 0x14, 0x4c, 0x82, 0x64, 0x18, 0x2c, 0x7c, 0x69, 0x16, 0x32, 0x50, 0xdb, 0xc2, 0xa2, 0xc9, 0xd9, - 0x7f, 0x16, 0x91, 0x92, 0x8b, 0xac, 0x74, 0x95, 0xde, 0x7e, 0x91, 0x38, 0x4b, 0x69, 0x82, 0x30, - 0xa8, 0x0d, 0x5e, 0x89, 0x56, 0x0f, 0x11, 0xb6, 0x44, 0x25, 0x5c, 0x94, 0x83, 0xbb, 0x92, 0x4c, - 0x03, 0x3e, 0xf4, 0xcb, 0xf6, 0xdc, 0xbb, 0xf5, 0x62, 0x84, 0x76, 0x5d, 0x6c, 0x07, 0x71, 0x9b, - 0xfb, 0x65, 0x39, 0xb5, 0x7c, 0x2f, 0xb3, 0x10, 0x09, 0x60, 0x61, 0xaf, 0x8a, 0xe7, 0xc8, 0xd5, - 0x86, 0x1e, 0xd8, 0xbb, 0xe8, 0xa7, 0x0a, 0x2d, 0x8b, 0x44, 0x97, 0x53, 0xb6, 0xa9, 0x51, 0xc2, - 0x7e, 0x07, 0x2d, 0x95, 0x68, 0x73, 0xf8, 0xe7, 0x87, 0xb7, 0xbb, 0x2f, 0xbc, 0x45, 0x38, 0xca, - 0x2f, 0xbe, 0xc4, 0x95, 0xed, 0xb9, 0xf9, 0x08, 0x13, 0xd7, 0x23, 0x48, 0x23, 0xb0, 0x7f, 0x36, - 0x30, 0x88, 0xe1, 0x60, 0x7a, 0xa4, 0x4d, 0xec, 0x12, 0x46, 0xb9, 0x50, 0xe7, 0x2d, 0xca, 0xc2, - 0x43, 0x5c, 0x04, 0x64, 0x22, 0x33, 0x70, 0xa2, 0x64, 0xfc, 0x32, 0xd6, 0xb2, 0xaa, 0x85, 0x7b, - 0xa4, 0x5a, 0x62, 0x41, 0xab, 0x50, 0x7c, 0xd7, 0x16, 0x26, 0x69, 0x39, 0x93, 0x7f, 0x63, 0x21, - 0x21, 0xdb, 0xe9, 0x9a, 0x1b, 0x5f, 0x3a, 0x62, 0x28, 0x76, 0xdc, 0x04, 0x5a, 0xb8, 0x2b, 0x25, - 0x61, 0x82, 0x9c, 0x65, 0x6c, 0xd6, 0x5a, 0x3f, 0x63, 0x1e, 0x1e, 0x94, 0xf9, 0x15, 0xd9, 0x2d, - 0x7b, 0x07, 0x41, 0xcd, 0x14, 0xc6, 0x08, 0xee, 0x96, 0x26, 0x82, 0x05, 0x81, 0x75, 0xa4, 0x9c, - 0xc1, 0x12, 0x26, 0x3c, 0x49, 0xb3, 0xb1, 0xca, 0x43, 0xb6, 0xee, 0x68, 0x49, 0x0e, 0x29, 0xfa, - 0xd4, 0x70, 0x9e, 0x67, 0x31, 0x99, 0xcb, 0x90, 0x39, 0x21, 0x5b, 0x90, 0xe9, 0xcc, 0x1e, 0xe2, - 0xc6, 0xec, 0x41, 0x06, 0x7a, 0xe7, 0xb1, 0x14, 0x97, 0xac, 0x47, 0xb3, 0xf9, 0x1e, 0x4d, 0x50, - 0x64, 0xa4, 0x40, 0x2a, 0x10, 0x36, 0xa1, 0x44, 0x7c, 0x07, 0xb3, 0x9e, 0x2a, 0x9c, 0x14, 0x7f, - 0xc4, 0x5b, 0x5d, 0xe2, 0xf0, 0xb4, 0x16, 0xc4, 0x86, 0x4f, 0xe8, 0xfb, 0xd4, 0xa1, 0x2c, 0xf4, - 0xd1, 0x60, 0xb7, 0x05, 0xff, 0x04, 0x83, 0x73, 0x6c, 0x7f, 0x98, 0xf1, 0x0c, 0x75, 0xd0, 0xf9, - 0x88, 0xc4, 0x4e, 0x4c, 0x61, 0x48, 0xbc, 0x4a, 0xa4, 0x92, 0x7d, 0x3b, 0x27, 0x2b, 0xde, 0x51, - 0x64, 0x81, 0x24, 0x2f, 0x28, 0x14, 0xa9, 0x29, 0x21, 0x10, 0xcf, 0x56, 0x60, 0x32, 0x4d, 0x40, - 0x58, 0x93, 0x2f, 0x5e, 0xdf, 0x14, 0x0b, 0x04, 0xa3, 0x20, 0x67, 0xdc, 0xf3, 0xd8, 0xe3, 0xaf, - 0x5c, 0x30, 0xa4, 0x02, 0xc2, 0x02, 0xa3, 0xbb, 0xb6, 0x73, 0xf7, 0x37, 0x4b, 0x63, 0x6c, 0x42, - 0x28, 0xd4, 0x62, 0xd1, 0x28, 0x3f, 0xfa, 0xe8, 0xb8, 0x35, 0xd0, 0x66, 0xc3, 0x2d, 0xf5, 0x2b, - 0x00, 0x69, 0x99, 0x1c, 0xc3, 0xa9, 0xf8, 0x44, 0x0c, 0x8b, 0xdc, 0x4e, 0x99, 0xa8, 0xee, 0xf2, - 0xe2, 0x33, 0x57, 0x07, 0x16, 0xc8, 0x0e, 0xc6, 0x47, 0xe5, 0x98, 0xd8, 0xa2, 0x60, 0x9b, 0x41, - 0x8a, 0xb9, 0x0f, 0xf8, 0x9b, 0xab, 0x4d, 0xfc, 0x51, 0xeb, 0xf3, 0xe9, 0xa4, 0x79, 0x76, 0x09, - 0x91, 0x30, 0xb7, 0x3d, 0x4f, 0x39, 0xab, 0xcc, 0xd1, 0x84, 0x19, 0xcf, 0x71, 0xa1, 0x8a, 0x55, - 0xb9, 0x16, 0x8b, 0xbe, 0x85, 0x57, 0x4f, 0x9d, 0x4c, 0x86, 0xce, 0x02, 0xd1, 0xeb, 0x75, 0xe1, - 0xd7, 0x74, 0x20, 0xc2, 0xe5, 0xdf, 0x4e, 0xc5, 0x1d, 0x1e, 0x2e, 0xc8, 0x09, 0xc8, 0xc7, 0x97, - 0xf4, 0x96, 0xe6, 0x20, 0x4e, 0x4d, 0x72, 0xfa, 0x76, 0x5e, 0x49, 0x27, 0x75, 0x78, 0xf7, 0xee, - 0x16, 0x87, 0xe6, 0xbb, 0x5b, 0x79, 0x02, 0xb1, 0x7e, 0x46, 0x29, 0x82, 0x91, 0x54, 0x7e, 0x1b, - 0xf6, 0x20, 0xcc, 0x57, 0x30, 0x0d, 0x87, 0xd7, 0x7b, 0xed, 0x51, 0xae, 0xca, 0xfc, 0xf3, 0x39, - 0xbd, 0x25, 0xec, 0x77, 0xeb, 0x54, 0xeb, 0x70, 0x3a, 0x41, 0xd5, 0xbb, 0x63, 0x6e, 0xf7, 0x20, - 0x31, 0xb9, 0x37, 0x1c, 0xc1, 0x84, 0x8f, 0x47, 0xe9, 0x30, 0xa3, 0xab, 0x32, 0x1c, 0x09, 0xaf, - 0x04, 0xb0, 0x0f, 0xad, 0xcc, 0xa7, 0x7e, 0x54, 0x87, 0xdf, 0xda, 0xe8, 0x44, 0x8e, 0xf3, 0xa9, - 0xea, 0x47, 0x63, 0x9c, 0xbe, 0xe9, 0x61, 0x82, 0x11, 0xa1, 0x54, 0xf4, 0x5a, 0xef, 0x22, 0xde, - 0x4e, 0x05, 0x02, 0xeb, 0xc0, 0x83, 0x6d, 0x87, 0x70, 0x2f, 0x82, 0xd8, 0x29, 0xb5, 0xe3, 0x3f, - 0x56, 0x38, 0x5a, 0x95, 0xf2, 0x94, 0x56, 0xcc, 0xae, 0xe1, 0x16, 0x37, 0x92, 0xa0, 0xe6, 0xa6, - 0x2d, 0x0c, 0xf6, 0xaf, 0x14, 0x36, 0x30, 0xc2, 0x28, 0x87, 0x1d, 0x2c, 0x2c, 0xa7, 0x7f, 0x08, - 0xbf, 0xd1, 0xe5, 0xdc, 0xa9, 0x73, 0xdd, 0xa9, 0xcd, 0xfe, 0x74, 0x3a, 0xda, 0x8c, 0x10, 0x24, - 0x1a, 0xc0, 0xc4, 0xd8, 0xdd, 0xc7, 0x7c, 0xb3, 0xd3, 0x61, 0xff, 0xe5, 0xc2, 0xe3, 0x32, 0xd2, - 0xda, 0xca, 0x98, 0x64, 0xa3, 0x76, 0xb6, 0x1b, 0xe1, 0xb8, 0xe6, 0x98, 0xc7, 0x99, 0x18, 0xff, - 0xb9, 0xc6, 0x82, 0x24, 0xef, 0x4e, 0xa8, 0xc1, 0x5c, 0x1b, 0xc7, 0x2b, 0xeb, 0x46, 0x69, 0xb1, - 0x72, 0xf4, 0x23, 0x60, 0x32, 0x66, 0xd5, 0x2e, 0x4c, 0x6f, 0xe1, 0x10, 0x3c, 0xd8, 0x95, 0xa3, - 0x68, 0x8f, 0xae, 0x9d, 0x22, 0x8c, 0xb0, 0x6b, 0x28, 0x73, 0x6a, 0xab, 0x22, 0x6e, 0x44, 0x88, - 0x0b, 0xa2, 0xb6, 0x86, 0x28, 0xc4, 0x2d, 0xac, 0x74, 0x20, 0x3a, 0xc8, 0xbc, 0x8a, 0x1a, 0x04, - 0xce, 0xc6, 0xac, 0xcd, 0xa9, 0xb5, 0xdc, 0xed, 0x1a, 0x6f, 0xf7, 0xb0, 0x1b, 0xb5, 0xb8, 0x3b, - 0x2f, 0x49, 0x55, 0xda, 0xa9, 0xd0, 0x23, 0x1a, 0x11, 0x8b, 0x7d, 0x2e, 0xc7, 0xf5, 0x1d, 0x68, - 0x71, 0x99, 0x85, 0x1f, 0x81, 0xe2, 0x33, 0x7a, 0xb9, 0x68, 0x7f, 0xf2, 0xc6, 0x57, 0x04, 0x82, - 0x3b, 0x2d, 0x6c, 0xf4, 0x08, 0x6c, 0xda, 0x71, 0x91, 0xa7, 0x29, 0x7c, 0x3b, 0xff, 0x15, 0x3b, - 0x66, 0x3e, 0x12, 0x57, 0xc3, 0xdb, 0x69, 0x5e, 0xc4, 0x9a, 0x85, 0x98, 0x66, 0x1a, 0x3c, 0x12, - 0x3b, 0xf3, 0x42, 0xb9, 0xa7, 0xb4, 0x83, 0x7e, 0x6a, 0x44, 0xcf, 0xa3, 0x26, 0x56, 0xde, 0x51, - 0x0b, 0x32, 0x9e, 0xc6, 0xda, 0x29, 0xd7, 0x82, 0xe1, 0xed, 0xf7, 0x0c, 0x56, 0x84, 0x83, 0x73, - 0xf7, 0x1e, 0x64, 0xac, 0x52, 0x02, 0x56, 0x62, 0x46, 0x0d, 0xa8, 0x3b, 0x03, 0x72, 0x87, 0xc8, - 0x54, 0x44, 0x78, 0x90, 0x78, 0xfb, 0x2f, 0xbe, 0x63, 0xa6, 0xa0, 0x9f, 0x56, 0xe1, 0xdd, 0xb5, - 0x27, 0xf8, 0x4b, 0xa1, 0xef, 0x36, 0x05, 0x1f, 0xc3, 0xaa, 0xad, 0xc3, 0xb6, 0xc3, 0xc2, 0x5d, - 0xdf, 0xed, 0x76, 0x63, 0x73, 0xa9, 0xc0, 0x06, 0x90, 0x13, 0xcb, 0x50, 0xa3, 0xca, 0xe5, 0xa8, - 0x51, 0xe5, 0x62, 0x43, 0x0c, 0x32, 0x8c, 0xba, 0x0e, 0xda, 0xce, 0x81, 0xb3, 0xab, 0xbe, 0xbe, - 0x34, 0x8f, 0x01, 0xb0, 0x2a, 0x5b, 0xa9, 0x23, 0x46, 0xd5, 0x55, 0x03, 0xc1, 0xaa, 0xdc, 0x00, - 0xc1, 0xaa, 0x2a, 0x28, 0x01, 0x5f, 0x1b, 0x51, 0x59, 0x1a, 0x48, 0x71, 0x32, 0xa5, 0xe0, 0xbd, - 0xd2, 0x16, 0x88, 0xba, 0x6f, 0xe7, 0x6b, 0x11, 0xea, 0x16, 0xed, 0x5f, 0x7a, 0xbd, 0xe6, 0x4b, - 0xeb, 0x46, 0xcf, 0xc7, 0x35, 0xdd, 0x83, 0xc0, 0x75, 0xa6, 0x87, 0xa2, 0x7f, 0xf7, 0x60, 0x59, - 0x5f, 0x1c, 0x7b, 0xb8, 0xd0, 0xd8, 0xbe, 0x8a, 0xbb, 0x5f, 0x37, 0x6a, 0x6c, 0xf8, 0x31, 0x07, - 0x7b, 0xcc, 0x29, 0x1a, 0x01, 0x8f, 0x7d, 0x3b, 0xd7, 0xb3, 0x48, 0x2c, 0xe8, 0x22, 0x84, 0xbc, - 0xcb, 0x6b, 0x25, 0x1b, 0x7b, 0xcb, 0x06, 0xe1, 0xcc, 0x61, 0x3a, 0x51, 0xe8, 0x4d, 0xc8, 0x1c, - 0x8a, 0x4e, 0x19, 0x69, 0x2b, 0x7a, 0x94, 0xc2, 0x54, 0xae, 0x2d, 0xd1, 0x16, 0x6b, 0xa8, 0xed, - 0x08, 0xa0, 0xf2, 0x14, 0xe4, 0x06, 0xb0, 0x34, 0x4d, 0x63, 0xa1, 0x56, 0x25, 0x2c, 0x91, 0xc8, - 0x16, 0x4a, 0x09, 0xcb, 0x2c, 0x5f, 0xe0, 0xae, 0x71, 0xda, 0x46, 0xfd, 0x3f, 0x8f, 0xb8, 0x4c, - 0x70, 0x4e, 0x0d, 0xb4, 0x65, 0x3c, 0x91, 0x65, 0xf6, 0x80, 0xaf, 0x82, 0x56, 0xa6, 0x72, 0x7b, - 0x16, 0xb7, 0xae, 0xde, 0xa7, 0x91, 0x17, 0x77, 0x35, 0x7a, 0x57, 0xf7, 0xc5, 0x90, 0xe6, 0xf4, - 0xcb, 0x8b, 0x0b, 0xb5, 0x69, 0x34, 0x7b, 0x75, 0x29, 0xc8, 0x71, 0x1b, 0x9a, 0xf1, 0x32, 0x28, - 0xe3, 0xaf, 0x84, 0x2d, 0x7e, 0xb3, 0xff, 0xec, 0xc7, 0x06, 0xc1, 0xc3, 0x9f, 0x44, 0x21, 0x4e, - 0x11, 0xaa, 0xf7, 0x2b, 0x01, 0x88, 0x29, 0x8f, 0xaf, 0xc4, 0x1e, 0xa6, 0x3c, 0xbe, 0x12, 0x76, - 0x98, 0xf2, 0x58, 0x87, 0x38, 0x2c, 0x27, 0x92, 0x2b, 0xc9, 0x9d, 0xc0, 0x10, 0x4c, 0xb5, 0xdb, - 0x8c, 0xba, 0x6b, 0xde, 0x6f, 0x63, 0x63, 0xcc, 0x96, 0x10, 0x31, 0xda, 0x5c, 0x8b, 0x1d, 0x6d, - 0x63, 0x23, 0x5f, 0xe8, 0x6c, 0xc0, 0x7f, 0x62, 0xc3, 0x46, 0x8e, 0x6e, 0xd4, 0xfd, 0x9a, 0x57, - 0x1e, 0x81, 0xfa, 0xe0, 0x0b, 0xe2, 0x9f, 0x19, 0x82, 0x56, 0x51, 0x49, 0x67, 0x6a, 0xc3, 0x2e, - 0xee, 0x3c, 0xee, 0x21, 0xce, 0x95, 0x5f, 0xb6, 0xa1, 0x5c, 0x61, 0x36, 0x04, 0xb4, 0x80, 0x3f, - 0xe8, 0x04, 0xc1, 0xc5, 0x71, 0x47, 0x08, 0x09, 0x03, 0x68, 0x65, 0x0e, 0x66, 0xed, 0x45, 0x64, - 0x02, 0x85, 0xbd, 0x3a, 0x49, 0xdf, 0xd4, 0xdd, 0xe5, 0x53, 0xa1, 0x4e, 0x53, 0x2a, 0xc3, 0x25, - 0x5a, 0x26, 0x0e, 0x16, 0xf8, 0x64, 0x5a, 0x94, 0xb0, 0xbc, 0x7b, 0x47, 0x8a, 0x6c, 0xb1, 0x23, - 0x9b, 0x8b, 0x9b, 0x7f, 0x9b, 0x9c, 0x73, 0xb2, 0xc3, 0x59, 0xaa, 0xd9, 0xd2, 0x95, 0x37, 0x65, - 0x3f, 0xdb, 0xd9, 0x09, 0xa0, 0x4e, 0xdc, 0x2d, 0xb0, 0x4c, 0x17, 0x5f, 0xa0, 0x63, 0x90, 0xe9, - 0x72, 0xc7, 0xfd, 0xc4, 0x55, 0xf1, 0x87, 0x82, 0x74, 0xd9, 0x0e, 0x2b, 0xfb, 0x0a, 0xb7, 0x34, - 0x8c, 0x56, 0x4b, 0xaf, 0x2c, 0xd3, 0x22, 0x9c, 0xee, 0x22, 0x5c, 0x61, 0xd0, 0x4f, 0xf5, 0x81, - 0x2c, 0xde, 0xde, 0x24, 0xcb, 0x7c, 0x8b, 0x9d, 0x5a, 0xd1, 0x83, 0x19, 0x78, 0x3c, 0x9f, 0xd8, - 0x11, 0x83, 0x15, 0xbc, 0x3e, 0x94, 0xbd, 0xcd, 0xb0, 0xd3, 0x19, 0x06, 0x99, 0x3e, 0x41, 0x81, - 0xbe, 0xc2, 0x13, 0x21, 0xc3, 0x9a, 0x63, 0xbd, 0x08, 0x90, 0x9c, 0x4e, 0x7a, 0x30, 0x38, 0x2f, - 0x62, 0xbb, 0xc5, 0x3e, 0x99, 0x57, 0x74, 0x30, 0x71, 0x66, 0x73, 0xf0, 0xb0, 0x3d, 0xd7, 0xb6, - 0x68, 0xc1, 0xda, 0x7d, 0x92, 0xb2, 0x4b, 0xa8, 0xd3, 0xee, 0x78, 0x94, 0x3c, 0x16, 0xa0, 0xef, - 0x77, 0xc3, 0x28, 0xc4, 0xdb, 0xe5, 0xfa, 0xe5, 0xc5, 0x4d, 0xe1, 0xbe, 0x75, 0x5e, 0x7d, 0xaa, - 0xce, 0xec, 0xc8, 0xc6, 0x5e, 0xbc, 0x2c, 0x8d, 0x89, 0x41, 0x49, 0x9d, 0x11, 0x66, 0x79, 0xf7, - 0x8a, 0xb4, 0xb5, 0x98, 0xe6, 0xd8, 0xdc, 0x6f, 0x2d, 0x7e, 0xd8, 0x5d, 0x56, 0x74, 0xf7, 0x4d, - 0x4b, 0x39, 0x31, 0x82, 0x53, 0x1a, 0x1b, 0x63, 0x2d, 0x15, 0x27, 0x25, 0x03, 0xa0, 0xb8, 0x05, - 0x42, 0xcc, 0x34, 0xdd, 0xde, 0x65, 0xe3, 0xa2, 0x36, 0xa4, 0x7b, 0x7d, 0x53, 0xa8, 0x84, 0x65, - 0xc3, 0x2e, 0xef, 0xd7, 0xdb, 0xd2, 0xb6, 0xf4, 0x77, 0xa3, 0xef, 0x4b, 0xdd, 0x83, 0x76, 0x96, - 0x1f, 0x36, 0xcb, 0xd1, 0x69, 0xe9, 0x4d, 0x32, 0xfe, 0xc5, 0x4c, 0x72, 0x9d, 0x4b, 0x1f, 0xbd, - 0x95, 0xf8, 0xae, 0x5f, 0x8a, 0x0a, 0x42, 0x51, 0x5d, 0x5a, 0x70, 0x8d, 0xa1, 0xfd, 0x66, 0xe6, - 0xbc, 0x1a, 0xf8, 0x78, 0x70, 0x88, 0x90, 0x9e, 0xa0, 0x8e, 0xca, 0x35, 0x14, 0xd7, 0x4b, 0x27, - 0x4d, 0xde, 0x3d, 0x0f, 0xda, 0x67, 0x5a, 0x6c, 0x92, 0xbb, 0xca, 0xaf, 0xfa, 0x98, 0xb9, 0x29, - 0x4a, 0xb9, 0xb6, 0xc6, 0x82, 0xc9, 0xf7, 0x26, 0xbb, 0x30, 0x31, 0xd7, 0x7c, 0x99, 0x4d, 0x46, - 0x35, 0x3f, 0xdf, 0x13, 0x17, 0x7a, 0x44, 0xae, 0x78, 0x48, 0x33, 0x25, 0x4c, 0x6b, 0xa3, 0xd5, - 0x76, 0x56, 0xc6, 0xe8, 0xb2, 0x05, 0xfd, 0x08, 0x7f, 0x23, 0x04, 0xfa, 0xd2, 0xed, 0x1f, 0x7f, - 0xaa, 0x8a, 0xb3, 0x90, 0xab, 0x13, 0x47, 0x61, 0x11, 0xa3, 0xdd, 0x37, 0xbb, 0x88, 0x23, 0xad, - 0x2d, 0x9b, 0x5e, 0xe3, 0x58, 0x83, 0x7a, 0x00, 0x48, 0x5b, 0xa5, 0xc5, 0x01, 0x03, 0xa3, 0x80, - 0xd5, 0x35, 0xb9, 0x27, 0x82, 0x70, 0x04, 0x2a, 0xf4, 0x2e, 0x88, 0x1f, 0x71, 0x37, 0x9a, 0xdd, - 0xf7, 0x35, 0x63, 0xd2, 0x2a, 0x6e, 0x9b, 0xd3, 0xab, 0x9b, 0xc9, 0x04, 0xd4, 0x60, 0xa2, 0x99, - 0x5d, 0x2a, 0xac, 0x99, 0x7e, 0xb7, 0x05, 0x36, 0x1c, 0x2d, 0x4c, 0xa7, 0x0b, 0xfb, 0x8b, 0x55, - 0xd8, 0x87, 0x87, 0x0c, 0xfd, 0xe9, 0x1d, 0x9a, 0x0c, 0xfa, 0xc0, 0x6a, 0x79, 0x8e, 0x08, 0xd5, - 0x58, 0xa4, 0xc3, 0x9f, 0xab, 0x59, 0x83, 0x08, 0x27, 0x16, 0x17, 0xbb, 0xc9, 0x34, 0x9b, 0x56, - 0x22, 0xfd, 0xb2, 0x59, 0x0d, 0x66, 0xab, 0xaa, 0x90, 0x1d, 0x11, 0xe4, 0x89, 0x2e, 0xf8, 0x9f, - 0x29, 0xb5, 0xe9, 0x1c, 0x1e, 0x61, 0xba, 0x77, 0x14, 0xec, 0x96, 0xfc, 0x8c, 0xeb, 0xac, 0xef, - 0xe9, 0xb4, 0x46, 0x67, 0x90, 0x75, 0x74, 0xea, 0xa4, 0x94, 0x20, 0xbb, 0x46, 0x96, 0xaa, 0x63, - 0xd5, 0x86, 0x20, 0x05, 0x7a, 0x7f, 0x23, 0x75, 0x29, 0x92, 0xe2, 0x00, 0x7f, 0x3a, 0x03, 0xf5, - 0xe8, 0xa8, 0x83, 0x47, 0x8a, 0xa5, 0xa1, 0xf3, 0x75, 0x49, 0x68, 0xbc, 0x23, 0x98, 0x32, 0xd2, - 0x97, 0x2c, 0x46, 0x7c, 0x97, 0x66, 0x94, 0x65, 0x3c, 0x35, 0x20, 0x13, 0x58, 0xa5, 0xe3, 0xc9, - 0xb7, 0xa4, 0xc1, 0xe9, 0x0e, 0x09, 0x94, 0x2c, 0xb1, 0x07, 0x0f, 0x5e, 0xc5, 0x75, 0x9e, 0x60, - 0x82, 0xd0, 0xe7, 0xeb, 0xbc, 0x36, 0x47, 0xef, 0xa1, 0xe5, 0xb4, 0xe4, 0xd2, 0x8c, 0x81, 0x78, - 0xd8, 0xd0, 0x86, 0x20, 0x8d, 0x17, 0xca, 0x2d, 0xce, 0x8e, 0x0d, 0x9a, 0xa3, 0x16, 0xf7, 0x56, - 0x7e, 0x9d, 0xce, 0x83, 0xa8, 0x93, 0x5b, 0xa8, 0x6d, 0x34, 0x13, 0x72, 0xb3, 0xfb, 0x36, 0x50, - 0xf9, 0x2a, 0x28, 0x1d, 0xec, 0x70, 0xd8, 0x1c, 0x61, 0x47, 0xe9, 0x3c, 0x1b, 0xd1, 0x50, 0x7f, - 0x80, 0x94, 0x35, 0xed, 0xf0, 0x7c, 0xa1, 0x80, 0xd0, 0xca, 0x35, 0x74, 0x56, 0x8d, 0x41, 0x6d, - 0x30, 0xa9, 0xf0, 0xd5, 0x31, 0x43, 0x37, 0x76, 0x46, 0x84, 0x0f, 0x96, 0x89, 0xb2, 0x64, 0xb0, - 0x1c, 0x35, 0xda, 0x57, 0xce, 0x32, 0xac, 0xcb, 0x74, 0x44, 0x93, 0x4c, 0xce, 0xa2, 0xbf, 0x78, - 0xe6, 0xaf, 0x29, 0xfc, 0x29, 0x3a, 0x41, 0x2a, 0x43, 0xdf, 0x08, 0x0f, 0x48, 0x1f, 0x5b, 0xfa, - 0xf2, 0xff, 0xb1, 0xf4, 0xaf, 0xf8, 0xa3, 0xaa, 0x02, 0x78, 0x62, 0x25, 0x17, 0xb6, 0xc7, 0x94, - 0x1f, 0x3e, 0xe5, 0x3d, 0xb2, 0xdc, 0xe7, 0x35, 0xb8, 0x3f, 0x7d, 0xf4, 0x28, 0xe1, 0x7f, 0x9d, - 0x67, 0x0b, 0x05, 0xb8, 0xac, 0x11, 0x3b, 0x21, 0xcb, 0x15, 0x54, 0xd3, 0x45, 0x05, 0x7e, 0x0c, - 0xc1, 0x15, 0x55, 0x21, 0xbd, 0x9e, 0x35, 0xb1, 0x7f, 0x5b, 0x20, 0x7f, 0xcf, 0xeb, 0x90, 0xbf, - 0x4e, 0x31, 0xc9, 0x73, 0xbf, 0x5c, 0x8e, 0xfc, 0x0b, 0x5f, 0x42, 0x17, 0x9b, 0x99, 0x9a, 0xed, - 0x8c, 0xb5, 0xab, 0xb0, 0x80, 0x3b, 0x75, 0x35, 0xe9, 0x2b, 0x50, 0x82, 0xcb, 0x26, 0x4a, 0xb0, - 0x82, 0x77, 0x53, 0xe0, 0x79, 0x2b, 0xf9, 0x60, 0x98, 0xc2, 0x0b, 0x55, 0x37, 0x04, 0xe1, 0x31, - 0x94, 0x19, 0xd4, 0x58, 0xc4, 0x17, 0xb3, 0xa1, 0x51, 0x9c, 0xaa, 0x3c, 0x50, 0xe4, 0xf5, 0x1b, - 0xd0, 0xc1, 0x34, 0x97, 0xb5, 0xff, 0xc1, 0x1b, 0xd8, 0x8c, 0x5a, 0x45, 0x43, 0x27, 0xee, 0x2c, - 0x2f, 0x7b, 0x49, 0x65, 0x33, 0x05, 0xb1, 0xca, 0xf1, 0x7b, 0x2a, 0x0b, 0x61, 0x57, 0xe5, 0xf7, - 0xb4, 0xad, 0x26, 0x4f, 0x8f, 0x5a, 0x97, 0xd8, 0x2b, 0xef, 0xc8, 0x4f, 0x05, 0x4e, 0x77, 0x41, - 0x87, 0xfb, 0x30, 0x14, 0xf0, 0xa4, 0xd6, 0x2a, 0x1f, 0x2f, 0x8f, 0x81, 0x9b, 0x1a, 0x7a, 0x9f, - 0x2e, 0x00, 0x62, 0x6b, 0xd2, 0xc6, 0xbc, 0xad, 0x36, 0x66, 0xdc, 0x89, 0xb7, 0xb5, 0xb0, 0xf2, - 0x35, 0xd3, 0x18, 0xbe, 0x31, 0xf0, 0x4e, 0xa1, 0xaf, 0x3a, 0x33, 0xad, 0xf4, 0x82, 0x7c, 0x9e, - 0x17, 0x5e, 0x8c, 0xed, 0xef, 0xfd, 0x7c, 0x8b, 0x04, 0x9c, 0x20, 0xb5, 0x74, 0xee, 0xa6, 0xd5, - 0x55, 0x87, 0x1c, 0x27, 0xe0, 0xc3, 0xff, 0x84, 0xe5, 0x5b, 0xde, 0x85, 0x91, 0x61, 0x8b, 0x47, - 0xce, 0xfd, 0x71, 0x59, 0x13, 0x6f, 0xe0, 0xf1, 0x55, 0x69, 0x04, 0x1c, 0xac, 0xf7, 0xc3, 0x43, - 0xf5, 0xd5, 0xa2, 0x59, 0x5b, 0x7f, 0xcc, 0xf2, 0x9e, 0x55, 0x12, 0x78, 0x38, 0x7a, 0x79, 0x72, - 0xdc, 0x81, 0xae, 0xbc, 0x1e, 0x66, 0x17, 0xcc, 0x48, 0x0d, 0x63, 0x63, 0x58, 0x88, 0xa1, 0x4a, - 0x31, 0x9c, 0x4d, 0x35, 0xd9, 0x11, 0x25, 0x82, 0x00, 0x32, 0xc1, 0xca, 0x78, 0x47, 0x4b, 0xbe, - 0xd3, 0xb5, 0xbf, 0xd3, 0x55, 0x40, 0x8a, 0x6d, 0xbb, 0x70, 0xe7, 0xfa, 0x39, 0x48, 0xb8, 0x38, - 0x46, 0xaa, 0xbc, 0x73, 0xfc, 0xba, 0x63, 0x91, 0x9d, 0xf2, 0x4e, 0x75, 0x51, 0xb7, 0x2e, 0x6b, - 0x51, 0x8a, 0xda, 0x00, 0x7a, 0xe4, 0xc2, 0x16, 0xa8, 0x7a, 0x07, 0x11, 0x09, 0x54, 0x5d, 0x2d, - 0x50, 0x61, 0x7f, 0x8a, 0x18, 0x14, 0xff, 0x77, 0xd6, 0x71, 0xdf, 0x89, 0x1f, 0x2c, 0x8e, 0x96, - 0xc9, 0x05, 0xd4, 0xda, 0xeb, 0x65, 0x03, 0xf4, 0xe6, 0x3f, 0x61, 0xd1, 0x40, 0xc1, 0x5e, 0xae, - 0xb4, 0x59, 0xaa, 0x73, 0x08, 0xac, 0xad, 0x96, 0x0c, 0x78, 0x30, 0x62, 0x19, 0xb7, 0x97, 0x7f, - 0x92, 0x5a, 0x63, 0x7b, 0x47, 0xec, 0x6c, 0x5f, 0x88, 0xd4, 0xe5, 0x3b, 0x38, 0xf1, 0x29, 0x7c, - 0x63, 0xba, 0x03, 0xe6, 0x4c, 0xd8, 0x8e, 0xb7, 0x37, 0xb5, 0x77, 0x9f, 0xb8, 0x06, 0xef, 0xed, - 0x85, 0x5d, 0xf4, 0xf6, 0xee, 0xbf, 0x1b, 0x16, 0xaa, 0x52, 0xde, 0x68, 0xc6, 0x44, 0x81, 0x63, - 0x6b, 0x44, 0xe0, 0x7b, 0xcf, 0xb4, 0xbe, 0xaa, 0xbe, 0xbb, 0x72, 0xc0, 0x58, 0xc0, 0x9a, 0x29, - 0x94, 0x4d, 0xcc, 0xa4, 0x6e, 0x08, 0xe4, 0x92, 0x49, 0xf7, 0x68, 0xb6, 0x77, 0xb1, 0xd9, 0xbc, - 0xdf, 0x76, 0x37, 0x08, 0xe6, 0xeb, 0x97, 0x51, 0x5e, 0x31, 0x47, 0xbb, 0xeb, 0x74, 0xcb, 0x68, - 0x3f, 0xa1, 0x58, 0x66, 0x6e, 0xc7, 0xf7, 0xd3, 0xcc, 0x3a, 0x15, 0x95, 0xa2, 0xa9, 0x1f, 0x29, - 0x58, 0xc6, 0x73, 0x1b, 0x96, 0x6a, 0x16, 0xe1, 0xa4, 0x09, 0x40, 0x27, 0x9f, 0xe4, 0xe3, 0x1b, - 0x3c, 0x05, 0xaf, 0xd4, 0xf5, 0x3c, 0x02, 0xad, 0x06, 0x7d, 0xe8, 0x02, 0x7d, 0x9a, 0x04, 0xdd, - 0x4b, 0xb3, 0x2e, 0xee, 0x13, 0x02, 0x22, 0x44, 0xe6, 0x20, 0xf2, 0x4c, 0xdb, 0xf8, 0x5c, 0x77, - 0x2c, 0x32, 0x72, 0xf7, 0x91, 0x47, 0xee, 0xb3, 0xf2, 0x2d, 0x7b, 0xa3, 0xb5, 0x37, 0x44, 0x85, - 0xd7, 0xa9, 0xea, 0x76, 0x55, 0x65, 0xc0, 0xab, 0x5a, 0x11, 0x63, 0x61, 0xbd, 0xc7, 0xf7, 0x72, - 0x7a, 0xb4, 0x1b, 0xf7, 0xe8, 0x95, 0x01, 0x7c, 0xc4, 0xe3, 0x50, 0xfc, 0xdb, 0xb1, 0xce, 0x5f, - 0x5f, 0x44, 0xdf, 0x79, 0x16, 0xa9, 0x3d, 0xbd, 0xee, 0x6c, 0xaa, 0xb9, 0xb8, 0x6a, 0x0a, 0x1a, - 0x7b, 0xf4, 0xf4, 0x0b, 0x25, 0x9f, 0xb1, 0x56, 0x59, 0xbc, 0x6f, 0xeb, 0x26, 0x20, 0x0d, 0x6e, - 0x8b, 0x06, 0x38, 0x79, 0x74, 0x29, 0x0b, 0xd0, 0xae, 0x6b, 0x50, 0x2a, 0x46, 0xa4, 0xec, 0x74, - 0x6a, 0xe2, 0x01, 0xd7, 0x0b, 0x0f, 0xa3, 0x74, 0x0d, 0xd7, 0x6b, 0x16, 0xe9, 0x2e, 0x8c, 0x37, - 0x6b, 0x86, 0xb1, 0x99, 0x6f, 0xf3, 0x25, 0x44, 0x1d, 0x7b, 0xb8, 0x47, 0x99, 0x12, 0x29, 0xb3, - 0x68, 0xb6, 0xb9, 0x29, 0xd1, 0xeb, 0x9b, 0x82, 0xce, 0x3a, 0x96, 0x95, 0xf8, 0x83, 0xb6, 0x82, - 0x2c, 0x8b, 0xf1, 0x0d, 0x94, 0x70, 0xa7, 0xbb, 0xd8, 0xf4, 0x8b, 0xaa, 0xbf, 0x9f, 0x41, 0x7f, - 0xb7, 0x1e, 0x21, 0xba, 0xab, 0xba, 0x23, 0xe3, 0xa8, 0xc2, 0xf2, 0x92, 0xfe, 0xfc, 0xe0, 0x60, - 0x7f, 0x8f, 0x57, 0xf5, 0x68, 0xaf, 0x07, 0xfb, 0xae, 0x98, 0xc1, 0x8f, 0xae, 0xad, 0x53, 0x93, - 0xf9, 0xae, 0x31, 0x14, 0xb4, 0x28, 0x53, 0x37, 0xdf, 0x3d, 0xed, 0x46, 0xd0, 0xf3, 0xe5, 0x92, - 0x9a, 0x7e, 0x4d, 0xc9, 0x4d, 0x33, 0xaa, 0xb2, 0xeb, 0x92, 0x47, 0xed, 0x25, 0xff, 0xb0, 0x59, - 0xc1, 0x1d, 0x2b, 0xe1, 0xea, 0xf2, 0xaf, 0x18, 0x7d, 0xcd, 0xed, 0xe3, 0x31, 0xa3, 0x6f, 0x29, - 0x65, 0x4e, 0x63, 0x44, 0x3c, 0xd5, 0x6b, 0xc0, 0x92, 0x23, 0x1c, 0xb9, 0x74, 0xcf, 0xde, 0xdf, - 0x5c, 0xa3, 0x2d, 0xdf, 0xf2, 0x03, 0xfd, 0x98, 0xdf, 0x74, 0x32, 0x01, 0x1a, 0xd6, 0xb0, 0xea, - 0x80, 0xf0, 0x08, 0x82, 0x59, 0x4f, 0xda, 0x06, 0x4a, 0x14, 0x11, 0x30, 0x79, 0x67, 0xa8, 0xa5, - 0xb6, 0x2d, 0x09, 0x86, 0xf3, 0x9f, 0x5d, 0xff, 0xd5, 0x19, 0x73, 0x37, 0x8a, 0xac, 0xbd, 0x80, - 0xcc, 0x10, 0x2e, 0xdf, 0xb0, 0x65, 0xa8, 0x8e, 0xd4, 0xc2, 0xcc, 0x9b, 0x83, 0xde, 0x1a, 0xfe, - 0x53, 0x4b, 0xbc, 0xbd, 0x99, 0xcf, 0x97, 0xa5, 0x67, 0xa0, 0x19, 0x95, 0x78, 0x5d, 0xcb, 0xea, - 0xd8, 0xcd, 0x66, 0x55, 0x05, 0x69, 0x69, 0xd9, 0x65, 0x92, 0x87, 0xed, 0xed, 0x61, 0x6d, 0xef, - 0xda, 0x3a, 0x37, 0x01, 0x8d, 0xa1, 0x8a, 0x53, 0x31, 0xa9, 0xfa, 0x9b, 0x2e, 0x93, 0x27, 0xd2, - 0xa6, 0xa4, 0x86, 0xeb, 0x86, 0x1f, 0x4e, 0x5b, 0xbf, 0x4c, 0xb6, 0x96, 0xcd, 0x3f, 0x2d, 0x07, - 0xa8, 0xfe, 0xf8, 0xb6, 0xe5, 0x72, 0x47, 0x22, 0xbf, 0xa8, 0xc3, 0xfb, 0x49, 0xe5, 0xc0, 0xd8, - 0xe6, 0xfb, 0xe6, 0x4d, 0x8b, 0x1d, 0xbc, 0x6a, 0x73, 0x9e, 0x94, 0xb1, 0x7b, 0x6d, 0xb1, 0x29, - 0x56, 0x2c, 0x13, 0x39, 0xa5, 0x21, 0x62, 0x56, 0xa1, 0x3c, 0xcf, 0x31, 0x1f, 0x71, 0x08, 0x63, - 0x7b, 0xa0, 0xc1, 0x26, 0xcf, 0x63, 0xca, 0x78, 0x17, 0x02, 0x51, 0x9b, 0x35, 0x48, 0x4a, 0x4d, - 0x40, 0x5a, 0x02, 0xa1, 0x0d, 0x6d, 0xd1, 0x47, 0x49, 0x33, 0x30, 0x0c, 0x5a, 0x31, 0xde, 0xc3, - 0x25, 0x87, 0xf2, 0xf6, 0xd5, 0x51, 0xe5, 0x76, 0xa0, 0x1b, 0x6d, 0x0e, 0x45, 0x8b, 0x3f, 0x9d, - 0x2d, 0x6a, 0x37, 0x2a, 0x99, 0x1b, 0xab, 0x74, 0xb8, 0xb1, 0x4a, 0xc2, 0xdc, 0xc2, 0x3b, 0xe6, - 0x04, 0xcb, 0x8f, 0x7e, 0xdb, 0x25, 0x5e, 0x62, 0x45, 0x00, 0x1b, 0x6e, 0xe8, 0x45, 0xd0, 0xb7, - 0x3d, 0x32, 0xab, 0xc6, 0xa7, 0xdf, 0xdc, 0xff, 0xb5, 0x5f, 0x2e, 0x41, 0xcb, 0x5b, 0xa0, 0x80, - 0x28, 0x21, 0x09, 0x12, 0x11, 0xae, 0x2e, 0x00, 0x63, 0xb2, 0x5b, 0xee, 0xd9, 0x58, 0x08, 0x62, - 0x01, 0xa2, 0xfc, 0x1c, 0xe8, 0x4d, 0x9b, 0xa8, 0xcb, 0xf1, 0xdd, 0x96, 0xa7, 0xee, 0x78, 0x6d, - 0xe5, 0x51, 0x1d, 0xd1, 0xb7, 0x4e, 0x94, 0x57, 0xa0, 0x0e, 0x9d, 0x1b, 0xd4, 0x21, 0xe6, 0xfb, - 0x66, 0x18, 0xb3, 0xb0, 0x6c, 0x36, 0x19, 0x5f, 0x0b, 0xe4, 0x26, 0x13, 0x4e, 0x93, 0x09, 0x62, - 0xb2, 0x72, 0x9a, 0x8c, 0xab, 0x88, 0x5e, 0xf5, 0x7c, 0xaa, 0xe3, 0xa0, 0x8d, 0x55, 0x86, 0xcc, - 0xc3, 0x3a, 0x82, 0x42, 0xc9, 0xda, 0xba, 0xb4, 0x85, 0x17, 0x7e, 0x4a, 0x89, 0x97, 0x40, 0x7e, - 0xfb, 0x15, 0x67, 0x19, 0x2d, 0x16, 0xa5, 0x05, 0x3e, 0xe0, 0xfa, 0xe5, 0x96, 0xf6, 0xe2, 0xc9, - 0xcc, 0x76, 0xee, 0x94, 0xd5, 0x93, 0x43, 0x79, 0x77, 0x96, 0x6b, 0x41, 0x94, 0xb3, 0x75, 0x20, - 0xca, 0x58, 0xc3, 0x68, 0x2b, 0x91, 0x3e, 0x09, 0x2e, 0x62, 0x32, 0xf4, 0x96, 0x75, 0xa4, 0xe7, - 0x42, 0x27, 0x5f, 0x4f, 0xad, 0x57, 0x35, 0x08, 0x65, 0x7b, 0x3c, 0xd4, 0xc0, 0x94, 0x67, 0x77, - 0x85, 0x83, 0x33, 0x87, 0x5d, 0x8b, 0x23, 0x92, 0xdc, 0xa5, 0xf1, 0x46, 0x40, 0x62, 0x0d, 0xb4, - 0x0c, 0x9b, 0x0d, 0x9d, 0xe0, 0x70, 0x10, 0xe3, 0x11, 0x56, 0xc3, 0x33, 0xb5, 0x44, 0xb6, 0xb4, - 0x0c, 0x86, 0xf2, 0x6d, 0x9c, 0x86, 0xd7, 0xd3, 0x78, 0x18, 0xe2, 0x25, 0x8c, 0x70, 0x54, 0x4c, - 0xe3, 0xd6, 0x7a, 0x13, 0x17, 0x9d, 0x06, 0x98, 0x86, 0x1e, 0xc9, 0x17, 0x0b, 0xc5, 0x93, 0xd3, - 0x82, 0x47, 0x3b, 0xde, 0x00, 0x8f, 0xf6, 0x62, 0x3d, 0x1e, 0x6d, 0x38, 0x6b, 0x8f, 0x83, 0x38, - 0xd2, 0xaa, 0x1b, 0x0a, 0x1a, 0x16, 0x90, 0x73, 0x32, 0x0e, 0xf9, 0x37, 0xe4, 0x90, 0x5c, 0xc8, - 0xdf, 0xf9, 0x24, 0x99, 0x2d, 0xf8, 0x27, 0x8c, 0x0c, 0xba, 0x00, 0xc6, 0x34, 0xd4, 0xc2, 0xbd, - 0x37, 0x50, 0xd8, 0x47, 0xfa, 0xd2, 0x83, 0x71, 0xf5, 0x18, 0xea, 0xf3, 0x82, 0x52, 0x87, 0xc0, - 0xce, 0xea, 0x10, 0xd8, 0xd2, 0x6d, 0xa2, 0x71, 0xa6, 0x1d, 0x0e, 0x9b, 0x7e, 0x05, 0x4d, 0x3f, - 0xe5, 0x94, 0x9c, 0x90, 0x27, 0x7e, 0x7a, 0x58, 0xe2, 0x4d, 0xc8, 0x87, 0x87, 0xf4, 0x88, 0x20, - 0xda, 0x15, 0x78, 0x07, 0xc2, 0x2a, 0xa9, 0x2c, 0x13, 0x8a, 0xc2, 0x17, 0x72, 0x0f, 0x33, 0x8e, - 0x3e, 0xdc, 0x6d, 0xcd, 0xf2, 0x28, 0x6b, 0x64, 0x62, 0x1c, 0x23, 0xf0, 0x4d, 0xdf, 0x86, 0xb7, - 0xe2, 0x84, 0x64, 0xe9, 0x1b, 0x3e, 0x3c, 0x6c, 0x35, 0xc2, 0x91, 0xe8, 0xd0, 0xce, 0xab, 0x73, - 0xa1, 0x56, 0x42, 0x89, 0xee, 0xd1, 0x3a, 0x34, 0x53, 0x1e, 0x9a, 0x43, 0x1e, 0x48, 0xe4, 0xb3, - 0x9e, 0x1e, 0x32, 0xe2, 0xb7, 0xb5, 0xbd, 0x39, 0x20, 0xe4, 0x65, 0x03, 0x84, 0xbc, 0xcf, 0x37, - 0xf2, 0x0d, 0xb4, 0x96, 0x6a, 0xdd, 0xa2, 0xd9, 0xe2, 0xcd, 0xd6, 0x9d, 0xca, 0xd6, 0x9d, 0x1e, - 0x56, 0xdc, 0x5c, 0xd3, 0xa3, 0xaa, 0xd1, 0x30, 0xca, 0x22, 0x50, 0xe9, 0xd6, 0x2d, 0x54, 0x67, - 0x14, 0xab, 0x3b, 0x03, 0xdb, 0x31, 0xe7, 0x21, 0x49, 0xc8, 0x2f, 0xc9, 0x34, 0x54, 0x8f, 0xf9, - 0xec, 0x63, 0x52, 0x2c, 0xb0, 0x9a, 0xe3, 0x26, 0xa6, 0x33, 0x35, 0x7e, 0x63, 0xa5, 0x1c, 0xaf, - 0xc1, 0x77, 0x77, 0x26, 0x4e, 0xb6, 0x7e, 0xe2, 0xe4, 0x7a, 0xe2, 0x54, 0xaa, 0x58, 0x30, 0x71, - 0x4a, 0xf9, 0x1b, 0x26, 0x4e, 0x16, 0x52, 0xa7, 0xd4, 0xb1, 0xac, 0x11, 0x09, 0x85, 0xa2, 0x54, - 0x2e, 0x46, 0xb8, 0x8d, 0x73, 0x8d, 0xae, 0x4f, 0xda, 0x03, 0xd3, 0x99, 0x68, 0xb9, 0xeb, 0x93, - 0x22, 0xe7, 0x99, 0x61, 0x9d, 0x1c, 0xb4, 0x29, 0x18, 0xa0, 0x4d, 0x5c, 0xa1, 0xe1, 0xf1, 0x1a, - 0x36, 0xbf, 0x29, 0x68, 0x62, 0xe6, 0x4c, 0x07, 0xde, 0x48, 0x57, 0x08, 0x10, 0x99, 0xb6, 0xd0, - 0xcb, 0x41, 0x65, 0xb5, 0xbb, 0x1b, 0x2e, 0xdb, 0x86, 0x71, 0xd8, 0xc1, 0x86, 0x12, 0x38, 0x1b, - 0x6e, 0xf5, 0x8b, 0xb8, 0x5d, 0xb1, 0x77, 0xe3, 0x4a, 0xb9, 0x74, 0x89, 0xaf, 0xed, 0xdd, 0x98, - 0xd5, 0xc7, 0x55, 0x79, 0x7d, 0x74, 0xb3, 0xfa, 0xb8, 0x3c, 0xa7, 0x9f, 0xa6, 0x2b, 0xf2, 0x81, - 0x75, 0x7b, 0xd9, 0xce, 0xd2, 0xcc, 0x67, 0x55, 0x81, 0xae, 0xdd, 0x02, 0x5d, 0xaf, 0x2a, 0x50, - 0xb7, 0xb7, 0x2a, 0xa3, 0x6e, 0xcf, 0xcd, 0xa9, 0x4b, 0xf2, 0xad, 0xb4, 0x9b, 0x1d, 0xa3, 0x35, - 0xa7, 0x9e, 0xe1, 0xe9, 0xaa, 0x1a, 0x96, 0x6e, 0x0d, 0xcb, 0xe9, 0xba, 0xdc, 0x3e, 0xcc, 0x56, - 0xe4, 0x56, 0xcd, 0xe2, 0x65, 0x03, 0xb6, 0x9e, 0x0f, 0x49, 0x5f, 0x68, 0x5e, 0x7b, 0x9c, 0xfc, - 0xb5, 0x74, 0xc8, 0x89, 0x2a, 0xae, 0x1a, 0x35, 0x17, 0x97, 0x27, 0x77, 0xc5, 0x8a, 0xf2, 0xc2, - 0x96, 0xbc, 0xf5, 0x08, 0x19, 0xa0, 0x25, 0xff, 0x1f, 0x8b, 0x55, 0xad, 0xbb, 0xd1, 0x6e, 0xef, - 0xde, 0x29, 0xbc, 0x4c, 0xdf, 0x16, 0x42, 0xfc, 0x21, 0xf4, 0xd5, 0x71, 0x4b, 0xd2, 0x9e, 0xe3, - 0x95, 0x4a, 0xaf, 0xf2, 0x60, 0x41, 0x67, 0xb4, 0x23, 0x72, 0xe8, 0x61, 0xa9, 0x1a, 0xd4, 0x70, - 0x11, 0x9a, 0x2b, 0x9d, 0xc2, 0xba, 0xad, 0x2c, 0x2f, 0x64, 0x36, 0xee, 0x79, 0xfa, 0x90, 0x2d, - 0xfa, 0xa5, 0x82, 0x34, 0x19, 0xac, 0x90, 0xb9, 0xab, 0xb7, 0xff, 0xd2, 0x85, 0xe1, 0x5b, 0xd9, - 0x89, 0x18, 0x58, 0x18, 0x1c, 0x75, 0x3c, 0x8d, 0x6d, 0x85, 0xa7, 0x51, 0xc7, 0xa2, 0x8d, 0xe5, - 0x50, 0xd8, 0xd6, 0x84, 0xb2, 0xf5, 0xa4, 0xe7, 0xcb, 0x92, 0xd6, 0x91, 0x8b, 0x2d, 0xdc, 0xda, - 0x96, 0x11, 0x31, 0xb9, 0x37, 0xad, 0x0e, 0x4b, 0xf5, 0xe4, 0xfe, 0x42, 0x4c, 0xcc, 0x05, 0x16, - 0x7a, 0xac, 0x77, 0xa5, 0x86, 0x58, 0x7e, 0x54, 0x45, 0x15, 0xb7, 0x5e, 0x2b, 0xda, 0xf2, 0x26, - 0xd5, 0x5d, 0x99, 0xc1, 0xe3, 0x2a, 0x0d, 0xc9, 0x62, 0x51, 0xaf, 0x16, 0x0e, 0xcf, 0xda, 0xe8, - 0x6c, 0x8c, 0xc9, 0x26, 0x74, 0x5e, 0x50, 0x1f, 0xe7, 0x08, 0x7f, 0xe3, 0xb7, 0x8d, 0xf2, 0xf2, - 0xbe, 0x35, 0x2f, 0x07, 0x4c, 0xab, 0x31, 0x6d, 0x34, 0x98, 0x56, 0x6b, 0x96, 0xd3, 0xf6, 0x2c, - 0x1b, 0x08, 0x5c, 0x8d, 0x6c, 0x19, 0x84, 0x07, 0x7a, 0x50, 0x22, 0x08, 0xa2, 0xe2, 0xfe, 0xf0, - 0x20, 0x8e, 0xf6, 0x03, 0x77, 0x12, 0x2d, 0x16, 0xf5, 0x0d, 0x5e, 0xc1, 0x6f, 0x11, 0x58, 0x8d, - 0xdc, 0xbc, 0xf7, 0xa9, 0xf7, 0x79, 0x6e, 0x8d, 0xf7, 0x93, 0x32, 0xee, 0xd9, 0x01, 0x3d, 0x08, - 0x90, 0x3f, 0xbb, 0xb0, 0xa3, 0xd7, 0x26, 0x8f, 0x53, 0x2c, 0x86, 0xc9, 0xc1, 0x62, 0x59, 0xe8, - 0x86, 0xf5, 0xb2, 0x95, 0xba, 0x6c, 0xf2, 0xc3, 0xac, 0x8b, 0xe5, 0xfb, 0xc9, 0xd6, 0x56, 0x25, - 0x3f, 0x2d, 0x83, 0x7a, 0x14, 0x24, 0x1f, 0xba, 0xf8, 0x10, 0xd6, 0x54, 0x35, 0xe7, 0xf3, 0xef, - 0xf2, 0xe6, 0x02, 0x88, 0x93, 0x5e, 0xd4, 0x27, 0x00, 0xc9, 0x13, 0x96, 0x6a, 0x8f, 0x80, 0x86, - 0x0b, 0xa4, 0xa2, 0x50, 0xe6, 0x1b, 0x1f, 0xf5, 0x51, 0x79, 0x5b, 0x5e, 0xb9, 0x21, 0x20, 0xa2, - 0x89, 0x76, 0x49, 0xb8, 0x43, 0x89, 0xcd, 0x7e, 0x32, 0xb8, 0x23, 0x27, 0x68, 0xbe, 0x14, 0x5e, - 0x70, 0x98, 0x10, 0x91, 0x05, 0x66, 0x0f, 0xeb, 0xe3, 0x22, 0x94, 0x3e, 0xe9, 0x92, 0x08, 0xac, - 0x0a, 0x55, 0xea, 0xc0, 0xf8, 0x5f, 0xfe, 0x9e, 0x9a, 0xdf, 0x19, 0x5e, 0xc0, 0x74, 0xca, 0x03, - 0xab, 0x5f, 0x9e, 0x21, 0x7a, 0x75, 0x68, 0x89, 0x35, 0xef, 0xf2, 0x21, 0x5e, 0xf7, 0x90, 0xb6, - 0xd2, 0x8e, 0xb7, 0xa3, 0x7c, 0x08, 0x76, 0xbc, 0x8e, 0x4f, 0xd4, 0x9c, 0x81, 0xb7, 0x62, 0xc5, - 0xa3, 0xb3, 0x4c, 0x05, 0x41, 0x0b, 0x7d, 0x35, 0x3b, 0xae, 0xbb, 0x6a, 0xf2, 0x69, 0xac, 0x5e, - 0xc1, 0x03, 0xa8, 0xf6, 0xf1, 0x61, 0x97, 0x28, 0x3a, 0x8e, 0x93, 0x65, 0x87, 0xac, 0xa0, 0x6c, - 0x1d, 0x1f, 0xf5, 0x0e, 0xa2, 0x00, 0xe6, 0x77, 0x01, 0xa5, 0x94, 0x4e, 0xf5, 0xc7, 0xaf, 0x41, - 0xea, 0x82, 0x25, 0x60, 0x24, 0x3a, 0x78, 0x60, 0x9b, 0x83, 0x2e, 0x23, 0xca, 0x72, 0x4f, 0x51, - 0xd9, 0x20, 0x82, 0x96, 0x3f, 0x7b, 0x6f, 0x59, 0xc6, 0xc8, 0xe8, 0xa4, 0x59, 0xbf, 0xf1, 0x9d, - 0x5f, 0x0d, 0x3c, 0xed, 0xb0, 0xee, 0x19, 0x77, 0xfd, 0x60, 0x67, 0x76, 0xac, 0x70, 0x25, 0xe7, - 0x46, 0x9b, 0x6c, 0xb3, 0xaf, 0x05, 0xd5, 0x00, 0x04, 0x6b, 0x65, 0x4a, 0x36, 0xce, 0x9d, 0x61, - 0xc9, 0xed, 0x8b, 0x7f, 0xb1, 0x99, 0x63, 0xa4, 0x78, 0x19, 0x59, 0xa5, 0x21, 0xf7, 0x29, 0x4b, - 0xa9, 0x86, 0x81, 0x69, 0xbf, 0x2e, 0x9b, 0xaf, 0xc7, 0xce, 0xeb, 0xf1, 0xd5, 0xe7, 0x86, 0x73, - 0xae, 0xf4, 0xaa, 0x41, 0x49, 0x98, 0x00, 0xac, 0x6a, 0xa1, 0x5c, 0x77, 0x42, 0x22, 0x97, 0x5e, - 0x30, 0x2d, 0xdd, 0x63, 0xc5, 0x44, 0xfc, 0x1a, 0x6a, 0x4b, 0x43, 0x8f, 0x79, 0xae, 0x4e, 0xf0, - 0xb5, 0xb2, 0x59, 0x15, 0x5f, 0xe6, 0xa5, 0x0d, 0x21, 0x9b, 0x05, 0x0b, 0x46, 0x5c, 0xe0, 0x71, - 0x50, 0xe2, 0x80, 0x06, 0x89, 0xdd, 0xe0, 0xa0, 0x39, 0x4a, 0x89, 0xc9, 0x14, 0x4f, 0x74, 0x1d, - 0x92, 0x15, 0x62, 0x12, 0x7e, 0xf1, 0xa2, 0xdf, 0xe1, 0x49, 0xd0, 0x21, 0xcb, 0x75, 0xe7, 0x0b, - 0xa2, 0x19, 0x58, 0x3e, 0x07, 0x1d, 0xba, 0x7a, 0xc0, 0x68, 0x28, 0xd6, 0xc4, 0x99, 0x7b, 0xc1, - 0xd1, 0x6e, 0xf7, 0xd1, 0x9f, 0x3a, 0xfd, 0x02, 0x82, 0xcb, 0xbd, 0x44, 0xbc, 0x9b, 0x66, 0x9d, - 0x31, 0xd3, 0xd2, 0x62, 0xf5, 0xec, 0x8f, 0xf2, 0xe7, 0x08, 0x05, 0xae, 0x31, 0x55, 0xff, 0x6c, - 0xf5, 0xa4, 0x9d, 0x9f, 0x80, 0x09, 0x40, 0x6e, 0x13, 0x30, 0xb0, 0x27, 0xe8, 0xd4, 0x78, 0x9d, - 0x5f, 0x4c, 0x27, 0x5f, 0x70, 0x5a, 0x12, 0xba, 0x01, 0xcf, 0x4d, 0x90, 0xa9, 0x78, 0x60, 0xc1, - 0x9f, 0x19, 0x4e, 0xbc, 0x64, 0x76, 0x0c, 0x63, 0x04, 0x94, 0xab, 0xf7, 0x16, 0x4c, 0xcc, 0xb9, - 0xf4, 0xb7, 0x31, 0x96, 0x01, 0x9b, 0x3e, 0xba, 0x84, 0x25, 0x02, 0xd4, 0x63, 0x7b, 0x01, 0x38, - 0x1d, 0x12, 0x4e, 0x35, 0x4e, 0x7c, 0x9e, 0xf2, 0xb3, 0xe3, 0xe6, 0x9c, 0x2f, 0x11, 0xab, 0x3e, - 0x1f, 0xf0, 0x45, 0x98, 0x4f, 0xb3, 0xe3, 0x33, 0x58, 0xc8, 0x9d, 0x9b, 0x33, 0x10, 0xc4, 0x85, - 0x6a, 0x06, 0xe7, 0xcd, 0xa0, 0xdb, 0x66, 0x10, 0x7a, 0xad, 0xc2, 0x8c, 0x31, 0x1f, 0x98, 0x67, - 0xf1, 0xec, 0x7d, 0x08, 0x03, 0x29, 0xf6, 0x96, 0xb5, 0x16, 0x42, 0x23, 0x0a, 0xc1, 0x6d, 0x94, - 0x89, 0xbb, 0xf4, 0x0b, 0xad, 0x47, 0x17, 0xaa, 0xc7, 0xf6, 0x3c, 0xd8, 0xbd, 0x70, 0x28, 0xe2, - 0xcc, 0xd7, 0x1f, 0xc2, 0xa1, 0x49, 0xa1, 0x58, 0xa5, 0xdf, 0x53, 0xe7, 0x1d, 0x34, 0x0e, 0x86, - 0x05, 0x16, 0x64, 0x8a, 0x44, 0x31, 0xc1, 0xe6, 0x30, 0x07, 0x21, 0x61, 0x1d, 0xf0, 0x64, 0x76, - 0x5d, 0xbd, 0x83, 0xd6, 0x44, 0x26, 0x30, 0x0b, 0xfa, 0x24, 0x58, 0x10, 0xdc, 0x99, 0x8d, 0x38, - 0xc2, 0x7e, 0xa1, 0x6a, 0xc1, 0x24, 0x86, 0x5e, 0x75, 0xbf, 0x03, 0xdf, 0xa9, 0x81, 0xe4, 0x86, - 0xe2, 0x8d, 0x6f, 0x7b, 0x14, 0x6d, 0xee, 0x49, 0xea, 0x31, 0xd4, 0x35, 0xa9, 0x06, 0x50, 0xee, - 0x7e, 0x2d, 0xdf, 0xee, 0x63, 0xf2, 0xdd, 0x97, 0x6c, 0x96, 0x78, 0x49, 0xd5, 0x33, 0x2b, 0xe5, - 0xca, 0x95, 0x70, 0x99, 0x61, 0x54, 0x15, 0xc8, 0xdd, 0x6b, 0x55, 0x46, 0xb8, 0xb7, 0xd7, 0x6e, - 0x8b, 0xb4, 0x1d, 0x7b, 0x5c, 0xa0, 0x85, 0xb2, 0xef, 0xb4, 0xe1, 0x38, 0x9b, 0x0c, 0x7c, 0x37, - 0xcf, 0x0b, 0xb4, 0xd8, 0x2f, 0x02, 0x77, 0xc4, 0x41, 0x11, 0x9b, 0x3d, 0x6c, 0x1f, 0x58, 0x2d, - 0x3d, 0xae, 0xa2, 0xab, 0x0b, 0x7c, 0x46, 0x32, 0x6e, 0x02, 0x3f, 0x3f, 0xa2, 0x39, 0x5d, 0xcf, - 0x9a, 0x2d, 0x4c, 0x6b, 0xd5, 0x02, 0x04, 0x33, 0xc7, 0x00, 0x6f, 0x30, 0xd6, 0xe6, 0x08, 0x94, - 0x97, 0x08, 0xdb, 0xb8, 0xbe, 0x0c, 0xaa, 0x96, 0x0c, 0xdd, 0x41, 0xdb, 0xf9, 0xda, 0xfd, 0x3d, - 0xb1, 0xb1, 0xf4, 0x91, 0xb9, 0xb9, 0x5e, 0x55, 0xf9, 0x0e, 0xc7, 0xf8, 0x09, 0x91, 0xce, 0xf8, - 0xc5, 0xe5, 0xe8, 0xb4, 0x2a, 0xfc, 0xca, 0x82, 0x9c, 0x85, 0x29, 0x02, 0x4b, 0xe1, 0x18, 0x59, - 0x69, 0xb8, 0x1d, 0xd4, 0x46, 0x53, 0xe7, 0x69, 0x09, 0x5d, 0x3a, 0x20, 0x69, 0x8f, 0xb2, 0xd0, - 0xe7, 0x6d, 0x18, 0xdb, 0xa5, 0x7c, 0x43, 0x48, 0x24, 0x54, 0x07, 0x0c, 0x25, 0x58, 0x31, 0x54, - 0xd3, 0xae, 0x10, 0xe0, 0x59, 0xdf, 0x73, 0x79, 0x25, 0xd1, 0x41, 0xbd, 0x02, 0xd6, 0x6c, 0xa4, - 0xbb, 0x9c, 0x83, 0x3c, 0x39, 0xbf, 0x8a, 0x61, 0x5b, 0x86, 0xff, 0x6f, 0x63, 0x3c, 0x8b, 0x02, - 0xbd, 0xdd, 0xbe, 0x31, 0x73, 0x10, 0xb9, 0x6c, 0xd1, 0x3b, 0x88, 0x51, 0x78, 0x91, 0xcf, 0xc5, - 0xde, 0x95, 0x1d, 0x6d, 0xff, 0x79, 0x2d, 0x5e, 0xb0, 0xb8, 0x83, 0x36, 0x17, 0x3e, 0x05, 0x0e, - 0x47, 0xa5, 0x0f, 0x09, 0x76, 0xa9, 0x44, 0xc1, 0x21, 0x66, 0xc1, 0x85, 0x83, 0xc0, 0x85, 0x69, - 0x4b, 0xc1, 0xf0, 0xbc, 0xd8, 0x64, 0xe8, 0x06, 0x54, 0xe7, 0x14, 0xd3, 0xed, 0x26, 0x31, 0x27, - 0xec, 0x16, 0x86, 0x6e, 0xe8, 0xbb, 0xdc, 0x4d, 0x1a, 0xbd, 0xbb, 0x08, 0x5d, 0xe2, 0x26, 0xfd, - 0xe2, 0x32, 0x74, 0x59, 0x9b, 0x0c, 0xde, 0x37, 0x0f, 0x20, 0x10, 0xef, 0xed, 0x4f, 0x5c, 0x89, - 0xfb, 0x53, 0x3a, 0xfb, 0xb0, 0x4e, 0x41, 0xba, 0x0d, 0x03, 0x5e, 0x6d, 0xc0, 0x7d, 0xc2, 0x11, - 0x69, 0xf7, 0x62, 0x3f, 0xe3, 0xcd, 0x66, 0x07, 0xf6, 0xca, 0x2a, 0x3f, 0x95, 0xd9, 0x3c, 0x0f, - 0x02, 0x4d, 0xc9, 0x34, 0xd6, 0x25, 0x29, 0x4d, 0x58, 0x36, 0x59, 0x8f, 0x82, 0xb5, 0x1f, 0x78, - 0x92, 0xc5, 0xc6, 0x29, 0xf6, 0x8d, 0x08, 0x87, 0x4e, 0x48, 0x39, 0xac, 0xa4, 0x33, 0x48, 0x98, - 0x37, 0x87, 0xa9, 0xdd, 0x8c, 0x7f, 0xd7, 0x45, 0x49, 0x1d, 0x8c, 0x63, 0x03, 0x2f, 0x6c, 0x07, - 0xff, 0xaa, 0x83, 0x73, 0x50, 0x51, 0xa6, 0x45, 0xbe, 0xf7, 0x8a, 0x4b, 0x50, 0xde, 0x7e, 0xc8, - 0x7f, 0xb9, 0x1c, 0xf9, 0x30, 0xd2, 0x52, 0x18, 0x69, 0x30, 0xca, 0xd4, 0x58, 0xab, 0xe7, 0xda, - 0x72, 0x17, 0xb8, 0x9d, 0x6b, 0xd4, 0x5b, 0xc2, 0x5f, 0xfa, 0xcd, 0x70, 0x38, 0xec, 0xec, 0x76, - 0x0f, 0xbe, 0x0b, 0x3b, 0x48, 0x15, 0x8e, 0xde, 0xc9, 0xc5, 0x8e, 0x17, 0xe2, 0xdf, 0x4b, 0xf9, - 0x77, 0x04, 0x5b, 0x38, 0x2e, 0x47, 0x2b, 0x4a, 0x38, 0x6c, 0x2b, 0xdf, 0xaf, 0x7f, 0x49, 0xf9, - 0xa2, 0x28, 0xda, 0xac, 0x7c, 0xd6, 0x97, 0xff, 0xa1, 0x1b, 0xd6, 0xee, 0xad, 0xcf, 0x22, 0x05, - 0xe9, 0xc4, 0xcc, 0x12, 0x18, 0x26, 0x7c, 0xab, 0x3f, 0x98, 0x77, 0x41, 0xf9, 0x63, 0xc3, 0xd7, - 0x67, 0xf1, 0x05, 0x49, 0x29, 0x9e, 0x3c, 0x41, 0x72, 0x0e, 0x82, 0x2b, 0xb4, 0x97, 0x4e, 0x09, - 0x03, 0x20, 0x5a, 0x53, 0xe8, 0xc3, 0x15, 0x93, 0x42, 0x67, 0x62, 0xd3, 0x08, 0xd9, 0x43, 0xb6, - 0xdf, 0x38, 0x34, 0x34, 0x73, 0xe5, 0x79, 0x80, 0x90, 0xae, 0x2c, 0x20, 0xeb, 0x29, 0xef, 0x7d, - 0x83, 0x40, 0xc9, 0x36, 0x16, 0x24, 0x4c, 0x05, 0x29, 0x30, 0x93, 0xb9, 0xd9, 0x44, 0x9c, 0x4c, - 0x86, 0xc3, 0x28, 0xf2, 0x0c, 0x86, 0xe6, 0x8a, 0x69, 0x96, 0x30, 0x0a, 0x66, 0x15, 0x0c, 0x22, - 0x3a, 0x98, 0x94, 0x8b, 0x4a, 0xaf, 0xa6, 0xab, 0xaa, 0x65, 0x47, 0x6e, 0x9f, 0x08, 0x49, 0xa7, - 0x07, 0x05, 0x1e, 0x8a, 0xc8, 0x13, 0x05, 0x50, 0xc4, 0x9c, 0xf9, 0x03, 0xfa, 0x6d, 0x15, 0xc4, - 0xb5, 0xa0, 0x57, 0x57, 0x43, 0xd8, 0xde, 0x52, 0x68, 0x8f, 0xf2, 0x16, 0x3a, 0x12, 0xfe, 0x8f, - 0x96, 0x2e, 0xd9, 0x5f, 0x43, 0x2d, 0x57, 0xeb, 0x0d, 0xe8, 0x8b, 0xd5, 0x05, 0xb9, 0x72, 0x86, - 0xd2, 0xdf, 0x8d, 0xd9, 0xc3, 0xc9, 0xe7, 0x74, 0x6d, 0x3e, 0xa5, 0xd7, 0xba, 0x04, 0xd4, 0xf2, - 0xf9, 0x75, 0x6d, 0x3e, 0xb7, 0x5e, 0xeb, 0x9a, 0x51, 0xcb, 0xe7, 0x1f, 0xcd, 0x7c, 0xfc, 0x39, - 0x8f, 0xf8, 0xb8, 0x6d, 0x66, 0x2c, 0x6a, 0xe9, 0x71, 0x32, 0x3b, 0xa3, 0xb4, 0xb6, 0x2f, 0x84, - 0x55, 0xd2, 0xb6, 0x2b, 0xc8, 0x83, 0xab, 0xfa, 0x9e, 0xd0, 0x37, 0x83, 0xe5, 0x1c, 0xa7, 0xad, - 0xf1, 0x2e, 0x23, 0x04, 0x8d, 0x73, 0x76, 0xeb, 0xc9, 0x5a, 0x25, 0x8e, 0xfa, 0xd8, 0x2c, 0x12, - 0x11, 0xd6, 0xc3, 0x2e, 0x91, 0x3b, 0xa1, 0x16, 0x36, 0x4a, 0x4a, 0x05, 0x56, 0x2f, 0x5f, 0xd5, - 0xaa, 0xf8, 0x9b, 0xeb, 0xa7, 0xab, 0x85, 0x81, 0xb0, 0x5d, 0xf2, 0xa9, 0x1a, 0x73, 0x44, 0xa8, - 0x3a, 0xf3, 0x57, 0x64, 0x04, 0x77, 0xf0, 0x89, 0x9a, 0x6d, 0x4c, 0xce, 0x8c, 0xf9, 0x72, 0x09, - 0x8b, 0x4e, 0x5b, 0xc3, 0x2c, 0x4c, 0x61, 0xd7, 0xa9, 0x7d, 0x13, 0xb6, 0x9b, 0x08, 0x65, 0x52, - 0x81, 0xc8, 0x57, 0xd0, 0x43, 0x3f, 0xa6, 0xb0, 0x6a, 0xfa, 0x88, 0x4a, 0xbe, 0x76, 0xc8, 0x10, - 0xef, 0x77, 0x6f, 0x0b, 0x93, 0x1a, 0x66, 0x45, 0x3f, 0x6f, 0xb5, 0xbf, 0x69, 0x51, 0x2a, 0x50, - 0xa7, 0x8e, 0x75, 0x49, 0x61, 0x08, 0xbd, 0x50, 0x2a, 0x16, 0xc0, 0xe9, 0x5e, 0x11, 0xe7, 0xe1, - 0x10, 0x3a, 0x21, 0x33, 0x41, 0x97, 0x14, 0x34, 0x4a, 0x52, 0x13, 0x34, 0xa2, 0xa0, 0x3b, 0xd8, - 0xdc, 0x6a, 0x0d, 0x46, 0x1f, 0x51, 0xc7, 0xfa, 0xf0, 0x91, 0xf8, 0xd3, 0xa7, 0xb3, 0x90, 0xfe, - 0x3b, 0x5b, 0x2c, 0xe4, 0xb1, 0x37, 0x32, 0x10, 0x50, 0xec, 0xe4, 0x13, 0x37, 0x4e, 0x7e, 0x56, - 0x3f, 0xd6, 0x76, 0xec, 0xad, 0xc3, 0x14, 0x5d, 0xc3, 0xdb, 0x8f, 0x04, 0xc6, 0xe3, 0xca, 0xb6, - 0x4b, 0x3b, 0xfa, 0x40, 0x71, 0x5d, 0x7d, 0xb8, 0x4c, 0xff, 0xd4, 0x89, 0x08, 0x83, 0x8c, 0x9e, - 0x23, 0x37, 0x4f, 0xfc, 0xf4, 0x29, 0x0e, 0xf1, 0xa7, 0xa8, 0x1f, 0x7e, 0x48, 0x7a, 0xe7, 0x4b, - 0x39, 0xde, 0xc5, 0x1e, 0x5e, 0x5b, 0xf0, 0x6d, 0x94, 0x4f, 0x2f, 0x02, 0xc9, 0x32, 0xf1, 0x71, - 0x2d, 0x95, 0x94, 0x3e, 0xaf, 0x7f, 0xfe, 0xe9, 0x04, 0x8b, 0x5b, 0x04, 0x6c, 0x12, 0x79, 0x8b, - 0xeb, 0x0d, 0x2f, 0xf7, 0x22, 0xa4, 0xbb, 0x33, 0x4f, 0xef, 0xaf, 0x71, 0x0c, 0xb5, 0xb3, 0x75, - 0x0f, 0xc7, 0xcc, 0xd4, 0x8d, 0x11, 0x25, 0xb6, 0xe9, 0xa0, 0x41, 0xb2, 0x8a, 0x57, 0x66, 0x82, - 0xb8, 0x8d, 0x0e, 0x96, 0xde, 0x2c, 0x58, 0x22, 0xbe, 0x1a, 0xdb, 0xe2, 0x30, 0x12, 0xcb, 0xfc, - 0x37, 0x2e, 0xa0, 0xb2, 0x9c, 0xf8, 0xcc, 0xdc, 0x44, 0xc8, 0x48, 0x74, 0x39, 0xad, 0xae, 0x6e, - 0x46, 0x68, 0xea, 0x7f, 0xfa, 0x72, 0x5a, 0x8c, 0xf3, 0x3c, 0xff, 0x3c, 0x15, 0x4f, 0x91, 0xc4, - 0x0a, 0x9a, 0xe5, 0xf3, 0x14, 0x2d, 0x0e, 0x16, 0x78, 0x37, 0x69, 0xba, 0x0a, 0xe9, 0xcd, 0xf7, - 0xaf, 0xc6, 0x3b, 0x49, 0xf7, 0x45, 0x70, 0xb4, 0x8f, 0x18, 0xb0, 0x3e, 0x7e, 0x36, 0x08, 0xaf, - 0xc6, 0x47, 0x3d, 0xf5, 0xb8, 0x1f, 0xe1, 0x6e, 0xf8, 0xec, 0x59, 0x92, 0x5c, 0x8d, 0x29, 0x64, - 0x27, 0xd9, 0xc7, 0x90, 0xe8, 0x85, 0x15, 0x02, 0x19, 0x28, 0x01, 0x10, 0xf1, 0xc5, 0x02, 0x47, - 0xb5, 0x3a, 0xbf, 0x2a, 0xd1, 0xcf, 0xf4, 0x6a, 0xbc, 0x08, 0x3b, 0x88, 0xe6, 0x16, 0x76, 0x0e, - 0xa2, 0xef, 0x90, 0xc6, 0x37, 0xfc, 0xa1, 0x2b, 0x51, 0xc4, 0x41, 0x68, 0x2c, 0x1c, 0x44, 0x61, - 0x08, 0xf8, 0x85, 0xac, 0xb3, 0x6c, 0x3c, 0xc6, 0xf7, 0xce, 0x1a, 0x49, 0xda, 0x1e, 0x68, 0x62, - 0x5e, 0x20, 0x59, 0xa5, 0x3a, 0x62, 0xb9, 0x3a, 0x67, 0xfb, 0x1f, 0x22, 0xe6, 0xec, 0x64, 0x5a, - 0x5c, 0x77, 0x7e, 0x11, 0xa3, 0x3c, 0x97, 0x9a, 0xb5, 0xcf, 0xdf, 0x07, 0x41, 0xbe, 0x41, 0xed, - 0x54, 0x88, 0x49, 0xa2, 0x71, 0x08, 0x95, 0x01, 0x47, 0x15, 0xf9, 0xd4, 0x45, 0x41, 0x06, 0x19, - 0xa4, 0x74, 0x97, 0xf2, 0xa2, 0xe4, 0x32, 0xaa, 0x3a, 0x9c, 0x06, 0x7f, 0xb2, 0xb4, 0xfc, 0x65, - 0x53, 0xd8, 0x53, 0xa2, 0x2f, 0x54, 0x65, 0x08, 0x97, 0x64, 0x37, 0xa9, 0x67, 0x47, 0x6d, 0xaa, - 0x4f, 0xba, 0xbd, 0xbe, 0xed, 0xd3, 0x36, 0x67, 0x17, 0x8a, 0x88, 0xcf, 0xb2, 0x35, 0x63, 0xb9, - 0x74, 0x95, 0x3a, 0x5b, 0x30, 0xde, 0x24, 0x9f, 0xbd, 0x31, 0xf6, 0x46, 0x3e, 0x4b, 0xae, 0xef, - 0x42, 0x2b, 0x00, 0xd2, 0xff, 0x8b, 0xac, 0x1c, 0x56, 0x94, 0x8f, 0xc9, 0xf5, 0x95, 0x8d, 0xdb, - 0xdf, 0x75, 0x5c, 0xbf, 0x6c, 0xff, 0x38, 0x79, 0x86, 0xbe, 0xdc, 0x1b, 0x8f, 0x8c, 0x32, 0x12, - 0xfc, 0xf6, 0x35, 0xac, 0xd3, 0x36, 0xd6, 0xf4, 0xcc, 0x0a, 0x77, 0x89, 0x22, 0x88, 0x50, 0xec, - 0xb4, 0xca, 0x0b, 0x10, 0x76, 0x71, 0xde, 0x1e, 0x57, 0xe2, 0xda, 0xf7, 0xee, 0x52, 0x22, 0xb5, - 0xb8, 0xf7, 0xa4, 0x5b, 0x19, 0xca, 0x7a, 0x6c, 0x0c, 0xb1, 0x0c, 0xa2, 0x15, 0xf3, 0xae, 0xa0, - 0x4f, 0xda, 0x2d, 0x5d, 0xd6, 0xc0, 0x3f, 0x86, 0x89, 0xcd, 0x7c, 0x11, 0xde, 0xcc, 0xb8, 0x73, - 0x90, 0xeb, 0xd2, 0xb7, 0xe5, 0xc2, 0x85, 0x13, 0x6f, 0xbe, 0x08, 0x2f, 0xf5, 0xd1, 0x1b, 0x57, - 0x22, 0x0a, 0x25, 0xd8, 0xae, 0x55, 0xcc, 0xb2, 0x51, 0xcc, 0xb0, 0x86, 0xe9, 0x3c, 0x9f, 0xc5, - 0x76, 0xc6, 0xe1, 0xad, 0x8d, 0x47, 0x0b, 0x0f, 0x8b, 0xa6, 0xa6, 0x1d, 0x0a, 0x87, 0xc7, 0x4a, - 0x84, 0x3f, 0xfc, 0xe0, 0x1c, 0x7b, 0xd5, 0x0b, 0x46, 0x2b, 0x73, 0x1b, 0x9e, 0x33, 0x7c, 0xf8, - 0x7e, 0x30, 0x23, 0xdd, 0x61, 0x47, 0x04, 0xee, 0x8a, 0xfb, 0x15, 0xe8, 0xce, 0x36, 0xac, 0xf3, - 0x86, 0x58, 0xcd, 0x25, 0x1a, 0xed, 0xec, 0xf6, 0x75, 0x4f, 0x57, 0xa0, 0xb5, 0x9d, 0x46, 0x82, - 0x5e, 0x82, 0x3c, 0xd0, 0xd3, 0x66, 0x50, 0x37, 0xfd, 0x35, 0x2a, 0xbf, 0xd3, 0x85, 0xea, 0x2f, - 0xc2, 0x83, 0x08, 0xd6, 0x6a, 0x7f, 0x1d, 0x18, 0xb1, 0xb5, 0x21, 0x22, 0x50, 0x36, 0xe1, 0x13, - 0xe9, 0xa1, 0x29, 0x96, 0xeb, 0x62, 0x1a, 0xd5, 0x02, 0x6d, 0xfe, 0x52, 0xc8, 0xa9, 0x3b, 0xf6, - 0x6a, 0x5c, 0x0b, 0x09, 0x8f, 0xba, 0x9a, 0xd6, 0x73, 0x9a, 0x78, 0x33, 0x72, 0xd1, 0x84, 0x9d, - 0xad, 0x02, 0x95, 0xa2, 0xdb, 0x9f, 0x1e, 0x6a, 0xc0, 0x9e, 0xa9, 0xa2, 0x5b, 0xc8, 0x92, 0xf2, - 0xd3, 0xf4, 0x2c, 0x4c, 0x37, 0xa4, 0xc1, 0x04, 0xf5, 0xff, 0x9f, 0xb3, 0x99, 0x28, 0x5e, 0x0d, - 0x11, 0x5d, 0xbd, 0x9f, 0xd5, 0x4a, 0x9f, 0x6a, 0x53, 0xba, 0xac, 0x82, 0x1b, 0x1f, 0x59, 0x24, - 0x95, 0xfb, 0x31, 0xf4, 0xb2, 0x45, 0x7c, 0x98, 0x8a, 0x61, 0xc6, 0x38, 0xea, 0x6d, 0xf0, 0x22, - 0x72, 0xfe, 0x0a, 0x92, 0x0b, 0xa6, 0xf9, 0x4d, 0xe9, 0x36, 0xa1, 0x52, 0x79, 0x90, 0x7b, 0xc2, - 0x76, 0x38, 0xc6, 0x4c, 0xb0, 0xab, 0xde, 0xa0, 0xf0, 0x40, 0x9b, 0x3b, 0xff, 0xf2, 0xe8, 0xc4, - 0x19, 0x55, 0x16, 0x6f, 0x72, 0x4f, 0xbe, 0xef, 0x68, 0x72, 0x44, 0x96, 0xc1, 0x4c, 0x75, 0xce, - 0x1e, 0x82, 0xb3, 0x30, 0x3f, 0xc7, 0x34, 0xad, 0x88, 0x4f, 0xa3, 0xa5, 0xb9, 0xf9, 0xe4, 0x9a, - 0xae, 0x81, 0xa8, 0x2b, 0x9e, 0x67, 0x4d, 0x76, 0x2a, 0x75, 0x70, 0xdd, 0x75, 0xe4, 0x7d, 0xca, - 0xf6, 0xed, 0xbd, 0xa2, 0xbe, 0x11, 0x36, 0x0f, 0x61, 0xa5, 0xb8, 0x6e, 0x95, 0x63, 0xbe, 0xd2, - 0x18, 0xa3, 0x33, 0x5d, 0x57, 0x9d, 0xf1, 0xc0, 0xf0, 0xae, 0x4e, 0xd2, 0x2a, 0x7e, 0x74, 0x1b, - 0x7c, 0x6d, 0x2d, 0x2b, 0xa8, 0x65, 0xa5, 0xdd, 0x31, 0x4c, 0x6d, 0x9d, 0xd9, 0x80, 0x30, 0xaf, - 0xc3, 0xea, 0x65, 0x61, 0xe4, 0xf0, 0x10, 0xb9, 0x39, 0x0d, 0x82, 0x14, 0xb6, 0x81, 0x7b, 0xb1, - 0x5d, 0xe0, 0x25, 0x9d, 0x40, 0x8d, 0x52, 0x7a, 0xea, 0xb3, 0x86, 0x9c, 0xe1, 0xd1, 0x5f, 0x96, - 0x90, 0x78, 0x4d, 0xe1, 0xc9, 0xa7, 0xec, 0x0c, 0x59, 0x64, 0xfc, 0x8a, 0xe3, 0xc9, 0x4c, 0x83, - 0xc3, 0x32, 0xd0, 0x10, 0x5f, 0x20, 0x44, 0xa5, 0x87, 0xe5, 0x6e, 0xd5, 0x4f, 0x61, 0xe8, 0x73, - 0x2c, 0xda, 0x6c, 0x04, 0xdf, 0x05, 0xda, 0xed, 0x32, 0xb5, 0x56, 0xa3, 0x10, 0x16, 0x06, 0x7f, - 0x30, 0xcf, 0x1c, 0x50, 0x7e, 0xb7, 0x38, 0x55, 0x81, 0xa5, 0xb1, 0x10, 0xf8, 0xed, 0x42, 0x59, - 0x00, 0x46, 0x6e, 0xd9, 0xea, 0xe5, 0xb2, 0x22, 0xca, 0xe2, 0xd9, 0x37, 0x7e, 0xb0, 0x94, 0xa6, - 0x51, 0xb5, 0xb3, 0xa9, 0xa5, 0xd9, 0xb0, 0xc3, 0xbe, 0xf4, 0xa1, 0xb6, 0xbc, 0xf5, 0x73, 0xa9, - 0xef, 0x49, 0x5d, 0x71, 0x26, 0x9d, 0xb7, 0x6b, 0x7c, 0xd1, 0xd0, 0xa2, 0x8e, 0xb1, 0xb9, 0x6c, - 0x35, 0x36, 0x5b, 0x0c, 0xc4, 0x02, 0x3a, 0xbe, 0x72, 0x49, 0x9d, 0x55, 0x2c, 0x7d, 0x4b, 0x86, - 0xf7, 0xd5, 0x96, 0x3b, 0x02, 0x26, 0x46, 0x28, 0x8e, 0xa8, 0x3b, 0x55, 0x67, 0x63, 0x91, 0xeb, - 0xa9, 0x8c, 0x3f, 0x92, 0x49, 0x87, 0x40, 0xc5, 0xfa, 0x48, 0x3c, 0x0b, 0x06, 0xea, 0xce, 0x5e, - 0x76, 0x96, 0xcc, 0xe4, 0x0f, 0x7d, 0x9a, 0x11, 0x9a, 0x31, 0xa8, 0x63, 0x11, 0x36, 0x37, 0x74, - 0xa1, 0x0e, 0x90, 0xf0, 0x3d, 0x81, 0xc1, 0x0a, 0xd2, 0x61, 0x89, 0x81, 0xd9, 0xca, 0x08, 0x39, - 0xc7, 0x8e, 0x41, 0x2c, 0x0a, 0xf5, 0xbc, 0x10, 0x3f, 0xdc, 0xc9, 0x08, 0x81, 0x8f, 0xd4, 0xfd, - 0x1f, 0xe9, 0xe5, 0x6e, 0xc9, 0x64, 0x7c, 0x7d, 0x28, 0x23, 0x66, 0x3c, 0xeb, 0xc2, 0x50, 0xa6, - 0x18, 0x85, 0x96, 0xa6, 0x30, 0x5e, 0xc0, 0xb3, 0xe9, 0xaf, 0x20, 0xd7, 0x43, 0x80, 0x3a, 0x54, - 0xc9, 0xec, 0x73, 0xde, 0x24, 0x45, 0x1b, 0x7f, 0xda, 0x3c, 0xee, 0x94, 0x50, 0xe1, 0x9c, 0xa0, - 0x76, 0x38, 0xce, 0xfc, 0x10, 0x74, 0x53, 0x25, 0x5b, 0x7a, 0xa4, 0xd2, 0xb8, 0x5b, 0xc5, 0x08, - 0x27, 0x16, 0xdd, 0xfb, 0x92, 0x1a, 0x78, 0xde, 0x66, 0xa7, 0x34, 0x8b, 0xea, 0x4f, 0x5c, 0x8f, - 0xb2, 0x8c, 0xf1, 0x19, 0xad, 0x88, 0xc6, 0x18, 0xdf, 0xf0, 0xfd, 0x19, 0xa5, 0x37, 0x85, 0xdf, - 0x4a, 0x8a, 0xd7, 0x7c, 0x63, 0xbb, 0xe3, 0xf0, 0xdb, 0x05, 0x23, 0x5b, 0xfc, 0xef, 0xab, 0x26, - 0xc1, 0x92, 0x1a, 0xb7, 0x48, 0x73, 0x1c, 0xbe, 0x4f, 0x9e, 0xd1, 0x2c, 0x9c, 0x52, 0x49, 0x40, - 0x40, 0xbe, 0x8f, 0x24, 0xf7, 0x08, 0x55, 0xee, 0x94, 0xce, 0x1b, 0x65, 0xab, 0xf7, 0xad, 0xd2, - 0x33, 0x77, 0xc7, 0x5c, 0xab, 0x0c, 0x12, 0x5e, 0xe3, 0x43, 0x7e, 0x03, 0xbd, 0x54, 0x0e, 0xea, - 0x01, 0x48, 0x3a, 0x23, 0x2c, 0x23, 0xeb, 0xb0, 0x3c, 0x2e, 0x72, 0x42, 0xb9, 0xc3, 0x5c, 0xd4, - 0x92, 0xc8, 0xdc, 0x99, 0xc2, 0x66, 0xcc, 0x24, 0x21, 0x45, 0x93, 0x49, 0x96, 0xbf, 0x81, 0x3a, - 0xe9, 0x7b, 0x90, 0x56, 0x9f, 0x88, 0x83, 0xfc, 0xaf, 0xa8, 0x49, 0x6d, 0x69, 0x7c, 0xfc, 0x59, - 0xed, 0x63, 0xb3, 0x31, 0x72, 0x0f, 0xa8, 0x15, 0x09, 0x56, 0xaf, 0x61, 0x71, 0x29, 0xac, 0x69, - 0x4c, 0xcb, 0xbe, 0x0c, 0x74, 0x77, 0x5c, 0x1d, 0xa5, 0x6f, 0xcf, 0xf5, 0x2c, 0xa7, 0x36, 0xf7, - 0x82, 0x87, 0x07, 0xbb, 0x1a, 0x55, 0xed, 0xb9, 0x84, 0x67, 0x1f, 0x1a, 0x53, 0x35, 0x15, 0xe4, - 0x86, 0x16, 0xec, 0x7f, 0xe9, 0x86, 0xbd, 0x7c, 0xf3, 0xe3, 0xab, 0xf7, 0xbe, 0x57, 0x0d, 0x47, - 0x63, 0x16, 0x46, 0x41, 0x3f, 0xe7, 0x5e, 0x38, 0x93, 0x23, 0xeb, 0x43, 0x3e, 0x0b, 0xff, 0xf7, - 0x55, 0xdb, 0x55, 0x26, 0x39, 0xbc, 0xb6, 0x7c, 0xd5, 0x37, 0x51, 0xe0, 0x80, 0xf4, 0xd1, 0xd8, - 0xe7, 0xfa, 0x73, 0x8c, 0x27, 0x4f, 0x6a, 0xed, 0xd0, 0x2c, 0x56, 0x52, 0xed, 0xde, 0x23, 0xdd, - 0x29, 0x1d, 0x35, 0x91, 0x88, 0x5a, 0x22, 0x29, 0xdd, 0x8e, 0x9f, 0x7d, 0x5f, 0x3e, 0xbd, 0xfb, - 0x0d, 0xa4, 0xda, 0xfc, 0xed, 0xf4, 0x5e, 0x5c, 0x20, 0xbe, 0x66, 0xb4, 0x85, 0x6b, 0xac, 0xcf, - 0xc5, 0x3d, 0x8a, 0x08, 0xb3, 0x2b, 0xd0, 0x01, 0x87, 0xc4, 0xae, 0x8c, 0x01, 0xe9, 0xd1, 0x5e, - 0xb7, 0x07, 0x62, 0xcb, 0x26, 0x55, 0x05, 0x15, 0x86, 0x5b, 0x06, 0xf2, 0x81, 0x5a, 0xb3, 0xd4, - 0x45, 0xae, 0x50, 0x39, 0x88, 0x6b, 0xd5, 0x17, 0xdf, 0xdb, 0xdd, 0x9d, 0x7a, 0x21, 0xa7, 0xdb, - 0x45, 0x28, 0xf2, 0x34, 0xe9, 0xee, 0xa6, 0xca, 0xce, 0x36, 0x44, 0xc1, 0xeb, 0x73, 0x29, 0x8b, - 0x00, 0x52, 0xc4, 0xb2, 0x3c, 0x26, 0x5e, 0x98, 0x06, 0x9b, 0xb6, 0x6b, 0x17, 0x32, 0x92, 0x33, - 0xc2, 0x76, 0xe4, 0x22, 0x18, 0xfe, 0xf9, 0xdd, 0x6f, 0x89, 0xd4, 0xc9, 0x69, 0xf9, 0x20, 0x8c, - 0xee, 0xbe, 0xa5, 0x61, 0xd3, 0x55, 0x45, 0xd9, 0xc0, 0x0c, 0xc0, 0xdc, 0x2f, 0x5f, 0xe5, 0x29, - 0x16, 0x02, 0xbf, 0x22, 0x19, 0xcc, 0x42, 0x15, 0x36, 0x52, 0x36, 0x66, 0x5a, 0x5f, 0x9c, 0x74, - 0x32, 0xa6, 0x24, 0x51, 0x80, 0xda, 0x3f, 0x33, 0xc9, 0x90, 0x03, 0x5a, 0x65, 0x25, 0xe9, 0x46, - 0xa8, 0xa7, 0x61, 0x85, 0x40, 0xa5, 0xeb, 0x2e, 0xb9, 0xfb, 0xad, 0xc1, 0x47, 0xc2, 0x11, 0x18, - 0xd7, 0x97, 0x50, 0xe8, 0x28, 0xe0, 0x65, 0x22, 0x07, 0xc9, 0xcb, 0xb0, 0x5d, 0xe3, 0x9b, 0x8d, - 0xaf, 0xbd, 0x50, 0x46, 0x41, 0x0f, 0x06, 0xfa, 0x05, 0xf9, 0xe3, 0x56, 0xd9, 0x7b, 0xf6, 0xe4, - 0x89, 0x4a, 0x4d, 0x86, 0x42, 0x65, 0x8e, 0xc4, 0x1b, 0xaa, 0xd0, 0x5c, 0xfc, 0xee, 0xc9, 0x13, - 0x88, 0x0d, 0x91, 0xf7, 0xf1, 0xc7, 0x61, 0xb7, 0x77, 0x10, 0x0d, 0x7a, 0xfb, 0x51, 0xdc, 0x7b, - 0x0e, 0x3b, 0xcc, 0x16, 0x96, 0x04, 0x43, 0x29, 0x2f, 0x2a, 0x3b, 0xfd, 0x7e, 0x78, 0x30, 0x5f, - 0xa0, 0x50, 0x7e, 0xc0, 0xf9, 0x85, 0xb6, 0x26, 0xe8, 0x79, 0xbe, 0xe1, 0x5a, 0x1f, 0x09, 0x6a, - 0x5f, 0xe3, 0x6b, 0x8e, 0x27, 0x50, 0x76, 0x1b, 0x97, 0x9f, 0xcb, 0x63, 0xc3, 0xf2, 0xdb, 0x8d, - 0xcf, 0x23, 0x87, 0xe9, 0xea, 0x12, 0x55, 0x74, 0x73, 0x13, 0x04, 0x1a, 0x02, 0xe2, 0x0d, 0xbc, - 0x08, 0x75, 0xc7, 0x9b, 0x2a, 0xf7, 0x1e, 0xd1, 0x89, 0x7a, 0x5c, 0xf2, 0x65, 0x6e, 0x55, 0x0e, - 0xb4, 0x3e, 0x41, 0x6e, 0xcf, 0xf0, 0x8f, 0x8d, 0x7f, 0x20, 0x60, 0x61, 0x7a, 0x2d, 0x04, 0xba, - 0x67, 0xef, 0xed, 0xed, 0xb1, 0x53, 0xc7, 0x96, 0x62, 0x47, 0xd2, 0x26, 0x1b, 0xcd, 0xae, 0x0e, - 0xbb, 0xd2, 0xd5, 0x74, 0x02, 0x5a, 0x21, 0x5f, 0x32, 0x01, 0x9d, 0x93, 0x1c, 0xf3, 0xf8, 0x57, - 0x19, 0x04, 0x36, 0xe8, 0xd1, 0x14, 0x46, 0x72, 0x20, 0xdf, 0x20, 0x9c, 0xc0, 0x80, 0x56, 0xda, - 0x87, 0x07, 0x57, 0x51, 0x15, 0xe1, 0x1c, 0x42, 0xc9, 0x61, 0x22, 0xb4, 0x4a, 0x03, 0x61, 0x21, - 0xa5, 0x0a, 0xe2, 0xd6, 0xf8, 0x04, 0x6b, 0xa0, 0x2d, 0x60, 0x8d, 0x6a, 0x2c, 0x78, 0x0e, 0x2d, - 0x9d, 0xa5, 0x99, 0x17, 0xc2, 0x18, 0x97, 0xd3, 0x0b, 0x76, 0x5e, 0xd2, 0x11, 0x70, 0xb2, 0x8a, - 0x0c, 0x8f, 0xb1, 0x78, 0x50, 0x79, 0x44, 0x88, 0x41, 0x7d, 0x0f, 0xf9, 0x34, 0x63, 0x5d, 0xe7, - 0xe8, 0xec, 0x97, 0xdf, 0x41, 0x66, 0x38, 0xa1, 0x43, 0x14, 0x1c, 0x5a, 0x23, 0x56, 0xb8, 0x4b, - 0x31, 0xff, 0xc0, 0x9a, 0x98, 0x94, 0x25, 0x68, 0xe6, 0x5e, 0x88, 0x6b, 0xec, 0x9a, 0x78, 0x37, - 0xb3, 0x75, 0xd1, 0xe8, 0xc3, 0x20, 0x84, 0x99, 0x78, 0xff, 0x75, 0xf8, 0x14, 0xd6, 0xc1, 0xe9, - 0xac, 0x3a, 0xea, 0x1c, 0x3e, 0x45, 0x4e, 0x29, 0xfc, 0x7b, 0x55, 0x5d, 0xa7, 0x47, 0x9d, 0xff, - 0x03, 0x7f, 0x28, 0x02, 0xca, 0x46, 0x8e, 0x01, 0x00 + 0x4d, 0x34, 0xcb, 0xe7, 0x37, 0x98, 0xd5, 0xc7, 0x00, 0xe6, 0x74, 0xa8, 0xf4, 0xd5, 0x4e, 0x7a, + 0xe0, 0x0c, 0xdd, 0x93, 0x80, 0x25, 0x4b, 0x61, 0x2d, 0x74, 0xf8, 0xb2, 0xc0, 0xce, 0xfe, 0x31, + 0x80, 0x3a, 0x30, 0x9f, 0x9f, 0x84, 0x26, 0x5b, 0x56, 0xfe, 0x7d, 0x68, 0xdc, 0x85, 0x66, 0xef, + 0x02, 0xdf, 0xac, 0xeb, 0x23, 0x4d, 0x93, 0x10, 0x30, 0xad, 0xe5, 0xc0, 0x76, 0xd7, 0x27, 0x69, + 0x8b, 0x0c, 0x8d, 0x31, 0x39, 0x72, 0xc8, 0x30, 0x21, 0x4e, 0x34, 0x82, 0xa4, 0x31, 0x15, 0x93, + 0xb0, 0x1f, 0xbe, 0x8e, 0x88, 0xed, 0x1c, 0xdb, 0x86, 0x9e, 0x98, 0x59, 0x43, 0x04, 0xba, 0xfa, + 0x45, 0x0e, 0x7f, 0x86, 0x96, 0xa7, 0x24, 0x29, 0x57, 0x94, 0x25, 0x3e, 0x01, 0xbb, 0x83, 0x11, + 0xae, 0x2d, 0x1f, 0x22, 0xa5, 0xfa, 0xfc, 0xe6, 0x12, 0xde, 0x13, 0x59, 0x04, 0x7b, 0x20, 0x4c, + 0x76, 0x1c, 0x5b, 0xe4, 0x0f, 0x4c, 0x62, 0xec, 0xdb, 0xbd, 0xa9, 0x18, 0xb7, 0x09, 0x74, 0x19, + 0xeb, 0xc2, 0xaf, 0x8d, 0xb8, 0xdb, 0xc0, 0x1a, 0x6b, 0x50, 0x18, 0xba, 0x27, 0x2d, 0x4b, 0xf9, + 0x8c, 0xdb, 0x2c, 0x3a, 0x22, 0xfc, 0xfb, 0x3c, 0x87, 0x39, 0xc4, 0xae, 0x60, 0x39, 0x5e, 0x01, + 0xa9, 0x7f, 0xd4, 0x4d, 0x88, 0xcc, 0xfd, 0xd1, 0x16, 0x93, 0x69, 0x0a, 0x18, 0x7e, 0xcd, 0x18, + 0x3f, 0x6d, 0x0c, 0x19, 0x0a, 0x6c, 0x26, 0xac, 0x95, 0xb6, 0x36, 0xb2, 0xea, 0xdf, 0x96, 0x16, + 0x67, 0xd3, 0xeb, 0xd7, 0xf8, 0x9f, 0x65, 0x64, 0x1c, 0xd5, 0x2d, 0x05, 0x88, 0x1d, 0x91, 0x25, + 0x44, 0x74, 0x85, 0xc3, 0x21, 0xb8, 0xcc, 0x20, 0xec, 0xde, 0xee, 0x1d, 0x4c, 0x7a, 0x3c, 0x31, + 0x4a, 0x0d, 0x2e, 0x9a, 0xfe, 0x41, 0x8e, 0xb8, 0xff, 0xf0, 0xff, 0x0f, 0x2f, 0x0c, 0x94, 0x6e, + 0x3b, 0x44, 0xc7, 0x2e, 0xe6, 0x3c, 0x58, 0xd8, 0x7b, 0x30, 0xa0, 0xa0, 0xcc, 0x25, 0xaa, 0xfb, + 0x1e, 0x58, 0xcc, 0x07, 0x93, 0xde, 0xf6, 0xa0, 0xd3, 0x96, 0xdd, 0xcf, 0x37, 0xca, 0xb5, 0x30, + 0xd5, 0xd2, 0x32, 0x6d, 0x63, 0xea, 0x4a, 0x55, 0x3d, 0xcd, 0xa9, 0x8b, 0x7e, 0xd1, 0x90, 0xb5, + 0x83, 0x75, 0xb0, 0x3f, 0xf5, 0xe8, 0x20, 0x6c, 0x9b, 0xf0, 0x5d, 0x3b, 0x51, 0xa6, 0xf2, 0xc6, + 0xed, 0x0d, 0xd8, 0x45, 0x7b, 0x00, 0xa6, 0xbc, 0x2b, 0x0a, 0x8b, 0x40, 0x0a, 0x94, 0x0a, 0x00, + 0xd2, 0x72, 0x2e, 0x57, 0x5a, 0x0a, 0xe7, 0x1a, 0x0f, 0x28, 0x2d, 0xc9, 0xdb, 0x23, 0xfe, 0x32, + 0x94, 0x6b, 0x51, 0x30, 0x03, 0x28, 0xb3, 0xb1, 0x50, 0x52, 0x00, 0x2b, 0x85, 0x9c, 0x0f, 0xe0, + 0xda, 0x2a, 0x4c, 0xd2, 0x92, 0x9f, 0x00, 0x70, 0xed, 0xf3, 0x78, 0x0c, 0x00, 0xcc, 0x2d, 0x01, + 0x10, 0x96, 0x4b, 0xa5, 0x94, 0xff, 0xdc, 0x54, 0xd3, 0x82, 0x2b, 0x01, 0x5c, 0xfb, 0xab, 0x13, + 0x1d, 0x00, 0x78, 0x67, 0x2c, 0x27, 0xc7, 0x4a, 0x39, 0x5f, 0xf8, 0x1c, 0x84, 0x58, 0xf0, 0x7f, + 0x8c, 0x14, 0xf7, 0x61, 0x6f, 0x5b, 0x36, 0xcd, 0xd0, 0x73, 0xf1, 0x73, 0x74, 0x48, 0x4b, 0xfe, + 0x53, 0x74, 0x18, 0x3d, 0xeb, 0xa3, 0x0c, 0x41, 0x8e, 0x31, 0xe3, 0x45, 0x99, 0x2f, 0x7f, 0x38, + 0xbf, 0xc6, 0x0b, 0xde, 0x30, 0x48, 0xf2, 0x4e, 0x3c, 0xd9, 0x3b, 0x9f, 0x2b, 0x7e, 0x7c, 0xec, + 0xce, 0x6b, 0x32, 0xee, 0x71, 0xa1, 0x49, 0xd0, 0x0a, 0xb6, 0xd2, 0x16, 0x48, 0xcb, 0xb8, 0x66, + 0xd2, 0xcf, 0x9c, 0xc5, 0xff, 0xa3, 0xb6, 0xd2, 0x4f, 0x1e, 0xc5, 0x33, 0x1b, 0x62, 0x30, 0x2e, + 0x2a, 0x03, 0x04, 0xe8, 0x0d, 0x59, 0x15, 0x5d, 0xb9, 0xc0, 0xc6, 0x61, 0xc5, 0x19, 0x15, 0x39, + 0xf4, 0x64, 0xff, 0xe2, 0x04, 0xf1, 0xf3, 0x43, 0x41, 0xa0, 0xf2, 0x37, 0x93, 0x3b, 0xe5, 0xca, + 0xa7, 0x27, 0x28, 0x00, 0xe0, 0x08, 0x37, 0x27, 0x5b, 0x75, 0xde, 0x62, 0x0f, 0x89, 0xb8, 0x49, + 0xf2, 0x0b, 0xfe, 0x55, 0x9f, 0x09, 0xf9, 0x7f, 0xad, 0xcf, 0xc4, 0x32, 0xdb, 0x37, 0x8f, 0x75, + 0x8a, 0xb9, 0xac, 0x3f, 0x51, 0xaa, 0x37, 0xb4, 0xa5, 0x07, 0xe7, 0xb4, 0x56, 0x2e, 0x7a, 0x2a, + 0xe0, 0x6e, 0x3d, 0x2b, 0x67, 0x2c, 0xe4, 0x8f, 0xf5, 0x17, 0x8f, 0x61, 0x9a, 0xd9, 0xd8, 0x13, + 0x2a, 0xfe, 0x24, 0x61, 0x64, 0x3b, 0xc6, 0x90, 0xda, 0x5a, 0xfe, 0xda, 0xd2, 0x59, 0x8b, 0x77, + 0x78, 0xf8, 0x2b, 0x56, 0x75, 0x77, 0x3e, 0xd6, 0xfe, 0xf6, 0x84, 0x44, 0xe6, 0x23, 0x07, 0x74, + 0xcc, 0xc6, 0x23, 0x64, 0x57, 0x4f, 0x44, 0x3e, 0xb2, 0x68, 0xb8, 0x79, 0x58, 0x5b, 0x3d, 0x11, + 0x9e, 0xbb, 0xd6, 0x5f, 0x64, 0x62, 0xcd, 0xdc, 0x07, 0x1c, 0xcc, 0x9d, 0x87, 0xdc, 0x3f, 0xc3, + 0xc3, 0xe4, 0xff, 0x41, 0x0e, 0xf6, 0x89, 0x89, 0xc8, 0x8b, 0x5b, 0xee, 0x3c, 0xe4, 0x56, 0xcf, + 0x43, 0xe1, 0x6f, 0x2f, 0x08, 0x99, 0x94, 0xff, 0xd6, 0x82, 0xc8, 0x7f, 0x72, 0x41, 0xe4, 0x3f, + 0xb3, 0x20, 0xf2, 0xd9, 0xff, 0xad, 0xd7, 0x43, 0x21, 0x58, 0x0f, 0xf9, 0x65, 0xf3, 0xd0, 0x9b, + 0x1a, 0x66, 0xa0, 0xc3, 0xb8, 0x77, 0xb3, 0xa9, 0x9e, 0x16, 0x92, 0xab, 0x20, 0x43, 0x8e, 0x8a, + 0x54, 0x06, 0x27, 0x3c, 0xc7, 0x7b, 0x18, 0xba, 0xc6, 0xb6, 0x0f, 0x38, 0x2a, 0xb4, 0xed, 0xee, + 0x85, 0x5b, 0x4d, 0xda, 0x70, 0xb0, 0x78, 0x83, 0xe9, 0xa3, 0x5d, 0x5e, 0xf8, 0xde, 0x73, 0x9c, + 0x3c, 0x14, 0x9a, 0xbd, 0x0b, 0x3a, 0x80, 0x44, 0x56, 0xa2, 0xa7, 0x82, 0xee, 0x55, 0xac, 0xbf, + 0x24, 0xaa, 0xad, 0x85, 0x47, 0x9d, 0x8d, 0x08, 0x69, 0x1f, 0x0e, 0x3a, 0x5f, 0x68, 0x73, 0x83, + 0x5e, 0x5b, 0x36, 0x4d, 0xde, 0xa0, 0xb3, 0xde, 0xa0, 0x73, 0x4b, 0x07, 0x9d, 0x13, 0x17, 0x65, + 0xfd, 0xb8, 0x41, 0xe7, 0x3e, 0x3d, 0xe8, 0xb5, 0x55, 0x22, 0x34, 0x40, 0x96, 0xfb, 0x2b, 0x83, + 0x66, 0x4a, 0x72, 0xa1, 0xf3, 0xc1, 0x54, 0xf3, 0x83, 0xce, 0x79, 0x83, 0xce, 0x47, 0x06, 0xbd, + 0x16, 0x8c, 0x3a, 0xbf, 0x38, 0xd5, 0x71, 0x83, 0xce, 0x2f, 0x19, 0xf4, 0xa7, 0x14, 0x9b, 0xa5, + 0x1a, 0x31, 0x82, 0xd1, 0x22, 0xfd, 0x21, 0xc6, 0x3a, 0xff, 0xc8, 0xda, 0xe3, 0x5e, 0x08, 0x89, + 0x2a, 0xe1, 0x11, 0x76, 0xc7, 0xee, 0x88, 0x70, 0xec, 0x8e, 0x7d, 0x62, 0x49, 0xdc, 0x5a, 0x56, + 0x34, 0xb7, 0xdc, 0x0e, 0x69, 0xbb, 0x0b, 0xc7, 0xb2, 0xe1, 0x8d, 0x93, 0xe8, 0x2c, 0x00, 0x99, + 0x4a, 0x73, 0xd7, 0x04, 0x10, 0x24, 0xd8, 0xee, 0x00, 0x62, 0x4c, 0xea, 0x5b, 0x37, 0x41, 0xa0, + 0x80, 0x90, 0x6b, 0xa4, 0xe3, 0x78, 0x68, 0x67, 0x17, 0x27, 0x02, 0xfe, 0x46, 0x19, 0x5e, 0xa9, + 0x98, 0x2e, 0x7a, 0x1e, 0x60, 0x72, 0x3a, 0x1b, 0xf0, 0xb9, 0xf4, 0x26, 0x50, 0xbf, 0xde, 0xb6, + 0xcd, 0x1a, 0x73, 0x98, 0x46, 0xf3, 0x17, 0x75, 0x33, 0xa5, 0x5f, 0x28, 0xf3, 0xc9, 0xc9, 0x25, + 0x21, 0x5a, 0x20, 0x32, 0xec, 0x4b, 0x0b, 0x81, 0xfe, 0x10, 0xdb, 0xe6, 0xab, 0x26, 0xae, 0x38, + 0x68, 0xe9, 0x8a, 0x5b, 0x6e, 0x43, 0xdc, 0x11, 0xcb, 0x32, 0x83, 0x1a, 0xbb, 0xd9, 0x13, 0x6f, + 0x50, 0x8b, 0xb5, 0xa7, 0xad, 0x2d, 0x31, 0xe2, 0xd3, 0xf9, 0x4f, 0x7e, 0x13, 0x96, 0x58, 0xf0, + 0xdd, 0xec, 0x18, 0xf1, 0x82, 0xb7, 0x7b, 0x7d, 0xce, 0xec, 0xb5, 0xf6, 0x49, 0x03, 0xfe, 0x82, + 0xfd, 0x9e, 0x02, 0x11, 0xb1, 0x55, 0xb9, 0x2a, 0x76, 0xd8, 0x2a, 0xcf, 0xd0, 0x87, 0x64, 0x14, + 0xd0, 0xf3, 0xb2, 0xdd, 0xc3, 0xfc, 0x88, 0xa8, 0x97, 0xba, 0x0f, 0xd3, 0xaf, 0x33, 0x1a, 0x2e, + 0x5f, 0x70, 0xeb, 0x78, 0x8e, 0xed, 0x41, 0x11, 0x4d, 0xd5, 0x5f, 0xf8, 0xf3, 0x24, 0xc3, 0x24, + 0xfa, 0x8d, 0xd2, 0x4e, 0x2c, 0x77, 0x6a, 0xf7, 0xb6, 0x9c, 0x58, 0xa7, 0x76, 0xe6, 0x9d, 0x1c, + 0xef, 0x4e, 0xbf, 0xd0, 0xe9, 0xda, 0x42, 0xaf, 0xd9, 0x4f, 0xb8, 0xd2, 0x2f, 0x76, 0xea, 0x1a, + 0x8d, 0xd7, 0x3e, 0xd9, 0xed, 0x42, 0xaf, 0xb9, 0xa5, 0x57, 0x26, 0xfc, 0xad, 0x26, 0xf6, 0x6a, + 0x88, 0xbf, 0xfa, 0xff, 0xe6, 0x68, 0xf3, 0xcb, 0x46, 0xeb, 0xf3, 0xfa, 0xd8, 0x8b, 0x37, 0x8c, + 0x7c, 0xd6, 0x56, 0x5f, 0x1c, 0x70, 0xbf, 0xd8, 0x12, 0x3e, 0xb9, 0x67, 0x57, 0x8b, 0x14, 0x34, + 0xa9, 0x86, 0x6d, 0xc0, 0xd6, 0x1e, 0x7e, 0xa6, 0xe7, 0x06, 0xb3, 0xf0, 0x22, 0x59, 0x72, 0xb1, + 0x9a, 0x1f, 0xf6, 0x6c, 0xd5, 0xfd, 0x8f, 0x48, 0x1d, 0xbc, 0xe9, 0xe9, 0x2f, 0x08, 0x7a, 0x75, + 0x3d, 0x86, 0x06, 0x83, 0xb3, 0x0d, 0x81, 0x7e, 0x2e, 0xe7, 0xb3, 0x97, 0x5a, 0x04, 0x1a, 0x14, + 0x89, 0xe1, 0x0b, 0x0f, 0x50, 0xd6, 0x22, 0xe7, 0x0b, 0x3e, 0x10, 0xc3, 0x3e, 0x3b, 0xf9, 0x1d, + 0xf6, 0xbd, 0xfa, 0x13, 0x55, 0x14, 0x14, 0xcd, 0x71, 0xfd, 0xf2, 0xd1, 0xda, 0x53, 0xa5, 0x9f, + 0x1d, 0xc9, 0x98, 0x7a, 0xbf, 0xd6, 0x56, 0x6c, 0x52, 0x2a, 0x48, 0xea, 0xdd, 0xce, 0xc5, 0xf5, + 0x44, 0x3e, 0x39, 0xe8, 0x1b, 0x0d, 0xf8, 0xef, 0xbc, 0x75, 0x3b, 0xd8, 0xbb, 0xed, 0xc3, 0xd3, + 0x8e, 0x8c, 0xef, 0xfb, 0xcd, 0xc6, 0x23, 0xfc, 0x34, 0x8b, 0xfb, 0xa3, 0x5e, 0x11, 0x13, 0x1a, + 0x0f, 0xe7, 0xad, 0x6b, 0xf9, 0xa8, 0x61, 0xd9, 0x85, 0x4e, 0xe9, 0x0a, 0x13, 0xae, 0xf5, 0xab, + 0xdb, 0xec, 0x0e, 0x94, 0x99, 0x3e, 0x4f, 0xc6, 0xe5, 0xc7, 0xab, 0x5b, 0x4c, 0x3c, 0xee, 0xec, + 0x0d, 0x9e, 0x3a, 0x93, 0x46, 0x63, 0xd7, 0x3e, 0x83, 0xd7, 0xcd, 0xdd, 0x46, 0xa7, 0x3b, 0x7e, + 0x3d, 0xc0, 0x0a, 0x3b, 0xed, 0xd6, 0xed, 0xf5, 0xce, 0x5d, 0x73, 0x70, 0xa3, 0x3d, 0x56, 0xda, + 0xbb, 0x46, 0x63, 0xb2, 0x7b, 0x76, 0x7e, 0xbf, 0xa9, 0x57, 0xf4, 0x49, 0x53, 0x35, 0xdf, 0x9c, + 0xab, 0xf3, 0xc2, 0x53, 0xd9, 0x69, 0x5b, 0x37, 0x87, 0xc3, 0xdd, 0xe1, 0x7e, 0xc1, 0xb8, 0x7c, + 0x7f, 0xd3, 0xba, 0x93, 0xeb, 0x57, 0x33, 0xdb, 0x6a, 0x75, 0xf5, 0xbb, 0xcc, 0xf9, 0xe8, 0x69, + 0xf4, 0xfe, 0x4a, 0xac, 0xc6, 0xce, 0xdb, 0xf4, 0xe1, 0x5d, 0xdf, 0x99, 0xe4, 0xd5, 0xfe, 0x0b, + 0xd9, 0xdf, 0xeb, 0x3d, 0xbc, 0xdd, 0x8e, 0x06, 0x27, 0x99, 0xb7, 0xfd, 0x33, 0xb9, 0x39, 0x3d, + 0xee, 0xbd, 0xbd, 0x3e, 0x3c, 0xed, 0x5d, 0x74, 0x4a, 0x99, 0x96, 0x55, 0xc9, 0xb4, 0x7b, 0x9b, + 0xa3, 0xa3, 0x66, 0xf1, 0x7c, 0xd2, 0xdd, 0x34, 0xac, 0xb3, 0x71, 0xe3, 0x92, 0x8e, 0x65, 0x4f, + 0xdb, 0xbf, 0x79, 0x69, 0x8d, 0xae, 0x86, 0xcd, 0x26, 0x2c, 0x84, 0x45, 0x3f, 0xe1, 0x71, 0x98, + 0x73, 0x85, 0xdc, 0x66, 0x62, 0xf7, 0x54, 0xf7, 0x22, 0x30, 0x4f, 0x3b, 0xfc, 0xc9, 0x13, 0xdd, + 0x50, 0x7b, 0x40, 0xd7, 0x83, 0x95, 0x47, 0x60, 0x31, 0xad, 0x44, 0x28, 0xf0, 0x48, 0x07, 0x06, + 0xa9, 0x77, 0x88, 0x80, 0x67, 0x10, 0x7f, 0xb1, 0x2d, 0xef, 0x3c, 0x0f, 0x57, 0x67, 0xc2, 0x3f, + 0xc6, 0x63, 0x8a, 0x89, 0x98, 0x94, 0xc4, 0xff, 0xb2, 0x89, 0x86, 0x6e, 0x39, 0x5b, 0xb7, 0x34, + 0x89, 0x5e, 0xfe, 0x8b, 0xb9, 0x33, 0x14, 0xd7, 0x07, 0x15, 0x25, 0x70, 0xd5, 0x86, 0xa5, 0x89, + 0x8e, 0xde, 0xa3, 0x72, 0x04, 0x1b, 0x7f, 0xdb, 0x30, 0x9c, 0x48, 0xa3, 0xfe, 0x19, 0x31, 0x45, + 0x2e, 0x2f, 0xf8, 0x0d, 0xc4, 0xad, 0x33, 0x50, 0x21, 0x84, 0x89, 0xea, 0x0c, 0xdc, 0x1c, 0xe6, + 0x31, 0xa0, 0x58, 0x0e, 0xae, 0x09, 0x58, 0xc4, 0xe5, 0x42, 0x0d, 0xd6, 0xc6, 0xfe, 0x9e, 0xbc, + 0x57, 0x73, 0x37, 0x97, 0x35, 0xa1, 0xfd, 0x26, 0x34, 0x54, 0xab, 0x63, 0x18, 0xc6, 0x8b, 0x4a, + 0xe8, 0x2d, 0x5d, 0x67, 0x40, 0x84, 0xef, 0x8a, 0x40, 0xcf, 0x2e, 0xc5, 0x81, 0xe3, 0x98, 0x76, + 0x35, 0x93, 0xc1, 0x03, 0xc2, 0x34, 0xe8, 0x50, 0x1d, 0x63, 0x64, 0xd9, 0x24, 0x8d, 0x4e, 0x35, + 0x66, 0x06, 0xc4, 0x16, 0xc5, 0x02, 0xbc, 0xd4, 0xc5, 0xff, 0x72, 0x2f, 0xb1, 0xac, 0xd1, 0xfb, + 0x8f, 0x1d, 0x63, 0x38, 0x1c, 0xe9, 0xd4, 0x32, 0xa3, 0x6c, 0x2d, 0xdb, 0xc6, 0x74, 0x76, 0x75, + 0xec, 0xdf, 0xe5, 0x05, 0xcb, 0xae, 0x9a, 0x7d, 0x96, 0x19, 0xe0, 0x77, 0xb2, 0xc4, 0x2d, 0x0a, + 0xb6, 0xea, 0x92, 0x8a, 0xbd, 0x40, 0xdd, 0xfa, 0x22, 0x75, 0xbb, 0x8e, 0x49, 0xde, 0x89, 0xf6, + 0x92, 0x0f, 0x71, 0x8a, 0x9f, 0xa5, 0x5a, 0x94, 0x02, 0xfc, 0xa1, 0x2c, 0x52, 0x7e, 0xbc, 0xb4, + 0x3c, 0xd4, 0xc6, 0x78, 0x2c, 0xb0, 0x16, 0xc5, 0xa1, 0x0f, 0x37, 0xcb, 0x77, 0x61, 0x5c, 0x8c, + 0x48, 0x83, 0xcf, 0xb1, 0x23, 0x8b, 0xba, 0xb8, 0xe3, 0xc5, 0xd7, 0xc5, 0xa9, 0x8a, 0x20, 0x7c, + 0x30, 0xea, 0x93, 0xc8, 0x45, 0x46, 0x24, 0xd2, 0x35, 0xbf, 0x19, 0x0d, 0x98, 0xc4, 0x76, 0xc0, + 0x1b, 0xf0, 0xdf, 0x9a, 0x70, 0x63, 0x08, 0x23, 0x9b, 0x08, 0xed, 0x91, 0xaa, 0x61, 0x3c, 0x5e, + 0x81, 0xb0, 0x9d, 0x5b, 0xa2, 0xa9, 0x28, 0x27, 0x41, 0xd7, 0x16, 0x48, 0xb0, 0xee, 0xed, 0x76, + 0x01, 0xf6, 0x1b, 0x58, 0x91, 0xac, 0xee, 0xa3, 0x31, 0x12, 0x3a, 0x50, 0xc6, 0x22, 0xce, 0xc8, + 0xd2, 0x05, 0x74, 0xe9, 0x22, 0xc0, 0xc5, 0xd5, 0x21, 0xa1, 0xa7, 0xbb, 0x48, 0xdb, 0x18, 0xae, + 0xc3, 0xc6, 0x3b, 0xbe, 0x48, 0xd5, 0xf8, 0xc1, 0x1c, 0x40, 0x3e, 0x7d, 0x46, 0xa1, 0x14, 0xef, + 0x1f, 0x03, 0xb1, 0x5a, 0x3a, 0xb1, 0xd2, 0x6b, 0x6c, 0x45, 0x2d, 0x4c, 0x56, 0xc8, 0x61, 0xc9, + 0x39, 0x35, 0x2c, 0x2a, 0x91, 0x5c, 0x78, 0x50, 0x19, 0xd4, 0x03, 0x75, 0xc5, 0x92, 0x5f, 0xac, + 0x9f, 0xe3, 0xeb, 0x8f, 0x74, 0xbc, 0x76, 0x6e, 0xd1, 0xa5, 0xee, 0xb7, 0xc3, 0x2d, 0xee, 0xb5, + 0x60, 0x75, 0xaf, 0xed, 0x1b, 0x16, 0x0c, 0xdf, 0x76, 0x04, 0x93, 0x58, 0xe8, 0x8d, 0x86, 0xb4, + 0x2a, 0x09, 0x2a, 0x28, 0x11, 0xf8, 0x8d, 0x3d, 0x5c, 0x74, 0x84, 0x06, 0x1e, 0x01, 0x3c, 0x50, + 0x7c, 0x18, 0xbd, 0x9e, 0x3b, 0x6c, 0x40, 0xcb, 0x10, 0x91, 0x60, 0xc3, 0xea, 0x05, 0x56, 0x38, + 0x19, 0x10, 0x9d, 0x46, 0xc1, 0x00, 0x5c, 0x00, 0x9a, 0xd3, 0x0b, 0x2e, 0xc5, 0x6a, 0x30, 0xed, + 0x88, 0x33, 0x31, 0x66, 0xa2, 0x17, 0x86, 0x25, 0x27, 0x83, 0xc9, 0x5f, 0xf3, 0x67, 0xff, 0xbb, + 0x7b, 0xdb, 0x79, 0x6d, 0x0c, 0xa8, 0xd7, 0x8c, 0x8e, 0x6a, 0x4a, 0x93, 0x7b, 0x89, 0xf7, 0x4c, + 0x90, 0x26, 0xb6, 0xd4, 0xc1, 0xdb, 0x69, 0x12, 0x35, 0xe3, 0xd8, 0x92, 0xc3, 0x9c, 0x0c, 0xd0, + 0x59, 0xa1, 0xfe, 0x25, 0x8b, 0x3f, 0x26, 0xac, 0x65, 0x83, 0xf1, 0xa2, 0xaa, 0x28, 0xa9, 0xf6, + 0x85, 0x8e, 0x19, 0xba, 0xd6, 0xc0, 0x1f, 0xd5, 0x3e, 0x1d, 0xb3, 0x5f, 0x14, 0x0b, 0xd8, 0x13, + 0x5d, 0x49, 0xf8, 0x68, 0xbf, 0xe9, 0x9d, 0x16, 0x60, 0xc5, 0x7b, 0xbe, 0xe9, 0x6b, 0xd7, 0xa4, + 0x03, 0xe5, 0x65, 0x69, 0xa0, 0xd8, 0xd4, 0xcd, 0x14, 0xb3, 0xe0, 0xf9, 0xfa, 0x60, 0xc7, 0x7d, + 0x6a, 0x36, 0x6f, 0x58, 0xf3, 0xbb, 0x23, 0xab, 0x5e, 0x92, 0xe1, 0xe1, 0x46, 0xb1, 0xea, 0xf8, + 0x8b, 0x97, 0x33, 0x69, 0x4b, 0xa4, 0x7f, 0x8a, 0xaa, 0x99, 0x2c, 0x79, 0xb1, 0xab, 0xf6, 0xf9, + 0x97, 0x4b, 0x45, 0x83, 0xb7, 0x0e, 0xbc, 0xe2, 0xcf, 0xc8, 0xc2, 0xd8, 0x97, 0x4c, 0x44, 0xab, + 0x6f, 0xc0, 0x78, 0x40, 0xa2, 0x62, 0xfb, 0x05, 0xad, 0xd2, 0x6f, 0x1a, 0x40, 0x03, 0xf0, 0x08, + 0x0c, 0xd6, 0x7f, 0x34, 0x26, 0x30, 0xcd, 0xb7, 0x3a, 0xcc, 0x4d, 0x17, 0x5e, 0xa1, 0x2b, 0x10, + 0x2c, 0x31, 0x9d, 0xfd, 0x98, 0x1d, 0x0f, 0x10, 0xf6, 0x44, 0xd1, 0x80, 0xcd, 0x4e, 0x20, 0xd3, + 0xb1, 0xea, 0x9b, 0x52, 0xb7, 0xde, 0x05, 0x9d, 0x08, 0x45, 0x51, 0xa9, 0x37, 0x45, 0x69, 0xa6, + 0xfe, 0xe3, 0xa7, 0x64, 0xe2, 0xc6, 0x5a, 0x9f, 0xcd, 0x25, 0xe2, 0x3d, 0x68, 0xde, 0x83, 0x19, + 0x3c, 0x9d, 0xd7, 0x45, 0x51, 0x32, 0x8f, 0xb0, 0x9b, 0xf3, 0xd1, 0x10, 0x7f, 0x86, 0x4e, 0x3d, + 0x8b, 0x7f, 0x4f, 0x5b, 0xec, 0xed, 0x14, 0x7a, 0x42, 0x60, 0xe0, 0x07, 0x19, 0x19, 0xd6, 0x52, + 0xed, 0x33, 0x84, 0x61, 0x88, 0x00, 0x0c, 0x07, 0xf0, 0x67, 0x62, 0x5f, 0x9b, 0x58, 0xa8, 0xd3, + 0xeb, 0xd7, 0x67, 0x0e, 0xde, 0x17, 0xad, 0xce, 0x50, 0x8c, 0xaa, 0x82, 0x6c, 0x65, 0xbd, 0x88, + 0x52, 0xbb, 0x5f, 0x9d, 0x8d, 0x2c, 0xad, 0x2a, 0x8a, 0x73, 0x49, 0xd1, 0xcc, 0x81, 0x02, 0xd9, + 0xfd, 0x6a, 0xba, 0x24, 0x81, 0x54, 0x5b, 0x4d, 0x97, 0xe7, 0x12, 0x73, 0x06, 0xc5, 0x44, 0x28, + 0x82, 0xaf, 0x43, 0xb3, 0xca, 0x42, 0xdb, 0xd8, 0xd5, 0x19, 0xbb, 0xcb, 0x58, 0x85, 0x49, 0xb4, + 0xfa, 0xed, 0x2a, 0x74, 0xfc, 0x3a, 0x82, 0x14, 0x7c, 0x1f, 0x90, 0x29, 0xbc, 0xc3, 0xc8, 0xa8, + 0x6a, 0x8a, 0x29, 0x66, 0x67, 0x08, 0xcc, 0x18, 0x0b, 0x99, 0x6a, 0x17, 0x13, 0x00, 0xe5, 0x1a, + 0xd1, 0xab, 0x6c, 0x1a, 0xcd, 0x89, 0xe5, 0x3e, 0x91, 0xa9, 0x89, 0x4f, 0x1d, 0x9b, 0xd6, 0x1a, + 0x74, 0x95, 0x37, 0x1b, 0xdf, 0x01, 0x7d, 0xa4, 0x87, 0x29, 0x6a, 0xd7, 0x36, 0x2c, 0x6c, 0x07, + 0xa0, 0x01, 0x15, 0xb5, 0xfe, 0xe3, 0x87, 0x2c, 0x65, 0xb3, 0x52, 0xae, 0x20, 0x15, 0x24, 0x7f, + 0x97, 0x54, 0xfc, 0x9d, 0x34, 0xdd, 0x87, 0x6d, 0x78, 0xd4, 0x4e, 0xab, 0x46, 0x66, 0x3a, 0x54, + 0xec, 0x34, 0xc8, 0x91, 0xe2, 0x4f, 0x09, 0xea, 0xe4, 0xa4, 0xec, 0xa6, 0x94, 0x0d, 0xaa, 0x50, + 0x31, 0xd3, 0x4e, 0x53, 0x24, 0x74, 0x0c, 0xf4, 0x06, 0x48, 0xc3, 0x60, 0x33, 0x85, 0x4a, 0x16, + 0xff, 0x65, 0x73, 0xf9, 0xf4, 0xb3, 0x49, 0xab, 0xe6, 0xe4, 0x5c, 0x51, 0xca, 0x4b, 0x39, 0x6c, + 0x62, 0x75, 0x87, 0x04, 0x66, 0x06, 0x38, 0x9a, 0xdb, 0x25, 0xd4, 0x2b, 0x40, 0x95, 0x7c, 0xf6, + 0x2f, 0xd6, 0x93, 0xa5, 0x12, 0x0c, 0xed, 0x63, 0x48, 0x8b, 0xd9, 0x12, 0xfe, 0xdb, 0xac, 0xe4, + 0x3c, 0x48, 0xf1, 0xeb, 0x07, 0xd9, 0x4f, 0xd4, 0xcc, 0x66, 0x2b, 0xf8, 0xaf, 0x5c, 0x96, 0x65, + 0x56, 0xf5, 0x67, 0xad, 0x37, 0xd2, 0x69, 0x80, 0x70, 0x61, 0x00, 0x92, 0x88, 0x46, 0xee, 0xfc, + 0x50, 0x3b, 0x4d, 0x6a, 0x84, 0x4a, 0x24, 0x67, 0x5f, 0xba, 0x69, 0x16, 0xdc, 0x70, 0x7d, 0x5d, + 0x27, 0x13, 0x01, 0x38, 0x08, 0x7e, 0x8f, 0xd1, 0x5b, 0x52, 0x5b, 0x79, 0x92, 0x5f, 0x5f, 0x0f, + 0x09, 0x92, 0x73, 0xbf, 0x4d, 0x1b, 0x54, 0xd1, 0x04, 0x91, 0x9c, 0xe4, 0x0c, 0x44, 0x19, 0x77, + 0x7d, 0xec, 0x69, 0x04, 0x7f, 0xd2, 0x74, 0x8f, 0x4c, 0xc3, 0x12, 0xbd, 0xb4, 0x40, 0xda, 0xb3, + 0x9c, 0x37, 0x5a, 0x30, 0xa8, 0x8b, 0x5e, 0x2d, 0x24, 0x39, 0x73, 0x77, 0x9a, 0x6e, 0x1a, 0xa4, + 0x1e, 0xb7, 0xea, 0xce, 0x1b, 0xcd, 0xe2, 0x8a, 0xee, 0xed, 0x34, 0xcf, 0x97, 0x14, 0xb6, 0x77, + 0xde, 0x9a, 0xc8, 0x4a, 0xcf, 0x41, 0x77, 0x0a, 0x55, 0x52, 0xed, 0xbd, 0xa1, 0x89, 0xbd, 0xfa, + 0xd5, 0xe4, 0x7a, 0xbd, 0x7e, 0xd1, 0x7e, 0xc6, 0xef, 0x16, 0xbc, 0x90, 0x37, 0x1b, 0x72, 0xd2, + 0xcc, 0x2b, 0x94, 0xaf, 0x04, 0x05, 0xb8, 0x2a, 0x64, 0x7d, 0x5d, 0x34, 0x68, 0x15, 0xb1, 0x5e, + 0x47, 0xc3, 0x8a, 0xd1, 0xc3, 0xb4, 0x2f, 0x0d, 0xcb, 0x52, 0xde, 0xd2, 0xaa, 0x4d, 0x7f, 0x23, + 0xdd, 0xc2, 0x22, 0x27, 0x96, 0xda, 0x09, 0x5a, 0xf9, 0x02, 0x69, 0xca, 0x79, 0xc2, 0x54, 0x40, + 0xce, 0xdb, 0xc7, 0x48, 0x36, 0x90, 0x95, 0x5c, 0x5f, 0x57, 0xd1, 0x6e, 0x03, 0xec, 0x32, 0x52, + 0xfd, 0xba, 0xdf, 0xa6, 0xae, 0xf4, 0x61, 0xc0, 0x69, 0xe5, 0x23, 0x1d, 0xaa, 0xa6, 0x2d, 0xa8, + 0x1b, 0x4e, 0xe9, 0x2f, 0xa4, 0xb4, 0xb9, 0x26, 0x61, 0x45, 0xb7, 0x1c, 0x2b, 0x68, 0x0e, 0xef, + 0xd7, 0x25, 0xc4, 0x14, 0x34, 0x94, 0x12, 0x25, 0xfc, 0xed, 0xbb, 0xbf, 0xed, 0x94, 0x98, 0x14, + 0x43, 0xf5, 0xf0, 0x66, 0xb8, 0x5f, 0x2f, 0x9d, 0xcb, 0xe6, 0x4a, 0x7f, 0x86, 0x00, 0x49, 0xa5, + 0x37, 0xb3, 0xc5, 0xdc, 0x9f, 0x21, 0x50, 0x52, 0x69, 0x79, 0x33, 0x17, 0x4a, 0xe3, 0x81, 0xc1, + 0xa3, 0x89, 0xd6, 0x29, 0x36, 0x0a, 0xfb, 0x95, 0xe0, 0xd4, 0x49, 0x1a, 0x99, 0x29, 0xa4, 0xa6, + 0x27, 0xdb, 0x5c, 0x15, 0x3f, 0x31, 0x59, 0x05, 0xfe, 0x82, 0xa2, 0xad, 0x4e, 0xc4, 0x2f, 0x75, + 0xf4, 0xfc, 0x6b, 0x02, 0xe3, 0x1a, 0xc1, 0x9e, 0xd0, 0x42, 0xfa, 0xc2, 0x39, 0x44, 0x4b, 0x57, + 0x8b, 0x86, 0x66, 0xac, 0xb1, 0x5d, 0x07, 0xe6, 0x87, 0x47, 0xa3, 0xd7, 0x58, 0x72, 0x3b, 0x61, + 0xff, 0xfe, 0x0d, 0xef, 0x8c, 0x32, 0x29, 0xeb, 0xab, 0x7b, 0x83, 0xf4, 0x0b, 0x6d, 0x65, 0x73, + 0x9b, 0xdb, 0xf4, 0x82, 0x80, 0x58, 0xa5, 0xf7, 0x28, 0x40, 0x2d, 0xf1, 0xaa, 0x04, 0xce, 0xef, + 0x75, 0x6f, 0xaf, 0x5b, 0x5f, 0x77, 0xb6, 0xe4, 0xed, 0x5f, 0x51, 0x5f, 0xf8, 0x6c, 0x99, 0x5e, + 0xb5, 0x15, 0xfe, 0x98, 0x79, 0xd8, 0xf7, 0x3b, 0x98, 0x0b, 0x79, 0xf9, 0x5f, 0x12, 0x62, 0x37, + 0xf1, 0xc7, 0xcc, 0x99, 0x4b, 0xfe, 0x9f, 0x64, 0xf2, 0x57, 0x75, 0xa1, 0x74, 0xb2, 0x9a, 0xf0, + 0x07, 0x15, 0xf4, 0x99, 0x80, 0x9d, 0x20, 0x16, 0xac, 0x5f, 0x31, 0xcd, 0xfe, 0x92, 0x16, 0x87, + 0xed, 0xc4, 0x0c, 0x93, 0x9b, 0x25, 0xc5, 0x34, 0xb5, 0xb7, 0x66, 0xaf, 0x0f, 0xdc, 0xa1, 0xc3, + 0x62, 0x13, 0x88, 0x1a, 0xca, 0xb7, 0xb0, 0x08, 0xea, 0xb0, 0x01, 0xa5, 0xe9, 0xfe, 0x93, 0xc6, + 0xed, 0x27, 0x59, 0x43, 0x31, 0x84, 0x70, 0xa9, 0xb4, 0x83, 0x74, 0xbb, 0x5f, 0x03, 0x38, 0x29, + 0x7f, 0x10, 0x69, 0x7c, 0x4c, 0x51, 0x72, 0xcb, 0x3a, 0xb4, 0x2c, 0x6e, 0x3f, 0x69, 0xb6, 0xa7, + 0xd4, 0xbc, 0x52, 0x4e, 0xdb, 0x14, 0x25, 0x67, 0x5b, 0xcc, 0xd2, 0x8f, 0x98, 0xfb, 0x5f, 0x32, + 0xc7, 0x27, 0x00, 0x92, 0x3e, 0x63, 0x8c, 0x6c, 0x1a, 0x73, 0x09, 0x1f, 0x60, 0x66, 0xbc, 0xaa, + 0x6d, 0xb7, 0xaa, 0x1f, 0xb3, 0x52, 0x90, 0xbd, 0x2a, 0x6e, 0x8c, 0x26, 0xbe, 0xf0, 0xa0, 0x4b, + 0x0b, 0x53, 0x67, 0x59, 0x28, 0x46, 0x89, 0x8b, 0xcb, 0x1e, 0x3a, 0x34, 0x5b, 0xa6, 0xdd, 0x16, + 0x43, 0xfd, 0x38, 0x1b, 0x6d, 0x51, 0x0a, 0xc6, 0x4a, 0xf9, 0x6f, 0x1a, 0x76, 0xd8, 0xa0, 0x84, + 0xdd, 0x37, 0x59, 0x09, 0x3a, 0x42, 0xb6, 0x21, 0x6e, 0xb3, 0x2e, 0xaa, 0x6e, 0x8f, 0x50, 0x58, + 0x45, 0x7f, 0x92, 0xb0, 0xf3, 0x28, 0xba, 0x16, 0xf8, 0x9e, 0xa3, 0xb7, 0x2a, 0x60, 0x5f, 0x94, + 0x8e, 0x5b, 0x17, 0xe7, 0x30, 0x6f, 0xf8, 0x91, 0x56, 0xb5, 0xf7, 0x96, 0x80, 0x66, 0x93, 0x49, + 0x5f, 0x4c, 0x00, 0xe6, 0xd5, 0xb5, 0xd7, 0xd7, 0x99, 0xf2, 0x7c, 0x7b, 0xc4, 0xf3, 0x65, 0xcf, + 0x5b, 0x7c, 0xe6, 0x03, 0xc2, 0x36, 0xfa, 0x34, 0xec, 0xe6, 0xf5, 0x2f, 0x31, 0x89, 0x52, 0x30, + 0xe3, 0xa1, 0x56, 0xdc, 0xc0, 0x14, 0xb3, 0xf0, 0xa4, 0xd7, 0x97, 0x51, 0xc3, 0x36, 0x13, 0x46, + 0xaa, 0x6e, 0xfe, 0xb2, 0x56, 0x3d, 0x87, 0x8d, 0x59, 0x84, 0x12, 0x38, 0xd0, 0x58, 0xc2, 0xb2, + 0x06, 0xe8, 0xe5, 0x81, 0x85, 0xc1, 0x01, 0xed, 0x2f, 0x0e, 0x0e, 0x12, 0x63, 0x5b, 0x71, 0xe9, + 0x1a, 0x18, 0x11, 0x01, 0xbe, 0xc0, 0xd3, 0xa9, 0xf8, 0x95, 0x10, 0x9e, 0x1e, 0x3a, 0x1b, 0x3d, + 0x4c, 0xa4, 0xb7, 0x9d, 0xb8, 0xc4, 0x1c, 0x26, 0x76, 0xbb, 0xdd, 0x50, 0x62, 0x1e, 0x13, 0xdb, + 0xed, 0x76, 0x28, 0xb1, 0x80, 0x89, 0x8a, 0xa2, 0x84, 0x12, 0x8b, 0x98, 0x58, 0xa9, 0x54, 0x42, + 0x89, 0xa5, 0xb8, 0xc4, 0x32, 0x26, 0x96, 0xcb, 0xe5, 0x50, 0x62, 0x1b, 0x13, 0x0b, 0x85, 0x42, + 0x28, 0xb1, 0x83, 0x89, 0xf9, 0x7c, 0x3e, 0x94, 0x48, 0x30, 0x31, 0x9b, 0xcd, 0x86, 0x12, 0xbb, + 0x98, 0x98, 0xcb, 0xe5, 0x42, 0x89, 0x16, 0x85, 0x33, 0x17, 0x2e, 0xd9, 0xa7, 0x25, 0x95, 0x70, + 0xa2, 0x46, 0x13, 0x4b, 0x9d, 0x50, 0xa2, 0x01, 0x89, 0xf4, 0x73, 0x8f, 0x39, 0xb9, 0x20, 0x09, + 0xc1, 0x1f, 0x39, 0x5d, 0x49, 0x86, 0x0a, 0xda, 0x6d, 0x17, 0x9f, 0xf9, 0x48, 0xf2, 0xc0, 0x4d, + 0x2f, 0x85, 0xd2, 0x9d, 0xf6, 0x92, 0x86, 0xdd, 0x4f, 0x6b, 0x6f, 0xb4, 0x93, 0xc9, 0x48, 0x05, + 0xc5, 0xab, 0x91, 0xdd, 0x94, 0x25, 0x21, 0xf8, 0xb3, 0xbc, 0xc6, 0xe0, 0x53, 0x7d, 0x50, 0x4f, + 0x5c, 0x6a, 0xec, 0x4c, 0xba, 0xec, 0x94, 0x79, 0xaa, 0xa1, 0x19, 0x16, 0x83, 0x74, 0x27, 0xe4, + 0x74, 0x19, 0xca, 0x55, 0xa3, 0x04, 0x15, 0x45, 0x3f, 0x25, 0x28, 0xb6, 0xb7, 0x44, 0x08, 0x2a, + 0x3a, 0x27, 0xf9, 0xb8, 0x29, 0x2d, 0xc4, 0x4d, 0x3e, 0x25, 0xa8, 0x62, 0xb1, 0xb8, 0x48, 0x50, + 0xa5, 0x52, 0xe9, 0x93, 0x04, 0x15, 0xa5, 0x5c, 0x4a, 0x50, 0x9d, 0x4e, 0x67, 0x91, 0xa0, 0xa2, + 0x4b, 0xa4, 0x1b, 0xb7, 0x1a, 0x28, 0x41, 0x91, 0x42, 0x6e, 0x91, 0xa0, 0x0a, 0x24, 0xb7, 0x48, + 0x50, 0x85, 0xb2, 0x12, 0x4f, 0x50, 0x79, 0x98, 0x08, 0xef, 0xdf, 0x12, 0x6a, 0x02, 0x64, 0xc6, + 0x52, 0x13, 0xa4, 0x17, 0x97, 0x50, 0x13, 0xdf, 0xea, 0x67, 0x48, 0x49, 0xce, 0x01, 0x15, 0xf9, + 0x7f, 0x3e, 0x41, 0x4a, 0xc5, 0xac, 0x24, 0x78, 0xff, 0x3e, 0x4b, 0x47, 0x23, 0x1d, 0xf6, 0x01, + 0x91, 0xe3, 0x53, 0x68, 0xc6, 0xda, 0xe9, 0x07, 0x02, 0x13, 0xad, 0xda, 0xee, 0x63, 0x9f, 0xf5, + 0x6e, 0xba, 0x63, 0x11, 0x60, 0xfe, 0xae, 0x28, 0x4c, 0x9b, 0x14, 0x93, 0x35, 0xb5, 0x97, 0xb0, + 0xd3, 0x68, 0x76, 0x27, 0x92, 0x08, 0x3c, 0x9a, 0xfc, 0xfe, 0xed, 0xeb, 0x0d, 0xa0, 0xe7, 0xd9, + 0xa3, 0x61, 0xda, 0x1c, 0x80, 0xfa, 0x6f, 0x67, 0xb2, 0x95, 0x9c, 0x9c, 0xc9, 0xca, 0x65, 0x19, + 0x39, 0x39, 0xf4, 0x80, 0xdb, 0xb3, 0x5e, 0xf7, 0x94, 0x80, 0x5a, 0xcf, 0xb0, 0x12, 0xd4, 0xc8, + 0x20, 0x80, 0xd4, 0x0b, 0x1a, 0xda, 0xef, 0xdf, 0x3f, 0x7e, 0xb2, 0x42, 0x4a, 0x1d, 0xc4, 0x4d, + 0xed, 0x87, 0xfc, 0x73, 0x5b, 0x47, 0x51, 0x7c, 0x7f, 0xa4, 0x69, 0x8f, 0x20, 0xff, 0x24, 0x92, + 0x55, 0x4c, 0x94, 0x0c, 0xbf, 0x8d, 0x84, 0x22, 0x69, 0x3f, 0xb2, 0x3f, 0xe1, 0x4f, 0xee, 0x67, + 0x52, 0x52, 0x83, 0x74, 0x03, 0xc0, 0xc4, 0x2d, 0x8f, 0xbe, 0xa8, 0xd8, 0x08, 0x7d, 0x4a, 0xa6, + 0xb4, 0x1f, 0x79, 0x28, 0xa9, 0x6f, 0xd5, 0x0d, 0x50, 0x47, 0xbe, 0xd7, 0x55, 0x10, 0x76, 0xd8, + 0x60, 0xb4, 0x1f, 0x85, 0x9f, 0xc9, 0xf9, 0xdc, 0x46, 0xaf, 0xfd, 0x3d, 0xfc, 0x7c, 0x37, 0x9a, + 0x9f, 0x89, 0x4e, 0xac, 0x04, 0x35, 0xf5, 0x81, 0x7c, 0x51, 0xdf, 0x72, 0x47, 0xc0, 0x49, 0xda, + 0xd1, 0xbd, 0xba, 0xdd, 0x87, 0x8e, 0xa9, 0x38, 0xae, 0x83, 0xd0, 0x9c, 0xd0, 0xeb, 0xe9, 0x52, + 0x52, 0xf2, 0x94, 0x15, 0x37, 0xfa, 0x5c, 0x5d, 0xf7, 0x53, 0x02, 0xd1, 0xea, 0x08, 0x35, 0xae, + 0xfa, 0x2f, 0x50, 0xb1, 0x41, 0xbe, 0xa2, 0x10, 0x51, 0xc9, 0x8a, 0xdd, 0x02, 0xa1, 0x93, 0x12, + 0x9c, 0xde, 0x24, 0x43, 0xb2, 0x96, 0xe8, 0x45, 0x4c, 0xed, 0x80, 0x74, 0x1d, 0x99, 0xd9, 0xd6, + 0x8b, 0xaa, 0x37, 0x5b, 0x2d, 0x9c, 0x5e, 0x98, 0xb5, 0x2f, 0x4c, 0x27, 0x62, 0x38, 0x76, 0xea, + 0x11, 0x35, 0xe7, 0x46, 0xe9, 0x53, 0x25, 0x07, 0x0d, 0xd0, 0xb0, 0xce, 0x10, 0xd1, 0x31, 0x24, + 0x80, 0x07, 0x61, 0x40, 0x03, 0x76, 0x5a, 0xed, 0xc2, 0xfc, 0xc3, 0xfe, 0x47, 0x34, 0x3c, 0xd1, + 0x7c, 0xc3, 0x2f, 0x32, 0x13, 0x20, 0x2d, 0x48, 0x0a, 0x0e, 0x88, 0x33, 0xa0, 0x9c, 0x63, 0x4a, + 0x24, 0xda, 0x17, 0x00, 0x95, 0xc6, 0x1c, 0xa0, 0xb1, 0x34, 0x0d, 0x43, 0x59, 0x17, 0xf1, 0xa2, + 0x1a, 0x60, 0x05, 0xc3, 0xe7, 0xe9, 0xdd, 0xe6, 0x40, 0xd5, 0xba, 0x09, 0x1b, 0x66, 0x23, 0x50, + 0xd1, 0x58, 0x65, 0x5f, 0x59, 0x48, 0x80, 0x6c, 0xb3, 0xed, 0x19, 0x9a, 0x52, 0x62, 0x26, 0x23, + 0xa6, 0xa8, 0xad, 0xaa, 0x2a, 0x8a, 0xc9, 0x14, 0x09, 0xea, 0x19, 0x3a, 0x1a, 0x4b, 0x13, 0x8c, + 0xba, 0x49, 0x3d, 0x72, 0xdd, 0x07, 0x49, 0x19, 0x9d, 0x81, 0x49, 0x15, 0xe9, 0x38, 0x4d, 0x1b, + 0x03, 0xa4, 0x26, 0xa9, 0x21, 0x4b, 0x96, 0x12, 0xb4, 0xc9, 0x7a, 0x48, 0x8c, 0xea, 0x7b, 0x62, + 0x14, 0xa4, 0x1e, 0x99, 0x20, 0xd5, 0x82, 0xec, 0xcb, 0x8a, 0x41, 0x6d, 0x50, 0x08, 0x13, 0xe2, + 0x3e, 0xb4, 0x47, 0xa3, 0x82, 0xa5, 0x85, 0x4b, 0x0d, 0x3f, 0x71, 0x2d, 0xd0, 0x70, 0xc0, 0x2c, + 0xd0, 0xe0, 0xd1, 0xe5, 0x17, 0x71, 0x99, 0x60, 0xc6, 0x5a, 0x94, 0x68, 0x6b, 0xc9, 0x64, 0x0d, + 0xe4, 0x13, 0xe2, 0x6b, 0x31, 0xa6, 0xe2, 0x0c, 0xe8, 0x47, 0xb2, 0xec, 0x3a, 0x0d, 0x6e, 0xdb, + 0x21, 0xe8, 0xbd, 0x93, 0x06, 0x64, 0xd9, 0xf7, 0xaa, 0x33, 0x00, 0xac, 0x8a, 0xc9, 0xed, 0x8d, + 0x6c, 0x75, 0x6c, 0xa8, 0x5d, 0x41, 0x06, 0x02, 0x31, 0x41, 0x07, 0xa7, 0xa9, 0x35, 0xdf, 0x1c, + 0x17, 0x0c, 0x90, 0xf5, 0x01, 0x09, 0x03, 0xc3, 0x76, 0xb0, 0xd9, 0x14, 0xc8, 0xef, 0x18, 0x59, + 0x72, 0x1b, 0x64, 0xab, 0x14, 0x7b, 0x44, 0x4c, 0xc2, 0xfc, 0x30, 0x0d, 0x76, 0x4b, 0x06, 0x45, + 0x15, 0x15, 0x24, 0x1b, 0x17, 0x65, 0xc2, 0xc5, 0x0f, 0x6d, 0x25, 0x55, 0x87, 0x5e, 0x52, 0x98, + 0x9e, 0xac, 0xba, 0x7c, 0x00, 0x97, 0xbb, 0xd7, 0x2b, 0x2c, 0x02, 0x56, 0x3a, 0x39, 0x67, 0x54, + 0x17, 0x8f, 0xcd, 0x40, 0x28, 0x4d, 0xd6, 0x1c, 0xa8, 0x83, 0x66, 0x28, 0x50, 0x73, 0xfb, 0x64, + 0x97, 0x10, 0x13, 0xdf, 0x98, 0xac, 0x4a, 0x57, 0x5e, 0x02, 0xd4, 0x16, 0xbc, 0xf5, 0x84, 0xba, + 0xff, 0xad, 0xa3, 0x6a, 0x20, 0xe9, 0x26, 0x44, 0xc7, 0x1a, 0x11, 0xb1, 0xbe, 0xa4, 0x75, 0xb3, + 0x33, 0x14, 0x61, 0xa2, 0xbe, 0x64, 0xce, 0x8c, 0xb6, 0x9a, 0x01, 0x8d, 0xce, 0x76, 0x12, 0xba, + 0x32, 0x56, 0xfb, 0x0a, 0x94, 0x4c, 0x8f, 0x6c, 0x62, 0x35, 0xfa, 0x30, 0x49, 0xb0, 0x62, 0x71, + 0xb9, 0xad, 0x6c, 0x05, 0xca, 0x44, 0x23, 0xc7, 0x71, 0xf2, 0x5f, 0x20, 0x99, 0x53, 0x7b, 0xd4, + 0x76, 0x8f, 0x38, 0x9d, 0x41, 0x70, 0x10, 0x35, 0xc0, 0x60, 0xde, 0x90, 0x9e, 0x7e, 0xb6, 0x0d, + 0x1d, 0xd0, 0x3b, 0x1b, 0x12, 0x67, 0x60, 0x74, 0xab, 0x22, 0x94, 0x80, 0xb5, 0x8b, 0x9c, 0x44, + 0x4f, 0x00, 0x9f, 0x21, 0xb4, 0x40, 0x22, 0x19, 0xa4, 0xcc, 0xa2, 0x16, 0x01, 0xc0, 0x11, 0x1a, + 0xb5, 0x40, 0xb7, 0x4f, 0xa6, 0x81, 0x98, 0xa1, 0x17, 0x2c, 0x85, 0xd6, 0x5e, 0x03, 0x38, 0x83, + 0x66, 0xf4, 0x13, 0xe2, 0xb9, 0x21, 0x28, 0x58, 0xda, 0x65, 0xaf, 0xb4, 0x67, 0x34, 0x20, 0x87, + 0xa0, 0x48, 0x0b, 0xbb, 0xec, 0x93, 0x5e, 0x36, 0x65, 0x18, 0xa4, 0x9b, 0x16, 0xb1, 0xc9, 0x9e, + 0xaa, 0xc3, 0x92, 0x7c, 0x4b, 0x24, 0x92, 0xd0, 0xaa, 0xbb, 0x47, 0x70, 0xb2, 0x78, 0x3f, 0x0d, + 0x8c, 0x0a, 0xca, 0x55, 0x97, 0x65, 0x05, 0x88, 0x80, 0x85, 0xbe, 0xbe, 0xce, 0xf3, 0x22, 0x11, + 0xd7, 0x7f, 0x93, 0x2d, 0x7f, 0xfe, 0xee, 0xb4, 0xe4, 0xfa, 0x0f, 0xba, 0x87, 0xed, 0x98, 0xc2, + 0x6c, 0x98, 0xcb, 0x29, 0xe6, 0x72, 0xe8, 0xd0, 0xd5, 0xc4, 0xdd, 0x92, 0xf4, 0x01, 0xde, 0x7f, + 0x40, 0x5b, 0x35, 0xff, 0xce, 0x9e, 0xb9, 0x4b, 0x71, 0x7e, 0x1e, 0x7f, 0x11, 0x8e, 0xa5, 0x86, + 0x0d, 0x52, 0xc9, 0xb9, 0x84, 0x27, 0xea, 0x73, 0xfa, 0x3f, 0x46, 0x79, 0x2e, 0xe1, 0x75, 0x63, + 0xb6, 0x8b, 0x20, 0xdc, 0x34, 0x73, 0xc4, 0x12, 0xa5, 0x78, 0xdb, 0x98, 0xf4, 0x25, 0xeb, 0x6e, + 0xd5, 0x9d, 0xb1, 0xcf, 0xd3, 0xbd, 0x3d, 0x42, 0xa6, 0xca, 0x2c, 0x32, 0x60, 0x00, 0xc4, 0x7a, + 0x6b, 0x51, 0x4c, 0x19, 0x56, 0x43, 0xd3, 0x12, 0xdf, 0xb8, 0xc0, 0xad, 0xae, 0x27, 0xe5, 0xcf, + 0x6f, 0x49, 0x7f, 0x3b, 0xc5, 0x63, 0x04, 0xc1, 0x4e, 0xea, 0x31, 0x90, 0x39, 0xc6, 0xa8, 0x33, + 0xc0, 0xf3, 0x01, 0xd4, 0x40, 0x29, 0x15, 0xef, 0x50, 0xbf, 0x49, 0xd8, 0x10, 0x97, 0x95, 0x06, + 0x0e, 0x13, 0x29, 0x1b, 0x30, 0xd7, 0xc8, 0x84, 0x11, 0x6f, 0x63, 0x61, 0xf6, 0xb4, 0xc0, 0x6d, + 0x22, 0x80, 0xcd, 0x46, 0xd8, 0x9c, 0xa4, 0x1d, 0x73, 0xeb, 0x4d, 0xe9, 0x60, 0x90, 0x7d, 0x28, + 0xcb, 0x4c, 0xe4, 0xbf, 0x7f, 0x3b, 0x3f, 0xc8, 0xcf, 0xe8, 0x65, 0x3a, 0xaf, 0x10, 0xc7, 0xe0, + 0x5d, 0x3f, 0x0c, 0x22, 0x39, 0x75, 0xc0, 0xe7, 0x8c, 0xd5, 0x5e, 0x5f, 0xff, 0xe2, 0x00, 0x63, + 0x56, 0x5b, 0xe8, 0xe6, 0x09, 0xfb, 0xd4, 0x7f, 0x35, 0x63, 0xae, 0xb5, 0xd9, 0x43, 0xc3, 0x70, + 0x40, 0x9a, 0xc2, 0x69, 0x80, 0x02, 0x8b, 0x06, 0x45, 0x10, 0xb8, 0x54, 0x51, 0x62, 0x8d, 0x2c, + 0x90, 0x27, 0xe1, 0x0d, 0x1a, 0x18, 0xb3, 0x9e, 0x79, 0x5e, 0x78, 0x70, 0x20, 0x13, 0x63, 0x73, + 0xeb, 0x3a, 0x71, 0x24, 0x17, 0xb6, 0xfc, 0x66, 0x78, 0xfb, 0xb6, 0x40, 0x72, 0x73, 0x27, 0x9d, + 0x56, 0x64, 0x4e, 0x1e, 0x74, 0xab, 0xc5, 0x8f, 0x5e, 0x1e, 0xde, 0x9c, 0x9d, 0xd2, 0x1d, 0x37, + 0x8c, 0x12, 0x60, 0xd9, 0x04, 0xfd, 0x3e, 0x80, 0x71, 0x23, 0x10, 0xb0, 0x1c, 0xa8, 0x2f, 0x88, + 0x47, 0xe2, 0xee, 0xd1, 0x0c, 0x72, 0x72, 0xd6, 0xbd, 0xa2, 0xab, 0x43, 0xba, 0xf7, 0xb9, 0x46, + 0x2f, 0xef, 0xf0, 0xa6, 0x1e, 0x5d, 0x17, 0x71, 0x73, 0xc4, 0x7a, 0x98, 0x4b, 0xb9, 0x0a, 0xac, + 0x06, 0x09, 0x86, 0xc8, 0xf3, 0x1b, 0x12, 0xc1, 0x07, 0xe7, 0x8e, 0x92, 0x9c, 0x05, 0x08, 0x12, + 0x9b, 0x80, 0x10, 0xe2, 0xaa, 0xda, 0x86, 0x40, 0x35, 0x79, 0xa1, 0xa7, 0xc0, 0xa6, 0xd9, 0xfd, + 0x02, 0x73, 0x21, 0xf3, 0x3a, 0x74, 0xc4, 0xab, 0x85, 0xd4, 0x8b, 0x24, 0xef, 0x13, 0x19, 0x8f, + 0x23, 0x87, 0x03, 0xd6, 0x0d, 0xb9, 0x68, 0x27, 0x5c, 0xc4, 0x20, 0xab, 0x8c, 0xc7, 0xc9, 0xb2, + 0xa1, 0x3b, 0x4b, 0x87, 0x2e, 0xc5, 0x65, 0xb9, 0xdd, 0xcc, 0xa5, 0x10, 0x49, 0x00, 0xa3, 0xba, + 0xc6, 0xb3, 0xc2, 0x21, 0x71, 0xad, 0xa3, 0x0c, 0xec, 0xc0, 0x08, 0x89, 0x12, 0xf6, 0x19, 0x6c, + 0xeb, 0xe9, 0x9e, 0x66, 0xc0, 0xf2, 0x70, 0x32, 0xe5, 0x52, 0x01, 0xd1, 0xaa, 0xf3, 0xa9, 0x09, + 0x67, 0x83, 0x26, 0xff, 0x69, 0x27, 0x33, 0xf9, 0x12, 0x66, 0x6b, 0xf1, 0xd9, 0x1b, 0x98, 0xfb, + 0xa7, 0x9e, 0xcc, 0x94, 0x70, 0x43, 0xaa, 0xdb, 0xdb, 0x76, 0x4a, 0x14, 0xc4, 0x54, 0x22, 0x0b, + 0x7b, 0x36, 0x9a, 0x4d, 0xde, 0x44, 0x3c, 0xc9, 0x79, 0x83, 0xc5, 0x98, 0x12, 0x25, 0x41, 0xc4, + 0x2f, 0xa7, 0xb9, 0xd6, 0x5f, 0x25, 0x55, 0xd7, 0x7f, 0xff, 0xb6, 0xb7, 0x75, 0xbf, 0x82, 0xbe, + 0x2d, 0x0e, 0x8c, 0x11, 0x92, 0x14, 0xfe, 0x40, 0x15, 0x28, 0x2d, 0x7d, 0x01, 0x36, 0xae, 0x03, + 0x2a, 0xa1, 0x38, 0x36, 0x00, 0xa8, 0xd8, 0x2a, 0x56, 0x60, 0x9d, 0xd9, 0x2c, 0x4d, 0x4b, 0x51, + 0x27, 0x48, 0x4c, 0xff, 0x8e, 0xa0, 0xa0, 0xe1, 0x12, 0xf3, 0xb9, 0xf2, 0x6e, 0x3a, 0xa6, 0x38, + 0x1b, 0x25, 0xf9, 0x4f, 0xac, 0x62, 0x13, 0x54, 0xfe, 0x14, 0xce, 0x40, 0xad, 0x03, 0xaf, 0x30, + 0x26, 0xb8, 0x8e, 0xd0, 0x30, 0x2b, 0x7a, 0x02, 0xdf, 0xaf, 0xef, 0x8e, 0xb5, 0xf5, 0xdd, 0xe9, + 0x7a, 0x07, 0x9b, 0x2f, 0xe4, 0xcd, 0xe9, 0x8a, 0x5b, 0x7f, 0xcc, 0xc8, 0xfc, 0x7b, 0xc6, 0xe9, + 0xf2, 0x59, 0x63, 0x45, 0x63, 0x59, 0xce, 0x1c, 0x44, 0x69, 0x37, 0x3b, 0x03, 0xd5, 0x7f, 0x85, + 0x66, 0xe7, 0x94, 0x3b, 0xb3, 0xbb, 0x4c, 0xb0, 0xf9, 0x21, 0xf5, 0xac, 0xcf, 0xab, 0xe8, 0x61, + 0x2b, 0x3d, 0x82, 0x4b, 0x3a, 0x20, 0x1d, 0xae, 0xaf, 0x93, 0x54, 0xca, 0xc3, 0x19, 0xd9, 0xca, + 0x15, 0x71, 0x28, 0xa4, 0x0e, 0xbf, 0x49, 0x89, 0x13, 0x38, 0xa9, 0x27, 0xed, 0x2d, 0x34, 0xc9, + 0xb1, 0x43, 0xa0, 0xd4, 0x5f, 0x26, 0x42, 0xaa, 0x76, 0x7f, 0x25, 0x59, 0x10, 0xa6, 0xda, 0x17, + 0xda, 0xf2, 0x0f, 0xe7, 0xe7, 0xef, 0xdf, 0xf2, 0x17, 0x6c, 0x1d, 0xfb, 0xd8, 0x0e, 0x8a, 0xe2, + 0x97, 0x21, 0xa0, 0x70, 0xb0, 0xf4, 0x1d, 0xec, 0x72, 0x9b, 0xde, 0x66, 0x2b, 0x97, 0x6b, 0xc2, + 0xd1, 0xae, 0x30, 0x1c, 0xd9, 0x8e, 0xd0, 0x26, 0x02, 0xa4, 0x0b, 0x06, 0xa8, 0x51, 0xc4, 0xb6, + 0xd3, 0x38, 0xb1, 0xd5, 0x15, 0xad, 0xfc, 0xf2, 0xea, 0xe3, 0x79, 0xf6, 0xc4, 0x52, 0x31, 0xec, + 0xae, 0xf0, 0xc7, 0xcc, 0xa4, 0x92, 0xbf, 0x93, 0x9c, 0x7f, 0xe1, 0x70, 0x64, 0xba, 0x67, 0x1e, + 0xee, 0x30, 0x5c, 0xdf, 0x53, 0xa0, 0x11, 0xe2, 0xa1, 0x81, 0x8e, 0x61, 0x7d, 0x9d, 0x0d, 0x85, + 0xfc, 0x0c, 0x9e, 0xd2, 0x3a, 0x35, 0x22, 0x07, 0xaf, 0x30, 0xfd, 0xfc, 0x21, 0xc4, 0xa5, 0xa6, + 0xbc, 0xa1, 0x77, 0x25, 0x77, 0x08, 0xe1, 0x97, 0x35, 0xdd, 0x3c, 0xae, 0x35, 0x2f, 0x29, 0x6d, + 0xda, 0x1c, 0x78, 0x8a, 0xa9, 0xde, 0x29, 0x9a, 0xa7, 0xdb, 0xd0, 0xc2, 0x20, 0xe3, 0x79, 0x95, + 0x92, 0xee, 0x69, 0x84, 0xe8, 0x5a, 0x85, 0xdd, 0x93, 0x19, 0xa0, 0x10, 0xb5, 0xaf, 0x27, 0xf0, + 0xe0, 0xd4, 0x2b, 0xe8, 0x8d, 0xc6, 0x49, 0x83, 0x7a, 0xb0, 0x4d, 0xff, 0x56, 0x13, 0x5d, 0x82, + 0x01, 0x3e, 0x20, 0x4d, 0x97, 0xfc, 0x47, 0x33, 0x78, 0x7c, 0xd5, 0xa2, 0xc6, 0x53, 0x87, 0x5f, + 0xfc, 0xaf, 0x9a, 0x87, 0xbb, 0x0f, 0x31, 0xf5, 0xaa, 0x6d, 0x73, 0xcf, 0x78, 0x78, 0x1a, 0xd0, + 0x92, 0xb9, 0xd3, 0x79, 0xf1, 0x29, 0x93, 0x69, 0xe6, 0x68, 0xdf, 0xad, 0x11, 0xf7, 0x13, 0x4c, + 0x09, 0x6a, 0xa4, 0x27, 0x4e, 0xcb, 0xfb, 0x4c, 0xef, 0x35, 0x3d, 0x73, 0x93, 0xa5, 0x0a, 0xfd, + 0x0f, 0xc5, 0x13, 0x32, 0x25, 0x9d, 0xa6, 0x31, 0x1c, 0x82, 0x04, 0x82, 0x7b, 0x91, 0xf9, 0x86, + 0x62, 0x17, 0xcf, 0x8c, 0x4d, 0x95, 0x39, 0x20, 0x60, 0x58, 0xf6, 0xb6, 0xa1, 0x58, 0xc0, 0x85, + 0xb9, 0x81, 0x98, 0x74, 0xce, 0x29, 0x0f, 0x0e, 0x28, 0x01, 0xcf, 0x5f, 0x61, 0x69, 0xd6, 0x1c, + 0xeb, 0x6d, 0x96, 0xb0, 0x57, 0xc9, 0x67, 0x20, 0x2f, 0x7b, 0x1a, 0x44, 0x56, 0xa6, 0x24, 0x81, + 0x0c, 0xde, 0x95, 0x57, 0x93, 0xb3, 0x39, 0xd3, 0xa7, 0x7f, 0xf1, 0x2e, 0xaf, 0xf4, 0x13, 0x36, + 0x1d, 0x11, 0x88, 0x92, 0x6c, 0x7f, 0x0b, 0x87, 0x9f, 0xa8, 0x96, 0xc3, 0x1f, 0xf9, 0x14, 0xe8, + 0x47, 0x6c, 0xc5, 0x6f, 0xd5, 0x6f, 0xbe, 0x6b, 0x83, 0x7f, 0xda, 0x5d, 0x0b, 0x79, 0xe9, 0xd6, + 0xc4, 0xf8, 0xcb, 0xeb, 0xb5, 0x0f, 0x5a, 0x9e, 0x6f, 0xfd, 0xaa, 0xe9, 0x29, 0x58, 0x98, 0x22, + 0x7a, 0xae, 0x0c, 0x94, 0x31, 0x11, 0x74, 0xc3, 0x45, 0x8a, 0x2d, 0xbc, 0x11, 0xe7, 0x0b, 0x2c, + 0x38, 0x37, 0x90, 0x3c, 0xc8, 0xbf, 0x16, 0x11, 0x26, 0x8a, 0x8d, 0x4e, 0x30, 0xaa, 0x6d, 0x8f, + 0x08, 0x95, 0xa8, 0x71, 0x81, 0xbd, 0x01, 0x1b, 0xf5, 0x6a, 0xc1, 0x26, 0x87, 0xb2, 0x01, 0xb4, + 0x2a, 0x7a, 0x3e, 0x35, 0xa2, 0xc4, 0xfa, 0x38, 0x04, 0x8e, 0x84, 0x1f, 0x04, 0x72, 0x9b, 0x52, + 0x6d, 0x01, 0x85, 0x85, 0x91, 0xe9, 0x56, 0xa5, 0xf7, 0x6e, 0x51, 0x80, 0x52, 0x30, 0x61, 0xac, + 0x1a, 0x23, 0x9b, 0x79, 0x40, 0x69, 0x9a, 0xc2, 0x8e, 0x55, 0xc6, 0xb0, 0x8d, 0xe2, 0xc7, 0x3d, + 0xa8, 0xb7, 0xcd, 0x7f, 0xea, 0x82, 0x20, 0x24, 0x5a, 0xa0, 0xe6, 0x00, 0x04, 0x8a, 0xd7, 0xc6, + 0x44, 0xd5, 0xd8, 0x1d, 0x05, 0x01, 0x5d, 0xa7, 0xa9, 0xfb, 0x98, 0xe1, 0xb2, 0x02, 0x42, 0x7d, + 0x4f, 0x58, 0x97, 0x49, 0x18, 0xd7, 0xa1, 0x0b, 0x84, 0xe2, 0x81, 0x61, 0x30, 0xef, 0x14, 0x3c, + 0x20, 0x10, 0x5e, 0x74, 0x63, 0x02, 0x6c, 0xd4, 0x30, 0xba, 0xe8, 0xa4, 0xe3, 0x80, 0x06, 0x8d, + 0x83, 0xf8, 0xf6, 0xdd, 0xfb, 0xd8, 0x00, 0xf3, 0x58, 0xee, 0xd0, 0x0b, 0x05, 0x5e, 0xda, 0x96, + 0x0f, 0xd6, 0x4a, 0xaf, 0x1d, 0x97, 0xec, 0xd1, 0x11, 0xd9, 0x7c, 0x0b, 0x91, 0xa6, 0xef, 0x6f, + 0xf3, 0x2d, 0x29, 0x51, 0x04, 0x52, 0xef, 0x17, 0x91, 0x09, 0xd1, 0xae, 0x03, 0x39, 0xc7, 0xec, + 0x74, 0xc9, 0x97, 0xc2, 0xe8, 0xba, 0x61, 0xac, 0xb7, 0x6e, 0x47, 0x8c, 0x24, 0x1e, 0x95, 0x10, + 0x6a, 0x6c, 0xa1, 0xdc, 0x04, 0xf8, 0x31, 0x7a, 0x51, 0xd4, 0xa9, 0x02, 0x42, 0x9f, 0xb7, 0xe4, + 0xa4, 0xb7, 0x94, 0x0d, 0x73, 0x84, 0x01, 0xa5, 0xbc, 0x6a, 0x5f, 0x5c, 0x45, 0x05, 0xc9, 0x0e, + 0x7e, 0x25, 0xaa, 0x82, 0x13, 0xa0, 0xb9, 0x04, 0x08, 0xb1, 0x90, 0xf0, 0xa5, 0xee, 0xe6, 0x82, + 0x20, 0x12, 0xd1, 0x07, 0x5d, 0x92, 0xf8, 0x48, 0x1d, 0x14, 0x0b, 0x72, 0x81, 0x1a, 0x28, 0x10, + 0xd3, 0x23, 0x7b, 0x7b, 0x26, 0x57, 0x67, 0xf3, 0x79, 0x35, 0x46, 0x4b, 0x64, 0x1e, 0x23, 0x24, + 0x04, 0x4f, 0x14, 0xde, 0xb0, 0xc6, 0xc8, 0x2f, 0x70, 0x90, 0x5b, 0xa3, 0xaa, 0x1f, 0x1e, 0xb2, + 0x05, 0xd2, 0x11, 0x01, 0xc6, 0x92, 0x8c, 0xda, 0x98, 0x7c, 0xd5, 0xcb, 0xc3, 0x5f, 0x64, 0x90, + 0x08, 0x64, 0xc6, 0xf3, 0x1f, 0x5a, 0x31, 0xca, 0x04, 0x28, 0x3f, 0x2f, 0x20, 0x88, 0x44, 0x44, + 0x47, 0xc9, 0x1f, 0x26, 0x37, 0x4e, 0xe6, 0xfd, 0xe2, 0xb2, 0x74, 0x50, 0x5a, 0x2c, 0x15, 0xfb, + 0x4f, 0x06, 0x63, 0xf5, 0x83, 0xe6, 0x84, 0x06, 0xcb, 0x8b, 0xe9, 0xc8, 0x88, 0x16, 0x07, 0x8b, + 0xc7, 0x66, 0xdc, 0x89, 0x57, 0x64, 0xa8, 0xa0, 0x43, 0xae, 0x1a, 0xa4, 0xeb, 0x09, 0xf7, 0x0f, + 0x8d, 0x91, 0x7c, 0x30, 0x46, 0xd7, 0x63, 0xfe, 0x1f, 0x1f, 0x22, 0x55, 0x82, 0x57, 0x0d, 0x93, + 0x39, 0x28, 0xfd, 0x43, 0xa3, 0x4c, 0xb8, 0xee, 0x4e, 0x84, 0x5a, 0x7f, 0xd3, 0xf6, 0x40, 0xed, + 0x61, 0x51, 0x96, 0x9a, 0x1e, 0xe9, 0x2c, 0x41, 0xac, 0x7d, 0xa9, 0x89, 0xe1, 0x81, 0x06, 0x6e, + 0x52, 0x7f, 0x63, 0xc8, 0xb8, 0xef, 0x20, 0x2c, 0x2e, 0x61, 0x4b, 0xe6, 0xd5, 0x29, 0xb4, 0x14, + 0x38, 0xb3, 0x78, 0x38, 0xbe, 0x3a, 0xf5, 0xb7, 0x5f, 0xd8, 0xef, 0x80, 0x31, 0x40, 0x41, 0xdf, + 0x24, 0x06, 0xd8, 0xf1, 0x45, 0x45, 0x83, 0x65, 0xa1, 0xc7, 0x51, 0x82, 0x3a, 0xa2, 0xd4, 0xb7, + 0xc8, 0x0f, 0xf9, 0xe7, 0x96, 0x83, 0x76, 0x31, 0x89, 0x20, 0x67, 0x8c, 0xbb, 0x85, 0x73, 0x85, + 0x6e, 0x50, 0x14, 0xef, 0x78, 0x13, 0xe0, 0x1b, 0xc2, 0x41, 0xf1, 0x90, 0x84, 0x1a, 0xbf, 0x96, + 0x06, 0x10, 0x12, 0xf0, 0x5b, 0xe2, 0xee, 0xe5, 0x1c, 0x90, 0x72, 0xa1, 0x8b, 0xf9, 0xab, 0xd6, + 0x16, 0xbd, 0x98, 0x7a, 0x98, 0x94, 0xfb, 0xb9, 0x8d, 0x7f, 0x50, 0x9c, 0x08, 0x3b, 0xfe, 0x31, + 0x2e, 0x90, 0x70, 0xab, 0xc1, 0xc6, 0x88, 0x72, 0xf2, 0x8f, 0xec, 0xcf, 0xb9, 0xcf, 0x5b, 0x7f, + 0xd5, 0x18, 0x3b, 0x7d, 0xd5, 0x16, 0x83, 0xd9, 0x78, 0x9f, 0x4a, 0x83, 0xb9, 0x40, 0xf3, 0xa4, + 0x10, 0x5b, 0xd2, 0xd7, 0x8b, 0xfc, 0xc2, 0x7c, 0x8b, 0x9c, 0x32, 0x3b, 0x5f, 0xc0, 0xb7, 0xcf, + 0x8a, 0x3d, 0x2e, 0x9c, 0x60, 0x1c, 0x8d, 0x33, 0xfe, 0xad, 0x96, 0x36, 0x92, 0x4c, 0xac, 0x4b, + 0xce, 0x5c, 0x49, 0x8d, 0x89, 0x56, 0xf2, 0x4f, 0x57, 0x08, 0x04, 0x3d, 0xc6, 0x8e, 0x2e, 0x29, + 0x56, 0x01, 0xd4, 0x6c, 0x3a, 0x79, 0x9d, 0xa1, 0x79, 0x99, 0xf4, 0xe8, 0x81, 0x89, 0x27, 0x48, + 0x18, 0xdc, 0x51, 0x45, 0xc2, 0x75, 0xb3, 0xb3, 0xd9, 0x4c, 0x51, 0xe1, 0x93, 0xf9, 0xf5, 0xe0, + 0x51, 0x44, 0x32, 0x89, 0xdb, 0x90, 0xaa, 0x83, 0x88, 0xcf, 0x4c, 0xce, 0xbe, 0xc2, 0x87, 0x47, + 0x17, 0x4c, 0xc1, 0x57, 0xea, 0x58, 0x12, 0xa4, 0xbd, 0x9a, 0x02, 0x7b, 0x0b, 0x90, 0x8d, 0x39, + 0xb2, 0x07, 0x89, 0x1f, 0x44, 0x52, 0x24, 0x4f, 0xe6, 0xc6, 0x33, 0x0a, 0x96, 0x0c, 0x2b, 0xde, + 0x49, 0xc5, 0x88, 0x48, 0x34, 0x6a, 0x8e, 0x47, 0x03, 0x64, 0x6e, 0x88, 0x5b, 0xbf, 0x02, 0xa3, + 0x9b, 0xa9, 0x76, 0x51, 0xda, 0x8a, 0xd6, 0x53, 0x7d, 0x8d, 0x09, 0xf7, 0xcd, 0x5f, 0x31, 0x2d, + 0xa3, 0x31, 0x58, 0xf0, 0x23, 0xe6, 0xc4, 0x53, 0x0e, 0x99, 0x27, 0xb1, 0x99, 0x90, 0x14, 0xbf, + 0x2d, 0xfa, 0xce, 0xc5, 0xdf, 0xc2, 0xc1, 0xa3, 0xbe, 0x31, 0x87, 0xee, 0x3c, 0x0b, 0x9a, 0x80, + 0xfa, 0xc9, 0xdc, 0xd3, 0x37, 0x48, 0x72, 0x0e, 0xd2, 0x40, 0xd4, 0x2b, 0xd9, 0xff, 0xc4, 0xa0, + 0xd0, 0xd3, 0x2c, 0x6e, 0x84, 0x3a, 0x66, 0x84, 0x23, 0x33, 0xb4, 0x08, 0x88, 0xf2, 0x90, 0x97, + 0xca, 0xca, 0xf2, 0xdc, 0x8b, 0x5d, 0xd7, 0x71, 0xbf, 0x90, 0x42, 0xc7, 0x18, 0xd7, 0x7e, 0xa4, + 0x71, 0x74, 0x25, 0xf4, 0xda, 0xe0, 0x9a, 0x67, 0xd4, 0x1b, 0x6d, 0x3d, 0x5f, 0x61, 0xd1, 0x39, + 0xb0, 0xdd, 0xc8, 0x8c, 0x80, 0xb6, 0xc8, 0x87, 0x21, 0xf2, 0xda, 0xf6, 0x9b, 0xf6, 0x21, 0x72, + 0xb1, 0x4f, 0xdd, 0x35, 0x53, 0xa9, 0xf9, 0x12, 0xe1, 0xc5, 0xa1, 0xf9, 0x5b, 0xf2, 0x76, 0x82, + 0x0a, 0x21, 0x54, 0x8a, 0x58, 0x5f, 0x97, 0xdd, 0xdf, 0xc4, 0x72, 0xdf, 0x0e, 0x34, 0x8a, 0xa2, + 0x00, 0xe0, 0x2e, 0x05, 0xa0, 0x3a, 0xea, 0x39, 0xba, 0xbc, 0xfc, 0x82, 0x1f, 0x08, 0x5b, 0x11, + 0x49, 0xcf, 0xfe, 0x8a, 0x6d, 0x55, 0x43, 0x72, 0x82, 0x6f, 0xac, 0xbd, 0x6c, 0x24, 0x82, 0x0d, + 0x09, 0x99, 0x25, 0x63, 0x0b, 0xd1, 0xc0, 0x63, 0x6c, 0x55, 0x63, 0xdc, 0x31, 0x5e, 0xb5, 0x60, + 0x0b, 0xa3, 0x67, 0xd0, 0xc3, 0x47, 0xcf, 0x37, 0x95, 0xb8, 0x2b, 0x95, 0xa4, 0x91, 0x02, 0x6b, + 0x0b, 0x27, 0x5f, 0x3c, 0x82, 0x9c, 0xf4, 0x90, 0x6e, 0x07, 0x99, 0x1f, 0xff, 0x39, 0xca, 0xcb, + 0x05, 0x79, 0x03, 0x7f, 0x7a, 0x3d, 0xf8, 0x5b, 0x90, 0xf1, 0xa5, 0xd0, 0x6d, 0xc3, 0x4b, 0x81, + 0xd0, 0x97, 0x4a, 0x0f, 0x73, 0x7a, 0x15, 0xfa, 0xd2, 0x53, 0xe8, 0x4b, 0xaf, 0x54, 0xc2, 0x97, + 0x5e, 0x05, 0xeb, 0x64, 0xf3, 0x59, 0x78, 0xd9, 0xdd, 0xac, 0xec, 0xfe, 0xcc, 0xe0, 0xa9, 0xce, + 0x92, 0x43, 0x37, 0x3f, 0xb4, 0x28, 0xba, 0x5b, 0xd3, 0xcf, 0xb0, 0x33, 0x67, 0x2c, 0x3c, 0x77, + 0x15, 0x77, 0x29, 0x78, 0x6d, 0x34, 0xac, 0xd5, 0xeb, 0x75, 0x9c, 0xa7, 0x65, 0x8e, 0x8b, 0xab, + 0x9a, 0x21, 0x69, 0xfc, 0xee, 0x08, 0x55, 0x97, 0xc4, 0x04, 0x7e, 0x84, 0x28, 0x09, 0x4a, 0xb7, + 0x43, 0x8f, 0x8d, 0xbc, 0x44, 0x37, 0xa5, 0x9b, 0x66, 0x3c, 0xdf, 0x09, 0x9c, 0x91, 0x09, 0xf5, + 0xdb, 0x01, 0x36, 0x00, 0x2f, 0x21, 0x0f, 0x6a, 0x14, 0x1f, 0x2d, 0xcf, 0x35, 0xd9, 0x2d, 0x05, + 0x6f, 0x40, 0xa2, 0xd4, 0x63, 0x98, 0xa4, 0x7b, 0x76, 0x1a, 0xe5, 0x45, 0x26, 0x2f, 0x73, 0x1f, + 0x0b, 0xf2, 0x46, 0xee, 0x5e, 0xc8, 0xaf, 0xfb, 0x0e, 0x42, 0x7a, 0xb7, 0x03, 0xf4, 0x89, 0x82, + 0x82, 0xeb, 0xe4, 0x84, 0xfe, 0xc4, 0x7e, 0xcb, 0x40, 0x4e, 0xd3, 0xed, 0xd0, 0x5b, 0x7a, 0x52, + 0xa5, 0xde, 0xc6, 0xab, 0x8a, 0x0c, 0xa0, 0x48, 0x02, 0xbd, 0x93, 0x87, 0x13, 0x3c, 0x74, 0x1a, + 0xe2, 0x3e, 0xbb, 0x9d, 0xe0, 0x42, 0x94, 0xc9, 0xbb, 0x8b, 0xdb, 0x12, 0x0b, 0x50, 0xc6, 0x07, + 0x62, 0xcb, 0xee, 0xc6, 0x6e, 0x49, 0x8b, 0x05, 0x73, 0xab, 0x0a, 0x26, 0xab, 0x2b, 0x7a, 0x5e, + 0xde, 0x66, 0xf6, 0x53, 0x20, 0xe6, 0x96, 0x96, 0x4a, 0x2e, 0x6e, 0x8c, 0xde, 0x3a, 0xe1, 0xb6, + 0x31, 0x98, 0x30, 0x8b, 0x90, 0x01, 0x51, 0xcc, 0x0c, 0x7e, 0xb2, 0xaf, 0x66, 0xd7, 0xed, 0xb4, + 0x63, 0xec, 0xab, 0x53, 0xd2, 0x4d, 0x64, 0x93, 0xee, 0xde, 0xe5, 0x22, 0xd7, 0x9c, 0x58, 0x92, + 0x56, 0x17, 0xcf, 0x0d, 0x47, 0xc0, 0x0f, 0xcd, 0xd1, 0x26, 0xbb, 0x62, 0x4d, 0xdf, 0xca, 0x92, + 0xfc, 0xb6, 0x56, 0x4f, 0xe8, 0xf0, 0xff, 0x4c, 0x1d, 0x5e, 0x92, 0x7e, 0x13, 0x90, 0x27, 0x6f, + 0xcb, 0xd5, 0x6c, 0x32, 0x99, 0x12, 0x85, 0x86, 0x58, 0xd5, 0x71, 0x3a, 0x12, 0xb4, 0x6c, 0x51, + 0xfe, 0x93, 0xda, 0x20, 0xa9, 0x15, 0x1b, 0x2a, 0xc2, 0xb2, 0xc6, 0x42, 0xc3, 0x86, 0xe8, 0xed, + 0x6f, 0x4c, 0x58, 0x22, 0xe9, 0x51, 0x12, 0x77, 0x4e, 0x64, 0xbb, 0xce, 0x0f, 0xa0, 0xc6, 0x9f, + 0xa0, 0x41, 0x46, 0x05, 0x5a, 0x28, 0x93, 0xb4, 0x61, 0x3b, 0xdc, 0x56, 0x52, 0x75, 0xcf, 0xf8, + 0x07, 0x45, 0xe9, 0xf1, 0x33, 0xee, 0xa7, 0xd5, 0x70, 0x3a, 0xeb, 0xc1, 0xa8, 0x8b, 0x27, 0xa3, + 0xd1, 0x40, 0x79, 0x19, 0x89, 0x35, 0x92, 0x06, 0xfd, 0x35, 0x4d, 0x4f, 0x35, 0xdc, 0xb3, 0x50, + 0x39, 0x9d, 0x2d, 0xa4, 0xa9, 0xdd, 0x17, 0xca, 0x1d, 0x1a, 0x20, 0x42, 0xd2, 0x45, 0xd5, 0xd1, + 0x69, 0x0a, 0x3e, 0xb0, 0x9d, 0x6f, 0x0c, 0xbc, 0x19, 0x2b, 0xcf, 0x05, 0x90, 0x99, 0x8c, 0xb9, + 0xaf, 0x8f, 0x7f, 0xa7, 0x5f, 0xc8, 0x04, 0x4e, 0xfd, 0xc7, 0x4c, 0x99, 0xe3, 0x5f, 0x74, 0x73, + 0xa8, 0x2b, 0xdb, 0xa2, 0x58, 0xfd, 0xe6, 0x9b, 0x21, 0x0d, 0x0d, 0x6f, 0x60, 0xd4, 0x73, 0x5b, + 0xdf, 0x07, 0x96, 0x67, 0x5c, 0xf0, 0x6e, 0xe9, 0xf8, 0x9f, 0x5a, 0x77, 0x3f, 0x8d, 0x27, 0xd7, + 0x98, 0x77, 0x3c, 0x7e, 0x1c, 0x79, 0xf1, 0x4b, 0xae, 0x98, 0x4a, 0xd5, 0x64, 0xd7, 0x4c, 0xf9, + 0x8d, 0xf6, 0x99, 0x2b, 0x96, 0xd6, 0xf1, 0x38, 0xc8, 0xd9, 0xf6, 0x46, 0x2f, 0xee, 0x92, 0xf6, + 0xa8, 0x2f, 0x4a, 0xdf, 0x56, 0x44, 0x96, 0x8c, 0xbd, 0x9a, 0x37, 0xfb, 0xcf, 0x6f, 0x5d, 0xac, + 0xfa, 0x9f, 0xdf, 0xaa, 0xdf, 0x52, 0x89, 0x6c, 0xae, 0xec, 0x36, 0x2c, 0xf6, 0x14, 0xe0, 0xd6, + 0xb0, 0x25, 0xd3, 0xc3, 0xd3, 0x64, 0xea, 0x1b, 0x95, 0x07, 0xa3, 0xfb, 0x65, 0xb8, 0x0a, 0x28, + 0xaa, 0x55, 0x1a, 0xf5, 0x16, 0x8a, 0x07, 0x9f, 0x98, 0x0b, 0x5d, 0xd5, 0xfa, 0x86, 0xf6, 0x62, + 0x3a, 0x06, 0x1f, 0xf2, 0x9d, 0x91, 0xaa, 0xa1, 0x0b, 0x45, 0x7a, 0xac, 0x76, 0x93, 0xe1, 0xac, + 0x96, 0xda, 0x07, 0x61, 0x9d, 0x5e, 0x79, 0x41, 0xb1, 0x1a, 0x0b, 0x4d, 0xd4, 0x9e, 0x9a, 0xb6, + 0x69, 0x7a, 0x4a, 0xfc, 0x97, 0x40, 0x9d, 0x89, 0x69, 0x9a, 0x65, 0xdb, 0xaa, 0x24, 0x0a, 0xdd, + 0x9d, 0x21, 0xb0, 0xc9, 0x70, 0x33, 0xb7, 0x26, 0x9a, 0xda, 0x45, 0x29, 0x62, 0x76, 0x4f, 0x8f, + 0x68, 0x7a, 0x32, 0x52, 0xfa, 0x86, 0x96, 0x05, 0x2e, 0x8c, 0x79, 0xe1, 0x2c, 0x8c, 0xc6, 0x25, + 0xe0, 0xaa, 0x82, 0x35, 0x06, 0x7d, 0xbd, 0xec, 0xb8, 0x3d, 0x91, 0xb4, 0x69, 0x5b, 0xca, 0x70, + 0x3b, 0x5c, 0xf0, 0xb2, 0x75, 0xdd, 0x38, 0x13, 0xa5, 0x84, 0x9b, 0x4b, 0x57, 0x62, 0x92, 0x5b, + 0x86, 0x6e, 0x0b, 0x0b, 0x08, 0xd9, 0x03, 0x16, 0x3a, 0xc4, 0x45, 0x28, 0xb8, 0xd7, 0x4d, 0x44, + 0x49, 0x8b, 0x00, 0xd2, 0x00, 0xca, 0x84, 0xcd, 0x5a, 0xd8, 0xbf, 0x6c, 0x21, 0xa8, 0x74, 0x1d, + 0xf7, 0x4c, 0x3b, 0x52, 0xea, 0xac, 0xd1, 0x14, 0x80, 0x75, 0xe0, 0xa5, 0x29, 0x2c, 0x35, 0x54, + 0x3a, 0xd1, 0xf1, 0xa8, 0x1a, 0xb1, 0xdf, 0x6c, 0xd8, 0xee, 0x31, 0x1f, 0x78, 0xfc, 0x28, 0x85, + 0x07, 0xf6, 0xf4, 0xd1, 0x49, 0x21, 0x78, 0x88, 0x60, 0x6e, 0x3d, 0x83, 0xb0, 0xf2, 0x27, 0x2b, + 0x98, 0x61, 0x85, 0x60, 0x6d, 0xff, 0x6b, 0x01, 0xdf, 0x7b, 0xfa, 0x58, 0xb5, 0x0c, 0x7d, 0x48, + 0x41, 0x27, 0x69, 0xbc, 0x60, 0x4f, 0xcf, 0x0f, 0xd0, 0x2b, 0xc5, 0x22, 0xf0, 0x48, 0x67, 0x4d, + 0x9b, 0xa8, 0x26, 0x7a, 0x7d, 0x63, 0x65, 0xa0, 0x6d, 0xba, 0xac, 0x7e, 0x31, 0x26, 0xf8, 0x32, + 0x0e, 0xef, 0xe6, 0x54, 0xc6, 0xa6, 0x22, 0x33, 0xda, 0x99, 0x82, 0x22, 0x4b, 0x5c, 0xf1, 0x23, + 0x41, 0x62, 0x92, 0xcc, 0x79, 0xc8, 0x77, 0x97, 0x70, 0xed, 0x63, 0x6e, 0xcd, 0x96, 0x8a, 0x87, + 0x76, 0x7d, 0xf4, 0x2c, 0x08, 0x05, 0xa9, 0xe1, 0x3d, 0x4c, 0x3c, 0x4e, 0xeb, 0xdd, 0x08, 0xe7, + 0xb9, 0x2d, 0x15, 0xe5, 0x6d, 0x7f, 0xe3, 0x0b, 0x1d, 0xb5, 0x26, 0xf8, 0x1b, 0x41, 0xe1, 0x6b, + 0x40, 0xee, 0xed, 0x1f, 0x94, 0xb7, 0xfa, 0xae, 0xb2, 0xe0, 0x15, 0x4e, 0xa5, 0x68, 0x9b, 0x5a, + 0xa0, 0x1e, 0xe8, 0x69, 0x58, 0x1a, 0x35, 0xea, 0x7c, 0x10, 0x34, 0x42, 0x05, 0x3d, 0xae, 0x4d, + 0x2d, 0x05, 0x24, 0xa5, 0x6d, 0x61, 0xc3, 0x98, 0x85, 0xed, 0x6b, 0x49, 0xda, 0x92, 0xc2, 0xec, + 0xc3, 0xd0, 0xbe, 0x98, 0xd2, 0x92, 0x92, 0x51, 0xff, 0xf2, 0x45, 0xc1, 0xb3, 0x96, 0xf8, 0x83, + 0x31, 0x5f, 0x33, 0xfb, 0xfd, 0x1b, 0x6f, 0x2d, 0x68, 0xeb, 0xeb, 0xbc, 0x4b, 0x31, 0x64, 0xa3, + 0x33, 0x95, 0x18, 0x7c, 0x62, 0x5a, 0xac, 0xd9, 0x13, 0x15, 0x45, 0x2d, 0x1d, 0x65, 0xc7, 0xe4, + 0xac, 0x83, 0x6e, 0x2d, 0xd9, 0xaa, 0x1a, 0x3a, 0xbd, 0xac, 0xb5, 0x2d, 0xa2, 0xbc, 0xd4, 0x68, + 0x5e, 0x8e, 0xcf, 0xeb, 0x87, 0xf3, 0xf2, 0x7c, 0x9e, 0x96, 0x14, 0xe7, 0x08, 0xbf, 0xe5, 0x2a, + 0x22, 0xae, 0xd4, 0x0c, 0x12, 0xbf, 0x36, 0x0f, 0xc2, 0x4f, 0xb5, 0xed, 0x45, 0xbe, 0xc4, 0x05, + 0x3b, 0x12, 0x60, 0x7f, 0x13, 0xfe, 0x98, 0xe9, 0x69, 0x43, 0xdf, 0xc6, 0x33, 0x62, 0x91, 0xe9, + 0xbd, 0xbe, 0x04, 0xae, 0xcd, 0xa1, 0x40, 0x58, 0x9b, 0x01, 0xd4, 0x5d, 0x4e, 0xac, 0x04, 0xe6, + 0x25, 0x23, 0x7c, 0x6c, 0x79, 0xc8, 0x2a, 0x3e, 0x50, 0x12, 0x6b, 0x97, 0x7e, 0xc3, 0x64, 0x75, + 0xd0, 0x3d, 0xd2, 0xc7, 0x1b, 0x00, 0xac, 0xa3, 0xbf, 0x12, 0x3d, 0x6c, 0xc9, 0x37, 0xf0, 0x70, + 0x98, 0xd0, 0x2b, 0x0c, 0x2f, 0xb3, 0xf5, 0x61, 0xd0, 0x24, 0xfe, 0x2f, 0xa8, 0x87, 0x75, 0x9d, + 0xed, 0x93, 0x52, 0x97, 0x3e, 0x19, 0xa6, 0x64, 0x7a, 0x49, 0x8f, 0x52, 0xdf, 0x4d, 0x7b, 0x94, + 0x46, 0x75, 0x10, 0xc0, 0x80, 0x24, 0xbe, 0x0f, 0x27, 0x7f, 0x0e, 0x07, 0x52, 0x0f, 0xa6, 0x86, + 0x05, 0xbe, 0x09, 0x85, 0xbb, 0x71, 0xbf, 0x00, 0x8b, 0x97, 0x5f, 0xf1, 0xd6, 0x21, 0x11, 0x50, + 0x25, 0x3c, 0xc3, 0x4d, 0x52, 0xec, 0xaa, 0x16, 0x3b, 0x8f, 0x10, 0xe7, 0x4b, 0xe2, 0x33, 0x72, + 0x28, 0x84, 0x76, 0x22, 0x28, 0x83, 0x06, 0x3d, 0x7c, 0xe1, 0x68, 0xa1, 0xc0, 0xb6, 0xe8, 0x86, + 0xae, 0xa1, 0x33, 0xbb, 0xf5, 0x41, 0x98, 0x22, 0x2f, 0x74, 0xcd, 0x2f, 0x69, 0xfc, 0x01, 0xe8, + 0x67, 0x2a, 0x2a, 0x34, 0x1f, 0xc3, 0x38, 0x8c, 0x7e, 0xd3, 0xf0, 0x4c, 0xe5, 0x21, 0x1c, 0xaa, + 0x7f, 0x17, 0xc0, 0x01, 0xca, 0x72, 0x43, 0x64, 0x31, 0x23, 0xf4, 0xe8, 0xf9, 0x1c, 0xa6, 0x3f, + 0x81, 0xd3, 0xc7, 0x45, 0x94, 0x3e, 0x86, 0x70, 0xfa, 0xf8, 0x77, 0x21, 0x1e, 0xfe, 0x53, 0x28, + 0x7d, 0x5c, 0x40, 0x69, 0x08, 0xc2, 0xe1, 0xdf, 0x85, 0x90, 0xf1, 0xc3, 0x76, 0x98, 0x9f, 0xd0, + 0x1e, 0x15, 0x13, 0x2f, 0x57, 0xd3, 0xc8, 0xa0, 0xf0, 0x8c, 0xdf, 0x46, 0x34, 0xb9, 0x20, 0xad, + 0x5a, 0x5b, 0xdb, 0xb0, 0xdd, 0xf0, 0x4d, 0x7b, 0x94, 0x41, 0x0a, 0xd9, 0x5d, 0x61, 0xff, 0x81, + 0x4a, 0x84, 0xfc, 0x42, 0x23, 0xda, 0x86, 0x09, 0xdd, 0xb2, 0x23, 0xb8, 0x70, 0x6a, 0xa8, 0xbb, + 0x6c, 0x2e, 0x3a, 0xc2, 0x6c, 0xce, 0x63, 0x38, 0xdf, 0xdd, 0x18, 0x62, 0xc1, 0x27, 0x10, 0xff, + 0x98, 0x01, 0x27, 0x86, 0x61, 0x67, 0x73, 0xdb, 0x78, 0x2c, 0xce, 0x2e, 0xa6, 0xb2, 0x91, 0x5f, + 0x82, 0x30, 0xa1, 0xd9, 0xdf, 0x33, 0xac, 0x4e, 0xb4, 0x6e, 0x16, 0xeb, 0x66, 0x97, 0xd5, 0xdd, + 0x51, 0xac, 0x65, 0x15, 0x73, 0x58, 0x31, 0xb7, 0xac, 0x62, 0xc3, 0xea, 0x2c, 0xab, 0x98, 0xc7, + 0x8a, 0xf9, 0x65, 0x15, 0x9b, 0xf4, 0x7a, 0x76, 0x50, 0x37, 0xc3, 0xb2, 0x23, 0xbc, 0xe8, 0xc8, + 0x9d, 0x1f, 0x3a, 0x1b, 0xb6, 0x8e, 0x68, 0x53, 0x63, 0xa7, 0xa2, 0x85, 0x42, 0x89, 0x60, 0xab, + 0xc3, 0xbf, 0x3b, 0x0f, 0x76, 0x74, 0xed, 0xb6, 0xd4, 0x0f, 0x67, 0xc1, 0x56, 0x17, 0x11, 0x49, + 0x14, 0xa8, 0xa9, 0x7f, 0x3c, 0x0b, 0x31, 0x75, 0xef, 0xc9, 0xbd, 0xaa, 0x69, 0xd7, 0x46, 0xe7, + 0xe5, 0xd1, 0x18, 0x7d, 0x80, 0x99, 0x5a, 0xd4, 0x26, 0x07, 0xc3, 0xa0, 0x86, 0x25, 0x68, 0x5f, + 0xc3, 0x43, 0xa0, 0x21, 0xee, 0xe1, 0xa4, 0xbf, 0x2d, 0x86, 0xfa, 0x80, 0x5c, 0x63, 0x3b, 0xd8, + 0xd8, 0x17, 0x36, 0x40, 0x97, 0xee, 0xf1, 0x4a, 0x33, 0xdd, 0x42, 0xe0, 0x01, 0x4d, 0x52, 0x31, + 0x2b, 0x99, 0x85, 0xdc, 0xde, 0xfa, 0x78, 0x05, 0xdb, 0x44, 0x0b, 0x63, 0x16, 0xe5, 0x11, 0x7e, + 0x09, 0x43, 0xca, 0xdf, 0x5b, 0xc3, 0x91, 0xe1, 0x2f, 0xd8, 0x22, 0xb1, 0xa3, 0xbd, 0xa9, 0x3f, + 0x8b, 0x4b, 0x0c, 0x7c, 0xd6, 0x7b, 0x08, 0x5c, 0xfa, 0x1e, 0x98, 0xf7, 0xd0, 0xd7, 0x8d, 0xca, + 0x89, 0xf0, 0xeb, 0xba, 0x40, 0x26, 0x92, 0xb5, 0x20, 0x1c, 0x2f, 0x6d, 0xbc, 0x46, 0x45, 0x03, + 0x1c, 0x0b, 0xd4, 0xde, 0xb6, 0x5d, 0xbb, 0x0c, 0xfb, 0x85, 0x66, 0x41, 0x72, 0x02, 0x9c, 0x17, + 0xb2, 0x78, 0x19, 0x0c, 0x63, 0x2d, 0xe2, 0x4f, 0x3e, 0x57, 0x14, 0xe7, 0x54, 0x90, 0xf8, 0x95, + 0x02, 0x71, 0x49, 0xdf, 0x86, 0x7f, 0x55, 0x2f, 0x4c, 0x9a, 0x80, 0xc2, 0x59, 0xea, 0x5b, 0xc8, + 0x74, 0x68, 0x98, 0x8c, 0xd2, 0x3f, 0x84, 0x8d, 0x25, 0xe3, 0x16, 0x8d, 0x1e, 0x6a, 0x4a, 0x9f, + 0x1e, 0xfa, 0xe2, 0xd9, 0xf6, 0xd6, 0xb7, 0xd4, 0xaf, 0x28, 0x12, 0xfa, 0x6e, 0xbc, 0x2c, 0xef, + 0xd8, 0x9b, 0x6a, 0x9a, 0xb0, 0x43, 0xcf, 0x6b, 0xbc, 0x09, 0x15, 0x83, 0xc2, 0xe9, 0x64, 0xea, + 0x84, 0xe5, 0xe4, 0x45, 0x5f, 0xb9, 0x6f, 0x08, 0xe1, 0x37, 0x17, 0x1d, 0xb9, 0xcd, 0xf2, 0x1f, + 0xb3, 0x16, 0xb5, 0x16, 0xa6, 0xf1, 0xd3, 0x25, 0xcd, 0x81, 0x62, 0x35, 0xd1, 0x17, 0x96, 0x52, + 0x55, 0x4a, 0x6c, 0x88, 0xe9, 0x8e, 0x9b, 0xd4, 0x40, 0xc7, 0xce, 0xa4, 0x87, 0x8e, 0x5f, 0x91, + 0x71, 0x6f, 0x74, 0xbc, 0x68, 0x79, 0x94, 0x2c, 0x42, 0xa0, 0x7a, 0xf2, 0x61, 0x2f, 0x59, 0x0b, + 0x0b, 0x6e, 0x07, 0x96, 0x49, 0xe7, 0x46, 0x92, 0x03, 0x70, 0x1a, 0x5e, 0x74, 0x94, 0x15, 0x0d, + 0x59, 0x4b, 0x1b, 0xca, 0x06, 0x0d, 0xed, 0x7c, 0xa2, 0xa1, 0xfe, 0xd2, 0x86, 0x72, 0x41, 0x43, + 0xcd, 0x4f, 0x34, 0xa4, 0x2d, 0x6d, 0x28, 0x1f, 0x34, 0xb4, 0xeb, 0x37, 0xc4, 0x31, 0x09, 0xe1, + 0xd7, 0xe2, 0x84, 0xc7, 0x98, 0xcd, 0x5d, 0xc2, 0x5f, 0x6e, 0x38, 0xd7, 0xe2, 0x8d, 0xe6, 0x71, + 0xad, 0xc7, 0x1a, 0xcd, 0xb5, 0x58, 0x83, 0xb9, 0x16, 0x35, 0x96, 0xc3, 0x42, 0x88, 0xde, 0x58, + 0xb4, 0xa8, 0xa3, 0x7e, 0x94, 0xcf, 0xa9, 0x7a, 0x08, 0x70, 0x78, 0x65, 0xb0, 0x2c, 0xc4, 0x9d, + 0xf3, 0x68, 0xc8, 0x99, 0x3a, 0xa1, 0x1a, 0x4e, 0xec, 0xf7, 0x79, 0x82, 0xcf, 0xf3, 0xfc, 0x31, + 0x13, 0x89, 0x6d, 0x96, 0x73, 0xa5, 0x92, 0x58, 0xaf, 0xdb, 0x54, 0x6b, 0xdd, 0xce, 0xe7, 0xaa, + 0xa5, 0xc2, 0x9c, 0x17, 0xaf, 0xdd, 0x35, 0x8b, 0x1c, 0x34, 0x14, 0xe0, 0x8e, 0x7e, 0x03, 0x48, + 0x40, 0x6e, 0x94, 0x4e, 0xa7, 0xc5, 0x8c, 0x6b, 0x27, 0xf2, 0x11, 0x05, 0x9a, 0x21, 0x0d, 0x27, + 0xe8, 0x00, 0x41, 0xa3, 0xb7, 0x19, 0x40, 0xee, 0x74, 0xb7, 0xfe, 0x98, 0x8d, 0xb6, 0xc5, 0x16, + 0x8a, 0xd8, 0xc2, 0x03, 0x3a, 0x8b, 0xd0, 0xa7, 0xd3, 0xbd, 0x5d, 0x91, 0x39, 0xa6, 0x71, 0xa5, + 0x78, 0x1c, 0x01, 0xbc, 0xdb, 0xe2, 0x3d, 0x1a, 0x8f, 0x68, 0x1d, 0xe0, 0x11, 0x50, 0x79, 0xa1, + 0x00, 0x0b, 0xdd, 0x03, 0xea, 0xa4, 0x57, 0x28, 0xb6, 0x5d, 0x94, 0xc8, 0x2f, 0x7a, 0x3d, 0xbc, + 0xf8, 0xc3, 0x39, 0xc3, 0x71, 0x20, 0xba, 0x08, 0xe6, 0x18, 0x6e, 0x98, 0xcf, 0xaf, 0x0c, 0x76, + 0xf8, 0xc7, 0x2c, 0x31, 0xda, 0x1e, 0x4e, 0xaa, 0x9e, 0x01, 0x3a, 0xb9, 0x91, 0x9d, 0x73, 0xca, + 0x4a, 0x67, 0xbe, 0xa0, 0xf4, 0x9c, 0x12, 0x3d, 0x50, 0x87, 0xfc, 0x6f, 0x2c, 0x41, 0x67, 0xec, + 0x1b, 0x4b, 0x1e, 0x57, 0xe7, 0x46, 0xf1, 0x01, 0x80, 0xe4, 0x03, 0x00, 0x43, 0xf0, 0xf1, 0xc0, + 0x75, 0x37, 0x12, 0x51, 0x9c, 0x76, 0xaa, 0x72, 0xf2, 0x1f, 0x00, 0x59, 0xc0, 0x5e, 0x3d, 0xf7, + 0x25, 0xa4, 0xd9, 0x0d, 0x45, 0x53, 0xfb, 0x7a, 0x15, 0x79, 0xba, 0xe5, 0xa0, 0xcf, 0x12, 0x6e, + 0x87, 0x58, 0x68, 0x9c, 0xa2, 0x76, 0x47, 0x31, 0xd5, 0xc3, 0xa4, 0xc5, 0x91, 0xd2, 0x96, 0x98, + 0x61, 0x78, 0x61, 0x53, 0x37, 0x7a, 0xd1, 0x91, 0x73, 0x54, 0x6c, 0xf4, 0x56, 0x8d, 0x83, 0xb3, + 0x37, 0xc2, 0xf2, 0x84, 0x1e, 0x5c, 0xc3, 0xe6, 0x16, 0x23, 0xd0, 0x47, 0xcf, 0xa9, 0x12, 0x00, + 0x5b, 0xc0, 0x91, 0x78, 0x48, 0xed, 0x9c, 0x1e, 0xd1, 0x3d, 0xa2, 0x2d, 0xd0, 0x2f, 0x1f, 0xa6, + 0xb0, 0x0f, 0x66, 0xef, 0x5b, 0x4a, 0x4b, 0x7d, 0xb3, 0x1f, 0x57, 0xce, 0xdf, 0xb7, 0x54, 0x62, + 0x38, 0xd8, 0xc8, 0xa2, 0xbd, 0xd1, 0x1b, 0xde, 0xb7, 0x94, 0x89, 0x6f, 0x31, 0x83, 0xa3, 0x0d, + 0x2e, 0x99, 0x25, 0x37, 0x6f, 0x2b, 0x00, 0xf5, 0x03, 0xc0, 0xc8, 0x47, 0x80, 0x0d, 0x07, 0x21, + 0xa0, 0x12, 0xfd, 0x45, 0x7a, 0x32, 0xab, 0x68, 0x1c, 0xff, 0xf7, 0x81, 0x15, 0x96, 0xd3, 0x12, + 0x6c, 0xff, 0x43, 0x8f, 0x88, 0x06, 0xf0, 0xe0, 0x4f, 0x80, 0x48, 0x99, 0xac, 0x3f, 0xb3, 0x07, + 0x18, 0x02, 0x0c, 0x36, 0x6d, 0x7f, 0xfc, 0x2d, 0xbc, 0x6b, 0xc0, 0xbd, 0x87, 0xa7, 0x4e, 0xfc, + 0xd4, 0xda, 0xeb, 0x5b, 0x66, 0x2c, 0x92, 0xb2, 0xbc, 0x3d, 0x83, 0xa3, 0x4a, 0x28, 0xff, 0xbf, + 0x80, 0x23, 0xd8, 0x66, 0x67, 0xe5, 0xd4, 0x45, 0xa1, 0x82, 0xf2, 0xff, 0x08, 0x54, 0x9f, 0x30, + 0xcc, 0x33, 0x93, 0xd0, 0x32, 0xd9, 0xd5, 0xff, 0xe4, 0x92, 0x1f, 0x34, 0x97, 0xee, 0xb2, 0xf1, + 0x1f, 0x7f, 0xe3, 0xe6, 0xcb, 0xb3, 0xad, 0x86, 0xb7, 0xd4, 0x81, 0xd0, 0x0e, 0xeb, 0x42, 0x40, + 0x91, 0xa2, 0xbf, 0xc9, 0x27, 0xe8, 0xd6, 0xd0, 0x4b, 0xc2, 0xc3, 0xfa, 0x7a, 0x7f, 0xc3, 0xdc, + 0xca, 0xae, 0xaf, 0x77, 0x37, 0x3a, 0x5b, 0xd9, 0xed, 0x36, 0x25, 0x9c, 0x04, 0x49, 0x37, 0x46, + 0x5d, 0xd5, 0xb8, 0x26, 0xec, 0xda, 0xc5, 0xfa, 0x7a, 0x24, 0x81, 0x9a, 0xdb, 0xc4, 0xea, 0x11, + 0x6e, 0xe4, 0x2b, 0x4c, 0x02, 0x21, 0x00, 0xda, 0xce, 0x50, 0x74, 0xfb, 0xa6, 0xd1, 0x75, 0x4d, + 0x83, 0x9e, 0x40, 0x30, 0xab, 0x81, 0x1b, 0x4b, 0x0c, 0xfb, 0x06, 0xee, 0xb9, 0x5a, 0x03, 0xa1, + 0x0b, 0xc4, 0x31, 0x23, 0xba, 0xdd, 0x8d, 0xe9, 0xaf, 0xaa, 0x6f, 0x28, 0x7e, 0x3b, 0x66, 0x48, + 0x03, 0x81, 0xd5, 0xb0, 0x85, 0x87, 0x38, 0x1f, 0xb7, 0x1c, 0x67, 0xf1, 0x09, 0xb5, 0x1c, 0xb1, + 0xf9, 0xd0, 0x96, 0x91, 0x0f, 0xfe, 0x75, 0x0d, 0xa7, 0x8b, 0x11, 0x41, 0x51, 0x84, 0x5f, 0x4e, + 0x3d, 0x2e, 0x64, 0x16, 0x13, 0xb9, 0xfc, 0xcf, 0xde, 0x9a, 0xa0, 0x93, 0xba, 0x01, 0xc9, 0xf0, + 0x9e, 0x0e, 0x77, 0xfa, 0x63, 0x7e, 0x8a, 0xc8, 0x42, 0x9f, 0x47, 0x0c, 0x1c, 0x80, 0x3e, 0x03, + 0x4a, 0x37, 0x04, 0xca, 0x2e, 0xf5, 0xb6, 0xe1, 0x00, 0xe8, 0xf2, 0xca, 0xe0, 0xd6, 0x5f, 0xfc, + 0xb0, 0x58, 0x48, 0x1f, 0x5e, 0x94, 0x1d, 0x81, 0xe4, 0x2c, 0x64, 0x6b, 0xcc, 0xf9, 0x73, 0xee, + 0xd9, 0xbd, 0x17, 0x3d, 0x28, 0x5c, 0x13, 0x3b, 0x6f, 0x41, 0xdf, 0xaa, 0xb3, 0x03, 0xf0, 0x5a, + 0x70, 0x89, 0x4b, 0x73, 0x4f, 0x65, 0x41, 0xad, 0xc4, 0x5b, 0xa8, 0x49, 0xcf, 0x65, 0xd4, 0x7b, + 0xf7, 0xa2, 0x66, 0xa3, 0xeb, 0xb2, 0x6f, 0xf9, 0x57, 0xea, 0x72, 0x4d, 0xf9, 0x5e, 0xc7, 0x41, + 0xd6, 0x94, 0x54, 0x2a, 0x19, 0x18, 0xdf, 0x15, 0x6c, 0x20, 0x60, 0x20, 0x8a, 0x7f, 0x71, 0x88, + 0x9a, 0x7a, 0xa9, 0x6b, 0x3e, 0x5d, 0x0b, 0x0a, 0xda, 0x8e, 0x7f, 0x25, 0xfd, 0xce, 0xfb, 0x16, + 0xd6, 0x5d, 0x72, 0x6c, 0xfc, 0x85, 0xaf, 0x07, 0x80, 0xfd, 0xf2, 0xa1, 0x82, 0x95, 0xfb, 0x39, + 0xe0, 0xb3, 0x49, 0x76, 0x73, 0xdb, 0x3d, 0x80, 0xf8, 0x9e, 0x0b, 0x8a, 0xf6, 0xbb, 0xa0, 0x96, + 0xc2, 0x48, 0x96, 0xf5, 0x0e, 0xdc, 0x92, 0x8b, 0xfe, 0xe3, 0x55, 0x92, 0xd1, 0xf6, 0xed, 0xfa, + 0xd4, 0x26, 0x7d, 0x30, 0xfa, 0xa6, 0xbc, 0xf4, 0x58, 0x5b, 0xfa, 0x42, 0xed, 0xca, 0x5f, 0x34, + 0x76, 0xc1, 0x33, 0xbc, 0x4f, 0xf2, 0xcd, 0xb3, 0x91, 0x22, 0x48, 0x73, 0xdb, 0xbb, 0x31, 0x91, + 0x84, 0x8d, 0x34, 0xb5, 0xac, 0x14, 0xf1, 0x4b, 0x7d, 0xf7, 0xe4, 0xbc, 0x00, 0x22, 0x6b, 0x71, + 0x74, 0x71, 0x67, 0xf7, 0x7e, 0x44, 0xf1, 0xa8, 0xbf, 0x83, 0x87, 0x32, 0x60, 0x8c, 0xe1, 0x98, + 0x2e, 0x52, 0xf8, 0x52, 0x26, 0xfa, 0x30, 0x98, 0x76, 0x12, 0xed, 0x03, 0xf8, 0xe0, 0x3b, 0xbe, + 0x7b, 0x97, 0x8f, 0xbf, 0x9d, 0xd2, 0x30, 0xdf, 0x55, 0x16, 0x01, 0x3c, 0xc6, 0x6e, 0x65, 0xf7, + 0x79, 0x9e, 0x13, 0x39, 0xc1, 0x65, 0x31, 0xc2, 0xff, 0xf3, 0x5b, 0xd5, 0xc7, 0x01, 0xf7, 0x49, + 0xef, 0x18, 0x63, 0x56, 0x60, 0x83, 0xda, 0xba, 0x75, 0xdb, 0xec, 0xfa, 0xa6, 0xa7, 0x6f, 0x35, + 0xff, 0x5c, 0x9e, 0x3a, 0x2f, 0x0a, 0x0c, 0x64, 0x7a, 0x48, 0x45, 0x5d, 0x0f, 0xc3, 0x6d, 0xfd, + 0x31, 0x73, 0xd2, 0x6a, 0x77, 0x8e, 0x5e, 0x5f, 0x72, 0xbd, 0x8e, 0xcf, 0xdb, 0xa2, 0x6b, 0x97, + 0x10, 0xab, 0x4e, 0x1a, 0x2f, 0x4d, 0x80, 0xbe, 0xe4, 0x46, 0x31, 0x4f, 0x61, 0x7e, 0x4a, 0x64, + 0x4e, 0xcd, 0x73, 0xbf, 0xcb, 0x5f, 0x35, 0x42, 0x3d, 0xb6, 0x43, 0x36, 0x2f, 0xd7, 0x75, 0xdb, + 0xad, 0x19, 0x72, 0x0e, 0x8c, 0xe4, 0x2c, 0x9b, 0x3b, 0xce, 0x0f, 0x31, 0xa6, 0x2c, 0x47, 0x7d, + 0x8b, 0x27, 0x7d, 0xbe, 0x03, 0xad, 0xeb, 0xe1, 0x49, 0x1d, 0x6e, 0x25, 0x7a, 0xde, 0x47, 0x3c, + 0x47, 0x54, 0xff, 0x54, 0x12, 0xaf, 0x14, 0x38, 0xdf, 0x89, 0x3b, 0xa9, 0x35, 0x07, 0xd6, 0x3c, + 0xf9, 0xe1, 0xfc, 0xac, 0xcf, 0xd4, 0x6e, 0x15, 0x1f, 0xd0, 0x5f, 0x01, 0x35, 0x43, 0xf6, 0x92, + 0xfd, 0x39, 0xc7, 0x36, 0x78, 0x6f, 0x50, 0xea, 0xcf, 0x44, 0x6f, 0x9e, 0x6b, 0x04, 0x63, 0x4c, + 0x29, 0x16, 0x49, 0x38, 0x34, 0x31, 0x89, 0xce, 0x09, 0x9e, 0xa7, 0x2b, 0xb6, 0x27, 0xb3, 0x96, + 0xc4, 0x16, 0x5e, 0xd4, 0x15, 0xe7, 0x01, 0x10, 0xf4, 0xfa, 0x24, 0xf1, 0xe8, 0x09, 0xef, 0xe0, + 0x4b, 0x3a, 0xfc, 0xd0, 0x1b, 0xdc, 0xa2, 0x20, 0xa2, 0x8b, 0x87, 0xc8, 0xc2, 0x33, 0xd0, 0xce, + 0x54, 0xbd, 0x4b, 0xa6, 0x17, 0xbd, 0x84, 0x78, 0xdd, 0xba, 0xdb, 0x15, 0x93, 0xdf, 0x65, 0xea, + 0xac, 0x18, 0x26, 0x5a, 0xe6, 0x46, 0x8b, 0xae, 0xe9, 0xcc, 0xe3, 0xd6, 0x25, 0x5a, 0xec, 0x04, + 0x83, 0x30, 0xb0, 0x54, 0xbc, 0x9b, 0xc2, 0x32, 0xb6, 0xc5, 0x5a, 0xed, 0x4b, 0x2d, 0x0b, 0x62, + 0x83, 0x97, 0x51, 0x63, 0xd8, 0x41, 0x17, 0x09, 0x6d, 0xfb, 0xc7, 0xcf, 0xaa, 0xe6, 0xdd, 0x3d, + 0xaf, 0xd1, 0x18, 0x12, 0x8e, 0x5b, 0xf1, 0x7b, 0xfe, 0xf7, 0x6f, 0xea, 0x46, 0x41, 0x7d, 0x53, + 0xa1, 0x1c, 0xfe, 0x7a, 0x45, 0x25, 0x7a, 0xcd, 0x31, 0xe6, 0xaa, 0x39, 0x0d, 0xb5, 0xe5, 0x05, + 0x3c, 0xa3, 0x77, 0xcc, 0xdd, 0xab, 0x13, 0xc1, 0x57, 0xf0, 0xbc, 0xe3, 0x4f, 0xbf, 0xa3, 0x82, + 0xdf, 0x51, 0xfe, 0xe7, 0x36, 0xc8, 0xa1, 0x55, 0x7c, 0xa8, 0xc9, 0xf4, 0x0a, 0x57, 0x02, 0x5d, + 0x53, 0x92, 0x92, 0xc2, 0xf5, 0x95, 0x50, 0x00, 0x4f, 0x1d, 0x6d, 0x84, 0x91, 0x5c, 0x41, 0x3e, + 0x0c, 0x3a, 0x60, 0x5f, 0xaf, 0xc3, 0xc2, 0x41, 0x7e, 0x96, 0xcf, 0xa7, 0x1f, 0x8f, 0x0b, 0xe7, + 0xe7, 0xb8, 0x7c, 0xf6, 0xed, 0xb6, 0x70, 0xfe, 0x98, 0xcf, 0xa7, 0x5f, 0x4e, 0x0b, 0xe7, 0xf7, + 0xc2, 0xf9, 0xc5, 0x1a, 0x3a, 0x03, 0x39, 0xa9, 0x7a, 0x1f, 0x6f, 0xe4, 0xe2, 0x8e, 0x02, 0x44, + 0x8d, 0x9e, 0x7b, 0x87, 0xce, 0x50, 0x4b, 0xe0, 0x17, 0x34, 0x25, 0x22, 0xe9, 0x12, 0x8a, 0x27, + 0xfb, 0x0f, 0x80, 0x45, 0xea, 0x44, 0xc0, 0x36, 0x44, 0xef, 0xeb, 0x94, 0xfc, 0x7e, 0x18, 0xe3, + 0x6f, 0xeb, 0xfb, 0xc9, 0x33, 0x97, 0x7a, 0xdf, 0xff, 0xda, 0x7d, 0x0b, 0xb9, 0x33, 0x67, 0x7f, + 0x46, 0xc9, 0x97, 0xfa, 0xbb, 0xba, 0x65, 0x3d, 0x02, 0xfe, 0x21, 0x4b, 0x3e, 0x6f, 0xf8, 0xe9, + 0x85, 0xef, 0x02, 0xb2, 0xf4, 0x17, 0x12, 0xd2, 0x30, 0xad, 0x82, 0x9c, 0x26, 0x7e, 0x60, 0xee, + 0x6d, 0x01, 0x51, 0x42, 0x27, 0x65, 0x09, 0xbb, 0xa1, 0x63, 0xbc, 0xf4, 0x92, 0x7f, 0x45, 0xbf, + 0xfd, 0x68, 0xd2, 0x43, 0x44, 0x57, 0x45, 0xfa, 0x63, 0x06, 0xad, 0x42, 0xd9, 0x4b, 0x48, 0x6c, + 0xda, 0x76, 0x82, 0xfa, 0x60, 0xfb, 0xfe, 0x97, 0xbf, 0xe8, 0x36, 0xc8, 0x9c, 0x2e, 0xbd, 0x8f, + 0x06, 0x87, 0xf8, 0xce, 0x17, 0x2f, 0xb2, 0x9f, 0x77, 0xdc, 0x0f, 0x53, 0xe2, 0xbb, 0xbc, 0xe1, + 0xc7, 0x55, 0xa9, 0xc5, 0x25, 0xe9, 0xbb, 0x2b, 0x00, 0x63, 0x20, 0xdf, 0x17, 0x0b, 0x00, 0xbb, + 0x4b, 0x79, 0x0e, 0x09, 0x0b, 0x51, 0x34, 0x00, 0x10, 0xdf, 0x2b, 0xda, 0x07, 0x82, 0x0f, 0x7e, + 0x81, 0xb7, 0x53, 0xd3, 0xc6, 0xc8, 0x71, 0xa1, 0xfa, 0x00, 0x4d, 0xb0, 0x41, 0x6f, 0x10, 0x49, + 0xfc, 0x6f, 0xc1, 0xfd, 0x8e, 0x8d, 0x98, 0x42, 0x7e, 0xf0, 0xdf, 0xe2, 0xbf, 0x83, 0x35, 0xda, + 0x26, 0x8f, 0x36, 0xce, 0x57, 0xc2, 0x22, 0x5d, 0x4b, 0x99, 0xb8, 0x85, 0xfd, 0xe0, 0x1a, 0x31, + 0x57, 0xd5, 0xc5, 0xaf, 0xee, 0xf0, 0x84, 0x34, 0xf5, 0x57, 0x4e, 0xd6, 0x78, 0x97, 0x79, 0x81, + 0x04, 0x5e, 0x1b, 0x04, 0x16, 0x70, 0xa8, 0x7a, 0x42, 0x4c, 0xfb, 0x30, 0x26, 0x31, 0xd8, 0x9b, + 0x17, 0x62, 0xae, 0x1e, 0x99, 0x5d, 0x3f, 0x98, 0x9f, 0xda, 0x4d, 0x86, 0x43, 0x86, 0xf0, 0xc5, + 0x98, 0x47, 0x39, 0x1f, 0xc6, 0x36, 0xb8, 0x91, 0x1b, 0xa4, 0x21, 0x3f, 0x43, 0x7f, 0x6e, 0xc7, + 0xbb, 0x3d, 0xe8, 0xca, 0x00, 0x55, 0x81, 0x6e, 0xf8, 0xb5, 0x6c, 0xdd, 0xe7, 0x33, 0xe8, 0x89, + 0x09, 0x84, 0x59, 0xa7, 0x24, 0x1a, 0xe6, 0xa9, 0x74, 0x5d, 0xb8, 0xf9, 0xe8, 0x7e, 0x0b, 0xa8, + 0x4c, 0x7a, 0x57, 0xbb, 0x5d, 0x67, 0xf2, 0x80, 0x72, 0xbc, 0xf6, 0x18, 0xbd, 0xb0, 0x2d, 0x59, + 0xab, 0x3b, 0x1e, 0x67, 0x55, 0x24, 0x43, 0x52, 0x25, 0x0b, 0xe4, 0xb7, 0xda, 0x02, 0xef, 0xd6, + 0x92, 0x49, 0xab, 0xce, 0x79, 0xee, 0xa0, 0x87, 0x79, 0x06, 0x3a, 0xfb, 0x13, 0x83, 0x15, 0x48, + 0xcc, 0xcb, 0x5c, 0x32, 0xea, 0x18, 0x1c, 0x47, 0x52, 0xeb, 0x18, 0xf9, 0x86, 0x06, 0x15, 0x11, + 0x30, 0xea, 0x89, 0x85, 0xfc, 0x3a, 0xa9, 0x20, 0x6c, 0xae, 0x33, 0x9f, 0xa2, 0x77, 0x8d, 0x61, + 0x02, 0x5d, 0x47, 0x16, 0xd3, 0xd4, 0xc5, 0xb4, 0x20, 0x3e, 0x09, 0xa1, 0x1d, 0x6d, 0x64, 0x5d, + 0x97, 0x43, 0x76, 0xeb, 0xdd, 0x66, 0xc2, 0x27, 0xd0, 0xb2, 0x45, 0xf4, 0x9a, 0xc2, 0xf9, 0xb9, + 0xe0, 0x66, 0xe2, 0x4d, 0x99, 0x85, 0xdd, 0xc5, 0x67, 0xf5, 0xb1, 0xd7, 0xf8, 0xac, 0x76, 0x72, + 0xfe, 0x05, 0x66, 0xa2, 0x6e, 0x01, 0x8e, 0x43, 0x08, 0x20, 0x19, 0x0f, 0x9b, 0x14, 0x05, 0x78, + 0xeb, 0x9d, 0xfa, 0xd0, 0xbb, 0x61, 0x0b, 0x15, 0x8c, 0x58, 0x68, 0xe0, 0x1f, 0x75, 0x9e, 0xc4, + 0xd8, 0x89, 0xf3, 0x7f, 0x01, 0x59, 0xbb, 0xf7, 0x8b, 0x03, 0xb7, 0xbc, 0xaa, 0x10, 0x0d, 0xb7, + 0x88, 0x71, 0xaa, 0xd1, 0xe2, 0x25, 0x61, 0x68, 0x9e, 0x67, 0x43, 0xa5, 0x31, 0x21, 0x6a, 0xbf, + 0xc2, 0xc4, 0xb6, 0xb8, 0x40, 0xe9, 0x1d, 0x66, 0xe0, 0xcf, 0xb8, 0x2d, 0x4b, 0x4a, 0xe8, 0x32, + 0x73, 0x64, 0x25, 0x32, 0xb9, 0x0a, 0xcf, 0x0d, 0x69, 0x34, 0x72, 0xd7, 0xd2, 0x47, 0x4f, 0xec, + 0x50, 0xdf, 0xc2, 0xab, 0xcc, 0x78, 0xa4, 0xc6, 0xf9, 0x21, 0xd2, 0x3c, 0x10, 0xad, 0xd0, 0xee, + 0xa4, 0xa0, 0x7d, 0xe9, 0xdb, 0xdc, 0xd0, 0x9b, 0x4c, 0xf9, 0xfa, 0x63, 0xa6, 0xcf, 0x69, 0x94, + 0xc6, 0xa4, 0x7f, 0xc2, 0xe7, 0xea, 0x69, 0x6e, 0xaa, 0xb0, 0xf2, 0x1b, 0xbb, 0xf1, 0xc7, 0x4f, + 0x91, 0x13, 0x41, 0x5a, 0x95, 0xb3, 0xa1, 0x20, 0x80, 0x28, 0x74, 0xe0, 0x33, 0x99, 0x8b, 0xe1, + 0x93, 0x3e, 0x5a, 0x38, 0xac, 0x07, 0x2f, 0xfb, 0x78, 0x6f, 0xa8, 0x5e, 0xf0, 0xe9, 0x5e, 0x76, + 0x91, 0x3b, 0x74, 0x10, 0xe2, 0x1e, 0xf7, 0x83, 0x4e, 0xee, 0xab, 0x82, 0xfe, 0x74, 0xb4, 0x11, + 0x48, 0x5c, 0xf3, 0xae, 0xdb, 0x12, 0x71, 0x5d, 0x96, 0x72, 0x55, 0xe6, 0x81, 0x94, 0xab, 0xba, + 0xeb, 0x7b, 0xaf, 0x75, 0x99, 0xcf, 0x89, 0x9e, 0x5f, 0x12, 0xfb, 0xc9, 0x87, 0x32, 0x37, 0x5a, + 0x5e, 0x7e, 0xc1, 0xcd, 0x2f, 0x44, 0xf2, 0xf3, 0x6e, 0x7e, 0xd1, 0xcd, 0x2f, 0x86, 0xf3, 0x9b, + 0x5e, 0x7e, 0x96, 0xe5, 0x97, 0xf9, 0xce, 0xe9, 0x51, 0x84, 0x4b, 0x82, 0xe2, 0x36, 0x3f, 0x02, + 0x3d, 0x74, 0x81, 0x58, 0xc4, 0xe8, 0x41, 0xf4, 0x0e, 0x20, 0xa6, 0x6f, 0x83, 0x6c, 0x67, 0x56, + 0xd9, 0xf3, 0xe2, 0xa6, 0xce, 0xa2, 0xd2, 0xd3, 0xb0, 0xb9, 0x8c, 0xe7, 0x00, 0xf5, 0xe9, 0xf8, + 0x07, 0x24, 0x3a, 0x64, 0x22, 0x20, 0x75, 0x62, 0x89, 0xa4, 0xaf, 0xcb, 0xa2, 0x17, 0x9b, 0x9b, + 0xf8, 0x17, 0x64, 0x56, 0xaf, 0x99, 0x24, 0x34, 0xa9, 0xb0, 0x44, 0x97, 0x1d, 0xac, 0x38, 0x3d, + 0xc2, 0x43, 0xf2, 0x5c, 0x79, 0x5d, 0xa1, 0x41, 0xa2, 0xe8, 0xc9, 0x04, 0x9e, 0xd0, 0xf0, 0xc7, + 0x48, 0xd6, 0xd0, 0xb9, 0xe9, 0x6b, 0x89, 0x6f, 0xb0, 0x5c, 0x61, 0x90, 0xf3, 0x6f, 0xf4, 0xcb, + 0x55, 0xc9, 0x9a, 0x18, 0x76, 0xd2, 0xa2, 0xd7, 0x72, 0x3d, 0x67, 0xc4, 0x5f, 0x71, 0xd7, 0x49, + 0xfd, 0xcb, 0x50, 0xb4, 0x99, 0xd0, 0x27, 0xa4, 0xdd, 0x6f, 0xbd, 0xbb, 0x57, 0xc1, 0xbf, 0xd1, + 0x28, 0xe5, 0x99, 0x8c, 0xd7, 0x21, 0xf5, 0x81, 0xe5, 0xc8, 0xb3, 0xed, 0x51, 0x20, 0x9b, 0x12, + 0x25, 0xe9, 0x5e, 0x9f, 0xc1, 0xf2, 0x63, 0xb5, 0xfb, 0x3d, 0x97, 0x97, 0x37, 0xb3, 0x79, 0x19, + 0x07, 0x43, 0xb8, 0x5b, 0x54, 0xd2, 0x2f, 0xa8, 0x41, 0xc9, 0x30, 0x9b, 0xdb, 0x74, 0x07, 0x0c, + 0x55, 0xd1, 0x89, 0x41, 0x65, 0x7a, 0x14, 0xad, 0xbe, 0x2d, 0x9e, 0x67, 0x1a, 0x62, 0x95, 0x3e, + 0xcf, 0xe9, 0xc8, 0x40, 0xa0, 0x4a, 0xa5, 0xe6, 0x04, 0xbd, 0xeb, 0xbf, 0xcb, 0xdb, 0x36, 0xc8, + 0x82, 0xa1, 0x2f, 0x62, 0xe0, 0x8d, 0x5c, 0xd8, 0x95, 0xd0, 0xdc, 0xd7, 0x4d, 0x8b, 0x55, 0x99, + 0x7a, 0xef, 0x25, 0xb0, 0xd8, 0xb9, 0x21, 0x18, 0x78, 0x73, 0x38, 0xf8, 0x2c, 0x82, 0xd0, 0x43, + 0x7e, 0x96, 0x46, 0x41, 0x1c, 0x95, 0x3a, 0xcf, 0xad, 0x59, 0xe0, 0xfc, 0x38, 0x9b, 0xcc, 0xfd, + 0xd4, 0xaf, 0x53, 0x45, 0x6f, 0x4e, 0x3a, 0x99, 0x73, 0x5a, 0x50, 0xa7, 0x57, 0x74, 0x22, 0xae, + 0x9b, 0x7a, 0x48, 0x64, 0xb2, 0xc3, 0x37, 0x08, 0xdd, 0x8f, 0x22, 0xc4, 0x5e, 0x1d, 0x64, 0x9f, + 0x90, 0xf8, 0xd4, 0xcd, 0x41, 0xff, 0x82, 0xfa, 0x48, 0xeb, 0xd2, 0xd0, 0xf7, 0xd8, 0xb6, 0x80, + 0x8d, 0x0b, 0x28, 0x50, 0xb0, 0x58, 0x21, 0xb1, 0x57, 0x0a, 0xe3, 0x3e, 0x86, 0x23, 0x85, 0x17, + 0x87, 0x27, 0xae, 0x49, 0xe4, 0x83, 0xdb, 0x93, 0x0b, 0xc1, 0x6e, 0xa8, 0x15, 0x87, 0x09, 0x13, + 0x2c, 0x56, 0x14, 0x71, 0x45, 0x85, 0x5a, 0x10, 0xaa, 0x0b, 0x11, 0x8a, 0xfd, 0x7c, 0xd6, 0x77, + 0x15, 0xef, 0xa7, 0xe1, 0xba, 0x04, 0xc5, 0x67, 0x69, 0x20, 0x62, 0x87, 0x7a, 0xc2, 0x7a, 0xa1, + 0x69, 0xee, 0x90, 0xed, 0xd2, 0x60, 0xb2, 0x7d, 0x31, 0xe9, 0x2d, 0x73, 0x92, 0x1e, 0x28, 0x76, + 0xc3, 0x71, 0x2c, 0x15, 0x68, 0x10, 0x72, 0x87, 0xca, 0x54, 0x4c, 0x02, 0xab, 0x50, 0xbc, 0x24, + 0x7a, 0xdf, 0x83, 0x59, 0x0c, 0xaa, 0xb0, 0x9f, 0x7b, 0x91, 0x46, 0x78, 0xb7, 0x5f, 0x9a, 0x99, + 0x81, 0xf5, 0xa6, 0x7f, 0xa7, 0x01, 0x2e, 0x60, 0x95, 0xe5, 0x98, 0xe8, 0xa2, 0xd5, 0x17, 0xa2, + 0x10, 0x57, 0x58, 0x10, 0x62, 0x76, 0x9e, 0xdd, 0xee, 0x27, 0x29, 0xb9, 0xfc, 0xcb, 0x4b, 0xe8, + 0x6c, 0x94, 0xdc, 0x94, 0xe4, 0xaf, 0xda, 0xb2, 0x80, 0x77, 0xda, 0x9c, 0x59, 0xd3, 0x42, 0x68, + 0x5b, 0x86, 0x41, 0x3f, 0x42, 0x1d, 0xfb, 0xc6, 0x23, 0x43, 0x9c, 0xe2, 0xaa, 0x70, 0xbe, 0x00, + 0xef, 0x99, 0x44, 0x82, 0x80, 0xae, 0x5c, 0xf4, 0x22, 0x1a, 0x90, 0x35, 0xcd, 0x3e, 0x82, 0xf2, + 0x77, 0xbb, 0x8c, 0x0b, 0x25, 0xc4, 0x7d, 0x84, 0xd2, 0x0d, 0x92, 0x13, 0x21, 0x1c, 0xb4, 0x05, + 0x72, 0x51, 0xf8, 0x98, 0xed, 0x8a, 0xa0, 0x79, 0xcb, 0xa3, 0x9f, 0x48, 0x7c, 0x98, 0x48, 0x29, + 0x77, 0x54, 0xa0, 0x51, 0xc7, 0x96, 0x08, 0x0c, 0x60, 0x8b, 0xc7, 0x75, 0x4e, 0x95, 0x46, 0x95, + 0xb1, 0x37, 0x3c, 0x83, 0x68, 0xa8, 0xe9, 0xc7, 0x5f, 0x28, 0x2a, 0x86, 0xda, 0xc2, 0x24, 0xa3, + 0x1e, 0x01, 0x00, 0xa4, 0xb1, 0x48, 0x87, 0x20, 0x95, 0xf2, 0x29, 0x46, 0x0f, 0x92, 0x3a, 0x4c, + 0xfc, 0x1b, 0xbe, 0xb4, 0x1e, 0x0f, 0x61, 0x9d, 0x77, 0x83, 0xd7, 0x5d, 0x16, 0x39, 0x52, 0xb5, + 0xcf, 0x70, 0xc3, 0x70, 0xb6, 0xea, 0xd4, 0xb9, 0x34, 0x89, 0xcc, 0x4b, 0x73, 0x2f, 0xe6, 0xcb, + 0x92, 0x96, 0x66, 0x5f, 0x69, 0x80, 0x5f, 0x55, 0xc7, 0x18, 0xd4, 0x6c, 0x76, 0x59, 0x76, 0x16, + 0x54, 0x65, 0xcc, 0xa6, 0xbf, 0x2c, 0xdb, 0xa0, 0x0f, 0xcc, 0x4d, 0xd5, 0xa0, 0x99, 0x9e, 0xf9, + 0x6f, 0x23, 0x2b, 0xa9, 0x41, 0x66, 0x8a, 0xbe, 0x71, 0xd9, 0x52, 0x67, 0x7d, 0xbd, 0xb3, 0xc4, + 0xdc, 0xd9, 0x5d, 0x5f, 0xef, 0x2e, 0xc9, 0x02, 0x89, 0xd3, 0x5a, 0x6a, 0x8a, 0x62, 0x12, 0x71, + 0xa4, 0xe1, 0x88, 0xa5, 0x31, 0xd2, 0x76, 0x24, 0x37, 0xd2, 0x3c, 0xd7, 0x33, 0x9d, 0x39, 0x4e, + 0x54, 0xd6, 0x3c, 0x7a, 0xe0, 0x64, 0x64, 0x65, 0x29, 0x05, 0x18, 0x40, 0x01, 0x35, 0xfd, 0xcf, + 0xba, 0xba, 0x61, 0xd0, 0x86, 0xcc, 0xd0, 0xc4, 0xe1, 0x99, 0x0c, 0xd3, 0x8a, 0x81, 0x44, 0xf0, + 0x10, 0x08, 0x8a, 0xa1, 0xd5, 0xd2, 0x5c, 0x5f, 0x37, 0x97, 0x0f, 0x96, 0x0b, 0x17, 0xea, 0xdb, + 0x1a, 0xc2, 0x0a, 0xdc, 0x2f, 0xaa, 0xc0, 0xfd, 0xe0, 0xa4, 0xd8, 0xe0, 0xe3, 0x1b, 0x73, 0xf1, + 0x27, 0xeb, 0xd2, 0x61, 0x42, 0x83, 0xbd, 0x44, 0xfd, 0xa3, 0x7b, 0xaf, 0xbb, 0xd9, 0xdc, 0x90, + 0xa9, 0x23, 0xe9, 0x21, 0xd0, 0xa9, 0x07, 0x27, 0x34, 0xa4, 0xd3, 0x30, 0x9e, 0xbe, 0xbd, 0xeb, + 0xff, 0xfd, 0x3f, 0xfe, 0x2f, 0x34, 0x77, 0x6d, 0xeb, 0x4b, 0xc1, 0xaf, 0xea, 0xcb, 0xae, 0x5e, + 0x31, 0x83, 0xa2, 0x89, 0x57, 0x8f, 0x57, 0xdc, 0xe1, 0xf2, 0x00, 0x70, 0xcc, 0x5f, 0x21, 0x1b, + 0x3b, 0x65, 0x67, 0x26, 0x08, 0xda, 0xec, 0xfe, 0x71, 0x92, 0x9a, 0xe3, 0xf4, 0xad, 0xec, 0xb6, + 0x59, 0xc7, 0xf8, 0x4a, 0x20, 0xc4, 0xd9, 0x62, 0x15, 0xdd, 0x04, 0xb1, 0xfd, 0xba, 0x98, 0xa5, + 0x1e, 0x1b, 0xb0, 0x3a, 0x61, 0x2b, 0xf9, 0x12, 0x1a, 0x59, 0xdf, 0x82, 0x96, 0x19, 0x67, 0xef, + 0xc7, 0x2f, 0x79, 0x5a, 0xc2, 0x23, 0x83, 0xd1, 0x12, 0xc6, 0x61, 0x76, 0xfc, 0x32, 0x68, 0x02, + 0xc3, 0x5b, 0x03, 0xfd, 0xba, 0x7b, 0x3b, 0xac, 0xc7, 0xd8, 0x7f, 0x87, 0xc0, 0x8e, 0xa6, 0x67, + 0x12, 0xfd, 0xd4, 0x08, 0xb4, 0x54, 0xf7, 0x63, 0x02, 0x3d, 0x7a, 0x92, 0xb0, 0x95, 0xfd, 0xfd, + 0x7b, 0xb4, 0x25, 0xe3, 0xb3, 0x09, 0x02, 0x84, 0x00, 0xea, 0x43, 0x6f, 0x2e, 0x8c, 0x55, 0xcb, + 0x19, 0x29, 0x5a, 0x12, 0x74, 0x27, 0x6a, 0xcf, 0xf7, 0xd6, 0x32, 0x2b, 0x25, 0x0a, 0x3f, 0xf0, + 0x26, 0xa9, 0xf9, 0x33, 0x82, 0x29, 0xa0, 0xc3, 0x50, 0x24, 0x22, 0x33, 0xca, 0x21, 0xf1, 0x2e, + 0x29, 0x13, 0x20, 0x6b, 0xc4, 0x0b, 0x21, 0x87, 0xb7, 0x4e, 0xc5, 0x64, 0xd8, 0x76, 0x44, 0x92, + 0xb1, 0xf1, 0xb9, 0x3c, 0x67, 0xc8, 0x24, 0x57, 0x1b, 0xaf, 0xc9, 0xff, 0xd5, 0xda, 0x30, 0x5f, + 0xa1, 0x2f, 0xc0, 0xe0, 0x3d, 0xff, 0x70, 0x1c, 0xa7, 0x50, 0xf6, 0xdc, 0xf8, 0x45, 0x23, 0x56, + 0x3a, 0x51, 0x62, 0x09, 0x9a, 0x94, 0x12, 0xcb, 0xea, 0xbe, 0x6a, 0xed, 0x5f, 0x34, 0xa2, 0xe4, + 0xf2, 0xca, 0xf3, 0x28, 0x9a, 0x30, 0x82, 0xc1, 0x8c, 0xbb, 0xa3, 0x79, 0x69, 0x4c, 0x88, 0xe5, + 0x19, 0xbd, 0x71, 0xaf, 0xaa, 0xe3, 0xe7, 0x76, 0xb6, 0xbd, 0x50, 0x79, 0x18, 0xba, 0x8b, 0xbf, + 0xd1, 0xa9, 0x85, 0x8a, 0xea, 0x5a, 0x63, 0x59, 0xc9, 0xd6, 0x9b, 0xde, 0x09, 0x95, 0xf5, 0xbe, + 0xcc, 0x13, 0xaa, 0xc0, 0x60, 0x6a, 0xf9, 0xeb, 0xda, 0x0f, 0xb4, 0xd0, 0x0a, 0x3e, 0xad, 0x83, + 0xd6, 0x95, 0x04, 0xf7, 0xa9, 0x9d, 0xc5, 0x13, 0x31, 0x77, 0xff, 0xdc, 0xc1, 0x03, 0xa5, 0xa5, + 0xb9, 0x2d, 0x93, 0x20, 0x42, 0x96, 0xe6, 0x1f, 0x79, 0x5f, 0x97, 0x5f, 0x51, 0xa6, 0x99, 0x5d, + 0x95, 0x99, 0x5b, 0x95, 0x99, 0xc7, 0x4c, 0xef, 0x5b, 0x09, 0x89, 0x25, 0xa5, 0xae, 0x57, 0xb4, + 0x70, 0xb0, 0x22, 0x6f, 0x87, 0x86, 0x2e, 0x08, 0x3e, 0xc0, 0xb0, 0xa4, 0xd8, 0xbd, 0x98, 0xe4, + 0x3f, 0x88, 0xc0, 0xc5, 0xa1, 0x67, 0xb6, 0xc4, 0x09, 0xde, 0x54, 0x59, 0x38, 0xbf, 0xf2, 0x9a, + 0x8d, 0x9e, 0x5e, 0xb1, 0x2a, 0x6d, 0x45, 0x8b, 0xab, 0xd1, 0x6c, 0xde, 0xc4, 0x96, 0x1f, 0x90, + 0xe9, 0x64, 0xa1, 0x3c, 0xc1, 0x18, 0xff, 0xb1, 0xc5, 0xd9, 0x87, 0x7f, 0xe2, 0x3a, 0xa0, 0x78, + 0x04, 0xc1, 0x8b, 0x16, 0x88, 0xef, 0x6a, 0xd9, 0x68, 0xd8, 0xe7, 0x2a, 0x56, 0xd6, 0xb5, 0xff, + 0x8d, 0xba, 0xe3, 0x15, 0x75, 0x63, 0x2b, 0xbc, 0xac, 0xee, 0x6c, 0x05, 0x36, 0xad, 0x7e, 0x7b, + 0x65, 0x5d, 0x82, 0xdf, 0x17, 0x88, 0xad, 0xf9, 0xda, 0xb1, 0x37, 0x26, 0x2b, 0xea, 0xd1, 0x0f, + 0x2c, 0x45, 0x6b, 0x72, 0x97, 0xf6, 0xdd, 0x47, 0x1a, 0xdb, 0xd2, 0xb2, 0x13, 0x0b, 0xf2, 0x6a, + 0x74, 0xfd, 0x86, 0xa2, 0xd9, 0x05, 0x46, 0x6b, 0x69, 0x71, 0xe3, 0xfe, 0xc5, 0xc2, 0x93, 0x32, + 0x63, 0x90, 0x67, 0xa2, 0xfe, 0xf9, 0xc3, 0xb7, 0x14, 0x11, 0xb6, 0xf7, 0xdb, 0x74, 0xcb, 0xe6, + 0xcf, 0xd6, 0x99, 0xf9, 0x70, 0x51, 0x0e, 0xe0, 0x98, 0x33, 0x7e, 0x43, 0x68, 0x25, 0xfb, 0x96, + 0x9c, 0x0f, 0x85, 0x10, 0xd6, 0x3f, 0x32, 0xdd, 0xcf, 0x95, 0x5c, 0xce, 0x9b, 0x39, 0x71, 0x3a, + 0x6a, 0xf0, 0xc4, 0xdb, 0xcf, 0x28, 0x4a, 0x91, 0xef, 0xa5, 0xa4, 0x16, 0xd6, 0x19, 0x22, 0x32, + 0x1f, 0xd9, 0xca, 0xad, 0xaf, 0xd3, 0x78, 0x20, 0x2b, 0x8a, 0xe4, 0xb1, 0x48, 0xee, 0xe7, 0x6a, + 0xd1, 0x53, 0x08, 0xdd, 0xa0, 0xd4, 0x92, 0x62, 0x96, 0x1a, 0x8c, 0x3c, 0xab, 0x29, 0x96, 0x44, + 0xca, 0xf8, 0xe0, 0x74, 0x74, 0x91, 0xa3, 0xf3, 0xf1, 0xe7, 0x3c, 0x51, 0x4f, 0x42, 0x4d, 0x77, + 0xc5, 0xbc, 0xf7, 0xa6, 0xfc, 0x94, 0x47, 0xe5, 0x3e, 0x0c, 0x8c, 0xe0, 0x2c, 0xcc, 0xbd, 0xbd, + 0xd0, 0x64, 0x68, 0xee, 0x5d, 0x82, 0x59, 0x35, 0xf9, 0x5e, 0x90, 0x53, 0xf6, 0x31, 0x47, 0x16, + 0xc2, 0xc8, 0xbf, 0x08, 0xff, 0x37, 0x84, 0x53, 0x3d, 0x39, 0xd3, 0x57, 0xec, 0xeb, 0x18, 0x10, + 0x83, 0x9e, 0x21, 0x5f, 0x2a, 0x16, 0x8c, 0xda, 0xc1, 0x85, 0x14, 0xb4, 0xe2, 0xa9, 0xcd, 0x24, + 0xe6, 0x58, 0x84, 0x3f, 0x0d, 0x61, 0x26, 0x7f, 0x77, 0xce, 0xa8, 0x82, 0x18, 0xcc, 0x99, 0x61, + 0x3a, 0xe1, 0x78, 0x32, 0xfc, 0x17, 0x8d, 0x20, 0x93, 0x3b, 0x6b, 0xad, 0x11, 0xee, 0x20, 0x84, + 0x1e, 0x6c, 0x82, 0xbc, 0xe7, 0x7e, 0xf7, 0xee, 0xf7, 0xef, 0xac, 0xff, 0x0c, 0x19, 0x5f, 0xf0, + 0x44, 0x14, 0x03, 0xec, 0xe6, 0x7f, 0x06, 0x32, 0xb3, 0x4c, 0x0f, 0x88, 0x7f, 0xff, 0x66, 0x3e, + 0x1a, 0x98, 0xc7, 0xfe, 0x06, 0x25, 0x60, 0x7b, 0xdc, 0xaa, 0xcb, 0xd1, 0xd4, 0x2c, 0x95, 0xb4, + 0x97, 0x90, 0x55, 0x95, 0x2c, 0x8f, 0xad, 0xe0, 0x6a, 0xfe, 0xfa, 0xe7, 0xe4, 0x7e, 0xa3, 0x1e, + 0xf1, 0xf3, 0x59, 0x0c, 0x8b, 0xdc, 0x55, 0xc7, 0x3f, 0xa2, 0x97, 0xbb, 0xbc, 0xc0, 0xc8, 0x1c, + 0x92, 0x8d, 0xa4, 0xb2, 0xa8, 0x29, 0x2c, 0x87, 0xb3, 0xba, 0x64, 0x68, 0xb5, 0xbf, 0x02, 0x91, + 0x77, 0xc1, 0xe9, 0x43, 0x70, 0xfe, 0xcf, 0xff, 0x1b, 0xc1, 0x59, 0x5f, 0x0f, 0xa5, 0xfd, 0x3f, + 0x7f, 0x13, 0xc5, 0x9c, 0xec, 0xe8, 0x6e, 0x10, 0xd7, 0x18, 0xeb, 0x8f, 0x99, 0x86, 0xd9, 0xfe, + 0x43, 0xbf, 0x13, 0xba, 0x18, 0xda, 0xc4, 0x8b, 0x40, 0x42, 0xbd, 0x3d, 0x40, 0xbe, 0x40, 0xbe, + 0xe1, 0xde, 0x79, 0x01, 0x48, 0x44, 0x5a, 0x10, 0xad, 0x69, 0x8f, 0x09, 0xd9, 0x9c, 0x26, 0x69, + 0x04, 0x01, 0x3f, 0x05, 0xbf, 0x51, 0x9a, 0x14, 0xfd, 0x15, 0xad, 0xa9, 0xe6, 0x36, 0xfd, 0x8b, + 0x21, 0x67, 0xfd, 0x43, 0x7e, 0xf4, 0x3e, 0xb2, 0x41, 0x57, 0xc0, 0xfb, 0x23, 0x82, 0x98, 0xb2, + 0x5d, 0x1f, 0x1c, 0x2d, 0x7c, 0x29, 0xfc, 0x17, 0xfb, 0xca, 0x2b, 0xfd, 0x58, 0x26, 0x51, 0x69, + 0x20, 0x43, 0x84, 0x02, 0x63, 0x43, 0xa6, 0xb5, 0xe1, 0x9c, 0x1e, 0x90, 0xe0, 0xc9, 0x80, 0x6b, + 0x97, 0x0c, 0x3e, 0x7f, 0xb9, 0x28, 0xa0, 0xb0, 0xf1, 0xd0, 0xc1, 0x44, 0x76, 0x45, 0x2e, 0xde, + 0xe6, 0xd0, 0xbc, 0x64, 0xc8, 0x41, 0x25, 0xc0, 0x13, 0xb0, 0xd8, 0x77, 0x04, 0x61, 0x61, 0xd0, + 0x13, 0x70, 0xdd, 0x0f, 0x03, 0xe8, 0x07, 0xf2, 0xc5, 0xe3, 0xe5, 0xad, 0xc0, 0x2b, 0x87, 0x86, + 0x79, 0x62, 0x13, 0x0c, 0xe3, 0xa7, 0x75, 0xc2, 0xf7, 0x61, 0x40, 0x87, 0x75, 0x62, 0x92, 0x6b, + 0xd3, 0xba, 0xbd, 0x55, 0xd8, 0x5c, 0x5f, 0xb7, 0xbf, 0x17, 0xcb, 0xbf, 0x7f, 0xdb, 0x5b, 0xa5, + 0x02, 0x3e, 0x57, 0xb2, 0xf8, 0x5c, 0x29, 0xe1, 0x73, 0x36, 0x97, 0xc7, 0x97, 0x5c, 0xb1, 0xb8, + 0x2d, 0xd6, 0x01, 0xfe, 0x2d, 0x51, 0x7a, 0xab, 0xeb, 0xb4, 0x92, 0x4e, 0x2b, 0xe9, 0xb4, 0x92, + 0x4e, 0x2b, 0xe9, 0xb4, 0x92, 0xce, 0x2a, 0xe9, 0x7c, 0x25, 0x37, 0xe0, 0x69, 0x22, 0x41, 0xa1, + 0xf3, 0x82, 0xab, 0x6e, 0x8b, 0xdf, 0xc5, 0xea, 0x34, 0x99, 0x72, 0x87, 0x19, 0x31, 0xfb, 0xd3, + 0xc3, 0xcc, 0x70, 0xd9, 0xb7, 0x64, 0x8a, 0x8d, 0x83, 0x85, 0x3c, 0x94, 0xa5, 0x99, 0xce, 0x3c, + 0x35, 0xaa, 0x5f, 0x64, 0xde, 0x72, 0x3a, 0x54, 0x5e, 0xc8, 0x7d, 0x2b, 0x41, 0xb1, 0x3a, 0xb1, + 0x7f, 0xff, 0xf6, 0xcf, 0xca, 0x27, 0xf6, 0x77, 0x99, 0xb7, 0x9e, 0x12, 0x0c, 0x25, 0xba, 0xed, + 0x5b, 0x8c, 0x27, 0x18, 0x7a, 0xc6, 0x22, 0xf4, 0x0a, 0x46, 0x82, 0x7e, 0x5a, 0x40, 0x94, 0xc4, + 0xff, 0xaf, 0xb8, 0x2b, 0x7f, 0x6e, 0xdb, 0xc8, 0xd2, 0xbf, 0xef, 0x5f, 0x41, 0x21, 0x89, 0x05, + 0x44, 0x90, 0x0c, 0x52, 0x96, 0xc7, 0x01, 0x05, 0xb1, 0x1c, 0x1f, 0x3b, 0xaa, 0x71, 0x1c, 0x6d, + 0xe4, 0x49, 0xc6, 0xe5, 0x52, 0xad, 0x48, 0xaa, 0x29, 0xb1, 0x0c, 0x01, 0x0c, 0x00, 0x1d, 0x0e, + 0xc5, 0xff, 0x7d, 0xdf, 0xd1, 0x27, 0x00, 0x1e, 0x8a, 0x33, 0xb3, 0x55, 0x89, 0x45, 0x34, 0xba, + 0x1b, 0xaf, 0xef, 0x7e, 0xaf, 0x5f, 0x7f, 0xdf, 0x1d, 0xc1, 0x11, 0xdf, 0x21, 0xd9, 0x88, 0xb7, + 0x53, 0xa3, 0x73, 0x30, 0x74, 0x06, 0x94, 0xb8, 0x0f, 0x5f, 0x23, 0x46, 0x90, 0xdf, 0xc4, 0xe8, + 0x14, 0x1a, 0x5c, 0x10, 0x31, 0xde, 0xde, 0x68, 0x9a, 0x0d, 0x8b, 0x2f, 0x1f, 0xe8, 0x14, 0x8b, + 0xf0, 0xf1, 0x47, 0x37, 0x30, 0x89, 0x17, 0x5e, 0x78, 0x57, 0xee, 0x21, 0xa0, 0x41, 0x59, 0xa2, + 0x61, 0x12, 0xad, 0xc1, 0x38, 0x17, 0x4b, 0xae, 0x34, 0x6d, 0x1f, 0x87, 0x11, 0x4b, 0x87, 0xaf, + 0x3f, 0x52, 0x22, 0xcd, 0xa5, 0x61, 0x01, 0x94, 0x71, 0x82, 0x80, 0xcf, 0x91, 0x09, 0xb6, 0x21, + 0x98, 0x3b, 0xf8, 0xd3, 0x16, 0xf0, 0x5c, 0x10, 0x5a, 0x0f, 0xcc, 0xf5, 0x61, 0xb1, 0x8d, 0x2a, + 0x36, 0x93, 0xb0, 0x6e, 0xd1, 0x56, 0xb0, 0xf1, 0x9b, 0x42, 0x8b, 0xa7, 0x7a, 0x3c, 0xc2, 0xe2, + 0x80, 0x00, 0x06, 0xe5, 0xc0, 0x37, 0xf0, 0x4b, 0x30, 0xf8, 0x98, 0x8a, 0xf5, 0xc9, 0x13, 0x07, + 0x6e, 0xa6, 0x0c, 0x82, 0xd8, 0x02, 0x3d, 0x50, 0xdb, 0x33, 0x82, 0xfb, 0x1c, 0xc8, 0xbf, 0x71, + 0xd5, 0x77, 0xa6, 0x96, 0x32, 0xcc, 0x10, 0x20, 0x7f, 0x78, 0x71, 0x4a, 0x98, 0x46, 0x19, 0xcc, + 0x41, 0x0b, 0xae, 0x58, 0x22, 0x83, 0xa6, 0x6a, 0x7d, 0x34, 0x2c, 0x3a, 0x93, 0x93, 0xee, 0xec, + 0x1c, 0x1e, 0x38, 0x68, 0x94, 0xdc, 0xaf, 0xc2, 0xee, 0x01, 0xda, 0xf7, 0xef, 0x98, 0x2a, 0x45, + 0x7e, 0x0c, 0x51, 0xe1, 0xe9, 0x5b, 0x8a, 0xd6, 0xb4, 0x10, 0xbf, 0x97, 0xef, 0xc4, 0xe5, 0x30, + 0x85, 0xdd, 0x86, 0xe3, 0xc8, 0xa0, 0x24, 0x55, 0xb8, 0xed, 0xb4, 0xfe, 0xca, 0x4e, 0xc9, 0x67, + 0xee, 0x62, 0xaf, 0xbc, 0x19, 0x8f, 0xa1, 0x5b, 0xa8, 0xd0, 0xa8, 0x4f, 0x84, 0xb6, 0xe8, 0xfe, + 0x1c, 0xd6, 0xb5, 0x57, 0x69, 0xaa, 0x14, 0x78, 0x45, 0x9f, 0xf8, 0x6e, 0xc5, 0x5e, 0x96, 0x62, + 0x44, 0x26, 0xa7, 0xa5, 0xa7, 0x8b, 0x9b, 0x42, 0x52, 0xd4, 0xd2, 0x63, 0xc5, 0x51, 0xdf, 0x0e, + 0x11, 0xa9, 0x1e, 0x03, 0x26, 0xf0, 0xcb, 0xf0, 0xe0, 0x8a, 0xbd, 0x9b, 0x8b, 0x19, 0xde, 0xac, + 0xcb, 0x2e, 0x6a, 0xd4, 0xb4, 0xa0, 0xc4, 0xa4, 0xb4, 0x2e, 0xcc, 0xca, 0x18, 0x7f, 0x23, 0x93, + 0xac, 0x9c, 0xc4, 0x89, 0xda, 0x9a, 0x85, 0xab, 0x2a, 0x2d, 0x55, 0x55, 0x3c, 0xed, 0x46, 0x61, + 0x0b, 0xd0, 0x85, 0xec, 0x1c, 0x11, 0xcc, 0x4c, 0x91, 0x24, 0x39, 0xd4, 0x5a, 0x63, 0x62, 0x08, + 0x76, 0x35, 0x8b, 0x6e, 0xcd, 0x2b, 0xce, 0x37, 0x08, 0x17, 0xb6, 0x7f, 0x1c, 0xd4, 0x5d, 0x44, + 0x96, 0x2e, 0x7a, 0xfd, 0xa9, 0x3a, 0x43, 0xce, 0x18, 0x73, 0x81, 0x95, 0x56, 0x00, 0x34, 0xe8, + 0x75, 0x19, 0xc5, 0x98, 0x62, 0xc0, 0xf6, 0x09, 0xf6, 0x5c, 0x87, 0xbc, 0x3c, 0x54, 0x38, 0x55, + 0xf6, 0xe4, 0x36, 0xca, 0xa1, 0xa5, 0x23, 0xc3, 0xe6, 0xf8, 0x93, 0x95, 0xf1, 0x99, 0x94, 0xfb, + 0x21, 0xd9, 0xda, 0xf2, 0xbb, 0x4f, 0x52, 0xa3, 0x4d, 0x53, 0x48, 0x4f, 0x86, 0x40, 0x49, 0xe8, + 0xf9, 0xd9, 0x13, 0x8d, 0x9b, 0xe1, 0x9b, 0x8f, 0x57, 0xf9, 0x6c, 0xd7, 0x7a, 0x1a, 0x16, 0x55, + 0xf0, 0xbd, 0xfb, 0xfa, 0xe3, 0xc0, 0x7d, 0xac, 0x45, 0xff, 0x18, 0x77, 0x61, 0xa3, 0x2a, 0xab, + 0x49, 0xfe, 0x3d, 0x1c, 0x0e, 0x86, 0xb1, 0xfc, 0xad, 0x4f, 0x3b, 0x30, 0x51, 0x49, 0xa7, 0x3e, + 0x68, 0x0c, 0x44, 0x67, 0xbb, 0xb6, 0xf2, 0x0d, 0xad, 0x82, 0x35, 0xca, 0x55, 0x2b, 0x96, 0x2a, + 0xd5, 0x02, 0x7b, 0xf0, 0x50, 0xad, 0x52, 0xd6, 0x49, 0xda, 0xfb, 0xbc, 0xa3, 0x9a, 0x5c, 0x1e, + 0x9e, 0x19, 0x83, 0x12, 0x3c, 0x12, 0xa8, 0xf4, 0xa5, 0xb5, 0x3e, 0xb7, 0xb9, 0xf3, 0xec, 0x41, + 0xe7, 0x81, 0xee, 0x04, 0xcd, 0xff, 0x66, 0x28, 0x8f, 0xcc, 0x56, 0x6c, 0x3f, 0x14, 0x56, 0x53, + 0x9b, 0x82, 0x64, 0x9c, 0x60, 0x72, 0xf9, 0xcd, 0xdd, 0x6e, 0x5f, 0x1c, 0xa1, 0x4b, 0xcc, 0xee, + 0x6e, 0x90, 0x3b, 0x4e, 0x22, 0xc9, 0x10, 0xad, 0x1c, 0x10, 0x44, 0xe4, 0x4f, 0x8e, 0x93, 0x88, + 0x79, 0xd5, 0xad, 0xbd, 0x1a, 0x99, 0x57, 0xbd, 0xb3, 0xd0, 0xd7, 0xbd, 0xe1, 0x61, 0xab, 0x41, + 0x78, 0x49, 0x48, 0x51, 0x76, 0xda, 0x3b, 0x93, 0x16, 0xd9, 0xa2, 0x24, 0xa9, 0x68, 0x4e, 0x60, + 0xe1, 0xe4, 0x43, 0xad, 0x69, 0x4b, 0x90, 0x33, 0x5a, 0x99, 0x6f, 0x21, 0xcd, 0xb8, 0xc2, 0xad, + 0x1b, 0xfc, 0xa1, 0x8d, 0xb2, 0x6d, 0xba, 0x79, 0xa9, 0x47, 0x21, 0xbd, 0x0f, 0xc2, 0xa6, 0x65, + 0x4b, 0xbf, 0x2f, 0xef, 0xc3, 0x76, 0xbb, 0x96, 0x8e, 0x31, 0x75, 0x62, 0xa0, 0x55, 0xcb, 0x64, + 0xde, 0x1d, 0xe0, 0x3f, 0x71, 0x14, 0xd6, 0x4c, 0x5b, 0x26, 0x46, 0x0f, 0x63, 0xf4, 0x6a, 0x31, + 0xf6, 0xed, 0x18, 0xfb, 0x18, 0x63, 0x5f, 0xc5, 0x20, 0x45, 0xed, 0xe7, 0xae, 0xed, 0x4d, 0xbe, + 0x35, 0xdc, 0xcb, 0xbb, 0xf6, 0xdb, 0x5e, 0xfd, 0x6d, 0xcf, 0x7e, 0xbb, 0x5f, 0x7f, 0xbb, 0x0f, + 0x43, 0x9e, 0x78, 0x13, 0x08, 0xd2, 0x50, 0xfe, 0xe6, 0xc5, 0x74, 0x8a, 0xde, 0x82, 0xca, 0x6f, + 0x43, 0xbd, 0x60, 0x07, 0x8a, 0x08, 0x91, 0x63, 0xcc, 0x89, 0xf0, 0x35, 0x9e, 0xe4, 0x74, 0x26, + 0x1a, 0xe0, 0x68, 0xcb, 0x81, 0x99, 0xe9, 0x12, 0x3e, 0x0d, 0x42, 0x9e, 0x89, 0x2c, 0xbf, 0xb9, + 0xbc, 0xea, 0x94, 0x33, 0xd8, 0x48, 0x20, 0x9e, 0x74, 0x89, 0x38, 0xde, 0x0c, 0x68, 0x58, 0x4b, + 0x42, 0xb0, 0x35, 0x12, 0xe7, 0x1e, 0xbf, 0x20, 0xcf, 0xcf, 0x9d, 0x38, 0x04, 0x5f, 0xf3, 0xd3, + 0x94, 0x49, 0xea, 0xa7, 0x05, 0xb3, 0xe8, 0xb8, 0x51, 0x7e, 0xc0, 0x28, 0x2f, 0x2d, 0xc9, 0x3a, + 0x54, 0x8c, 0x0e, 0x74, 0xb8, 0x4e, 0x3e, 0x86, 0x59, 0x1c, 0x8f, 0xee, 0x17, 0xd6, 0xd8, 0xa4, + 0xb5, 0x9d, 0xd0, 0x93, 0x28, 0xe2, 0x8e, 0x17, 0xc3, 0xc3, 0x94, 0x8e, 0xa0, 0xd5, 0x40, 0xb6, + 0xa8, 0xca, 0x87, 0xb0, 0xd3, 0x48, 0x6d, 0x26, 0xf3, 0xe1, 0xde, 0xe4, 0x3e, 0xac, 0x39, 0xe5, + 0xb9, 0xa3, 0xdb, 0x61, 0xc8, 0x6d, 0x28, 0xad, 0xf2, 0x60, 0x72, 0x53, 0xd7, 0x60, 0xf7, 0xc4, + 0xb2, 0xee, 0x22, 0x1c, 0x96, 0x26, 0x88, 0xfc, 0x4e, 0x90, 0x81, 0xe2, 0xd3, 0x59, 0x5c, 0xda, + 0x8e, 0xc1, 0xe4, 0x5c, 0x9c, 0xc9, 0x14, 0xec, 0xb0, 0x8b, 0x48, 0x95, 0x18, 0x0f, 0xff, 0x5a, + 0x8e, 0xc1, 0xe1, 0x50, 0xc7, 0x3b, 0xec, 0xa9, 0x98, 0x5d, 0x19, 0xb3, 0xeb, 0xc4, 0xcc, 0x4d, + 0xcc, 0x7d, 0x15, 0xb3, 0x27, 0x63, 0xba, 0xce, 0xc6, 0xda, 0xa1, 0x1a, 0xe6, 0x1b, 0xd8, 0x6e, + 0xf7, 0x4b, 0xf4, 0xbd, 0xe3, 0xce, 0x67, 0x8d, 0x09, 0xd2, 0x4b, 0x0a, 0x3b, 0x84, 0x98, 0x45, + 0x31, 0xb8, 0xbf, 0x55, 0xe1, 0x86, 0xdc, 0x17, 0xb0, 0xbd, 0x7e, 0x31, 0xe8, 0xc5, 0x07, 0xa0, + 0x39, 0xa7, 0xaa, 0x86, 0x4a, 0xf6, 0x60, 0x4e, 0x61, 0x86, 0x1f, 0xf8, 0x4e, 0xe8, 0x96, 0x0a, + 0x2e, 0x2c, 0x2d, 0x07, 0x03, 0x62, 0x3b, 0x20, 0x22, 0xce, 0x0e, 0x6e, 0x25, 0xe8, 0xb5, 0x38, + 0x39, 0xc4, 0x5d, 0x3b, 0x6c, 0xaa, 0xa7, 0x84, 0xd8, 0x63, 0x97, 0x4f, 0x6f, 0xc7, 0x2f, 0x77, + 0x61, 0x21, 0x9d, 0xae, 0xc0, 0x32, 0x9c, 0x2e, 0x31, 0xfd, 0x40, 0xd3, 0x6b, 0x21, 0x0f, 0xa4, + 0x62, 0x38, 0xb9, 0xcf, 0x67, 0x55, 0xab, 0xdb, 0x3d, 0xee, 0x4e, 0xac, 0x1a, 0x64, 0x27, 0xc6, + 0x7d, 0xf2, 0x5e, 0x3c, 0xd8, 0x11, 0x87, 0xa9, 0x76, 0x8f, 0x24, 0x27, 0xee, 0xf4, 0x13, 0x04, + 0x9e, 0x49, 0x00, 0x47, 0xcc, 0x72, 0x47, 0xac, 0xbb, 0x87, 0x01, 0xb1, 0x64, 0x35, 0x0b, 0x5b, + 0x17, 0x84, 0xba, 0xd3, 0xd9, 0x79, 0x3f, 0xd3, 0x9d, 0x02, 0x2f, 0xe6, 0x67, 0xd8, 0xa0, 0x8d, + 0xca, 0xaa, 0xf0, 0xa3, 0xb0, 0xfb, 0x1c, 0xca, 0xb9, 0xe4, 0x5b, 0x76, 0x91, 0xcd, 0xa5, 0x81, + 0x66, 0x41, 0x29, 0x9e, 0x2a, 0xa5, 0x56, 0x0d, 0xb5, 0x97, 0xab, 0x39, 0x67, 0xab, 0xbb, 0x68, + 0x58, 0xfd, 0xa4, 0x44, 0xe2, 0x03, 0x46, 0x03, 0x0c, 0xf0, 0xde, 0xc3, 0x41, 0x5f, 0x39, 0x02, + 0xd7, 0x8c, 0x1d, 0xdf, 0xb0, 0x41, 0xad, 0x63, 0x1b, 0xba, 0xd8, 0x3a, 0xe6, 0x58, 0xb2, 0x40, + 0xa3, 0x41, 0x9e, 0xe0, 0x05, 0x88, 0x81, 0xab, 0x11, 0x2e, 0x09, 0x05, 0x4c, 0xd6, 0xfe, 0x38, + 0xfc, 0xdb, 0x81, 0xb4, 0x9e, 0xcd, 0xd0, 0xc3, 0xeb, 0x12, 0xff, 0xb9, 0x81, 0x8d, 0xdc, 0x24, + 0xc1, 0x95, 0xa9, 0xd6, 0x4a, 0x2d, 0xeb, 0xb0, 0xe3, 0x7c, 0x8a, 0xd9, 0xdc, 0x9a, 0xd5, 0x1a, + 0xaa, 0xaf, 0x4f, 0xbe, 0x5d, 0x6a, 0xe0, 0x73, 0x9b, 0xe2, 0xb8, 0xa6, 0xf9, 0xe2, 0x76, 0x79, + 0x43, 0xde, 0x3a, 0x56, 0x47, 0x90, 0x87, 0x7a, 0x3e, 0xa7, 0xc4, 0xaf, 0x5c, 0xd1, 0x6f, 0xd3, + 0x6e, 0xe8, 0x63, 0x62, 0xb5, 0xf5, 0x55, 0x78, 0xc5, 0xb1, 0xf9, 0x48, 0xf1, 0x12, 0xaf, 0xb5, + 0x26, 0xde, 0x0e, 0xcd, 0x28, 0x97, 0x4c, 0x27, 0xc3, 0x4d, 0x78, 0xeb, 0x8e, 0x1a, 0x31, 0xf0, + 0xde, 0xde, 0xd3, 0x58, 0x81, 0x5f, 0x3f, 0x5e, 0xe2, 0xe8, 0x28, 0x09, 0x59, 0x69, 0xb2, 0x85, + 0x00, 0xe3, 0xd6, 0xba, 0x8d, 0x47, 0xa6, 0xe8, 0x65, 0x85, 0x99, 0x54, 0x03, 0xa7, 0x28, 0xf6, + 0x51, 0x6f, 0xad, 0x1c, 0xdd, 0xd0, 0xfe, 0xa0, 0x07, 0x83, 0x4e, 0xec, 0x74, 0x11, 0x25, 0xf4, + 0x31, 0x55, 0xd1, 0x96, 0x45, 0xb8, 0x5c, 0xc6, 0x60, 0xa1, 0x1a, 0xe4, 0x5d, 0x03, 0x02, 0x77, + 0x46, 0x2d, 0x7f, 0xad, 0x6d, 0xf2, 0xc8, 0x50, 0x34, 0x32, 0x16, 0x7a, 0x3e, 0xcd, 0xd4, 0x67, + 0x56, 0x48, 0x89, 0x95, 0xd7, 0x6e, 0x59, 0xe4, 0x74, 0xc9, 0x82, 0xcf, 0x7c, 0xf1, 0x77, 0xc0, + 0x80, 0xd6, 0xd7, 0x35, 0xfb, 0x89, 0x37, 0xcd, 0xd0, 0xf9, 0x67, 0x97, 0x0d, 0x27, 0xa1, 0x9d, + 0x0b, 0xa6, 0x32, 0xc6, 0xaa, 0xc4, 0x0b, 0xd4, 0x81, 0xe9, 0x71, 0xd2, 0x78, 0xd5, 0xa7, 0x03, + 0x67, 0xd8, 0x07, 0x43, 0x93, 0xf3, 0xcf, 0x69, 0x86, 0x8e, 0xe6, 0xa1, 0x1e, 0x54, 0x94, 0x44, + 0x76, 0x8b, 0x63, 0xac, 0xdb, 0x20, 0xe8, 0x63, 0x58, 0x62, 0xbd, 0x80, 0x75, 0x17, 0xd2, 0x1f, + 0x07, 0x0b, 0xa7, 0x30, 0x5b, 0xb2, 0x34, 0x83, 0x91, 0x55, 0x41, 0x18, 0x10, 0xdb, 0x01, 0xdb, + 0x0d, 0x14, 0x39, 0x91, 0xca, 0x0b, 0xb7, 0x36, 0x3e, 0x06, 0xb1, 0x5b, 0xcb, 0xeb, 0x91, 0xa3, + 0x7d, 0xf2, 0x38, 0xec, 0x90, 0x5e, 0xda, 0x91, 0x07, 0x1a, 0xdb, 0xdc, 0x75, 0xfe, 0x1d, 0x59, + 0xd3, 0xc6, 0x03, 0xef, 0x2a, 0x6e, 0x87, 0x8d, 0x66, 0x60, 0x83, 0x15, 0xd6, 0xae, 0xa5, 0xd0, + 0x76, 0xfb, 0x96, 0x3e, 0x6b, 0xee, 0x8c, 0x59, 0x74, 0x16, 0x8f, 0xd3, 0xb8, 0xbf, 0x80, 0xc6, + 0xbd, 0x05, 0x5d, 0x51, 0x7f, 0x22, 0x98, 0x5b, 0x56, 0x8a, 0x87, 0x07, 0xdb, 0x80, 0xd1, 0xe0, + 0xce, 0xba, 0x83, 0x65, 0xee, 0x0e, 0xcd, 0xf4, 0xa0, 0xed, 0xfb, 0x5a, 0x2d, 0x0f, 0xeb, 0x5c, + 0x00, 0x8b, 0x70, 0x5f, 0xec, 0x07, 0x8a, 0xb1, 0x9d, 0xa3, 0x24, 0x32, 0x2d, 0x2a, 0xe5, 0x5f, + 0x48, 0x2b, 0x4f, 0x92, 0x44, 0xdb, 0x6e, 0xf6, 0x7e, 0x3e, 0x79, 0xf3, 0x1e, 0xf6, 0x13, 0x30, + 0xb2, 0x67, 0x79, 0x89, 0xe0, 0x03, 0xe8, 0x3b, 0x48, 0x0a, 0x3a, 0xba, 0x74, 0xdd, 0x22, 0x21, + 0x25, 0x03, 0x7a, 0xda, 0x04, 0x59, 0x68, 0x3e, 0xd9, 0xcb, 0xf2, 0x3b, 0x3f, 0x78, 0x8a, 0xe8, + 0xb6, 0x52, 0x97, 0xd4, 0x8a, 0x71, 0x9f, 0xd6, 0x3e, 0x98, 0x49, 0xa7, 0x17, 0xb0, 0x9a, 0xf2, + 0x0f, 0x45, 0x02, 0x69, 0xab, 0xd2, 0x8a, 0x96, 0x56, 0xf7, 0xd3, 0x6e, 0xf4, 0xbd, 0x72, 0xc1, + 0xe9, 0x0f, 0xb7, 0x40, 0xb3, 0xa6, 0xfb, 0x09, 0x26, 0x41, 0x32, 0x0c, 0x16, 0xbe, 0x34, 0x0b, + 0x19, 0x60, 0x6d, 0x61, 0xd1, 0xe1, 0xec, 0x3f, 0x8b, 0x48, 0xc9, 0x45, 0xf6, 0xb9, 0x4a, 0x2f, + 0xbf, 0x48, 0x90, 0xa5, 0x34, 0x41, 0xe8, 0xd4, 0x06, 0xac, 0x44, 0xab, 0x87, 0x88, 0x59, 0xa2, + 0x12, 0x2e, 0xca, 0xc1, 0x5d, 0x49, 0xa6, 0x01, 0x1f, 0xda, 0x65, 0x7b, 0xee, 0xdd, 0x7a, 0x31, + 0x62, 0xb9, 0x2e, 0xb6, 0x83, 0xb8, 0xcd, 0xfd, 0xb2, 0x9c, 0x5a, 0xbe, 0x97, 0x59, 0x88, 0x44, + 0xaf, 0xb0, 0x56, 0xc5, 0x73, 0xe4, 0x64, 0x43, 0xf7, 0xeb, 0x5d, 0x74, 0x52, 0x85, 0x9a, 0x45, + 0x42, 0xcb, 0x29, 0xdb, 0xd4, 0x28, 0x61, 0xbf, 0x83, 0x96, 0x4a, 0xb4, 0x39, 0xfc, 0xf3, 0xc3, + 0xdb, 0xdd, 0x17, 0xde, 0x22, 0x1c, 0xe5, 0x17, 0x5f, 0xe2, 0xca, 0xf6, 0xdc, 0x7c, 0x84, 0x89, + 0xeb, 0x11, 0xf4, 0x10, 0xd8, 0x3e, 0x1b, 0x18, 0xc4, 0xb0, 0x33, 0x3d, 0xd2, 0x26, 0x76, 0x09, + 0xbd, 0x5c, 0xa8, 0xf3, 0x16, 0x65, 0xe1, 0x21, 0xd6, 0x01, 0x32, 0x91, 0x19, 0x2c, 0x51, 0x32, + 0x7e, 0x19, 0x6b, 0x59, 0xd5, 0xc2, 0x32, 0x52, 0x2d, 0xb1, 0xa0, 0x55, 0xb8, 0x7d, 0xd7, 0x16, + 0x26, 0x69, 0x39, 0x93, 0x7f, 0x63, 0x21, 0x01, 0xda, 0xe9, 0x8e, 0x1b, 0xdf, 0x38, 0x62, 0xe0, + 0x75, 0x5c, 0x04, 0x5a, 0x38, 0x2a, 0x25, 0x35, 0x82, 0x1c, 0x65, 0x6c, 0xd6, 0x5a, 0x3f, 0x62, + 0x1e, 0x1e, 0x94, 0xf9, 0x15, 0x59, 0x2c, 0x7b, 0x07, 0x41, 0xcd, 0x14, 0xc6, 0x78, 0xed, 0x96, + 0x26, 0x82, 0x82, 0xc0, 0x3c, 0x52, 0xce, 0x60, 0x0a, 0x13, 0x9e, 0x24, 0xd4, 0x58, 0xe5, 0x21, + 0x5b, 0x77, 0xb4, 0x24, 0x87, 0x14, 0x7d, 0x6a, 0x38, 0xcf, 0xb3, 0x98, 0xcc, 0x65, 0xc8, 0x91, + 0x90, 0x2d, 0xc8, 0x74, 0x66, 0x77, 0x71, 0x63, 0xf6, 0x20, 0x03, 0xbd, 0xf3, 0x58, 0x8a, 0x4b, + 0xd6, 0xa3, 0xd9, 0x7c, 0x8f, 0x26, 0x28, 0x32, 0x52, 0x20, 0xe9, 0x07, 0x9b, 0x50, 0x22, 0xbe, + 0x80, 0x59, 0x4f, 0x15, 0x4e, 0x8a, 0x3f, 0xe2, 0xad, 0x2e, 0x71, 0x75, 0x5a, 0x13, 0x62, 0xc3, + 0x27, 0xf4, 0x7d, 0xea, 0x50, 0x13, 0xfa, 0x68, 0xb0, 0xdb, 0x82, 0x7f, 0x82, 0xc1, 0x39, 0xd6, + 0x3f, 0x8c, 0x78, 0xc6, 0x39, 0xe8, 0x7c, 0x44, 0x02, 0x27, 0xa6, 0x2a, 0x24, 0x02, 0x25, 0x52, + 0xc9, 0xbe, 0x9d, 0x93, 0x15, 0xef, 0x28, 0xb2, 0x50, 0x91, 0x17, 0x14, 0x8a, 0x14, 0x94, 0x10, + 0x88, 0x67, 0x2b, 0x30, 0x98, 0x26, 0xb0, 0x59, 0x93, 0x2f, 0x5e, 0xdf, 0x14, 0x0b, 0x44, 0xa2, + 0x20, 0x67, 0xdc, 0xf3, 0xd8, 0xe3, 0xaf, 0x5c, 0x30, 0x9e, 0x02, 0xc2, 0x01, 0xa3, 0xaf, 0xb6, + 0x73, 0xf1, 0x37, 0x4b, 0x63, 0xac, 0x42, 0x10, 0x6a, 0xb1, 0x68, 0xc8, 0x8f, 0x3e, 0x3a, 0x6e, + 0x09, 0xb4, 0xd9, 0x70, 0x4b, 0xfd, 0x0a, 0x60, 0xb7, 0x4c, 0x5e, 0xe1, 0x24, 0x3e, 0x11, 0xc0, + 0x22, 0x89, 0x53, 0x26, 0xaa, 0xbb, 0xbc, 0xf8, 0xcc, 0xc5, 0x81, 0x09, 0xb2, 0x83, 0xf1, 0x51, + 0x39, 0x26, 0x5a, 0x28, 0x58, 0x66, 0x90, 0x4a, 0xee, 0x03, 0xfe, 0xe6, 0x62, 0x13, 0x51, 0xd4, + 0xfa, 0x7c, 0x3a, 0x69, 0x9e, 0x5d, 0x42, 0x24, 0xcc, 0x6d, 0xcf, 0x53, 0xce, 0x2a, 0x73, 0x34, + 0x61, 0xc6, 0x73, 0x9c, 0xa8, 0x62, 0x25, 0xd7, 0x62, 0xd1, 0xb7, 0xd0, 0xe9, 0xa9, 0x91, 0xc9, + 0xd0, 0x59, 0x20, 0x56, 0xbd, 0x16, 0x7e, 0x4d, 0x03, 0x22, 0x38, 0xfe, 0xed, 0x54, 0xdc, 0xe1, + 0xe1, 0x82, 0x1c, 0x80, 0x7c, 0x7c, 0x49, 0x6f, 0x69, 0x0c, 0xe2, 0xd0, 0x24, 0xa7, 0x6f, 0xe7, + 0x95, 0x74, 0x52, 0x87, 0x77, 0xef, 0x6e, 0xb1, 0x6b, 0xbe, 0xbb, 0x95, 0x27, 0x10, 0xeb, 0x47, + 0x94, 0xa2, 0x12, 0x49, 0xe5, 0xb7, 0x61, 0x0d, 0xc2, 0x7c, 0x05, 0x13, 0x6e, 0x78, 0xbd, 0xd7, + 0x1e, 0xe5, 0xaa, 0xcc, 0x3f, 0x9f, 0xd3, 0x5b, 0x42, 0x7a, 0xb7, 0x4e, 0xb5, 0x0e, 0xa7, 0x13, + 0x54, 0xbd, 0x3b, 0xe6, 0x6a, 0x0f, 0x12, 0x90, 0x7b, 0xc3, 0x11, 0x0c, 0xf8, 0x78, 0x94, 0x0e, + 0x33, 0xba, 0x27, 0xc3, 0x91, 0xf0, 0x3e, 0x00, 0xfb, 0xd0, 0xca, 0x7c, 0xea, 0x47, 0x75, 0xf8, + 0xad, 0x8d, 0x4e, 0xe4, 0x38, 0x9f, 0xaa, 0x7e, 0x34, 0xc6, 0xe9, 0x9b, 0x1e, 0x26, 0x18, 0x11, + 0xa4, 0xa2, 0xd7, 0x7a, 0x15, 0xf1, 0x76, 0x2a, 0xd8, 0xb0, 0x0e, 0x3c, 0x58, 0x76, 0x08, 0xf4, + 0x22, 0x88, 0x1d, 0xa9, 0x1d, 0xff, 0xb1, 0xc2, 0xd1, 0xaa, 0x94, 0xa7, 0xb4, 0x62, 0x70, 0x0d, + 0xb7, 0xb8, 0x92, 0x04, 0x55, 0x37, 0x2d, 0x61, 0xb0, 0x7e, 0xa5, 0xb0, 0x80, 0x11, 0x28, 0x39, + 0xac, 0x60, 0x61, 0x39, 0xfd, 0x43, 0xf8, 0x8d, 0x26, 0xe7, 0x46, 0x9d, 0xeb, 0x46, 0x6d, 0xb6, + 0xa7, 0xd3, 0xd0, 0xa6, 0x87, 0x20, 0xad, 0x00, 0x26, 0xc6, 0xe6, 0x3e, 0xe6, 0x6b, 0x9d, 0x0e, + 0xcb, 0x2f, 0x0b, 0x8f, 0xd3, 0x48, 0x6b, 0x2d, 0x63, 0x92, 0x8d, 0xea, 0xd9, 0xae, 0x84, 0xe3, + 0x9a, 0x63, 0x1e, 0x67, 0x62, 0xfc, 0xe7, 0x1a, 0x13, 0x92, 0xbc, 0x3b, 0xa1, 0x3a, 0x73, 0xad, + 0x1f, 0xaf, 0x2c, 0x1b, 0xa5, 0xc5, 0xc2, 0xd1, 0x8f, 0x80, 0x49, 0x97, 0x55, 0xbd, 0x30, 0x99, + 0x85, 0x43, 0xe7, 0x60, 0x17, 0x8e, 0xa2, 0x3d, 0xba, 0x74, 0x8a, 0x1e, 0xc2, 0x2e, 0xa1, 0xcc, + 0xa9, 0xad, 0x88, 0xb8, 0x10, 0x21, 0x28, 0x88, 0x5a, 0x1a, 0xa2, 0x10, 0x97, 0xb0, 0xd2, 0xc1, + 0xe7, 0x20, 0xf3, 0x2a, 0x6a, 0x10, 0x38, 0x1a, 0xb3, 0x36, 0xa7, 0xd6, 0x72, 0xb7, 0x6b, 0xbc, + 0xdd, 0xc3, 0x6e, 0xd4, 0xe2, 0xee, 0xbc, 0x24, 0x55, 0x69, 0xa7, 0x42, 0x8f, 0x68, 0x84, 0x2b, + 0xf6, 0x59, 0x8e, 0xeb, 0x3b, 0xd0, 0xe2, 0x32, 0x0b, 0x3c, 0x02, 0xb7, 0xcf, 0xe8, 0xe5, 0xa2, + 0xfd, 0xc9, 0x1b, 0x5f, 0x11, 0x88, 0xec, 0xb4, 0xb0, 0xa1, 0x23, 0xb0, 0x6a, 0xc7, 0x45, 0x9e, + 0xa6, 0xf0, 0xed, 0xfc, 0x57, 0x6c, 0x98, 0xf9, 0x48, 0x5c, 0x0d, 0x6f, 0xa7, 0x79, 0x11, 0x6b, + 0xb6, 0x61, 0x1a, 0x69, 0xf0, 0x48, 0x2c, 0xcc, 0x0b, 0xe5, 0x9e, 0xd2, 0x8e, 0xf8, 0xa9, 0xe1, + 0x3c, 0x8f, 0x9a, 0x40, 0x79, 0x47, 0x2d, 0xb0, 0x78, 0x1a, 0x68, 0xa7, 0x5c, 0x8b, 0x84, 0xb7, + 0xdf, 0x33, 0x40, 0x11, 0x0e, 0xc8, 0xdd, 0x7b, 0xd8, 0x63, 0x95, 0x12, 0xad, 0x12, 0x33, 0x6a, + 0xe0, 0xdc, 0x19, 0x84, 0x3b, 0x84, 0xa5, 0x22, 0x82, 0x83, 0xc4, 0xdb, 0x7f, 0xf1, 0x1d, 0x73, + 0x02, 0xfd, 0xb4, 0x0a, 0xec, 0xae, 0x3d, 0xc1, 0x5f, 0x8a, 0x7b, 0xb7, 0x29, 0xf2, 0x18, 0x16, + 0x6d, 0x1d, 0xb0, 0x1d, 0x0a, 0x77, 0x7d, 0xb7, 0xdb, 0x8d, 0xcd, 0xa5, 0x02, 0x1b, 0x3d, 0x4e, + 0x2c, 0x83, 0x8c, 0x2a, 0x97, 0x43, 0x46, 0x95, 0x8b, 0x0d, 0x01, 0xc8, 0x30, 0xea, 0x3a, 0x5c, + 0x3b, 0x07, 0xcb, 0xae, 0xfa, 0x7a, 0x69, 0x1e, 0x83, 0x5e, 0x55, 0xb6, 0x72, 0x45, 0x8c, 0xaa, + 0xab, 0x06, 0x7c, 0x55, 0xb9, 0x01, 0x7c, 0x55, 0x55, 0x50, 0x02, 0xbe, 0x36, 0xa2, 0xb2, 0x34, + 0x78, 0xe2, 0x64, 0x4a, 0xc1, 0x4b, 0xa5, 0x2d, 0xf8, 0x74, 0xdf, 0xce, 0xd7, 0xc2, 0xd3, 0x2d, + 0xda, 0xbf, 0xf4, 0x7a, 0xcd, 0x97, 0xd6, 0xf5, 0x9e, 0x8f, 0x6b, 0x9a, 0x07, 0x51, 0xeb, 0x4c, + 0x0b, 0x45, 0xff, 0xee, 0xce, 0xb2, 0x5e, 0x1c, 0xbb, 0xbb, 0x50, 0xdf, 0xbe, 0x8a, 0xbb, 0x5f, + 0xd7, 0x6b, 0x6c, 0xec, 0x31, 0x07, 0x78, 0xcc, 0x11, 0x8d, 0x50, 0xc7, 0xbe, 0x9d, 0xeb, 0x51, + 0x24, 0x16, 0x74, 0x11, 0x42, 0x5e, 0xe4, 0xb5, 0x92, 0x8d, 0xbd, 0x65, 0x9d, 0x70, 0xe6, 0x50, + 0x9b, 0x28, 0xe8, 0x26, 0xe4, 0x08, 0x45, 0xa7, 0x8c, 0xb4, 0x15, 0x3a, 0x4a, 0x01, 0x2a, 0xd7, + 0xa6, 0x68, 0x8b, 0x1f, 0xd4, 0x76, 0x04, 0x50, 0x79, 0x0a, 0x72, 0x03, 0x58, 0x9a, 0xa6, 0x31, + 0x51, 0x2b, 0x09, 0x4b, 0x24, 0xac, 0x05, 0x29, 0x61, 0x9a, 0xe5, 0xdb, 0xdb, 0x35, 0xee, 0xda, + 0xa8, 0xff, 0xe7, 0xe1, 0x96, 0x09, 0xcb, 0xa9, 0x01, 0xb5, 0x8c, 0x27, 0xb2, 0x4c, 0x1d, 0xf0, + 0x55, 0xb8, 0xca, 0x24, 0xb7, 0x67, 0x71, 0xe8, 0xea, 0x75, 0x1a, 0xf9, 0x6f, 0x57, 0x43, 0x77, + 0x75, 0x5f, 0x0c, 0x69, 0x4c, 0xbf, 0xbc, 0xb8, 0x50, 0x8b, 0x46, 0xb3, 0x55, 0x97, 0x22, 0x1c, + 0xb7, 0x41, 0x19, 0x2f, 0xc3, 0x31, 0xfe, 0x4a, 0xcc, 0xe2, 0x37, 0xfb, 0xcf, 0x7e, 0x6c, 0xb0, + 0x3b, 0xfc, 0x49, 0x08, 0xe2, 0x14, 0x71, 0x7a, 0xbf, 0x12, 0x7d, 0x98, 0xf2, 0xf8, 0x4a, 0xe0, + 0x61, 0xca, 0xe3, 0x2b, 0x31, 0x87, 0x29, 0x8f, 0x75, 0x70, 0xc3, 0x72, 0x20, 0xb9, 0x3b, 0xb9, + 0x13, 0xe8, 0x82, 0xa9, 0x76, 0x9b, 0x51, 0x17, 0xcd, 0xfb, 0x6d, 0xbc, 0x8b, 0xd9, 0x12, 0xca, + 0x45, 0x9b, 0x55, 0xb1, 0xa3, 0x6d, 0x6c, 0xe4, 0x0b, 0x9d, 0x0d, 0xf8, 0x4f, 0x6c, 0x58, 0xc7, + 0xd1, 0x8d, 0xba, 0x5f, 0xf3, 0xca, 0x23, 0x44, 0x1f, 0x7c, 0x41, 0xdc, 0x33, 0x43, 0xd0, 0x2a, + 0x2a, 0xe9, 0x4c, 0x6d, 0x58, 0xc4, 0x9d, 0xc7, 0x3d, 0x04, 0xb9, 0xf2, 0xcb, 0x36, 0x88, 0x2b, + 0xcc, 0x86, 0x50, 0x16, 0xf0, 0x07, 0x9d, 0x20, 0xb8, 0x20, 0xee, 0x88, 0x1f, 0x61, 0xd0, 0xac, + 0xcc, 0xc1, 0xac, 0x3d, 0x89, 0x4c, 0x40, 0xd8, 0xab, 0x93, 0xf4, 0x4d, 0xdd, 0x5d, 0x3e, 0x15, + 0xea, 0x34, 0xa5, 0x32, 0xac, 0xa1, 0x65, 0xe2, 0x00, 0x81, 0x4f, 0xa6, 0x45, 0x09, 0xd3, 0xbb, + 0x77, 0xa4, 0x68, 0x15, 0x3b, 0xb2, 0xba, 0xb8, 0xfa, 0xb7, 0xc9, 0x39, 0x27, 0x3b, 0x9c, 0xa5, + 0x9a, 0x15, 0x5d, 0x79, 0x53, 0xf6, 0xb3, 0x9d, 0x9d, 0x00, 0xca, 0xc4, 0xcd, 0x02, 0xd3, 0x74, + 0xf1, 0x05, 0x1a, 0x06, 0x39, 0x2d, 0x77, 0xdc, 0x4f, 0x5c, 0x15, 0x7f, 0x28, 0x3c, 0x97, 0xed, + 0xb0, 0xb2, 0xaf, 0x70, 0x4b, 0xc3, 0x68, 0xb5, 0xf4, 0xca, 0x32, 0x4d, 0xc2, 0xe9, 0x2e, 0x62, + 0x15, 0x06, 0xfd, 0x54, 0x1f, 0xc8, 0xe2, 0xed, 0x4d, 0xb2, 0xcc, 0xb7, 0xd8, 0xa9, 0x15, 0x19, + 0x98, 0xc1, 0xc6, 0xf3, 0x89, 0x0a, 0x31, 0x58, 0x41, 0xea, 0x43, 0xd9, 0xdb, 0xf4, 0x3a, 0x9d, + 0x61, 0x90, 0xe9, 0x13, 0x14, 0x68, 0x2b, 0x3c, 0x11, 0x32, 0x94, 0x39, 0xd6, 0x8b, 0x00, 0xa9, + 0xe8, 0xa4, 0x07, 0x83, 0xf3, 0x22, 0xb6, 0x6b, 0xec, 0x93, 0x79, 0x45, 0x07, 0x13, 0x67, 0x36, + 0x01, 0x0f, 0xdb, 0x73, 0x6d, 0x8b, 0x16, 0xcc, 0xdd, 0x27, 0x29, 0xbb, 0x84, 0x3a, 0xf5, 0x8e, + 0x47, 0xc9, 0x63, 0x01, 0xfa, 0x7e, 0x37, 0x8c, 0x42, 0xbc, 0x5d, 0xae, 0x5f, 0x5e, 0xdc, 0x14, + 0xee, 0x5b, 0xe7, 0xd5, 0xa7, 0xea, 0xcc, 0x8e, 0x6c, 0xec, 0xc5, 0xcb, 0xd2, 0x98, 0x18, 0x94, + 0xd4, 0xe9, 0x61, 0x96, 0x77, 0xaf, 0x48, 0x5b, 0xc5, 0x34, 0xc7, 0xe6, 0x7e, 0xab, 0xf8, 0x61, + 0x77, 0x99, 0xe8, 0xee, 0x9b, 0x16, 0x39, 0x31, 0x82, 0x23, 0x8d, 0x0d, 0xb0, 0x96, 0x8a, 0x93, + 0x92, 0xd1, 0x4f, 0x5c, 0x81, 0x10, 0x30, 0x4d, 0xd7, 0x77, 0xd9, 0xb8, 0xa8, 0x0d, 0xe9, 0x5e, + 0xdf, 0x14, 0x2a, 0x61, 0xd9, 0xb0, 0xcb, 0xfb, 0xf5, 0xba, 0xb4, 0x2d, 0xfd, 0xdd, 0xe8, 0xfb, + 0x52, 0xb7, 0xa0, 0x9d, 0xe5, 0x87, 0xcd, 0x72, 0x74, 0x6a, 0x7a, 0x93, 0x8c, 0x7f, 0x31, 0x83, + 0x5c, 0xe7, 0xd2, 0x47, 0x6f, 0x25, 0xbe, 0xeb, 0x97, 0xa2, 0x82, 0x50, 0x54, 0x97, 0x16, 0x56, + 0x63, 0x68, 0xbf, 0x99, 0x39, 0xaf, 0x06, 0x3e, 0x1e, 0x1c, 0x22, 0x9e, 0x27, 0xa8, 0xa3, 0x72, + 0x0e, 0xc5, 0xf9, 0xd2, 0x49, 0x93, 0x77, 0xcf, 0x83, 0xf6, 0x91, 0x16, 0x9b, 0xe4, 0xae, 0xf2, + 0xab, 0x3e, 0x66, 0x6e, 0x8a, 0x52, 0xae, 0xad, 0xb1, 0x60, 0xf0, 0xbd, 0xc9, 0x2e, 0x4c, 0xcc, + 0x35, 0x5f, 0x66, 0x93, 0x51, 0xcd, 0xcf, 0xf7, 0xc4, 0xc5, 0x1d, 0x91, 0x33, 0x1e, 0x72, 0x4c, + 0x09, 0x53, 0xdb, 0x68, 0xb5, 0x9d, 0x95, 0x31, 0xba, 0x6c, 0x41, 0x3b, 0xc2, 0xdf, 0x08, 0x51, + 0xbe, 0x74, 0xfd, 0xc7, 0x9f, 0xaa, 0xe2, 0x2c, 0xe4, 0xe2, 0xc4, 0x51, 0x58, 0xc4, 0x68, 0xf7, + 0xcd, 0x2e, 0xe2, 0x48, 0x6b, 0xcb, 0xa6, 0xd5, 0x38, 0xd6, 0xa0, 0x1e, 0x00, 0xbb, 0xad, 0xd2, + 0x22, 0x80, 0x81, 0x5e, 0xc0, 0xea, 0x9a, 0x5c, 0x13, 0x61, 0x73, 0x04, 0x2a, 0xf4, 0x2e, 0x6c, + 0x3f, 0xe2, 0x6e, 0x34, 0xbb, 0xef, 0x6b, 0xba, 0xa4, 0x55, 0xc4, 0x36, 0xa7, 0x57, 0x37, 0x93, + 0x49, 0x2a, 0x88, 0x51, 0x76, 0xe9, 0x5e, 0xcd, 0x34, 0xbb, 0xbd, 0x5f, 0xc3, 0xce, 0xc2, 0xbc, + 0xb9, 0xb0, 0xbc, 0x58, 0xb2, 0x3e, 0x3c, 0x64, 0xe8, 0x4e, 0xef, 0x50, 0x64, 0x60, 0xfe, 0xab, + 0x77, 0x73, 0x48, 0xa5, 0xc6, 0xfb, 0x39, 0xf8, 0xb5, 0x9a, 0x2e, 0x88, 0x00, 0x62, 0x71, 0xa2, + 0x9b, 0x4c, 0xb3, 0x69, 0x25, 0xd2, 0x2f, 0x1b, 0x49, 0x3f, 0x5b, 0x25, 0x7e, 0x76, 0x44, 0x50, + 0x27, 0x5a, 0xe8, 0x47, 0x4b, 0x6c, 0x1a, 0x85, 0x7b, 0x96, 0x6e, 0x15, 0x85, 0xb5, 0x25, 0xbf, + 0xe1, 0x3a, 0xe9, 0x7b, 0x2a, 0xa9, 0x51, 0x15, 0x64, 0xf1, 0x9c, 0xf2, 0x28, 0xdd, 0xc7, 0x2e, + 0x8d, 0xa5, 0xe1, 0x58, 0x25, 0x21, 0x24, 0x81, 0xde, 0xdf, 0x48, 0x4b, 0x8a, 0xe4, 0x2e, 0x80, + 0xbf, 0x9c, 0x81, 0x56, 0x74, 0xd4, 0xc1, 0x93, 0xc4, 0x52, 0x53, 0xf6, 0xba, 0xbc, 0x33, 0xde, + 0x11, 0x0c, 0x14, 0xe9, 0x41, 0x16, 0x23, 0xa4, 0x4b, 0x23, 0xc6, 0x32, 0x66, 0x1a, 0xd8, 0x08, + 0x58, 0xb2, 0xf1, 0x88, 0x5b, 0x52, 0xd5, 0x74, 0x71, 0x04, 0xe4, 0x4a, 0xec, 0x2e, 0x83, 0xf7, + 0x6f, 0x9d, 0x27, 0x18, 0x15, 0xf8, 0xf5, 0x3a, 0x91, 0xcd, 0xd1, 0x7b, 0xa8, 0x35, 0xbd, 0x5b, + 0x69, 0x44, 0x40, 0xfc, 0x6b, 0xa8, 0x3f, 0xd8, 0x80, 0x17, 0xca, 0x13, 0xce, 0x8a, 0x0c, 0xba, + 0xa2, 0xde, 0xe0, 0xad, 0xfc, 0x34, 0x9d, 0x00, 0x61, 0xe3, 0xb6, 0x10, 0xd9, 0x28, 0x9e, 0xe3, + 0x46, 0xb3, 0x6d, 0xa0, 0xe1, 0x55, 0x20, 0x19, 0x2c, 0x68, 0x58, 0x11, 0x61, 0x47, 0xa9, 0x38, + 0x1b, 0xf1, 0x4b, 0x7f, 0x80, 0x94, 0x35, 0x65, 0xf0, 0x7c, 0xa1, 0x40, 0xcf, 0xca, 0x35, 0xd4, + 0x55, 0xf5, 0x8e, 0x6c, 0xe0, 0xa7, 0xe0, 0xcd, 0x31, 0x83, 0x34, 0x76, 0x46, 0x84, 0x04, 0x96, + 0x89, 0xb2, 0x24, 0x60, 0x1c, 0xd9, 0xbf, 0x57, 0x8e, 0x2a, 0x2c, 0xc7, 0x74, 0x44, 0x83, 0x4a, + 0x8e, 0x9a, 0xbf, 0x72, 0x94, 0xaf, 0x94, 0xfa, 0x14, 0x5d, 0x1d, 0x95, 0x39, 0x6f, 0x84, 0xc7, + 0xa0, 0x8f, 0x13, 0xbb, 0xfc, 0xff, 0x11, 0xfb, 0x15, 0x7f, 0x4f, 0x49, 0x8e, 0x07, 0x52, 0x3c, + 0x77, 0x3d, 0x42, 0x70, 0xf8, 0x8c, 0xf7, 0x28, 0x81, 0xcf, 0x6b, 0x30, 0x7e, 0xfa, 0x54, 0x51, + 0xc2, 0xfa, 0x3a, 0xcf, 0x16, 0xba, 0x6f, 0x59, 0x23, 0x6c, 0x42, 0xf6, 0x2a, 0x28, 0xa0, 0x8b, + 0xf6, 0xfb, 0x18, 0xe2, 0x2a, 0x2a, 0x40, 0x7a, 0x3d, 0x6b, 0x62, 0xfa, 0xb6, 0x40, 0xf9, 0x9e, + 0xd7, 0xa1, 0x7c, 0x1d, 0x31, 0xc9, 0x29, 0xbf, 0x5c, 0x8e, 0xe8, 0x0b, 0x5f, 0x42, 0xef, 0x99, + 0x99, 0x1a, 0xd6, 0x8c, 0xa1, 0xab, 0x30, 0x7e, 0x3b, 0x75, 0x0d, 0xe8, 0x2b, 0xd0, 0x7f, 0xcb, + 0x26, 0xfa, 0xaf, 0x82, 0x6d, 0x53, 0xa0, 0x78, 0x2b, 0x79, 0x5e, 0x98, 0x9a, 0x0b, 0xb5, 0x32, + 0xc4, 0xd7, 0x31, 0x54, 0x18, 0x54, 0x59, 0xc4, 0x03, 0xb3, 0xa1, 0xbd, 0x9b, 0x8a, 0x3c, 0x50, + 0x0c, 0xf4, 0x1b, 0xd0, 0xbc, 0x34, 0x66, 0xb0, 0xff, 0xc1, 0xbb, 0xd5, 0x8c, 0x47, 0x45, 0x3d, + 0x27, 0xee, 0x2c, 0x17, 0xbd, 0x24, 0xd1, 0x8c, 0x1c, 0x96, 0x18, 0xbf, 0xa7, 0x52, 0x06, 0xbb, + 0x24, 0xbf, 0xa7, 0x6d, 0x05, 0x79, 0x7a, 0xd4, 0x36, 0x99, 0x5e, 0x79, 0x47, 0x7e, 0x2a, 0x70, + 0x84, 0x0b, 0x3a, 0xb5, 0x87, 0x8e, 0x80, 0x47, 0xb0, 0x96, 0x78, 0x3c, 0x11, 0x06, 0x4e, 0x62, + 0x68, 0x7a, 0xba, 0xd8, 0x87, 0x55, 0x49, 0x0b, 0xef, 0xb6, 0x5a, 0x78, 0x71, 0xa5, 0xdd, 0x56, + 0xbb, 0x90, 0x3f, 0x3f, 0x78, 0xe1, 0x03, 0x03, 0xef, 0x14, 0x5a, 0xa9, 0x33, 0xd3, 0x9a, 0x2c, + 0x6c, 0xba, 0xf3, 0xc2, 0x8b, 0xb1, 0xe6, 0xbd, 0x9f, 0x6f, 0x91, 0x52, 0x13, 0xb6, 0x23, 0x9d, + 0xbb, 0x69, 0x75, 0xd5, 0x21, 0x6f, 0x08, 0xf8, 0xea, 0x3f, 0x61, 0x92, 0x96, 0x17, 0x5c, 0x64, + 0xd8, 0xe2, 0x51, 0x23, 0x7e, 0x5c, 0xd6, 0xb6, 0x2d, 0xf0, 0xf8, 0xaa, 0x34, 0x1b, 0x17, 0x2c, + 0xf2, 0xc3, 0x43, 0xf5, 0x75, 0xdb, 0xad, 0x96, 0x56, 0x98, 0xe5, 0x3d, 0x4b, 0x0a, 0x78, 0x38, + 0x7a, 0x79, 0x72, 0xdc, 0x81, 0xf6, 0xbb, 0x1e, 0x66, 0x17, 0x4c, 0x27, 0x0d, 0x1d, 0x62, 0x58, + 0x88, 0xa1, 0x4a, 0x31, 0x9c, 0x4d, 0x35, 0x71, 0x11, 0x25, 0x82, 0x00, 0xb2, 0xa8, 0xca, 0x78, + 0x47, 0xed, 0x9f, 0xe9, 0xda, 0x9f, 0xe9, 0x2a, 0x4c, 0xc4, 0x96, 0x35, 0xb6, 0x73, 0xfd, 0x1c, + 0xb6, 0xab, 0xd8, 0x2f, 0xaa, 0xbc, 0x73, 0xfc, 0xba, 0x63, 0xd1, 0x96, 0xf2, 0x5a, 0x74, 0x51, + 0x37, 0x15, 0xeb, 0x0d, 0x12, 0x15, 0x1f, 0x5a, 0xe2, 0xc2, 0xde, 0x26, 0xf5, 0x0e, 0x22, 0xda, + 0x26, 0x75, 0xf5, 0x36, 0x09, 0xdb, 0x51, 0xc4, 0xa0, 0xc5, 0xbf, 0xb3, 0xce, 0xee, 0x4e, 0xfc, + 0x60, 0x71, 0xb4, 0x64, 0xd1, 0xc7, 0x6a, 0x5e, 0xbf, 0xee, 0xa3, 0x63, 0xfe, 0x09, 0x2f, 0xfb, + 0x0a, 0xbe, 0x72, 0xa5, 0xf9, 0x51, 0x1d, 0x29, 0x60, 0x59, 0xf5, 0xaa, 0x4f, 0x3d, 0x10, 0x05, + 0xdc, 0x5e, 0xfe, 0x45, 0xaa, 0x8a, 0xed, 0x1d, 0xb1, 0xb3, 0x7d, 0x21, 0x52, 0x97, 0xb6, 0xe0, + 0xc4, 0xa7, 0xf0, 0x8d, 0x59, 0x0b, 0x98, 0xfa, 0x60, 0x3b, 0xde, 0xde, 0xd4, 0x72, 0x7d, 0xe2, + 0x9a, 0xae, 0xb7, 0x17, 0x96, 0xe4, 0xad, 0x0d, 0x7f, 0x37, 0x2c, 0x54, 0x91, 0xbc, 0xd1, 0x8c, + 0xd9, 0xfe, 0xc6, 0x56, 0x5f, 0xc0, 0xf7, 0x9e, 0xae, 0x78, 0x55, 0x76, 0x77, 0x9e, 0x80, 0x5e, + 0x80, 0xc5, 0x52, 0x48, 0x99, 0x98, 0x47, 0xdd, 0x9e, 0xc7, 0x62, 0x49, 0x2f, 0x67, 0x36, 0x5b, + 0xb1, 0xf5, 0xbb, 0xdf, 0x76, 0xc5, 0x07, 0x46, 0xe8, 0x97, 0x51, 0x5e, 0x31, 0xb1, 0xba, 0xeb, + 0x3b, 0xcb, 0xa0, 0x3d, 0xa1, 0x58, 0x66, 0x35, 0xc7, 0xf7, 0xd3, 0xcc, 0x3a, 0xdc, 0x94, 0xfb, + 0x4d, 0x3f, 0x52, 0xd0, 0x8a, 0xe7, 0x36, 0xba, 0xd4, 0x2c, 0xc2, 0xc1, 0x12, 0x80, 0x6a, 0x3d, + 0xc9, 0xc7, 0x37, 0x78, 0x98, 0x5d, 0xa9, 0x5b, 0x76, 0x04, 0x3c, 0x0d, 0xaa, 0xcd, 0x05, 0xba, + 0x26, 0x09, 0xba, 0x5e, 0x66, 0xdd, 0xbf, 0x27, 0x18, 0x43, 0x88, 0xcc, 0x41, 0xe4, 0x60, 0xb6, + 0xf1, 0xf1, 0xec, 0x58, 0x64, 0xe4, 0xb5, 0x23, 0x4f, 0xce, 0x67, 0xe5, 0x5b, 0x76, 0x2a, 0x6b, + 0xaf, 0x88, 0x0a, 0x6f, 0x45, 0xd5, 0xcd, 0xa3, 0xca, 0x0e, 0x57, 0xb5, 0xa2, 0xbe, 0xc2, 0xe4, + 0x8e, 0xef, 0x79, 0x64, 0xb4, 0x9b, 0xe8, 0xf0, 0x8d, 0x86, 0x6c, 0xc4, 0x23, 0x4d, 0xf8, 0xd3, + 0xb1, 0x8e, 0x50, 0x5f, 0x44, 0xdf, 0x79, 0x16, 0x0f, 0x3d, 0xbe, 0xed, 0x6c, 0xaa, 0x86, 0xb8, + 0x3a, 0x07, 0x9a, 0x6b, 0xf4, 0xa8, 0x0b, 0x25, 0x1d, 0xb1, 0xd6, 0x3f, 0xbc, 0x6f, 0xeb, 0x46, + 0x1c, 0x8d, 0x4d, 0x8b, 0x26, 0x34, 0x79, 0xf8, 0xc8, 0xdf, 0x6f, 0x57, 0x1d, 0x28, 0x11, 0x01, + 0x4a, 0x76, 0x3a, 0xb5, 0x3d, 0x00, 0x95, 0x09, 0xcf, 0x92, 0x54, 0xe1, 0xd6, 0x2b, 0x0a, 0xe9, + 0x2e, 0x74, 0x33, 0x6b, 0x54, 0xb1, 0x91, 0x6e, 0xf3, 0x59, 0x43, 0x1d, 0x5a, 0xb8, 0x07, 0x91, + 0x0c, 0x73, 0x59, 0xd4, 0xeb, 0xda, 0x88, 0xf3, 0xfa, 0xa6, 0xa0, 0x63, 0x8a, 0x25, 0xd2, 0x7e, + 0xd0, 0xf6, 0x8b, 0x25, 0x11, 0xbe, 0x01, 0xe1, 0x76, 0xba, 0x8b, 0x8d, 0x3e, 0xa6, 0x9a, 0xf8, + 0x19, 0x34, 0x71, 0xeb, 0xc1, 0x9f, 0x3b, 0x7d, 0x3b, 0xdb, 0x17, 0x25, 0x27, 0xcf, 0xdd, 0xcf, + 0x0f, 0x0e, 0xf6, 0xf7, 0x78, 0xfa, 0x8e, 0xf6, 0x7a, 0xb0, 0xb0, 0x8a, 0x19, 0xfc, 0xe8, 0xda, + 0x2a, 0x31, 0x19, 0xdd, 0x1a, 0xcd, 0xaf, 0xb7, 0x29, 0x75, 0xa3, 0xdb, 0xd3, 0x6e, 0x04, 0xad, + 0x5d, 0xb6, 0x97, 0xf2, 0x6b, 0x04, 0x37, 0x35, 0xa8, 0x44, 0xd7, 0x82, 0x47, 0xed, 0x82, 0x7f, + 0xd8, 0x4c, 0x6e, 0xc7, 0xb4, 0xb7, 0x52, 0xfc, 0x15, 0x7d, 0xae, 0xb9, 0x50, 0x3c, 0xa6, 0xcf, + 0x2d, 0xe5, 0xb8, 0xa9, 0x75, 0x86, 0xa7, 0x6a, 0xc0, 0x2f, 0x39, 0x73, 0x91, 0x93, 0xf4, 0xec, + 0xfd, 0xcd, 0x35, 0x1a, 0xdf, 0x2d, 0xc7, 0xcd, 0x8f, 0xf9, 0x4d, 0x27, 0x13, 0xa0, 0x33, 0x0d, + 0xab, 0x0e, 0x6c, 0x0a, 0x61, 0xd3, 0xd5, 0x93, 0x9a, 0x7d, 0x89, 0xdb, 0x00, 0x4c, 0xde, 0x19, + 0xea, 0x1d, 0xd9, 0x96, 0x44, 0xaf, 0xf9, 0xcf, 0xce, 0xf4, 0xea, 0x50, 0xb8, 0x1b, 0x45, 0xd6, + 0xac, 0x4f, 0x56, 0x04, 0x97, 0x1d, 0xd8, 0xb2, 0x2c, 0x47, 0x6a, 0x0a, 0xe6, 0x65, 0x40, 0x2f, + 0x02, 0xff, 0xa9, 0xc9, 0xdc, 0x5e, 0xb3, 0xe7, 0xcb, 0xd2, 0x33, 0x32, 0x8c, 0x4a, 0xbc, 0xae, + 0x66, 0x75, 0xec, 0x66, 0xb5, 0x2a, 0x41, 0x5a, 0x6a, 0x76, 0xd9, 0x06, 0xc3, 0x76, 0xcf, 0xb0, + 0x16, 0x72, 0x6d, 0x56, 0x9b, 0x80, 0x26, 0x50, 0xc5, 0xa9, 0x98, 0x54, 0xfd, 0x4d, 0x67, 0xc6, + 0x13, 0x69, 0x11, 0x52, 0x7d, 0x75, 0xc3, 0x0f, 0xa7, 0xad, 0x5f, 0x26, 0x7b, 0xc9, 0xe6, 0x9f, + 0x96, 0x1d, 0x54, 0x7f, 0x7c, 0xdb, 0xf2, 0x91, 0xa3, 0x0d, 0xbd, 0xa8, 0xe3, 0xf1, 0xc9, 0xad, + 0xbf, 0x31, 0xa6, 0xf7, 0xcd, 0x9b, 0x16, 0xc3, 0x75, 0xd5, 0xe6, 0xed, 0x28, 0x63, 0xf7, 0xda, + 0x62, 0x53, 0xac, 0x58, 0x26, 0x72, 0xa4, 0x21, 0x1a, 0x55, 0xa1, 0x5c, 0xc5, 0x31, 0x1f, 0x71, + 0x08, 0x7d, 0x7b, 0xa0, 0xd1, 0x21, 0xcf, 0x63, 0xca, 0x78, 0x17, 0x02, 0x51, 0x47, 0x35, 0xd0, + 0x47, 0x4d, 0x04, 0x59, 0x42, 0x8d, 0x0d, 0xed, 0x4d, 0x8e, 0xda, 0xb7, 0x40, 0x37, 0x68, 0x45, + 0x64, 0x0f, 0x97, 0x9c, 0xa2, 0xdb, 0x77, 0x3d, 0x95, 0x9f, 0x80, 0xae, 0xb4, 0x39, 0x88, 0x16, + 0x7f, 0x3a, 0x5b, 0xd4, 0xae, 0x40, 0x32, 0x93, 0x55, 0xe9, 0x30, 0x59, 0x95, 0x04, 0x92, 0x85, + 0x97, 0xc2, 0x09, 0x44, 0x1f, 0x1d, 0xad, 0x4b, 0xbc, 0x75, 0x8a, 0x88, 0x33, 0x5c, 0xd1, 0x8b, + 0xa0, 0x6f, 0xbb, 0x50, 0x56, 0x8d, 0x4f, 0xbf, 0xb9, 0xff, 0x6b, 0xbf, 0x5c, 0x82, 0x0e, 0xb7, + 0xc0, 0xad, 0xa0, 0xc4, 0x10, 0x48, 0x44, 0xb8, 0x5a, 0x00, 0x46, 0x50, 0xb7, 0xfc, 0xa9, 0x51, + 0x08, 0xe2, 0xec, 0xa1, 0xfc, 0x1c, 0xac, 0x4c, 0x9b, 0x56, 0xcb, 0x71, 0xb6, 0x96, 0xc7, 0xe4, + 0x78, 0xcf, 0xe4, 0x51, 0x0d, 0xd1, 0xb7, 0x8e, 0x80, 0x57, 0xc0, 0x04, 0x9d, 0x1b, 0x98, 0x20, + 0x66, 0xe7, 0x66, 0xdc, 0xb1, 0xb0, 0x6c, 0x56, 0x19, 0xdf, 0xe3, 0xe3, 0x2a, 0x13, 0x4e, 0x95, + 0x09, 0xe2, 0x9d, 0x72, 0xaa, 0x8c, 0x8b, 0x88, 0x6e, 0xf0, 0x7c, 0x0c, 0xe3, 0xc0, 0x83, 0x55, + 0x86, 0x7a, 0xc3, 0x3a, 0x33, 0xc2, 0x3d, 0xb4, 0x75, 0xcb, 0x0a, 0x6f, 0xe8, 0x94, 0x12, 0xe0, + 0x80, 0x1c, 0xed, 0x2b, 0xce, 0x32, 0x5a, 0x2c, 0x4a, 0x0b, 0x2d, 0xc0, 0x75, 0xa4, 0x2d, 0xed, + 0xc9, 0x93, 0x79, 0xe8, 0xdc, 0x21, 0xab, 0x07, 0x87, 0x72, 0xc7, 0x2c, 0xd7, 0xa2, 0x1e, 0x67, + 0xeb, 0x50, 0x8f, 0xb1, 0x84, 0xd1, 0x56, 0x22, 0x9d, 0x08, 0x5c, 0x88, 0x63, 0x68, 0x2d, 0xeb, + 0x0c, 0xce, 0xc5, 0x3a, 0xbe, 0x9e, 0x5a, 0xaf, 0x6a, 0x98, 0xc7, 0x76, 0x7f, 0xa8, 0xa1, 0x1f, + 0xcf, 0xee, 0x0a, 0x07, 0x18, 0x0e, 0x9b, 0x16, 0x7b, 0x24, 0xf9, 0x37, 0xa3, 0x0b, 0x7f, 0x62, + 0x75, 0xb4, 0x0c, 0xab, 0x0d, 0xbd, 0xd6, 0xb0, 0x13, 0xe3, 0x99, 0x53, 0xc3, 0x95, 0xb4, 0x44, + 0x6e, 0xb3, 0x0c, 0xba, 0xf2, 0x6d, 0x9c, 0x86, 0xd7, 0xd3, 0x78, 0x18, 0xe2, 0xad, 0x89, 0x70, + 0x54, 0x4c, 0xe3, 0xd6, 0x72, 0x13, 0x73, 0x9c, 0x46, 0x84, 0x86, 0x16, 0xc9, 0x17, 0x0b, 0xc5, + 0x6a, 0xd3, 0x02, 0x20, 0x3b, 0xde, 0x00, 0x40, 0xf6, 0x62, 0x3d, 0x80, 0x6c, 0x38, 0x6b, 0x8f, + 0x83, 0xc0, 0xcf, 0xaa, 0x19, 0x0a, 0xea, 0x16, 0x90, 0x73, 0x32, 0x0e, 0xf9, 0x37, 0xe4, 0x90, + 0x5c, 0xc8, 0xdf, 0xf9, 0x24, 0x99, 0x2d, 0xf8, 0x27, 0xf4, 0x0c, 0xba, 0xb1, 0xc5, 0xa4, 0xd1, + 0xc2, 0x75, 0xf4, 0x2f, 0xec, 0x33, 0x78, 0xe9, 0x72, 0xb8, 0xba, 0x0f, 0xf5, 0x79, 0x42, 0xa9, + 0x63, 0x56, 0x67, 0x75, 0xcc, 0x6a, 0xe9, 0xe7, 0xd0, 0x38, 0x84, 0x0e, 0x87, 0x4d, 0x47, 0x80, + 0xa6, 0x63, 0x71, 0x4a, 0x5e, 0xc3, 0x13, 0x3f, 0x3d, 0x2c, 0xf1, 0xea, 0xe2, 0xc3, 0x43, 0x7a, + 0x44, 0x98, 0xea, 0x0a, 0x6d, 0x03, 0x71, 0x90, 0x54, 0x96, 0x09, 0x45, 0xe1, 0x1b, 0xb4, 0x87, + 0x19, 0x47, 0x1f, 0xee, 0xb6, 0x66, 0x79, 0x94, 0x35, 0x32, 0x31, 0x9e, 0x0c, 0xf8, 0xa6, 0x6f, + 0xe3, 0x51, 0x71, 0x42, 0x32, 0xe1, 0x0d, 0x1f, 0x1e, 0xb6, 0x1a, 0xe1, 0x48, 0x4b, 0x68, 0xe7, + 0xd5, 0xb9, 0x50, 0x33, 0xa1, 0x84, 0xe3, 0x68, 0xed, 0x9a, 0x29, 0x77, 0xcd, 0x21, 0x77, 0x24, + 0x72, 0x32, 0x4f, 0x0f, 0x19, 0xa2, 0xdb, 0x5a, 0xde, 0x1c, 0xd4, 0xf0, 0xb2, 0x81, 0x1a, 0xde, + 0xe7, 0x2b, 0xf4, 0x06, 0x0b, 0x4b, 0xd5, 0x6e, 0xd1, 0xac, 0xf1, 0x66, 0xed, 0x4e, 0x65, 0xed, + 0x4e, 0x0f, 0x2b, 0xae, 0xae, 0xe9, 0x51, 0xd5, 0xa8, 0x18, 0xa5, 0xfb, 0x57, 0xba, 0x76, 0x0b, + 0xd5, 0x18, 0xc5, 0xea, 0xc6, 0xc0, 0x7a, 0xcc, 0xb9, 0x4b, 0x12, 0x54, 0x4b, 0x32, 0x0d, 0xd5, + 0x63, 0x3e, 0xfb, 0x98, 0x14, 0x0b, 0x2c, 0xe6, 0xb8, 0x09, 0xc2, 0x4c, 0x95, 0xdf, 0x98, 0x29, + 0xc7, 0x6b, 0x00, 0xd9, 0x9d, 0x81, 0x93, 0xad, 0x1f, 0x38, 0xb9, 0x1e, 0x38, 0x95, 0x12, 0x0b, + 0x06, 0x4e, 0x29, 0x7f, 0xc3, 0xc0, 0xc9, 0x42, 0x6a, 0x94, 0x3a, 0xf8, 0x34, 0x42, 0x97, 0x50, + 0x94, 0xca, 0x05, 0xf5, 0xb6, 0x81, 0xa9, 0xd1, 0x57, 0x49, 0xbb, 0x4c, 0x3a, 0x03, 0x2d, 0x77, + 0x9d, 0x48, 0xe4, 0x38, 0x33, 0x1c, 0x91, 0x83, 0x36, 0x05, 0x03, 0xb4, 0x89, 0x2b, 0x34, 0x2e, + 0x5e, 0xc3, 0xe2, 0x37, 0x05, 0x2d, 0xcc, 0x9c, 0xd2, 0xc0, 0x1b, 0xe9, 0xbb, 0x00, 0x5b, 0xa6, + 0x2d, 0x74, 0x4b, 0x50, 0x59, 0xed, 0xee, 0x86, 0xcb, 0x96, 0x61, 0xec, 0x76, 0xb0, 0xa0, 0x04, + 0xce, 0x82, 0x5b, 0xfd, 0x22, 0x6e, 0x57, 0xac, 0xdd, 0x38, 0x53, 0x2e, 0x9d, 0xe2, 0x6b, 0x6b, + 0x37, 0x66, 0xf5, 0x71, 0x55, 0x5e, 0x1f, 0xdd, 0xac, 0x3e, 0x2e, 0xcf, 0xe9, 0xa7, 0xe9, 0x8a, + 0x7c, 0x60, 0xde, 0x5e, 0xb6, 0xb2, 0x34, 0xf3, 0x59, 0x25, 0xd0, 0xb5, 0x2b, 0xd0, 0xf5, 0x2a, + 0x81, 0xba, 0xbd, 0x55, 0x19, 0x75, 0x7b, 0x6e, 0x4e, 0x5d, 0xda, 0xdf, 0x4a, 0x0b, 0xd9, 0x31, + 0x1a, 0x6f, 0xea, 0x19, 0x9e, 0xae, 0x2a, 0x61, 0xe9, 0x96, 0xb0, 0x9c, 0xae, 0xcb, 0xed, 0xc3, + 0x6c, 0x45, 0x6e, 0xd5, 0x2c, 0x5e, 0xd6, 0x61, 0xeb, 0xf9, 0xd0, 0xee, 0x0b, 0x0d, 0x69, 0x8f, + 0xdb, 0x7f, 0x2d, 0xed, 0x72, 0xa2, 0x8a, 0xab, 0x46, 0xc9, 0xc5, 0xe5, 0xc9, 0x5d, 0xb1, 0x42, + 0x5e, 0x58, 0x92, 0xb7, 0x1e, 0xb1, 0x07, 0x68, 0xc9, 0xff, 0xc7, 0x62, 0x55, 0xed, 0x6e, 0xb4, + 0xda, 0xbb, 0x97, 0x00, 0x2f, 0xd3, 0xb7, 0x85, 0x10, 0x7f, 0x08, 0x7d, 0xd7, 0xdb, 0xda, 0x69, + 0xcf, 0xf1, 0x0e, 0xa4, 0x57, 0x79, 0x30, 0xa1, 0x33, 0x3c, 0x11, 0x79, 0xe0, 0xf0, 0xae, 0x1a, + 0xd4, 0x70, 0x11, 0x9a, 0x3b, 0x98, 0xc2, 0xba, 0x5e, 0x2c, 0x6f, 0x50, 0x36, 0x2e, 0x66, 0xfa, + 0x90, 0x2d, 0x3a, 0x92, 0xc2, 0x6e, 0x32, 0x58, 0xb1, 0xe7, 0xae, 0xde, 0xfe, 0x4b, 0x0b, 0xc3, + 0xd7, 0xa8, 0x13, 0x31, 0xb0, 0x40, 0x33, 0xea, 0x00, 0x18, 0xdb, 0x0a, 0x00, 0xa3, 0x0e, 0x1e, + 0x1b, 0xcb, 0xae, 0xb0, 0xad, 0xe9, 0x5f, 0xeb, 0x49, 0xcf, 0x97, 0x25, 0xad, 0x43, 0x0d, 0x5b, + 0x40, 0xb3, 0x2d, 0x3d, 0x62, 0x72, 0x6f, 0x6a, 0x1d, 0xa6, 0xea, 0xc9, 0xfd, 0x85, 0x98, 0x98, + 0x1b, 0x27, 0xf4, 0x58, 0x6f, 0x4a, 0x8d, 0x89, 0xfc, 0xa8, 0x82, 0x2a, 0x26, 0xbc, 0x56, 0x78, + 0xe4, 0x4d, 0x8a, 0xbb, 0x32, 0x83, 0xc7, 0x15, 0x1a, 0x92, 0xc5, 0xa2, 0x5e, 0x2c, 0xec, 0x9e, + 0xb5, 0xde, 0xd9, 0xe8, 0x93, 0x4d, 0xac, 0xbb, 0xa0, 0xde, 0xcf, 0x11, 0xaf, 0xc6, 0x6f, 0xeb, + 0xe5, 0xe5, 0x7d, 0x6b, 0x5e, 0x0e, 0xfa, 0x55, 0x63, 0xd8, 0x68, 0xf4, 0xab, 0xd6, 0x2c, 0xa7, + 0xed, 0x59, 0x36, 0x20, 0xb3, 0x1a, 0xd9, 0x32, 0x6a, 0x0e, 0xb4, 0xa0, 0x84, 0xfc, 0x43, 0xc5, + 0xfd, 0xe1, 0x41, 0x1c, 0xed, 0x07, 0xee, 0x20, 0x5a, 0x2c, 0xea, 0x0b, 0xbc, 0xc2, 0xcb, 0x22, + 0x74, 0x19, 0xb9, 0x78, 0xef, 0x53, 0xeb, 0xf3, 0xd8, 0x1a, 0xef, 0x27, 0x65, 0xdc, 0xb3, 0x03, + 0x7a, 0x10, 0x20, 0x7f, 0x76, 0x61, 0x45, 0xaf, 0x0d, 0x1e, 0x47, 0x2c, 0xc6, 0xb5, 0x41, 0xb1, + 0x2c, 0x38, 0xc2, 0xba, 0x6c, 0xa5, 0x96, 0x4d, 0x7e, 0x98, 0x75, 0xb1, 0x7c, 0x3f, 0xd9, 0xda, + 0xaa, 0xe4, 0xa7, 0x65, 0x50, 0x8f, 0x82, 0xe4, 0x43, 0x17, 0x1f, 0xc2, 0x9a, 0xaa, 0xe6, 0x7c, + 0xfe, 0x5d, 0xde, 0x9c, 0x00, 0x71, 0xd0, 0x8b, 0xfa, 0x00, 0xa0, 0xfd, 0x84, 0xa5, 0xda, 0x23, + 0x02, 0xe1, 0x02, 0xb9, 0x23, 0x94, 0xf9, 0xc6, 0x47, 0x7d, 0x54, 0x5e, 0x6f, 0x57, 0xce, 0x05, + 0x08, 0x41, 0xa2, 0x1d, 0x0d, 0xee, 0x70, 0xc7, 0x66, 0x3f, 0x19, 0xa0, 0x90, 0x13, 0x34, 0x5f, + 0x0a, 0x2f, 0x38, 0x4c, 0x88, 0x79, 0x02, 0xb3, 0x87, 0xf9, 0x71, 0x11, 0x4a, 0x27, 0x72, 0x49, + 0xdb, 0x55, 0x85, 0x2a, 0x75, 0x60, 0x1c, 0x26, 0x7f, 0x4f, 0xcd, 0xef, 0x0c, 0x6f, 0x4c, 0x3a, + 0xf2, 0xc0, 0xec, 0x97, 0x67, 0x08, 0x37, 0x1d, 0x5a, 0xdb, 0x9a, 0x77, 0xf9, 0x10, 0xef, 0x67, + 0x48, 0x5b, 0x69, 0xc7, 0xdb, 0x51, 0x9e, 0x01, 0x3b, 0x5e, 0xc7, 0x27, 0x22, 0xcd, 0xc0, 0x5b, + 0x31, 0xe3, 0xd1, 0x89, 0xa5, 0xc2, 0x8c, 0x85, 0xb6, 0x9a, 0x1d, 0xd7, 0x7d, 0x2b, 0xf9, 0xc4, + 0x55, 0xcf, 0xe0, 0x01, 0x14, 0xfb, 0xf8, 0xb0, 0x4b, 0x9c, 0x1a, 0xc7, 0xc9, 0xb2, 0x83, 0x54, + 0x50, 0xb6, 0x8e, 0x8f, 0x7a, 0x07, 0x51, 0x00, 0xe3, 0xbb, 0x00, 0x29, 0xa5, 0x17, 0xfc, 0xf1, + 0x6b, 0xd8, 0x75, 0xc1, 0x14, 0x30, 0x12, 0x1d, 0x3c, 0x94, 0xcd, 0x41, 0x97, 0x11, 0x65, 0xb9, + 0xa7, 0xb8, 0x67, 0x10, 0xf2, 0xca, 0x9f, 0xbd, 0xb7, 0x2c, 0x63, 0x64, 0x74, 0xd2, 0x1c, 0xdd, + 0xf8, 0xce, 0xaf, 0x06, 0x9e, 0xf6, 0x30, 0xf7, 0x8c, 0x7f, 0x7d, 0xb0, 0x33, 0x3b, 0x56, 0x40, + 0x90, 0x73, 0xa3, 0x4d, 0xb6, 0xd9, 0xd7, 0x82, 0x6a, 0x00, 0x1b, 0x6b, 0x65, 0x4a, 0x36, 0xde, + 0x98, 0x61, 0xc9, 0xf5, 0x8b, 0x7f, 0xb1, 0x9a, 0x63, 0xe4, 0x64, 0x19, 0x59, 0xd2, 0x90, 0x13, + 0x94, 0xa5, 0x54, 0x43, 0xc7, 0xb4, 0x5f, 0x97, 0xcd, 0xd7, 0x63, 0xe7, 0xf5, 0xf8, 0xea, 0x73, + 0xc3, 0x9b, 0x56, 0xfa, 0xca, 0xe0, 0x4e, 0x98, 0x10, 0xa7, 0x6a, 0xa1, 0x5c, 0x76, 0x82, 0x0e, + 0x97, 0xbe, 0x2d, 0x2d, 0xcd, 0x63, 0xc5, 0x44, 0xc0, 0x19, 0xaa, 0x4b, 0x43, 0x66, 0x79, 0xae, + 0xce, 0xe8, 0xb5, 0xb2, 0x59, 0x15, 0x5f, 0xe6, 0xa5, 0x8d, 0xf9, 0x9a, 0x05, 0x0b, 0x86, 0x48, + 0xe0, 0x7e, 0x50, 0x62, 0x87, 0x86, 0x1d, 0xbb, 0x01, 0x2e, 0x73, 0x94, 0x12, 0x93, 0x29, 0x1e, + 0xdd, 0x3a, 0xac, 0x28, 0xc4, 0xfb, 0xfb, 0xe2, 0x45, 0xbf, 0xc3, 0x83, 0xa0, 0x43, 0x96, 0xeb, + 0xce, 0x17, 0x84, 0x1f, 0xb0, 0xbc, 0x0a, 0x3a, 0x74, 0x57, 0x80, 0xe1, 0x4b, 0xac, 0x81, 0x33, + 0xf7, 0x82, 0xa3, 0xdd, 0xee, 0xa3, 0x3f, 0x75, 0xfa, 0x05, 0x36, 0x2e, 0xf7, 0x12, 0xa2, 0x6e, + 0x9a, 0x75, 0xc6, 0x4c, 0x22, 0x8b, 0xc5, 0xb3, 0x3f, 0xca, 0x9f, 0x23, 0xd8, 0xb6, 0xc6, 0x50, + 0xfd, 0xb3, 0xc5, 0x93, 0x76, 0x7e, 0x42, 0x12, 0x80, 0x7d, 0x9b, 0x80, 0x8e, 0x3d, 0x41, 0x97, + 0xc4, 0xeb, 0xfc, 0x62, 0x3a, 0xf9, 0x82, 0xc3, 0x92, 0xe0, 0x08, 0x78, 0x6c, 0xc2, 0x9e, 0x8a, + 0x3b, 0x16, 0xfc, 0x99, 0xe1, 0xc0, 0x4b, 0x66, 0xc7, 0xd0, 0x47, 0x40, 0xb9, 0x7a, 0x6f, 0xe1, + 0xba, 0x9c, 0x4b, 0x37, 0x1a, 0x63, 0x19, 0xb0, 0xc9, 0x9e, 0x4b, 0x98, 0x22, 0x40, 0x3d, 0xb6, + 0x27, 0x80, 0xd3, 0x21, 0x01, 0x4b, 0xe3, 0xc0, 0xe7, 0x21, 0x3f, 0x3b, 0x6e, 0x8e, 0xf9, 0x12, + 0xc1, 0xe5, 0xf3, 0x01, 0xdf, 0x5c, 0xf9, 0x34, 0x3b, 0x3e, 0x83, 0x89, 0xdc, 0xb9, 0xea, 0x02, + 0x41, 0x2c, 0x54, 0x33, 0x38, 0x6f, 0x06, 0xdd, 0x36, 0x83, 0xd0, 0xdf, 0x14, 0x46, 0x8c, 0xf9, + 0xc0, 0x3c, 0x8b, 0x67, 0xef, 0x43, 0xe8, 0x48, 0xb1, 0xb7, 0xac, 0xb6, 0x10, 0xcb, 0x50, 0x08, + 0xae, 0xa3, 0x4c, 0xdc, 0xa5, 0x5f, 0x68, 0x3e, 0xba, 0x50, 0x2d, 0xb6, 0xe7, 0xc1, 0xea, 0x85, + 0x5d, 0x11, 0x47, 0xbe, 0xfe, 0x10, 0x76, 0x4d, 0x0a, 0xc5, 0x22, 0xfd, 0x9e, 0x3a, 0xef, 0xa0, + 0x72, 0x30, 0x2c, 0xb0, 0x30, 0x4e, 0x24, 0xec, 0x08, 0x56, 0x87, 0x39, 0x08, 0x09, 0xeb, 0x08, + 0x25, 0xb3, 0xeb, 0xea, 0x1d, 0xd4, 0x26, 0x52, 0x77, 0x59, 0x58, 0x25, 0xc1, 0x82, 0xf0, 0xc9, + 0x6c, 0x88, 0x10, 0xf6, 0xec, 0x54, 0x13, 0x26, 0xf1, 0xe9, 0xaa, 0x0b, 0x19, 0xf8, 0x4e, 0x75, + 0x24, 0x37, 0x14, 0xaf, 0x68, 0xdb, 0xbd, 0x68, 0x73, 0x5f, 0x50, 0x8f, 0xb1, 0xa9, 0x49, 0x35, + 0x00, 0xb9, 0xfb, 0xb5, 0x7c, 0xbb, 0x8f, 0xc9, 0x77, 0x5f, 0x72, 0x4f, 0xe2, 0xad, 0x52, 0xcf, + 0xcc, 0x94, 0x2b, 0x67, 0xc2, 0x65, 0x86, 0x51, 0x25, 0x90, 0xbb, 0xd6, 0xaa, 0x8c, 0x70, 0x6d, + 0xaf, 0x5d, 0xef, 0x68, 0x3b, 0xf6, 0xb8, 0x40, 0x0b, 0x65, 0xdf, 0xa9, 0xc3, 0x71, 0x36, 0x19, + 0xf8, 0x6e, 0x9e, 0x17, 0x68, 0xb1, 0x5f, 0x04, 0x6e, 0x8f, 0x03, 0x11, 0x9b, 0x2d, 0x6c, 0x1f, + 0x58, 0x2d, 0x3d, 0xae, 0xa2, 0xbb, 0x06, 0x7c, 0x46, 0x32, 0x6e, 0x22, 0x35, 0x3f, 0xa2, 0x3a, + 0x5d, 0x07, 0x9a, 0x2d, 0x4c, 0x6b, 0x95, 0x02, 0x36, 0x66, 0x8e, 0x01, 0xde, 0x80, 0xa2, 0xcd, + 0x11, 0xd9, 0x2e, 0x11, 0xb6, 0x71, 0x7d, 0x19, 0xb6, 0x2c, 0x19, 0xba, 0x83, 0xb6, 0xf3, 0xb5, + 0xfb, 0x7b, 0xa2, 0x4f, 0xe9, 0x23, 0xcf, 0x72, 0xbd, 0xa8, 0xf2, 0x1d, 0xf6, 0xf1, 0x13, 0x62, + 0x89, 0xf1, 0x8b, 0xcb, 0xd1, 0x69, 0x55, 0xf8, 0x95, 0x85, 0x11, 0x0b, 0x43, 0x04, 0xa6, 0xc2, + 0x31, 0xd2, 0xc8, 0x70, 0x3d, 0xa8, 0x85, 0xa6, 0x4e, 0xac, 0x12, 0xba, 0xfc, 0x3d, 0xd2, 0x1e, + 0x65, 0xc1, 0xc5, 0xdb, 0xb8, 0xb3, 0x4b, 0x09, 0x82, 0x90, 0xf9, 0xa7, 0x8e, 0xf0, 0x49, 0x38, + 0x60, 0xa8, 0xa6, 0x5d, 0x21, 0x22, 0xb3, 0xbe, 0x98, 0xf2, 0x4a, 0xc2, 0x79, 0x7a, 0x05, 0xcc, + 0xd9, 0xc8, 0x4f, 0x39, 0x87, 0xfd, 0xe4, 0xfc, 0x2a, 0x86, 0x65, 0x19, 0xfe, 0xbf, 0x8d, 0xf1, + 0x2c, 0x0a, 0xf4, 0x76, 0xfb, 0x8a, 0xcb, 0x41, 0xe4, 0x72, 0x3b, 0xef, 0x20, 0xa8, 0xe0, 0x45, + 0x3e, 0x17, 0x7b, 0x57, 0x76, 0xb4, 0xfd, 0xe7, 0xb5, 0x78, 0xc1, 0xe2, 0x0e, 0xea, 0x5c, 0xf8, + 0x14, 0x38, 0x1c, 0x95, 0x3e, 0x24, 0xd8, 0x25, 0x89, 0x82, 0x43, 0xcc, 0x82, 0x85, 0x83, 0xc0, + 0x85, 0xa9, 0x4b, 0xc1, 0x78, 0xba, 0x58, 0x65, 0xe8, 0xf0, 0x53, 0x27, 0x01, 0xd3, 0xf5, 0x26, + 0x41, 0x22, 0xec, 0x1a, 0x86, 0x66, 0xe8, 0xbb, 0x64, 0x4b, 0x1a, 0x6e, 0xbb, 0x08, 0x5d, 0xa6, + 0x25, 0xfd, 0xe2, 0x32, 0x74, 0x69, 0x96, 0x0c, 0x40, 0x37, 0x77, 0x20, 0xd8, 0xde, 0xdb, 0x9f, + 0xb8, 0x12, 0xf7, 0xa7, 0x74, 0xf6, 0x61, 0x9d, 0x82, 0x74, 0x1b, 0x06, 0xbc, 0x5a, 0x87, 0xfb, + 0x84, 0x3d, 0xd2, 0x6e, 0xc5, 0x7e, 0xc6, 0x8b, 0xcd, 0x0e, 0xac, 0x95, 0x55, 0x7e, 0x2a, 0xb3, + 0x79, 0x1e, 0x04, 0x9a, 0x43, 0x69, 0xac, 0x25, 0x29, 0x4d, 0x58, 0x36, 0x59, 0x0f, 0x5b, 0xb5, + 0x1f, 0x78, 0x92, 0x76, 0xc6, 0x11, 0xfb, 0x46, 0x84, 0x43, 0x27, 0xa4, 0x1c, 0x56, 0xd2, 0x0f, + 0x24, 0xcc, 0x9b, 0xdd, 0xd4, 0xae, 0xc6, 0xbf, 0x6b, 0x51, 0x52, 0x07, 0x94, 0xd8, 0xe0, 0x01, + 0xdb, 0xc1, 0xbf, 0xea, 0xe0, 0x1c, 0x54, 0x94, 0x69, 0x91, 0xef, 0xbd, 0x62, 0x09, 0xca, 0xdb, + 0x0f, 0xf9, 0x2f, 0x97, 0x23, 0x1f, 0x7a, 0x5a, 0x0a, 0x3d, 0x0d, 0x7a, 0x99, 0xea, 0x6b, 0xf5, + 0x5c, 0x5b, 0x2e, 0xef, 0xb6, 0x93, 0x83, 0x7a, 0x4b, 0x08, 0x47, 0xbf, 0x19, 0x0e, 0x87, 0x9d, + 0xdd, 0xee, 0xc1, 0x77, 0x61, 0x07, 0x89, 0xbd, 0xd1, 0xe7, 0xb8, 0xd8, 0xf1, 0x42, 0xfc, 0x7b, + 0x29, 0xff, 0x8e, 0x60, 0x09, 0xc7, 0xe9, 0x68, 0x85, 0x84, 0xc3, 0x36, 0xf9, 0x7e, 0xfd, 0x4b, + 0xe4, 0x8b, 0xa2, 0x68, 0x33, 0xf9, 0xac, 0x2f, 0xff, 0x43, 0x57, 0xac, 0xdd, 0x5a, 0x9f, 0x45, + 0x0a, 0xbb, 0x13, 0x33, 0x4a, 0xa0, 0x9b, 0xf0, 0x35, 0xfc, 0x60, 0xde, 0x05, 0xe5, 0x8f, 0x0d, + 0x5f, 0x9f, 0xc5, 0x17, 0x64, 0x91, 0x78, 0xf2, 0x04, 0xd9, 0x34, 0x08, 0x5f, 0xd0, 0x9e, 0x3a, + 0xe5, 0xbd, 0x7d, 0xd1, 0x9a, 0x42, 0x1f, 0xae, 0x98, 0x14, 0x3a, 0x13, 0x9b, 0xf7, 0xc7, 0xee, + 0xb2, 0xfd, 0xc6, 0xa1, 0xa1, 0x19, 0x2b, 0xcf, 0x03, 0xc4, 0x60, 0xe5, 0x0d, 0xb2, 0x1e, 0xf2, + 0xde, 0x37, 0x88, 0x6c, 0x6c, 0x83, 0x37, 0xc2, 0x50, 0x90, 0x1b, 0x66, 0x32, 0x37, 0x9b, 0x88, + 0x93, 0xc9, 0x70, 0x18, 0x45, 0x9e, 0x01, 0xbd, 0x5c, 0x31, 0xcc, 0x12, 0x86, 0xad, 0xac, 0x82, + 0x41, 0x44, 0x07, 0x93, 0x72, 0x52, 0xe9, 0xd5, 0x74, 0x55, 0x35, 0xed, 0xc8, 0xe5, 0x13, 0x31, + 0xe4, 0x74, 0xa7, 0xc0, 0x43, 0x11, 0x79, 0xa2, 0x00, 0x8a, 0x98, 0x33, 0x7e, 0x40, 0xbf, 0xad, + 0x82, 0xb8, 0x16, 0xf4, 0xea, 0x6a, 0x08, 0xcb, 0x5b, 0x0a, 0xf5, 0x51, 0xde, 0x42, 0x43, 0xc2, + 0xff, 0xd1, 0xd2, 0x29, 0xfb, 0x6b, 0xb8, 0xe0, 0x6a, 0xad, 0x01, 0x6d, 0xb1, 0x5a, 0x90, 0x2b, + 0xa7, 0x2b, 0xfd, 0xdd, 0x98, 0x3d, 0x9c, 0x7c, 0x4e, 0xd7, 0xe6, 0x53, 0x7a, 0xad, 0x53, 0x40, + 0x2d, 0x9f, 0x5f, 0xd7, 0xe6, 0x73, 0xeb, 0xb5, 0xce, 0x19, 0xb5, 0x7c, 0xfe, 0xd1, 0xcc, 0xc7, + 0x9f, 0x73, 0x8f, 0x8f, 0xdb, 0x46, 0xc6, 0xa2, 0x96, 0x1e, 0x07, 0xb3, 0xd3, 0x4b, 0x6b, 0xeb, + 0x42, 0x58, 0x25, 0x6d, 0xab, 0x82, 0x3c, 0xb8, 0xaa, 0xaf, 0x09, 0x7d, 0xd3, 0x59, 0xce, 0x71, + 0xd8, 0x1a, 0xcf, 0x32, 0x82, 0xbc, 0x38, 0x67, 0xb7, 0x9e, 0xac, 0x75, 0xc7, 0x51, 0xef, 0x9b, + 0x45, 0x22, 0xc2, 0x7a, 0xd8, 0x25, 0x92, 0x1d, 0xd4, 0xc2, 0x46, 0x49, 0xa9, 0xd0, 0xe5, 0xe5, + 0xab, 0x5a, 0x11, 0x7f, 0x73, 0x3d, 0x72, 0xf5, 0x66, 0x20, 0x6c, 0xdf, 0xf9, 0x54, 0x8d, 0x31, + 0x22, 0x54, 0x99, 0xf9, 0x2b, 0x32, 0x82, 0xdb, 0xf9, 0x44, 0xcd, 0x36, 0x26, 0x47, 0xc6, 0x7c, + 0xf9, 0x0e, 0x8b, 0x4e, 0x5b, 0xc3, 0x2c, 0x4c, 0x61, 0xd5, 0xa9, 0x7d, 0x13, 0x96, 0x9b, 0x08, + 0xf7, 0xa4, 0x02, 0xa1, 0xaa, 0xa0, 0x85, 0x7e, 0x4c, 0x61, 0xd6, 0xf4, 0x11, 0x46, 0x7c, 0x6d, + 0x97, 0x21, 0xa2, 0xee, 0xde, 0x16, 0x26, 0x35, 0x54, 0x88, 0x7e, 0xde, 0x6a, 0x7f, 0xd3, 0x5b, + 0xa9, 0x40, 0x9d, 0x3a, 0xd6, 0x77, 0x0a, 0x43, 0x68, 0x85, 0x52, 0xd1, 0xf6, 0x4d, 0xf7, 0x8a, + 0x38, 0x0f, 0x87, 0xd0, 0x08, 0x99, 0x09, 0xba, 0xa4, 0xa0, 0x51, 0x92, 0x9a, 0xa0, 0x11, 0x05, + 0xdd, 0xc1, 0xe2, 0x56, 0xab, 0x30, 0xfa, 0x88, 0x3a, 0xd6, 0x87, 0x8f, 0xc4, 0x9f, 0x3e, 0x9d, + 0x85, 0xf4, 0xdf, 0xd9, 0x62, 0x21, 0x8f, 0xbd, 0x91, 0x32, 0x80, 0x62, 0x27, 0x9f, 0xb8, 0x72, + 0xf2, 0xb3, 0xfa, 0xb1, 0xb6, 0x63, 0x6f, 0x1d, 0xa6, 0xe8, 0x01, 0xde, 0x7e, 0x24, 0x30, 0x1e, + 0x57, 0xb6, 0x5d, 0xda, 0xd1, 0x07, 0x8a, 0xeb, 0xea, 0xc3, 0x65, 0xfa, 0xa7, 0x4e, 0x44, 0x18, + 0x15, 0xf4, 0x5c, 0x53, 0xde, 0x8b, 0xc5, 0x53, 0xd4, 0x0f, 0x3f, 0x24, 0xbd, 0xf3, 0xa5, 0xa4, + 0xec, 0x62, 0x0f, 0x2f, 0x26, 0xf8, 0x36, 0x2c, 0xa7, 0x17, 0xc1, 0xce, 0x32, 0xf1, 0x71, 0x2e, + 0x95, 0x1c, 0x3c, 0xaf, 0x7f, 0xfe, 0xe9, 0x04, 0xc5, 0x2d, 0x02, 0x36, 0x89, 0xbc, 0xc5, 0xf9, + 0x86, 0xa7, 0x7b, 0x11, 0xd2, 0x95, 0x98, 0xa7, 0xf7, 0xd7, 0xd8, 0x87, 0xda, 0xe9, 0xb5, 0x87, + 0x63, 0xa6, 0xd6, 0xc6, 0x88, 0x12, 0x8c, 0x74, 0xd0, 0x60, 0x45, 0xc5, 0x9b, 0x30, 0x41, 0xdc, + 0xc6, 0xdf, 0x4a, 0x6f, 0x16, 0xbc, 0x23, 0xbe, 0x1a, 0xdb, 0xdb, 0x61, 0x64, 0x82, 0xf9, 0x6f, + 0x9c, 0x40, 0xa5, 0x9c, 0xf8, 0xcc, 0x64, 0x42, 0x48, 0x21, 0x74, 0x39, 0xad, 0xae, 0x6e, 0x46, + 0x68, 0xea, 0x7f, 0xfa, 0x72, 0x5a, 0x8c, 0xf3, 0x3c, 0xff, 0x3c, 0x15, 0x4f, 0x91, 0x75, 0x0a, + 0xaa, 0xe5, 0xf3, 0x14, 0x2d, 0x0e, 0x16, 0xda, 0x36, 0x69, 0xba, 0x0a, 0x9a, 0xcd, 0xf7, 0xaf, + 0xc6, 0x3b, 0x49, 0xf7, 0x45, 0x70, 0xb4, 0x8f, 0xa0, 0xad, 0x3e, 0x7e, 0x36, 0x08, 0xaf, 0xc6, + 0x47, 0x3d, 0xf5, 0xb8, 0x1f, 0xe1, 0x6a, 0xf8, 0xec, 0x59, 0x92, 0x5c, 0x8d, 0x29, 0x64, 0x27, + 0xd9, 0xc7, 0x90, 0xe8, 0x85, 0x15, 0x02, 0x19, 0xa8, 0x0d, 0x20, 0x02, 0x82, 0x05, 0x8e, 0x6a, + 0x75, 0x7e, 0x55, 0xa2, 0x93, 0xe9, 0xd5, 0x78, 0x11, 0x76, 0x10, 0x7e, 0x2d, 0xec, 0x1c, 0x44, + 0xdf, 0x21, 0xef, 0x6e, 0xf8, 0x43, 0x57, 0xc2, 0x7e, 0xc3, 0xa6, 0xb1, 0x70, 0x20, 0x80, 0x21, + 0xe0, 0x17, 0xb2, 0xce, 0xb2, 0xf1, 0x18, 0xdf, 0x3b, 0x73, 0x24, 0x69, 0x7b, 0xa0, 0x89, 0x79, + 0x81, 0xa4, 0x81, 0xea, 0x88, 0xe5, 0xea, 0x9c, 0xed, 0x7f, 0x88, 0x20, 0xb1, 0x93, 0x69, 0x71, + 0xdd, 0xf9, 0x45, 0x8c, 0xf2, 0x5c, 0x6a, 0xd6, 0x3e, 0x7f, 0x1f, 0x36, 0xf2, 0x0d, 0x2e, 0xa6, + 0x42, 0x4c, 0x12, 0x0d, 0x1c, 0xa8, 0x0c, 0x38, 0x4a, 0xe4, 0x53, 0x17, 0xb6, 0x18, 0xf6, 0x20, + 0xa5, 0x3b, 0x95, 0x17, 0x25, 0xcb, 0xa8, 0xca, 0x70, 0x1a, 0xfc, 0x49, 0x69, 0xf9, 0xcb, 0x46, + 0xd8, 0x53, 0xe2, 0x1b, 0x54, 0x32, 0x84, 0x4b, 0xb2, 0x9b, 0xd4, 0xb3, 0xa3, 0x3a, 0xd5, 0x27, + 0xdd, 0x5e, 0xdf, 0xf6, 0x69, 0x9b, 0xb3, 0x0b, 0x45, 0xc4, 0x67, 0xd9, 0x9a, 0x62, 0x5c, 0xba, + 0x4a, 0x9d, 0x2d, 0x18, 0x20, 0x92, 0xcf, 0xde, 0x18, 0x2c, 0x23, 0x9f, 0x25, 0xd7, 0x77, 0xa1, + 0x15, 0x00, 0xe9, 0xff, 0x45, 0x56, 0x0e, 0x2b, 0xca, 0xc7, 0xe4, 0xfa, 0xca, 0x06, 0xda, 0xef, + 0x3a, 0xae, 0x5f, 0xb6, 0x7f, 0x9c, 0x3c, 0x43, 0x5f, 0xee, 0x8d, 0x47, 0x46, 0x19, 0x89, 0x56, + 0xfb, 0x1a, 0xe6, 0x69, 0x1b, 0x1c, 0x7a, 0x66, 0x85, 0xbb, 0xcc, 0x0e, 0xc4, 0x00, 0x76, 0x5a, + 0xe5, 0x05, 0x6c, 0x76, 0x71, 0xdc, 0x1e, 0x57, 0xe2, 0xda, 0xf7, 0xee, 0x52, 0x62, 0xa1, 0xb8, + 0xf7, 0xa4, 0x5b, 0x19, 0xee, 0xf5, 0xd8, 0x18, 0x62, 0x19, 0x44, 0x2b, 0x26, 0x4a, 0x41, 0x9f, + 0xb4, 0x5b, 0xba, 0x96, 0x81, 0x7f, 0x0c, 0x75, 0x9a, 0xf9, 0x22, 0xbc, 0x99, 0x71, 0xe3, 0x20, + 0x39, 0xa5, 0x6f, 0xef, 0x0b, 0x17, 0x4e, 0xbc, 0xf9, 0x22, 0xbc, 0xd4, 0x47, 0x6f, 0x5c, 0x88, + 0x28, 0x94, 0xe8, 0xb8, 0x96, 0x98, 0x65, 0x43, 0xcc, 0xb0, 0x06, 0xc2, 0x3c, 0x9f, 0xc5, 0x76, + 0xc6, 0xe1, 0xad, 0x0d, 0x20, 0x0b, 0x0f, 0x8b, 0xa6, 0xa6, 0x1d, 0x0a, 0x87, 0x78, 0x4a, 0x84, + 0x3f, 0xfc, 0xe0, 0x1c, 0x7b, 0xd5, 0x05, 0xa3, 0x99, 0xb9, 0x0d, 0x80, 0x19, 0x3e, 0x7c, 0x3f, + 0x98, 0x91, 0xee, 0xb0, 0x23, 0x02, 0x77, 0xc6, 0xfd, 0x0a, 0x38, 0x66, 0x1b, 0x87, 0x79, 0x43, + 0x70, 0xe5, 0x12, 0x8d, 0x76, 0x76, 0xfd, 0xba, 0xa7, 0x2b, 0x50, 0xdb, 0x4e, 0x25, 0x41, 0x2b, + 0x41, 0x1e, 0xe8, 0x69, 0x33, 0xa8, 0x9b, 0xfe, 0x1a, 0x85, 0xdf, 0xe9, 0x42, 0xf1, 0x17, 0xe1, + 0x41, 0x04, 0x73, 0xb5, 0xbf, 0x0e, 0x3d, 0xd8, 0x5a, 0x10, 0x11, 0xd9, 0x9a, 0x00, 0x85, 0x74, + 0xd7, 0x14, 0xcb, 0x75, 0x31, 0x0d, 0x43, 0x81, 0x36, 0x7f, 0xb9, 0xc9, 0xa9, 0x3b, 0xf6, 0x6a, + 0x20, 0x0a, 0x89, 0x67, 0xba, 0x9a, 0x87, 0x73, 0x9a, 0x78, 0x33, 0x72, 0xd1, 0x84, 0x95, 0xad, + 0x02, 0x95, 0xa2, 0xdb, 0x9f, 0x1e, 0x6a, 0x84, 0x9d, 0xa9, 0xe2, 0x47, 0xc8, 0x92, 0xf2, 0xd3, + 0xf4, 0x2c, 0x4c, 0x37, 0xe4, 0xad, 0x04, 0xf5, 0xff, 0x9f, 0xb3, 0x99, 0x28, 0x5e, 0x0d, 0x11, + 0x0e, 0xbd, 0x9f, 0xd5, 0xa4, 0x4f, 0xb5, 0x29, 0x5d, 0x16, 0xc1, 0x8d, 0x8f, 0xb4, 0x8f, 0xca, + 0xfd, 0x18, 0x5a, 0xd9, 0x62, 0x2a, 0x4c, 0xc5, 0x30, 0x63, 0xe0, 0xf3, 0x36, 0x3c, 0x10, 0x39, + 0x7e, 0x05, 0xed, 0x0b, 0xa6, 0xf9, 0x4d, 0xe9, 0x56, 0xa1, 0x52, 0x79, 0x90, 0x2c, 0xc2, 0x76, + 0x38, 0xc6, 0x4c, 0xb0, 0xa9, 0xde, 0xe0, 0xe6, 0x81, 0x16, 0x77, 0xfe, 0xe5, 0xd1, 0x89, 0x33, + 0xaa, 0x2c, 0xde, 0xe4, 0x9e, 0x7c, 0xdf, 0xd1, 0xe4, 0x88, 0xb4, 0x80, 0x99, 0x6a, 0x9c, 0x3d, + 0x44, 0x53, 0x61, 0x42, 0x8d, 0x69, 0x5a, 0x11, 0x01, 0x46, 0x4b, 0x75, 0xf3, 0xc9, 0x35, 0x5d, + 0x01, 0x51, 0x17, 0x38, 0xcf, 0x9a, 0x74, 0x52, 0xea, 0xe0, 0xba, 0xeb, 0xec, 0xf7, 0x29, 0xdb, + 0xb7, 0xf7, 0x8a, 0xab, 0x46, 0xd8, 0xc4, 0x81, 0x95, 0x22, 0xa7, 0x55, 0x8e, 0xf9, 0x4a, 0x63, + 0x8c, 0xce, 0x74, 0x59, 0x75, 0xc6, 0x03, 0x43, 0x94, 0x3a, 0x49, 0xab, 0xf8, 0xd1, 0x75, 0xf0, + 0xb5, 0xa5, 0xac, 0xa0, 0x94, 0x95, 0x76, 0xc7, 0x30, 0xa5, 0x75, 0x46, 0x03, 0xe2, 0xb2, 0x0e, + 0xab, 0x97, 0x85, 0xd9, 0x87, 0x87, 0x48, 0xa6, 0x69, 0x20, 0x9f, 0xb0, 0x0e, 0xdc, 0xeb, 0xea, + 0x02, 0xef, 0xe7, 0x04, 0xaa, 0x97, 0xd2, 0x53, 0x9f, 0x35, 0xe4, 0x0c, 0x8f, 0xfe, 0xb2, 0x84, + 0xb6, 0xd7, 0x14, 0x9e, 0x7c, 0xca, 0xce, 0x90, 0xf6, 0xc5, 0xaf, 0x38, 0x9e, 0xcc, 0x34, 0x38, + 0x2c, 0x03, 0x8d, 0xc9, 0x05, 0x9b, 0xa8, 0xf4, 0xb0, 0xdc, 0xad, 0xfa, 0x29, 0x74, 0x7d, 0x8e, + 0x45, 0x8b, 0x8d, 0xe0, 0x6b, 0x40, 0xbb, 0x5d, 0xe6, 0xc2, 0x6a, 0x08, 0x61, 0x81, 0xe6, 0x07, + 0xf3, 0xcc, 0x41, 0xd1, 0x77, 0xc5, 0xa9, 0x0a, 0x94, 0xc6, 0x82, 0xcc, 0xb7, 0x85, 0xb2, 0x10, + 0x87, 0x5c, 0xd9, 0xea, 0x72, 0x59, 0x11, 0xa5, 0x78, 0xf6, 0x6d, 0x1f, 0x94, 0xd2, 0x54, 0xaa, + 0x76, 0x36, 0xb5, 0x34, 0x1b, 0x76, 0xd8, 0x97, 0x3e, 0xd4, 0x96, 0xb7, 0x7e, 0x2e, 0xf5, 0x3d, + 0xa9, 0x2b, 0xce, 0xa4, 0xf3, 0x76, 0x8d, 0xe0, 0x19, 0x6a, 0xd4, 0x31, 0x36, 0x97, 0xad, 0xc6, + 0x66, 0x8b, 0x32, 0x58, 0x40, 0xc3, 0x57, 0x2e, 0x0b, 0xb3, 0x8a, 0xa5, 0x6f, 0xc9, 0xf0, 0xba, + 0xda, 0x72, 0x47, 0xc0, 0xc4, 0x08, 0xc5, 0x11, 0x35, 0xa7, 0x6a, 0x6c, 0x14, 0xb9, 0x9e, 0xca, + 0xf8, 0x23, 0x99, 0x74, 0x88, 0x2c, 0xac, 0x8f, 0xc4, 0xb3, 0x60, 0xa0, 0xee, 0xe8, 0x65, 0x67, + 0xc9, 0x4c, 0xfe, 0xd0, 0xa7, 0x19, 0xa1, 0xe9, 0x83, 0x3a, 0x16, 0x81, 0x69, 0x43, 0x13, 0xea, + 0x00, 0x89, 0xb7, 0x13, 0x18, 0x70, 0x1f, 0x1d, 0x96, 0x18, 0x5c, 0xac, 0x8c, 0xb0, 0x6e, 0xec, + 0x18, 0x44, 0x7b, 0x50, 0xcf, 0x0b, 0x01, 0xbf, 0x9d, 0x8c, 0x10, 0xa9, 0x48, 0xdd, 0xff, 0x91, + 0x5e, 0xee, 0xd6, 0x9e, 0x8c, 0xaf, 0x0f, 0x65, 0x44, 0x65, 0x67, 0x5d, 0x18, 0xca, 0x14, 0x05, + 0xd0, 0xd2, 0x14, 0xc6, 0x0b, 0x78, 0x36, 0xfd, 0x15, 0xf6, 0xf5, 0x10, 0xa0, 0x0e, 0x55, 0x32, + 0xfb, 0x9c, 0x37, 0x49, 0xd1, 0xc6, 0x9f, 0x36, 0x8f, 0x3b, 0x25, 0xb6, 0x37, 0x27, 0xa8, 0x1d, + 0x8e, 0x33, 0xa1, 0x03, 0xdd, 0x54, 0xc9, 0x96, 0x1e, 0xa9, 0x34, 0xee, 0x56, 0x31, 0x46, 0x89, + 0xc5, 0xcf, 0xbe, 0xa4, 0x04, 0x9e, 0xb7, 0xd9, 0x29, 0xcd, 0xa2, 0xfa, 0x13, 0xd7, 0xa3, 0x2c, + 0x63, 0x7c, 0x46, 0x33, 0xa2, 0x31, 0xc6, 0x37, 0x7c, 0x7f, 0x46, 0xe9, 0x4d, 0xe1, 0xb7, 0xb2, + 0xd8, 0x35, 0xdf, 0xd8, 0xee, 0x38, 0xfc, 0x76, 0xc1, 0x78, 0x15, 0xff, 0xfb, 0xaa, 0xc9, 0x88, + 0xa4, 0xfa, 0x2d, 0xf2, 0x12, 0x87, 0xef, 0x93, 0x67, 0x34, 0x0a, 0xa7, 0x24, 0x09, 0x6c, 0x90, + 0xef, 0x23, 0x49, 0x16, 0x42, 0x85, 0x3b, 0xa5, 0xf3, 0x46, 0x59, 0xeb, 0x7d, 0x4b, 0x7a, 0x26, + 0xdb, 0x98, 0x6b, 0x95, 0x41, 0x82, 0x66, 0x7c, 0xc8, 0x6f, 0xa0, 0x95, 0xca, 0x41, 0x3d, 0x00, + 0x59, 0x62, 0x84, 0x65, 0x64, 0x1d, 0x96, 0xc7, 0x45, 0x4e, 0xb0, 0x74, 0x98, 0x8b, 0x9a, 0x12, + 0x99, 0xec, 0x52, 0xd8, 0x14, 0x97, 0xb4, 0x49, 0xd1, 0xec, 0x8f, 0xe5, 0x6f, 0xa0, 0x4e, 0xfa, + 0x1e, 0xa4, 0xd5, 0x27, 0xe2, 0xb0, 0xff, 0x57, 0x5c, 0xa2, 0xf6, 0x6e, 0x7c, 0xfc, 0x59, 0xad, + 0x63, 0xb3, 0x31, 0x92, 0x05, 0xa8, 0x19, 0x09, 0x66, 0xaf, 0x61, 0x71, 0x29, 0xac, 0x61, 0x4c, + 0xd3, 0xbe, 0x0c, 0x74, 0x57, 0x5c, 0x1d, 0xa5, 0x6f, 0x8f, 0xf5, 0x2c, 0xa7, 0x3a, 0xf7, 0x82, + 0x87, 0x07, 0xbb, 0x18, 0x55, 0xed, 0xb9, 0x84, 0x67, 0x1f, 0x2a, 0x53, 0x55, 0x15, 0xe4, 0x86, + 0x16, 0xec, 0x7f, 0xe9, 0x8a, 0xbd, 0x7c, 0xf3, 0xe3, 0xab, 0xf7, 0xbe, 0x57, 0x0d, 0x47, 0x63, + 0xde, 0x8c, 0x82, 0x7e, 0xce, 0xad, 0x70, 0x26, 0x7b, 0xd6, 0x87, 0x7c, 0x16, 0xfe, 0xef, 0xab, + 0xb6, 0xab, 0x4c, 0xb2, 0x7b, 0x6d, 0xf9, 0xaa, 0x6d, 0xa2, 0xc0, 0x41, 0xd5, 0xa3, 0xbe, 0xcf, + 0xe5, 0xe7, 0x18, 0x4f, 0x9e, 0xd4, 0xea, 0xa1, 0x29, 0x56, 0x52, 0xed, 0xde, 0x23, 0x3f, 0x29, + 0x1d, 0x35, 0xd1, 0x16, 0xb5, 0x44, 0x16, 0xb9, 0x1d, 0x3f, 0xfb, 0xbe, 0x7c, 0x7a, 0xf7, 0x1b, + 0xec, 0x6a, 0xf3, 0xb7, 0xd3, 0x7b, 0x71, 0x81, 0x80, 0x98, 0xd1, 0x16, 0xce, 0xb1, 0x3e, 0x8b, + 0x7b, 0x14, 0x11, 0xca, 0x56, 0xa0, 0x03, 0x0e, 0x89, 0x0e, 0x19, 0x03, 0xd2, 0xa3, 0xbd, 0x6e, + 0x0f, 0xb6, 0x2d, 0x9b, 0x14, 0x15, 0x54, 0x18, 0xae, 0x19, 0xc8, 0x07, 0x4a, 0xcd, 0xbb, 0x2e, + 0x72, 0x85, 0xca, 0x61, 0xbb, 0x56, 0x7d, 0xf1, 0xbd, 0xdd, 0xdd, 0xa9, 0x17, 0x72, 0xba, 0x5d, + 0xc4, 0x0e, 0x4f, 0x93, 0xee, 0x6e, 0xaa, 0xec, 0x6c, 0x43, 0xdc, 0x78, 0x7d, 0x2e, 0xa5, 0x08, + 0xb0, 0x8b, 0x58, 0x96, 0xc7, 0xc4, 0x0b, 0xd3, 0x60, 0xd3, 0x7a, 0xed, 0x42, 0x46, 0x72, 0x44, + 0xd8, 0x8e, 0x5c, 0x84, 0x9b, 0x3f, 0xbf, 0xfb, 0x2d, 0x91, 0x3a, 0x39, 0x4d, 0x1f, 0x04, 0xaa, + 0xdd, 0xb7, 0x34, 0x6c, 0xba, 0xaa, 0x28, 0x2b, 0x98, 0x11, 0x93, 0xfb, 0xe5, 0xab, 0x3c, 0x45, + 0x21, 0xf0, 0x2b, 0x92, 0x72, 0x2c, 0x54, 0x61, 0x23, 0x65, 0x63, 0xa6, 0xf9, 0xc5, 0x49, 0x27, + 0x63, 0x4a, 0xd6, 0x03, 0x28, 0xfd, 0x33, 0x93, 0x0c, 0x49, 0x9b, 0x55, 0x56, 0x92, 0x1f, 0x84, + 0x5a, 0x1a, 0x66, 0x08, 0x54, 0xba, 0xee, 0x92, 0xbb, 0xdf, 0x1a, 0x04, 0x22, 0x1c, 0x81, 0x81, + 0x78, 0x09, 0x36, 0x8e, 0x02, 0x5e, 0x26, 0xb2, 0x93, 0xbc, 0x0c, 0xdb, 0x35, 0xbe, 0xd9, 0xf8, + 0xda, 0x0b, 0x65, 0x14, 0xf4, 0x60, 0xa0, 0x5f, 0x90, 0x3f, 0x2e, 0x95, 0xbd, 0x67, 0x4f, 0x9e, + 0xa8, 0xd4, 0x64, 0x28, 0x54, 0xe6, 0x48, 0xbc, 0xa1, 0x0a, 0xd5, 0xc5, 0xef, 0x9e, 0x3c, 0x81, + 0xd8, 0x10, 0x79, 0x1f, 0x7f, 0x1c, 0x76, 0x7b, 0x07, 0xd1, 0xa0, 0xb7, 0x1f, 0xc5, 0xbd, 0xe7, + 0xb0, 0xc2, 0x6c, 0xa1, 0x24, 0x18, 0x4a, 0x79, 0x91, 0xec, 0xf4, 0xfb, 0xe1, 0xc1, 0x7c, 0x81, + 0x42, 0xf9, 0x01, 0xc7, 0x17, 0xda, 0x9a, 0xa0, 0xe5, 0xf9, 0x86, 0x6b, 0xbd, 0x27, 0xa8, 0x75, + 0x8d, 0xaf, 0x39, 0x9e, 0x80, 0xec, 0x36, 0x90, 0x3e, 0xcb, 0x63, 0xe3, 0xe8, 0xdb, 0x95, 0xcf, + 0x3d, 0x87, 0xf9, 0xe5, 0x12, 0x25, 0xba, 0xb9, 0x09, 0x02, 0x15, 0x01, 0xf1, 0x06, 0x5e, 0x84, + 0xba, 0xe3, 0x4d, 0x95, 0x7b, 0x8f, 0x68, 0x44, 0xdd, 0x2f, 0xf9, 0x22, 0xb7, 0x92, 0x03, 0xad, + 0x4f, 0x90, 0xdb, 0x33, 0xfc, 0x63, 0x23, 0x1d, 0x08, 0x98, 0x98, 0x5e, 0x0b, 0x81, 0xee, 0xd9, + 0x7b, 0x7b, 0x7b, 0xec, 0xd4, 0xb1, 0xa5, 0xe8, 0x8c, 0xb4, 0xc9, 0x46, 0xd3, 0xa1, 0xc3, 0xaa, + 0x74, 0x35, 0x9d, 0x80, 0x56, 0xc8, 0x97, 0x4c, 0x40, 0xe7, 0x24, 0xc7, 0x3c, 0xfe, 0x55, 0x06, + 0x81, 0x0d, 0x65, 0x34, 0x85, 0x9e, 0x1c, 0xc8, 0x37, 0x08, 0x1f, 0x30, 0xa0, 0x99, 0xf6, 0xe1, + 0xc1, 0x55, 0x54, 0x45, 0x38, 0x87, 0x50, 0x72, 0x98, 0x08, 0x2d, 0x69, 0x20, 0x2c, 0xa4, 0x54, + 0x41, 0xdc, 0x1a, 0x9f, 0x50, 0x0c, 0xb4, 0x05, 0xac, 0x51, 0x8c, 0x05, 0x8f, 0xa1, 0xa5, 0xa3, + 0x34, 0xf3, 0x42, 0xe8, 0xe3, 0x72, 0x78, 0xc1, 0xca, 0x4b, 0x3a, 0x02, 0x0e, 0x56, 0x91, 0xe1, + 0x31, 0x16, 0x77, 0x2a, 0x8f, 0x18, 0x2c, 0xa8, 0xed, 0x21, 0x9f, 0x66, 0xac, 0xeb, 0x1c, 0x9d, + 0xfd, 0xf2, 0x3b, 0xc8, 0x0c, 0x07, 0x74, 0x88, 0x1b, 0x87, 0xd6, 0x88, 0x15, 0xae, 0x52, 0x4c, + 0x18, 0xb0, 0x26, 0x26, 0x65, 0x09, 0x9a, 0xb9, 0x17, 0xe2, 0x1c, 0xbb, 0x26, 0xde, 0xcd, 0x6c, + 0x5d, 0x34, 0xfa, 0x30, 0x6c, 0xc2, 0x4c, 0xbc, 0xff, 0x3a, 0x7c, 0x0a, 0xf3, 0xe0, 0x74, 0x56, + 0x1d, 0x75, 0x0e, 0x9f, 0x22, 0x09, 0x14, 0xfe, 0xbd, 0xaa, 0xae, 0xd3, 0xa3, 0xce, 0xff, 0x01, + 0x95, 0x74, 0x9f, 0xea, 0xf4, 0x8d, 0x01, 0x00 }; From 1900686bc43b2275ca9432e7c73548934ea47c55 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Fri, 22 Dec 2023 15:49:51 +0100 Subject: [PATCH 011/114] Bump --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- wled00/improv.cpp | 2 +- wled00/wled.h | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d050caef8..7e6fc3c77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ ## WLED changelog +#### Build 2312220 +- Version bump: 0.14.1-b2 +- Fix for Pixel Magic button + +#### Build 2311280 +- Bugfixes (#3593, #3490, #3573, #3517, #3561, #3555, #3541, #3536, #3515, #3522, #3533, #3508) + #### Build 2311160 - Version bump: 0.14.1-b1 - Bugfixes (#3526, #3502, #3496, #3484, #3487, #3445, #3466, #3296, #3382, #3312) diff --git a/package-lock.json b/package-lock.json index a421b467f..71f73fefe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wled", - "version": "0.14.1-b1", + "version": "0.14.1-b2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 169812124..c4faddc7e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wled", - "version": "0.14.1-b1", + "version": "0.14.1-b2", "description": "Tools for WLED project", "main": "tools/cdata.js", "directories": { diff --git a/wled00/improv.cpp b/wled00/improv.cpp index bc260e073..0f4081f2d 100644 --- a/wled00/improv.cpp +++ b/wled00/improv.cpp @@ -210,7 +210,7 @@ void sendImprovInfoResponse() { //Use serverDescription if it has been changed from the default "WLED", else mDNS name bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0); char vString[20]; - sprintf_P(vString, PSTR("0.14.1-b1/%i"), VERSION); + sprintf_P(vString, PSTR("0.14.1-b2/%i"), VERSION); const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription}; sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str); diff --git a/wled00/wled.h b/wled00/wled.h index 0f8052e89..0cd91585f 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2311280 +#define VERSION 2312220 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG From 5ab012163e5878e5bd67719762fe7e72d8030435 Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 22 Dec 2023 23:28:58 +0100 Subject: [PATCH 012/114] workaround for #3601 if case of invalid or impossible sunset/sunrise results, retry with the previous day. max 3 days back, to prevent infinite loops and far-away results. --- wled00/ntp.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/wled00/ntp.cpp b/wled00/ntp.cpp index 3d15c8c25..4e90766cc 100644 --- a/wled00/ntp.cpp +++ b/wled00/ntp.cpp @@ -448,7 +448,7 @@ void checkTimers() #define ZENITH -0.83 // get sunrise (or sunset) time (in minutes) for a given day at a given geo location -int getSunriseUTC(int year, int month, int day, float lat, float lon, bool sunset=false) { +static int getSunriseUTC(int year, int month, int day, float lat, float lon, bool sunset=false) { //1. first calculate the day of the year float N1 = 275 * month / 9; float N2 = (month + 9) / 12; @@ -509,7 +509,18 @@ void calculateSunriseAndSunset() { tim_0.tm_sec = 0; tim_0.tm_isdst = 0; - int minUTC = getSunriseUTC(year(localTime), month(localTime), day(localTime), latitude, longitude); + // Due to math instability, its possible to get a bad sunrise/sunset = 00:00 (see issue #3601) + // So in case we get 00:00, try to use the sunset/sunrise of previous day. Max 3 days back, this worked well in all cases I tried. + // When latitude = 66,6 (N or S), the functions sometimes returns 2147483647, so "unexpected large" is another condition for retry + int minUTC = 0; + int retryCount = 0; + do { + time_t theDay = localTime - retryCount * 86400; // one day back = 86400 seconds + minUTC = getSunriseUTC(year(theDay), month(theDay), day(theDay), latitude, longitude, false); + DEBUG_PRINT(F("* sunrise (minutes from UTC) = ")); DEBUG_PRINTLN(minUTC); + retryCount ++; + } while ((minUTC == 0 || abs(minUTC) > 2*24*60) && (retryCount <= 3)); + if (minUTC) { // there is a sunrise if (minUTC < 0) minUTC += 24*60; // add a day if negative @@ -521,7 +532,14 @@ void calculateSunriseAndSunset() { sunrise = 0; } - minUTC = getSunriseUTC(year(localTime), month(localTime), day(localTime), latitude, longitude, true); + retryCount = 0; + do { + time_t theDay = localTime - retryCount * 86400; // one day back = 86400 seconds + minUTC = getSunriseUTC(year(theDay), month(theDay), day(theDay), latitude, longitude, true); + DEBUG_PRINT(F("* sunset (minutes from UTC) = ")); DEBUG_PRINTLN(minUTC); + retryCount ++; + } while ((minUTC == 0 || abs(minUTC) > 2*24*60) && (retryCount <= 3)); + if (minUTC) { // there is a sunset if (minUTC < 0) minUTC += 24*60; // add a day if negative From 72e864b013170825c3a1aadd7d5b90dc01ebb477 Mon Sep 17 00:00:00 2001 From: Frank Date: Sat, 23 Dec 2023 13:13:10 +0100 Subject: [PATCH 013/114] sunrise/sunset: fix for ambiguous error value sunset = 0 is a valid result, as the function result is in UTC and not local time . Example: local time is UTC-8, local sunrise = 08:00am => getSunriseUTC() = 0. So we cannot use "0" for "invalid". Using UINT16_MAX resolves the problem, and even allows to simplify calculateSunriseAndSunset() a bit. --- wled00/ntp.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/wled00/ntp.cpp b/wled00/ntp.cpp index 4e90766cc..2e95eae23 100644 --- a/wled00/ntp.cpp +++ b/wled00/ntp.cpp @@ -447,7 +447,7 @@ void checkTimers() } #define ZENITH -0.83 -// get sunrise (or sunset) time (in minutes) for a given day at a given geo location +// get sunrise (or sunset) time (in minutes) for a given day at a given geo location. Returns >= INT16_MAX in case of "no sunset" static int getSunriseUTC(int year, int month, int day, float lat, float lon, bool sunset=false) { //1. first calculate the day of the year float N1 = 275 * month / 9; @@ -482,8 +482,8 @@ static int getSunriseUTC(int year, int month, int day, float lat, float lon, boo //7a. calculate the Sun's local hour angle float cosH = (sinf(DEG_TO_RAD*ZENITH) - (sinDec * sinf(DEG_TO_RAD*lat))) / (cosDec * cosf(DEG_TO_RAD*lat)); - if ((cosH > 1.0f) && !sunset) return 0; // the sun never rises on this location (on the specified date) - if ((cosH < -1.0f) && sunset) return 0; // the sun never sets on this location (on the specified date) + if ((cosH > 1.0f) && !sunset) return INT16_MAX; // the sun never rises on this location (on the specified date) + if ((cosH < -1.0f) && sunset) return INT16_MAX; // the sun never sets on this location (on the specified date) //7b. finish calculating H and convert into hours float H = sunset ? RAD_TO_DEG*acosf(cosH) : 360 - RAD_TO_DEG*acosf(cosH); @@ -499,6 +499,7 @@ static int getSunriseUTC(int year, int month, int day, float lat, float lon, boo return UT*60; } +#define SUNSET_MAX (24*60) // 1day = max expected absolute value for sun offset in minutes // calculate sunrise and sunset (if longitude and latitude are set) void calculateSunriseAndSunset() { if ((int)(longitude*10.) || (int)(latitude*10.)) { @@ -509,9 +510,9 @@ void calculateSunriseAndSunset() { tim_0.tm_sec = 0; tim_0.tm_isdst = 0; - // Due to math instability, its possible to get a bad sunrise/sunset = 00:00 (see issue #3601) - // So in case we get 00:00, try to use the sunset/sunrise of previous day. Max 3 days back, this worked well in all cases I tried. - // When latitude = 66,6 (N or S), the functions sometimes returns 2147483647, so "unexpected large" is another condition for retry + // Due to limited accuracy, its possible to get a bad sunrise/sunset displayed as "00:00" (see issue #3601) + // So in case of invalid result, we try to use the sunset/sunrise of previous day. Max 3 days back, this worked well in all cases I tried. + // When latitude = 66,6 (N or S), the functions sometimes returns 2147483647, so this "unexpected large" is another condition for retry int minUTC = 0; int retryCount = 0; do { @@ -519,9 +520,9 @@ void calculateSunriseAndSunset() { minUTC = getSunriseUTC(year(theDay), month(theDay), day(theDay), latitude, longitude, false); DEBUG_PRINT(F("* sunrise (minutes from UTC) = ")); DEBUG_PRINTLN(minUTC); retryCount ++; - } while ((minUTC == 0 || abs(minUTC) > 2*24*60) && (retryCount <= 3)); + } while ((abs(minUTC) > SUNSET_MAX) && (retryCount <= 3)); - if (minUTC) { + if (abs(minUTC) <= SUNSET_MAX) { // there is a sunrise if (minUTC < 0) minUTC += 24*60; // add a day if negative tim_0.tm_hour = minUTC / 60; @@ -538,9 +539,9 @@ void calculateSunriseAndSunset() { minUTC = getSunriseUTC(year(theDay), month(theDay), day(theDay), latitude, longitude, true); DEBUG_PRINT(F("* sunset (minutes from UTC) = ")); DEBUG_PRINTLN(minUTC); retryCount ++; - } while ((minUTC == 0 || abs(minUTC) > 2*24*60) && (retryCount <= 3)); + } while ((abs(minUTC) > SUNSET_MAX) && (retryCount <= 3)); - if (minUTC) { + if (abs(minUTC) <= SUNSET_MAX) { // there is a sunset if (minUTC < 0) minUTC += 24*60; // add a day if negative tim_0.tm_hour = minUTC / 60; From 5f62b4a89dac944417b268a8b9fd6a90b1efb7b9 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sat, 23 Dec 2023 20:58:55 +0100 Subject: [PATCH 014/114] Fix for #2922 --- wled00/cfg.cpp | 4 +- wled00/data/settings_wifi.htm | 1 + wled00/html_settings.h | 324 +++++++++++++++++----------------- wled00/set.cpp | 1 + wled00/wled.cpp | 2 +- wled00/wled.h | 1 + wled00/xml.cpp | 1 + 7 files changed, 170 insertions(+), 164 deletions(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index becc601bb..ad02ef198 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -74,7 +74,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { noWifiSleep = doc[F("wifi")][F("sleep")] | !noWifiSleep; // inverted noWifiSleep = !noWifiSleep; - //int wifi_phy = doc[F("wifi")][F("phy")]; //force phy mode n? + force802_3g = doc[F("wifi")][F("phy")] | force802_3g; //force phy mode g? JsonObject hw = doc[F("hw")]; @@ -682,7 +682,7 @@ void serializeConfig() { JsonObject wifi = doc.createNestedObject("wifi"); wifi[F("sleep")] = !noWifiSleep; - //wifi[F("phy")] = 1; + wifi[F("phy")] = (int)force802_3g; #ifdef WLED_USE_ETHERNET JsonObject ethernet = doc.createNestedObject("eth"); diff --git a/wled00/data/settings_wifi.htm b/wled00/data/settings_wifi.htm index b8ab6aff7..bfc530352 100644 --- a/wled00/data/settings_wifi.htm +++ b/wled00/data/settings_wifi.htm @@ -189,6 +189,7 @@
AP IP: Not active

Experimental

+ Force 802.11g mode (ESP8266 only):
Disable WiFi sleep:
Can help with connectivity issues.
Do not enable if WiFi is working correctly, increases power consumption.
diff --git a/wled00/html_settings.h b/wled00/html_settings.h index e9a8d9340..50678ca3e 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -8,7 +8,7 @@ // Autogenerated from wled00/data/style.css, do not edit!! const uint16_t PAGE_settingsCss_length = 888; const uint8_t PAGE_settingsCss[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x56, 0x51, 0x8b, 0xab, 0x38, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0x51, 0x8b, 0xab, 0x38, 0x14, 0xfe, 0x2b, 0x2e, 0x65, 0x60, 0x2e, 0x54, 0x51, 0xab, 0x9d, 0xde, 0xc8, 0xc2, 0xb2, 0xef, 0xf7, 0x6d, 0x58, 0x16, 0x96, 0x79, 0x88, 0xe6, 0x58, 0x43, 0x63, 0x22, 0x49, 0xbc, 0xb5, 0x23, 0xfe, 0xf7, 0x4d, 0xa2, 0x8e, 0xb6, 0x23, 0x73, 0x5f, 0x2e, 0xa5, 0x25, 0xe6, 0xc4, 0xe4, 0x3b, @@ -70,7 +70,7 @@ const uint8_t PAGE_settingsCss[] PROGMEM = { // Autogenerated from wled00/data/settings.htm, do not edit!! const uint16_t PAGE_settings_length = 1115; const uint8_t PAGE_settings[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x56, 0xdb, 0x52, 0xe3, 0x46, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0xdb, 0x52, 0xe3, 0x46, 0x10, 0x7d, 0xf7, 0x57, 0x0c, 0xb3, 0x15, 0x56, 0x2a, 0x64, 0xf9, 0x42, 0x2a, 0x95, 0xc8, 0x96, 0xa9, 0x2c, 0x97, 0x0d, 0x29, 0xa8, 0xa5, 0x02, 0x2c, 0x49, 0x25, 0x79, 0x18, 0x6b, 0x5a, 0xd6, 0x2c, 0xd2, 0x8c, 0x6a, 0xa6, 0x65, 0x70, 0xbc, 0xfc, 0x7b, 0x7a, 0x64, 0x63, 0x60, 0xe1, 0x21, @@ -144,164 +144,166 @@ const uint8_t PAGE_settings[] PROGMEM = { // Autogenerated from wled00/data/settings_wifi.htm, do not edit!! -const uint16_t PAGE_settings_wifi_length = 2378; +const uint16_t PAGE_settings_wifi_length = 2410; const uint8_t PAGE_settings_wifi[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xb5, 0x58, 0xff, 0x53, 0xdb, 0x3a, - 0x12, 0xff, 0x3d, 0x7f, 0x85, 0xd0, 0xdd, 0x30, 0xf6, 0xe0, 0x38, 0x09, 0x69, 0xfb, 0x7a, 0x21, - 0x4e, 0x0f, 0x42, 0x5e, 0xe1, 0x1e, 0x85, 0x5c, 0xc3, 0x95, 0xb9, 0xe1, 0x3a, 0xef, 0x19, 0x5b, - 0x49, 0x54, 0x1c, 0xc9, 0xcf, 0x92, 0x13, 0x18, 0xc8, 0xff, 0x7e, 0xbb, 0x92, 0x9d, 0xc4, 0x01, - 0xda, 0x9b, 0x0e, 0x37, 0x9d, 0x29, 0xb6, 0xbc, 0xda, 0xfd, 0xec, 0xb7, 0x8f, 0x56, 0xe9, 0xee, - 0x1c, 0x5f, 0xf4, 0x2f, 0xff, 0x3d, 0x1c, 0x90, 0xa9, 0x9e, 0x25, 0xbd, 0x2e, 0xfe, 0x4f, 0x92, - 0x50, 0x4c, 0x02, 0xca, 0x04, 0x85, 0x77, 0x16, 0xc6, 0xbd, 0xee, 0x8c, 0xe9, 0x90, 0x44, 0xd3, - 0x30, 0x53, 0x4c, 0x07, 0x34, 0xd7, 0xe3, 0xfa, 0x7b, 0x5a, 0xac, 0xd6, 0x22, 0x29, 0x34, 0x13, - 0xb0, 0xbc, 0xe0, 0xb1, 0x9e, 0x06, 0x31, 0x9b, 0xf3, 0x88, 0xd5, 0xcd, 0x8b, 0xc7, 0x05, 0xd7, - 0x3c, 0x4c, 0xea, 0x2a, 0x0a, 0x13, 0x16, 0xb4, 0xbc, 0x59, 0x78, 0xc7, 0x67, 0xf9, 0x6c, 0xf5, - 0x9e, 0x2b, 0x96, 0x99, 0x97, 0xf0, 0x06, 0xde, 0x85, 0xa4, 0xa4, 0x26, 0xc2, 0x19, 0x0b, 0xe8, - 0x9c, 0xb3, 0x45, 0x2a, 0x33, 0x0d, 0x56, 0x34, 0xd7, 0x09, 0xeb, 0x5d, 0xf1, 0x5f, 0x39, 0x19, - 0x31, 0xad, 0xb9, 0x98, 0xa8, 0x6e, 0xc3, 0x2e, 0x76, 0x55, 0x94, 0xf1, 0x54, 0xf7, 0x6a, 0xf3, - 0x30, 0x23, 0x89, 0x8c, 0x78, 0xea, 0xc5, 0x41, 0x2c, 0xa3, 0x7c, 0x06, 0x80, 0x3c, 0x58, 0x08, - 0x76, 0x5a, 0xf8, 0x27, 0xcd, 0xa4, 0x96, 0x01, 0x9d, 0x6a, 0x9d, 0x76, 0xa8, 0x07, 0xf6, 0xc4, - 0x99, 0x94, 0xa9, 0x0a, 0x9a, 0x5e, 0x9a, 0xb1, 0x11, 0xbc, 0x8e, 0x46, 0xa7, 0xc7, 0x01, 0xa5, - 0x07, 0xe3, 0x5c, 0x44, 0x9a, 0x4b, 0x41, 0x26, 0xa7, 0xb1, 0xa3, 0xdd, 0x87, 0x8c, 0xe9, 0x3c, - 0x13, 0x24, 0xf6, 0x27, 0x4c, 0x0f, 0x12, 0x86, 0x6a, 0x8f, 0xee, 0xcd, 0xa7, 0xe5, 0x4a, 0x34, - 0x1a, 0x54, 0x24, 0xa3, 0x8c, 0x85, 0x9a, 0x15, 0xc2, 0x15, 0xc1, 0x13, 0xc7, 0x7d, 0x58, 0x70, - 0x11, 0xcb, 0x85, 0x2f, 0x53, 0x26, 0x1c, 0x83, 0x47, 0x75, 0x1a, 0x8d, 0x5b, 0x21, 0xfd, 0x45, - 0xc2, 0xd0, 0x4a, 0x63, 0x0c, 0xbb, 0xf3, 0x8c, 0xa9, 0x86, 0x2a, 0x7c, 0x6d, 0xfc, 0x65, 0xc1, - 0xc7, 0xbc, 0x5e, 0xbe, 0xd2, 0x0d, 0x85, 0x47, 0x5b, 0x0a, 0x01, 0xe4, 0xbf, 0x3e, 0x9f, 0x39, - 0xb4, 0xb1, 0x16, 0xf6, 0xe8, 0xef, 0x8a, 0x25, 0xe3, 0xcd, 0x5d, 0xe7, 0xb0, 0x0b, 0x72, 0xa6, - 0x34, 0xd1, 0x01, 0xba, 0x49, 0x31, 0x1e, 0xd4, 0x3d, 0xd0, 0x7e, 0xcc, 0x15, 0xe6, 0x21, 0x0e, - 0x76, 0x9a, 0x9e, 0xf6, 0x35, 0xbb, 0xd3, 0xfd, 0x32, 0xb7, 0x18, 0x24, 0x01, 0x2a, 0x7d, 0xdf, - 0xa7, 0xde, 0x98, 0xe9, 0x68, 0xba, 0xb6, 0xf6, 0x4d, 0x49, 0xd1, 0x10, 0x4c, 0x53, 0xd7, 0xf5, - 0xf5, 0x14, 0x70, 0xe8, 0xa0, 0xa7, 0x7d, 0x5c, 0x75, 0x36, 0x56, 0x2e, 0x6e, 0xbe, 0xb1, 0x48, - 0xfb, 0xa1, 0x52, 0x7c, 0x22, 0x9c, 0x87, 0xa5, 0xf7, 0x00, 0x5b, 0x16, 0x32, 0xbb, 0x55, 0x9d, - 0xeb, 0xaf, 0x4b, 0x4f, 0xbb, 0x7e, 0xf9, 0xee, 0x2b, 0x48, 0xbc, 0xe3, 0x68, 0x8f, 0xb9, 0x41, - 0x8f, 0xf9, 0x19, 0xec, 0xa8, 0x6b, 0xf3, 0xc7, 0xf5, 0x33, 0x16, 0xe7, 0x11, 0x2b, 0x3f, 0x3a, - 0x1a, 0x64, 0x67, 0xcc, 0x1a, 0x84, 0xef, 0x71, 0x10, 0x04, 0xcc, 0x3c, 0xb8, 0x8f, 0x8f, 0xda, - 0x4f, 0x73, 0x35, 0x75, 0x98, 0x0b, 0xba, 0xbd, 0xeb, 0xaf, 0x25, 0x14, 0x16, 0xf4, 0x1e, 0xf8, - 0xd8, 0x69, 0x1a, 0xd1, 0x84, 0x89, 0x89, 0x9e, 0xee, 0xee, 0xae, 0x4a, 0xa2, 0xdb, 0x6a, 0xba, - 0x45, 0x2a, 0x57, 0x6b, 0x7b, 0x7b, 0xde, 0x5c, 0xf2, 0x98, 0x40, 0x54, 0x2f, 0xf9, 0x8c, 0xc9, - 0x5c, 0x3b, 0xe7, 0x5e, 0x8b, 0xb5, 0xdd, 0x83, 0x8d, 0x4a, 0x3a, 0x48, 0x98, 0x26, 0xc2, 0x06, - 0xb4, 0x3f, 0x82, 0x70, 0x82, 0x0d, 0xe1, 0x3e, 0xe0, 0xaa, 0x0e, 0xa0, 0x44, 0x28, 0xa4, 0x01, - 0xfc, 0x37, 0x71, 0x06, 0x45, 0x87, 0x5a, 0x67, 0xfc, 0x26, 0xd7, 0xcc, 0xa1, 0x3c, 0xa6, 0x9e, - 0xd9, 0xe2, 0x6d, 0x7f, 0xc1, 0x56, 0x78, 0xe9, 0x9b, 0x14, 0xd0, 0x8e, 0x62, 0x82, 0xdf, 0x2f, - 0x1d, 0x17, 0x04, 0x36, 0x2b, 0x59, 0xf8, 0xf3, 0x30, 0xc9, 0xd9, 0xc1, 0x58, 0x66, 0x0e, 0x22, - 0x60, 0x80, 0x8f, 0x75, 0xb5, 0x1f, 0x4d, 0x79, 0x12, 0x67, 0x4c, 0x14, 0x7e, 0x1f, 0xb0, 0xbd, - 0x3d, 0x17, 0x22, 0xcb, 0x66, 0x72, 0xce, 0xfa, 0xf8, 0xcd, 0x59, 0xcb, 0x5c, 0xb3, 0xaf, 0xee, - 0x4a, 0x81, 0x04, 0x05, 0xb2, 0x5b, 0xc6, 0xeb, 0x40, 0xc2, 0xbe, 0xa2, 0x86, 0xb8, 0x71, 0x4e, - 0xa6, 0x58, 0x5a, 0xe8, 0xf5, 0x16, 0x4c, 0x83, 0x83, 0x7a, 0xec, 0x5a, 0x7e, 0xb5, 0x79, 0xf1, - 0x78, 0xa5, 0xb0, 0xfe, 0xf8, 0xeb, 0xc3, 0xea, 0xdb, 0x92, 0x38, 0xc5, 0x1b, 0xe6, 0x7a, 0x49, - 0xe2, 0xa3, 0x99, 0xfb, 0xc7, 0x7a, 0x2b, 0x24, 0xac, 0xf0, 0x6b, 0x77, 0x77, 0xdb, 0x8c, 0x0d, - 0x2e, 0xc3, 0x48, 0xae, 0x1e, 0x31, 0x66, 0x61, 0x0a, 0x7d, 0x11, 0x5b, 0xd7, 0xb8, 0xbb, 0xb4, - 0x90, 0x65, 0x15, 0xb2, 0x7c, 0x1e, 0x32, 0xdd, 0xe9, 0x63, 0xff, 0xc8, 0x6a, 0x1f, 0x5c, 0x40, - 0x0d, 0x65, 0xa4, 0xa8, 0x54, 0xd3, 0x0c, 0x55, 0x23, 0xd2, 0xf5, 0x04, 0x04, 0x34, 0x4d, 0xc2, - 0x88, 0x5d, 0x71, 0x3d, 0x45, 0x02, 0xd8, 0x6c, 0xac, 0xd6, 0x73, 0x8d, 0x45, 0x97, 0x1b, 0xed, - 0x09, 0xd9, 0x2c, 0xaa, 0xa6, 0x52, 0x4b, 0x3b, 0xfa, 0xf1, 0xd1, 0x40, 0xda, 0x09, 0xb4, 0x8d, - 0x42, 0x51, 0xa7, 0x07, 0x36, 0xc1, 0xe8, 0x12, 0x17, 0x69, 0x8e, 0x15, 0xc6, 0x7c, 0x7d, 0x9f, - 0x02, 0x89, 0xa2, 0x21, 0x88, 0xbd, 0x0f, 0xb1, 0x43, 0x3d, 0xf0, 0x64, 0xc9, 0xd5, 0x3e, 0x57, - 0xbd, 0x06, 0x66, 0xb6, 0xc9, 0xa5, 0x5e, 0x7b, 0xdf, 0x85, 0xcf, 0xc6, 0x46, 0xb0, 0x51, 0x55, - 0x9e, 0xae, 0x38, 0xc6, 0x36, 0x30, 0x27, 0x32, 0x8c, 0xff, 0x31, 0xc2, 0xa6, 0x04, 0xea, 0xb0, - 0xf0, 0x85, 0x2d, 0x7a, 0xc3, 0xcf, 0x00, 0x49, 0x6c, 0x27, 0x2c, 0x8b, 0x28, 0xf6, 0xe5, 0xf6, - 0x3a, 0x02, 0x87, 0xd8, 0x23, 0xf2, 0xc6, 0xb7, 0x70, 0x1e, 0x96, 0x0a, 0x9e, 0x08, 0x86, 0xea, - 0x5e, 0x80, 0x0a, 0xe8, 0xee, 0xd8, 0xbf, 0x91, 0xf1, 0x7d, 0x25, 0x0b, 0x02, 0xe5, 0xc3, 0x38, - 0x1e, 0xcc, 0x21, 0xc6, 0x67, 0x5c, 0x41, 0xa8, 0x59, 0xe6, 0x50, 0x84, 0x49, 0x3d, 0x07, 0x88, - 0xe3, 0xe1, 0x23, 0xd3, 0x5f, 0x1c, 0x77, 0xf9, 0xbc, 0x1c, 0xcb, 0x32, 0x99, 0x01, 0x3c, 0x90, - 0xc3, 0x8a, 0x91, 0x09, 0x14, 0xbe, 0x9c, 0x38, 0x74, 0x80, 0xeb, 0xa4, 0xf0, 0x17, 0xc8, 0x90, - 0x8c, 0x79, 0xc2, 0x8c, 0x1b, 0x70, 0x9a, 0x01, 0x65, 0xd1, 0xb3, 0x62, 0x5d, 0x8e, 0x09, 0x6c, - 0x1c, 0xf3, 0x49, 0x9e, 0x85, 0x26, 0x40, 0xd6, 0x0d, 0x32, 0x0e, 0x39, 0xd2, 0xfc, 0x7f, 0xc4, - 0xa9, 0x88, 0xe4, 0x2c, 0x85, 0x38, 0x31, 0x92, 0x86, 0x13, 0x46, 0xe2, 0x50, 0x87, 0x3b, 0x40, - 0xd2, 0x1b, 0x31, 0x1d, 0xad, 0xea, 0xa0, 0xa0, 0x78, 0x38, 0xc7, 0x8c, 0x32, 0xac, 0x06, 0x8a, - 0x96, 0x3b, 0x34, 0x80, 0x5a, 0x30, 0x67, 0x5b, 0x24, 0x13, 0xd7, 0x1c, 0x77, 0x4d, 0xcf, 0x31, - 0xe7, 0x60, 0x80, 0xd2, 0xc9, 0x48, 0xcb, 0x0c, 0xd4, 0xe3, 0xe9, 0x75, 0xaa, 0xd9, 0x0c, 0x23, - 0x10, 0x9d, 0xa6, 0xc0, 0xd3, 0x8f, 0x8f, 0x85, 0x18, 0xec, 0x9e, 0xa5, 0x80, 0xfc, 0x57, 0xd0, - 0x47, 0x3e, 0xc9, 0x98, 0xf9, 0x64, 0x98, 0xb0, 0x50, 0x31, 0x02, 0x11, 0x81, 0x4a, 0xbf, 0x3a, - 0x1b, 0x1c, 0x93, 0xd3, 0x21, 0x60, 0xf3, 0x2a, 0x1a, 0x55, 0x55, 0xa3, 0x67, 0xb4, 0xb9, 0x50, - 0x7a, 0x89, 0x62, 0x0f, 0xb6, 0x22, 0x01, 0x5a, 0xa8, 0xa7, 0x58, 0x71, 0x9e, 0x40, 0x56, 0x4e, - 0x60, 0x2c, 0x70, 0x5a, 0x50, 0x59, 0x90, 0x26, 0x65, 0x4a, 0x88, 0x36, 0xa8, 0xfb, 0xa1, 0xde, - 0xea, 0x18, 0x76, 0x6d, 0xba, 0xbe, 0x4a, 0x13, 0xae, 0xcd, 0xea, 0x41, 0x49, 0x51, 0xbd, 0xfd, - 0xdd, 0x5d, 0x67, 0x75, 0x82, 0xaf, 0xbd, 0xf5, 0x0a, 0x6f, 0xad, 0x17, 0xda, 0x9f, 0x4a, 0xa5, - 0xd1, 0xd4, 0x1e, 0x30, 0x18, 0xce, 0x0d, 0x1f, 0x68, 0x87, 0xee, 0xd9, 0xc7, 0x0e, 0xa5, 0xee, - 0x1e, 0x28, 0xdd, 0x13, 0xd7, 0xcd, 0xaf, 0xee, 0xb2, 0xa8, 0xd5, 0x27, 0x67, 0x65, 0x43, 0xc1, - 0x91, 0xf5, 0x21, 0x0d, 0x5a, 0xe0, 0xea, 0x4e, 0xcb, 0xb8, 0x0b, 0xa6, 0x63, 0x7f, 0x34, 0xf6, - 0x43, 0x93, 0x91, 0xe0, 0xe9, 0x16, 0x3c, 0x99, 0x21, 0x9a, 0xeb, 0xa4, 0x15, 0x22, 0xab, 0x79, - 0x00, 0xa1, 0x7f, 0x28, 0xe1, 0x03, 0x08, 0x40, 0x61, 0x10, 0x1b, 0x4c, 0x7a, 0x59, 0xeb, 0x36, - 0x8a, 0x09, 0xa6, 0xab, 0xf4, 0x3d, 0x0c, 0x34, 0x7f, 0xe7, 0x33, 0x84, 0x4c, 0xf2, 0x2c, 0x81, - 0x1e, 0xc1, 0x25, 0x3f, 0x52, 0x40, 0x43, 0x07, 0x20, 0x68, 0x04, 0xba, 0x0d, 0x3b, 0x90, 0x61, - 0xc9, 0x43, 0x25, 0xa2, 0x33, 0xc0, 0x21, 0x70, 0x00, 0xf4, 0xba, 0xc0, 0xd5, 0xb3, 0x1a, 0xc1, - 0x5e, 0xc7, 0xa7, 0xdf, 0x15, 0x25, 0xb6, 0xdb, 0x47, 0x63, 0x4a, 0x60, 0x52, 0x9b, 0x4a, 0xf8, - 0x92, 0x42, 0x98, 0x40, 0x34, 0xe6, 0x73, 0x12, 0x25, 0x70, 0x14, 0x03, 0x47, 0x48, 0xc0, 0xb6, - 0xa8, 0xae, 0x4d, 0x59, 0x92, 0x1e, 0xd1, 0x5e, 0xad, 0x0b, 0xad, 0xa6, 0xc1, 0x2b, 0xcb, 0x26, - 0xf6, 0x85, 0x82, 0xd5, 0x08, 0x52, 0x79, 0x1b, 0xd0, 0x13, 0x34, 0xfb, 0xa1, 0xdb, 0xb0, 0x1f, - 0x00, 0x1a, 0xa8, 0xe8, 0x3d, 0xbf, 0xa7, 0xb6, 0xda, 0x74, 0x84, 0x9b, 0x8e, 0xc2, 0xe8, 0x76, - 0xbd, 0xaf, 0xb2, 0x43, 0xe5, 0x37, 0x33, 0x0e, 0x18, 0x47, 0xe1, 0x9c, 0x91, 0x5d, 0x02, 0x3c, - 0x29, 0x80, 0xce, 0xd7, 0xc2, 0xd3, 0x0c, 0x70, 0x59, 0x4b, 0xd3, 0x7d, 0x3b, 0x15, 0x42, 0x3a, - 0xf2, 0x14, 0x02, 0xb3, 0x0f, 0x4b, 0xed, 0x5e, 0xb1, 0x83, 0x68, 0x49, 0xd8, 0x1d, 0xb4, 0x34, - 0xf6, 0x63, 0xc1, 0xd7, 0x20, 0xd3, 0x5e, 0x99, 0xab, 0x55, 0x11, 0x62, 0xdc, 0xcc, 0x20, 0xb4, - 0xf6, 0xef, 0x1c, 0xa1, 0x22, 0xfb, 0x6d, 0x40, 0x05, 0xeb, 0xe7, 0x56, 0x99, 0x89, 0x2e, 0x71, - 0x0c, 0x33, 0x12, 0x06, 0x4d, 0x74, 0x8f, 0x26, 0x85, 0xd4, 0xd8, 0xfa, 0x88, 0xc0, 0xed, 0xa0, - 0x78, 0xd7, 0x90, 0x32, 0xd9, 0x20, 0x64, 0x52, 0xd0, 0x71, 0x39, 0xea, 0xe2, 0xe3, 0x8a, 0x7d, - 0x03, 0xda, 0xde, 0xa7, 0xc6, 0x4e, 0x69, 0x26, 0x85, 0x94, 0xc0, 0x43, 0xfc, 0x54, 0x5b, 0xf9, - 0x65, 0xad, 0x69, 0x58, 0xd1, 0xf4, 0xae, 0x6d, 0x35, 0x8d, 0x34, 0xf0, 0x46, 0x04, 0x5d, 0x4c, - 0xe0, 0x2c, 0xc7, 0xb0, 0x86, 0x9a, 0x34, 0x7d, 0xf3, 0x8f, 0x40, 0xa9, 0x90, 0xe3, 0x93, 0xfe, - 0xb0, 0x02, 0xb6, 0x50, 0x77, 0xda, 0xa4, 0x85, 0x25, 0x91, 0xcf, 0x6e, 0x58, 0x46, 0xcb, 0xfa, - 0x80, 0xd2, 0x9a, 0x71, 0x11, 0xd0, 0xa6, 0x31, 0x17, 0xd0, 0xfd, 0xb7, 0x6f, 0x29, 0xc9, 0xd8, - 0x9f, 0x39, 0x87, 0xf1, 0xac, 0x47, 0x7c, 0xb2, 0xa5, 0xa7, 0xf5, 0x4a, 0x7a, 0xf6, 0x5f, 0x49, - 0x4f, 0xfb, 0xa7, 0xf4, 0x6c, 0x84, 0x72, 0x02, 0x13, 0xfe, 0x22, 0xbc, 0xef, 0xd4, 0x36, 0x82, - 0x66, 0x75, 0x7f, 0xfc, 0xe9, 0x98, 0xd5, 0xaa, 0x7a, 0x5e, 0x29, 0x66, 0x1f, 0x5f, 0x29, 0x66, - 0x1f, 0x7f, 0x3e, 0x66, 0xb5, 0x22, 0x68, 0xd0, 0xd9, 0xd0, 0x87, 0x20, 0xa5, 0x6e, 0x3b, 0x4f, - 0xe2, 0x36, 0xfa, 0x1f, 0xe2, 0x56, 0xfb, 0x2e, 0xd0, 0x42, 0x4f, 0xeb, 0x95, 0xf4, 0xec, 0xbf, - 0x92, 0x9e, 0xf6, 0xcf, 0xe9, 0xc1, 0x00, 0xcd, 0x8e, 0xcf, 0x47, 0x04, 0xa6, 0x13, 0xb8, 0x0d, - 0xaa, 0xb2, 0x75, 0x2d, 0xd1, 0x60, 0xd7, 0x0a, 0x49, 0x50, 0xc0, 0x36, 0xae, 0xb9, 0xd9, 0x36, - 0x1a, 0x85, 0xed, 0x5a, 0x85, 0x6e, 0x0a, 0x6e, 0xf8, 0xf4, 0x84, 0x65, 0x88, 0x19, 0x29, 0x12, - 0xdc, 0xdf, 0x4f, 0x38, 0x9c, 0xf7, 0x40, 0x11, 0x1d, 0xd2, 0x55, 0x69, 0x28, 0x56, 0x28, 0x79, - 0x0a, 0xe7, 0xc0, 0xf9, 0x9a, 0xd4, 0x58, 0x0c, 0x27, 0x11, 0x08, 0x18, 0x80, 0x05, 0xdd, 0x9a, - 0x39, 0x87, 0x91, 0xc3, 0x28, 0x42, 0xa0, 0x43, 0xc9, 0x85, 0x36, 0x4c, 0x5b, 0x3b, 0x1c, 0x12, - 0xa4, 0xc7, 0x67, 0xb1, 0x1f, 0x0e, 0x5f, 0xe4, 0x47, 0x0b, 0xf8, 0xf0, 0x29, 0x2d, 0x9a, 0x76, - 0x3b, 0xe1, 0x31, 0xd8, 0x1a, 0x1a, 0xa9, 0x0e, 0xa9, 0x6c, 0x8f, 0xa6, 0x2c, 0xba, 0xbd, 0x91, - 0x77, 0x2b, 0x15, 0x27, 0x96, 0x00, 0x11, 0x48, 0x49, 0x96, 0x4f, 0xc1, 0xe0, 0xd5, 0xd9, 0xfd, - 0x1e, 0xbb, 0x16, 0xca, 0x86, 0x36, 0x53, 0x1b, 0xec, 0x0a, 0x4a, 0x35, 0x0c, 0x49, 0x90, 0x45, - 0xc7, 0x7f, 0x78, 0xef, 0xbd, 0x6b, 0x2f, 0xdd, 0x47, 0x38, 0x33, 0x88, 0xf9, 0x71, 0x22, 0xa0, - 0x03, 0x63, 0x02, 0x2c, 0x40, 0xa2, 0x7d, 0xf2, 0xde, 0xfc, 0x7e, 0x02, 0xa3, 0x04, 0xcb, 0x54, - 0x09, 0x6b, 0x23, 0x62, 0xc4, 0x1c, 0x65, 0x78, 0xa7, 0x13, 0x2c, 0xe9, 0x54, 0x8b, 0xe8, 0xb0, - 0xff, 0x42, 0x11, 0xdd, 0x95, 0x55, 0xd4, 0x2a, 0xab, 0xa8, 0xd5, 0xde, 0x2a, 0x22, 0x70, 0x1d, - 0x1d, 0x54, 0x98, 0x58, 0x73, 0x33, 0x2a, 0x75, 0xc2, 0x01, 0xdf, 0xb5, 0x77, 0x20, 0x62, 0x47, - 0x7d, 0x28, 0x45, 0x4c, 0x75, 0x99, 0x69, 0xfc, 0x10, 0x8e, 0x71, 0x06, 0xbc, 0x91, 0x12, 0x12, - 0x6a, 0x65, 0xb7, 0xf7, 0xb4, 0x68, 0xef, 0x98, 0xab, 0x8d, 0xe2, 0xd8, 0x12, 0xab, 0x15, 0x72, - 0x90, 0xbd, 0xc3, 0x04, 0x28, 0x53, 0xbd, 0xa4, 0x08, 0xce, 0xaa, 0x73, 0x36, 0x07, 0x6b, 0x0e, - 0x1e, 0xa1, 0x19, 0x83, 0xf9, 0x78, 0x06, 0x83, 0x22, 0x8b, 0xdd, 0xd5, 0x0e, 0x9c, 0x96, 0x8c, - 0x0b, 0xa5, 0x63, 0xcf, 0x97, 0x2b, 0x56, 0x2b, 0x4e, 0x6c, 0x73, 0xb6, 0x55, 0xaa, 0x83, 0xbb, - 0x94, 0x65, 0x1c, 0x7f, 0x96, 0x81, 0xa2, 0x37, 0x05, 0x7a, 0x6c, 0xef, 0x65, 0x36, 0xf6, 0x2a, - 0x61, 0x2c, 0xfd, 0x41, 0x45, 0x5d, 0x8d, 0x6c, 0xea, 0xba, 0xbc, 0x57, 0xeb, 0x83, 0x5d, 0x9c, - 0x94, 0xc8, 0x02, 0x66, 0xd9, 0x55, 0xd4, 0xe6, 0x1c, 0x72, 0xce, 0x95, 0xca, 0x99, 0xf2, 0x4d, - 0x92, 0x8f, 0xed, 0x50, 0xc0, 0x84, 0xb1, 0xc4, 0xc7, 0xd6, 0x18, 0x57, 0x04, 0x4f, 0x77, 0x1c, - 0x4e, 0x22, 0x99, 0x81, 0xbb, 0x3a, 0xb9, 0xf7, 0x08, 0x17, 0xf8, 0xeb, 0x91, 0x62, 0x8a, 0xa4, - 0x72, 0x01, 0xb1, 0xc0, 0xdb, 0x47, 0x3e, 0x33, 0xde, 0xfb, 0xdd, 0x06, 0x37, 0x43, 0x9a, 0x1d, - 0xf1, 0xe0, 0xce, 0x1e, 0x53, 0xe3, 0xd5, 0x15, 0xa4, 0x3a, 0xc1, 0x32, 0xfa, 0x0c, 0xd7, 0x78, - 0xcd, 0xec, 0x8c, 0xc3, 0x7b, 0xf6, 0x36, 0x63, 0x0a, 0x9c, 0xe1, 0xed, 0x46, 0x11, 0x89, 0xd1, - 0x1d, 0x8c, 0x86, 0xf5, 0xf3, 0x8b, 0x2b, 0x83, 0xec, 0x37, 0xf0, 0x97, 0x94, 0x57, 0x53, 0x44, - 0x86, 0x38, 0x73, 0x85, 0x98, 0x42, 0x92, 0x19, 0x6d, 0x3f, 0x80, 0x84, 0x91, 0x00, 0x58, 0xb5, - 0x81, 0x75, 0xce, 0x22, 0xf8, 0x41, 0x08, 0x3f, 0x0f, 0x6c, 0x08, 0x4f, 0xc2, 0x2c, 0x5e, 0x84, - 0xc0, 0x1b, 0x9f, 0x0e, 0xfb, 0xab, 0x2d, 0xb5, 0xa7, 0x3c, 0xf0, 0x19, 0xbe, 0xdb, 0x1d, 0x67, - 0x21, 0x5c, 0xde, 0x47, 0x8c, 0x89, 0xad, 0xac, 0x67, 0x09, 0x8f, 0x31, 0xed, 0xa2, 0x92, 0x70, - 0x33, 0x23, 0xd6, 0xcc, 0x58, 0x8b, 0x01, 0x83, 0x01, 0xb8, 0x08, 0xd8, 0x00, 0xaf, 0xf0, 0x78, - 0x12, 0x5d, 0x82, 0x2d, 0x1b, 0xae, 0x4a, 0x67, 0x0c, 0x2e, 0x4f, 0x9e, 0x6b, 0x0d, 0xd4, 0x5f, - 0x7b, 0xa9, 0x7a, 0xff, 0x06, 0xe5, 0x7d, 0xd4, 0xdf, 0xb1, 0xd7, 0xa5, 0x2f, 0x6f, 0xda, 0x30, - 0xb9, 0xe2, 0x05, 0x0f, 0xce, 0x3d, 0x88, 0xcb, 0x4b, 0x9b, 0x90, 0xd1, 0x20, 0x1f, 0xed, 0xfd, - 0xfa, 0xf0, 0x62, 0xf0, 0x92, 0xd0, 0x3b, 0xda, 0x33, 0x32, 0xc7, 0x2c, 0xbf, 0x7b, 0x49, 0xe6, - 0x17, 0xda, 0xfb, 0xed, 0xf4, 0xb2, 0xfe, 0x65, 0xf0, 0x22, 0xbe, 0xf7, 0xb4, 0xf7, 0xcf, 0x9c, - 0x0b, 0x40, 0x57, 0x3f, 0xe6, 0x93, 0xfa, 0x45, 0xa4, 0x43, 0x80, 0x78, 0x59, 0x07, 0x5f, 0x9f, - 0x35, 0x5e, 0xb6, 0xed, 0x9b, 0xf5, 0x3e, 0x83, 0xe2, 0x45, 0x1a, 0x80, 0x00, 0x8d, 0x58, 0x36, - 0xf9, 0xe5, 0x0d, 0xaa, 0x7c, 0x46, 0xae, 0x54, 0xf8, 0x96, 0xf6, 0x2e, 0x17, 0x3c, 0xe1, 0x93, - 0xa9, 0x3e, 0x03, 0x72, 0xfd, 0xbe, 0x56, 0xe0, 0x84, 0xab, 0xe7, 0x05, 0x6a, 0x6b, 0xfa, 0xb9, - 0xba, 0x84, 0x00, 0x82, 0xd1, 0x66, 0x6b, 0x2d, 0xb5, 0xc9, 0x13, 0xeb, 0x62, 0xc0, 0xbb, 0xc3, - 0xff, 0xfb, 0x7a, 0xd2, 0xc0, 0xbb, 0x17, 0x32, 0x15, 0x5e, 0xd0, 0xf0, 0xb6, 0x86, 0x3f, 0xaa, - 0xff, 0x17, 0x39, 0xb0, 0x85, 0xbd, 0x64, 0x17, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x58, 0x6d, 0x53, 0xdb, 0x3a, + 0x16, 0xfe, 0x9e, 0x5f, 0x21, 0xb4, 0x3b, 0x8c, 0x3d, 0x38, 0x4e, 0x42, 0xda, 0x5e, 0x36, 0xc4, + 0xe9, 0xf2, 0x92, 0x16, 0xf6, 0x52, 0xc8, 0x36, 0xec, 0x65, 0x76, 0xba, 0x9d, 0x7b, 0x8d, 0xad, + 0x24, 0x2a, 0xb6, 0xe4, 0x6b, 0xc9, 0x09, 0x0c, 0xf0, 0xdf, 0xf7, 0x1c, 0xc9, 0x4e, 0xe2, 0x00, + 0xed, 0x4e, 0x87, 0x9d, 0xce, 0x14, 0x5b, 0x3e, 0x3a, 0xe7, 0x39, 0x6f, 0x8f, 0x8e, 0xd2, 0xdf, + 0x3a, 0xbe, 0x38, 0xba, 0xfc, 0xf7, 0x68, 0x48, 0x66, 0x3a, 0x4d, 0x06, 0x7d, 0xfc, 0x9f, 0x24, + 0xa1, 0x98, 0x06, 0x94, 0x09, 0x0a, 0xef, 0x2c, 0x8c, 0x07, 0xfd, 0x94, 0xe9, 0x90, 0x44, 0xb3, + 0x30, 0x57, 0x4c, 0x07, 0xb4, 0xd0, 0x93, 0xe6, 0x1e, 0x2d, 0x57, 0x1b, 0x91, 0x14, 0x9a, 0x09, + 0x58, 0x5e, 0xf0, 0x58, 0xcf, 0x82, 0x98, 0xcd, 0x79, 0xc4, 0x9a, 0xe6, 0xc5, 0xe3, 0x82, 0x6b, + 0x1e, 0x26, 0x4d, 0x15, 0x85, 0x09, 0x0b, 0x3a, 0x5e, 0x1a, 0xde, 0xf2, 0xb4, 0x48, 0x97, 0xef, + 0x85, 0x62, 0xb9, 0x79, 0x09, 0xaf, 0xe1, 0x5d, 0x48, 0x4a, 0x1a, 0x22, 0x4c, 0x59, 0x40, 0xe7, + 0x9c, 0x2d, 0x32, 0x99, 0x6b, 0xb0, 0xa2, 0xb9, 0x4e, 0xd8, 0xe0, 0x8a, 0x7f, 0xe0, 0x64, 0xcc, + 0xb4, 0xe6, 0x62, 0xaa, 0xfa, 0x2d, 0xbb, 0xd8, 0x57, 0x51, 0xce, 0x33, 0x3d, 0x68, 0xcc, 0xc3, + 0x9c, 0x24, 0x32, 0xe2, 0x99, 0x17, 0x07, 0xb1, 0x8c, 0x8a, 0x14, 0x00, 0x79, 0xb0, 0x10, 0x6c, + 0x75, 0xf0, 0x4f, 0x96, 0x4b, 0x2d, 0x03, 0x3a, 0xd3, 0x3a, 0xeb, 0x51, 0x0f, 0xec, 0x89, 0x33, + 0x29, 0x33, 0x15, 0xb4, 0xbd, 0x2c, 0x67, 0x63, 0x78, 0x1d, 0x8f, 0x4f, 0x8f, 0x03, 0x4a, 0xf7, + 0x27, 0x85, 0x88, 0x34, 0x97, 0x82, 0x4c, 0x4f, 0x63, 0x47, 0xbb, 0xf7, 0x39, 0xd3, 0x45, 0x2e, + 0x48, 0xec, 0x4f, 0x99, 0x1e, 0x26, 0x0c, 0xd5, 0x1e, 0xde, 0x99, 0x4f, 0x8f, 0x4b, 0xd1, 0x68, + 0x58, 0x93, 0x8c, 0x72, 0x16, 0x6a, 0x56, 0x0a, 0xd7, 0x04, 0x4f, 0x1c, 0xf7, 0x7e, 0xc1, 0x45, + 0x2c, 0x17, 0xbe, 0xcc, 0x98, 0x70, 0x0c, 0x1e, 0xd5, 0x6b, 0xb5, 0x6e, 0x84, 0xf4, 0x17, 0x09, + 0x43, 0x2b, 0xad, 0x09, 0xec, 0x2e, 0x72, 0xa6, 0x5a, 0xaa, 0xf4, 0xb5, 0xf5, 0x97, 0x05, 0x9f, + 0xf0, 0x66, 0xf5, 0x4a, 0xd7, 0x14, 0x1e, 0x6e, 0x28, 0x04, 0x90, 0xff, 0xfa, 0x7c, 0xe6, 0xd0, + 0xd6, 0x4a, 0xd8, 0xa3, 0xbf, 0x2b, 0x96, 0x4c, 0xd6, 0x77, 0x9d, 0xc3, 0x2e, 0xc8, 0x99, 0xd2, + 0x44, 0x07, 0xe8, 0x26, 0xc5, 0x78, 0x50, 0x77, 0x5f, 0xfb, 0x31, 0x57, 0x98, 0x87, 0x38, 0xd8, + 0x6a, 0x7b, 0xda, 0xd7, 0xec, 0x56, 0x1f, 0x55, 0xb9, 0xc5, 0x20, 0x09, 0x50, 0xe9, 0xfb, 0x3e, + 0xf5, 0x26, 0x4c, 0x47, 0xb3, 0x95, 0xb5, 0x6f, 0x4a, 0x8a, 0x96, 0x60, 0x9a, 0xba, 0xae, 0xaf, + 0x67, 0x80, 0x43, 0x07, 0x03, 0xed, 0xe3, 0xaa, 0xb3, 0xb6, 0x72, 0x71, 0xfd, 0x8d, 0x45, 0xda, + 0x0f, 0x95, 0xe2, 0x53, 0xe1, 0xdc, 0x3f, 0x7a, 0xf7, 0xb0, 0x65, 0x21, 0xf3, 0x1b, 0xd5, 0xfb, + 0xf2, 0xf5, 0xd1, 0xd3, 0xae, 0x5f, 0xbd, 0xfb, 0x0a, 0x12, 0xef, 0x38, 0xda, 0x63, 0x6e, 0x30, + 0x60, 0x7e, 0x0e, 0x3b, 0x9a, 0xda, 0xfc, 0x71, 0xfd, 0x9c, 0xc5, 0x45, 0xc4, 0xaa, 0x8f, 0x8e, + 0x06, 0xd9, 0x94, 0x59, 0x83, 0xf0, 0x3d, 0x0e, 0x82, 0x80, 0x99, 0x07, 0xf7, 0xe1, 0x41, 0xfb, + 0x59, 0xa1, 0x66, 0x0e, 0x73, 0x41, 0xb7, 0xf7, 0xe5, 0x6b, 0x05, 0x85, 0x05, 0x83, 0x7b, 0x3e, + 0x71, 0xda, 0x46, 0x34, 0x61, 0x62, 0xaa, 0x67, 0xdb, 0xdb, 0xcb, 0x92, 0xe8, 0x77, 0xda, 0x6e, + 0x99, 0xca, 0xe5, 0xda, 0xce, 0x8e, 0x37, 0x97, 0x3c, 0x26, 0x10, 0xd5, 0x4b, 0x9e, 0x32, 0x59, + 0x68, 0xe7, 0xdc, 0xeb, 0xb0, 0xae, 0xbb, 0xbf, 0x56, 0x49, 0xfb, 0x09, 0xd3, 0x44, 0xd8, 0x80, + 0x1e, 0x8d, 0x21, 0x9c, 0x60, 0x43, 0xb8, 0xf7, 0xb8, 0xaa, 0x03, 0x28, 0x11, 0x0a, 0x69, 0x00, + 0xff, 0x4d, 0x9c, 0x41, 0xd1, 0x81, 0xd6, 0x39, 0xbf, 0x2e, 0x34, 0x73, 0x28, 0x8f, 0xa9, 0x67, + 0xb6, 0x78, 0x9b, 0x5f, 0xb0, 0x15, 0x5e, 0xfa, 0x26, 0x05, 0xb4, 0xa3, 0x98, 0xe2, 0xf7, 0x4b, + 0xc7, 0x05, 0x81, 0xf5, 0x4a, 0x16, 0xfe, 0x3c, 0x4c, 0x0a, 0xb6, 0x3f, 0x91, 0xb9, 0x83, 0x08, + 0x18, 0xe0, 0x63, 0x7d, 0xed, 0x47, 0x33, 0x9e, 0xc4, 0x39, 0x13, 0xa5, 0xdf, 0xfb, 0x6c, 0x67, + 0xc7, 0x85, 0xc8, 0xb2, 0x54, 0xce, 0xd9, 0x11, 0x7e, 0x73, 0x56, 0x32, 0x5f, 0xd8, 0x57, 0x77, + 0xa9, 0x40, 0x82, 0x02, 0xd9, 0xaf, 0xe2, 0xb5, 0x2f, 0x61, 0x5f, 0x59, 0x43, 0xdc, 0x38, 0x27, + 0x33, 0x2c, 0x2d, 0xf4, 0x7a, 0x03, 0xa6, 0xc1, 0x41, 0x3d, 0xf6, 0x45, 0x7e, 0xb5, 0x79, 0xf1, + 0x78, 0xad, 0xb0, 0xfe, 0xf8, 0xeb, 0xfd, 0xf2, 0xdb, 0x23, 0x71, 0xca, 0x37, 0xcc, 0xf5, 0x23, + 0x89, 0x0f, 0x53, 0xf7, 0x8f, 0xd5, 0x56, 0x48, 0x58, 0xe9, 0xd7, 0xf6, 0xf6, 0xa6, 0x19, 0x1b, + 0x5c, 0x86, 0x91, 0x5c, 0x3e, 0x62, 0xcc, 0xc2, 0x0c, 0xfa, 0x22, 0xb6, 0xae, 0x71, 0xf7, 0xd1, + 0x42, 0x96, 0x75, 0xc8, 0xf2, 0x79, 0xc8, 0x74, 0xeb, 0x08, 0xfb, 0x47, 0xd6, 0xfb, 0xe0, 0x02, + 0x6a, 0x28, 0x27, 0x65, 0xa5, 0x9a, 0x66, 0xa8, 0x1b, 0x91, 0xae, 0x27, 0x20, 0xa0, 0x59, 0x12, + 0x46, 0xec, 0x8a, 0xeb, 0x19, 0x12, 0xc0, 0x7a, 0x63, 0x75, 0x9e, 0x6b, 0x2c, 0xfa, 0xb8, 0xd6, + 0x9e, 0x90, 0xcd, 0xb2, 0x6a, 0x6a, 0xb5, 0xb4, 0xa5, 0x1f, 0x1e, 0x0c, 0xa4, 0xad, 0x40, 0xdb, + 0x28, 0x94, 0x75, 0xba, 0x6f, 0x13, 0x8c, 0x2e, 0x71, 0x91, 0x15, 0x58, 0x61, 0xcc, 0xd7, 0x77, + 0x19, 0x90, 0x28, 0x1a, 0x82, 0xd8, 0xfb, 0x10, 0x3b, 0xd4, 0x03, 0x4f, 0x96, 0x5c, 0xed, 0x73, + 0xdd, 0x6b, 0x60, 0x66, 0x9b, 0x5c, 0xea, 0x75, 0x77, 0x5d, 0xf8, 0x6c, 0x6c, 0x04, 0x6b, 0x55, + 0xe5, 0xe9, 0x9a, 0x63, 0x6c, 0x0d, 0x73, 0x22, 0xc3, 0xf8, 0x1f, 0x63, 0x6c, 0x4a, 0xa0, 0x0e, + 0x0b, 0x5f, 0xd8, 0xa2, 0x37, 0xfc, 0x0c, 0x90, 0xc4, 0x66, 0xc2, 0xf2, 0x88, 0x62, 0x5f, 0x6e, + 0xae, 0x23, 0x70, 0x88, 0x3d, 0x22, 0x6f, 0x7d, 0x0b, 0xe7, 0x61, 0xa5, 0xe0, 0x89, 0x60, 0xa8, + 0xee, 0x04, 0xa8, 0x80, 0xee, 0x8e, 0xfd, 0x6b, 0x19, 0xdf, 0xd5, 0xb2, 0x20, 0x50, 0x3e, 0x8c, + 0xe3, 0xe1, 0x1c, 0x62, 0x7c, 0xc6, 0x15, 0x84, 0x9a, 0xe5, 0x0e, 0x45, 0x98, 0xd4, 0x73, 0x80, + 0x38, 0xee, 0x3f, 0x32, 0xfd, 0x9b, 0xe3, 0x3e, 0x3e, 0x2f, 0xc7, 0xf2, 0x5c, 0xe6, 0x00, 0x0f, + 0xe4, 0xb0, 0x62, 0x64, 0x02, 0x85, 0x2f, 0xa7, 0x0e, 0x1d, 0xe2, 0x3a, 0x29, 0xfd, 0x05, 0x32, + 0x24, 0x13, 0x9e, 0x30, 0xe3, 0x06, 0x9c, 0x66, 0x40, 0x59, 0xf4, 0xac, 0x5c, 0x97, 0x13, 0x02, + 0x1b, 0x27, 0x7c, 0x5a, 0xe4, 0xa1, 0x09, 0x90, 0x75, 0x83, 0x4c, 0x42, 0x8e, 0x34, 0xff, 0x1f, + 0x71, 0x2a, 0x22, 0x99, 0x66, 0x10, 0x27, 0x46, 0xb2, 0x70, 0xca, 0x48, 0x1c, 0xea, 0x70, 0x0b, + 0x48, 0x7a, 0x2d, 0xa6, 0xe3, 0x65, 0x1d, 0x94, 0x14, 0x0f, 0xe7, 0x98, 0x51, 0x86, 0xd5, 0x40, + 0xd1, 0x72, 0x8f, 0x06, 0x50, 0x0b, 0xe6, 0x6c, 0x8b, 0x64, 0xe2, 0x9a, 0xe3, 0xae, 0xed, 0x39, + 0xe6, 0x1c, 0x0c, 0x50, 0x3a, 0x19, 0x6b, 0x99, 0x83, 0x7a, 0x3c, 0xbd, 0x4e, 0x35, 0x4b, 0x31, + 0x02, 0xd1, 0x69, 0x06, 0x3c, 0xfd, 0xf0, 0x50, 0x8a, 0xc1, 0xee, 0x34, 0x03, 0xe4, 0x1f, 0x40, + 0x1f, 0xf9, 0x24, 0x63, 0xe6, 0x93, 0x51, 0xc2, 0x42, 0xc5, 0x08, 0x44, 0x04, 0x2a, 0xfd, 0xea, + 0x6c, 0x78, 0x4c, 0x4e, 0x47, 0x80, 0xcd, 0xab, 0x69, 0x54, 0x75, 0x8d, 0x9e, 0xd1, 0xe6, 0x42, + 0xe9, 0x25, 0x8a, 0xdd, 0xdb, 0x8a, 0x04, 0x68, 0xa1, 0x9e, 0x61, 0xc5, 0x79, 0x02, 0x59, 0x39, + 0x81, 0xb1, 0xc0, 0xe9, 0x40, 0x65, 0x41, 0x9a, 0x94, 0x29, 0x21, 0xda, 0xa2, 0xee, 0xfb, 0x66, + 0xa7, 0x67, 0xd8, 0xb5, 0xed, 0xfa, 0x2a, 0x4b, 0xb8, 0x36, 0xab, 0xfb, 0x15, 0x45, 0x0d, 0x76, + 0xb7, 0xb7, 0x9d, 0xe5, 0x09, 0xbe, 0xf2, 0xd6, 0x2b, 0xbd, 0xb5, 0x5e, 0x68, 0x7f, 0x26, 0x95, + 0x46, 0x53, 0x3b, 0xc0, 0x60, 0x38, 0x37, 0xbc, 0xa7, 0x3d, 0xba, 0x63, 0x1f, 0x7b, 0x94, 0xba, + 0x3b, 0xa0, 0x74, 0x47, 0x7c, 0x69, 0x7f, 0x75, 0x1f, 0xcb, 0x5a, 0x7d, 0x72, 0x56, 0xb6, 0x14, + 0x1c, 0x59, 0xef, 0xb3, 0xa0, 0x03, 0xae, 0x6e, 0x75, 0x8c, 0xbb, 0x60, 0x3a, 0xf6, 0xc7, 0x13, + 0x3f, 0x34, 0x19, 0x09, 0x9e, 0x6e, 0xc1, 0x93, 0x19, 0xa2, 0xb9, 0x4a, 0x5a, 0x29, 0xb2, 0x9c, + 0x07, 0x10, 0xfa, 0xfb, 0x0a, 0x3e, 0x80, 0x00, 0x14, 0x06, 0xb1, 0xc1, 0xa4, 0x1f, 0x1b, 0xfd, + 0x56, 0x39, 0xc1, 0xf4, 0x95, 0xbe, 0x83, 0x81, 0xe6, 0xef, 0x3c, 0x45, 0xc8, 0xa4, 0xc8, 0x13, + 0xe8, 0x11, 0x5c, 0xf2, 0x23, 0x05, 0x34, 0xb4, 0x0f, 0x82, 0x46, 0xa0, 0xdf, 0xb2, 0x03, 0x19, + 0x96, 0x3c, 0x54, 0x22, 0x3a, 0x03, 0x1c, 0x02, 0x07, 0xc0, 0xa0, 0x0f, 0x5c, 0x9d, 0x36, 0x08, + 0xf6, 0x3a, 0x3e, 0xfd, 0xae, 0x28, 0xb1, 0xdd, 0x3e, 0x9e, 0x50, 0x02, 0x93, 0xda, 0x4c, 0xc2, + 0x97, 0x0c, 0xc2, 0x04, 0xa2, 0x31, 0x9f, 0x93, 0x28, 0x81, 0xa3, 0x18, 0x38, 0x42, 0x02, 0xb6, + 0x45, 0x7d, 0x6d, 0xc6, 0x92, 0xec, 0x90, 0x0e, 0x1a, 0x7d, 0x68, 0x35, 0x0d, 0x5e, 0x59, 0x36, + 0xb1, 0x2f, 0x14, 0xac, 0x46, 0x90, 0xca, 0x9b, 0x80, 0x9e, 0xa0, 0xd9, 0xf7, 0xfd, 0x96, 0xfd, + 0x00, 0xd0, 0x40, 0xc5, 0xe0, 0xf9, 0x3d, 0x8d, 0xe5, 0xa6, 0x43, 0xdc, 0x74, 0x18, 0x46, 0x37, + 0xab, 0x7d, 0xb5, 0x1d, 0xaa, 0xb8, 0x4e, 0x39, 0x60, 0x1c, 0x87, 0x73, 0x46, 0xb6, 0x09, 0xf0, + 0xa4, 0x00, 0x3a, 0x5f, 0x09, 0xcf, 0x72, 0xc0, 0x65, 0x2d, 0xcd, 0x76, 0xed, 0x54, 0x08, 0xe9, + 0x28, 0x32, 0x08, 0xcc, 0x2e, 0x2c, 0x75, 0x07, 0xe5, 0x0e, 0xa2, 0x25, 0x61, 0xb7, 0xd0, 0xd2, + 0xd8, 0x8f, 0x25, 0x5f, 0x83, 0x4c, 0x77, 0x69, 0xae, 0x51, 0x47, 0x88, 0x71, 0x33, 0x83, 0xd0, + 0xca, 0xbf, 0x73, 0x84, 0x8a, 0xec, 0xb7, 0x06, 0x15, 0xac, 0x9f, 0x5b, 0x65, 0x26, 0xba, 0xc4, + 0x31, 0xcc, 0x48, 0x18, 0x34, 0xd1, 0x1d, 0x9a, 0x14, 0x52, 0x63, 0xeb, 0x23, 0x02, 0xb7, 0x87, + 0xe2, 0x7d, 0x43, 0xca, 0x64, 0x8d, 0x90, 0x49, 0x49, 0xc7, 0xd5, 0xa8, 0x8b, 0x8f, 0x4b, 0xf6, + 0x0d, 0x68, 0x77, 0x97, 0x1a, 0x3b, 0x95, 0x99, 0x0c, 0x52, 0x02, 0x0f, 0xf1, 0x53, 0x6d, 0xd5, + 0x97, 0x95, 0xa6, 0x51, 0x4d, 0xd3, 0xbb, 0xae, 0xd5, 0x34, 0xd6, 0xc0, 0x1b, 0x11, 0x74, 0x31, + 0x81, 0xb3, 0x1c, 0xc3, 0x1a, 0x6a, 0xd2, 0xf6, 0xcd, 0x3f, 0x02, 0xa5, 0x42, 0x8e, 0x4f, 0x8e, + 0x46, 0x35, 0xb0, 0xa5, 0xba, 0xd3, 0x36, 0x2d, 0x2d, 0x89, 0x22, 0xbd, 0x66, 0x39, 0xad, 0xea, + 0x03, 0x4a, 0x2b, 0xe5, 0x22, 0xa0, 0x6d, 0x63, 0x2e, 0xa0, 0xbb, 0x6f, 0xdf, 0x52, 0x92, 0xb3, + 0x3f, 0x0b, 0x0e, 0xe3, 0xd9, 0x80, 0xf8, 0x64, 0x43, 0x4f, 0xe7, 0x95, 0xf4, 0xec, 0xbe, 0x92, + 0x9e, 0xee, 0x4f, 0xe9, 0x59, 0x0b, 0xe5, 0x14, 0x26, 0xfc, 0x45, 0x78, 0xd7, 0x6b, 0xac, 0x05, + 0xcd, 0xea, 0xfe, 0xf8, 0xd3, 0x31, 0x6b, 0xd4, 0xf5, 0xbc, 0x52, 0xcc, 0x3e, 0xbe, 0x52, 0xcc, + 0x3e, 0xfe, 0x7c, 0xcc, 0x1a, 0x65, 0xd0, 0xa0, 0xb3, 0xa1, 0x0f, 0x41, 0x4a, 0xdd, 0xf4, 0x9e, + 0xc4, 0x6d, 0xfc, 0x3f, 0xc4, 0xad, 0xf1, 0x5d, 0xa0, 0xa5, 0x9e, 0xce, 0x2b, 0xe9, 0xd9, 0x7d, + 0x25, 0x3d, 0xdd, 0x9f, 0xd3, 0x83, 0x01, 0x4a, 0x8f, 0xcf, 0xc7, 0x04, 0xa6, 0x13, 0xb8, 0x0d, + 0xaa, 0xaa, 0x75, 0x2d, 0xd1, 0x60, 0xd7, 0x0a, 0x49, 0x50, 0xc0, 0x36, 0xae, 0xb9, 0xd9, 0xb6, + 0x5a, 0xa5, 0xed, 0x46, 0x8d, 0x6e, 0x4a, 0x6e, 0xf8, 0xf4, 0x84, 0x65, 0x88, 0x19, 0x29, 0x12, + 0xdc, 0x7f, 0x94, 0x70, 0x38, 0xef, 0x81, 0x22, 0x7a, 0xa4, 0xaf, 0xb2, 0x50, 0x2c, 0x51, 0xf2, + 0x0c, 0xce, 0x81, 0xf3, 0x15, 0xa9, 0xb1, 0x18, 0x4e, 0x22, 0x10, 0x30, 0x00, 0x4b, 0xba, 0x35, + 0x73, 0x0e, 0x23, 0x07, 0x51, 0x84, 0x40, 0x47, 0x92, 0x0b, 0x6d, 0x98, 0xb6, 0x71, 0x30, 0x22, + 0x48, 0x8f, 0xcf, 0x62, 0x3f, 0x18, 0xbd, 0xc8, 0x8f, 0x16, 0xf0, 0xc1, 0x53, 0x5a, 0x34, 0xed, + 0x76, 0xc2, 0x63, 0xb0, 0x35, 0x32, 0x52, 0x3d, 0x52, 0xdb, 0x1e, 0xcd, 0x58, 0x74, 0x73, 0x2d, + 0x6f, 0x97, 0x2a, 0x4e, 0x2c, 0x01, 0x22, 0x90, 0x8a, 0x2c, 0x9f, 0x82, 0xc1, 0xab, 0xb3, 0xfb, + 0x3d, 0x76, 0x2d, 0x95, 0x8d, 0x6c, 0xa6, 0xd6, 0xd8, 0x15, 0x94, 0x6a, 0x18, 0x92, 0x20, 0x8b, + 0x8e, 0x7f, 0xbf, 0xe7, 0xbd, 0xeb, 0x3e, 0xba, 0x0f, 0x70, 0x66, 0x10, 0xf3, 0xe3, 0x44, 0x40, + 0x87, 0xc6, 0x04, 0x58, 0x80, 0x44, 0xfb, 0x64, 0xcf, 0xfc, 0x7e, 0x02, 0xa3, 0x04, 0xcb, 0x55, + 0x05, 0x6b, 0x2d, 0x62, 0xc4, 0x1c, 0x65, 0x78, 0xa7, 0x13, 0x2c, 0xe9, 0xd5, 0x8b, 0xe8, 0xe0, + 0xe8, 0x85, 0x22, 0xba, 0xad, 0xaa, 0xa8, 0x53, 0x55, 0x51, 0xa7, 0xbb, 0x51, 0x44, 0xe0, 0x3a, + 0x3a, 0xa8, 0x30, 0xb1, 0xe6, 0x66, 0x54, 0xe9, 0x84, 0x03, 0xbe, 0x6f, 0xef, 0x40, 0xc4, 0x8e, + 0xfa, 0x50, 0x8a, 0x98, 0xea, 0x2a, 0xd3, 0xf8, 0x21, 0x9c, 0xe0, 0x0c, 0x78, 0x2d, 0x25, 0x24, + 0xd4, 0xca, 0x6e, 0xee, 0xe9, 0xd0, 0xc1, 0x31, 0x57, 0x6b, 0xc5, 0xb1, 0x21, 0xd6, 0x28, 0xe5, + 0x20, 0x7b, 0x07, 0x09, 0x50, 0xa6, 0x7a, 0x49, 0x11, 0x9c, 0x55, 0xe7, 0x6c, 0x0e, 0xd6, 0x1c, + 0x3c, 0x42, 0x73, 0x06, 0xf3, 0x71, 0x0a, 0x83, 0x22, 0x8b, 0xdd, 0xe5, 0x0e, 0x9c, 0x96, 0x8c, + 0x0b, 0x95, 0x63, 0xcf, 0x97, 0x2b, 0x56, 0x2b, 0x4e, 0x6c, 0x73, 0xb6, 0x51, 0xaa, 0xc3, 0xdb, + 0x8c, 0xe5, 0x1c, 0x7f, 0x96, 0x81, 0xa2, 0x37, 0x05, 0xfa, 0x41, 0xe6, 0x11, 0x23, 0x7b, 0xed, + 0x5d, 0xbf, 0xd3, 0x99, 0x92, 0x14, 0xc6, 0x5f, 0xe2, 0x0c, 0xc7, 0xa3, 0xbd, 0xdd, 0x77, 0xef, + 0x70, 0xb8, 0xba, 0x73, 0x7f, 0x50, 0x60, 0x1f, 0x3e, 0x96, 0x99, 0x3c, 0xb6, 0x17, 0x3c, 0x9b, + 0x44, 0x95, 0x30, 0x96, 0xfd, 0x60, 0xe7, 0xd5, 0xd8, 0xee, 0xec, 0xf3, 0x41, 0xe3, 0x08, 0x1c, + 0xc0, 0x91, 0x8b, 0x2c, 0x60, 0x28, 0x5e, 0x86, 0x7f, 0xce, 0xa1, 0x78, 0xb8, 0x52, 0x05, 0x53, + 0xbe, 0xb5, 0x61, 0xa7, 0x0b, 0x26, 0x8c, 0x25, 0x3e, 0xb1, 0xc6, 0xb8, 0x22, 0x38, 0x26, 0xe0, + 0x94, 0x13, 0xc9, 0x1c, 0xe2, 0xa6, 0x93, 0x3b, 0x8f, 0x70, 0x81, 0x3f, 0x43, 0x29, 0xa6, 0x48, + 0x26, 0x17, 0x10, 0x54, 0xbc, 0xc6, 0x14, 0xa9, 0x09, 0xa3, 0xdf, 0x6f, 0x71, 0x33, 0xed, 0xd9, + 0x59, 0x11, 0x2e, 0xff, 0x31, 0x35, 0xe1, 0xb9, 0x82, 0x9a, 0x49, 0xb0, 0x1e, 0x3f, 0xb3, 0x54, + 0x6a, 0x66, 0x87, 0x25, 0x3e, 0xb0, 0xd7, 0x22, 0xd3, 0x29, 0x0c, 0xaf, 0x49, 0x8a, 0x48, 0x4c, + 0x13, 0x84, 0xa9, 0x79, 0x7e, 0x71, 0x65, 0x90, 0xfd, 0x0a, 0xfe, 0x92, 0xea, 0x8e, 0x8b, 0xc8, + 0x10, 0x67, 0xa1, 0x10, 0x53, 0x48, 0x72, 0xa3, 0xed, 0x07, 0x90, 0x30, 0x12, 0x00, 0xab, 0x31, + 0xb4, 0xce, 0x59, 0x04, 0x3f, 0x08, 0xe1, 0xe7, 0xa1, 0x0d, 0xe1, 0x49, 0x98, 0xc7, 0x8b, 0x10, + 0x08, 0xe8, 0xd3, 0xc1, 0xd1, 0x72, 0x4b, 0xe3, 0x29, 0xa1, 0x7c, 0x86, 0xef, 0x76, 0xc7, 0x59, + 0xa8, 0x34, 0x19, 0x33, 0x26, 0x36, 0xca, 0x27, 0x4f, 0x78, 0x8c, 0xf5, 0x23, 0x6a, 0x95, 0x63, + 0x86, 0xcd, 0x86, 0x99, 0x8f, 0x31, 0x60, 0x30, 0x49, 0x97, 0x01, 0x1b, 0xe2, 0x6f, 0x01, 0x78, + 0xa4, 0x5d, 0x82, 0x2d, 0x1b, 0xae, 0x5a, 0x8b, 0x0d, 0x2f, 0x4f, 0x9e, 0xeb, 0x31, 0xd4, 0xdf, + 0x78, 0xa9, 0x0d, 0xfe, 0x06, 0x7d, 0x72, 0x78, 0xb4, 0x65, 0xef, 0x5d, 0xbf, 0xbd, 0xe9, 0xc2, + 0x08, 0x8c, 0x37, 0x45, 0x38, 0x40, 0x21, 0x2e, 0x2f, 0x6d, 0x42, 0x6a, 0x84, 0x7c, 0x74, 0x77, + 0x9b, 0xa3, 0x8b, 0xe1, 0x4b, 0x42, 0xef, 0xe8, 0xc0, 0xc8, 0x1c, 0xb3, 0xe2, 0xf6, 0x25, 0x99, + 0x5f, 0xe8, 0xe0, 0xd7, 0xd3, 0xcb, 0xe6, 0x6f, 0xc3, 0x17, 0xf1, 0xed, 0xd1, 0xc1, 0x3f, 0x0b, + 0x2e, 0x00, 0x5d, 0xf3, 0x98, 0x4f, 0x9b, 0x17, 0x91, 0x0e, 0x01, 0xe2, 0x65, 0x13, 0x7c, 0x7d, + 0xd6, 0x78, 0xd5, 0xff, 0x6f, 0x56, 0xfb, 0x0c, 0x8a, 0x17, 0xf9, 0x04, 0x02, 0x34, 0x66, 0xf9, + 0xf4, 0x97, 0x37, 0xa8, 0xf2, 0x19, 0xb9, 0x4a, 0xe1, 0x5b, 0x3a, 0xb8, 0x5c, 0xf0, 0x84, 0x4f, + 0x67, 0xfa, 0x0c, 0x58, 0xfa, 0xfb, 0x5a, 0x81, 0x5c, 0xae, 0x9e, 0x17, 0x68, 0xac, 0x78, 0xec, + 0xea, 0x12, 0x02, 0x08, 0x46, 0xdb, 0x9d, 0x95, 0xd4, 0x3a, 0xe1, 0xac, 0x8a, 0x01, 0x2f, 0x21, + 0xff, 0xef, 0x7b, 0x4e, 0x0b, 0x2f, 0x71, 0x48, 0x79, 0x78, 0xd3, 0xc3, 0x6b, 0x1f, 0xfe, 0x3a, + 0xff, 0x5f, 0xa1, 0xa9, 0x22, 0x71, 0xad, 0x17, 0x00, 0x00 }; // Autogenerated from wled00/data/settings_leds.htm, do not edit!! const uint16_t PAGE_settings_leds_length = 8389; const uint8_t PAGE_settings_leds[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xdd, 0x7d, 0xeb, 0x76, 0xda, 0xc8, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x7d, 0xeb, 0x76, 0xda, 0xc8, 0x96, 0xf0, 0x7f, 0x9e, 0x42, 0xae, 0xee, 0x76, 0xa4, 0x46, 0x80, 0x84, 0xc1, 0x4d, 0x00, 0xe1, 0x31, 0x76, 0x92, 0xf6, 0x1c, 0x3b, 0xf6, 0xb2, 0x9d, 0xce, 0x99, 0x95, 0xce, 0x74, 0x84, 0x28, 0x40, 0xb1, 0x90, 0x38, 0x92, 0xf0, 0x65, 0x6c, 0xcf, 0x33, 0xcd, 0x33, 0xcc, 0x93, 0x7d, 0x7b, @@ -832,7 +834,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = { // Autogenerated from wled00/data/settings_dmx.htm, do not edit!! const uint16_t PAGE_settings_dmx_length = 1740; const uint8_t PAGE_settings_dmx[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x95, 0x57, 0x5b, 0x73, 0xdb, 0x36, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x57, 0x5b, 0x73, 0xdb, 0x36, 0x16, 0x7e, 0xd7, 0xaf, 0x40, 0xf0, 0x50, 0x93, 0x23, 0x86, 0x94, 0x9c, 0x75, 0xb7, 0x91, 0x45, 0x7a, 0x63, 0xc5, 0x6b, 0x7b, 0xc7, 0x76, 0x3d, 0x51, 0xd2, 0x74, 0xa7, 0xe9, 0x74, 0x20, 0x12, 0x12, 0x51, 0x93, 0x04, 0x17, 0x00, 0x25, 0xbb, 0x69, 0xfe, 0xfb, 0x7e, 0x00, 0xa9, 0x8b, 0x6f, @@ -947,7 +949,7 @@ const uint8_t PAGE_settings_dmx[] PROGMEM = { // Autogenerated from wled00/data/settings_ui.htm, do not edit!! const uint16_t PAGE_settings_ui_length = 3345; const uint8_t PAGE_settings_ui[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x5a, 0x6b, 0x73, 0xd3, 0x48, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x5a, 0x6b, 0x73, 0xd3, 0x48, 0x16, 0xfd, 0xee, 0x5f, 0xd1, 0x34, 0x54, 0xc6, 0xaa, 0x08, 0xc5, 0x81, 0xa9, 0x5a, 0xb0, 0x2d, 0x67, 0x49, 0x60, 0x20, 0x53, 0x61, 0x60, 0x71, 0x58, 0x66, 0x8a, 0xa5, 0x32, 0xb2, 0xd4, 0xb6, 0x9b, 0xc8, 0x6a, 0x8d, 0xba, 0x15, 0x27, 0x6b, 0xfc, 0xdf, 0xf7, 0xdc, 0x6e, 0xc9, 0x96, 0x9d, @@ -1163,7 +1165,7 @@ const uint8_t PAGE_settings_ui[] PROGMEM = { // Autogenerated from wled00/data/settings_sync.htm, do not edit!! const uint16_t PAGE_settings_sync_length = 3465; const uint8_t PAGE_settings_sync[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x9d, 0x5a, 0xeb, 0x53, 0xdb, 0x48, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x5a, 0xeb, 0x53, 0xdb, 0x48, 0x12, 0xff, 0xae, 0xbf, 0x62, 0xa2, 0xab, 0xca, 0xda, 0x8b, 0xf1, 0x03, 0x30, 0x21, 0x60, 0x29, 0x07, 0x98, 0x80, 0xef, 0x20, 0x71, 0x6c, 0xd8, 0x64, 0xeb, 0xee, 0x6a, 0x6b, 0x2c, 0x8d, 0xed, 0x01, 0x49, 0xa3, 0xd5, 0x8c, 0x78, 0x54, 0x36, 0xff, 0xfb, 0x75, 0xcf, 0x48, 0xb2, 0x2d, 0xfc, @@ -1386,7 +1388,7 @@ const uint8_t PAGE_settings_sync[] PROGMEM = { // Autogenerated from wled00/data/settings_time.htm, do not edit!! const uint16_t PAGE_settings_time_length = 3437; const uint8_t PAGE_settings_time[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xd5, 0x1a, 0x6b, 0x77, 0xda, 0x38, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x77, 0xda, 0x38, 0xf6, 0x3b, 0xbf, 0x42, 0x51, 0x7b, 0x32, 0x78, 0x62, 0x9e, 0x09, 0x6d, 0x02, 0x98, 0x2c, 0x21, 0xb4, 0x49, 0x0b, 0x24, 0xa7, 0xd0, 0xc9, 0x6e, 0x1f, 0x67, 0x2a, 0xb0, 0x00, 0x25, 0x46, 0x62, 0x6d, 0x39, 0x24, 0x9b, 0xe6, 0xbf, 0xef, 0x95, 0x64, 0xcc, 0xd3, 0x49, 0xdb, 0x99, 0xfd, 0xb0, @@ -1607,7 +1609,7 @@ const uint8_t PAGE_settings_time[] PROGMEM = { // Autogenerated from wled00/data/settings_sec.htm, do not edit!! const uint16_t PAGE_settings_sec_length = 2551; const uint8_t PAGE_settings_sec[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x9d, 0x58, 0x6d, 0x53, 0xdb, 0x48, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x58, 0x6d, 0x53, 0xdb, 0x48, 0x12, 0xfe, 0xee, 0x5f, 0x31, 0x9e, 0xad, 0xca, 0x4a, 0x17, 0x21, 0x03, 0x49, 0x6d, 0x25, 0x60, 0x99, 0x83, 0x40, 0x36, 0x5c, 0x41, 0xa0, 0xb0, 0xd9, 0xdc, 0x55, 0x2e, 0x95, 0x92, 0xa5, 0xb1, 0x35, 0xb1, 0xac, 0xd1, 0xce, 0x8c, 0x70, 0x7c, 0xd9, 0xfc, 0xf7, 0x7b, 0x7a, 0x24, 0xf9, 0x85, @@ -1773,7 +1775,7 @@ const uint8_t PAGE_settings_sec[] PROGMEM = { // Autogenerated from wled00/data/settings_um.htm, do not edit!! const uint16_t PAGE_settings_um_length = 3298; const uint8_t PAGE_settings_um[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xad, 0x59, 0x6d, 0x73, 0xdb, 0x36, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x59, 0x6d, 0x73, 0xdb, 0x36, 0x12, 0xfe, 0xae, 0x5f, 0x41, 0xa3, 0x19, 0x99, 0x1c, 0xd1, 0x94, 0x9c, 0xb6, 0x33, 0x39, 0x49, 0x94, 0x2e, 0x76, 0xdc, 0xc6, 0x97, 0x17, 0x7b, 0xe2, 0xa4, 0x99, 0x1b, 0xc7, 0x17, 0x53, 0x22, 0x24, 0x21, 0xa6, 0x08, 0x96, 0x00, 0xed, 0xf8, 0x64, 0xfd, 0xf7, 0x7b, 0x16, 0x20, 0x29, 0xca, @@ -1986,7 +1988,7 @@ const uint8_t PAGE_settings_um[] PROGMEM = { // Autogenerated from wled00/data/settings_2D.htm, do not edit!! const uint16_t PAGE_settings_2D_length = 3288; const uint8_t PAGE_settings_2D[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xc5, 0x5a, 0x5b, 0x77, 0xdb, 0x36, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xc5, 0x5a, 0x5b, 0x77, 0xdb, 0x36, 0x12, 0x7e, 0xd7, 0xaf, 0x80, 0xb1, 0x5d, 0x97, 0xb4, 0xa8, 0x9b, 0x9b, 0xf6, 0xb4, 0x92, 0x28, 0x6d, 0x1c, 0xa7, 0xb1, 0xf7, 0xd8, 0x89, 0x8e, 0xe5, 0xc6, 0xc9, 0x69, 0x7b, 0x36, 0x34, 0x09, 0x49, 0x48, 0x28, 0x80, 0x25, 0x40, 0xd9, 0xae, 0xe3, 0xff, 0xbe, 0x33, 0x00, 0x6f, 0xba, 0xd8, @@ -2198,7 +2200,7 @@ const uint8_t PAGE_settings_2D[] PROGMEM = { // Autogenerated from wled00/data/settings_pin.htm, do not edit!! const uint16_t PAGE_settings_pin_length = 461; const uint8_t PAGE_settings_pin[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0x5d, 0x92, 0x4b, 0x6f, 0x13, 0x31, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x5d, 0x92, 0x4b, 0x6f, 0x13, 0x31, 0x14, 0x85, 0xf7, 0xf3, 0x2b, 0xcc, 0xdd, 0x34, 0x41, 0xc9, 0x4c, 0xa9, 0x58, 0x80, 0x6a, 0x8f, 0x50, 0xa0, 0x0b, 0x36, 0xa5, 0x52, 0xd9, 0xa0, 0xaa, 0xaa, 0x1c, 0xfb, 0x4e, 0x62, 0xd5, 0x8f, 0xc1, 0x8f, 0x84, 0x80, 0xfa, 0xdf, 0xb9, 0x9e, 0x29, 0x05, 0xb1, 0x19, 0xfb, 0x5c, 0xdb, 0xe7, diff --git a/wled00/set.cpp b/wled00/set.cpp index e61da0902..85a3b4ecd 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -32,6 +32,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) if (passlen == 0 || (passlen > 7 && !isAsterisksOnly(request->arg(F("AP")).c_str(), 65))) strlcpy(apPass, request->arg(F("AP")).c_str(), 65); int t = request->arg(F("AC")).toInt(); if (t > 0 && t < 14) apChannel = t; + force802_3g = request->hasArg(F("FG")); noWifiSleep = request->hasArg(F("WS")); #ifndef WLED_DISABLE_ESPNOW diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 505160215..8ba6b1a56 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -683,7 +683,7 @@ void WLED::initConnection() WiFi.disconnect(true); // close old connections #ifdef ESP8266 - WiFi.setPhyMode(WIFI_PHY_MODE_11N); + WiFi.setPhyMode(force802_3g ? WIFI_PHY_MODE_11G : WIFI_PHY_MODE_11N); #endif if (staticIP[0] != 0 && staticGateway[0] != 0) { diff --git a/wled00/wled.h b/wled00/wled.h index 20ceb2d38..03e197071 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -315,6 +315,7 @@ WLED_GLOBAL bool noWifiSleep _INIT(true); // disabling #else WLED_GLOBAL bool noWifiSleep _INIT(false); #endif +WLED_GLOBAL bool force802_3g _INIT(false); #ifdef WLED_USE_ETHERNET #ifdef WLED_ETH_DEFAULT // default ethernet board type if specified diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 38413383b..c7a03cf90 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -277,6 +277,7 @@ void getSettingsJS(byte subPage, char* dest) sappends('s',SET_F("AP"),fapass); sappend('v',SET_F("AC"),apChannel); + sappend('c',SET_F("FG"),force802_3g); sappend('c',SET_F("WS"),noWifiSleep); #ifndef WLED_DISABLE_ESPNOW From a3a5bffce41c39653adf405557c82726a3c8043b Mon Sep 17 00:00:00 2001 From: srg74 <28492985+srg74@users.noreply.github.com> Date: Sun, 24 Dec 2023 12:10:51 -0500 Subject: [PATCH 015/114] Update readme.md Fixed typo --- usermods/quinled-an-penta/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usermods/quinled-an-penta/readme.md b/usermods/quinled-an-penta/readme.md index 2338747d6..c1260d913 100644 --- a/usermods/quinled-an-penta/readme.md +++ b/usermods/quinled-an-penta/readme.md @@ -2,7 +2,7 @@ The (un)official usermod to get the best out of the QuinLED-An-Penta (https://quinled.info/quinled-an-penta/), e.g. using the OLED and the SHT30 temperature/humidity sensor. ## Requirements -* "u8gs" by olikraus, v2.28 or higher: https://github.com/olikraus/u8g2 +* "u8g2" by olikraus, v2.28 or higher: https://github.com/olikraus/u8g2 * "SHT85" by Rob Tillaart, v0.2 or higher: https://github.com/RobTillaart/SHT85 ## Usermod installation From 5ebc345e95e2a68d0799d23acf7acc27d94b06a9 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 25 Dec 2023 17:47:39 +0100 Subject: [PATCH 016/114] Possible bugfix for #3609 #3616 --- wled00/FX_fcn.cpp | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 08024fa9c..2a3c51de9 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -90,18 +90,21 @@ Segment::Segment(const Segment &orig) { //DEBUG_PRINTF("-- Copy segment constructor: %p -> %p\n", &orig, this); memcpy((void*)this, (void*)&orig, sizeof(Segment)); _t = nullptr; // copied segment cannot be in transition - if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } else { name = nullptr; } - if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } else { data = nullptr; _dataLen = 0; } + name = nullptr; + data = nullptr; + _dataLen = 0; + if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } + if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } } // move constructor Segment::Segment(Segment &&orig) noexcept { //DEBUG_PRINTF("-- Move segment constructor: %p -> %p\n", &orig, this); memcpy((void*)this, (void*)&orig, sizeof(Segment)); + orig._t = nullptr; // old segment cannot be in transition any more orig.name = nullptr; orig.data = nullptr; orig._dataLen = 0; - orig._t = nullptr; // old segment cannot be in transition any more } // copy assignment @@ -110,14 +113,7 @@ Segment& Segment::operator= (const Segment &orig) { if (this != &orig) { // clean destination if (name) { delete[] name; name = nullptr; } - if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } - if (_t) { - #ifndef WLED_DISABLE_MODE_BLEND - if (_t->_segT._dataT) free(_t->_segT._dataT); - #endif - delete _t; - _t = nullptr; // copied segment cannot be in transition - } + stopTransition(); deallocateData(); // copy source memcpy((void*)this, (void*)&orig, sizeof(Segment)); @@ -125,6 +121,7 @@ Segment& Segment::operator= (const Segment &orig) { data = nullptr; _dataLen = 0; // copy source data + if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } if (orig.data) { if (allocateData(orig._dataLen)) memcpy(data, orig.data, orig._dataLen); } } return *this; @@ -135,13 +132,7 @@ Segment& Segment::operator= (Segment &&orig) noexcept { //DEBUG_PRINTF("-- Moving segment: %p -> %p\n", &orig, this); if (this != &orig) { if (name) { delete[] name; name = nullptr; } // free old name - if (_t) { - #ifndef WLED_DISABLE_MODE_BLEND - if (_t->_segT._dataT) free(_t->_segT._dataT); - #endif - delete _t; - _t = nullptr; - } + stopTransition(); deallocateData(); // free old runtime data memcpy((void*)this, (void*)&orig, sizeof(Segment)); orig.name = nullptr; @@ -153,10 +144,13 @@ Segment& Segment::operator= (Segment &&orig) noexcept { } bool Segment::allocateData(size_t len) { - if (data && _dataLen == len) return true; //already allocated + if (data && _dataLen >= len) { // already allocated enough (reduce fragmentation) + if (call == 0) memset(data, 0, len); // erase buffer if called during effect initialisation + return true; + } //DEBUG_PRINTF("-- Allocating data (%d): %p\n", len, this); deallocateData(); - if (len == 0) return(false); // nothing to do + if (len == 0) return false; // nothing to do if (Segment::getUsedSegmentData() + len > MAX_SEGMENT_DATA) { // not enough memory DEBUG_PRINT(F("!!! Effect RAM depleted: ")); From 010c3494fdc7c17d638c735460b43beefa389d74 Mon Sep 17 00:00:00 2001 From: Istvan Meszaros Date: Tue, 26 Dec 2023 11:09:20 +0100 Subject: [PATCH 017/114] Make palette editor mobile friendly. --- wled00/data/cpal/cpal.htm | 32 +- wled00/html_cpal.h | 604 +++++++++++++++++++------------------- 2 files changed, 333 insertions(+), 303 deletions(-) diff --git a/wled00/data/cpal/cpal.htm b/wled00/data/cpal/cpal.htm index e9a3799c8..d91b8591f 100644 --- a/wled00/data/cpal/cpal.htm +++ b/wled00/data/cpal/cpal.htm @@ -1,6 +1,7 @@ + @@ -45,6 +46,7 @@ width: 7px; top: 50%; transform: translateY(-50%); + touch-action: none; } .color-picker-marker { height: 7px; @@ -94,9 +96,14 @@ line-height: 1; } .wrap { - width: 800px; + width: 100%; margin: 0 auto; } + @media (min-width: 800px) { + .wrap { + width: 800px; + } + } .palette { height: 20px; } @@ -136,6 +143,9 @@ .sendSpan, .editSpan{ cursor: pointer; } + h1 { + font-size: 1.6rem; + } @@ -349,24 +359,31 @@ var gradientLength = maxX - minX + 1; elmnt.onmousedown = dragMouseDown; + elmnt.ontouchstart = dragMouseDown; function dragMouseDown(e) { removeTrashcan(event) e = e || window.event; - e.preventDefault(); + var isTouch = e.type.startsWith('touch'); + if (!isTouch) e.preventDefault(); // get the mouse cursor position at startup: - mousePos = e.clientX; + mousePos = isTouch ? e.touches[0].clientX : e.clientX; d.onmouseup = closeDragElement; + d.ontouchcancel = closeDragElement; + d.ontouchend = closeDragElement; // call a function whenever the cursor moves: d.onmousemove = elementDrag; + d.ontouchmove = elementDrag; } function elementDrag(e) { e = e || window.event; - e.preventDefault(); + var isTouch = e.type.startsWith('touch'); + if (!isTouch) e.preventDefault(); // calculate the new cursor position: - posNew = mousePos - e.clientX; - mousePos = e.clientX; + var clientX = isTouch ? e.touches[0].clientX : e.clientX; + posNew = mousePos - clientX; + mousePos = clientX; mousePosInGradient = mousePos - (minX + 1) truePos = Math.round((mousePosInGradient/gradientLength)*256); @@ -393,7 +410,10 @@ function closeDragElement() { /* stop moving when mouse button is released:*/ d.onmouseup = null; + d.ontouchcancel = null; + d.ontouchend = null; d.onmousemove = null; + d.ontouchmove = null; } } diff --git a/wled00/html_cpal.h b/wled00/html_cpal.h index a20096397..b4ac5684c 100644 --- a/wled00/html_cpal.h +++ b/wled00/html_cpal.h @@ -7,302 +7,312 @@ */ // Autogenerated from wled00/data/cpal/cpal.htm, do not edit!! -const uint16_t PAGE_cpal_L = 4721; +const uint16_t PAGE_cpal_L = 4891; const uint8_t PAGE_cpal[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xbd, 0x3b, 0x7f, 0x73, 0xdb, 0xb6, - 0x92, 0xff, 0xe7, 0x53, 0x20, 0x4c, 0x5f, 0x42, 0xd6, 0x14, 0x45, 0xd2, 0xb6, 0x64, 0x4b, 0xa2, - 0x3b, 0xa9, 0x93, 0x77, 0xce, 0x8d, 0xdd, 0x64, 0x5e, 0x7c, 0x6e, 0x7b, 0x3e, 0xbf, 0x31, 0x4d, - 0x42, 0x12, 0x1b, 0x8a, 0xe0, 0x03, 0x21, 0xd9, 0xae, 0xac, 0xef, 0x7e, 0xbb, 0x00, 0x48, 0x91, - 0x94, 0xe4, 0x24, 0xd7, 0x37, 0xd7, 0xf1, 0x44, 0x20, 0xb0, 0x58, 0xec, 0x2e, 0xf6, 0x17, 0x16, - 0xe8, 0xe8, 0xe5, 0xbb, 0x8f, 0xa7, 0x97, 0xbf, 0x7f, 0x7a, 0x4f, 0xa6, 0x62, 0x96, 0x9e, 0x90, - 0x51, 0xf9, 0x43, 0xc3, 0x18, 0x7e, 0x66, 0x54, 0x84, 0x30, 0x22, 0xf2, 0x0e, 0xfd, 0xd7, 0x3c, - 0x59, 0x04, 0xc6, 0x69, 0x18, 0x4d, 0x69, 0xe7, 0x94, 0x65, 0x82, 0xb3, 0xd4, 0x20, 0x2f, 0x22, - 0x68, 0xd1, 0x4c, 0x04, 0x46, 0xc6, 0x3a, 0x11, 0x8e, 0xd9, 0x04, 0x5a, 0x85, 0x60, 0x1c, 0x5a, - 0xb3, 0x79, 0x21, 0x3a, 0x9c, 0x2e, 0xc2, 0x34, 0x89, 0x43, 0x41, 0x8d, 0x6d, 0x08, 0x3f, 0xf1, - 0x70, 0x32, 0x0b, 0xb7, 0x61, 0xda, 0x0a, 0xfe, 0xfe, 0x21, 0x4f, 0x38, 0x2d, 0x0c, 0x52, 0x81, - 0xbb, 0x08, 0x27, 0x12, 0x91, 0xd2, 0x93, 0x17, 0xbf, 0x9e, 0xbf, 0x7f, 0x47, 0x4e, 0x61, 0x55, - 0x36, 0x23, 0x9f, 0xc2, 0x94, 0x0a, 0x41, 0xc9, 0xfb, 0x38, 0x01, 0x6a, 0x46, 0x5d, 0x05, 0x42, - 0x46, 0x45, 0xc4, 0x93, 0x5c, 0x10, 0xf1, 0x98, 0xd3, 0xc0, 0x10, 0xf4, 0x41, 0x74, 0xff, 0x08, - 0x17, 0xa1, 0xea, 0x35, 0x4e, 0x5e, 0x8c, 0xe7, 0x59, 0x24, 0x12, 0x96, 0x91, 0xc9, 0x87, 0xd8, - 0xa4, 0xd6, 0x92, 0x53, 0x31, 0xe7, 0x19, 0x89, 0x9d, 0x09, 0x15, 0xef, 0x53, 0x3a, 0x83, 0x35, - 0x7f, 0x7e, 0x94, 0x43, 0xab, 0x0a, 0x34, 0x7a, 0xdf, 0x80, 0x8c, 0x38, 0x05, 0x6e, 0x35, 0x30, - 0x02, 0x2e, 0x42, 0x4e, 0xe2, 0x20, 0x66, 0xd1, 0x1c, 0x7b, 0x5e, 0x8c, 0xba, 0x6a, 0x35, 0x24, - 0x46, 0x3c, 0x22, 0xdd, 0x77, 0x2c, 0x7e, 0x5c, 0x8e, 0x81, 0xa3, 0xce, 0x38, 0x9c, 0x25, 0xe9, - 0xe3, 0xe0, 0x2d, 0x4f, 0xc2, 0xd4, 0x2e, 0xc2, 0xac, 0xe8, 0x14, 0x94, 0x27, 0xe3, 0xe1, 0x5d, - 0x18, 0x7d, 0x99, 0x70, 0x36, 0xcf, 0xe2, 0x4e, 0xc4, 0x52, 0xc6, 0x07, 0xaf, 0x3c, 0xcf, 0x1b, - 0xca, 0x29, 0x45, 0xf2, 0x27, 0x1d, 0x78, 0xbd, 0xfc, 0x61, 0xa8, 0x47, 0xe2, 0x38, 0x1e, 0xce, - 0x42, 0x3e, 0x49, 0xb2, 0x81, 0x4b, 0x3c, 0x17, 0x06, 0xd2, 0x24, 0xa3, 0x9d, 0x29, 0x4d, 0x26, - 0x53, 0x31, 0x70, 0x0e, 0x57, 0xaf, 0xf2, 0x90, 0x03, 0x21, 0x1d, 0x94, 0x61, 0x08, 0x43, 0x7c, - 0x99, 0xb3, 0x22, 0x41, 0x56, 0x06, 0x9c, 0xa6, 0xa1, 0x48, 0x16, 0x74, 0x78, 0x9f, 0xc4, 0x62, - 0x3a, 0xf0, 0x5c, 0xf7, 0x6f, 0x43, 0x3d, 0xd1, 0x07, 0x4c, 0xab, 0x57, 0x77, 0x4c, 0x80, 0x74, - 0x4f, 0x37, 0x67, 0x86, 0x77, 0x05, 0x4b, 0xe7, 0x82, 0xea, 0xa5, 0x3b, 0x82, 0xe5, 0x83, 0x43, - 0x39, 0x65, 0xc2, 0xc3, 0x38, 0xc1, 0xf5, 0xee, 0xd8, 0xc3, 0x72, 0x13, 0x2f, 0xb6, 0x57, 0x8e, - 0xa4, 0xbd, 0x03, 0x73, 0xbf, 0x50, 0x6e, 0xeb, 0xaf, 0x3c, 0x89, 0xe0, 0x4b, 0x77, 0x6e, 0x59, - 0xe9, 0x8e, 0xf1, 0x18, 0xc6, 0x11, 0xfd, 0xbc, 0x18, 0xec, 0x03, 0xa3, 0x1b, 0x62, 0x2a, 0x92, - 0x74, 0x41, 0xb9, 0x86, 0x1c, 0xf8, 0xf9, 0x03, 0x81, 0xb9, 0x49, 0x4c, 0xf8, 0xe4, 0x2e, 0x34, - 0x7b, 0x47, 0xb6, 0xfa, 0x73, 0x0e, 0xad, 0xe1, 0x9f, 0x9d, 0x24, 0x8b, 0xe9, 0xc3, 0xc0, 0x6f, - 0xd2, 0xb2, 0xd4, 0x54, 0xee, 0xa3, 0x1c, 0x15, 0xf1, 0x7d, 0x68, 0x29, 0xee, 0xfe, 0x36, 0x14, - 0x1c, 0xf6, 0x68, 0xcc, 0xf8, 0x6c, 0x20, 0x5b, 0x20, 0x3c, 0xfa, 0xbb, 0xd9, 0x81, 0x11, 0x6b, - 0xb5, 0x95, 0x09, 0x8d, 0xad, 0xbf, 0x81, 0xcc, 0x3b, 0x44, 0x29, 0xc4, 0x14, 0x94, 0x96, 0xee, - 0xe6, 0x58, 0x4f, 0x3f, 0xac, 0xa6, 0x63, 0xeb, 0x1b, 0xc4, 0xf0, 0x6a, 0x3c, 0x1e, 0x97, 0x42, - 0xd8, 0xaf, 0x84, 0xf0, 0xea, 0xf8, 0xce, 0x3f, 0xf2, 0x8f, 0xe4, 0xfa, 0xbe, 0x0f, 0xdc, 0x6c, - 0xc8, 0x40, 0x11, 0xbf, 0x9b, 0x10, 0xaf, 0x22, 0xc4, 0xab, 0x08, 0x91, 0xcd, 0x92, 0xa5, 0x0a, - 0xa5, 0x57, 0x92, 0x59, 0x53, 0xdf, 0xad, 0x4a, 0xbd, 0x72, 0xee, 0xe6, 0xa0, 0x62, 0x59, 0x94, - 0x86, 0x45, 0xb1, 0xcc, 0xc3, 0x38, 0x4e, 0xb2, 0xc9, 0xc0, 0xad, 0x34, 0x7a, 0x08, 0xfb, 0x29, - 0x92, 0x28, 0x4c, 0x3b, 0xe0, 0x56, 0x26, 0xd9, 0x40, 0x29, 0xe4, 0x0e, 0x5c, 0x6d, 0x75, 0x25, - 0x45, 0x1e, 0x66, 0xcb, 0x38, 0x29, 0xf2, 0x34, 0x7c, 0x1c, 0x24, 0x99, 0x34, 0x8c, 0x71, 0x4a, - 0x1f, 0x86, 0x12, 0x59, 0x27, 0x11, 0x74, 0x56, 0x0c, 0x22, 0x50, 0x56, 0x50, 0x9a, 0x9a, 0xe8, - 0x6a, 0x86, 0x06, 0x3a, 0xd4, 0x26, 0x61, 0x96, 0xc4, 0x71, 0x4a, 0x57, 0xaf, 0x92, 0x6c, 0xcc, - 0x2a, 0xe4, 0x86, 0x31, 0x44, 0xef, 0xa2, 0x41, 0xbe, 0x8a, 0x72, 0xd3, 0x02, 0x6b, 0x76, 0xb4, - 0x61, 0xc4, 0x20, 0xa5, 0x7b, 0x1e, 0xe6, 0xda, 0x9a, 0x8e, 0x5c, 0x1c, 0xaf, 0x4c, 0x3e, 0x9c, - 0x0b, 0xb6, 0x72, 0x72, 0xe5, 0xff, 0x96, 0x75, 0xeb, 0x2d, 0x3b, 0xff, 0x43, 0x5b, 0x64, 0xb1, - 0x44, 0xde, 0x61, 0x6f, 0x6a, 0x40, 0x9b, 0xea, 0x54, 0x4d, 0x2b, 0x2e, 0x40, 0x88, 0xcb, 0x96, - 0x7d, 0xd7, 0x3c, 0x85, 0x04, 0xbc, 0x64, 0x79, 0xb9, 0xe6, 0x38, 0x51, 0x3e, 0x06, 0x56, 0xfa, - 0x8b, 0xb2, 0x68, 0xf1, 0x0e, 0xcb, 0x94, 0x2c, 0x7c, 0x92, 0xae, 0xac, 0x92, 0xfa, 0xae, 0xbd, - 0xdc, 0x42, 0x51, 0x5b, 0xbe, 0xff, 0x56, 0x0a, 0x95, 0x0e, 0x17, 0xef, 0x92, 0xc5, 0x56, 0x6d, - 0xd3, 0x6b, 0xa7, 0x74, 0xdc, 0x30, 0x66, 0xb9, 0x47, 0x14, 0x02, 0xd6, 0x67, 0x50, 0x53, 0xdb, - 0x29, 0x68, 0x16, 0x63, 0x6b, 0x19, 0xcd, 0x79, 0x01, 0x94, 0xe4, 0x2c, 0x41, 0xba, 0x56, 0x18, - 0x41, 0x64, 0xe0, 0x20, 0xa3, 0xae, 0x0e, 0xd4, 0x18, 0x41, 0xe0, 0x27, 0x4e, 0x16, 0x24, 0x89, - 0x03, 0x03, 0x95, 0x03, 0x62, 0x24, 0x9a, 0x90, 0xfe, 0xd0, 0x83, 0x2f, 0xe4, 0xc4, 0xc0, 0x68, - 0xc8, 0xeb, 0x0f, 0x88, 0x98, 0xc9, 0xf8, 0xb1, 0x94, 0x8c, 0x66, 0x1f, 0xa7, 0x4c, 0xbd, 0xed, - 0x33, 0x36, 0x25, 0x8c, 0xd0, 0xc5, 0x62, 0x52, 0x81, 0x2b, 0x8e, 0xf6, 0x31, 0x2c, 0x95, 0x1e, - 0xb4, 0x57, 0x29, 0x69, 0x87, 0xcb, 0x1e, 0xe8, 0x30, 0xc8, 0x22, 0xa1, 0xf7, 0x3f, 0xb3, 0x07, - 0x08, 0xe4, 0xc4, 0x25, 0xfb, 0x3e, 0xfc, 0x19, 0x27, 0xa3, 0x3c, 0x14, 0x53, 0xf2, 0x62, 0x9c, - 0xa4, 0x69, 0x60, 0xbc, 0x72, 0xdd, 0x7d, 0xd8, 0x02, 0x03, 0x42, 0xa8, 0x71, 0xd1, 0x23, 0xbe, - 0x3f, 0x3d, 0x5a, 0x1c, 0x9c, 0xf5, 0xfe, 0xbc, 0xf0, 0x0e, 0x88, 0x77, 0x30, 0x3d, 0x58, 0x1c, - 0x4d, 0x3b, 0x07, 0xf0, 0x75, 0x04, 0xb1, 0xae, 0xfa, 0xf2, 0x7d, 0xd2, 0x43, 0xb8, 0x69, 0xe7, - 0xe8, 0x4f, 0xa3, 0x7b, 0x02, 0x02, 0x5b, 0x4c, 0x4e, 0x5e, 0x00, 0x89, 0x20, 0x4e, 0x29, 0x21, - 0x94, 0x9b, 0x71, 0xf2, 0x5c, 0xc2, 0x80, 0xa0, 0x52, 0xc2, 0x1e, 0xfe, 0x0b, 0xc2, 0x2b, 0x45, - 0x88, 0xd3, 0xdb, 0x11, 0xd4, 0xa8, 0x09, 0xbf, 0x1e, 0xef, 0x80, 0x17, 0x3d, 0xb5, 0x8e, 0xe1, - 0xfb, 0x36, 0xa1, 0xc4, 0x5b, 0x5a, 0x21, 0x26, 0x4b, 0x6a, 0x67, 0xeb, 0x76, 0xd9, 0x82, 0x04, - 0x33, 0xac, 0x14, 0x40, 0x7f, 0x02, 0xff, 0xa7, 0x73, 0x8e, 0x74, 0xa7, 0x8f, 0x24, 0xc9, 0xc8, - 0xbc, 0xa0, 0x24, 0x52, 0xbc, 0x97, 0x88, 0x48, 0x8b, 0xda, 0xbf, 0x4e, 0x34, 0xfa, 0x44, 0xb9, - 0x72, 0x0a, 0xa1, 0x84, 0x40, 0xb2, 0x24, 0xa6, 0x94, 0x94, 0x12, 0x22, 0x54, 0xca, 0x9a, 0x08, - 0x46, 0xc0, 0xcf, 0x93, 0x8c, 0xde, 0x13, 0x69, 0x73, 0xa4, 0x80, 0xf0, 0x04, 0x79, 0x00, 0x02, - 0xab, 0x19, 0xb2, 0x9b, 0xc6, 0x04, 0x44, 0x4a, 0xee, 0x68, 0xca, 0xee, 0x65, 0xaf, 0x02, 0xc3, - 0xe9, 0xd1, 0x34, 0xcc, 0x26, 0x94, 0x24, 0xa2, 0x50, 0xa0, 0x8e, 0x5e, 0x10, 0xa1, 0x9a, 0xf3, - 0x20, 0x1c, 0x81, 0xeb, 0xc6, 0x55, 0xcd, 0x30, 0x8b, 0x31, 0x8f, 0x1c, 0x27, 0x7c, 0x66, 0x21, - 0x12, 0x15, 0x7d, 0x1d, 0xf2, 0x31, 0x8b, 0x28, 0x19, 0x27, 0x59, 0x52, 0x4c, 0x69, 0x6c, 0x83, - 0x14, 0x4b, 0x4c, 0x21, 0xe7, 0x88, 0x21, 0x42, 0x36, 0x18, 0x99, 0xe7, 0x29, 0x0b, 0x63, 0x40, - 0x08, 0x6d, 0x1c, 0x8d, 0x69, 0x91, 0xe0, 0x5a, 0x45, 0xca, 0x84, 0x43, 0x2e, 0x99, 0xe4, 0x8e, - 0xd0, 0x87, 0x04, 0x64, 0x94, 0x4d, 0x4a, 0x19, 0xd7, 0xf1, 0xe5, 0x34, 0x8b, 0x92, 0x54, 0x22, - 0x74, 0xc8, 0x8b, 0x2d, 0x42, 0xff, 0x7e, 0x99, 0x4b, 0xed, 0x2c, 0x04, 0x38, 0xa5, 0xe8, 0x53, - 0xa5, 0x2f, 0x5f, 0x51, 0x17, 0x04, 0xdf, 0xa9, 0x32, 0x6f, 0x17, 0x61, 0x92, 0x86, 0x77, 0x29, - 0x48, 0x5b, 0x62, 0xfd, 0x9a, 0xae, 0xc8, 0x9f, 0x51, 0x57, 0x3b, 0x24, 0x9d, 0x6d, 0xbf, 0xd8, - 0x95, 0x6e, 0x63, 0x6a, 0x5c, 0x6a, 0x03, 0x7a, 0x01, 0xcc, 0xba, 0x9b, 0x06, 0x64, 0xd9, 0x11, - 0xac, 0x18, 0x05, 0x1d, 0xcf, 0xce, 0x1f, 0x4e, 0x59, 0x1a, 0x2c, 0x57, 0xb6, 0xd0, 0xbf, 0x9c, - 0x46, 0x22, 0xa8, 0x4d, 0xc7, 0x24, 0xfd, 0x67, 0xcc, 0x01, 0x40, 0xde, 0xb0, 0xff, 0xd0, 0xf9, - 0x0f, 0x80, 0x30, 0x2d, 0xbb, 0x84, 0x39, 0xa7, 0xd9, 0x44, 0x4c, 0x03, 0x9c, 0xe7, 0x48, 0x0f, - 0x65, 0xcf, 0x3e, 0x8e, 0xc7, 0x45, 0x70, 0x01, 0xfe, 0xc6, 0x91, 0xd9, 0x83, 0xd9, 0x04, 0xed, - 0xfa, 0x87, 0xbd, 0xae, 0x6f, 0x75, 0x0e, 0x6d, 0xcd, 0xf6, 0x5b, 0xce, 0xc3, 0xc7, 0xe0, 0xfa, - 0xc6, 0x06, 0x87, 0xf2, 0x39, 0x5c, 0xd0, 0xe0, 0x8d, 0x74, 0x7b, 0x0d, 0xaf, 0xe7, 0x1f, 0xae, - 0xbd, 0x1e, 0xb6, 0x5b, 0x4e, 0xce, 0x3f, 0x80, 0xbf, 0xd2, 0xc9, 0x49, 0x1f, 0x87, 0x21, 0x46, - 0xba, 0x37, 0xdf, 0xb7, 0x3d, 0xff, 0xad, 0xe7, 0xda, 0x1e, 0x02, 0xc2, 0x0f, 0xf1, 0x7c, 0xdb, - 0x6f, 0xf6, 0x6c, 0x05, 0x69, 0x42, 0x20, 0xc8, 0x45, 0x1f, 0xfe, 0x39, 0x87, 0x31, 0xaf, 0x7f, - 0xe5, 0x1d, 0x9c, 0x79, 0xbd, 0x2b, 0xcf, 0x3d, 0xf3, 0xfc, 0xab, 0xfe, 0x39, 0x0e, 0xfc, 0x77, - 0xe5, 0x14, 0xdf, 0x20, 0x27, 0xe8, 0xf3, 0xfe, 0xbd, 0x9c, 0x20, 0x51, 0xa7, 0x3d, 0xe7, 0xa0, - 0x6f, 0xfb, 0x40, 0x31, 0x36, 0x24, 0xe1, 0xa7, 0x48, 0x8f, 0x73, 0xb8, 0x4f, 0xd4, 0x90, 0xaf, - 0xf8, 0x3b, 0x95, 0x7d, 0xf8, 0xe9, 0x97, 0xe3, 0xbe, 0x82, 0xd6, 0x53, 0xf5, 0xb8, 0x84, 0xbe, - 0xf0, 0x0e, 0x1d, 0xcf, 0xee, 0x3b, 0x6e, 0xff, 0x14, 0x5a, 0xfe, 0x81, 0x6c, 0x12, 0x68, 0xee, - 0x1f, 0x41, 0xd3, 0xf3, 0xb1, 0x79, 0x08, 0x2d, 0x7f, 0xff, 0xdc, 0xeb, 0x39, 0xfd, 0xbe, 0x7d, - 0xe4, 0x1c, 0xc2, 0x02, 0xf0, 0xd3, 0x87, 0xb1, 0xbe, 0x7d, 0x2c, 0xc1, 0xe5, 0xc8, 0xb1, 0xe3, - 0x1f, 0x9d, 0x03, 0x38, 0x34, 0x3d, 0x57, 0xb6, 0xf7, 0x01, 0x08, 0x20, 0x71, 0xee, 0x01, 0x36, - 0x11, 0xcd, 0x29, 0x34, 0x8f, 0x7c, 0x8d, 0xfb, 0xc0, 0x39, 0xee, 0x55, 0x2b, 0x2a, 0x32, 0x2e, - 0x60, 0x96, 0xb7, 0x0f, 0xb3, 0x8e, 0x3c, 0x44, 0xe6, 0x1d, 0x23, 0xb2, 0xa3, 0xfe, 0xf9, 0x31, - 0xf6, 0xc2, 0x42, 0xc7, 0xfb, 0x67, 0x08, 0x76, 0x85, 0x68, 0xfa, 0xe7, 0x6b, 0xe0, 0xda, 0x1e, - 0x0c, 0xab, 0xb3, 0x24, 0xa8, 0xe6, 0xc7, 0xb1, 0x89, 0xa7, 0xc9, 0xff, 0x37, 0xd5, 0xae, 0x1d, - 0x64, 0xd3, 0xe4, 0xcb, 0xc7, 0xac, 0x4c, 0xad, 0xd4, 0xa1, 0x76, 0xc6, 0x16, 0xf4, 0x92, 0x87, - 0xc5, 0x34, 0x0a, 0x33, 0xe8, 0xb1, 0xc1, 0x51, 0x9f, 0x9a, 0x35, 0xa4, 0xd4, 0x61, 0xb0, 0x0c, - 0x15, 0xbf, 0x75, 0x9b, 0xe8, 0x7f, 0x04, 0xf4, 0x56, 0xed, 0x90, 0x2c, 0xe7, 0x51, 0x1b, 0x4e, - 0xec, 0x86, 0xb5, 0x04, 0x53, 0x22, 0x1c, 0x4d, 0x9a, 0x05, 0x2f, 0x3d, 0xc8, 0xb3, 0xb2, 0x42, - 0x90, 0xb0, 0xc1, 0xee, 0xbf, 0xe6, 0x94, 0x3f, 0x7e, 0x06, 0x87, 0x1c, 0x81, 0xab, 0x7e, 0x9b, - 0xa6, 0xa6, 0xd1, 0x38, 0x96, 0x19, 0xd6, 0x30, 0x19, 0x9b, 0xa1, 0x03, 0x47, 0xaf, 0xf7, 0x61, - 0x34, 0x35, 0x4d, 0x61, 0x73, 0x2b, 0x38, 0x59, 0x0a, 0x94, 0xd3, 0x5b, 0x21, 0x78, 0x02, 0x19, - 0x18, 0x35, 0x8d, 0x38, 0x14, 0x61, 0x47, 0xf0, 0x39, 0x85, 0x8c, 0xcd, 0xb0, 0x82, 0x80, 0xbe, - 0x7e, 0x6d, 0xc2, 0x9a, 0xae, 0xb5, 0x02, 0x4e, 0x9c, 0x54, 0x52, 0x7a, 0xe2, 0xf5, 0xcb, 0x5e, - 0x9b, 0x59, 0xea, 0x18, 0x8f, 0xd8, 0xe9, 0x89, 0xfb, 0xfa, 0x35, 0x1d, 0xf9, 0x87, 0x87, 0x16, - 0x2c, 0x63, 0xa2, 0xab, 0xca, 0x02, 0x6f, 0x98, 0x8d, 0x02, 0xaf, 0xf7, 0xfa, 0x35, 0x1f, 0x41, - 0x73, 0x6f, 0xcf, 0x92, 0x1e, 0x4b, 0x92, 0x76, 0xa1, 0x28, 0xdb, 0xcb, 0xac, 0xa7, 0x27, 0x93, - 0x07, 0x99, 0x35, 0xa4, 0x29, 0x84, 0x58, 0x1e, 0xd0, 0xa1, 0x61, 0x04, 0x81, 0x80, 0x45, 0x80, - 0xfb, 0x57, 0xc6, 0x9e, 0xe9, 0xf5, 0xfa, 0xfd, 0xbe, 0xef, 0x1d, 0xfe, 0xa8, 0xe4, 0x08, 0x71, - 0x88, 0xcd, 0x4c, 0x6b, 0x34, 0x72, 0x2d, 0x47, 0xb0, 0xcf, 0x40, 0x7c, 0x36, 0x01, 0x18, 0x0b, - 0xf2, 0xdc, 0xf8, 0xb3, 0x08, 0xb9, 0x30, 0x7b, 0xb6, 0xe1, 0x1a, 0x96, 0xa5, 0x25, 0x95, 0x06, - 0xd1, 0x7b, 0xd3, 0xc0, 0xfc, 0x04, 0xc4, 0x90, 0x3a, 0xd2, 0x65, 0xff, 0x12, 0xce, 0xc0, 0x6a, - 0x1b, 0x22, 0xb2, 0x53, 0x07, 0xbd, 0x7b, 0x83, 0x36, 0xbe, 0x5e, 0xc0, 0x82, 0xf1, 0x62, 0xb7, - 0xb0, 0x6c, 0xfa, 0x0c, 0x00, 0xe0, 0x34, 0x6c, 0xb1, 0x03, 0x40, 0xe9, 0x83, 0xa1, 0xf4, 0x0f, - 0x61, 0x60, 0xeb, 0xdf, 0x2f, 0x50, 0x31, 0x20, 0x12, 0x52, 0x48, 0x96, 0x40, 0x5e, 0x18, 0x02, - 0x0d, 0x1b, 0x72, 0x8f, 0xfc, 0xef, 0x73, 0x0e, 0xa1, 0x90, 0x7f, 0xe2, 0x2c, 0x97, 0xf8, 0xd0, - 0xfd, 0x38, 0x98, 0x18, 0x3f, 0xaf, 0xb9, 0x3f, 0x52, 0x6b, 0x4f, 0x2e, 0xb0, 0x67, 0x80, 0x5b, - 0xd2, 0x82, 0x49, 0xa4, 0x60, 0x92, 0x2c, 0x9f, 0x0b, 0x54, 0x10, 0x47, 0x45, 0x1d, 0x29, 0x00, - 0xc3, 0x4e, 0x9c, 0x45, 0x98, 0xce, 0x69, 0x20, 0xa0, 0xb5, 0x21, 0x32, 0x75, 0xd0, 0x45, 0xa0, - 0x4a, 0x64, 0x9f, 0x54, 0x57, 0x53, 0x64, 0xc9, 0x16, 0x66, 0xd4, 0x7a, 0xf6, 0x3c, 0xc7, 0x22, - 0x57, 0x69, 0x3c, 0xdb, 0x41, 0x35, 0xdf, 0x51, 0x7e, 0x9a, 0x7e, 0x29, 0x77, 0xb3, 0xa8, 0xef, - 0x66, 0xb1, 0x8b, 0xb4, 0x6a, 0x53, 0x8b, 0x36, 0x85, 0x5b, 0xb7, 0xb6, 0x78, 0x66, 0x71, 0x96, - 0xe2, 0xea, 0x00, 0x52, 0x93, 0x75, 0x5d, 0xf0, 0x40, 0xf9, 0x8e, 0x11, 0x4d, 0x71, 0x5c, 0xa7, - 0x98, 0xa3, 0x95, 0x70, 0xb4, 0x12, 0xd0, 0xef, 0xb8, 0x4e, 0x7e, 0xa3, 0x98, 0x61, 0xd8, 0xb1, - 0x24, 0x5c, 0x75, 0x6e, 0xa5, 0x39, 0xde, 0x4d, 0x33, 0x05, 0xd3, 0x56, 0x33, 0x4f, 0x91, 0x71, - 0x2c, 0xaa, 0x21, 0xfc, 0x0e, 0x32, 0xd7, 0x7a, 0xb4, 0xae, 0x0a, 0xc8, 0x79, 0x81, 0xd6, 0x81, - 0x8a, 0xf7, 0x5d, 0xe3, 0x75, 0x4f, 0x14, 0xe6, 0x90, 0xa6, 0xc5, 0xa7, 0xd3, 0x24, 0x8d, 0xcd, - 0xc4, 0xda, 0x39, 0x94, 0xee, 0x1e, 0x02, 0x23, 0x70, 0x5f, 0x06, 0xfc, 0xf5, 0x6b, 0x10, 0x92, - 0xfc, 0xdd, 0x05, 0x18, 0x5b, 0x76, 0x5d, 0x9c, 0xb3, 0xf0, 0x0b, 0xbd, 0xa0, 0xef, 0x78, 0x38, - 0x31, 0xd1, 0xcb, 0xa0, 0x39, 0x5b, 0xb0, 0x6f, 0x54, 0x5c, 0x32, 0x96, 0x8a, 0x24, 0x57, 0x52, - 0xac, 0x8f, 0x35, 0x75, 0xd0, 0xac, 0xb9, 0xdf, 0xf6, 0xc8, 0x52, 0x6d, 0x25, 0xfd, 0x4e, 0xa7, - 0xbb, 0x91, 0x82, 0xd1, 0x0d, 0x17, 0xac, 0x10, 0x33, 0x99, 0xca, 0xd1, 0x6b, 0x7e, 0x03, 0x94, - 0x39, 0x9c, 0x42, 0xfe, 0x1a, 0xd1, 0xa6, 0xa3, 0xb4, 0x1b, 0x76, 0x66, 0x59, 0x4a, 0xf6, 0xc3, - 0xef, 0x9b, 0xa7, 0xfb, 0x60, 0xf6, 0xf6, 0x1d, 0x65, 0xb6, 0xc4, 0xf5, 0xfc, 0xe0, 0x33, 0x4e, - 0x8e, 0x59, 0x55, 0x78, 0x92, 0xb0, 0xcf, 0x85, 0x17, 0x3b, 0xfb, 0x8a, 0xcf, 0x0a, 0xb5, 0x00, - 0xaf, 0xb3, 0x1b, 0x58, 0x1b, 0x45, 0x78, 0x1d, 0x42, 0x6b, 0xb5, 0x56, 0x1d, 0x65, 0x0c, 0x81, - 0x81, 0xa5, 0x82, 0x90, 0x77, 0xca, 0x6e, 0x13, 0x8e, 0x18, 0xf2, 0xcc, 0x6c, 0xd8, 0x1f, 0xef, - 0xfe, 0xc0, 0x10, 0x0f, 0x9d, 0x3c, 0xa1, 0x85, 0x29, 0xf1, 0x59, 0xeb, 0x4d, 0xb8, 0x86, 0x10, - 0x7b, 0x83, 0xdb, 0xd0, 0xc4, 0xb8, 0x17, 0xdc, 0xda, 0xe4, 0x87, 0xa5, 0x58, 0xc1, 0x3f, 0x74, - 0x95, 0x3f, 0xdc, 0x6e, 0xac, 0xb9, 0x17, 0x18, 0x96, 0xd1, 0x50, 0xe1, 0xb6, 0xcc, 0x82, 0xe6, - 0x84, 0xb5, 0x6e, 0xb5, 0xdc, 0x38, 0xe6, 0x0d, 0xd4, 0xc1, 0x4e, 0xfc, 0x0a, 0x27, 0x21, 0x02, - 0xd5, 0x75, 0x51, 0x79, 0xa0, 0xed, 0xe9, 0xc5, 0x96, 0x89, 0xb6, 0xd4, 0x08, 0xa7, 0xe0, 0x91, - 0xae, 0xa9, 0x37, 0x34, 0xa3, 0x52, 0x0a, 0xd4, 0x01, 0xe9, 0x2e, 0x1a, 0x4b, 0xe5, 0x3b, 0x56, - 0x5a, 0x48, 0x1f, 0xfd, 0x2c, 0x99, 0x35, 0xf3, 0x03, 0x04, 0x18, 0xfe, 0x45, 0xe0, 0xda, 0xfc, - 0x9b, 0xb2, 0x32, 0x16, 0x70, 0x47, 0x6e, 0x98, 0x1d, 0x42, 0x4b, 0x7a, 0xd5, 0x2c, 0x60, 0x9d, - 0x70, 0xcf, 0x5b, 0xa7, 0x7a, 0xa9, 0xc9, 0xad, 0x25, 0x24, 0x0a, 0xfc, 0xe9, 0xe9, 0x1e, 0x4e, - 0xa5, 0xec, 0xde, 0x51, 0x54, 0x39, 0x39, 0x97, 0x8d, 0x77, 0x74, 0x1c, 0xce, 0x53, 0xc4, 0x26, - 0x3a, 0x1c, 0x59, 0x83, 0xbe, 0xdf, 0x20, 0x81, 0x5a, 0xb7, 0x67, 0x0c, 0xce, 0xf0, 0x9f, 0x58, - 0xf1, 0xa1, 0xca, 0xd9, 0x02, 0xd1, 0x31, 0x61, 0x11, 0x98, 0x02, 0x4a, 0x09, 0x23, 0x75, 0x85, - 0xdc, 0x84, 0xee, 0x66, 0x32, 0x4b, 0xb3, 0x59, 0x1a, 0x5f, 0x6a, 0x78, 0xfa, 0xbc, 0x86, 0x6b, - 0xb4, 0xe8, 0xa4, 0x74, 0x53, 0xb9, 0xaa, 0x35, 0x86, 0x97, 0x81, 0x1e, 0xc0, 0x74, 0x47, 0x83, - 0xf4, 0x0e, 0x7e, 0x12, 0xd3, 0xa4, 0xf8, 0x28, 0x13, 0x83, 0xc0, 0x1d, 0x94, 0x58, 0xbc, 0x63, - 0xbf, 0x3e, 0xd0, 0x1f, 0xd4, 0x3e, 0xf6, 0xe5, 0xe6, 0x6c, 0x4b, 0x06, 0x32, 0x69, 0x4b, 0x1a, - 0x47, 0x3d, 0x0b, 0xd0, 0x8a, 0xf2, 0x7f, 0xf2, 0x1b, 0x72, 0x91, 0xfa, 0x8a, 0x5f, 0x45, 0xd6, - 0x88, 0x64, 0x7f, 0x01, 0x4f, 0xcb, 0x09, 0xee, 0x42, 0x43, 0x9f, 0x4d, 0xd6, 0x4a, 0x69, 0x6c, - 0x46, 0x07, 0xba, 0x19, 0x15, 0x6a, 0x3a, 0x9e, 0x40, 0x24, 0x88, 0x1d, 0x96, 0x49, 0xdd, 0x98, - 0xe7, 0x41, 0x36, 0x4f, 0x53, 0xbb, 0xea, 0x40, 0x93, 0x91, 0x5d, 0x2b, 0x5a, 0x76, 0x81, 0x9a, - 0x66, 0x41, 0x39, 0x7d, 0xb7, 0x61, 0x99, 0x34, 0xa0, 0x5f, 0x57, 0x6b, 0xe0, 0xb0, 0x54, 0xe5, - 0x3a, 0x11, 0x49, 0x8b, 0x82, 0x74, 0x55, 0xf3, 0x35, 0x9b, 0xfc, 0x2d, 0xdb, 0xa2, 0x91, 0x57, - 0x7d, 0x86, 0x7d, 0x0b, 0xae, 0xee, 0x59, 0x6d, 0x5e, 0x91, 0x01, 0x79, 0x06, 0x06, 0xfd, 0xbf, - 0xb5, 0xba, 0xad, 0x49, 0xab, 0x99, 0x82, 0x68, 0x97, 0x80, 0xb9, 0x50, 0x9c, 0x2c, 0x20, 0x38, - 0xa2, 0xf6, 0xbe, 0xab, 0x69, 0x45, 0x50, 0x77, 0x5a, 0x36, 0x8e, 0x9e, 0xae, 0x77, 0x5e, 0xc6, - 0xc7, 0xf6, 0x8c, 0x86, 0x9a, 0xa8, 0xd5, 0x4a, 0x0d, 0x01, 0xdd, 0x58, 0xa3, 0xa8, 0xeb, 0xf0, - 0xf7, 0x22, 0xaa, 0x54, 0xad, 0x8d, 0xee, 0x5b, 0x11, 0xed, 0xd0, 0x5c, 0x9b, 0x43, 0x1e, 0x43, - 0xb9, 0x32, 0xdf, 0xdf, 0x02, 0xcf, 0xd5, 0x1d, 0xbf, 0x35, 0xc4, 0xb0, 0xcb, 0x63, 0x3a, 0x0f, - 0x9d, 0xc6, 0x7c, 0x3d, 0xf9, 0xf7, 0x6f, 0x9b, 0xfc, 0xb8, 0x07, 0x67, 0x6a, 0x21, 0x13, 0x4c, - 0x81, 0x9a, 0x68, 0xe0, 0x47, 0x06, 0x19, 0xe4, 0xd9, 0xe5, 0xc5, 0xb9, 0x2e, 0x6c, 0x6c, 0xa9, - 0x5c, 0x90, 0x87, 0x59, 0x9a, 0x15, 0x81, 0x81, 0x37, 0xcc, 0x83, 0x6e, 0xf7, 0xfe, 0xfe, 0xde, - 0xb9, 0xdf, 0x77, 0x18, 0x9f, 0x74, 0x7d, 0xd7, 0x75, 0xf1, 0x68, 0x6e, 0x10, 0x79, 0x96, 0x0e, - 0x0c, 0xbc, 0xff, 0x33, 0x88, 0x2a, 0x85, 0xe8, 0x2f, 0x5d, 0xf7, 0xd0, 0x05, 0x13, 0x2c, 0x7f, - 0x0c, 0x5e, 0x1d, 0x1d, 0xc1, 0x44, 0x77, 0x08, 0x9d, 0x9c, 0x7d, 0xa1, 0x03, 0x02, 0x1d, 0xf8, - 0x5f, 0xd9, 0xd1, 0x51, 0x65, 0x15, 0xd2, 0xc1, 0x4b, 0x04, 0xdd, 0x15, 0x03, 0xbd, 0x21, 0x56, - 0x95, 0x06, 0xc4, 0x75, 0x3c, 0x9b, 0x1c, 0x0d, 0x55, 0xa9, 0xfb, 0xd8, 0xde, 0xbf, 0x3a, 0x38, - 0x3b, 0xb8, 0xea, 0x9d, 0x1d, 0x5e, 0x79, 0xc7, 0x6f, 0x7d, 0xdb, 0x97, 0xe5, 0x1d, 0x97, 0xf4, - 0x6d, 0xdf, 0x3b, 0xf3, 0xfa, 0xb5, 0x1e, 0x2c, 0x39, 0x1c, 0x03, 0xa0, 0xef, 0xc2, 0x0c, 0xef, - 0xf0, 0x6a, 0xff, 0xec, 0xf8, 0xa2, 0x6f, 0xf7, 0xce, 0xb0, 0xf4, 0x73, 0x7c, 0xd6, 0xbf, 0xea, - 0x01, 0xb2, 0xa3, 0x2b, 0xaf, 0x7f, 0xe6, 0x79, 0x57, 0x47, 0x30, 0x86, 0x05, 0x08, 0xf9, 0x79, - 0x08, 0x9f, 0xde, 0x7e, 0xbd, 0x18, 0x24, 0xb4, 0xcf, 0x29, 0x6f, 0x38, 0x02, 0xa3, 0xbc, 0xf3, - 0x33, 0xaa, 0x31, 0xe9, 0x9c, 0xf4, 0xe6, 0x2a, 0xc7, 0x5b, 0x8e, 0x40, 0x30, 0xd5, 0x03, 0xbf, - 0xab, 0x81, 0xd8, 0xc1, 0x42, 0x60, 0x23, 0xc9, 0x05, 0xef, 0x20, 0x9e, 0xcf, 0xf4, 0x85, 0xa3, - 0xca, 0xeb, 0xbf, 0xb0, 0x98, 0x3a, 0xca, 0xbf, 0xac, 0xa7, 0xb6, 0xf5, 0x73, 0x17, 0x68, 0x0b, - 0x6e, 0x87, 0xf1, 0x3c, 0x37, 0x7d, 0x03, 0xd8, 0x6a, 0xdb, 0xf0, 0x57, 0x67, 0xef, 0x58, 0xfb, - 0x1b, 0x57, 0xdd, 0x92, 0xcf, 0x6f, 0x4f, 0x90, 0x9e, 0x39, 0x39, 0x35, 0xdd, 0xf3, 0x57, 0x32, - 0x9e, 0x8d, 0x74, 0x6c, 0x29, 0xad, 0x49, 0x55, 0x65, 0x95, 0x61, 0x21, 0x06, 0x11, 0x72, 0x30, - 0x44, 0x0c, 0xf4, 0xd0, 0x83, 0x89, 0x80, 0xfc, 0x31, 0xe5, 0xef, 0x4e, 0xd6, 0x70, 0x10, 0x29, - 0x55, 0x9d, 0xdf, 0x44, 0x6c, 0x3d, 0x8f, 0x9b, 0x7e, 0xf9, 0xb5, 0x7e, 0x68, 0x41, 0x82, 0xe4, - 0xbd, 0x16, 0x46, 0x11, 0xf9, 0x25, 0x2f, 0x74, 0xac, 0x61, 0x59, 0x8e, 0xfa, 0x15, 0x0d, 0x6d, - 0xd4, 0x73, 0xdd, 0x9f, 0x4a, 0xdd, 0xd4, 0x45, 0x74, 0x7c, 0x60, 0x92, 0x51, 0x63, 0xb0, 0xd1, - 0xad, 0xee, 0xe7, 0x8c, 0xda, 0x9a, 0x61, 0x1a, 0xfd, 0xe7, 0xe7, 0x8f, 0xbf, 0x98, 0xaa, 0x5e, - 0x45, 0x83, 0x37, 0xcb, 0xb2, 0x84, 0x6e, 0x0c, 0xae, 0xdf, 0x0c, 0xf5, 0x83, 0x8f, 0x56, 0x42, - 0x2e, 0x5a, 0xf9, 0x38, 0x9c, 0x8a, 0x64, 0x3e, 0x2e, 0x30, 0x67, 0x32, 0x29, 0xa4, 0xd9, 0x36, - 0x0a, 0x11, 0x12, 0x72, 0x4c, 0xc7, 0x6d, 0xe3, 0x87, 0x25, 0x77, 0x0a, 0x60, 0x9f, 0x9a, 0x9e, - 0xb5, 0x32, 0x30, 0x2f, 0x47, 0x98, 0x9b, 0x15, 0x98, 0x42, 0x2d, 0x4c, 0x67, 0x60, 0x8c, 0xa0, - 0x09, 0xff, 0x25, 0xaf, 0x1c, 0x70, 0x63, 0xd4, 0xe5, 0x83, 0x24, 0x6f, 0x4d, 0xa7, 0x7d, 0xdb, - 0xd5, 0x04, 0x62, 0x96, 0xef, 0xfc, 0x51, 0xb0, 0xec, 0xb6, 0x71, 0x06, 0xac, 0xe6, 0xc0, 0x29, - 0x41, 0xc5, 0x2f, 0x1e, 0xe0, 0xad, 0xcb, 0x6f, 0x17, 0xe7, 0x67, 0xe0, 0x03, 0xff, 0x41, 0xe1, - 0x04, 0x58, 0x08, 0xc8, 0x5e, 0xb1, 0xf3, 0xe7, 0x94, 0xdd, 0xc1, 0x79, 0xe2, 0xc6, 0x5e, 0x62, - 0x1d, 0x65, 0x60, 0x80, 0x11, 0xa7, 0x78, 0x75, 0x02, 0xa8, 0xba, 0x88, 0xda, 0x58, 0xc1, 0xe9, - 0x7f, 0x8b, 0xe6, 0xe1, 0x22, 0x86, 0x6d, 0x96, 0x67, 0x41, 0x86, 0x1e, 0x83, 0x4d, 0xa4, 0x72, - 0xc3, 0xee, 0x17, 0x39, 0xf4, 0xd1, 0x4b, 0xfa, 0x20, 0x6c, 0x83, 0x74, 0x88, 0x21, 0x6d, 0xc3, - 0xc1, 0xbb, 0x85, 0x39, 0x16, 0x8b, 0x18, 0x70, 0xf3, 0x19, 0x4e, 0x9f, 0xe1, 0xa4, 0xd4, 0x9f, - 0x0f, 0x82, 0xce, 0x60, 0xb3, 0x53, 0x1a, 0x7f, 0x0a, 0x53, 0xbc, 0x0f, 0xd0, 0x59, 0x05, 0x82, - 0x22, 0x2d, 0xce, 0x94, 0xd3, 0x71, 0x60, 0x74, 0x81, 0x1c, 0x7b, 0x1b, 0x39, 0x94, 0x73, 0x2c, - 0xff, 0xd0, 0x16, 0x39, 0xc6, 0x7b, 0xec, 0x1f, 0x10, 0x59, 0xe8, 0x6a, 0x0c, 0x90, 0xcf, 0x92, - 0x98, 0x41, 0x9b, 0x36, 0x4c, 0x3d, 0x92, 0x19, 0x65, 0x73, 0x61, 0x4a, 0xe6, 0x56, 0xb6, 0x47, - 0xf7, 0x2d, 0xb9, 0x2a, 0x03, 0xf7, 0x66, 0x1a, 0x9f, 0x3e, 0x7e, 0xbe, 0x84, 0xdd, 0xed, 0x2a, - 0x39, 0x83, 0x32, 0xa2, 0x80, 0x43, 0x29, 0xcb, 0xbf, 0x33, 0x3e, 0x7b, 0x07, 0x89, 0x45, 0xa9, - 0x34, 0xa1, 0x76, 0x89, 0x2a, 0xdd, 0x80, 0x63, 0x26, 0x56, 0xd3, 0xb8, 0xbc, 0xf1, 0x35, 0x43, - 0xcb, 0x7e, 0xe9, 0xad, 0xc2, 0xe2, 0x31, 0x8b, 0xc8, 0xfa, 0x39, 0x12, 0x15, 0x1f, 0xb2, 0x31, - 0x03, 0x5d, 0x4c, 0xc6, 0xe6, 0xb4, 0x10, 0xc1, 0x9a, 0x7d, 0x06, 0x3b, 0x06, 0x3d, 0x65, 0x35, - 0xd3, 0xb5, 0x04, 0x7f, 0xac, 0x2c, 0x25, 0xbc, 0x0f, 0x13, 0x41, 0xc6, 0x54, 0x80, 0x32, 0x96, - 0x71, 0xce, 0xd8, 0x03, 0xf0, 0x3d, 0x43, 0x6e, 0x62, 0x57, 0x5e, 0xd0, 0xa1, 0x15, 0x29, 0x48, - 0x2a, 0xb5, 0xc6, 0xb4, 0x86, 0x72, 0x4a, 0x79, 0x85, 0x64, 0x9a, 0xea, 0x12, 0x46, 0x38, 0xf2, - 0x17, 0x42, 0xb0, 0xb0, 0x3a, 0xa0, 0xaf, 0x40, 0x02, 0xe0, 0xa5, 0x56, 0x25, 0x59, 0x29, 0x6c, - 0x2c, 0xcf, 0xc8, 0xd2, 0x67, 0xb3, 0xd7, 0x00, 0x9b, 0xce, 0x98, 0x20, 0x49, 0x0c, 0xfb, 0x93, - 0x8c, 0x1f, 0x09, 0x52, 0x0e, 0x19, 0x56, 0x8b, 0xd3, 0xe6, 0xc2, 0x80, 0xbb, 0x7e, 0xf3, 0xa2, - 0x99, 0x0c, 0xdc, 0x21, 0x96, 0x64, 0xd1, 0x2c, 0xe1, 0x3c, 0x31, 0x14, 0xa3, 0x80, 0x0e, 0xc5, - 0xde, 0xde, 0xda, 0x41, 0xdc, 0x6a, 0x56, 0x7f, 0x58, 0x02, 0xab, 0xab, 0xb5, 0x55, 0x08, 0x6d, - 0x15, 0xc3, 0xb5, 0x8c, 0x44, 0x43, 0x46, 0xa0, 0x0c, 0x5c, 0x77, 0x88, 0x52, 0x14, 0x0d, 0x02, - 0xf2, 0x79, 0x31, 0x85, 0x83, 0x9b, 0x66, 0x5d, 0xb4, 0x59, 0xbf, 0x95, 0x6a, 0xa5, 0x90, 0xe1, - 0xad, 0x1f, 0x5a, 0x1b, 0x19, 0x73, 0x36, 0x93, 0x07, 0xef, 0x01, 0xb9, 0x85, 0x8d, 0x5e, 0xad, - 0xb6, 0xb0, 0x34, 0xf2, 0xc0, 0x3f, 0x6c, 0xae, 0x54, 0x72, 0x3f, 0xb8, 0x76, 0xed, 0x7e, 0xf9, - 0x07, 0x47, 0xae, 0xea, 0xe3, 0x66, 0x55, 0x56, 0x28, 0x44, 0x80, 0x8b, 0xa1, 0x03, 0x2e, 0xa8, - 0xd9, 0x30, 0x24, 0x54, 0x9e, 0x96, 0x15, 0xc9, 0xfa, 0x39, 0x50, 0x8f, 0x62, 0xd4, 0x42, 0xc3, - 0x3b, 0x61, 0x08, 0xbd, 0x52, 0xc3, 0xe8, 0x89, 0x7f, 0x70, 0x68, 0xe9, 0x9a, 0x1b, 0xf6, 0x82, - 0x1f, 0xc0, 0x65, 0x44, 0x92, 0xcd, 0xe9, 0x4a, 0x4d, 0xe0, 0x81, 0xee, 0xc7, 0x6d, 0xc0, 0xf2, - 0xf9, 0xb0, 0x8e, 0x8c, 0x8d, 0x09, 0x97, 0xa8, 0x5e, 0x2a, 0x6e, 0x92, 0x42, 0xfe, 0x82, 0x80, - 0x9f, 0x9e, 0x0e, 0x5e, 0x06, 0x01, 0xd5, 0x7c, 0x5b, 0x4b, 0x79, 0x07, 0x70, 0xc7, 0x69, 0xf8, - 0x65, 0xb5, 0x46, 0x20, 0x10, 0x01, 0xb5, 0x60, 0xbe, 0x91, 0xcd, 0x67, 0x77, 0x90, 0x61, 0x42, - 0xbc, 0x01, 0x37, 0x04, 0xbd, 0xe2, 0xe9, 0x49, 0x8c, 0x5c, 0xf8, 0xe7, 0x04, 0xe4, 0xf0, 0xf4, - 0xf4, 0xf2, 0x17, 0x39, 0x0e, 0x0b, 0x7c, 0xc8, 0x04, 0x9d, 0x80, 0xc9, 0x0b, 0xab, 0x81, 0x74, - 0x85, 0x44, 0xb0, 0xaf, 0x30, 0x03, 0xc7, 0xf4, 0x6b, 0xae, 0x49, 0xea, 0x78, 0x37, 0x28, 0x1d, - 0x59, 0xad, 0x0b, 0xc2, 0x6b, 0xf7, 0x66, 0xad, 0x57, 0xd7, 0x8e, 0xe3, 0x84, 0x37, 0x43, 0x0a, - 0x9d, 0x01, 0xee, 0x02, 0x57, 0xbb, 0x04, 0x0a, 0xbf, 0x2a, 0x41, 0xda, 0xf1, 0x00, 0x24, 0xea, - 0xcc, 0xc2, 0x7c, 0x5d, 0x9a, 0x31, 0x97, 0xb0, 0x3e, 0xc4, 0x9f, 0x71, 0x1a, 0xca, 0x90, 0xbe, - 0x4d, 0xc1, 0x60, 0x99, 0xd2, 0x88, 0x60, 0x8c, 0x0b, 0xd3, 0xb8, 0xc4, 0x5b, 0x70, 0x7c, 0x17, - 0x89, 0x82, 0xa9, 0xee, 0x60, 0x21, 0xd8, 0x92, 0x59, 0x52, 0x14, 0xc9, 0x44, 0x29, 0xd9, 0x23, - 0x9b, 0x73, 0x72, 0xc7, 0xd9, 0x7d, 0x01, 0x12, 0x21, 0xbf, 0xb3, 0x39, 0x29, 0xa6, 0x6c, 0x9e, - 0xc6, 0x24, 0xe7, 0xec, 0x2e, 0xbc, 0x4b, 0x1f, 0x89, 0x76, 0x40, 0xfa, 0xce, 0x7a, 0x16, 0xc2, - 0xa6, 0x43, 0x2a, 0x00, 0xcb, 0x64, 0x31, 0xc1, 0x8d, 0x04, 0xc5, 0x97, 0xd7, 0xda, 0x30, 0x21, - 0xa7, 0x1c, 0x26, 0x8c, 0xf1, 0x82, 0x1e, 0x2f, 0xab, 0xcb, 0x35, 0x15, 0x15, 0x58, 0x91, 0x02, - 0x69, 0x83, 0x8b, 0x85, 0xb8, 0x44, 0xee, 0x28, 0x80, 0x51, 0x8d, 0x1c, 0xf5, 0x7e, 0x4a, 0x39, - 0x75, 0xc0, 0x19, 0x5e, 0x20, 0x71, 0xf0, 0x2d, 0x27, 0xc5, 0x15, 0x92, 0x97, 0xe0, 0x1d, 0xcb, - 0xc9, 0xda, 0xd6, 0xdf, 0x25, 0x8b, 0xa2, 0x9e, 0x8c, 0x6c, 0x1d, 0xae, 0x36, 0x62, 0xe3, 0x41, - 0xe6, 0xfa, 0x79, 0x04, 0x3a, 0xb3, 0xcd, 0xe1, 0xd6, 0x9d, 0x38, 0x9a, 0xb9, 0x92, 0x37, 0xca, - 0x0d, 0x0e, 0xe8, 0x11, 0xa6, 0x29, 0x90, 0xba, 0x40, 0xec, 0x4e, 0x52, 0x81, 0x07, 0xcb, 0xe0, - 0x44, 0x1e, 0xdb, 0x67, 0xd2, 0xd0, 0xbb, 0xff, 0xd4, 0xf8, 0xff, 0x27, 0xfe, 0xa1, 0x0b, 0x5b, - 0xd6, 0xd2, 0x54, 0x6e, 0xb5, 0x33, 0xd5, 0xca, 0x41, 0x71, 0x70, 0x50, 0x7c, 0xb4, 0xc5, 0xe2, - 0x87, 0x7c, 0xed, 0xb1, 0x58, 0x50, 0x07, 0xb8, 0xe6, 0x37, 0x76, 0x18, 0xb4, 0x5f, 0x92, 0xea, - 0x53, 0x66, 0xe8, 0xd4, 0x1e, 0x83, 0x18, 0x7b, 0xdc, 0x0e, 0x55, 0xd1, 0x1d, 0x23, 0x1e, 0x86, - 0xbf, 0x4a, 0x12, 0x46, 0xe9, 0x18, 0xb2, 0x52, 0x27, 0xbf, 0xd0, 0xc7, 0xc2, 0x64, 0x16, 0x28, - 0x2f, 0x60, 0xc1, 0xc0, 0x03, 0x21, 0x0d, 0x2b, 0xbc, 0xf2, 0xf8, 0xa1, 0xbc, 0x47, 0x21, 0x6b, - 0x7b, 0xe0, 0x9d, 0x4d, 0x76, 0x9d, 0xdd, 0xac, 0x6f, 0x9c, 0x76, 0x10, 0x93, 0xd6, 0x89, 0x29, - 0xf3, 0x54, 0x20, 0xaa, 0xba, 0x90, 0xd9, 0x31, 0x4f, 0xdd, 0xb3, 0xac, 0x5f, 0x49, 0x21, 0x1f, - 0x49, 0x9b, 0x8f, 0xda, 0xf0, 0xfa, 0xb2, 0x64, 0x03, 0x61, 0x75, 0x73, 0x22, 0x9f, 0x32, 0xe8, - 0x27, 0x53, 0x88, 0xaf, 0x70, 0xf0, 0x15, 0x21, 0x24, 0x96, 0xeb, 0x7a, 0x05, 0x38, 0xa4, 0x66, - 0x26, 0x05, 0x8e, 0x1c, 0x2f, 0x03, 0xb6, 0x95, 0x0f, 0x8c, 0xcf, 0x14, 0xdf, 0x87, 0xa8, 0x17, - 0x33, 0xb5, 0x97, 0x2a, 0xf8, 0xbc, 0x83, 0x00, 0x7e, 0xbc, 0x41, 0x59, 0x9f, 0x31, 0xf5, 0x73, - 0x00, 0xbb, 0x68, 0x33, 0x51, 0x51, 0x54, 0xb2, 0x10, 0xed, 0x64, 0x21, 0x92, 0x2c, 0x94, 0xef, - 0xbf, 0x90, 0x85, 0x68, 0x1b, 0x0b, 0x48, 0x38, 0xe4, 0x13, 0x78, 0x67, 0x2f, 0xe9, 0x8f, 0x76, - 0x94, 0x3f, 0x4e, 0x59, 0xfe, 0xa8, 0xa8, 0x85, 0x1c, 0x73, 0x55, 0x9a, 0x1e, 0xb2, 0xa0, 0x98, - 0xb9, 0x85, 0xbc, 0xa7, 0xc9, 0x01, 0xa2, 0x84, 0xbe, 0x16, 0x07, 0x15, 0x41, 0x78, 0xaf, 0xb2, - 0x5d, 0xd5, 0xaa, 0x07, 0x85, 0xa8, 0x12, 0xa0, 0xf3, 0x79, 0x60, 0x18, 0x95, 0x01, 0x50, 0x30, - 0x00, 0x3a, 0x42, 0x75, 0x2a, 0x15, 0x1f, 0x32, 0x5c, 0xdf, 0xaa, 0xc2, 0x2f, 0x8e, 0xa0, 0x47, - 0x46, 0x5f, 0xaf, 0xd4, 0x0f, 0x6f, 0x4b, 0x95, 0xaf, 0x57, 0x63, 0x7b, 0xde, 0x8d, 0x95, 0x43, - 0xc6, 0xfc, 0xea, 0x87, 0x65, 0xd5, 0x81, 0x95, 0x6c, 0xd1, 0x05, 0x1f, 0xfc, 0xa3, 0xe7, 0xba, - 0xab, 0xbf, 0xd9, 0xe4, 0x56, 0x5e, 0xb7, 0x2e, 0x11, 0x4e, 0xbe, 0xee, 0xad, 0xc3, 0x62, 0xed, - 0x5b, 0x7f, 0xf9, 0x8d, 0xaf, 0x7d, 0xfc, 0xf2, 0xac, 0x0d, 0x5c, 0x98, 0x84, 0xfb, 0x10, 0xa7, - 0x83, 0x5c, 0x27, 0xe7, 0xae, 0xdd, 0xf1, 0xb7, 0xdd, 0x2b, 0x7d, 0x98, 0x81, 0xf3, 0x0c, 0x6e, - 0x77, 0xd5, 0xeb, 0x71, 0xa9, 0x7c, 0x65, 0xdd, 0x96, 0x46, 0xaa, 0x6e, 0xc6, 0x36, 0xde, 0x2f, - 0x82, 0xb6, 0x95, 0x46, 0x1b, 0x04, 0xd9, 0x4f, 0x49, 0xeb, 0xfa, 0x68, 0x10, 0xe9, 0x75, 0xd5, - 0xf3, 0xb9, 0x73, 0x3c, 0x7f, 0x1b, 0xf2, 0x3d, 0x86, 0xcd, 0x5f, 0x06, 0x32, 0x25, 0x7b, 0xfd, - 0xba, 0x39, 0x29, 0xc2, 0xfb, 0xed, 0xd6, 0xfd, 0x54, 0xd8, 0xbe, 0xcb, 0x6a, 0x2c, 0x4a, 0x1b, - 0xa3, 0xa1, 0x05, 0x11, 0xaa, 0xd9, 0x51, 0xab, 0xc2, 0xd5, 0x55, 0x90, 0x62, 0x05, 0x71, 0xe3, - 0xe6, 0xe8, 0x8d, 0xbc, 0x15, 0xbd, 0x4e, 0xe2, 0x7f, 0x36, 0xaf, 0x53, 0x6f, 0xde, 0xac, 0x0f, - 0x47, 0x98, 0x92, 0xd3, 0x5d, 0x07, 0x46, 0x7d, 0xc5, 0xb7, 0x89, 0x18, 0x8d, 0xa5, 0x86, 0x57, - 0x57, 0xa3, 0x6e, 0x6c, 0xd2, 0x1a, 0x68, 0xd4, 0x79, 0x1b, 0xc3, 0x8d, 0x32, 0xd6, 0x77, 0x11, - 0x34, 0x54, 0x19, 0x67, 0x2d, 0xcf, 0x9a, 0xd4, 0x42, 0x8f, 0xb1, 0x47, 0xad, 0x6d, 0xc5, 0xc4, - 0xd2, 0xc3, 0x1a, 0x96, 0xd5, 0x32, 0x0a, 0xb1, 0xcd, 0x22, 0x20, 0xaf, 0xaa, 0xb2, 0xaa, 0xad, - 0x46, 0x21, 0x94, 0x45, 0x30, 0xf9, 0x98, 0x40, 0x7d, 0x28, 0xdd, 0x67, 0x01, 0x68, 0xfe, 0x25, - 0x3b, 0xa3, 0x0f, 0xa6, 0xea, 0xb6, 0x85, 0xd4, 0x78, 0xf9, 0xb3, 0x7f, 0x63, 0x29, 0xad, 0x96, - 0x2f, 0x31, 0xb8, 0xcd, 0xaa, 0x93, 0x54, 0x11, 0x71, 0x06, 0x92, 0x75, 0x6d, 0xb7, 0xbe, 0xc7, - 0x15, 0x2a, 0x48, 0x5b, 0x6c, 0xbe, 0x0e, 0x54, 0x26, 0x1d, 0x8d, 0xbc, 0x1e, 0xa4, 0x60, 0xa3, - 0xa3, 0x27, 0xde, 0x7c, 0xb0, 0xa0, 0x4f, 0x37, 0x48, 0x96, 0xe1, 0x1a, 0x58, 0x37, 0x04, 0x37, - 0x67, 0xf6, 0x3a, 0xac, 0xcc, 0xf5, 0xf6, 0xd8, 0xaa, 0x3a, 0xc8, 0x94, 0xab, 0xef, 0x3a, 0x40, - 0xe2, 0x91, 0xff, 0x19, 0x20, 0x38, 0x49, 0x26, 0x7f, 0xd2, 0x12, 0xac, 0x71, 0xa3, 0xba, 0xf3, - 0xe6, 0xbb, 0xf1, 0xbc, 0x45, 0x3f, 0x65, 0x71, 0xf5, 0x2f, 0x3e, 0xf3, 0xd8, 0xa8, 0xb7, 0xd4, - 0xff, 0x5f, 0x8d, 0xae, 0xfa, 0x5f, 0x63, 0xfe, 0x17, 0x66, 0xba, 0xb1, 0x98, 0x32, 0x33, 0x00, - 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x0a, 0xbd, 0x3b, 0x6b, 0x73, 0xdb, 0x38, + 0x92, 0xdf, 0xf3, 0x2b, 0x10, 0x26, 0x93, 0x90, 0x63, 0x8a, 0x22, 0x29, 0x5b, 0xb2, 0x25, 0xd1, + 0xd9, 0x8c, 0x93, 0x3d, 0xe7, 0xca, 0x9e, 0xa4, 0x36, 0x3e, 0xcf, 0xcc, 0xf9, 0xbc, 0x65, 0x9a, + 0x84, 0x24, 0x4e, 0x28, 0x82, 0x0b, 0x42, 0xb2, 0x1d, 0x59, 0xff, 0xfd, 0xba, 0x01, 0x90, 0x22, + 0xf5, 0x70, 0x92, 0x9b, 0xad, 0x9b, 0x72, 0x45, 0x20, 0xd0, 0x68, 0x74, 0x37, 0xfa, 0x05, 0x34, + 0x66, 0xf8, 0xfc, 0xdd, 0xc7, 0x93, 0x8b, 0x3f, 0x3e, 0xbd, 0x27, 0x13, 0x31, 0x4d, 0x8f, 0xc9, + 0xb0, 0xfc, 0xa1, 0x61, 0x0c, 0x3f, 0x53, 0x2a, 0x42, 0x92, 0x85, 0x53, 0x1a, 0x18, 0xf3, 0x84, + 0xde, 0xe5, 0x8c, 0x0b, 0x83, 0x3c, 0x8b, 0x58, 0x26, 0x68, 0x26, 0x02, 0xe3, 0x2e, 0x89, 0xc5, + 0x24, 0x88, 0xe9, 0x3c, 0x89, 0x68, 0x4b, 0x7e, 0xd8, 0x49, 0x96, 0x88, 0x24, 0x4c, 0x5b, 0x45, + 0x14, 0xa6, 0x34, 0xf0, 0xec, 0x29, 0x74, 0x4c, 0x67, 0xd3, 0xf2, 0xdb, 0x28, 0x91, 0x3e, 0x9b, + 0x08, 0x91, 0xb7, 0xe8, 0xbf, 0x66, 0xc9, 0x3c, 0x30, 0x4e, 0xc2, 0x68, 0x42, 0x5b, 0x27, 0x80, + 0x96, 0xb3, 0xd4, 0x20, 0x15, 0xfe, 0x8c, 0xb5, 0x22, 0x1c, 0xb2, 0x09, 0xb4, 0x0a, 0xc1, 0x38, + 0xb4, 0xa6, 0xb3, 0x42, 0xb4, 0x38, 0x9d, 0x87, 0x69, 0x12, 0x87, 0x82, 0x6e, 0x47, 0xf8, 0x89, + 0x87, 0xe3, 0x69, 0xb8, 0x05, 0x53, 0x05, 0x5e, 0x87, 0x7e, 0x7f, 0x9f, 0x27, 0x9c, 0x16, 0x35, + 0x70, 0x17, 0xe0, 0x9e, 0x0d, 0x45, 0x22, 0x52, 0x7a, 0xfc, 0xdb, 0xd9, 0xfb, 0x77, 0xe4, 0x04, + 0x56, 0x65, 0x53, 0xf2, 0x09, 0x98, 0x10, 0x82, 0x92, 0xf7, 0x71, 0x02, 0xd4, 0x0c, 0xdb, 0x0a, + 0x82, 0x0c, 0x8b, 0x88, 0x27, 0xb9, 0x20, 0xe2, 0x21, 0x07, 0x49, 0x09, 0x7a, 0x2f, 0xda, 0x7f, + 0x86, 0xf3, 0x50, 0xf5, 0x1a, 0xc7, 0xcf, 0x46, 0xb3, 0x2c, 0x12, 0x09, 0xcb, 0xc8, 0xf8, 0x43, + 0x6c, 0x52, 0x6b, 0xc1, 0xa9, 0x98, 0xf1, 0x8c, 0xc4, 0xce, 0x98, 0x8a, 0xf7, 0x29, 0x9d, 0xc2, + 0x9a, 0xbf, 0x3c, 0xc8, 0xa1, 0x65, 0x05, 0x1a, 0xbd, 0x6f, 0x40, 0x46, 0x9c, 0x02, 0xb7, 0x1a, + 0x18, 0x01, 0xe7, 0x21, 0x27, 0x71, 0x10, 0xb3, 0x68, 0x86, 0x3d, 0xcf, 0x86, 0x6d, 0xb5, 0x1a, + 0x12, 0x23, 0x1e, 0x80, 0xa8, 0x67, 0xb7, 0x2c, 0x7e, 0x58, 0x8c, 0x80, 0xa3, 0xd6, 0x28, 0x9c, + 0x26, 0xe9, 0x43, 0xff, 0x2d, 0x87, 0x8d, 0xb1, 0x8b, 0x30, 0x2b, 0x5a, 0x05, 0xe5, 0xc9, 0x68, + 0x70, 0x1b, 0x46, 0x5f, 0xc6, 0x9c, 0xcd, 0xb2, 0xb8, 0x15, 0xb1, 0x94, 0xf1, 0xfe, 0x0b, 0xcf, + 0xf3, 0x06, 0x72, 0x4a, 0x91, 0x7c, 0xa5, 0x7d, 0xaf, 0x9b, 0xdf, 0x0f, 0xf4, 0x48, 0x1c, 0xc7, + 0x83, 0x69, 0xc8, 0xc7, 0x49, 0xd6, 0x77, 0x89, 0xe7, 0xc2, 0x40, 0x9a, 0x64, 0xb4, 0x35, 0xa1, + 0xc9, 0x78, 0x22, 0xfa, 0xce, 0xc1, 0xf2, 0x45, 0x1e, 0x72, 0x20, 0xa4, 0x85, 0x32, 0x0c, 0x61, + 0x88, 0x2f, 0x72, 0x56, 0x24, 0xc8, 0x4a, 0x9f, 0xd3, 0x34, 0x14, 0xc9, 0x9c, 0x0e, 0xa4, 0x8a, + 0xf4, 0x3d, 0xd7, 0xfd, 0x69, 0xa0, 0x27, 0xfa, 0x80, 0x69, 0xf9, 0xe2, 0x96, 0x09, 0x90, 0xee, + 0xc9, 0xe6, 0xcc, 0xf0, 0xb6, 0x60, 0xe9, 0x4c, 0x50, 0xbd, 0x74, 0x4b, 0xb0, 0xbc, 0x7f, 0x20, + 0xa7, 0x8c, 0x79, 0x18, 0x27, 0xb8, 0xde, 0x2d, 0xbb, 0x5f, 0x6c, 0xe2, 0xc5, 0xf6, 0xd2, 0x91, + 0xb4, 0xb7, 0x60, 0xee, 0x17, 0xca, 0x6d, 0xfd, 0x95, 0x27, 0x11, 0x7c, 0xe9, 0xce, 0x2d, 0x2b, + 0xdd, 0x32, 0x1e, 0xc3, 0x38, 0xa2, 0x9f, 0x15, 0xfd, 0x0e, 0x30, 0xba, 0x21, 0xa6, 0x22, 0x49, + 0xe7, 0x94, 0x6b, 0xc8, 0xbe, 0x9f, 0xdf, 0x13, 0x98, 0x9b, 0xc4, 0x84, 0x8f, 0x6f, 0x43, 0xb3, + 0x7b, 0x68, 0xab, 0x3f, 0xe7, 0xc0, 0x1a, 0x7c, 0x6d, 0x25, 0x59, 0x4c, 0xef, 0xfb, 0x7e, 0x93, + 0x96, 0x85, 0xa6, 0xb2, 0x83, 0x72, 0x54, 0xc4, 0xf7, 0xa0, 0xa5, 0xb8, 0xfb, 0x69, 0x20, 0x38, + 0xec, 0xd1, 0x88, 0xf1, 0x69, 0x5f, 0xb6, 0x40, 0x78, 0xf4, 0x0f, 0xb3, 0x05, 0x23, 0x16, 0x80, + 0xcc, 0xa2, 0x49, 0x2b, 0x94, 0x2a, 0xd2, 0xcf, 0x58, 0x46, 0x97, 0x5b, 0xd9, 0xd2, 0xf8, 0x7b, + 0x1b, 0xe8, 0xbd, 0x03, 0x94, 0x4b, 0x4c, 0x41, 0x8d, 0xe9, 0x6e, 0x19, 0xe8, 0xe9, 0x07, 0xd5, + 0x74, 0x6c, 0x7d, 0x87, 0x60, 0x5e, 0x8c, 0x46, 0xa3, 0x52, 0x2c, 0x9d, 0x4a, 0x2c, 0x2f, 0x8e, + 0x6e, 0xfd, 0x43, 0xff, 0x50, 0xae, 0xef, 0xfb, 0xc0, 0xdf, 0x86, 0x54, 0x14, 0xf1, 0xbb, 0x09, + 0xf1, 0x2a, 0x42, 0xbc, 0x8a, 0x10, 0xd9, 0x2c, 0x59, 0xaa, 0x50, 0x7a, 0x25, 0x99, 0x35, 0x85, + 0xde, 0xaa, 0xe6, 0x4b, 0xe7, 0x76, 0x06, 0x4a, 0x97, 0x45, 0x69, 0x58, 0x14, 0x8b, 0x3c, 0x8c, + 0xe3, 0x24, 0x1b, 0xf7, 0xdd, 0x4a, 0xc7, 0x07, 0xb0, 0xc3, 0x22, 0x01, 0xa7, 0xd5, 0x02, 0x47, + 0x33, 0xce, 0xfa, 0x4a, 0x45, 0x77, 0xe0, 0x5a, 0x57, 0x60, 0x52, 0xe4, 0x61, 0xb6, 0x88, 0x93, + 0x22, 0x4f, 0xc3, 0x87, 0x7e, 0x92, 0x49, 0x53, 0x19, 0xa5, 0xf4, 0x7e, 0x20, 0x91, 0xb5, 0x12, + 0x41, 0xa7, 0x45, 0x3f, 0x02, 0xf5, 0x05, 0x35, 0xaa, 0x89, 0xae, 0x66, 0x7a, 0xa0, 0x55, 0xeb, + 0x24, 0x4c, 0x93, 0x38, 0x4e, 0xe9, 0xf2, 0x45, 0x92, 0x8d, 0x58, 0x85, 0xdc, 0x30, 0x06, 0xe8, + 0x6f, 0x34, 0xc8, 0x37, 0x51, 0x6e, 0xda, 0x64, 0xcd, 0xb2, 0x36, 0xcc, 0x1a, 0xa4, 0x74, 0xc7, + 0xc3, 0xbc, 0x6e, 0x5f, 0x95, 0x0f, 0x08, 0x67, 0x82, 0x2d, 0xff, 0x36, 0xa5, 0x71, 0x12, 0x12, + 0x13, 0xbc, 0xbc, 0xf2, 0xff, 0xfd, 0x43, 0x17, 0x90, 0x58, 0x8b, 0xfa, 0x3c, 0xd9, 0xb5, 0x5c, + 0x3a, 0xb9, 0x72, 0x9e, 0x8b, 0xba, 0xe9, 0x97, 0x9d, 0xff, 0xa1, 0xcd, 0xb9, 0x58, 0xa0, 0x98, + 0x60, 0x1b, 0x6b, 0x40, 0x9b, 0x9a, 0x57, 0x4d, 0x2b, 0xce, 0x41, 0xde, 0x8b, 0x35, 0xe7, 0x50, + 0x73, 0x33, 0x12, 0xf0, 0x82, 0xe5, 0xe5, 0x9a, 0xa3, 0x44, 0x39, 0x28, 0x58, 0xe9, 0x2f, 0x8a, + 0x6d, 0x4d, 0x4c, 0xb0, 0x4c, 0xc9, 0xc2, 0x27, 0xe9, 0x07, 0xab, 0x0d, 0xda, 0xb5, 0xed, 0x5b, + 0x28, 0x5a, 0xdf, 0x8a, 0x7f, 0x2b, 0x85, 0x4a, 0xdd, 0x8b, 0x77, 0xc9, 0x7c, 0xab, 0x62, 0xea, + 0xb5, 0x53, 0x3a, 0x6a, 0xd8, 0xbd, 0xdc, 0x23, 0xd8, 0x63, 0xf1, 0x19, 0x34, 0xda, 0x76, 0x0a, + 0x9a, 0xc5, 0xd8, 0x5a, 0x44, 0x33, 0x5e, 0x00, 0x25, 0x39, 0x4b, 0x90, 0xae, 0xe5, 0xc4, 0x5b, + 0xd4, 0xe8, 0x71, 0xba, 0x9c, 0x4e, 0x97, 0x18, 0x92, 0x64, 0x24, 0x22, 0xc3, 0xb6, 0x4e, 0x27, + 0x30, 0x24, 0xc1, 0x4f, 0x9c, 0xcc, 0x49, 0x12, 0x43, 0xfa, 0x00, 0x3a, 0x02, 0x41, 0x17, 0x2d, + 0x50, 0x7f, 0xe8, 0xc1, 0x67, 0x72, 0x62, 0x60, 0x34, 0x64, 0xf8, 0x27, 0x84, 0xe0, 0x64, 0xf4, + 0x50, 0x4a, 0x4b, 0x8b, 0x04, 0xa7, 0x4c, 0xbc, 0xed, 0x33, 0x36, 0xa5, 0x8e, 0xd0, 0xc5, 0x7c, + 0x5c, 0x81, 0x2b, 0x2e, 0x3b, 0x18, 0xe7, 0x4a, 0x97, 0x8c, 0x6d, 0x2d, 0x0c, 0x2e, 0x7b, 0xa0, + 0xc3, 0x20, 0x98, 0xfd, 0xfc, 0xc2, 0xee, 0x21, 0x33, 0x20, 0x2e, 0xe9, 0xf8, 0xf0, 0x67, 0x1c, + 0x0f, 0xf3, 0x50, 0x4c, 0xc8, 0xb3, 0x51, 0x92, 0xa6, 0x81, 0xf1, 0xc2, 0x75, 0x3b, 0xb0, 0x2d, + 0x06, 0xc4, 0x64, 0xe3, 0xbc, 0x4b, 0x7c, 0x7f, 0x72, 0x38, 0xdf, 0x3f, 0xed, 0x7e, 0x3d, 0xf7, + 0xf6, 0x89, 0xb7, 0x3f, 0xd9, 0x9f, 0x1f, 0x4e, 0x5a, 0xfb, 0xf0, 0x75, 0x08, 0xc1, 0xb3, 0xfa, + 0xf2, 0x7d, 0xd2, 0x45, 0xb8, 0x49, 0xeb, 0xf0, 0xab, 0xd1, 0x3e, 0x06, 0x81, 0xcd, 0xc7, 0xc7, + 0xcf, 0x80, 0x44, 0x10, 0xb1, 0x94, 0x10, 0xca, 0xcd, 0x78, 0x32, 0x03, 0x41, 0x50, 0x29, 0x61, + 0x0f, 0xff, 0x05, 0xe1, 0x95, 0x22, 0xc4, 0xe9, 0xeb, 0x21, 0xd9, 0xa8, 0x09, 0xbf, 0x1e, 0x40, + 0x81, 0x17, 0x3d, 0xb5, 0x8e, 0xe1, 0xc7, 0x36, 0xa1, 0xc4, 0x5b, 0x5a, 0x26, 0xe6, 0x89, 0x6a, + 0x67, 0xeb, 0xb6, 0xba, 0x06, 0x09, 0xa6, 0x59, 0x29, 0x80, 0xfe, 0x04, 0xfe, 0x4f, 0x66, 0x1c, + 0xe9, 0x4e, 0x1f, 0x48, 0x92, 0x91, 0x59, 0x41, 0x49, 0xa4, 0x78, 0x2f, 0x11, 0x91, 0x35, 0x6a, + 0xff, 0x3a, 0xd1, 0xe8, 0x52, 0xe5, 0xca, 0x29, 0x44, 0x22, 0x02, 0xd9, 0x97, 0x98, 0x50, 0x52, + 0x4a, 0x88, 0x50, 0x29, 0x6b, 0x22, 0x18, 0x81, 0x30, 0x41, 0x32, 0x7a, 0x47, 0xa4, 0x1d, 0x92, + 0x02, 0xa2, 0x1b, 0x24, 0x16, 0x08, 0xac, 0x66, 0xc8, 0x6e, 0x1a, 0x13, 0x10, 0x29, 0xb9, 0xa5, + 0x29, 0xbb, 0x93, 0xbd, 0x0a, 0x0c, 0xa7, 0x47, 0x93, 0x30, 0x1b, 0x53, 0x92, 0x88, 0x42, 0x81, + 0x3a, 0x7a, 0x41, 0x84, 0x6a, 0xce, 0x83, 0x68, 0x06, 0x9e, 0x1f, 0x57, 0x35, 0xc3, 0x2c, 0xc6, + 0xc4, 0x74, 0x94, 0xf0, 0xa9, 0x85, 0x48, 0x54, 0xf0, 0x76, 0xc8, 0xc7, 0x2c, 0xa2, 0x64, 0x04, + 0xe9, 0x75, 0x31, 0xa1, 0xb1, 0x0d, 0x52, 0x2c, 0x31, 0x85, 0x9c, 0x23, 0x86, 0x08, 0xd9, 0x60, + 0x64, 0x96, 0xa7, 0x2c, 0x8c, 0x01, 0x21, 0xb4, 0x71, 0x34, 0xa6, 0x45, 0x82, 0x6b, 0x15, 0x29, + 0x13, 0x0e, 0xb9, 0x60, 0x92, 0x3b, 0x42, 0xef, 0x13, 0x90, 0x51, 0x36, 0x2e, 0x65, 0x5c, 0xc7, + 0x97, 0xd3, 0x2c, 0x4a, 0x52, 0x89, 0xd0, 0x81, 0xac, 0x78, 0x53, 0xe8, 0x3f, 0x2e, 0x73, 0xa9, + 0x9d, 0x85, 0x00, 0x47, 0x15, 0x7d, 0xaa, 0xf4, 0xe5, 0x1b, 0xea, 0x82, 0xe0, 0x3b, 0x55, 0xe6, + 0xed, 0x3c, 0x4c, 0xd2, 0xf0, 0x36, 0x05, 0x69, 0x4b, 0xac, 0xdf, 0xd2, 0x15, 0xf9, 0x33, 0x6c, + 0x6b, 0x87, 0xa4, 0xd3, 0xf7, 0x67, 0xbb, 0xf2, 0x77, 0xcc, 0xb5, 0x4b, 0x6d, 0x40, 0x2f, 0x80, + 0x69, 0x7c, 0xd3, 0x80, 0x2c, 0x3b, 0x82, 0x15, 0xa3, 0xa0, 0xe5, 0xd9, 0xf9, 0xfd, 0x09, 0x4b, + 0x83, 0xc5, 0xd2, 0x16, 0xfa, 0x97, 0xd3, 0x48, 0x04, 0xb5, 0xe9, 0x98, 0xf5, 0xff, 0x82, 0x29, + 0x04, 0xc8, 0x1b, 0xf6, 0x1f, 0x3a, 0xff, 0x01, 0x10, 0xa6, 0x65, 0x97, 0x30, 0x67, 0x34, 0x1b, + 0xc3, 0xb9, 0x0a, 0xe7, 0x39, 0xea, 0x54, 0x35, 0xfd, 0x38, 0x1a, 0x15, 0xc1, 0x39, 0xf8, 0x1b, + 0x47, 0x26, 0x1f, 0x66, 0x13, 0xb4, 0xed, 0x1f, 0x74, 0xdb, 0xbe, 0xd5, 0x3a, 0xb0, 0x35, 0xdb, + 0x6f, 0x39, 0x0f, 0x1f, 0x82, 0xab, 0x6b, 0x1b, 0x1c, 0xca, 0xe7, 0x70, 0x4e, 0x83, 0xd7, 0xd2, + 0xed, 0x35, 0xbc, 0x9e, 0x7f, 0xb0, 0xf2, 0x7a, 0xd8, 0x5e, 0x73, 0x72, 0xfe, 0x3e, 0xfc, 0x95, + 0x4e, 0x4e, 0xfa, 0x38, 0x0c, 0x3b, 0xd2, 0xbd, 0xf9, 0xbe, 0xed, 0xf9, 0x6f, 0x3d, 0xd7, 0xf6, + 0x10, 0x10, 0x7e, 0x88, 0xe7, 0xdb, 0x7e, 0xb3, 0x67, 0x2b, 0x48, 0x13, 0x02, 0x41, 0xce, 0x7b, + 0xf0, 0xcf, 0x19, 0x8c, 0x79, 0xbd, 0x4b, 0x6f, 0xff, 0xd4, 0xeb, 0x5e, 0x7a, 0xee, 0xa9, 0xe7, + 0x5f, 0xf6, 0xce, 0x70, 0xe0, 0xbf, 0x2b, 0xa7, 0xf8, 0x1a, 0x39, 0x41, 0x9f, 0xf7, 0xef, 0xe5, + 0x04, 0x89, 0x3a, 0xe9, 0x3a, 0xfb, 0x3d, 0xdb, 0x07, 0x8a, 0xb1, 0x21, 0x09, 0x3f, 0x41, 0x7a, + 0x9c, 0x83, 0x0e, 0x51, 0x43, 0xbe, 0xe2, 0xef, 0x44, 0xf6, 0xe1, 0xa7, 0x5f, 0x8e, 0xfb, 0x0a, + 0x5a, 0x4f, 0xd5, 0xe3, 0x12, 0xfa, 0xdc, 0x3b, 0x70, 0x3c, 0xbb, 0xe7, 0xb8, 0xbd, 0x13, 0x68, + 0xf9, 0xfb, 0xb2, 0x49, 0xa0, 0xd9, 0x39, 0x84, 0xa6, 0xe7, 0x63, 0xf3, 0x00, 0x5a, 0x7e, 0xe7, + 0xcc, 0xeb, 0x3a, 0xbd, 0x9e, 0x7d, 0xe8, 0x1c, 0xc0, 0x02, 0xf0, 0xd3, 0x83, 0xb1, 0x9e, 0x7d, + 0x24, 0xc1, 0xe5, 0xc8, 0x91, 0xe3, 0x1f, 0x9e, 0x01, 0x38, 0x34, 0x3d, 0x57, 0xb6, 0x3b, 0x00, + 0x04, 0x90, 0x38, 0x77, 0x1f, 0x9b, 0x88, 0xe6, 0x04, 0x9a, 0x87, 0xbe, 0xc6, 0xbd, 0xef, 0x1c, + 0x75, 0xab, 0x15, 0x15, 0x19, 0xe7, 0x30, 0xcb, 0xeb, 0xc0, 0xac, 0x43, 0x0f, 0x91, 0x79, 0x47, + 0x88, 0xec, 0xb0, 0x77, 0x76, 0x84, 0xbd, 0xb0, 0xd0, 0x51, 0xe7, 0x14, 0xc1, 0x2e, 0x11, 0x4d, + 0xef, 0x6c, 0x05, 0x5c, 0xdb, 0x83, 0x41, 0x75, 0x38, 0x05, 0xd5, 0xfc, 0x38, 0x32, 0xf1, 0x78, + 0xfa, 0xff, 0xa6, 0xda, 0xb5, 0x93, 0x71, 0x9a, 0x7c, 0xf9, 0x98, 0x95, 0xe9, 0x96, 0x3a, 0x25, + 0x4f, 0xd9, 0x9c, 0x5e, 0xf0, 0xb0, 0x98, 0x44, 0x61, 0x06, 0x3d, 0x36, 0x38, 0xea, 0x13, 0xb3, + 0x86, 0x94, 0x3a, 0x0c, 0x96, 0xa1, 0xe2, 0xf7, 0x76, 0x13, 0xfd, 0xcf, 0x80, 0xde, 0xaa, 0x9d, + 0xba, 0xe5, 0x3c, 0x6a, 0x8b, 0xc0, 0x30, 0xac, 0x05, 0x98, 0x12, 0xe1, 0x68, 0xd2, 0x2c, 0x78, + 0xee, 0x41, 0xee, 0x95, 0x15, 0x82, 0x84, 0x0d, 0x76, 0xff, 0x35, 0xa3, 0xfc, 0xe1, 0x33, 0x38, + 0xe4, 0x08, 0x5c, 0xf5, 0xdb, 0x34, 0x35, 0x8d, 0xc6, 0x39, 0xcf, 0xb0, 0x06, 0xc9, 0xc8, 0x0c, + 0x1d, 0x38, 0xcb, 0xbd, 0x0f, 0xa3, 0x89, 0x69, 0x0a, 0x9b, 0x5b, 0xc1, 0xf1, 0x42, 0xa0, 0x9c, + 0xde, 0x0a, 0xc1, 0x13, 0xc8, 0xca, 0xa8, 0x69, 0xc4, 0xa1, 0x08, 0x5b, 0x82, 0xcf, 0x28, 0x64, + 0x71, 0x86, 0x15, 0x04, 0xf4, 0xd5, 0x2b, 0x13, 0xd6, 0x74, 0xad, 0x25, 0x70, 0xe2, 0xa4, 0x92, + 0xd2, 0x63, 0xaf, 0x57, 0xf6, 0xda, 0xcc, 0x52, 0xf7, 0x02, 0x88, 0x9d, 0x1e, 0xbb, 0xaf, 0x5e, + 0xd1, 0xa1, 0x7f, 0x70, 0x60, 0xc1, 0x32, 0x26, 0xba, 0xaa, 0x2c, 0xf0, 0x06, 0xd9, 0x30, 0xf0, + 0xba, 0xaf, 0x5e, 0xf1, 0x21, 0x34, 0xf7, 0xf6, 0x2c, 0xe9, 0xb1, 0x24, 0x69, 0xe7, 0x8a, 0xb2, + 0xbd, 0xcc, 0x7a, 0x7c, 0x34, 0x79, 0x90, 0x59, 0x03, 0x9a, 0x42, 0x88, 0xe5, 0x01, 0x1d, 0x18, + 0x46, 0x10, 0x08, 0x58, 0x04, 0xb8, 0x7f, 0x61, 0xec, 0x99, 0x5e, 0xb7, 0xd7, 0xeb, 0xf9, 0xde, + 0xc1, 0xcf, 0x4a, 0x8e, 0x10, 0x87, 0xd8, 0xd4, 0xb4, 0x86, 0x43, 0xd7, 0x72, 0x04, 0xfb, 0x0c, + 0xc4, 0x67, 0x63, 0x80, 0xb1, 0x20, 0xf7, 0x8d, 0x3f, 0x8b, 0x90, 0x0b, 0xb3, 0x6b, 0x1b, 0xae, + 0x61, 0x59, 0x5a, 0x52, 0x69, 0x10, 0xbd, 0x37, 0x0d, 0xcc, 0x4f, 0x40, 0x0c, 0xa9, 0x23, 0x5d, + 0xf6, 0xaf, 0xf2, 0x2a, 0xa9, 0x21, 0x22, 0x3b, 0x75, 0xd0, 0xbb, 0x37, 0x68, 0xe3, 0xab, 0x05, + 0x2c, 0x18, 0x2f, 0x76, 0x0b, 0xcb, 0xa6, 0x4f, 0x00, 0x00, 0x4e, 0xc3, 0x16, 0x3b, 0x00, 0x94, + 0x3e, 0x18, 0x4a, 0xff, 0x10, 0x06, 0xb6, 0xfe, 0xfd, 0x1c, 0x15, 0x03, 0x22, 0x21, 0x85, 0x64, + 0x09, 0xe4, 0x85, 0x21, 0xd0, 0xb0, 0x21, 0xf7, 0xc8, 0xff, 0x3e, 0xe3, 0x10, 0x0a, 0xf9, 0x27, + 0xce, 0x72, 0x89, 0x0f, 0xdd, 0x8f, 0x83, 0xc9, 0xf2, 0xd3, 0x9a, 0xfb, 0x33, 0xb5, 0xf6, 0xe4, + 0x02, 0x7b, 0x06, 0xb8, 0x25, 0x2d, 0x98, 0x44, 0x0a, 0x26, 0xc9, 0xf2, 0x99, 0x40, 0x05, 0x71, + 0x54, 0xd4, 0x91, 0x02, 0x30, 0xec, 0xc4, 0x99, 0x87, 0xe9, 0x8c, 0x06, 0x02, 0x5a, 0x1b, 0x22, + 0x53, 0xe7, 0x64, 0x04, 0xaa, 0x44, 0xf6, 0x49, 0x75, 0x35, 0x45, 0x96, 0x6c, 0x61, 0x46, 0xad, + 0x67, 0xcf, 0x72, 0xbc, 0x35, 0x2b, 0x8d, 0x67, 0x3b, 0xa8, 0xe6, 0x3b, 0xca, 0x4f, 0xd2, 0x2f, + 0xe5, 0x6e, 0xc6, 0xf5, 0xdd, 0x8c, 0x77, 0x91, 0x56, 0x6d, 0x6a, 0xbc, 0x4e, 0xe1, 0xd6, 0xad, + 0x8d, 0x9f, 0x58, 0x9c, 0xa5, 0xb8, 0x3a, 0x80, 0xd4, 0x64, 0x5d, 0x17, 0x3c, 0x50, 0xbe, 0x63, + 0x44, 0x53, 0x5c, 0xd4, 0x29, 0xe6, 0x68, 0x25, 0x1c, 0xad, 0x04, 0xf4, 0xbb, 0xa8, 0x93, 0xdf, + 0xb8, 0x0b, 0x81, 0xcd, 0x96, 0x84, 0xab, 0xce, 0xad, 0x34, 0x17, 0xbb, 0x69, 0xa6, 0x60, 0xda, + 0x6a, 0xe6, 0x09, 0x32, 0x8e, 0xb7, 0x74, 0x08, 0xbf, 0x83, 0xcc, 0x95, 0x1e, 0xad, 0x2e, 0x15, + 0xe4, 0xbc, 0x40, 0xeb, 0x40, 0xc5, 0xfb, 0xae, 0xf1, 0xba, 0x27, 0x0a, 0x73, 0x48, 0xd3, 0xe2, + 0x93, 0x49, 0x92, 0xc6, 0x66, 0x62, 0xed, 0x1c, 0x4a, 0x77, 0x0f, 0xc5, 0x96, 0xed, 0x3e, 0x0f, + 0xf8, 0xab, 0x57, 0x20, 0x24, 0xf9, 0xbb, 0x0b, 0x10, 0xac, 0xa5, 0x2e, 0xce, 0x69, 0xf8, 0x85, + 0x9e, 0xd3, 0x77, 0x3c, 0x1c, 0x9b, 0xe8, 0x65, 0xd0, 0x9c, 0x2d, 0x60, 0x9b, 0x8a, 0x0b, 0xc6, + 0x52, 0x91, 0xe4, 0x4a, 0x8a, 0xf5, 0xb1, 0xa6, 0x0e, 0x9a, 0x35, 0xf7, 0xbb, 0x3e, 0xb2, 0x50, + 0x5b, 0x49, 0x7f, 0xd0, 0xe9, 0x6e, 0xa4, 0x60, 0x74, 0xc3, 0x05, 0x2b, 0xc4, 0x4c, 0xa6, 0x72, + 0xf4, 0x8a, 0x5f, 0x03, 0x65, 0x0e, 0xa7, 0x90, 0xbf, 0x46, 0xb4, 0xe9, 0x28, 0xed, 0x86, 0x9d, + 0x59, 0x96, 0x92, 0xfd, 0xe0, 0xc7, 0xe6, 0xe9, 0x3e, 0x98, 0xbd, 0x7d, 0x47, 0x99, 0x2d, 0x71, + 0x3d, 0x3d, 0xf8, 0x84, 0x93, 0x63, 0x56, 0x15, 0x9e, 0x24, 0xec, 0x53, 0xe1, 0xc5, 0xce, 0xbe, + 0xe1, 0xb3, 0x42, 0x2d, 0xc0, 0xab, 0xec, 0x1a, 0xd6, 0x46, 0x11, 0x5e, 0x85, 0xd0, 0x5a, 0xae, + 0x54, 0x47, 0x19, 0x43, 0x60, 0xe0, 0xf5, 0x41, 0xc8, 0x5b, 0x65, 0xb7, 0x09, 0x47, 0x0c, 0x79, + 0x66, 0x36, 0xec, 0x8f, 0xb7, 0x7f, 0x62, 0x88, 0x87, 0x4e, 0x9e, 0xd0, 0xc2, 0x94, 0xf8, 0xac, + 0xd5, 0x26, 0x5c, 0x41, 0x88, 0xbd, 0xc6, 0x6d, 0x68, 0x62, 0xdc, 0x0b, 0x6e, 0x6c, 0xf2, 0x72, + 0x21, 0x96, 0xf0, 0x0f, 0x5d, 0xe6, 0xf7, 0x37, 0x1b, 0x6b, 0xee, 0x05, 0x86, 0x65, 0x34, 0x54, + 0x78, 0x5d, 0x66, 0x41, 0x73, 0xc2, 0x4a, 0xb7, 0xd6, 0xdc, 0x38, 0xe6, 0x0d, 0xd4, 0xc1, 0x4e, + 0xfc, 0x0a, 0xc7, 0x21, 0x02, 0xd5, 0x75, 0x51, 0x79, 0xa0, 0xed, 0xe9, 0xc5, 0x96, 0x89, 0xb6, + 0xd4, 0x08, 0xa7, 0xe0, 0x91, 0xbe, 0xa4, 0x6f, 0x68, 0x46, 0xa5, 0x14, 0xa8, 0x03, 0xd2, 0x5d, + 0x34, 0x96, 0xca, 0x77, 0xac, 0x34, 0x97, 0x3e, 0xfa, 0x49, 0x32, 0x6b, 0xe6, 0x07, 0x08, 0x30, + 0xfc, 0x8b, 0xc0, 0xb5, 0xf9, 0x77, 0x65, 0x65, 0x2c, 0xe0, 0x8e, 0xdc, 0x30, 0x3b, 0x84, 0x96, + 0xf4, 0xaa, 0x59, 0xc0, 0x5a, 0xe1, 0x9e, 0xb7, 0x4a, 0xf5, 0xd2, 0x9d, 0x74, 0x0d, 0x70, 0x31, + 0x1e, 0x98, 0x34, 0xa0, 0x8f, 0x8f, 0x77, 0x70, 0x62, 0x65, 0x77, 0x8e, 0x1a, 0x91, 0x21, 0x0d, + 0x88, 0x86, 0xa4, 0xa0, 0xf8, 0x2d, 0x11, 0x13, 0xd3, 0x90, 0xf7, 0xd6, 0xe8, 0x87, 0x1f, 0x1f, + 0xa9, 0x93, 0x73, 0x09, 0xf6, 0x8e, 0x8e, 0xc2, 0x59, 0x8a, 0x74, 0x88, 0x80, 0xbf, 0xa1, 0x8e, + 0x84, 0xa1, 0xc5, 0x95, 0x7b, 0x8d, 0x12, 0x02, 0x80, 0xdf, 0xfb, 0xb4, 0x6c, 0x81, 0x2f, 0x64, + 0xd9, 0x94, 0xcd, 0x0a, 0x3a, 0xcb, 0x83, 0x42, 0x7e, 0x49, 0x70, 0xa0, 0x26, 0xa2, 0x69, 0xbd, + 0x07, 0xdc, 0x94, 0xfe, 0x94, 0xe0, 0x48, 0x77, 0x90, 0xac, 0x86, 0xd5, 0xf7, 0x4a, 0x7c, 0x89, + 0xc9, 0x95, 0xd4, 0x58, 0x00, 0xd9, 0x10, 0xff, 0x6e, 0x46, 0xd8, 0xe3, 0x23, 0xdf, 0x60, 0x44, + 0x4a, 0x24, 0x0d, 0xd8, 0x1b, 0xbe, 0x8d, 0x19, 0x5e, 0xb6, 0x06, 0xa2, 0x95, 0x02, 0xcf, 0xa9, + 0x2d, 0x29, 0xfc, 0xc4, 0x8a, 0x0f, 0x55, 0x36, 0x1b, 0x88, 0x96, 0x09, 0xe2, 0x07, 0x91, 0x80, + 0xb9, 0xc2, 0x48, 0xdd, 0x54, 0x37, 0xa1, 0xdb, 0x99, 0xcc, 0x5f, 0x6d, 0x96, 0xc6, 0x17, 0x1a, + 0x9e, 0x3e, 0x6d, 0xfb, 0x1a, 0x2d, 0xba, 0x6f, 0xdd, 0x54, 0x4e, 0x7c, 0x85, 0xe1, 0x79, 0xa0, + 0x07, 0x30, 0x11, 0xd4, 0x20, 0xdd, 0xfd, 0x37, 0x62, 0x92, 0x14, 0x1f, 0x65, 0xca, 0x14, 0xb8, + 0xfd, 0x12, 0x8b, 0x77, 0xe4, 0xd7, 0x07, 0x7a, 0xfd, 0xda, 0x47, 0x47, 0xaa, 0xed, 0xb6, 0x34, + 0x29, 0x93, 0x5e, 0x46, 0xe3, 0xa8, 0xe7, 0x47, 0xda, 0x84, 0xfe, 0x4f, 0x1e, 0x55, 0x2e, 0x52, + 0x5f, 0xf1, 0x9b, 0xc8, 0x1a, 0x31, 0xfe, 0x2f, 0xe0, 0x59, 0x0b, 0x0f, 0xbb, 0xd0, 0xd0, 0x27, + 0xd3, 0xd8, 0x52, 0x1a, 0x9b, 0x71, 0x93, 0x6e, 0xc6, 0xcb, 0x9a, 0xf5, 0x17, 0x10, 0x23, 0xeb, + 0xa6, 0x91, 0xcd, 0xd2, 0x74, 0xc3, 0x3a, 0x9a, 0x9d, 0x68, 0x20, 0x55, 0xcf, 0xca, 0x46, 0x9a, + 0x40, 0x55, 0xd7, 0x92, 0x96, 0x50, 0x60, 0x15, 0x19, 0xe8, 0x2c, 0x2d, 0x41, 0xa4, 0x55, 0x04, + 0x69, 0x8d, 0x96, 0x4d, 0xd2, 0x17, 0xeb, 0x5c, 0xcb, 0x82, 0xa9, 0x61, 0xdf, 0x80, 0x7f, 0x7f, + 0x52, 0x51, 0x97, 0xa4, 0x4f, 0x9e, 0x80, 0xc1, 0xa0, 0x67, 0x2d, 0x6f, 0x6a, 0x82, 0x68, 0xe6, + 0x5d, 0xda, 0x0f, 0x62, 0x02, 0x18, 0x27, 0x73, 0x30, 0x57, 0x54, 0xcc, 0x77, 0xb5, 0x0d, 0x0f, + 0xea, 0x9e, 0xda, 0xc6, 0xd1, 0x93, 0xd5, 0xa6, 0xca, 0xa4, 0x60, 0x7d, 0x46, 0x43, 0x03, 0xd4, + 0x6a, 0xe5, 0xe6, 0xc3, 0xb6, 0xaf, 0x50, 0xd4, 0xd5, 0xf3, 0x47, 0x11, 0x55, 0x5a, 0xb4, 0x8e, + 0xee, 0x7b, 0x11, 0xed, 0x50, 0x4a, 0x9b, 0xc3, 0xa6, 0x53, 0xae, 0x2c, 0xf3, 0xf7, 0xc0, 0x73, + 0x75, 0xc7, 0xef, 0x0d, 0x31, 0xec, 0x0a, 0x13, 0xce, 0x7d, 0xab, 0x31, 0x5f, 0x4f, 0xfe, 0xe3, + 0xfb, 0x26, 0x3f, 0xec, 0x79, 0x1d, 0x5b, 0xc8, 0xac, 0x5a, 0x60, 0xfc, 0x30, 0xf0, 0x23, 0x83, + 0xb4, 0xf9, 0xf4, 0xe2, 0xfc, 0x4c, 0xdf, 0xe6, 0x6c, 0xb9, 0xae, 0x21, 0xf7, 0xd3, 0x34, 0x2b, + 0x02, 0x03, 0xeb, 0xf4, 0xfd, 0x76, 0xfb, 0xee, 0xee, 0xce, 0xb9, 0xeb, 0x38, 0x8c, 0x8f, 0xdb, + 0xbe, 0xeb, 0xba, 0x78, 0x1f, 0x61, 0x10, 0xf5, 0xfc, 0xc0, 0xc0, 0x2a, 0xaa, 0x41, 0xd4, 0xfd, + 0x8f, 0xfe, 0xd2, 0x97, 0x3d, 0xfa, 0x96, 0x08, 0xef, 0x7c, 0xfa, 0x2f, 0x0e, 0x0f, 0x61, 0xa2, + 0x3b, 0x80, 0x4e, 0xce, 0xbe, 0xd0, 0x3e, 0x81, 0x0e, 0xfc, 0xaf, 0xec, 0xd0, 0xf5, 0x2b, 0xd2, + 0xc2, 0x6a, 0x8a, 0xee, 0x8a, 0x81, 0xde, 0x10, 0xaf, 0xd2, 0xfa, 0xc4, 0x75, 0x3c, 0x9b, 0x1c, + 0x0e, 0xd4, 0xfd, 0xfe, 0x91, 0xdd, 0xb9, 0xdc, 0x3f, 0xdd, 0xbf, 0xec, 0x9e, 0x1e, 0x5c, 0x7a, + 0x47, 0x6f, 0x7d, 0xdb, 0x97, 0x77, 0x5a, 0x2e, 0xe9, 0xd9, 0xbe, 0x77, 0xea, 0xf5, 0x6a, 0x3d, + 0x78, 0xcf, 0x72, 0x04, 0x80, 0xbe, 0x0b, 0x33, 0xbc, 0x83, 0xcb, 0xce, 0xe9, 0xd1, 0x79, 0xcf, + 0xee, 0x9e, 0xe2, 0x7d, 0xd7, 0xd1, 0x69, 0xef, 0xb2, 0x0b, 0xc8, 0x0e, 0x2f, 0xbd, 0xde, 0xa9, + 0xe7, 0x5d, 0x1e, 0xc2, 0x18, 0xde, 0xba, 0xc8, 0xcf, 0x03, 0xf8, 0xf4, 0x3a, 0xf5, 0x1b, 0x30, + 0xa1, 0xdd, 0x49, 0x59, 0xea, 0x09, 0x8c, 0xb2, 0x4e, 0x6a, 0x54, 0x63, 0xd2, 0xef, 0xe8, 0xcd, + 0x55, 0x3e, 0xb5, 0x1c, 0x81, 0x0c, 0x42, 0x0f, 0xfc, 0xa1, 0x06, 0x62, 0x07, 0x6f, 0x3f, 0x1b, + 0x99, 0x3d, 0xe4, 0x1a, 0xe2, 0xe9, 0xe3, 0x8d, 0x70, 0x54, 0x4d, 0xe1, 0x57, 0x16, 0x53, 0x47, + 0x65, 0x05, 0xab, 0xa9, 0xeb, 0xfa, 0xb9, 0x0b, 0x74, 0x0d, 0x6e, 0x87, 0xf1, 0x3c, 0x35, 0x7d, + 0x03, 0xd8, 0x5a, 0xb7, 0xe1, 0x6f, 0xce, 0xde, 0xb1, 0xf6, 0x77, 0xae, 0xba, 0xe5, 0x10, 0xb3, + 0x3d, 0x2b, 0x7c, 0xe2, 0x88, 0xdb, 0x4c, 0xaa, 0xbe, 0x91, 0xe6, 0x6d, 0xe4, 0xa0, 0x0b, 0x69, + 0x4d, 0xea, 0x2a, 0x5a, 0x19, 0x16, 0x62, 0x00, 0x9f, 0x0c, 0x86, 0x88, 0x31, 0x1c, 0x7a, 0x30, + 0xc6, 0xcb, 0x1f, 0x53, 0xfe, 0xee, 0x64, 0x0d, 0x07, 0x91, 0x52, 0xd5, 0xf9, 0x5d, 0xc4, 0xd6, + 0x93, 0xd7, 0xc9, 0x97, 0xdf, 0xea, 0x27, 0x35, 0x24, 0x48, 0x16, 0xf3, 0x30, 0xaf, 0x93, 0x5f, + 0xb2, 0x8a, 0x65, 0x0d, 0xca, 0x3b, 0xb8, 0xdf, 0xd0, 0xd0, 0x86, 0x5d, 0xd7, 0x7d, 0x53, 0xea, + 0xa6, 0xae, 0x1c, 0xe0, 0x33, 0x9d, 0x8c, 0x1a, 0xfd, 0x8d, 0x6e, 0x55, 0xa8, 0x34, 0x6a, 0x6b, + 0x86, 0x69, 0xf4, 0x9f, 0x9f, 0x3f, 0xfe, 0x6a, 0xaa, 0x4b, 0x3a, 0x1a, 0xbc, 0x5e, 0x94, 0x75, + 0x03, 0xa3, 0x7f, 0xf5, 0x7a, 0xa0, 0x9f, 0xcd, 0xac, 0x9d, 0x42, 0xc4, 0xda, 0x21, 0x04, 0x8e, + 0x82, 0xf2, 0x10, 0x22, 0x30, 0x1d, 0x32, 0x29, 0x9c, 0x2d, 0x6c, 0x14, 0x22, 0x9c, 0x42, 0xf0, + 0x0c, 0x62, 0x1b, 0x2f, 0x17, 0xdc, 0x29, 0x80, 0x7d, 0x6a, 0x7a, 0xd6, 0xd2, 0xc0, 0xc3, 0x08, + 0xc2, 0x5c, 0x2f, 0xc1, 0x14, 0x6a, 0x09, 0xa4, 0x7c, 0xf0, 0x24, 0xe8, 0x7f, 0xc9, 0x3a, 0x0b, + 0x6e, 0x8c, 0xaa, 0xb8, 0x48, 0xf2, 0x56, 0x74, 0xda, 0x37, 0x6d, 0x4d, 0x20, 0x1e, 0x6d, 0x9c, + 0x3f, 0x0b, 0x96, 0xdd, 0x34, 0x0e, 0xbe, 0xd5, 0x1c, 0x38, 0x1a, 0xa9, 0xf8, 0xc5, 0x03, 0x2c, + 0x35, 0xfd, 0x7e, 0x7e, 0x76, 0x0a, 0x3e, 0xf0, 0x1f, 0x14, 0x8e, 0xbd, 0x85, 0x80, 0x94, 0x1d, + 0x3b, 0x7f, 0x49, 0xd9, 0x2d, 0x1c, 0xa2, 0xae, 0xed, 0x05, 0x26, 0xa8, 0x7d, 0x03, 0x8c, 0x38, + 0xc5, 0x7a, 0x11, 0xa0, 0x6a, 0x23, 0x6a, 0x63, 0x09, 0xa9, 0xf6, 0x16, 0xcd, 0xc3, 0x45, 0x0c, + 0xdb, 0x2c, 0x0f, 0xc0, 0x0c, 0x3d, 0x06, 0x1b, 0x4b, 0xe5, 0x86, 0xdd, 0x2f, 0x72, 0xe8, 0xa3, + 0x17, 0xf4, 0x5e, 0xd8, 0x06, 0x69, 0x11, 0x43, 0xda, 0x06, 0x66, 0xbf, 0x62, 0x86, 0x37, 0x64, + 0x0c, 0xb8, 0xf9, 0x0c, 0x47, 0xee, 0x70, 0x5c, 0xea, 0xcf, 0x07, 0x41, 0xa7, 0xb0, 0xd9, 0x29, + 0x8d, 0x3f, 0x85, 0x29, 0x16, 0x41, 0x74, 0xf2, 0x8c, 0xa0, 0x48, 0x8b, 0x33, 0xe1, 0x74, 0x14, + 0x18, 0x6d, 0x20, 0xc7, 0xde, 0x46, 0x0e, 0xe5, 0x1c, 0xef, 0xbc, 0xe8, 0x1a, 0x39, 0xc6, 0x7b, + 0xec, 0xef, 0x13, 0x79, 0xbb, 0xd7, 0x18, 0x20, 0x9f, 0x25, 0x31, 0xfd, 0x75, 0xda, 0x30, 0xf5, + 0x48, 0xa6, 0x94, 0xcd, 0x84, 0x29, 0x99, 0x5b, 0xda, 0x1e, 0xed, 0x58, 0x72, 0x55, 0x06, 0xee, + 0xcd, 0x34, 0x3e, 0x7d, 0xfc, 0x7c, 0x01, 0xbb, 0xdb, 0x56, 0x72, 0x36, 0x54, 0xa6, 0x1e, 0x4a, + 0x59, 0xfe, 0x9d, 0xf1, 0xe9, 0x3b, 0x48, 0x2c, 0x4a, 0xa5, 0x09, 0xb5, 0x4b, 0x54, 0xe9, 0x06, + 0x9c, 0xad, 0xf1, 0x0a, 0x91, 0xcb, 0xd2, 0xb7, 0x19, 0x5a, 0xf6, 0x73, 0x6f, 0x19, 0x16, 0x0f, + 0x59, 0x44, 0x56, 0x8f, 0xba, 0xa8, 0xf8, 0x90, 0x8d, 0x18, 0xe8, 0x62, 0x32, 0x32, 0x21, 0x2d, + 0x0a, 0x56, 0xec, 0x33, 0xd8, 0x31, 0xe8, 0x29, 0xaf, 0x70, 0x5d, 0x4b, 0xf0, 0x87, 0xca, 0x52, + 0xc2, 0xbb, 0x30, 0x11, 0x64, 0x44, 0x05, 0x28, 0x63, 0x19, 0xe7, 0x8c, 0x3d, 0x00, 0xdf, 0x33, + 0xe4, 0x26, 0xb6, 0x65, 0x55, 0x12, 0xad, 0x48, 0x41, 0x52, 0xa9, 0x35, 0x70, 0xca, 0x90, 0x53, + 0xca, 0xba, 0x99, 0x69, 0xaa, 0xca, 0x93, 0x70, 0xe4, 0x2f, 0x84, 0x60, 0x61, 0xb5, 0x40, 0x5f, + 0x81, 0x04, 0xc0, 0x4b, 0xad, 0x4a, 0xb2, 0x52, 0xd8, 0x78, 0x27, 0x25, 0xef, 0x7b, 0x9b, 0xbd, + 0x06, 0xd8, 0x74, 0xc6, 0x04, 0x49, 0x62, 0xd8, 0x9f, 0x64, 0xf4, 0x40, 0x90, 0x72, 0xc8, 0xb0, + 0xd6, 0x38, 0x6d, 0x2e, 0x0c, 0xb8, 0xeb, 0xe5, 0x26, 0xcd, 0x64, 0xe0, 0x0e, 0xf0, 0x1e, 0x1a, + 0xcd, 0x12, 0x8e, 0x0a, 0x03, 0x31, 0x0c, 0xe8, 0x40, 0xec, 0xed, 0xad, 0x1c, 0xc4, 0x8d, 0x66, + 0xf5, 0xe5, 0x02, 0x58, 0x5d, 0xae, 0xac, 0x42, 0x68, 0xab, 0x18, 0xac, 0x64, 0x24, 0x1a, 0x32, + 0x02, 0x65, 0xe0, 0xba, 0x43, 0x94, 0xa2, 0x68, 0x10, 0x90, 0xcf, 0x8a, 0x09, 0x1c, 0xe7, 0x34, + 0xeb, 0x62, 0x9d, 0xf5, 0x1b, 0xa9, 0x56, 0x0a, 0x19, 0x96, 0x3a, 0xd1, 0xda, 0xc8, 0x88, 0xb3, + 0xa9, 0xbc, 0x6d, 0xe8, 0x93, 0x1b, 0xd8, 0xe8, 0xe5, 0x72, 0x0b, 0x4b, 0x43, 0x0f, 0xfc, 0xc3, + 0xe6, 0x4a, 0x25, 0xf7, 0xfd, 0x2b, 0xd7, 0xee, 0x95, 0x7f, 0x70, 0x9a, 0xaa, 0x3e, 0xae, 0x97, + 0xe5, 0xb5, 0x8c, 0x08, 0x70, 0x31, 0x74, 0xc0, 0x05, 0x35, 0x1b, 0x86, 0x84, 0xca, 0xb3, 0x66, + 0x45, 0xb2, 0x68, 0x00, 0xd4, 0xa3, 0x18, 0xb5, 0xd0, 0xb0, 0x10, 0x0e, 0xa1, 0x57, 0x6a, 0x18, + 0x3d, 0xf6, 0xf7, 0x0f, 0x2c, 0x7d, 0xd1, 0x88, 0xbd, 0xe0, 0x07, 0x70, 0x19, 0x91, 0x64, 0x33, + 0xba, 0x54, 0x13, 0x78, 0xa0, 0xfb, 0x71, 0x1b, 0xb0, 0x66, 0x30, 0xa8, 0x23, 0x63, 0x23, 0xc2, + 0x25, 0xaa, 0xe7, 0x8a, 0x9b, 0xa4, 0x90, 0xbf, 0x20, 0xe0, 0xc7, 0xc7, 0xfd, 0xe7, 0x41, 0x40, + 0x35, 0xdf, 0xd6, 0x42, 0x16, 0x3e, 0x6e, 0x39, 0x0d, 0xbf, 0x2c, 0x57, 0x08, 0x04, 0x22, 0xa0, + 0x16, 0xcc, 0x37, 0xb2, 0xd9, 0xf4, 0x16, 0x32, 0x4c, 0x88, 0x37, 0xe0, 0x86, 0xa0, 0x57, 0x3c, + 0x3e, 0x8a, 0xa1, 0x0b, 0xff, 0x1c, 0x83, 0x1c, 0x1e, 0x1f, 0x9f, 0xff, 0x2a, 0xc7, 0x61, 0x81, + 0x0f, 0x99, 0xa0, 0x63, 0x30, 0x79, 0x61, 0x35, 0x90, 0x2e, 0x91, 0x08, 0xf6, 0x0d, 0x66, 0xc2, + 0x80, 0x5f, 0x71, 0x4d, 0x52, 0xcb, 0xbb, 0x46, 0xe9, 0xc8, 0x2b, 0xca, 0x20, 0x84, 0xd3, 0xf5, + 0x4a, 0xaf, 0xae, 0x1c, 0xc7, 0x09, 0xaf, 0x07, 0x14, 0x3a, 0x03, 0xdc, 0x05, 0xae, 0x76, 0x09, + 0x14, 0x7e, 0x59, 0x82, 0xac, 0xc7, 0x03, 0x90, 0xa8, 0x33, 0x0d, 0xf3, 0xd5, 0x7d, 0x94, 0xb9, + 0x80, 0xf5, 0x21, 0xfe, 0x8c, 0xd2, 0x50, 0x86, 0xf4, 0x6d, 0x0a, 0x06, 0xcb, 0x94, 0x46, 0x04, + 0x63, 0x5c, 0x98, 0xc6, 0x05, 0x96, 0xfe, 0xf1, 0x75, 0x29, 0x0a, 0xa6, 0x2a, 0x3c, 0x43, 0xb0, + 0x25, 0xd3, 0xa4, 0x28, 0x92, 0xb1, 0x52, 0xb2, 0x07, 0x36, 0xe3, 0xe4, 0x96, 0xb3, 0xbb, 0x02, + 0x24, 0x42, 0xfe, 0x60, 0x33, 0x52, 0x4c, 0xd8, 0x2c, 0x8d, 0x49, 0xce, 0xd9, 0x6d, 0x78, 0x9b, + 0x3e, 0x10, 0xed, 0x80, 0x74, 0xa1, 0x7e, 0x1a, 0xc2, 0xa6, 0x43, 0x2a, 0x00, 0xcb, 0x64, 0x31, + 0xc1, 0x8d, 0x04, 0xc5, 0x97, 0xb5, 0x7c, 0x98, 0x90, 0x53, 0x0e, 0x13, 0x46, 0xf8, 0x2a, 0x01, + 0x2b, 0xf4, 0xe5, 0x9a, 0x8a, 0x0a, 0xbc, 0x86, 0x03, 0x69, 0x83, 0x8b, 0x85, 0xb8, 0x44, 0x6e, + 0x29, 0x80, 0x51, 0x8d, 0x1c, 0xf5, 0x7e, 0x42, 0x39, 0x75, 0xc0, 0x19, 0x9e, 0x23, 0x71, 0xf0, + 0x2d, 0x27, 0xc5, 0x15, 0x92, 0xe7, 0xe0, 0x1d, 0xcb, 0xc9, 0xda, 0xd6, 0xdf, 0x25, 0xf3, 0xa2, + 0x9e, 0x8c, 0x6c, 0x1d, 0xae, 0x36, 0x62, 0xe3, 0x59, 0xeb, 0xea, 0x4d, 0x08, 0x3a, 0xb3, 0xcd, + 0xe1, 0xb5, 0x87, 0x00, 0x68, 0xe6, 0x4a, 0xde, 0x28, 0x37, 0x38, 0x7b, 0x47, 0x98, 0xa6, 0x40, + 0xea, 0x02, 0xb1, 0x3b, 0x49, 0x05, 0x1e, 0x2c, 0x83, 0x63, 0x79, 0x22, 0x9f, 0x4a, 0x43, 0x6f, + 0xff, 0x53, 0xe3, 0xff, 0x9f, 0xf8, 0x65, 0x1b, 0xb6, 0x6c, 0x4d, 0x53, 0xb9, 0xb5, 0x9e, 0xa9, + 0x56, 0x0e, 0x8a, 0x83, 0x83, 0xe2, 0xc3, 0x2d, 0x16, 0x3f, 0xe0, 0x2b, 0x8f, 0xc5, 0x82, 0x3a, + 0xc0, 0x15, 0xbf, 0xb6, 0xc3, 0x60, 0xfd, 0x3d, 0xae, 0x3e, 0x65, 0x86, 0x4e, 0xed, 0x05, 0x8c, + 0xb1, 0xc7, 0xed, 0x50, 0x55, 0x1a, 0x30, 0xe2, 0x61, 0xf8, 0xab, 0x24, 0x61, 0x94, 0x8e, 0x21, + 0x2b, 0x75, 0xf2, 0x0b, 0x7d, 0x28, 0x4c, 0x66, 0x81, 0xf2, 0x02, 0x16, 0x0c, 0x3c, 0x10, 0xd2, + 0xf0, 0x5a, 0x5b, 0x1e, 0x3f, 0x94, 0xf7, 0x28, 0xe4, 0x85, 0x26, 0x78, 0x67, 0x93, 0x5d, 0x65, + 0xd7, 0xab, 0x32, 0xdb, 0x0e, 0x62, 0xd2, 0x3a, 0x31, 0x65, 0x9e, 0x0a, 0x44, 0x55, 0x55, 0xa8, + 0x1d, 0xf3, 0x54, 0x71, 0x69, 0xf5, 0x5c, 0x0c, 0xf9, 0x48, 0xd6, 0xf9, 0xa8, 0x0d, 0x5b, 0x55, + 0xbd, 0x65, 0x03, 0xa1, 0x2e, 0xbe, 0xa8, 0x9a, 0x4a, 0xf9, 0x76, 0x0c, 0xf1, 0x15, 0x0e, 0xbe, + 0xbc, 0x84, 0xc4, 0x32, 0x28, 0x75, 0x0a, 0xa3, 0x67, 0x33, 0x93, 0x02, 0x47, 0x8e, 0xc5, 0x93, + 0x6d, 0xd7, 0x07, 0xc6, 0x67, 0x8a, 0x8f, 0x62, 0xd4, 0x33, 0xa1, 0xda, 0xf3, 0x1c, 0x7c, 0xd3, + 0x42, 0x00, 0x3f, 0x56, 0x5d, 0x56, 0x67, 0x4c, 0xfd, 0x06, 0xc2, 0x2e, 0xd6, 0x99, 0xa8, 0x28, + 0x2a, 0x59, 0x88, 0x76, 0xb2, 0x10, 0x49, 0x16, 0xca, 0x87, 0x70, 0xc8, 0x42, 0xb4, 0x8d, 0x05, + 0x24, 0x1c, 0xf2, 0x09, 0x7c, 0xa8, 0x20, 0xe9, 0x8f, 0x76, 0x5c, 0x7f, 0x9c, 0xb0, 0xfc, 0x41, + 0x51, 0x0b, 0x39, 0xe6, 0xb2, 0x34, 0x3d, 0x64, 0x41, 0x31, 0x73, 0x03, 0x79, 0x4f, 0x93, 0x03, + 0x44, 0x09, 0x7d, 0x6b, 0x1c, 0x54, 0x04, 0x61, 0x31, 0x69, 0xbb, 0xaa, 0x55, 0x2f, 0x2b, 0x51, + 0x25, 0x40, 0xe7, 0xf3, 0xc0, 0x30, 0x2a, 0x03, 0xa0, 0x60, 0x00, 0x74, 0x88, 0xea, 0x54, 0x2a, + 0x3e, 0x64, 0xb8, 0xbe, 0x55, 0x85, 0x5f, 0x1c, 0x41, 0x8f, 0x8c, 0xbe, 0x5e, 0xa9, 0x1f, 0x96, + 0x88, 0x95, 0xaf, 0x57, 0x63, 0x7b, 0xde, 0xb5, 0x95, 0x43, 0xc6, 0xfc, 0xe2, 0xe5, 0xa2, 0xea, + 0xc0, 0xeb, 0x7b, 0xd1, 0x06, 0x1f, 0xfc, 0xb3, 0xe7, 0xba, 0xcb, 0x9f, 0x6c, 0x72, 0x23, 0x6b, + 0xcc, 0x0b, 0x84, 0x93, 0x6f, 0xa4, 0xeb, 0xb0, 0x78, 0xe1, 0xaf, 0xbf, 0xfc, 0xc6, 0x57, 0x07, + 0xbf, 0x3c, 0x6b, 0x03, 0x17, 0x26, 0xe1, 0x3e, 0xc4, 0xe9, 0x20, 0xd7, 0xc9, 0xb9, 0x6b, 0xb7, + 0xfc, 0x6d, 0xc5, 0xb4, 0x0f, 0x53, 0x70, 0x9e, 0xc1, 0xcd, 0xae, 0x22, 0x05, 0x2e, 0x95, 0x2f, + 0xad, 0x9b, 0xd2, 0x48, 0x55, 0x39, 0x70, 0xe3, 0x21, 0x27, 0x68, 0x5b, 0x69, 0xb4, 0x41, 0x90, + 0xbd, 0x49, 0xd6, 0x4a, 0x61, 0xfd, 0x48, 0xaf, 0xab, 0xde, 0x0c, 0x9e, 0xe1, 0xf9, 0xdb, 0x90, + 0x8f, 0x50, 0x6c, 0xfe, 0x3c, 0x90, 0x29, 0xd9, 0xab, 0x57, 0xcd, 0x49, 0x11, 0x16, 0xf5, 0xd7, + 0x8a, 0x72, 0xe1, 0x7a, 0x01, 0xaf, 0xb1, 0x28, 0x6d, 0x8c, 0x86, 0x16, 0x44, 0xa8, 0x66, 0xc7, + 0x72, 0xe5, 0x9b, 0xeb, 0x2a, 0x48, 0xf1, 0x72, 0x70, 0xa3, 0x5c, 0xf6, 0x5a, 0x96, 0x82, 0xaf, + 0x92, 0xf8, 0x9f, 0xcd, 0x1a, 0xf2, 0xf5, 0xeb, 0xd5, 0xe1, 0x08, 0x53, 0x72, 0xba, 0xeb, 0xc0, + 0x28, 0xeb, 0x9a, 0xdb, 0x10, 0xa3, 0xb1, 0xd4, 0xf0, 0xea, 0xdb, 0xa8, 0x6b, 0x9b, 0xac, 0x0d, + 0x34, 0xae, 0x70, 0x1b, 0xc3, 0x8d, 0x6b, 0xac, 0x1f, 0x22, 0x68, 0xa0, 0x32, 0xce, 0x5a, 0x9e, + 0x35, 0xae, 0x85, 0x1e, 0x63, 0x8f, 0x5a, 0xdb, 0x2e, 0x13, 0x4b, 0x0f, 0x6b, 0x58, 0xd6, 0x9a, + 0x51, 0x88, 0x6d, 0x16, 0x01, 0x79, 0x55, 0x95, 0x55, 0x6d, 0x35, 0x0a, 0xa1, 0x2c, 0x82, 0xc9, + 0x17, 0x14, 0xea, 0x43, 0xe9, 0x3e, 0x0b, 0x40, 0xf3, 0x2f, 0xd8, 0x29, 0xbd, 0x37, 0x55, 0xb7, + 0x2d, 0xa4, 0xc6, 0xcb, 0x9f, 0xce, 0xb5, 0xa5, 0xb4, 0x5a, 0x3e, 0x3f, 0xe1, 0x36, 0xab, 0x4e, + 0x52, 0x45, 0xc4, 0x19, 0x48, 0xd6, 0xb5, 0xdd, 0xfa, 0x1e, 0x57, 0xa8, 0x20, 0x6d, 0xb1, 0xf9, + 0x2a, 0x50, 0x99, 0x74, 0x38, 0xf4, 0xba, 0x90, 0x82, 0x0d, 0x0f, 0x1f, 0x79, 0xf3, 0x95, 0x86, + 0x3e, 0xdd, 0x20, 0x59, 0x86, 0x6b, 0xe0, 0xbd, 0x21, 0xb8, 0x39, 0xb3, 0xdb, 0x62, 0x65, 0xae, + 0xb7, 0xc7, 0x96, 0xd5, 0x41, 0xa6, 0x5c, 0x7d, 0xd7, 0x01, 0x12, 0x8f, 0xfc, 0x4f, 0x00, 0xc1, + 0x49, 0x32, 0xf9, 0x4a, 0x4b, 0xb0, 0x46, 0x19, 0x79, 0x67, 0xb9, 0xbf, 0xf1, 0xa6, 0x47, 0xbf, + 0xdf, 0x71, 0xf5, 0x2f, 0xbe, 0x6d, 0xd9, 0xb8, 0x6f, 0xa9, 0xff, 0x1f, 0x2f, 0x6d, 0xf5, 0x7f, + 0x2d, 0xfd, 0x2f, 0x9e, 0xe7, 0x3b, 0x04, 0xcd, 0x34, 0x00, 0x00 }; From e95629f827f14d9e107717e5ec40af773ab890f0 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Wed, 27 Dec 2023 20:14:51 +0100 Subject: [PATCH 018/114] Remote preset cancles playlist --- wled00/remote.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wled00/remote.cpp b/wled00/remote.cpp index 582c9f984..21db7975d 100644 --- a/wled00/remote.cpp +++ b/wled00/remote.cpp @@ -110,6 +110,8 @@ static void setOff() { } static void presetWithFallback(uint8_t presetID, uint8_t effectID, uint8_t paletteID) { + resetNightMode(); + unloadPlaylist(); applyPresetWithFallback(presetID, CALL_MODE_BUTTON_PRESET, effectID, paletteID); } From 662870baf4aba57047fc61b7c20447373dd1ba43 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Fri, 29 Dec 2023 10:35:44 +0100 Subject: [PATCH 019/114] Changlog update, b2 release --- CHANGELOG.md | 5 +++++ wled00/wled.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fab690b31..3ff931f58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ ## WLED changelog +#### Build 2312290 +- Fix for #3622, #3613, #3609 +- Various tweaks and fixes +- changelog update + #### Build 2312230 - Version bump: 0.14.1-b2 - Fix for Pixel Magic button diff --git a/wled00/wled.h b/wled00/wled.h index eb72b4154..0c3a77192 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2312230 +#define VERSION 2312290 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG From 4f55be4f19daf6c81a167f5bf6bd20ff22afb664 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 1 Jan 2024 23:21:22 +0100 Subject: [PATCH 020/114] Bugfix #3632 --- wled00/data/settings_leds.htm | 2 +- wled00/html_settings.h | 20 ++++++++++---------- wled00/wled.h | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index e78b1ceb4..a283fcfe1 100644 --- a/wled00/data/settings_leds.htm +++ b/wled00/data/settings_leds.htm @@ -26,8 +26,8 @@ // success event scE.addEventListener("load", () => { GetV(); - setABL(); checkSi(); + setABL(); d.Sf.addEventListener("submit", trySubmit); if (d.um_p[0]==-1) d.um_p.shift(); pinDropdowns(); diff --git a/wled00/html_settings.h b/wled00/html_settings.h index c8cdcfa47..579359f96 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -341,7 +341,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = { 0xc1, 0x07, 0x14, 0xbe, 0x06, 0xd3, 0x3b, 0x09, 0xa6, 0x0f, 0x4d, 0x7b, 0x05, 0xac, 0x99, 0x1e, 0x2d, 0x5c, 0x6f, 0xaa, 0xc6, 0x08, 0x6f, 0x4f, 0xa7, 0xef, 0x6e, 0x81, 0x8a, 0x53, 0x37, 0x02, 0x99, 0xa7, 0xa1, 0x4a, 0x90, 0x66, 0xa2, 0xab, 0x9a, 0x35, 0x7a, 0xfc, 0x40, 0xe3, 0x3f, 0x54, - 0x4d, 0x47, 0x9c, 0xe3, 0x53, 0xb8, 0x70, 0x16, 0xd4, 0xb9, 0xb9, 0x72, 0x55, 0x44, 0x77, 0x35, + 0x4d, 0x77, 0x16, 0xd4, 0xb9, 0xb9, 0x72, 0xe1, 0x0a, 0xb1, 0x8f, 0x4f, 0x55, 0x44, 0x77, 0x35, 0x2b, 0x69, 0x1b, 0xad, 0x27, 0x4b, 0x37, 0x26, 0x7a, 0x1c, 0x3e, 0x5c, 0xb1, 0x4b, 0x4d, 0x6f, 0x98, 0x96, 0xc5, 0x85, 0x0f, 0x58, 0xb4, 0xbb, 0xcb, 0x2f, 0x9b, 0xd1, 0xc2, 0x9d, 0xc5, 0x80, 0x67, 0xe5, 0xfa, 0xc7, 0x61, 0xb0, 0x82, 0x49, 0xf3, 0x23, 0x55, 0x7b, 0x2e, 0xa7, 0x08, 0x84, @@ -354,7 +354,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = { 0x5f, 0xb0, 0x09, 0x74, 0x7d, 0x20, 0xf9, 0xf7, 0xeb, 0xb3, 0x53, 0x8b, 0xc2, 0x58, 0x1c, 0xcf, 0x8e, 0x22, 0x94, 0x10, 0xcb, 0x3f, 0x10, 0xc3, 0xe8, 0x13, 0xc4, 0x44, 0x74, 0xc7, 0xa3, 0x76, 0x78, 0xcd, 0x95, 0x4b, 0x15, 0x4a, 0xc6, 0x26, 0x30, 0x7e, 0x80, 0xf1, 0xd9, 0xbe, 0xbb, 0x64, - 0xa4, 0x5a, 0xc4, 0x0f, 0x7c, 0x18, 0x94, 0x80, 0xb0, 0x60, 0x2e, 0x64, 0x23, 0x55, 0xd2, 0x06, + 0xa4, 0x5a, 0xc4, 0x0f, 0x7c, 0x18, 0x94, 0x80, 0xb0, 0x60, 0x06, 0x64, 0x23, 0x55, 0xd2, 0x06, 0x82, 0x9f, 0xed, 0x2a, 0x73, 0xdd, 0x0c, 0xe9, 0xca, 0xb3, 0x1d, 0x14, 0x25, 0xd6, 0x29, 0xc1, 0x31, 0xe9, 0xed, 0xb7, 0x86, 0x91, 0x19, 0xd9, 0xe4, 0xd4, 0x85, 0x99, 0x8a, 0x70, 0x5c, 0x7a, 0xac, 0xdb, 0xba, 0xab, 0x3d, 0x32, 0x2b, 0x43, 0xb9, 0x95, 0xf1, 0xb9, 0x95, 0xb1, 0x85, 0x8d, @@ -392,13 +392,13 @@ const uint8_t PAGE_settings_leds[] PROGMEM = { 0xa5, 0xed, 0x3f, 0x28, 0x10, 0xbe, 0x45, 0x0a, 0x08, 0x80, 0xb2, 0xa4, 0x4a, 0x1c, 0x28, 0x0b, 0xdb, 0x9f, 0x7a, 0x74, 0x87, 0x0c, 0xd0, 0x58, 0x0e, 0x4d, 0xda, 0xd9, 0xdd, 0x55, 0xfd, 0xba, 0x45, 0xfe, 0xf4, 0xff, 0x0c, 0x8f, 0xc0, 0x69, 0x41, 0x54, 0x14, 0x82, 0x2a, 0xa0, 0x37, 0xb2, - 0x7d, 0xe5, 0xdd, 0xd5, 0xc5, 0x5e, 0xbb, 0x49, 0xa4, 0xa3, 0xf2, 0xb5, 0x67, 0x46, 0x3a, 0xf3, - 0xaf, 0x7f, 0xd8, 0x9e, 0x3b, 0x75, 0xe3, 0x07, 0x55, 0x43, 0x6f, 0x09, 0x4f, 0xb9, 0x53, 0x55, - 0x33, 0x16, 0x9b, 0xfa, 0xcc, 0x1f, 0x0b, 0x83, 0xcb, 0x3c, 0x10, 0x86, 0x9b, 0xa0, 0xfb, 0x0c, + 0x7d, 0xe5, 0xdd, 0xd5, 0xc5, 0x5e, 0xbb, 0x49, 0xa4, 0xa3, 0xf2, 0xb5, 0x67, 0x46, 0x3a, 0x73, + 0xb4, 0x7f, 0xd8, 0x9e, 0x3b, 0x75, 0xe3, 0x07, 0x55, 0x43, 0x6f, 0x09, 0x4f, 0xb9, 0x53, 0x55, + 0x33, 0x16, 0x9b, 0xfa, 0xcc, 0x0b, 0x0b, 0x83, 0xcb, 0x3c, 0x10, 0x86, 0x9b, 0xa0, 0xfb, 0x0c, 0x03, 0x9d, 0x0e, 0x58, 0xc3, 0xd3, 0x43, 0xc1, 0x07, 0x7a, 0xc0, 0x03, 0xc8, 0xbe, 0xa1, 0x4b, 0x60, 0x80, 0xe5, 0x9e, 0x66, 0xea, 0x46, 0xe0, 0x22, 0x1e, 0x00, 0x86, 0xb8, 0xbe, 0xe7, 0x82, 0xaf, 0xe9, 0x0b, 0x97, 0xc3, 0x40, 0x57, 0xd1, 0xba, 0xfd, 0x0a, 0xd8, 0x5c, 0x7f, 0x23, 0x63, - 0x77, 0x37, 0x89, 0x19, 0x3e, 0x9d, 0xe4, 0x29, 0x3f, 0x3d, 0xcc, 0x7b, 0x8a, 0xd3, 0x43, 0x30, + 0x77, 0x37, 0x89, 0x14, 0x3e, 0x9d, 0xe4, 0x29, 0x3f, 0x3d, 0xcc, 0x7b, 0x8a, 0xd3, 0x43, 0x30, 0x5e, 0xbc, 0xdd, 0x26, 0xd5, 0x9c, 0x82, 0xd3, 0x43, 0xe8, 0xb6, 0x40, 0x42, 0xd7, 0xb0, 0x4a, 0xc8, 0xc8, 0x77, 0x26, 0x69, 0x78, 0x8c, 0xee, 0xdc, 0x18, 0x0c, 0x62, 0x09, 0xa3, 0x20, 0x2c, 0xd3, 0x37, 0xc9, 0x00, 0xdc, 0x7a, 0x46, 0x6b, 0x32, 0x24, 0x81, 0xba, 0x39, 0x76, 0x44, 0x15, @@ -424,7 +424,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = { 0x60, 0xd4, 0x79, 0x7b, 0x40, 0x8e, 0xc1, 0xd8, 0x2b, 0x1f, 0x2e, 0x4e, 0xce, 0xf9, 0x13, 0xf3, 0x80, 0xe0, 0x0d, 0xbe, 0x27, 0xfc, 0xa9, 0xb0, 0x62, 0x66, 0x11, 0x71, 0xe7, 0x2d, 0xe2, 0xdd, 0xef, 0x1c, 0x90, 0x23, 0xef, 0x46, 0xe2, 0x00, 0x8f, 0x61, 0xd7, 0x2d, 0x21, 0xe0, 0x81, 0xee, - 0x41, 0xce, 0x63, 0x99, 0x03, 0x67, 0xd8, 0x1d, 0x38, 0xd2, 0xad, 0x47, 0x15, 0xc2, 0x43, 0xea, + 0x41, 0xf2, 0x63, 0x99, 0x03, 0x67, 0xd8, 0x1d, 0x38, 0xd2, 0xad, 0x47, 0x15, 0xc2, 0x43, 0xea, 0x0e, 0x74, 0x01, 0xd2, 0x33, 0x88, 0x80, 0xa5, 0x19, 0xc2, 0x77, 0x77, 0x9d, 0x61, 0xe7, 0xe9, 0x89, 0xf7, 0x08, 0xd9, 0x90, 0xc3, 0xae, 0x4d, 0x7c, 0xd9, 0x05, 0x10, 0xa7, 0xde, 0x31, 0x86, 0xc1, 0x81, 0x1a, 0x55, 0x28, 0xa4, 0x1e, 0x41, 0x14, 0xff, 0x8f, 0xb5, 0x1b, 0x32, 0x6b, 0xa5, @@ -597,7 +597,7 @@ const uint8_t PAGE_settings_leds[] PROGMEM = { 0x95, 0x37, 0x28, 0xb7, 0x6f, 0x34, 0xe9, 0xc3, 0x76, 0x7f, 0xba, 0x6f, 0xff, 0x66, 0x76, 0x07, 0x32, 0x30, 0x07, 0x93, 0x29, 0xb6, 0x96, 0x36, 0x95, 0xc9, 0xca, 0x54, 0xaa, 0xc5, 0x73, 0xef, 0xca, 0x45, 0x13, 0xa0, 0xe6, 0x8e, 0x00, 0x51, 0xed, 0xe9, 0x49, 0xcd, 0x1f, 0x02, 0xda, 0x2c, - 0xf6, 0x4c, 0x8e, 0x8b, 0x3c, 0xa2, 0x61, 0xe2, 0x86, 0x72, 0xc7, 0xc4, 0xb8, 0x62, 0x00, 0xee, + 0xf6, 0x4c, 0xce, 0x8d, 0x3c, 0xa2, 0x61, 0xe2, 0x86, 0x72, 0xc7, 0xc4, 0xb8, 0x62, 0x00, 0xee, 0x6c, 0xfb, 0xf2, 0xb6, 0xb4, 0x93, 0x3e, 0x96, 0x25, 0x14, 0xb7, 0x18, 0x99, 0x81, 0xd4, 0x7e, 0x60, 0x6d, 0xdf, 0xcf, 0x2f, 0xd1, 0xef, 0x94, 0x6c, 0x5b, 0xfa, 0x12, 0x1f, 0x9a, 0x65, 0x2c, 0x0c, 0xcd, 0x26, 0xd8, 0xfe, 0x57, 0x5c, 0x9a, 0x17, 0x7b, 0x8f, 0x91, 0x41, 0x00, 0xc8, 0x28, @@ -826,8 +826,8 @@ const uint8_t PAGE_settings_leds[] PROGMEM = { 0xcb, 0xe4, 0x4a, 0x4c, 0x97, 0x2b, 0xaf, 0xd8, 0x2f, 0x0f, 0x9c, 0x6b, 0x69, 0xe4, 0xdc, 0x26, 0xca, 0xff, 0x7f, 0xe4, 0x4c, 0x64, 0x51, 0x64, 0x52, 0x3b, 0xd9, 0x86, 0xbc, 0x8e, 0x05, 0x4a, 0xe5, 0xc9, 0xf2, 0xff, 0xd2, 0x3e, 0x4e, 0x0b, 0xb7, 0xa6, 0x32, 0x2b, 0x0f, 0xfc, 0xfb, 0xe9, - 0xb2, 0xdb, 0x16, 0xee, 0x6a, 0xe1, 0x16, 0x17, 0xfe, 0xff, 0x1b, 0xfe, 0x1f, 0xcd, 0xd9, 0x9d, - 0x3a, 0xcf, 0x61, 0x00, 0x00 + 0xb2, 0xdb, 0x16, 0xee, 0x6a, 0xe1, 0x16, 0x17, 0xfe, 0xff, 0x1b, 0xfe, 0x1f, 0x72, 0x20, 0x5a, + 0x39, 0xcf, 0x61, 0x00, 0x00 }; diff --git a/wled00/wled.h b/wled00/wled.h index 0c3a77192..b052047ca 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2312290 +#define VERSION 2401010 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG From 4e0f3e35db356d728b589f7700a26e398ad20160 Mon Sep 17 00:00:00 2001 From: PeterP Date: Wed, 3 Jan 2024 15:08:02 -0500 Subject: [PATCH 021/114] Update README.md Pointed link to current directions for compiling WLED --- usermods/Animated_Staircase/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usermods/Animated_Staircase/README.md b/usermods/Animated_Staircase/README.md index 618a1f7cf..320b744a5 100644 --- a/usermods/Animated_Staircase/README.md +++ b/usermods/Animated_Staircase/README.md @@ -11,7 +11,7 @@ The Animated Staircase can be controlled by the WLED API. Change settings such a speed, on/off time and distance by sending an HTTP request, see below. ## WLED integration -To include this usermod in your WLED setup, you have to be able to [compile WLED from source](https://github.com/Aircoookie/WLED/wiki/Compiling-WLED). +To include this usermod in your WLED setup, you have to be able to [compile WLED from source](https://kno.wled.ge/advanced/compiling-wled/). Before compiling, you have to make the following modifications: From cdc86402184582b5b447d24e6c00bd87097d840e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Kristan?= Date: Sat, 6 Jan 2024 17:01:34 +0100 Subject: [PATCH 022/114] Merge pull request #3648 from willmmiles/json-response-locking Expand JSON buffer lock scope to entire web reply --- wled00/fcn_declare.h | 16 ++++++++++++++++ wled00/json.cpp | 17 ++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index e046c40dc..c65f7a90b 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -356,6 +356,22 @@ um_data_t* simulateSound(uint8_t simulationId); void enumerateLedmaps(); uint8_t get_random_wheel_index(uint8_t pos); +// RAII guard class for the JSON Buffer lock +// Modeled after std::lock_guard +class JSONBufferGuard { + bool holding_lock; + public: + inline JSONBufferGuard(uint8_t module=255) : holding_lock(requestJSONBufferLock(module)) {}; + inline ~JSONBufferGuard() { if (holding_lock) releaseJSONBufferLock(); }; + inline JSONBufferGuard(const JSONBufferGuard&) = delete; // Noncopyable + inline JSONBufferGuard& operator=(const JSONBufferGuard&) = delete; + inline JSONBufferGuard(JSONBufferGuard&& r) : holding_lock(r.holding_lock) { r.holding_lock = false; }; // but movable + inline JSONBufferGuard& operator=(JSONBufferGuard&& r) { holding_lock |= r.holding_lock; r.holding_lock = false; return *this; }; + inline bool owns_lock() const { return holding_lock; } + explicit inline operator bool() const { return owns_lock(); }; + inline void release() { if (holding_lock) releaseJSONBufferLock(); holding_lock = false; } +}; + #ifdef WLED_ADD_EEPROM_SUPPORT //wled_eeprom.cpp void applyMacro(byte index); diff --git a/wled00/json.cpp b/wled00/json.cpp index fd298aef0..2e3b27b97 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -1013,6 +1013,17 @@ void serializeModeNames(JsonArray arr) } } + +// Global buffer locking response helper class +class GlobalBufferAsyncJsonResponse: public JSONBufferGuard, public AsyncJsonResponse { + public: + inline GlobalBufferAsyncJsonResponse(bool isArray) : JSONBufferGuard(17), AsyncJsonResponse(&doc, isArray) {}; + virtual ~GlobalBufferAsyncJsonResponse() {}; + + // Other members are inherited +}; + + void serveJson(AsyncWebServerRequest* request) { byte subJson = 0; @@ -1043,11 +1054,12 @@ void serveJson(AsyncWebServerRequest* request) return; } - if (!requestJSONBufferLock(17)) { + GlobalBufferAsyncJsonResponse *response = new GlobalBufferAsyncJsonResponse(subJson==JSON_PATH_FXDATA || subJson==JSON_PATH_EFFECTS); // will clear and convert JsonDocument into JsonArray if necessary + if (!response->owns_lock()) { request->send(503, "application/json", F("{\"error\":3}")); + delete response; return; } - AsyncJsonResponse *response = new AsyncJsonResponse(&doc, subJson==JSON_PATH_FXDATA || subJson==JSON_PATH_EFFECTS); // will clear and convert JsonDocument into JsonArray if necessary JsonVariant lDoc = response->getRoot(); @@ -1090,7 +1102,6 @@ void serveJson(AsyncWebServerRequest* request) DEBUG_PRINT(F("JSON content length: ")); DEBUG_PRINTLN(len); request->send(response); - releaseJSONBufferLock(); } #ifdef WLED_ENABLE_JSONLIVE From 8fb5f0ef3c1cf85e743bf033020ce8bf3cc30d4a Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sat, 6 Jan 2024 20:34:31 +0100 Subject: [PATCH 023/114] Changelog update v0.14.1-b3 --- CHANGELOG.md | 7 +++++++ package-lock.json | 2 +- package.json | 2 +- wled00/improv.cpp | 2 +- wled00/wled.h | 2 +- 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ff931f58..13f139551 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ ## WLED changelog +#### Build 2401060 +- Version bump: 0.14.1-b3 +- Global JSON buffer guarding (#3648 by @willmmiles, resolves #3641, #3312, #3367, #3637, #3646, #3447) +- Fix for #3632 +- Custom palette editor mobile UI enhancement (#3617 by @imeszaros) +- changelog update + #### Build 2312290 - Fix for #3622, #3613, #3609 - Various tweaks and fixes diff --git a/package-lock.json b/package-lock.json index 71f73fefe..293ccff54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "wled", - "version": "0.14.1-b2", + "version": "0.14.1-b3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index c4faddc7e..bcb771674 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wled", - "version": "0.14.1-b2", + "version": "0.14.1-b3", "description": "Tools for WLED project", "main": "tools/cdata.js", "directories": { diff --git a/wled00/improv.cpp b/wled00/improv.cpp index 0f4081f2d..dc94226e9 100644 --- a/wled00/improv.cpp +++ b/wled00/improv.cpp @@ -210,7 +210,7 @@ void sendImprovInfoResponse() { //Use serverDescription if it has been changed from the default "WLED", else mDNS name bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0); char vString[20]; - sprintf_P(vString, PSTR("0.14.1-b2/%i"), VERSION); + sprintf_P(vString, PSTR("0.14.1-b3/%i"), VERSION); const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription}; sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str); diff --git a/wled00/wled.h b/wled00/wled.h index b052047ca..74d60aa00 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2401010 +#define VERSION 2401060 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG From 052bdd8eb04731a9e87edca1a953a48571010413 Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Tue, 9 Jan 2024 11:54:46 +0100 Subject: [PATCH 024/114] fix for #3655 make WS2814 explicit in LED driver drop-down menu --- wled00/data/settings_leds.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index a283fcfe1..5bddafe5e 100644 --- a/wled00/data/settings_leds.htm +++ b/wled00/data/settings_leds.htm @@ -340,7 +340,7 @@ ${i+1}:

About

- WLED version ##VERSION##

+ WLED version ##VERSION##

Contributors, dependencies and special thanks
A huge thank you to everyone who helped me create WLED!

- (c) 2016-2023 Christian Schwinne
- Licensed under the MIT license

+ (c) 2016-2024 Christian Schwinne
+ Licensed under the MIT license

Server message: Response error!
diff --git a/wled00/wled.h b/wled00/wled.h index eac4cbc4d..63ab1c297 100755 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2403070 +#define VERSION 2403100 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG From a2368a75f7abe3a2f66104c02d0326f8afaa3f46 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 11 Mar 2024 17:41:17 +0100 Subject: [PATCH 060/114] Fix AsynWebServer lib Add 160MHz builds for ESP8266 --- platformio.ini | 36 ++++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 8b5c11bd4..6306595a2 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,7 +10,7 @@ # ------------------------------------------------------------------------------ # CI/release binaries -default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi, esp32_wrover +default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, nodemcuv2_160, esp8266_2m_160, esp01_1m_full_160, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi, esp32_wrover src_dir = ./wled00 data_dir = ./wled00/data @@ -144,7 +144,7 @@ lib_deps = fastled/FastLED @ 3.6.0 IRremoteESP8266 @ 2.8.2 makuna/NeoPixelBus @ 2.7.5 - https://github.com/Aircoookie/ESPAsyncWebServer.git @ ~2.0.7 + https://github.com/Aircoookie/ESPAsyncWebServer.git @ ^2.1.0 # for I2C interface ;Wire # ESP-NOW library @@ -314,6 +314,17 @@ build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 #-DWLED lib_deps = ${esp8266.lib_deps} monitor_filters = esp8266_exception_decoder +[env:nodemcuv2_160] +board = nodemcuv2 +platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} +board_build.ldscript = ${common.ldscript_4m1m} +board_build.f_cpu = 160000000L +build_unflags = ${common.build_unflags} +build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266 #-DWLED_DISABLE_2D +lib_deps = ${esp8266.lib_deps} +monitor_filters = esp8266_exception_decoder + [env:esp8266_2m] board = esp_wroom_02 platform = ${common.platform_wled_default} @@ -323,6 +334,16 @@ build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP02 lib_deps = ${esp8266.lib_deps} +[env:esp8266_2m_160] +board = esp_wroom_02 +platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} +board_build.ldscript = ${common.ldscript_2m512k} +board_build.f_cpu = 160000000L +build_unflags = ${common.build_unflags} +build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP02 +lib_deps = ${esp8266.lib_deps} + [env:esp01_1m_full] board = esp01_1m platform = ${common.platform_wled_default} @@ -333,6 +354,17 @@ build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01 -D WLED_D ; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM lib_deps = ${esp8266.lib_deps} +[env:esp01_1m_full_160] +board = esp01_1m +platform = ${common.platform_wled_default} +platform_packages = ${common.platform_packages} +board_build.ldscript = ${common.ldscript_1m128k} +board_build.f_cpu = 160000000L +build_unflags = ${common.build_unflags} +build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01 -D WLED_DISABLE_OTA + ; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM +lib_deps = ${esp8266.lib_deps} + [env:esp32dev] board = esp32dev platform = ${esp32.platform} From a4384bd340cde2fc28526327156ead52fb7a93fe Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 11 Mar 2024 17:59:13 +0100 Subject: [PATCH 061/114] Simpler boot preset save - fixes #3806 --- wled00/data/index.css | 3 +-- wled00/data/index.js | 13 ++++++++++--- wled00/json.cpp | 1 + wled00/presets.cpp | 7 +++++++ 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/wled00/data/index.css b/wled00/data/index.css index abbb76e04..fa6e20077 100644 --- a/wled00/data/index.css +++ b/wled00/data/index.css @@ -1227,7 +1227,6 @@ TD .checkmark, TD .radiomark { text-align: left; transition: background-color .5s; border-radius: 21px; - width: 99%; } .seg { @@ -1291,6 +1290,7 @@ TD .checkmark, TD .radiomark { margin: 0 auto 12px; min-height: 40px; border: 1px solid var(--c-2); + width: 100%; } /* Simplify segments */ @@ -1421,7 +1421,6 @@ dialog { .presin { padding: 8px; position: relative; - width: calc(100% - 16px); } .btn-s, diff --git a/wled00/data/index.js b/wled00/data/index.js index 7889e3b34..36c3eb1b9 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -618,7 +618,7 @@ function populatePresets(fromls) cn += `
`; if (cfg.comp.pid) cn += `
${i}
`; - cn += `
${isPlaylist(i)?"":""}${pName(i)} + cn += `
${i==lastinfo.leds.bootps?"":""}${isPlaylist(i)?"":""}${pName(i)}
@@ -1959,6 +1959,7 @@ function plR(p) function makeP(i,pl) { var content = ""; + const bps = lastinfo.leds.bootps; if (pl) { if (i===0) plJson[0] = { ps: [1], @@ -2024,6 +2025,11 @@ ${makePlSel(plJson[i].end?plJson[i].end:0, true)}
API command
${content}
+
Save to ID 0)?i:getLowestUnusedP()}>
@@ -2445,8 +2451,9 @@ function saveP(i,pl) if (gId(`p${i}lmp`) && gId(`p${i}lmp`).value!=="") obj.ledmap = parseInt(gId(`p${i}lmp`).value); } } - - obj.psave = pI; obj.n = pN; + if (gId(`p${i}bps`).checked) obj.bootps = pI; + obj.psave = pI; + obj.n = pN; var pQN = gId(`p${i}ql`).value; if (pQN.length > 0) obj.ql = pQN; diff --git a/wled00/json.cpp b/wled00/json.cpp index b79da8d90..389dc8ae5 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -628,6 +628,7 @@ void serializeInfo(JsonObject root) leds[F("maxseg")] = strip.getMaxSegments(); //leds[F("actseg")] = strip.getActiveSegmentsNum(); //leds[F("seglock")] = false; //might be used in the future to prevent modifications to segment config + leds[F("bootps")] = bootPreset; #ifndef WLED_DISABLE_2D if (strip.isMatrix) { diff --git a/wled00/presets.cpp b/wled00/presets.cpp index 72833a97c..7fbe49eb8 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -224,6 +224,13 @@ void savePreset(byte index, const char* pname, JsonObject sObj) if (sObj[F("ql")].is()) strlcpy(quickLoad, sObj[F("ql")].as(), 9); // client limits QL to 2 chars, buffer for 8 bytes to allow unicode else quickLoad[0] = 0; + const char *bootPS = PSTR("bootps"); + if (!sObj[FPSTR(bootPS)].isNull()) { + bootPreset = sObj[FPSTR(bootPS)] | bootPreset; + sObj.remove(FPSTR(bootPS)); + doSerializeConfig = true; + } + if (sObj.size()==0 || sObj["o"].isNull()) { // no "o" means not a playlist or custom API call, saving of state is async (not immediately) includeBri = sObj["ib"].as() || sObj.size()==0 || index==255; // temporary preset needs brightness segBounds = sObj["sb"].as() || sObj.size()==0 || index==255; // temporary preset needs bounds From f55465f8b8ce1f2daecb8ee0bd489f957cda1ed2 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 11 Mar 2024 18:02:03 +0100 Subject: [PATCH 062/114] Fix AsyncWebServer library --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 78ecc8fca..edcd321dd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -181,7 +181,7 @@ lib_deps = fastled/FastLED @ 3.6.0 IRremoteESP8266 @ 2.8.2 makuna/NeoPixelBus @ 2.7.5 - https://github.com/Aircoookie/ESPAsyncWebServer.git @ ~2.0.7 + https://github.com/Aircoookie/ESPAsyncWebServer.git @ ^2.1.0 #For use of the TTGO T-Display ESP32 Module with integrated TFT display uncomment the following line #TFT_eSPI #For compatible OLED display uncomment following From 7f8ec59939965a83834f3e5e219e0218570d2d71 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 11 Mar 2024 23:08:50 +0100 Subject: [PATCH 063/114] Changelog update --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b22c64ac..8da317b8b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ ## WLED changelog +#### Build 2403110 +- Beta WLED 0.14.2-b2 +- New AsyncWebServer (improved performance and reduced memory use) +- New builds for ESP8266 with 160MHz CPU clock +- Fixing stairway usermod and adding buildflags (#3758 by @lost-hope) +- Fixing a potential array bounds violation in ESPDMX +- Reduced RAM usage (moved strings and TZ data (by @willmmiles) to PROGMEM) +- LockedJsonResponse: Release early if possible (by @willmmiles) + #### Build 2402120 - Beta WLED 0.14.2-b1 - Possible fix for #3589 & partial fix for #3605 From 9d70ec56f28b78b438514b17618801046dc47157 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 11 Mar 2024 23:22:14 +0100 Subject: [PATCH 064/114] Distinguish 160MHz binaries --- platformio.ini | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/platformio.ini b/platformio.ini index c749a6216..914ed05b3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -340,6 +340,7 @@ monitor_filters = esp8266_exception_decoder [env:nodemcuv2_160] extends = env:nodemcuv2 board_build.f_cpu = 160000000L +build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP8266_160 #-DWLED_DISABLE_2D [env:esp8266_2m] board = esp_wroom_02 @@ -353,6 +354,7 @@ lib_deps = ${esp8266.lib_deps} [env:esp8266_2m_160] extends = env:esp8266_2m board_build.f_cpu = 160000000L +build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP02_160 [env:esp01_1m_full] board = esp01_1m @@ -367,6 +369,8 @@ lib_deps = ${esp8266.lib_deps} [env:esp01_1m_full_160] extends = env:esp01_1m_full board_build.f_cpu = 160000000L +build_flags = ${common.build_flags_esp8266} -D WLED_RELEASE_NAME=ESP01_160 -D WLED_DISABLE_OTA + ; -D WLED_USE_UNREAL_MATH ;; may cause wrong sunset/sunrise times, but saves 7064 bytes FLASH and 975 bytes RAM [env:esp07] board = esp07 From 05c0febd04e2b38435e0c2e8ced7aba601c349ae Mon Sep 17 00:00:00 2001 From: BaptisteHudyma Date: Tue, 12 Mar 2024 12:01:25 +0100 Subject: [PATCH 065/114] fix the 2d drift animation --- wled00/FX.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 1f626bc9a..7ceb83e26 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -5011,14 +5011,17 @@ uint16_t mode_2DDrift() { // By: Stepko https://editor.soulmateli const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); + const uint16_t colsCenter = (cols>>1) + (cols%2); + const uint16_t rowsCenter = (rows>>1) + (rows%2); + SEGMENT.fadeToBlackBy(128); const uint16_t maxDim = MAX(cols, rows)/2; unsigned long t = strip.now / (32 - (SEGMENT.speed>>3)); unsigned long t_20 = t/20; // softhack007: pre-calculating this gives about 10% speedup for (float i = 1; i < maxDim; i += 0.25) { float angle = radians(t * (maxDim - i)); - uint16_t myX = (cols>>1) + (uint16_t)(sin_t(angle) * i) + (cols%2); - uint16_t myY = (rows>>1) + (uint16_t)(cos_t(angle) * i) + (rows%2); + uint16_t myX = colsCenter + (sin_t(angle) * i); + uint16_t myY = rowsCenter + (cos_t(angle) * i); SEGMENT.setPixelColorXY(myX, myY, ColorFromPalette(SEGPALETTE, (i * 20) + t_20, 255, LINEARBLEND)); } SEGMENT.blur(SEGMENT.intensity>>3); From 7b366d49d2c332130738bdaaac1bb46e9d4a7ac6 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Tue, 12 Mar 2024 21:23:09 +0100 Subject: [PATCH 066/114] Effect: 2D Drift gets original twin option --- wled00/FX.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 7ceb83e26..14341f5b9 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -5018,17 +5018,18 @@ uint16_t mode_2DDrift() { // By: Stepko https://editor.soulmateli const uint16_t maxDim = MAX(cols, rows)/2; unsigned long t = strip.now / (32 - (SEGMENT.speed>>3)); unsigned long t_20 = t/20; // softhack007: pre-calculating this gives about 10% speedup - for (float i = 1; i < maxDim; i += 0.25) { + for (float i = 1.0f; i < maxDim; i += 0.25f) { float angle = radians(t * (maxDim - i)); - uint16_t myX = colsCenter + (sin_t(angle) * i); - uint16_t myY = rowsCenter + (cos_t(angle) * i); - SEGMENT.setPixelColorXY(myX, myY, ColorFromPalette(SEGPALETTE, (i * 20) + t_20, 255, LINEARBLEND)); + int16_t mySin = sin_t(angle) * i; + int16_t myCos = cos_t(angle) * i; + SEGMENT.setPixelColorXY(colsCenter + mySin, rowsCenter + myCos, ColorFromPalette(SEGPALETTE, (i * 20) + t_20, 255, LINEARBLEND)); + if (SEGMENT.check1) SEGMENT.setPixelColorXY(colsCenter + myCos, rowsCenter + mySin, ColorFromPalette(SEGPALETTE, (i * 20) + t_20, 255, LINEARBLEND)); } SEGMENT.blur(SEGMENT.intensity>>3); return FRAMETIME; } // mode_2DDrift() -static const char _data_FX_MODE_2DDRIFT[] PROGMEM = "Drift@Rotation speed,Blur amount;;!;2"; +static const char _data_FX_MODE_2DDRIFT[] PROGMEM = "Drift@Rotation speed,Blur amount,,,,Twin;;!;2"; ////////////////////////// @@ -6201,8 +6202,9 @@ uint16_t mode_2Ddriftrose(void) { SEGMENT.fadeToBlackBy(32+(SEGMENT.speed>>3)); for (size_t i = 1; i < 37; i++) { - uint32_t x = (CX + (sin_t(radians(i * 10)) * (beatsin8(i, 0, L*2)-L))) * 255.f; - uint32_t y = (CY + (cos_t(radians(i * 10)) * (beatsin8(i, 0, L*2)-L))) * 255.f; + float angle = radians(i * 10); + uint32_t x = (CX + (sin_t(angle) * (beatsin8(i, 0, L*2)-L))) * 255.f; + uint32_t y = (CY + (cos_t(angle) * (beatsin8(i, 0, L*2)-L))) * 255.f; SEGMENT.wu_pixel(x, y, CHSV(i * 10, 255, 255)); } SEGMENT.blur((SEGMENT.intensity>>4)+1); From af3f27feaec79a18979cae3043d359c2bda1fdab Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 17 Jul 2023 20:54:24 +0200 Subject: [PATCH 067/114] Move CTT calculation from BusPwm to Bus class. This enable it to other bus types. --- wled00/bus_manager.cpp | 29 +++++------------------------ wled00/bus_manager.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 24 deletions(-) diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index 3ac12c04e..dd88bf34f 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -11,7 +11,7 @@ //colors.cpp uint32_t colorBalanceFromKelvin(uint16_t kelvin, uint32_t rgb); -uint16_t approximateKelvinFromRGB(uint32_t rgb); +void colorRGBtoRGBW(byte* rgb); //udp.cpp uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte *buffer, uint8_t bri=255, bool isRGBW=false); @@ -421,29 +421,10 @@ void BusPwm::setPixelColor(uint16_t pix, uint32_t c) { uint8_t g = G(c); uint8_t b = B(c); uint8_t w = W(c); - uint8_t cct = 0; //0 - full warm white, 255 - full cold white - if (_cct > -1) { - if (_cct >= 1900) cct = (_cct - 1900) >> 5; - else if (_cct < 256) cct = _cct; - } else { - cct = (approximateKelvinFromRGB(c) - 1900) >> 5; - } - + uint8_t ww, cw; - #ifdef WLED_USE_IC_CCT - ww = w; - cw = cct; - #else - //0 - linear (CCT 127 = 50% warm, 50% cold), 127 - additive CCT blending (CCT 127 = 100% warm, 100% cold) - if (cct < _cctBlend) ww = 255; - else ww = ((255-cct) * 255) / (255 - _cctBlend); - - if ((255-cct) < _cctBlend) cw = 255; - else cw = (cct * 255) / (255 - _cctBlend); - - ww = (w * ww) / 255; //brightness scaling - cw = (w * cw) / 255; - #endif + + calculateCCT(c, ww, cw); switch (_type) { case TYPE_ANALOG_1CH: //one channel (white), relies on auto white calculation @@ -784,4 +765,4 @@ uint8_t BusManager::numBusses = 0; Bus* BusManager::busses[WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES]; ColorOrderMap BusManager::colorOrderMap = {}; uint16_t BusManager::_milliAmpsUsed = 0; -uint16_t BusManager::_milliAmpsMax = ABL_MILLIAMPS_DEFAULT; \ No newline at end of file +uint16_t BusManager::_milliAmpsMax = ABL_MILLIAMPS_DEFAULT; diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index 0b791adf3..d0d40f4f1 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -7,6 +7,9 @@ #include "const.h" +//colors.cpp +uint16_t approximateKelvinFromRGB(uint32_t rgb); + #define GET_BIT(var,bit) (((var)>>(bit))&0x01) #define SET_BIT(var,bit) ((var)|=(uint16_t)(0x0001<<(bit))) #define UNSET_BIT(var,bit) ((var)&=(~(uint16_t)(0x0001<<(bit)))) @@ -176,6 +179,32 @@ class Bus { if (_cctBlend > WLED_MAX_CCT_BLEND) _cctBlend = WLED_MAX_CCT_BLEND; #endif } + static void calculateCCT(uint32_t c, uint8_t &ww, uint8_t &cw) { + uint8_t cct = 0; //0 - full warm white, 255 - full cold white + uint8_t w = byte(c >> 24); + + if (_cct > -1) { + if (_cct >= 1900) cct = (_cct - 1900) >> 5; + else if (_cct < 256) cct = _cct; + } else { + cct = (approximateKelvinFromRGB(c) - 1900) >> 5; + } + + #ifdef WLED_USE_IC_CCT + ww = w; + cw = cct; + #else + //0 - linear (CCT 127 = 50% warm, 50% cold), 127 - additive CCT blending (CCT 127 = 100% warm, 100% cold) + if (cct < _cctBlend) ww = 255; + else ww = ((255-cct) * 255) / (255 - _cctBlend); + + if ((255-cct) < _cctBlend) cw = 255; + else cw = (cct * 255) / (255 - _cctBlend); + + ww = (w * ww) / 255; //brightness scaling + cw = (w * cw) / 255; + #endif + } inline void setAutoWhiteMode(uint8_t m) { if (m < 5) _autoWhiteMode = m; } inline uint8_t getAutoWhiteMode() { return _autoWhiteMode; } inline static void setGlobalAWMode(uint8_t m) { if (m < 5) _gAWM = m; else _gAWM = AW_GLOBAL_DISABLED; } From c74db95c1430e2998eae99996c01f8b2de5dca9a Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 19 Jul 2023 09:22:29 +0200 Subject: [PATCH 068/114] Add FW1906 support --- platformio.ini | 2 +- wled00/bus_manager.cpp | 5 +- wled00/bus_manager.h | 4 +- wled00/bus_wrapper.h | 128 +++++++++++++++++++++++++++++++++- wled00/const.h | 1 + wled00/data/settings_leds.htm | 4 +- 6 files changed, 137 insertions(+), 7 deletions(-) diff --git a/platformio.ini b/platformio.ini index 6306595a2..40dceabc5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -143,7 +143,7 @@ lib_compat_mode = strict lib_deps = fastled/FastLED @ 3.6.0 IRremoteESP8266 @ 2.8.2 - makuna/NeoPixelBus @ 2.7.5 + makuna/NeoPixelBus @ 2.7.8 https://github.com/Aircoookie/ESPAsyncWebServer.git @ ^2.1.0 # for I2C interface ;Wire diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index dd88bf34f..35538a78a 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -280,6 +280,7 @@ void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { if (!_valid) return; if (Bus::hasWhite(_type)) c = autoWhiteCalc(c); if (_cct >= 1900) c = colorBalanceFromKelvin(_cct, c); //color correction from CCT + if (_type == TYPE_FW1906) calculateCCT(c, PolyBus::cctWW, PolyBus::cctCW); // FW1906 ignores W component in c if (_data) { // use _buffering this causes ~20% FPS drop size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); size_t offset = pix*channels; @@ -645,13 +646,13 @@ uint32_t BusManager::memUsage(BusConfig &bc) { uint16_t multiplier = 1; if (IS_DIGITAL(bc.type)) { // digital types if (IS_16BIT(bc.type)) len *= 2; // 16-bit LEDs - #ifdef ESP8266 if (bc.type > 28) channels = 4; //RGBW + if (bc.type == TYPE_FW1906) channels = 5; //GRBCW + #ifdef ESP8266 if (bc.pins[0] == 3) { //8266 DMA uses 5x the mem multiplier = 5; } #else //ESP32 RMT uses double buffer, I2S uses 5x buffer - if (bc.type > 28) channels = 4; //RGBW multiplier = 2; #endif } diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index d0d40f4f1..6b8e9d7eb 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -157,7 +157,7 @@ class Bus { } virtual bool hasWhite(void) { return Bus::hasWhite(_type); } static bool hasWhite(uint8_t type) { - if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_SK6812_RGBW || type == TYPE_TM1814 || type == TYPE_UCS8904) return true; // digital types with white channel + if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_SK6812_RGBW || type == TYPE_TM1814 || type == TYPE_UCS8904 || type == TYPE_FW1906) return true; // digital types with white channel if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true; // analog types with white channel if (type == TYPE_NET_DDP_RGBW) return true; // network types with white channel return false; @@ -165,7 +165,7 @@ class Bus { virtual bool hasCCT(void) { return Bus::hasCCT(_type); } static bool hasCCT(uint8_t type) { if (type == TYPE_WS2812_2CH_X3 || type == TYPE_WS2812_WWA || - type == TYPE_ANALOG_2CH || type == TYPE_ANALOG_5CH) return true; + type == TYPE_ANALOG_2CH || type == TYPE_ANALOG_5CH || type == TYPE_FW1906) return true; return false; } static void setCCT(uint16_t cct) { diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index c63e055a8..e329246f1 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -2,6 +2,7 @@ #define BusWrapper_h #include "NeoPixelBusLg.h" +#include "bus_manager.h" // temporary - these defines should actually be set in platformio.ini // C3: I2S0 and I2S1 methods not supported (has one I2S bus) @@ -63,6 +64,11 @@ #define I_8266_U1_UCS_4 54 #define I_8266_DM_UCS_4 55 #define I_8266_BB_UCS_4 56 +//FW1906 GRBCW +#define I_8266_U0_FW6_5 66 +#define I_8266_U1_FW6_5 67 +#define I_8266_DM_FW6_5 68 +#define I_8266_BB_FW6_5 69 //ESP8266 APA106 #define I_8266_U0_APA106_3 81 #define I_8266_U1_APA106_3 82 @@ -104,12 +110,17 @@ #define I_32_RN_UCS_4 60 #define I_32_I0_UCS_4 61 #define I_32_I1_UCS_4 62 +//FW1906 GRBCW +#define I_32_RN_FW6_5 63 +#define I_32_I0_FW6_5 64 +#define I_32_I1_FW6_5 65 //Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) #define I_32_RN_APA106_3 85 #define I_32_I0_APA106_3 86 #define I_32_I1_APA106_3 87 #define I_32_BB_APA106_3 88 // bitbangging on ESP32 not recommended + //APA102 #define I_HS_DOT_3 39 //hardware SPI #define I_SS_DOT_3 40 //soft SPI @@ -176,6 +187,11 @@ #define B_8266_U1_APA106_3 NeoPixelBusLg //3 chan, esp8266, gpio2 #define B_8266_DM_APA106_3 NeoPixelBusLg //3 chan, esp8266, gpio3 #define B_8266_BB_APA106_3 NeoPixelBusLg //3 chan, esp8266, bb (any pin but 16) +//FW1906 GRBCW +#define B_8266_U0_FW6_5 NeoPixelBusLg //esp8266, gpio1 +#define B_8266_U1_FW6_5 NeoPixelBusLg //esp8266, gpio2 +#define B_8266_DM_FW6_5 NeoPixelBusLg //esp8266, gpio3 +#define B_8266_BB_FW6_5 NeoPixelBusLg //esp8266, bb #endif /*** ESP32 Neopixel methods ***/ @@ -251,6 +267,14 @@ #define B_32_I1_APA106_3 NeoPixelBusLg #endif //#define B_32_BB_APA106_3 NeoPixelBusLg // NeoEsp8266BitBang800KbpsMethod +//FW1906 GRBCW +#define B_32_RN_FW6_5 NeoPixelBusLg +#ifndef WLED_NO_I2S0_PIXELBUS +#define B_32_I0_FW6_5 NeoPixelBusLg +#endif +#ifndef WLED_NO_I2S1_PIXELBUS +#define B_32_I1_FW6_5 NeoPixelBusLg +#endif #endif @@ -290,6 +314,12 @@ //handles pointer type conversion for all possible bus types class PolyBus { public: + // WW and CW components for chips that support them (FW1906). They have to be set before calling + // PolyBus::setPixelColor(). In such case W component has no meaning in setPixelColor() + // as there is no support for WW/CW API yet + // if both values are 0, W component *may* be used instead (for WW & CW) + static uint8_t cctWW, cctCW; + // initialize SPI bus speed for DotStar methods template static void beginDotStar(void* busPtr, int8_t sck, int8_t miso, int8_t mosi, int8_t ss, uint16_t clock_kHz = 0U) { @@ -353,6 +383,10 @@ class PolyBus { case I_8266_U1_APA106_3: (static_cast(busPtr))->Begin(); break; case I_8266_DM_APA106_3: (static_cast(busPtr))->Begin(); break; case I_8266_BB_APA106_3: (static_cast(busPtr))->Begin(); break; + case I_8266_U0_FW6_5: (static_cast(busPtr))->Begin(); break; + case I_8266_U1_FW6_5: (static_cast(busPtr))->Begin(); break; + case I_8266_DM_FW6_5: (static_cast(busPtr))->Begin(); break; + case I_8266_BB_FW6_5: (static_cast(busPtr))->Begin(); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->Begin(); break; @@ -404,6 +438,14 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_4: (static_cast(busPtr))->Begin(); break; #endif + case I_32_RN_FW6_5: (static_cast(busPtr))->Begin(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_FW6_5: (static_cast(busPtr))->Begin(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_FW6_5: (static_cast(busPtr))->Begin(); break; + #endif + // case I_32_BB_UCS_4: (static_cast(busPtr))->Begin(); break; case I_32_RN_APA106_3: (static_cast(busPtr))->Begin(); break; #ifndef WLED_NO_I2S0_PIXELBUS @@ -465,6 +507,10 @@ class PolyBus { case I_8266_U1_APA106_3: busPtr = new B_8266_U1_APA106_3(len, pins[0]); break; case I_8266_DM_APA106_3: busPtr = new B_8266_DM_APA106_3(len, pins[0]); break; case I_8266_BB_APA106_3: busPtr = new B_8266_BB_APA106_3(len, pins[0]); break; + case I_8266_U0_FW6_5: busPtr = new B_8266_U0_FW6_5(len, pins[0]); break; + case I_8266_U1_FW6_5: busPtr = new B_8266_U1_FW6_5(len, pins[0]); break; + case I_8266_DM_FW6_5: busPtr = new B_8266_DM_FW6_5(len, pins[0]); break; + case I_8266_BB_FW6_5: busPtr = new B_8266_BB_FW6_5(len, pins[0]); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: busPtr = new B_32_RN_NEO_3(len, pins[0], (NeoBusChannel)channel); break; @@ -525,6 +571,13 @@ class PolyBus { case I_32_I1_APA106_3: busPtr = new B_32_I1_APA106_3(len, pins[0]); break; #endif // case I_32_BB_APA106_3: busPtr = new B_32_BB_APA106_3(len, pins[0], (NeoBusChannel)channel); break; + case I_32_RN_FW6_5: busPtr = new B_32_RN_FW6_5(len, pins[0], (NeoBusChannel)channel); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_FW6_5: busPtr = new B_32_I0_FW6_5(len, pins[0]); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_FW6_5: busPtr = new B_32_I1_FW6_5(len, pins[0]); break; + #endif #endif // for 2-wire: pins[1] is clk, pins[0] is dat. begin expects (len, clk, dat) case I_HS_DOT_3: busPtr = new B_HS_DOT_3(len, pins[1], pins[0]); break; @@ -578,6 +631,10 @@ class PolyBus { case I_8266_U1_APA106_3: (static_cast(busPtr))->Show(consistent); break; case I_8266_DM_APA106_3: (static_cast(busPtr))->Show(consistent); break; case I_8266_BB_APA106_3: (static_cast(busPtr))->Show(consistent); break; + case I_8266_U0_FW6_5: (static_cast(busPtr))->Show(consistent); break; + case I_8266_U1_FW6_5: (static_cast(busPtr))->Show(consistent); break; + case I_8266_DM_FW6_5: (static_cast(busPtr))->Show(consistent); break; + case I_8266_BB_FW6_5: (static_cast(busPtr))->Show(consistent); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->Show(consistent); break; @@ -638,6 +695,13 @@ class PolyBus { case I_32_I1_APA106_3: (static_cast(busPtr))->Show(consistent); break; #endif // case I_32_BB_APA106_3: (static_cast(busPtr))->Show(consistent); break; + case I_32_RN_FW6_5: (static_cast(busPtr))->Show(consistent); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_FW6_5: (static_cast(busPtr))->Show(consistent); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_FW6_5: (static_cast(busPtr))->Show(consistent); break; + #endif #endif case I_HS_DOT_3: (static_cast(busPtr))->Show(consistent); break; case I_SS_DOT_3: (static_cast(busPtr))->Show(consistent); break; @@ -687,6 +751,10 @@ class PolyBus { case I_8266_U1_APA106_3: return (static_cast(busPtr))->CanShow(); break; case I_8266_DM_APA106_3: return (static_cast(busPtr))->CanShow(); break; case I_8266_BB_APA106_3: return (static_cast(busPtr))->CanShow(); break; + case I_8266_U0_FW6_5: return (static_cast(busPtr))->CanShow(); break; + case I_8266_U1_FW6_5: return (static_cast(busPtr))->CanShow(); break; + case I_8266_DM_FW6_5: return (static_cast(busPtr))->CanShow(); break; + case I_8266_BB_FW6_5: return (static_cast(busPtr))->CanShow(); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: return (static_cast(busPtr))->CanShow(); break; @@ -747,6 +815,13 @@ class PolyBus { case I_32_I1_APA106_3: return (static_cast(busPtr))->CanShow(); break; #endif // case I_32_BB_APA106_3: return (static_cast(busPtr))->CanShow(); break; + case I_32_RN_FW6_5: return (static_cast(busPtr))->CanShow(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_FW6_5: return (static_cast(busPtr))->CanShow(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_FW6_5: return (static_cast(busPtr))->CanShow(); break; + #endif #endif case I_HS_DOT_3: return (static_cast(busPtr))->CanShow(); break; case I_SS_DOT_3: return (static_cast(busPtr))->CanShow(); break; @@ -821,6 +896,10 @@ class PolyBus { case I_8266_U1_APA106_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_8266_DM_APA106_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_8266_BB_APA106_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_8266_U0_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + case I_8266_U1_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + case I_8266_DM_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + case I_8266_BB_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; @@ -881,6 +960,13 @@ class PolyBus { case I_32_I1_APA106_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif // case I_32_BB_APA106_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; + case I_32_RN_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + #endif #endif case I_HS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_SS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; @@ -931,6 +1017,10 @@ class PolyBus { case I_8266_U1_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; case I_8266_DM_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; case I_8266_BB_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U0_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U1_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_DM_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_BB_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; @@ -991,6 +1081,14 @@ class PolyBus { case I_32_I1_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; #endif // case I_32_BB_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_RN_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; + #endif + #endif case I_HS_DOT_3: (static_cast(busPtr))->SetLuminance(b); break; case I_SS_DOT_3: (static_cast(busPtr))->SetLuminance(b); break; @@ -1042,6 +1140,10 @@ class PolyBus { case I_8266_U1_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_8266_DM_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_8266_BB_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; + case I_8266_U0_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + case I_8266_U1_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + case I_8266_DM_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + case I_8266_BB_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1102,6 +1204,13 @@ class PolyBus { case I_32_I1_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; #endif // case I_32_BB_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; + case I_32_RN_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + #endif #endif case I_HS_DOT_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_SS_DOT_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1171,6 +1280,10 @@ class PolyBus { case I_8266_U1_APA106_3: delete (static_cast(busPtr)); break; case I_8266_DM_APA106_3: delete (static_cast(busPtr)); break; case I_8266_BB_APA106_3: delete (static_cast(busPtr)); break; + case I_8266_U0_FW6_5: delete (static_cast(busPtr)); break; + case I_8266_U1_FW6_5: delete (static_cast(busPtr)); break; + case I_8266_DM_FW6_5: delete (static_cast(busPtr)); break; + case I_8266_BB_FW6_5: delete (static_cast(busPtr)); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: delete (static_cast(busPtr)); break; @@ -1231,6 +1344,13 @@ class PolyBus { case I_32_I1_APA106_3: delete (static_cast(busPtr)); break; #endif // case I_32_BB_APA106_3: delete (static_cast(busPtr)); break; + case I_32_RN_FW6_5: delete (static_cast(busPtr)); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_FW6_5: delete (static_cast(busPtr)); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_FW6_5: delete (static_cast(busPtr)); break; + #endif #endif case I_HS_DOT_3: delete (static_cast(busPtr)); break; case I_SS_DOT_3: delete (static_cast(busPtr)); break; @@ -1292,6 +1412,8 @@ class PolyBus { return I_8266_U0_UCS_4 + offset; case TYPE_APA106: return I_8266_U0_APA106_3 + offset; + case TYPE_FW1906: + return I_8266_U0_FW6_5 + offset; } #else //ESP32 uint8_t offset = 0; //0 = RMT (num 0-7) 8 = I2S0 9 = I2S1 @@ -1332,6 +1454,8 @@ class PolyBus { return I_32_RN_UCS_4 + offset; case TYPE_APA106: return I_32_RN_APA106_3 + offset; + case TYPE_FW1906: + return I_32_RN_FW6_5 + offset; } #endif } @@ -1339,4 +1463,6 @@ class PolyBus { } }; -#endif \ No newline at end of file +uint8_t PolyBus::cctWW; +uint8_t PolyBus::cctCW; +#endif diff --git a/wled00/const.h b/wled00/const.h index dd965bc40..6f4c2649e 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -269,6 +269,7 @@ #define TYPE_TM1829 25 #define TYPE_UCS8903 26 #define TYPE_APA106 27 +#define TYPE_FW1906 28 //RGB + CW + WW + unused channel (6 channels per IC) #define TYPE_UCS8904 29 //first RGBW digital type (hardcoded in busmanager.cpp, memUsage()) #define TYPE_SK6812_RGBW 30 #define TYPE_TM1814 31 diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index 611653a64..061d5a9ac 100644 --- a/wled00/data/settings_leds.htm +++ b/wled00/data/settings_leds.htm @@ -188,6 +188,7 @@ if (isDig(t)) { if (is16b(t)) len *= 2; // 16 bit LEDs if (t > 28 && t < 40) ch = 4; //RGBW + if (t == 28) ch = 5; //GRBCW if (maxM < 10000 && d.getElementsByName("L0"+n)[0].value == 3) { //8266 DMA uses 5x the mem mul = 5; } @@ -242,7 +243,7 @@ d.Sf["MA"+n].min = (isVir(t) || isAna(t)) ? 0 : 250; } gId("rf"+n).onclick = (t == 31) ? (()=>{return false}) : (()=>{}); // prevent change for TM1814 - gRGBW |= isRGBW = ((t > 17 && t < 22) || (t > 28 && t < 32) || (t > 40 && t < 46 && t != 43) || t == 88); // RGBW checkbox, TYPE_xxxx values from const.h + gRGBW |= isRGBW = ((t > 17 && t < 22) || (t > 27 && t < 32) || (t > 40 && t < 46 && t != 43) || t == 88); // RGBW checkbox, TYPE_xxxx values from const.h gId("co"+n).style.display = (isVir(t) || isAna(t)) ? "none":"inline"; // hide color order for PWM gId("dig"+n+"w").style.display = (isDig(t) && isRGBW) ? "inline":"none"; // show swap channels dropdown if (!(isDig(t) && isRGBW)) d.Sf["WO"+n].value = 0; // reset swapping @@ -383,6 +384,7 @@ ${i+1}: \ \ \ +\ \ \ \ From 505768db0469ccbb2c9a1cf786cc7de52e6a4130 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Kristan?= Date: Mon, 11 Mar 2024 11:17:45 +0100 Subject: [PATCH 069/114] Some fixes & implement recommendation from @Aircoookie https://github.com/Aircoookie/WLED/pull/3298#issuecomment-1651910418 --- wled00/bus_manager.cpp | 28 +++++++++++++--------------- wled00/bus_wrapper.h | 25 +++++++++---------------- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index 35538a78a..6fd55bb5d 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -205,10 +205,11 @@ void BusDigital::show() { _milliAmpsTotal = 0; if (!_valid) return; + uint8_t cctWW = 0, cctCW = 0; uint8_t newBri = estimateCurrentAndLimitBri(); // will fill _milliAmpsTotal if (newBri < _bri) PolyBus::setBrightness(_busPtr, _iType, newBri); // limit brightness to stay within current limits - if (_data) { // use _buffering this causes ~20% FPS drop + if (_data) { size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); for (size_t i=0; i<_len; i++) { size_t offset = i*channels; @@ -226,7 +227,8 @@ void BusDigital::show() { uint16_t pix = i; if (_reversed) pix = _len - pix -1; pix += _skip; - PolyBus::setPixelColor(_busPtr, _iType, pix, c, co); + if (_type == TYPE_FW1906) Bus::calculateCCT(c, cctWW, cctCW); + PolyBus::setPixelColor(_busPtr, _iType, pix, c, co, (cctCW<<8) | cctWW); } #if !defined(STATUSLED) || STATUSLED>=0 if (_skip) PolyBus::setPixelColor(_busPtr, _iType, 0, 0, _colorOrderMap.getPixelColorOrder(_start, _colorOrder)); // paint skipped pixels black @@ -239,7 +241,8 @@ void BusDigital::show() { for (unsigned i = 0; i < hwLen; i++) { // use 0 as color order, actual order does not matter here as we just update the channel values as-is uint32_t c = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, i, 0), _bri); - PolyBus::setPixelColor(_busPtr, _iType, i, c, 0); // repaint all pixels with new brightness + if (_type == TYPE_FW1906) Bus::calculateCCT(c, cctWW, cctCW); + PolyBus::setPixelColor(_busPtr, _iType, i, c, 0, (cctCW<<8) | cctWW); // repaint all pixels with new brightness } } } @@ -278,10 +281,10 @@ void BusDigital::setStatusPixel(uint32_t c) { void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { if (!_valid) return; + uint8_t cctWW = 0, cctCW = 0; if (Bus::hasWhite(_type)) c = autoWhiteCalc(c); if (_cct >= 1900) c = colorBalanceFromKelvin(_cct, c); //color correction from CCT - if (_type == TYPE_FW1906) calculateCCT(c, PolyBus::cctWW, PolyBus::cctCW); // FW1906 ignores W component in c - if (_data) { // use _buffering this causes ~20% FPS drop + if (_data) { size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); size_t offset = pix*channels; if (Bus::hasRGB(_type)) { @@ -304,14 +307,15 @@ void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { case 2: c = RGBW32(R(cOld), G(cOld), W(c) , 0); break; } } - PolyBus::setPixelColor(_busPtr, _iType, pix, c, co); + if (_type == TYPE_FW1906) Bus::calculateCCT(c, cctWW, cctCW); + PolyBus::setPixelColor(_busPtr, _iType, pix, c, co, (cctCW<<8) | cctWW); } } // returns original color if global buffering is enabled, else returns lossly restored color from bus uint32_t IRAM_ATTR BusDigital::getPixelColor(uint16_t pix) { if (!_valid) return 0; - if (_data) { // use _buffering this causes ~20% FPS drop + if (_data) { size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); size_t offset = pix*channels; uint32_t c; @@ -422,22 +426,16 @@ void BusPwm::setPixelColor(uint16_t pix, uint32_t c) { uint8_t g = G(c); uint8_t b = B(c); uint8_t w = W(c); - - uint8_t ww, cw; - - calculateCCT(c, ww, cw); switch (_type) { case TYPE_ANALOG_1CH: //one channel (white), relies on auto white calculation _data[0] = w; break; case TYPE_ANALOG_2CH: //warm white + cold white - _data[1] = cw; - _data[0] = ww; + Bus::calculateCCT(c, _data[0], _data[1]); break; case TYPE_ANALOG_5CH: //RGB + warm white + cold white - _data[4] = cw; - w = ww; + Bus::calculateCCT(c, w, _data[4]); case TYPE_ANALOG_4CH: //RGBW _data[3] = w; case TYPE_ANALOG_3CH: //standard dumb RGB diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index e329246f1..fafe3a460 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -314,11 +314,6 @@ //handles pointer type conversion for all possible bus types class PolyBus { public: - // WW and CW components for chips that support them (FW1906). They have to be set before calling - // PolyBus::setPixelColor(). In such case W component has no meaning in setPixelColor() - // as there is no support for WW/CW API yet - // if both values are 0, W component *may* be used instead (for WW & CW) - static uint8_t cctWW, cctCW; // initialize SPI bus speed for DotStar methods template @@ -837,12 +832,13 @@ class PolyBus { return true; } - static void setPixelColor(void* busPtr, uint8_t busType, uint16_t pix, uint32_t c, uint8_t co) { + static void setPixelColor(void* busPtr, uint8_t busType, uint16_t pix, uint32_t c, uint8_t co, uint16_t wwcw = 0) { uint8_t r = c >> 16; uint8_t g = c >> 8; uint8_t b = c >> 0; uint8_t w = c >> 24; RgbwColor col; + uint8_t cctWW = wwcw & 0xFF, cctCW = (wwcw>>8) & 0xFF; // reorder channels to selected order switch (co & 0x0F) { @@ -1140,10 +1136,10 @@ class PolyBus { case I_8266_U1_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_8266_DM_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_8266_BB_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; - case I_8266_U0_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; - case I_8266_U1_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; - case I_8266_DM_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; - case I_8266_BB_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + case I_8266_U0_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + case I_8266_U1_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + case I_8266_DM_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + case I_8266_BB_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1204,12 +1200,12 @@ class PolyBus { case I_32_I1_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; #endif // case I_32_BB_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; - case I_32_RN_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + case I_32_RN_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W #ifndef WLED_NO_I2S0_PIXELBUS - case I_32_I0_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + case I_32_I0_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W #endif #ifndef WLED_NO_I2S1_PIXELBUS - case I_32_I1_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.WW>>8); } break; + case I_32_I1_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W #endif #endif case I_HS_DOT_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1462,7 +1458,4 @@ class PolyBus { return I_NONE; } }; - -uint8_t PolyBus::cctWW; -uint8_t PolyBus::cctCW; #endif From a42f78b08bd78f93509f9e0fed388f98a680fedc Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Thu, 14 Mar 2024 20:27:03 +0100 Subject: [PATCH 070/114] Update CONTRIBUTING.md Trying to explain why any PR should have a`description` --- CONTRIBUTING.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ddf61ec80..168131160 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,6 +2,16 @@ Here are a few suggestions to make it easier for you to contribute! +### Describe your PR + +Please add a description of your proposed code changes. It does not need to be an exhaustive essay, however a PR with no description or just a few words might not get accepted, simply because very basic information is missing. + +A good description helps us to review and understand your proposed changes. For example, you could say a few words about +* what you try to achieve (new feature, fixing a bug, refactoring, security enhancements, etc.) +* how your code works (short technical summary - focus on important aspects that might not be obvious when reading the code) +* testing you performed, known limitations, open ends you possibly could not solve. +* any areas where you like to get help from an experienced maintainer (yes WLED has become big 😉) + ### Target branch for pull requests Please make all PRs against the `0_15` branch. @@ -79,4 +89,4 @@ Good: There is no hard character limit for a comment within a line, though as a rule of thumb consider wrapping after 120 characters. -Inline comments are OK if they describe that line only and are not exceedingly wide. \ No newline at end of file +Inline comments are OK if they describe that line only and are not exceedingly wide. From 0dcb56eab50d41bb015eeba6e709ed3330507ae7 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sat, 16 Mar 2024 12:36:05 +0100 Subject: [PATCH 071/114] Modify Bus & BusManager to accommodate digital CCT - additional fix in hasWhite() & setCCT() & hasCCT() --- wled00/FX_fcn.cpp | 15 +++++------ wled00/bus_manager.cpp | 56 ++++++++++++++++++++++-------------------- wled00/bus_manager.h | 25 +++++++++++++++---- 3 files changed, 57 insertions(+), 39 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 42e98452f..edd3a068d 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -538,6 +538,7 @@ bool Segment::setColor(uint8_t slot, uint32_t c) { //returns true if changed } void Segment::setCCT(uint16_t k) { + if (!isCCT() || !correctWB) return; if (k > 255) { //kelvin value, convert to 0-255 if (k < 1900) k = 1900; if (k > 10091) k = 10091; @@ -1162,12 +1163,16 @@ void WS2812FX::service() { uint16_t delay = FRAMETIME; if (!seg.freeze) { //only run effect function if not frozen + int16_t oldCCT = BusManager::getSegmentCCT(); // store original CCT value (actually it is not Segment based) _virtualSegmentLength = seg.virtualLength(); //SEGLEN _colors_t[0] = gamma32(seg.currentColor(0)); _colors_t[1] = gamma32(seg.currentColor(1)); _colors_t[2] = gamma32(seg.currentColor(2)); seg.currentPalette(_currentPalette, seg.palette); // we need to pass reference - if (!cctFromRgb || correctWB) BusManager::setSegmentCCT(seg.currentBri(true), correctWB); + // when correctWB is true we need to correct/adjust RGB value according to desired CCT value, but it will also affect actual WW/CW ratio + // when cctFromRgb is true we implicitly calculate WW and CW from RGB values + if (cctFromRgb) BusManager::setSegmentCCT(-1); + else BusManager::setSegmentCCT(seg.currentBri(true), correctWB); // Effect blending // When two effects are being blended, each may have different segment data, this // data needs to be saved first and then restored before running previous mode. @@ -1190,6 +1195,7 @@ void WS2812FX::service() { #endif seg.call++; if (seg.isInTransition() && delay > FRAMETIME) delay = FRAMETIME; // force faster updates during transition + BusManager::setSegmentCCT(oldCCT); // restore old CCT for ABL adjustments } seg.next_time = nowUp + delay; @@ -1198,7 +1204,6 @@ void WS2812FX::service() { _segment_index++; } _virtualSegmentLength = 0; - BusManager::setSegmentCCT(-1); _isServicing = false; _triggered = false; @@ -1390,11 +1395,7 @@ bool WS2812FX::hasCCTBus(void) { for (size_t b = 0; b < BusManager::getNumBusses(); b++) { Bus *bus = BusManager::getBus(b); if (bus == nullptr || bus->getLength()==0) break; - switch (bus->getType()) { - case TYPE_ANALOG_5CH: - case TYPE_ANALOG_2CH: - return true; - } + if (bus->hasCCT()) return true; } return false; } diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index 6fd55bb5d..a9c3ac44d 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -11,7 +11,6 @@ //colors.cpp uint32_t colorBalanceFromKelvin(uint16_t kelvin, uint32_t rgb); -void colorRGBtoRGBW(byte* rgb); //udp.cpp uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte *buffer, uint8_t bri=255, bool isRGBW=false); @@ -122,7 +121,7 @@ BusDigital::BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com) } _iType = PolyBus::getI(bc.type, _pins, nr); if (_iType == I_NONE) return; - if (bc.doubleBuffer && !allocData(bc.count * (Bus::hasWhite(_type) + 3*Bus::hasRGB(_type)))) return; //warning: hardcoded channel count + if (bc.doubleBuffer && !allocData(bc.count * Bus::getNumberOfChannels(bc.type))) return; //_buffering = bc.doubleBuffer; uint16_t lenToCreate = bc.count; if (bc.type == TYPE_WS2812_1CH_X3) lenToCreate = NUM_ICS_WS2812_1CH_3X(bc.count); // only needs a third of "RGB" LEDs for NeoPixelBus @@ -210,9 +209,10 @@ void BusDigital::show() { if (newBri < _bri) PolyBus::setBrightness(_busPtr, _iType, newBri); // limit brightness to stay within current limits if (_data) { - size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); + size_t channels = getNumberOfChannels(); + int16_t oldCCT = _cct; // temporarily save bus CCT for (size_t i=0; i<_len; i++) { - size_t offset = i*channels; + size_t offset = i * channels; uint8_t co = _colorOrderMap.getPixelColorOrder(i+_start, _colorOrder); uint32_t c; if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs (_len is always a multiple of 3) @@ -222,18 +222,26 @@ void BusDigital::show() { case 2: c = RGBW32(_data[offset-2], _data[offset-1], _data[offset] , 0); break; } } else { - c = RGBW32(_data[offset],_data[offset+1],_data[offset+2],(Bus::hasWhite(_type)?_data[offset+3]:0)); + if (hasRGB()) c = RGBW32(_data[offset], _data[offset+1], _data[offset+2], hasWhite() ? _data[offset+3] : 0); + else c = RGBW32(0, 0, 0, _data[offset]); + } + if (hasCCT()) { + // unfortunately as a segment may span multiple buses or a bus may contain multiple segments and each segment may have different CCT + // we need to extract and appy CCT value for each pixel individually even though all buses share the same _cct variable + // TODO: there is an issue if CCT is calculated from RGB value (_cct==-1), we cannot do that with double buffer + _cct = _data[offset+channels-1]; + Bus::calculateCCT(c, cctWW, cctCW); } uint16_t pix = i; if (_reversed) pix = _len - pix -1; pix += _skip; - if (_type == TYPE_FW1906) Bus::calculateCCT(c, cctWW, cctCW); PolyBus::setPixelColor(_busPtr, _iType, pix, c, co, (cctCW<<8) | cctWW); } #if !defined(STATUSLED) || STATUSLED>=0 if (_skip) PolyBus::setPixelColor(_busPtr, _iType, 0, 0, _colorOrderMap.getPixelColorOrder(_start, _colorOrder)); // paint skipped pixels black #endif for (int i=1; i<_skip; i++) PolyBus::setPixelColor(_busPtr, _iType, i, 0, _colorOrderMap.getPixelColorOrder(_start, _colorOrder)); // paint skipped pixels black + _cct = oldCCT; } else { if (newBri < _bri) { uint16_t hwLen = _len; @@ -241,7 +249,7 @@ void BusDigital::show() { for (unsigned i = 0; i < hwLen; i++) { // use 0 as color order, actual order does not matter here as we just update the channel values as-is uint32_t c = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, i, 0), _bri); - if (_type == TYPE_FW1906) Bus::calculateCCT(c, cctWW, cctCW); + if (hasCCT()) Bus::calculateCCT(c, cctWW, cctCW); // this will unfortunately corrupt (segment) CCT data on every bus PolyBus::setPixelColor(_busPtr, _iType, i, c, 0, (cctCW<<8) | cctWW); // repaint all pixels with new brightness } } @@ -282,17 +290,19 @@ void BusDigital::setStatusPixel(uint32_t c) { void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { if (!_valid) return; uint8_t cctWW = 0, cctCW = 0; - if (Bus::hasWhite(_type)) c = autoWhiteCalc(c); + if (hasWhite()) c = autoWhiteCalc(c); if (_cct >= 1900) c = colorBalanceFromKelvin(_cct, c); //color correction from CCT if (_data) { - size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); - size_t offset = pix*channels; - if (Bus::hasRGB(_type)) { + size_t offset = pix * getNumberOfChannels(); + if (hasRGB()) { _data[offset++] = R(c); _data[offset++] = G(c); _data[offset++] = B(c); } - if (Bus::hasWhite(_type)) _data[offset] = W(c); + if (hasWhite()) _data[offset++] = W(c); + // unfortunately as a segment may span multiple buses or a bus may contain multiple segments and each segment may have different CCT + // we need to store CCT value for each pixel (if there is a color correction in play, convert K in CCT ratio) + if (hasCCT()) _data[offset] = _cct >= 1900 ? (_cct - 1900) >> 5 : (_cct < 0 ? 127 : _cct); // TODO: if _cct == -1 we simply ignore it } else { if (_reversed) pix = _len - pix -1; pix += _skip; @@ -307,7 +317,7 @@ void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { case 2: c = RGBW32(R(cOld), G(cOld), W(c) , 0); break; } } - if (_type == TYPE_FW1906) Bus::calculateCCT(c, cctWW, cctCW); + if (hasCCT()) Bus::calculateCCT(c, cctWW, cctCW); PolyBus::setPixelColor(_busPtr, _iType, pix, c, co, (cctCW<<8) | cctWW); } } @@ -316,13 +326,12 @@ void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { uint32_t IRAM_ATTR BusDigital::getPixelColor(uint16_t pix) { if (!_valid) return 0; if (_data) { - size_t channels = Bus::hasWhite(_type) + 3*Bus::hasRGB(_type); - size_t offset = pix*channels; + size_t offset = pix * getNumberOfChannels(); uint32_t c; - if (!Bus::hasRGB(_type)) { + if (!hasRGB()) { c = RGBW32(_data[offset], _data[offset], _data[offset], _data[offset]); } else { - c = RGBW32(_data[offset], _data[offset+1], _data[offset+2], Bus::hasWhite(_type) ? _data[offset+3] : 0); + c = RGBW32(_data[offset], _data[offset+1], _data[offset+2], hasWhite() ? _data[offset+3] : 0); } return c; } else { @@ -640,12 +649,10 @@ uint32_t BusManager::memUsage(BusConfig &bc) { if (bc.type == TYPE_ONOFF || IS_PWM(bc.type)) return 5; uint16_t len = bc.count + bc.skipAmount; - uint16_t channels = 3; + uint16_t channels = Bus::getNumberOfChannels(bc.type); uint16_t multiplier = 1; if (IS_DIGITAL(bc.type)) { // digital types if (IS_16BIT(bc.type)) len *= 2; // 16-bit LEDs - if (bc.type > 28) channels = 4; //RGBW - if (bc.type == TYPE_FW1906) channels = 5; //GRBCW #ifdef ESP8266 if (bc.pins[0] == 3) { //8266 DMA uses 5x the mem multiplier = 5; @@ -654,11 +661,6 @@ uint32_t BusManager::memUsage(BusConfig &bc) { multiplier = 2; #endif } - if (IS_VIRTUAL(bc.type)) { - switch (bc.type) { - case TYPE_NET_DDP_RGBW: channels = 4; break; - } - } return len * channels * multiplier; //RGB } @@ -720,7 +722,7 @@ void BusManager::setSegmentCCT(int16_t cct, bool allowWBCorrection) { if (cct >= 0) { //if white balance correction allowed, save as kelvin value instead of 0-255 if (allowWBCorrection) cct = 1900 + (cct << 5); - } else cct = -1; + } else cct = -1; // will use kelvin approximation from RGB Bus::setCCT(cct); } @@ -764,4 +766,4 @@ uint8_t BusManager::numBusses = 0; Bus* BusManager::busses[WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES]; ColorOrderMap BusManager::colorOrderMap = {}; uint16_t BusManager::_milliAmpsUsed = 0; -uint16_t BusManager::_milliAmpsMax = ABL_MILLIAMPS_DEFAULT; +uint16_t BusManager::_milliAmpsMax = ABL_MILLIAMPS_DEFAULT; \ No newline at end of file diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index 6b8e9d7eb..233c2a668 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -141,6 +141,8 @@ class Bus { virtual uint16_t getLEDCurrent() { return 0; } virtual uint16_t getUsedCurrent() { return 0; } virtual uint16_t getMaxCurrent() { return 0; } + virtual uint8_t getNumberOfChannels() { return hasWhite(_type) + 3*hasRGB(_type) + hasCCT(_type); } + static inline uint8_t getNumberOfChannels(uint8_t type) { return hasWhite(type) + 3*hasRGB(type) + hasCCT(type); } inline void setReversed(bool reversed) { _reversed = reversed; } inline uint16_t getStart() { return _start; } inline void setStart(uint16_t start) { _start = start; } @@ -157,9 +159,10 @@ class Bus { } virtual bool hasWhite(void) { return Bus::hasWhite(_type); } static bool hasWhite(uint8_t type) { - if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_SK6812_RGBW || type == TYPE_TM1814 || type == TYPE_UCS8904 || type == TYPE_FW1906) return true; // digital types with white channel + if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || + type == TYPE_SK6812_RGBW || type == TYPE_TM1814 || type == TYPE_UCS8904 || type == TYPE_FW1906) return true; // digital types with white channel if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true; // analog types with white channel - if (type == TYPE_NET_DDP_RGBW) return true; // network types with white channel + if (type == TYPE_NET_DDP_RGBW || type == TYPE_NET_ARTNET_RGBW) return true; // network types with white channel return false; } virtual bool hasCCT(void) { return Bus::hasCCT(_type); } @@ -168,7 +171,8 @@ class Bus { type == TYPE_ANALOG_2CH || type == TYPE_ANALOG_5CH || type == TYPE_FW1906) return true; return false; } - static void setCCT(uint16_t cct) { + static int16_t getCCT() { return _cct; } + static void setCCT(int16_t cct) { _cct = cct; } static void setCCTBlend(uint8_t b) { @@ -196,8 +200,7 @@ class Bus { #else //0 - linear (CCT 127 = 50% warm, 50% cold), 127 - additive CCT blending (CCT 127 = 100% warm, 100% cold) if (cct < _cctBlend) ww = 255; - else ww = ((255-cct) * 255) / (255 - _cctBlend); - + else ww = ((255-cct) * 255) / (255 - _cctBlend); if ((255-cct) < _cctBlend) cw = 255; else cw = (cct * 255) / (255 - _cctBlend); @@ -220,8 +223,17 @@ class Bus { bool _needsRefresh; uint8_t _autoWhiteMode; uint8_t *_data; + // global Auto White Calculation override static uint8_t _gAWM; + // _cct has the following menaings (see calculateCCT() & BusManager::setSegmentCCT()): + // -1 means to extract approximate CCT value in K from RGB (in calcualteCCT()) + // [0,255] is the exact CCT value where 0 means warm and 255 cold + // [1900,10060] only for color correction expressed in K (colorBalanceFromKelvin()) static int16_t _cct; + // _cctBlend determines WW/CW blending: + // 0 - linear (CCT 127 => 50% warm, 50% cold) + // 63 - semi additive/nonlinear (CCT 127 => 66% warm, 66% cold) + // 127 - additive CCT blending (CCT 127 => 100% warm, 100% cold) static uint8_t _cctBlend; uint32_t autoWhiteCalc(uint32_t c); @@ -363,9 +375,12 @@ class BusManager { static void setStatusPixel(uint32_t c); static void setPixelColor(uint16_t pix, uint32_t c); static void setBrightness(uint8_t b); + // for setSegmentCCT(), cct can only be in [-1,255] range; allowWBCorrection will convert it to K + // WARNING: setSegmentCCT() is a misleading name!!! much better would be setGlobalCCT() or just setCCT() static void setSegmentCCT(int16_t cct, bool allowWBCorrection = false); static void setMilliampsMax(uint16_t max) { _milliAmpsMax = max;} static uint32_t getPixelColor(uint16_t pix); + static inline int16_t getSegmentCCT() { return Bus::getCCT(); } static Bus* getBus(uint8_t busNr); From 52a1b0453c805f4e889631e622b21cc037a1a502 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sat, 16 Mar 2024 15:26:52 +0100 Subject: [PATCH 072/114] MQTT cleanup & reduction --- wled00/led.cpp | 7 +- wled00/mqtt.cpp | 395 ++++++++++++++++++++++++------------------------ wled00/wled.h | 1 - 3 files changed, 200 insertions(+), 203 deletions(-) mode change 100755 => 100644 wled00/wled.h diff --git a/wled00/led.cpp b/wled00/led.cpp index ba772df9b..23c8d03c5 100644 --- a/wled00/led.cpp +++ b/wled00/led.cpp @@ -172,7 +172,9 @@ void updateInterfaces(uint8_t callMode) espalexaDevice->setColor(col[0], col[1], col[2]); } #endif - doPublishMqtt = true; + #ifndef WLED_DISABLE_MQTT + publishMqtt(); + #endif } @@ -180,9 +182,6 @@ void handleTransitions() { //handle still pending interface update updateInterfaces(interfaceUpdateCallMode); -#ifndef WLED_DISABLE_MQTT - if (doPublishMqtt) publishMqtt(); -#endif if (transitionActive && strip.getTransition() > 0) { float tper = (millis() - transitionStartTime)/(float)strip.getTransition(); diff --git a/wled00/mqtt.cpp b/wled00/mqtt.cpp index 3c753a9a9..810291094 100644 --- a/wled00/mqtt.cpp +++ b/wled00/mqtt.cpp @@ -1,198 +1,197 @@ -#include "wled.h" - -/* - * MQTT communication protocol for home automation - */ - -#ifdef WLED_ENABLE_MQTT -#define MQTT_KEEP_ALIVE_TIME 60 // contact the MQTT broker every 60 seconds - -void parseMQTTBriPayload(char* payload) -{ - if (strstr(payload, "ON") || strstr(payload, "on") || strstr(payload, "true")) {bri = briLast; stateUpdated(CALL_MODE_DIRECT_CHANGE);} - else if (strstr(payload, "T" ) || strstr(payload, "t" )) {toggleOnOff(); stateUpdated(CALL_MODE_DIRECT_CHANGE);} - else { - uint8_t in = strtoul(payload, NULL, 10); - if (in == 0 && bri > 0) briLast = bri; - bri = in; - stateUpdated(CALL_MODE_DIRECT_CHANGE); - } -} - - -void onMqttConnect(bool sessionPresent) -{ - //(re)subscribe to required topics - char subuf[38]; - - if (mqttDeviceTopic[0] != 0) { - strlcpy(subuf, mqttDeviceTopic, 33); - mqtt->subscribe(subuf, 0); - strcat_P(subuf, PSTR("/col")); - mqtt->subscribe(subuf, 0); - strlcpy(subuf, mqttDeviceTopic, 33); - strcat_P(subuf, PSTR("/api")); - mqtt->subscribe(subuf, 0); - } - - if (mqttGroupTopic[0] != 0) { - strlcpy(subuf, mqttGroupTopic, 33); - mqtt->subscribe(subuf, 0); - strcat_P(subuf, PSTR("/col")); - mqtt->subscribe(subuf, 0); - strlcpy(subuf, mqttGroupTopic, 33); - strcat_P(subuf, PSTR("/api")); - mqtt->subscribe(subuf, 0); - } - - usermods.onMqttConnect(sessionPresent); - - doPublishMqtt = true; - DEBUG_PRINTLN(F("MQTT ready")); -} - - -void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { - static char *payloadStr; - - DEBUG_PRINT(F("MQTT msg: ")); - DEBUG_PRINTLN(topic); - - // paranoia check to avoid npe if no payload - if (payload==nullptr) { - DEBUG_PRINTLN(F("no payload -> leave")); - return; - } - - if (index == 0) { // start (1st partial packet or the only packet) - if (payloadStr) delete[] payloadStr; // fail-safe: release buffer - payloadStr = new char[total+1]; // allocate new buffer - } - if (payloadStr == nullptr) return; // buffer not allocated - - // copy (partial) packet to buffer and 0-terminate it if it is last packet - char* buff = payloadStr + index; - memcpy(buff, payload, len); - if (index + len >= total) { // at end - payloadStr[total] = '\0'; // terminate c style string - } else { - DEBUG_PRINTLN(F("Partial packet received.")); - return; // process next packet - } - DEBUG_PRINTLN(payloadStr); - - size_t topicPrefixLen = strlen(mqttDeviceTopic); - if (strncmp(topic, mqttDeviceTopic, topicPrefixLen) == 0) { - topic += topicPrefixLen; - } else { - topicPrefixLen = strlen(mqttGroupTopic); - if (strncmp(topic, mqttGroupTopic, topicPrefixLen) == 0) { - topic += topicPrefixLen; - } else { - // Non-Wled Topic used here. Probably a usermod subscribed to this topic. - usermods.onMqttMessage(topic, payloadStr); - delete[] payloadStr; - payloadStr = nullptr; - return; - } - } - - //Prefix is stripped from the topic at this point - - if (strcmp_P(topic, PSTR("/col")) == 0) { - colorFromDecOrHexString(col, payloadStr); - colorUpdated(CALL_MODE_DIRECT_CHANGE); - } else if (strcmp_P(topic, PSTR("/api")) == 0) { - if (!requestJSONBufferLock(15)) { - delete[] payloadStr; - payloadStr = nullptr; - return; - } - if (payloadStr[0] == '{') { //JSON API - deserializeJson(*pDoc, payloadStr); - deserializeState(pDoc->as()); - } else { //HTTP API - String apireq = "win"; apireq += '&'; // reduce flash string usage - apireq += payloadStr; - handleSet(nullptr, apireq); - } - releaseJSONBufferLock(); - } else if (strlen(topic) != 0) { - // non standard topic, check with usermods - usermods.onMqttMessage(topic, payloadStr); - } else { - // topmost topic (just wled/MAC) - parseMQTTBriPayload(payloadStr); - } - delete[] payloadStr; - payloadStr = nullptr; -} - - -void publishMqtt() -{ - doPublishMqtt = false; - if (!WLED_MQTT_CONNECTED) return; - DEBUG_PRINTLN(F("Publish MQTT")); - - #ifndef USERMOD_SMARTNEST - char s[10]; - char subuf[38]; - - sprintf_P(s, PSTR("%u"), bri); - strlcpy(subuf, mqttDeviceTopic, 33); - strcat_P(subuf, PSTR("/g")); - mqtt->publish(subuf, 0, retainMqttMsg, s); // optionally retain message (#2263) - - sprintf_P(s, PSTR("#%06X"), (col[3] << 24) | (col[0] << 16) | (col[1] << 8) | (col[2])); - strlcpy(subuf, mqttDeviceTopic, 33); - strcat_P(subuf, PSTR("/c")); - mqtt->publish(subuf, 0, retainMqttMsg, s); // optionally retain message (#2263) - - strlcpy(subuf, mqttDeviceTopic, 33); - strcat_P(subuf, PSTR("/status")); - mqtt->publish(subuf, 0, true, "online"); // retain message for a LWT - - char apires[1024]; // allocating 1024 bytes from stack can be risky - XML_response(nullptr, apires); - strlcpy(subuf, mqttDeviceTopic, 33); - strcat_P(subuf, PSTR("/v")); - mqtt->publish(subuf, 0, retainMqttMsg, apires); // optionally retain message (#2263) - #endif -} - - -//HA autodiscovery was removed in favor of the native integration in HA v0.102.0 - -bool initMqtt() -{ - if (!mqttEnabled || mqttServer[0] == 0 || !WLED_CONNECTED) return false; - - if (mqtt == nullptr) { - mqtt = new AsyncMqttClient(); - mqtt->onMessage(onMqttMessage); - mqtt->onConnect(onMqttConnect); - } - if (mqtt->connected()) return true; - - DEBUG_PRINTLN(F("Reconnecting MQTT")); - IPAddress mqttIP; - if (mqttIP.fromString(mqttServer)) //see if server is IP or domain - { - mqtt->setServer(mqttIP, mqttPort); - } else { - mqtt->setServer(mqttServer, mqttPort); - } - mqtt->setClientId(mqttClientID); - if (mqttUser[0] && mqttPass[0]) mqtt->setCredentials(mqttUser, mqttPass); - - #ifndef USERMOD_SMARTNEST - strlcpy(mqttStatusTopic, mqttDeviceTopic, 33); - strcat_P(mqttStatusTopic, PSTR("/status")); - mqtt->setWill(mqttStatusTopic, 0, true, "offline"); // LWT message - #endif - mqtt->setKeepAlive(MQTT_KEEP_ALIVE_TIME); - mqtt->connect(); - return true; -} -#endif +#include "wled.h" + +/* + * MQTT communication protocol for home automation + */ + +#ifdef WLED_ENABLE_MQTT +#define MQTT_KEEP_ALIVE_TIME 60 // contact the MQTT broker every 60 seconds + +void parseMQTTBriPayload(char* payload) +{ + if (strstr(payload, "ON") || strstr(payload, "on") || strstr(payload, "true")) {bri = briLast; stateUpdated(CALL_MODE_DIRECT_CHANGE);} + else if (strstr(payload, "T" ) || strstr(payload, "t" )) {toggleOnOff(); stateUpdated(CALL_MODE_DIRECT_CHANGE);} + else { + uint8_t in = strtoul(payload, NULL, 10); + if (in == 0 && bri > 0) briLast = bri; + bri = in; + stateUpdated(CALL_MODE_DIRECT_CHANGE); + } +} + + +void onMqttConnect(bool sessionPresent) +{ + //(re)subscribe to required topics + char subuf[38]; + + if (mqttDeviceTopic[0] != 0) { + strlcpy(subuf, mqttDeviceTopic, 33); + mqtt->subscribe(subuf, 0); + strcat_P(subuf, PSTR("/col")); + mqtt->subscribe(subuf, 0); + strlcpy(subuf, mqttDeviceTopic, 33); + strcat_P(subuf, PSTR("/api")); + mqtt->subscribe(subuf, 0); + } + + if (mqttGroupTopic[0] != 0) { + strlcpy(subuf, mqttGroupTopic, 33); + mqtt->subscribe(subuf, 0); + strcat_P(subuf, PSTR("/col")); + mqtt->subscribe(subuf, 0); + strlcpy(subuf, mqttGroupTopic, 33); + strcat_P(subuf, PSTR("/api")); + mqtt->subscribe(subuf, 0); + } + + usermods.onMqttConnect(sessionPresent); + + DEBUG_PRINTLN(F("MQTT ready")); + publishMqtt(); +} + + +void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties properties, size_t len, size_t index, size_t total) { + static char *payloadStr; + + DEBUG_PRINT(F("MQTT msg: ")); + DEBUG_PRINTLN(topic); + + // paranoia check to avoid npe if no payload + if (payload==nullptr) { + DEBUG_PRINTLN(F("no payload -> leave")); + return; + } + + if (index == 0) { // start (1st partial packet or the only packet) + if (payloadStr) delete[] payloadStr; // fail-safe: release buffer + payloadStr = new char[total+1]; // allocate new buffer + } + if (payloadStr == nullptr) return; // buffer not allocated + + // copy (partial) packet to buffer and 0-terminate it if it is last packet + char* buff = payloadStr + index; + memcpy(buff, payload, len); + if (index + len >= total) { // at end + payloadStr[total] = '\0'; // terminate c style string + } else { + DEBUG_PRINTLN(F("MQTT partial packet received.")); + return; // process next packet + } + DEBUG_PRINTLN(payloadStr); + + size_t topicPrefixLen = strlen(mqttDeviceTopic); + if (strncmp(topic, mqttDeviceTopic, topicPrefixLen) == 0) { + topic += topicPrefixLen; + } else { + topicPrefixLen = strlen(mqttGroupTopic); + if (strncmp(topic, mqttGroupTopic, topicPrefixLen) == 0) { + topic += topicPrefixLen; + } else { + // Non-Wled Topic used here. Probably a usermod subscribed to this topic. + usermods.onMqttMessage(topic, payloadStr); + delete[] payloadStr; + payloadStr = nullptr; + return; + } + } + + //Prefix is stripped from the topic at this point + + if (strcmp_P(topic, PSTR("/col")) == 0) { + colorFromDecOrHexString(col, payloadStr); + colorUpdated(CALL_MODE_DIRECT_CHANGE); + } else if (strcmp_P(topic, PSTR("/api")) == 0) { + if (!requestJSONBufferLock(15)) { + delete[] payloadStr; + payloadStr = nullptr; + return; + } + if (payloadStr[0] == '{') { //JSON API + deserializeJson(*pDoc, payloadStr); + deserializeState(pDoc->as()); + } else { //HTTP API + String apireq = "win"; apireq += '&'; // reduce flash string usage + apireq += payloadStr; + handleSet(nullptr, apireq); + } + releaseJSONBufferLock(); + } else if (strlen(topic) != 0) { + // non standard topic, check with usermods + usermods.onMqttMessage(topic, payloadStr); + } else { + // topmost topic (just wled/MAC) + parseMQTTBriPayload(payloadStr); + } + delete[] payloadStr; + payloadStr = nullptr; +} + + +void publishMqtt() +{ + if (!WLED_MQTT_CONNECTED) return; + DEBUG_PRINTLN(F("Publish MQTT")); + + #ifndef USERMOD_SMARTNEST + char s[10]; + char subuf[48]; + + sprintf_P(s, PSTR("%u"), bri); + strlcpy(subuf, mqttDeviceTopic, 33); + strcat_P(subuf, PSTR("/g")); + mqtt->publish(subuf, 0, retainMqttMsg, s); // optionally retain message (#2263) + + sprintf_P(s, PSTR("#%06X"), (col[3] << 24) | (col[0] << 16) | (col[1] << 8) | (col[2])); + strlcpy(subuf, mqttDeviceTopic, 33); + strcat_P(subuf, PSTR("/c")); + mqtt->publish(subuf, 0, retainMqttMsg, s); // optionally retain message (#2263) + + strlcpy(subuf, mqttDeviceTopic, 33); + strcat_P(subuf, PSTR("/status")); + mqtt->publish(subuf, 0, true, "online"); // retain message for a LWT + + char apires[1024]; // allocating 1024 bytes from stack can be risky + XML_response(nullptr, apires); + strlcpy(subuf, mqttDeviceTopic, 33); + strcat_P(subuf, PSTR("/v")); + mqtt->publish(subuf, 0, retainMqttMsg, apires); // optionally retain message (#2263) + #endif +} + + +//HA autodiscovery was removed in favor of the native integration in HA v0.102.0 + +bool initMqtt() +{ + if (!mqttEnabled || mqttServer[0] == 0 || !WLED_CONNECTED) return false; + + if (mqtt == nullptr) { + mqtt = new AsyncMqttClient(); + mqtt->onMessage(onMqttMessage); + mqtt->onConnect(onMqttConnect); + } + if (mqtt->connected()) return true; + + DEBUG_PRINTLN(F("Reconnecting MQTT")); + IPAddress mqttIP; + if (mqttIP.fromString(mqttServer)) //see if server is IP or domain + { + mqtt->setServer(mqttIP, mqttPort); + } else { + mqtt->setServer(mqttServer, mqttPort); + } + mqtt->setClientId(mqttClientID); + if (mqttUser[0] && mqttPass[0]) mqtt->setCredentials(mqttUser, mqttPass); + + #ifndef USERMOD_SMARTNEST + strlcpy(mqttStatusTopic, mqttDeviceTopic, 33); + strcat_P(mqttStatusTopic, PSTR("/status")); + mqtt->setWill(mqttStatusTopic, 0, true, "offline"); // LWT message + #endif + mqtt->setKeepAlive(MQTT_KEEP_ALIVE_TIME); + mqtt->connect(); + return true; +} +#endif diff --git a/wled00/wled.h b/wled00/wled.h old mode 100755 new mode 100644 index 63ab1c297..00c73c5eb --- a/wled00/wled.h +++ b/wled00/wled.h @@ -705,7 +705,6 @@ WLED_GLOBAL byte optionType; WLED_GLOBAL bool doSerializeConfig _INIT(false); // flag to initiate saving of config WLED_GLOBAL bool doReboot _INIT(false); // flag to initiate reboot from async handlers -WLED_GLOBAL bool doPublishMqtt _INIT(false); // status led #if defined(STATUSLED) From 12bf04826a268963711e8ca9efee383066f140df Mon Sep 17 00:00:00 2001 From: Will Miles Date: Sat, 16 Mar 2024 12:12:02 -0400 Subject: [PATCH 073/114] Update ESPAsyncWebServer to v2.2.0 --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 6306595a2..3ea49c13d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -144,7 +144,7 @@ lib_deps = fastled/FastLED @ 3.6.0 IRremoteESP8266 @ 2.8.2 makuna/NeoPixelBus @ 2.7.5 - https://github.com/Aircoookie/ESPAsyncWebServer.git @ ^2.1.0 + https://github.com/Aircoookie/ESPAsyncWebServer.git @ ^2.2.0 # for I2C interface ;Wire # ESP-NOW library From df6c271830f567e47b310a53a46909ae20cf6922 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Sat, 16 Mar 2024 12:07:26 -0400 Subject: [PATCH 074/114] Use web server ContentType symbols These were mostly PROGMEM already, but every little bit helps. --- wled00/fcn_declare.h | 1 - wled00/file.cpp | 4 +-- wled00/json.cpp | 4 +-- wled00/src/dependencies/json/AsyncJson-v6.h | 6 ++-- wled00/wled_server.cpp | 35 +++------------------ 5 files changed, 11 insertions(+), 39 deletions(-) diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 7e0d6f480..20ac21129 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -434,7 +434,6 @@ void handleSerial(); void updateBaudRate(uint32_t rate); //wled_server.cpp -String getFileContentType(String &filename); void createEditHandler(bool enable); void initServer(); void serveMessage(AsyncWebServerRequest* request, uint16_t code, const String& headl, const String& subl="", byte optionT=255); diff --git a/wled00/file.cpp b/wled00/file.cpp index 37f794424..199009e4e 100644 --- a/wled00/file.cpp +++ b/wled00/file.cpp @@ -375,6 +375,7 @@ void updateFSInfo() { #endif } + #if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) // caching presets in PSRAM may prevent occasional flashes seen when HomeAssitant polls WLED // original idea by @akaricchi (https://github.com/Akaricchi) @@ -420,8 +421,7 @@ bool handleFileRead(AsyncWebServerRequest* request, String path){ DEBUG_PRINT(F("WS FileRead: ")); DEBUG_PRINTLN(path); if(path.endsWith("/")) path += "index.htm"; if(path.indexOf(F("sec")) > -1) return false; - String contentType = getFileContentType(path); - if(request->hasArg(F("download"))) contentType = F("application/octet-stream"); + String contentType = request->hasArg(F("download")) ? F("application/octet-stream") : contentTypeFor(path); /*String pathWithGz = path + ".gz"; if(WLED_FS.exists(pathWithGz)){ request->send(WLED_FS, pathWithGz, contentType); diff --git a/wled00/json.cpp b/wled00/json.cpp index 389dc8ae5..c629cbe4f 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -1065,7 +1065,7 @@ void serveJson(AsyncWebServerRequest* request) } #endif else if (url.indexOf("pal") > 0) { - request->send_P(200, "application/json", JSON_palette_names); // contentType defined in AsyncJson-v6.h + request->send_P(200, FPSTR(CONTENT_TYPE_JSON), JSON_palette_names); return; } else if (url.indexOf(F("cfg")) > 0 && handleFileRead(request, F("/cfg.json"))) { @@ -1185,7 +1185,7 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient) #endif oappend("}"); if (request) { - request->send(200, "application/json", buffer); // contentType defined in AsyncJson-v6.h + request->send(200, FPSTR(CONTENT_TYPE_JSON), buffer); } #ifdef WLED_ENABLE_WEBSOCKETS else { diff --git a/wled00/src/dependencies/json/AsyncJson-v6.h b/wled00/src/dependencies/json/AsyncJson-v6.h index 32ac54607..4a127dedb 100644 --- a/wled00/src/dependencies/json/AsyncJson-v6.h +++ b/wled00/src/dependencies/json/AsyncJson-v6.h @@ -21,8 +21,6 @@ #define DYNAMIC_JSON_DOCUMENT_SIZE 16384 #endif -constexpr const char* JSON_MIMETYPE = "application/json"; - /* * Json Response * */ @@ -66,7 +64,7 @@ class AsyncJsonResponse: public AsyncAbstractResponse { AsyncJsonResponse(JsonDocument *ref, bool isArray=false) : _jsonBuffer(1), _isValid{false} { _code = 200; - _contentType = JSON_MIMETYPE; + _contentType = FPSTR(CONTENT_TYPE_JSON); if(isArray) _root = ref->to(); else @@ -75,7 +73,7 @@ class AsyncJsonResponse: public AsyncAbstractResponse { AsyncJsonResponse(size_t maxJsonBufferSize = DYNAMIC_JSON_DOCUMENT_SIZE, bool isArray=false) : _jsonBuffer(maxJsonBufferSize), _isValid{false} { _code = 200; - _contentType = JSON_MIMETYPE; + _contentType = FPSTR(CONTENT_TYPE_JSON); if(isArray) _root = _jsonBuffer.createNestedArray(); else diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 4ce113cb9..8d2339312 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -18,36 +18,11 @@ static const char s_unlock_ota [] PROGMEM = "Please unlock OTA in security setti static const char s_unlock_cfg [] PROGMEM = "Please unlock settings using PIN code!"; static const char s_notimplemented[] PROGMEM = "Not implemented"; static const char s_accessdenied[] PROGMEM = "Access Denied"; -static const char s_javascript[] PROGMEM = "application/javascript"; -static const char s_json[] = "application/json"; // AsyncJson-v6.h -static const char s_html[] PROGMEM = "text/html"; -static const char s_plain[] = "text/plain"; // Espalexa.h -static const char s_css[] PROGMEM = "text/css"; -static const char s_png[] PROGMEM = "image/png"; -static const char s_gif[] PROGMEM = "image/gif"; -static const char s_jpg[] PROGMEM = "image/jpeg"; -static const char s_ico[] PROGMEM = "image/x-icon"; -//static const char s_xml[] PROGMEM = "text/xml"; -//static const char s_pdf[] PROGMEM = "application/x-pdf"; -//static const char s_zip[] PROGMEM = "application/x-zip"; -//static const char s_gz[] PROGMEM = "application/x-gzip"; - -String getFileContentType(String &filename) { - if (filename.endsWith(F(".htm"))) return FPSTR(s_html); - else if (filename.endsWith(F(".html"))) return FPSTR(s_html); - else if (filename.endsWith(F(".css"))) return FPSTR(s_css); - else if (filename.endsWith(F(".js"))) return FPSTR(s_javascript); - else if (filename.endsWith(F(".json"))) return s_json; - else if (filename.endsWith(F(".png"))) return FPSTR(s_png); - else if (filename.endsWith(F(".gif"))) return FPSTR(s_gif); - else if (filename.endsWith(F(".jpg"))) return FPSTR(s_jpg); - else if (filename.endsWith(F(".ico"))) return FPSTR(s_ico); -// else if (filename.endsWith(F(".xml"))) return FPSTR(s_xml); -// else if (filename.endsWith(F(".pdf"))) return FPSTR(s_pdf); -// else if (filename.endsWith(F(".zip"))) return FPSTR(s_zip); -// else if (filename.endsWith(F(".gz"))) return FPSTR(s_gz); - return s_plain; -} +static const char* s_javascript = CONTENT_TYPE_JAVASCRIPT; +static const char* s_json = CONTENT_TYPE_JSON; +static const char* s_html = CONTENT_TYPE_HTML; +static const char* s_plain = CONTENT_TYPE_PLAIN; +static const char* s_css = CONTENT_TYPE_CSS; //Is this an IP? static bool isIp(String str) { From a1b0f8444410744f2438acfa804126337aa8d5b8 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Sat, 16 Mar 2024 12:07:26 -0400 Subject: [PATCH 075/114] Pass PROGMEM type to server.on() Rather than relying on the exception handler, indicate the __FlashStringHelper type so the correct String constructor is used. --- wled00/wled_server.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 8d2339312..fca932972 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -234,17 +234,17 @@ void initServer() #ifdef WLED_ENABLE_WEBSOCKETS #ifndef WLED_DISABLE_2D - server.on(SET_F("/liveview2D"), HTTP_GET, [](AsyncWebServerRequest *request) { + server.on(F("/liveview2D"), HTTP_GET, [](AsyncWebServerRequest *request) { handleStaticContent(request, "", 200, FPSTR(s_html), PAGE_liveviewws2D, PAGE_liveviewws2D_length); }); #endif #endif - server.on(SET_F("/liveview"), HTTP_GET, [](AsyncWebServerRequest *request) { + server.on(F("/liveview"), HTTP_GET, [](AsyncWebServerRequest *request) { handleStaticContent(request, "", 200, FPSTR(s_html), PAGE_liveview, PAGE_liveview_length); }); //settings page - server.on(SET_F("/settings"), HTTP_GET, [](AsyncWebServerRequest *request){ + server.on(F("/settings"), HTTP_GET, [](AsyncWebServerRequest *request){ serveSettings(request); }); @@ -266,24 +266,25 @@ void initServer() request->send(response); }); - server.on(SET_F("/welcome"), HTTP_GET, [](AsyncWebServerRequest *request){ + server.on(F("/welcome"), HTTP_GET, [](AsyncWebServerRequest *request){ serveSettings(request); }); - server.on(SET_F("/reset"), HTTP_GET, [](AsyncWebServerRequest *request){ + server.on(F("/reset"), HTTP_GET, [](AsyncWebServerRequest *request){ serveMessage(request, 200,F("Rebooting now..."),F("Please wait ~10 seconds..."),129); doReboot = true; }); - server.on(SET_F("/settings"), HTTP_POST, [](AsyncWebServerRequest *request){ + server.on(F("/settings"), HTTP_POST, [](AsyncWebServerRequest *request){ serveSettings(request, true); }); - server.on(SET_F("/json"), HTTP_GET, [](AsyncWebServerRequest *request){ + const static char _json[] PROGMEM = "/json"; + server.on(FPSTR(_json), HTTP_GET, [](AsyncWebServerRequest *request){ serveJson(request); }); - AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler(F("/json"), [](AsyncWebServerRequest *request) { + AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler(FPSTR(_json), [](AsyncWebServerRequest *request) { bool verboseResponse = false; bool isConfig = false; @@ -335,15 +336,15 @@ void initServer() }, JSON_BUFFER_SIZE); server.addHandler(handler); - server.on(SET_F("/version"), HTTP_GET, [](AsyncWebServerRequest *request){ + server.on(F("/version"), HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, FPSTR(s_plain), (String)VERSION); }); - server.on(SET_F("/uptime"), HTTP_GET, [](AsyncWebServerRequest *request){ + server.on(F("/uptime"), HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, FPSTR(s_plain), (String)millis()); }); - server.on(SET_F("/freeheap"), HTTP_GET, [](AsyncWebServerRequest *request){ + server.on(F("/freeheap"), HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, FPSTR(s_plain), (String)ESP.getFreeHeap()); }); @@ -353,11 +354,11 @@ void initServer() }); #endif - server.on(SET_F("/teapot"), HTTP_GET, [](AsyncWebServerRequest *request){ + server.on(F("/teapot"), HTTP_GET, [](AsyncWebServerRequest *request){ serveMessage(request, 418, F("418. I'm a teapot."), F("(Tangible Embedded Advanced Project Of Twinkling)"), 254); }); - server.on(SET_F("/upload"), HTTP_POST, [](AsyncWebServerRequest *request) {}, + server.on(F("/upload"), HTTP_POST, [](AsyncWebServerRequest *request) {}, [](AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) {handleUpload(request, filename, index, data, len, final);} ); From 323c70dcdf4803cd3d25a3e500d398b0630555b2 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Sat, 16 Mar 2024 12:07:26 -0400 Subject: [PATCH 076/114] Update for new AsyncWebSocketBuffer Eliminate the extra indirection and allocate shared buffers directly. --- wled00/ws.cpp | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/wled00/ws.cpp b/wled00/ws.cpp index 1dd141a68..16636bb1e 100644 --- a/wled00/ws.cpp +++ b/wled00/ws.cpp @@ -102,7 +102,6 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp void sendDataWs(AsyncWebSocketClient * client) { if (!ws.count()) return; - AsyncWebSocketMessageBuffer * buffer; if (!requestJSONBufferLock(12)) { if (client) { @@ -129,7 +128,7 @@ void sendDataWs(AsyncWebSocketClient * client) return; } #endif - buffer = ws.makeBuffer(len); // will not allocate correct memory sometimes on ESP8266 + AsyncWebSocketBuffer buffer(len); #ifdef ESP8266 size_t heap2 = ESP.getFreeHeap(); DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap()); @@ -141,23 +140,18 @@ void sendDataWs(AsyncWebSocketClient * client) DEBUG_PRINTLN(F("WS buffer allocation failed.")); ws.closeAll(1013); //code 1013 = temporary overload, try again later ws.cleanupClients(0); //disconnect all clients to release memory - ws._cleanBuffers(); return; //out of memory } - - buffer->lock(); - serializeJson(*pDoc, (char *)buffer->get(), len); + serializeJson(*pDoc, (char *)buffer.data(), len); DEBUG_PRINT(F("Sending WS data ")); if (client) { - client->text(buffer); + client->text(std::move(buffer)); DEBUG_PRINTLN(F("to a single client.")); } else { - ws.textAll(buffer); + ws.textAll(std::move(buffer)); DEBUG_PRINTLN(F("to multiple clients.")); } - buffer->unlock(); - ws._cleanBuffers(); releaseJSONBufferLock(); } @@ -187,11 +181,10 @@ bool sendLiveLedsWs(uint32_t wsClient) #endif size_t bufSize = pos + (used/n)*3; - AsyncWebSocketMessageBuffer * wsBuf = ws.makeBuffer(bufSize); + AsyncWebSocketBuffer wsBuf(bufSize); if (!wsBuf) return false; //out of memory - uint8_t* buffer = wsBuf->get(); + uint8_t* buffer = reinterpret_cast(wsBuf.data()); if (!buffer) return false; //out of memory - wsBuf->lock(); // protect buffer from being cleaned by another WS instance buffer[0] = 'L'; buffer[1] = 1; //version @@ -218,9 +211,7 @@ bool sendLiveLedsWs(uint32_t wsClient) buffer[pos++] = scale8(qadd8(w, b), strip.getBrightness()); //B } - wsc->binary(wsBuf); - wsBuf->unlock(); // un-protect buffer - ws._cleanBuffers(); + wsc->binary(std::move(wsBuf)); return true; } From 0593a078c6560ad0507ac3673fa749e85815c18b Mon Sep 17 00:00:00 2001 From: Will Miles Date: Sat, 16 Mar 2024 12:07:26 -0400 Subject: [PATCH 077/114] handleFileRead: Leverage AWS code No need to filter or look up content type, just pitch it over the wall. Also fixes .gz'd content processing. --- wled00/file.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/wled00/file.cpp b/wled00/file.cpp index 199009e4e..6511d4d07 100644 --- a/wled00/file.cpp +++ b/wled00/file.cpp @@ -421,25 +421,19 @@ bool handleFileRead(AsyncWebServerRequest* request, String path){ DEBUG_PRINT(F("WS FileRead: ")); DEBUG_PRINTLN(path); if(path.endsWith("/")) path += "index.htm"; if(path.indexOf(F("sec")) > -1) return false; - String contentType = request->hasArg(F("download")) ? F("application/octet-stream") : contentTypeFor(path); - /*String pathWithGz = path + ".gz"; - if(WLED_FS.exists(pathWithGz)){ - request->send(WLED_FS, pathWithGz, contentType); - return true; - }*/ #if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) if (path.endsWith(FPSTR(getPresetsFileName()))) { size_t psize; const uint8_t *presets = getPresetCache(psize); if (presets) { - AsyncWebServerResponse *response = request->beginResponse_P(200, contentType, presets, psize); + AsyncWebServerResponse *response = request->beginResponse_P(200, FPSTR(CONTENT_TYPE_JSON), presets, psize); request->send(response); return true; } } #endif - if(WLED_FS.exists(path)) { - request->send(WLED_FS, path, contentType); + if(WLED_FS.exists(path) || WLED_FS.exists(path + ".gz")) { + request->send(WLED_FS, path, String(), request->hasArg(F("download"))); return true; } return false; From 5f2480c3d9c56e54084f6954eaf9e4b2ee3aa628 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Thu, 14 Mar 2024 22:06:51 -0400 Subject: [PATCH 078/114] serveLiveLeds: Use dynamic buffer There were three problems here: - AsyncWebServer is going to copy to a heap buffer anyways, so we might as well just pass it one it can use - The buffer size estimate was wrong -- we need 9 bytes per pixel ("RRGGBB",), so the buffer could overflow, and it was not considering the extra 2D requirements - On ESP8266, the stack allocation was overflowing the stack, causing corruption and crashes. --- wled00/json.cpp | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/wled00/json.cpp b/wled00/json.cpp index c629cbe4f..f6cb645c0 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -1152,10 +1152,10 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient) } #endif - char buffer[2048]; // shoud be enough for 256 LEDs [RRGGBB] + all other text (9+25) - strcpy_P(buffer, PSTR("{\"leds\":[")); - obuf = buffer; // assign buffer for oappnd() functions - olen = 9; + DynamicBuffer buffer(9 + (9*MAX_LIVE_LEDS) + 7 + 5 + 6 + 5 + 6 + 5 + 2); + char* buf = buffer.data(); // assign buffer for oappnd() functions + strncpy_P(buffer.data(), PSTR("{\"leds\":["), buffer.size()); + buf += 9; // sizeof(PSTR()) from last line for (size_t i = 0; i < used; i += n) { @@ -1170,29 +1170,27 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient) r = scale8(qadd8(w, r), strip.getBrightness()); //R, add white channel to RGB channels as a simple RGBW -> RGB map g = scale8(qadd8(w, g), strip.getBrightness()); //G b = scale8(qadd8(w, b), strip.getBrightness()); //B - olen += sprintf_P(obuf + olen, PSTR("\"%06X\","), RGBW32(r,g,b,0)); + buf += sprintf_P(buf, PSTR("\"%06X\","), RGBW32(r,g,b,0)); } - olen -= 1; - oappend((const char*)F("],\"n\":")); - oappendi(n); + buf--; // remove last comma + buf += sprintf_P(buf, PSTR("],\"n\":%d"), n); #ifndef WLED_DISABLE_2D if (strip.isMatrix) { - oappend((const char*)F(",\"w\":")); - oappendi(Segment::maxWidth/n); - oappend((const char*)F(",\"h\":")); - oappendi(Segment::maxHeight/n); + buf += sprintf_P(buf, PSTR(",\"w\":%d"), Segment::maxWidth/n); + buf += sprintf_P(buf, PSTR(",\"h\":%d"), Segment::maxHeight/n); } #endif - oappend("}"); + (*buf++) = '}'; + (*buf++) = 0; + if (request) { - request->send(200, FPSTR(CONTENT_TYPE_JSON), buffer); + request->send(200, FPSTR(CONTENT_TYPE_JSON), toString(std::move(buffer))); } #ifdef WLED_ENABLE_WEBSOCKETS else { - wsc->text(obuf, olen); + wsc->text(toString(std::move(buffer))); } - #endif - obuf = nullptr; + #endif return true; } #endif From acf6736afdc579e0bb498b9111e2b8ff7cbaab63 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sun, 17 Mar 2024 11:52:09 +0100 Subject: [PATCH 079/114] WLED 0.14.2 release --- CHANGELOG.md | 3 + package-lock.json | 4 +- package.json | 2 +- wled00/html_other.h | 68 ++++----- wled00/html_settings.h | 314 ++++++++++++++++++++--------------------- wled00/improv.cpp | 2 +- wled00/wled.h | 4 +- 7 files changed, 200 insertions(+), 197 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8da317b8b..8095a15d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ## WLED changelog +#### Build 2403170 +- WLED 0.14.2 release + #### Build 2403110 - Beta WLED 0.14.2-b2 - New AsyncWebServer (improved performance and reduced memory use) diff --git a/package-lock.json b/package-lock.json index 7653dea53..9bf4449eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wled", - "version": "0.14.2-b2", + "version": "0.14.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "wled", - "version": "0.14.2-b2", + "version": "0.14.2", "license": "ISC", "dependencies": { "clean-css": "^4.2.3", diff --git a/package.json b/package.json index 2da6f7a8e..8781cd6c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wled", - "version": "0.14.2-b2", + "version": "0.14.2", "description": "Tools for WLED project", "main": "tools/cdata.js", "directories": { diff --git a/wled00/html_other.h b/wled00/html_other.h index c7a895916..2799fcdf3 100644 --- a/wled00/html_other.h +++ b/wled00/html_other.h @@ -41,47 +41,47 @@ const char PAGE_dmxmap[] PROGMEM = R"=====()====="; #endif // Autogenerated from wled00/data/update.htm, do not edit!! -const uint16_t PAGE_update_length = 616; +const uint16_t PAGE_update_length = 613; const uint8_t PAGE_update[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x75, 0x53, 0x5d, 0x6f, 0xd4, 0x30, - 0x10, 0x7c, 0xcf, 0xaf, 0x70, 0xfd, 0x74, 0x27, 0x71, 0x36, 0x54, 0xbc, 0x50, 0x92, 0x14, 0x4a, + 0x10, 0x7c, 0xcf, 0xaf, 0x70, 0xfd, 0x74, 0x27, 0x51, 0x1b, 0x2a, 0x5e, 0x28, 0x49, 0x0a, 0x47, 0x2b, 0x54, 0x09, 0xa9, 0x95, 0xda, 0x82, 0x78, 0x42, 0x8e, 0xbd, 0xb9, 0x98, 0x73, 0xec, 0xd4, 0xde, 0xdc, 0xe9, 0x84, 0xfa, 0xdf, 0xd9, 0x38, 0x77, 0x05, 0xf1, 0xf1, 0x12, 0xc5, 0xd9, 0xd9, 0xf1, 0xee, 0xcc, 0xa4, 0x3c, 0xb9, 0xbc, 0xf9, 0x70, 0xff, 0xf5, 0xf6, 0x8a, 0x75, 0xd8, 0xbb, 0xba, 0x3c, 0x3c, 0x41, 0x99, 0xba, 0xec, 0x01, 0x15, 0xd3, 0xc1, 0x23, 0x78, 0xac, 0xf8, 0xce, - 0x1a, 0xec, 0x2a, 0x03, 0x5b, 0xab, 0x61, 0x95, 0x0f, 0x9c, 0x79, 0xd5, 0x43, 0xc5, 0xb7, 0x16, - 0x76, 0x43, 0x88, 0xc8, 0xeb, 0xa2, 0x44, 0x8b, 0x0e, 0xea, 0x2f, 0x9f, 0xae, 0x2e, 0xd9, 0xc3, - 0x60, 0x14, 0x42, 0x29, 0xe7, 0x4f, 0x65, 0xd2, 0xd1, 0x0e, 0x58, 0x17, 0xed, 0xe8, 0x35, 0xda, - 0xe0, 0xd9, 0xc5, 0x62, 0xf9, 0x63, 0x67, 0xbd, 0x09, 0x3b, 0xd1, 0xd9, 0x84, 0x21, 0xee, 0x45, + 0x1a, 0xec, 0x2a, 0x03, 0x5b, 0xab, 0xe1, 0x34, 0x1f, 0x38, 0xf3, 0xaa, 0x87, 0x8a, 0x6f, 0x2d, + 0xec, 0x86, 0x10, 0x91, 0xd7, 0x45, 0x89, 0x16, 0x1d, 0xd4, 0x5f, 0x3e, 0x5d, 0x5d, 0xb2, 0x87, + 0xc1, 0x28, 0x84, 0x52, 0xce, 0x9f, 0xca, 0xa4, 0xa3, 0x1d, 0xb0, 0x2e, 0xda, 0xd1, 0x6b, 0xb4, + 0xc1, 0xb3, 0xd5, 0x62, 0xf9, 0x63, 0x67, 0xbd, 0x09, 0x3b, 0xd1, 0xd9, 0x84, 0x21, 0xee, 0x45, 0xa3, 0xf4, 0x66, 0xb1, 0x7c, 0x7a, 0x86, 0x3c, 0x10, 0xc4, 0x04, 0x3d, 0xf6, 0x34, 0x81, 0x58, - 0x03, 0x5e, 0x39, 0x98, 0x5e, 0x2f, 0xf6, 0xd7, 0x66, 0xc1, 0xc7, 0x96, 0x2f, 0x45, 0xc2, 0xbd, - 0x03, 0x61, 0x6c, 0x1a, 0x9c, 0xda, 0x57, 0xdc, 0x07, 0x0f, 0xfc, 0xc5, 0x7f, 0x5b, 0xfa, 0xb4, - 0xfe, 0xbb, 0xa7, 0x71, 0x41, 0x6f, 0xf8, 0x53, 0x51, 0xca, 0xc3, 0x88, 0x87, 0x51, 0x59, 0x8a, - 0xba, 0xe2, 0x32, 0x01, 0xa2, 0xf5, 0xeb, 0x24, 0x93, 0xf8, 0x9e, 0xce, 0x87, 0xea, 0x0d, 0xaf, - 0x7f, 0x43, 0x4e, 0x54, 0x75, 0xf1, 0xce, 0xf6, 0x93, 0x00, 0x6c, 0x8c, 0x6e, 0xc1, 0x67, 0x7a, - 0x9d, 0x12, 0x5f, 0xbe, 0x25, 0x64, 0x46, 0x94, 0x72, 0x96, 0xb4, 0x09, 0x66, 0xcf, 0x82, 0x77, - 0x41, 0x99, 0x8a, 0x7f, 0x04, 0xfc, 0xbc, 0x58, 0x12, 0x5d, 0x77, 0x5a, 0x17, 0x59, 0xb2, 0xbb, - 0xd0, 0xe2, 0x4e, 0x45, 0x78, 0xd6, 0x8e, 0x2a, 0x65, 0x1b, 0x62, 0xcf, 0xc8, 0x8b, 0x2e, 0x50, - 0xcf, 0xed, 0xcd, 0xdd, 0x3d, 0x67, 0x2a, 0xcb, 0x53, 0x71, 0x21, 0xc7, 0x0c, 0xe4, 0xcc, 0x52, - 0x8d, 0x04, 0x61, 0x05, 0x90, 0x74, 0xfb, 0x81, 0x5c, 0xe9, 0x47, 0x87, 0x76, 0x50, 0x11, 0xe5, - 0x44, 0xb0, 0x22, 0x98, 0xe2, 0x74, 0x75, 0x1a, 0x9b, 0xde, 0x92, 0x9d, 0x0f, 0xd3, 0xcd, 0xd7, - 0x3e, 0xa1, 0x72, 0x0e, 0x0c, 0xdb, 0x42, 0x4c, 0x44, 0x79, 0xc6, 0xca, 0x34, 0x28, 0xcf, 0x0a, - 0xed, 0x54, 0x4a, 0x15, 0x4f, 0x76, 0xe0, 0xf5, 0x4b, 0xf1, 0xea, 0xb5, 0x38, 0x5d, 0x35, 0xa7, - 0xb4, 0x0d, 0x15, 0x69, 0x8b, 0x58, 0x5f, 0x86, 0x5d, 0xde, 0x82, 0x61, 0x07, 0xcc, 0xd1, 0x08, - 0x09, 0x59, 0x63, 0xbd, 0x8a, 0x7b, 0xa2, 0x50, 0xac, 0xe8, 0x22, 0xb4, 0x15, 0xef, 0x10, 0x87, - 0x74, 0x26, 0xe5, 0xda, 0x62, 0x37, 0x36, 0x42, 0x87, 0x5e, 0xbe, 0xb7, 0x51, 0x87, 0x10, 0x36, - 0x16, 0xe4, 0xb4, 0xb2, 0x8c, 0xe0, 0x40, 0x25, 0x48, 0x9c, 0xa1, 0x8a, 0xe4, 0x57, 0xc5, 0xbf, - 0x35, 0x4e, 0xf9, 0x0d, 0xc9, 0x62, 0xfb, 0x35, 0x2b, 0xb2, 0x09, 0x47, 0x1e, 0xfa, 0x22, 0x52, - 0x67, 0xc1, 0x99, 0x24, 0x6c, 0x38, 0xd0, 0x1e, 0x29, 0xfe, 0xa4, 0x16, 0x69, 0xbb, 0x3e, 0xcf, - 0xf2, 0x57, 0x2d, 0x4d, 0xb8, 0x4a, 0x8f, 0x23, 0x49, 0x3b, 0x85, 0x54, 0xaa, 0xbc, 0x43, 0x69, - 0xfd, 0x30, 0x22, 0x9b, 0xe5, 0x6a, 0xad, 0x83, 0x63, 0xa0, 0x8f, 0xa2, 0x46, 0x78, 0x1c, 0x6d, - 0x04, 0x33, 0xa3, 0x9b, 0x11, 0x91, 0x32, 0x39, 0xc3, 0x67, 0x19, 0x89, 0x6c, 0x76, 0xea, 0xa4, - 0x94, 0x73, 0xf9, 0x1f, 0xd0, 0xf9, 0x30, 0x69, 0xaf, 0x9d, 0xd5, 0x9b, 0x8a, 0x5f, 0x4c, 0xd2, - 0x5f, 0x50, 0xd4, 0x7f, 0x35, 0x65, 0x8f, 0xea, 0xd2, 0xd8, 0x6d, 0x91, 0xad, 0x9c, 0x82, 0x4a, - 0x34, 0x75, 0x66, 0xa7, 0xf4, 0x09, 0x21, 0x08, 0x9c, 0xc9, 0x6f, 0xf3, 0xb2, 0xcc, 0x04, 0xe6, - 0x03, 0x32, 0xed, 0x02, 0x1d, 0x42, 0xa4, 0x59, 0xdb, 0x08, 0xa9, 0xcb, 0x7e, 0x0c, 0x6a, 0x0d, - 0xec, 0x6c, 0x59, 0x4a, 0xe2, 0x9b, 0xd6, 0x9d, 0x52, 0x37, 0x45, 0x70, 0xfa, 0xb7, 0x7f, 0x02, - 0x70, 0xe8, 0x3d, 0x35, 0xf1, 0x03, 0x00, 0x00 + 0x03, 0x5e, 0x39, 0x98, 0x5e, 0x57, 0xfb, 0x6b, 0xb3, 0xe0, 0x63, 0xcb, 0x97, 0x22, 0xe1, 0xde, + 0x81, 0x30, 0x36, 0x0d, 0x4e, 0xed, 0x2b, 0xee, 0x83, 0x07, 0xfe, 0xe2, 0xbf, 0x2d, 0x7d, 0x5a, + 0xff, 0xdd, 0xd3, 0xb8, 0xa0, 0x37, 0xfc, 0xa9, 0x28, 0xe5, 0x61, 0xc4, 0xc3, 0xa8, 0x2c, 0x45, + 0x5d, 0x71, 0x99, 0x00, 0xd1, 0xfa, 0x75, 0x92, 0x49, 0x7c, 0x4f, 0x17, 0x43, 0xf5, 0x86, 0xd7, + 0xbf, 0x21, 0x27, 0xaa, 0xba, 0x78, 0x67, 0xfb, 0x49, 0x00, 0x36, 0x46, 0xb7, 0xe0, 0x33, 0xbd, + 0x4e, 0x89, 0x2f, 0xdf, 0x12, 0x32, 0x23, 0x4a, 0x39, 0x4b, 0xda, 0x04, 0xb3, 0x67, 0xc1, 0xbb, + 0xa0, 0x4c, 0xc5, 0x3f, 0x02, 0x7e, 0x5e, 0x2c, 0x89, 0xae, 0x3b, 0xab, 0x8b, 0x2c, 0xd9, 0x5d, + 0x68, 0x71, 0xa7, 0x22, 0x3c, 0x6b, 0x47, 0x95, 0xb2, 0x0d, 0xb1, 0x67, 0xe4, 0x45, 0x17, 0xa8, + 0xe7, 0xf6, 0xe6, 0xee, 0x9e, 0x33, 0x95, 0xe5, 0xa9, 0xb8, 0x90, 0x63, 0x06, 0x72, 0x66, 0xa9, + 0x46, 0x82, 0xb0, 0x02, 0x48, 0xba, 0xfd, 0x40, 0xae, 0xf4, 0xa3, 0x43, 0x3b, 0xa8, 0x88, 0x72, + 0x22, 0x38, 0x25, 0x98, 0xe2, 0x74, 0x75, 0x1a, 0x9b, 0xde, 0x92, 0x9d, 0x0f, 0xd3, 0xcd, 0xd7, + 0x3e, 0xa1, 0x72, 0x0e, 0x0c, 0xdb, 0x42, 0x4c, 0x44, 0x79, 0xce, 0xca, 0x34, 0x28, 0xcf, 0x0a, + 0xed, 0x54, 0x4a, 0x15, 0x4f, 0x76, 0xe0, 0xf5, 0x4b, 0xf1, 0xea, 0xb5, 0x38, 0xa3, 0x55, 0xa8, + 0x42, 0x2b, 0xc4, 0xfa, 0x32, 0xec, 0xf2, 0x0a, 0x0c, 0x3b, 0x60, 0x8e, 0xee, 0x4f, 0xc8, 0x1a, + 0xeb, 0x55, 0xdc, 0x53, 0xbf, 0x62, 0x45, 0x17, 0xa1, 0xad, 0x78, 0x87, 0x38, 0xa4, 0x73, 0x29, + 0xd7, 0x16, 0xbb, 0xb1, 0x11, 0x3a, 0xf4, 0xf2, 0xbd, 0x8d, 0x3a, 0x84, 0xb0, 0xb1, 0x20, 0xa7, + 0x7d, 0x65, 0x04, 0x07, 0x2a, 0x41, 0xe2, 0x0c, 0x55, 0x24, 0xb3, 0x2a, 0xfe, 0xad, 0x71, 0xca, + 0x6f, 0x48, 0x13, 0xdb, 0xaf, 0x59, 0x91, 0x1d, 0x38, 0xf2, 0xd0, 0x17, 0x91, 0x3a, 0x0b, 0xce, + 0x24, 0x61, 0xc3, 0x81, 0xf6, 0x48, 0xf1, 0x27, 0xb5, 0x48, 0xdb, 0xf5, 0x45, 0xd6, 0xbe, 0x6a, + 0x69, 0xc2, 0xd3, 0xf4, 0x38, 0x92, 0xae, 0x53, 0x42, 0xa5, 0xca, 0x3b, 0x94, 0xd6, 0x0f, 0x23, + 0xb2, 0x59, 0xab, 0xd6, 0x3a, 0x38, 0xa6, 0xf9, 0xa8, 0x68, 0x84, 0xc7, 0xd1, 0x46, 0x30, 0x33, + 0xba, 0x19, 0x11, 0x29, 0x90, 0x33, 0x7c, 0xd6, 0x90, 0xc8, 0x66, 0x9b, 0x4e, 0x4a, 0x39, 0x97, + 0xff, 0x01, 0x9d, 0x0f, 0x93, 0xf0, 0xda, 0x59, 0xbd, 0xa9, 0xf8, 0x6a, 0xd2, 0x7d, 0x45, 0x39, + 0xff, 0xd5, 0x94, 0x0d, 0xaa, 0x4b, 0x63, 0xb7, 0x45, 0xf6, 0x71, 0x4a, 0x29, 0xd1, 0xd4, 0x99, + 0x9d, 0xa2, 0x27, 0x84, 0x20, 0x70, 0x26, 0xbf, 0xcd, 0xcb, 0x32, 0x13, 0x98, 0x0f, 0xc8, 0xb4, + 0x0b, 0x74, 0x08, 0x91, 0x66, 0x6d, 0x23, 0xa4, 0x2e, 0xfb, 0x31, 0xa8, 0x35, 0xb0, 0xf3, 0x65, + 0x29, 0x89, 0x6f, 0x5a, 0x77, 0x8a, 0xdc, 0x94, 0xbf, 0xe9, 0xc7, 0xfe, 0x09, 0x3d, 0x8c, 0x87, + 0xc8, 0xee, 0x03, 0x00, 0x00 }; diff --git a/wled00/html_settings.h b/wled00/html_settings.h index e13d71a8e..62d3404dc 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -1607,168 +1607,168 @@ const uint8_t PAGE_settings_time[] PROGMEM = { // Autogenerated from wled00/data/settings_sec.htm, do not edit!! -const uint16_t PAGE_settings_sec_length = 2551; +const uint16_t PAGE_settings_sec_length = 2548; const uint8_t PAGE_settings_sec[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x58, 0x6d, 0x53, 0xdb, 0x48, 0x12, 0xfe, 0xee, 0x5f, 0x31, 0x9e, 0xad, 0xca, 0x4a, 0x17, 0x21, 0x03, 0x49, 0x6d, 0x25, 0x60, 0x99, 0x83, 0x40, 0x36, 0x5c, 0x41, 0xa0, 0xb0, 0xd9, 0xdc, 0x55, 0x2e, 0x95, 0x92, 0xa5, 0xb1, 0x35, 0xb1, 0xac, 0xd1, 0xce, 0x8c, 0x70, 0x7c, 0xd9, 0xfc, 0xf7, 0x7b, 0x7a, 0x24, 0xf9, 0x85, - 0x40, 0x72, 0xb9, 0x0f, 0x60, 0x6b, 0x34, 0xd3, 0x2f, 0x4f, 0x77, 0x3f, 0xdd, 0xe3, 0x7e, 0xf7, - 0xf4, 0xea, 0xd5, 0xe8, 0x5f, 0xd7, 0x67, 0x2c, 0xb3, 0xf3, 0x7c, 0xd0, 0xa7, 0xff, 0x2c, 0x8f, - 0x8b, 0x69, 0xc4, 0x45, 0xc1, 0xf1, 0x2c, 0xe2, 0x74, 0xd0, 0x9f, 0x0b, 0x1b, 0xb3, 0x4e, 0xa2, - 0x0a, 0x2b, 0x0a, 0x1b, 0xf1, 0x85, 0x4c, 0x6d, 0x16, 0xa5, 0xe2, 0x4e, 0x26, 0x62, 0xc7, 0x3d, - 0x04, 0xb2, 0x90, 0x56, 0xc6, 0xf9, 0x8e, 0x49, 0xe2, 0x5c, 0x44, 0x7b, 0xc1, 0x3c, 0xfe, 0x2c, - 0xe7, 0xd5, 0x7c, 0xf5, 0x5c, 0x19, 0xa1, 0xdd, 0x43, 0x3c, 0xc6, 0x73, 0xa1, 0x38, 0xeb, 0x14, - 0xf1, 0x5c, 0x44, 0xfc, 0x4e, 0x8a, 0x45, 0xa9, 0xb4, 0xe5, 0x8d, 0x96, 0x24, 0x8b, 0xb5, 0x11, - 0x50, 0x52, 0xd9, 0xc9, 0xce, 0x0b, 0xac, 0x5a, 0x69, 0x73, 0x31, 0xb8, 0x94, 0x26, 0x61, 0x43, - 0x61, 0xad, 0x2c, 0xa6, 0xa6, 0xdf, 0xab, 0x17, 0xfb, 0x26, 0xd1, 0xb2, 0xb4, 0x83, 0xce, 0x5d, - 0xac, 0x59, 0xae, 0x12, 0x59, 0x06, 0x56, 0xce, 0x85, 0xaa, 0x6c, 0x90, 0x46, 0xa9, 0x4a, 0xaa, - 0x39, 0xcc, 0x0d, 0xf0, 0x22, 0xea, 0xee, 0xd1, 0x47, 0xa9, 0x95, 0x55, 0x11, 0xcf, 0xac, 0x2d, - 0x0f, 0xf8, 0xe1, 0xa4, 0x2a, 0x12, 0x2b, 0x55, 0xc1, 0xde, 0x78, 0xfe, 0x97, 0x85, 0x2c, 0x52, - 0xb5, 0x08, 0x55, 0x29, 0x0a, 0xcf, 0x6d, 0x30, 0x07, 0xbd, 0xde, 0xac, 0x50, 0xe1, 0x22, 0x17, - 0x69, 0x38, 0x15, 0xbd, 0x89, 0x88, 0x6d, 0xa5, 0x85, 0xe9, 0x99, 0xc6, 0x88, 0xde, 0x2f, 0x46, - 0x24, 0x95, 0x96, 0x76, 0xb9, 0xd3, 0x2e, 0x71, 0xff, 0xeb, 0x4a, 0xe8, 0xc9, 0x3d, 0xa1, 0x53, - 0x61, 0x6f, 0x6f, 0x2e, 0x3c, 0xde, 0x5b, 0x6f, 0x0e, 0xf8, 0x47, 0x23, 0xf2, 0xc9, 0xe6, 0xa9, - 0xdb, 0xc7, 0x4e, 0x55, 0x65, 0x1a, 0x5b, 0xf1, 0xe0, 0x99, 0xe9, 0x79, 0xea, 0x59, 0xff, 0x8b, - 0x16, 0xb0, 0xaf, 0x60, 0x64, 0xac, 0x3d, 0xcb, 0x05, 0xb9, 0x7e, 0xb2, 0x74, 0xaf, 0xd6, 0x5b, - 0xa5, 0xb9, 0x1a, 0x7f, 0xda, 0xd8, 0x6c, 0x9f, 0x3c, 0xe1, 0x6a, 0xfc, 0x49, 0x24, 0x96, 0x47, - 0x91, 0x5d, 0x96, 0x42, 0x4d, 0x68, 0xad, 0x7b, 0xac, 0x75, 0xbc, 0x0c, 0xa5, 0x71, 0x9f, 0x5b, - 0x12, 0x72, 0x15, 0xa7, 0xff, 0x18, 0x7a, 0x36, 0x10, 0x51, 0x77, 0xd7, 0xff, 0x92, 0x0b, 0xcb, - 0x54, 0x94, 0x86, 0x89, 0x06, 0x3c, 0xa2, 0x51, 0xeb, 0xf1, 0x3a, 0x2e, 0xdc, 0x3f, 0x54, 0x21, - 0xdc, 0x3d, 0xb6, 0x56, 0xcb, 0x71, 0x65, 0x05, 0x5e, 0xe8, 0x84, 0x07, 0xd6, 0x0f, 0xee, 0xaf, - 0x93, 0x6e, 0x1e, 0x70, 0x2b, 0x3e, 0xdb, 0xde, 0xa7, 0xf8, 0x2e, 0x6e, 0x05, 0x7c, 0xb3, 0x31, - 0x36, 0xcb, 0x02, 0x22, 0x84, 0x1f, 0xa4, 0xe1, 0x58, 0xa5, 0xcb, 0x30, 0x2e, 0x81, 0x53, 0xfa, - 0x2a, 0x93, 0x79, 0xea, 0x29, 0xda, 0x1f, 0xa7, 0xe9, 0xd9, 0x1d, 0xac, 0xb8, 0x90, 0x06, 0xd9, - 0x2a, 0xb4, 0xc7, 0xc9, 0x66, 0x1e, 0x78, 0x7e, 0x34, 0xf8, 0xf2, 0xbb, 0xb0, 0x7f, 0x78, 0x7e, - 0x00, 0x99, 0x27, 0xc9, 0xec, 0xb5, 0xcc, 0x05, 0x25, 0xa1, 0x47, 0x08, 0xf2, 0x71, 0x32, 0x4b, - 0x26, 0x53, 0xee, 0x3f, 0xfa, 0xb6, 0x44, 0xf4, 0x85, 0x45, 0xdc, 0xfc, 0xaf, 0x0f, 0xeb, 0x11, - 0x5a, 0x2b, 0x0d, 0xf7, 0xa0, 0x07, 0xa5, 0x62, 0x54, 0x2e, 0xc2, 0x5c, 0x4d, 0x3d, 0x7e, 0x46, - 0xeb, 0xac, 0x01, 0x0f, 0xa1, 0x67, 0x13, 0x88, 0x76, 0x30, 0xa0, 0x36, 0x34, 0xe0, 0xba, 0x68, - 0xd6, 0x81, 0x3e, 0x0e, 0x4e, 0xe4, 0xb4, 0xd2, 0xb1, 0x43, 0xbb, 0x86, 0x81, 0x4d, 0x62, 0x49, - 0x59, 0xf8, 0xef, 0xe2, 0xbc, 0x48, 0xd4, 0xbc, 0x04, 0xe8, 0x82, 0x95, 0xf1, 0x54, 0x30, 0xe4, - 0x44, 0xdc, 0x45, 0x2e, 0x6c, 0x04, 0xc8, 0x64, 0x6a, 0x31, 0x52, 0xb1, 0xb1, 0x75, 0x8c, 0xf6, - 0xfc, 0x2f, 0x54, 0x1c, 0x2a, 0x72, 0x5e, 0x58, 0x7a, 0xe1, 0xc2, 0x22, 0x0b, 0x98, 0xfc, 0x66, - 0x74, 0x79, 0x11, 0x59, 0xf8, 0x92, 0xe4, 0xb1, 0x31, 0xe4, 0x08, 0x79, 0xe5, 0x89, 0xa3, 0xc6, - 0x95, 0x03, 0x4e, 0xd2, 0x10, 0x85, 0x24, 0x17, 0xb1, 0x1e, 0xd5, 0xa5, 0xe5, 0x35, 0x25, 0xe6, - 0x62, 0x63, 0x97, 0x70, 0x32, 0x2e, 0xe4, 0xdc, 0xd9, 0x1b, 0xf1, 0x42, 0x15, 0xe4, 0x59, 0xbd, - 0x23, 0x02, 0x5c, 0xed, 0x21, 0xaf, 0x35, 0x10, 0x09, 0xbe, 0xa9, 0x4f, 0x8b, 0xb9, 0xba, 0xa3, - 0xc4, 0x70, 0x8a, 0x00, 0xec, 0xfe, 0xcb, 0xdd, 0xdd, 0x0d, 0x77, 0xaa, 0x92, 0x40, 0xa3, 0x58, - 0x90, 0x3f, 0xad, 0x33, 0x85, 0x58, 0xb0, 0x7f, 0x5e, 0x5e, 0xbc, 0x41, 0x9d, 0xde, 0x88, 0x3f, - 0x2b, 0x61, 0xec, 0xe1, 0x77, 0x02, 0xbf, 0xa1, 0x7a, 0x03, 0x9d, 0x4c, 0x1a, 0x68, 0x37, 0x25, - 0x22, 0x25, 0x46, 0xc8, 0xbb, 0xc0, 0xad, 0x18, 0x8b, 0x32, 0x37, 0x83, 0xe8, 0x39, 0x59, 0xe1, - 0x7f, 0x37, 0xce, 0x6b, 0xb9, 0x76, 0x4b, 0x30, 0xc9, 0x48, 0x66, 0x41, 0xb7, 0x15, 0x50, 0x73, - 0xca, 0xf5, 0xd5, 0x70, 0xc4, 0x83, 0x8d, 0x7a, 0x76, 0xc6, 0xf9, 0xfe, 0x21, 0x79, 0x54, 0x38, - 0x8f, 0x5e, 0x2b, 0x3d, 0x3f, 0x45, 0x44, 0x0f, 0x9b, 0xea, 0x2c, 0x9a, 0xe4, 0xf6, 0x38, 0xc5, - 0x19, 0xb0, 0x86, 0x94, 0x38, 0xe6, 0xfd, 0xee, 0x07, 0xca, 0x7f, 0xaa, 0x0c, 0xbc, 0x2b, 0x7c, - 0xac, 0xdf, 0xc5, 0x79, 0x05, 0x2e, 0xe5, 0x41, 0x77, 0x6f, 0x0d, 0x5d, 0x92, 0x89, 0x64, 0xf6, - 0xb6, 0x9a, 0xaf, 0xeb, 0xbd, 0xeb, 0x75, 0x05, 0xb9, 0x12, 0xce, 0xc4, 0x32, 0x44, 0xc8, 0x92, - 0xcc, 0xeb, 0xbd, 0xdf, 0xdd, 0x79, 0xf9, 0xa1, 0xe7, 0xa3, 0xe8, 0xdf, 0xf3, 0x13, 0xd8, 0x6d, - 0xca, 0x38, 0xa1, 0x52, 0x1c, 0xc5, 0x63, 0xfc, 0x3f, 0x03, 0xe3, 0xc3, 0x55, 0x3e, 0xcc, 0xe4, - 0xc4, 0xe2, 0xf3, 0x15, 0x5a, 0x80, 0x56, 0x39, 0xbe, 0x1d, 0xe7, 0xf4, 0x7c, 0x1d, 0x83, 0xd8, - 0x69, 0x3d, 0x2e, 0xcd, 0x85, 0x4a, 0x66, 0x74, 0x04, 0x2c, 0xef, 0x8a, 0x79, 0xd8, 0x48, 0xba, - 0x46, 0xa6, 0xde, 0x96, 0xcd, 0x97, 0x53, 0xb5, 0x28, 0x9c, 0x5c, 0x04, 0x86, 0xbf, 0x51, 0x73, - 0xda, 0x00, 0x96, 0x51, 0x8b, 0x0b, 0xe1, 0x14, 0xb8, 0xef, 0x6e, 0xb7, 0xfb, 0x76, 0x23, 0xa7, - 0xd9, 0x6a, 0xb9, 0x39, 0x7b, 0x8e, 0x80, 0x69, 0x5a, 0x3c, 0x15, 0x54, 0x09, 0xfc, 0x03, 0x92, - 0x39, 0xc9, 0xab, 0x54, 0x18, 0x6f, 0xe5, 0x9d, 0xef, 0xff, 0xf5, 0x57, 0xf3, 0x84, 0xb2, 0xa5, - 0xcf, 0x53, 0x31, 0x89, 0xab, 0xdc, 0xa2, 0xf8, 0x51, 0x13, 0x1b, 0xe5, 0xb2, 0x5d, 0xeb, 0x80, - 0xca, 0xde, 0x63, 0x1c, 0x70, 0x71, 0x51, 0x27, 0x12, 0xa7, 0x5e, 0xf0, 0x91, 0x3f, 0xb5, 0x44, - 0xb1, 0x0f, 0xed, 0xf0, 0x9f, 0x7a, 0xfc, 0xdd, 0xc5, 0xd9, 0x29, 0xc8, 0xd4, 0xa4, 0x47, 0x1c, - 0xf5, 0x83, 0xdd, 0x26, 0xf5, 0x37, 0xf4, 0x0d, 0xbd, 0x9a, 0x34, 0x6d, 0xd4, 0xd0, 0x3c, 0xda, - 0x92, 0xab, 0x9d, 0x43, 0x39, 0xf1, 0x38, 0xc5, 0xf7, 0x80, 0xa8, 0x38, 0x74, 0xad, 0x2a, 0x51, - 0xb9, 0xef, 0xba, 0xd7, 0x6e, 0xe0, 0xb9, 0xf6, 0x16, 0xd1, 0xee, 0x7c, 0x68, 0x95, 0x06, 0x94, - 0x64, 0xc5, 0xb9, 0x15, 0x73, 0xca, 0xf3, 0xe4, 0xbc, 0xe4, 0xce, 0xe7, 0x7a, 0x1b, 0x4e, 0xcf, - 0x4b, 0x10, 0x0b, 0xf9, 0xc5, 0x2e, 0x55, 0x2a, 0x42, 0x76, 0x8d, 0x12, 0x36, 0x82, 0x09, 0x0a, - 0x28, 0x23, 0x23, 0xd9, 0xf9, 0x35, 0xa8, 0x23, 0xd8, 0x92, 0x68, 0xb6, 0x25, 0x06, 0x4e, 0x1a, - 0x72, 0x54, 0xe4, 0x46, 0x38, 0xb3, 0x05, 0x99, 0x16, 0xdb, 0x8c, 0xc0, 0x0a, 0x54, 0x84, 0x13, - 0x39, 0x66, 0x00, 0x6f, 0x2f, 0x10, 0x21, 0x92, 0xd1, 0xbc, 0x93, 0x36, 0x43, 0x72, 0x73, 0xff, - 0x68, 0x67, 0xef, 0xe0, 0x4e, 0xc9, 0x94, 0xed, 0xfa, 0xa1, 0x29, 0x73, 0x69, 0xdd, 0x2a, 0x8a, - 0x14, 0x38, 0x4f, 0x6d, 0x36, 0xd8, 0x7f, 0xf2, 0xc4, 0x5b, 0x35, 0xe4, 0xb5, 0xb7, 0x41, 0xe3, - 0x6d, 0xed, 0x85, 0x0d, 0x33, 0x65, 0x2c, 0xa9, 0x7a, 0x8a, 0xaa, 0xa2, 0x21, 0xe1, 0x08, 0x90, - 0x3e, 0xad, 0xbf, 0x1e, 0x70, 0xc0, 0x0d, 0xa1, 0x4f, 0x15, 0xea, 0xc1, 0xff, 0x8a, 0x13, 0x10, - 0xb9, 0x45, 0xe4, 0xf7, 0xe2, 0x98, 0x69, 0x31, 0x59, 0x15, 0xe0, 0xf6, 0xc6, 0xd6, 0x23, 0x94, - 0xeb, 0x37, 0x64, 0xff, 0xbf, 0x48, 0x59, 0x6f, 0x5e, 0x4b, 0x22, 0x64, 0x5d, 0xab, 0xfc, 0xa6, - 0xf1, 0xf7, 0x4c, 0xf8, 0xc9, 0x1c, 0x95, 0xd1, 0x6f, 0xdc, 0xe5, 0x62, 0x50, 0x9b, 0x9e, 0x86, - 0xc3, 0x49, 0x18, 0xbb, 0x24, 0x89, 0x1e, 0x38, 0x22, 0x12, 0xbe, 0x99, 0x46, 0xcd, 0x8e, 0x55, - 0x65, 0x13, 0x98, 0x47, 0x2d, 0xa0, 0x80, 0x05, 0xb8, 0x38, 0x0c, 0x1d, 0x4a, 0xf6, 0x6b, 0xa7, - 0xdf, 0x6b, 0x46, 0xa5, 0xbe, 0xa3, 0xec, 0xc1, 0xdf, 0xe5, 0x9c, 0x40, 0x64, 0x95, 0xce, 0xc1, - 0xbd, 0x8e, 0xc5, 0x13, 0x03, 0x07, 0x0e, 0xb1, 0xd1, 0x6d, 0xe8, 0xf7, 0xea, 0xc9, 0x8f, 0x7a, - 0x2c, 0x5a, 0x17, 0xf9, 0x12, 0x71, 0x24, 0x2f, 0x06, 0xb2, 0x09, 0x68, 0xaa, 0xc3, 0x24, 0x9e, - 0xe9, 0xdb, 0x47, 0xc3, 0x59, 0x3d, 0xc9, 0x0d, 0x27, 0x9c, 0x61, 0x84, 0xcb, 0x14, 0xde, 0x94, - 0x08, 0x1c, 0xb6, 0xa6, 0xf2, 0x8e, 0x39, 0xae, 0x8f, 0xd0, 0x7a, 0x60, 0xdb, 0x62, 0x7b, 0x2d, - 0x13, 0x79, 0x79, 0xc2, 0x07, 0x9d, 0x3e, 0xb0, 0xb5, 0xf0, 0x8a, 0xa6, 0x80, 0x88, 0xd7, 0x0f, - 0x1c, 0x5a, 0x13, 0x24, 0xd7, 0x2c, 0xe2, 0x6f, 0x48, 0xed, 0x51, 0xbf, 0x57, 0xbf, 0x80, 0x69, - 0x10, 0x31, 0x78, 0xf8, 0x4c, 0x67, 0x75, 0xe8, 0x84, 0x0e, 0x11, 0xa1, 0xad, 0xcf, 0x6d, 0x9d, - 0x30, 0xd5, 0x78, 0x2e, 0x61, 0xe3, 0x30, 0xbe, 0x13, 0xeb, 0x2d, 0x99, 0x6e, 0xc5, 0x67, 0xfb, - 0x83, 0xce, 0xb0, 0x19, 0xf0, 0xd8, 0x13, 0x76, 0xeb, 0xe6, 0x2f, 0xa2, 0x8b, 0xaa, 0x04, 0x36, - 0xfb, 0x83, 0x76, 0x16, 0x65, 0xd7, 0xe7, 0x6f, 0x0f, 0x58, 0x5f, 0x16, 0x65, 0x65, 0x1b, 0xd1, - 0x25, 0x9c, 0x5b, 0x28, 0x9d, 0x72, 0x07, 0x12, 0xde, 0xaf, 0x86, 0x5d, 0xf7, 0xdd, 0xc8, 0xff, - 0xe0, 0xeb, 0x73, 0x80, 0x15, 0x7f, 0xae, 0xcb, 0xa1, 0x7e, 0x92, 0xc5, 0xc6, 0x93, 0x2a, 0xc0, - 0x62, 0x44, 0x2c, 0x11, 0x5f, 0xf3, 0x38, 0x1a, 0x94, 0x0f, 0x59, 0x48, 0x32, 0x14, 0x31, 0xde, - 0x38, 0xee, 0xfe, 0x1b, 0xd4, 0x90, 0xf2, 0x39, 0xca, 0x1c, 0x0d, 0x18, 0x33, 0xaf, 0x96, 0x09, - 0x67, 0x6e, 0x42, 0x86, 0xc6, 0xcd, 0xb2, 0x8f, 0xd9, 0x73, 0x96, 0xca, 0xa9, 0xb4, 0x0c, 0xdb, - 0xc6, 0x20, 0x76, 0x60, 0xa2, 0x01, 0xff, 0x46, 0x48, 0x16, 0xb1, 0xc6, 0xd8, 0xdf, 0x79, 0xf2, - 0xcb, 0xcb, 0x17, 0x2f, 0x5e, 0x1c, 0xb2, 0xdb, 0x42, 0x14, 0x89, 0x5e, 0x96, 0x56, 0xa4, 0xcc, - 0xea, 0xb8, 0x30, 0x73, 0x69, 0x0c, 0x12, 0x30, 0x64, 0x27, 0x18, 0x41, 0x34, 0x48, 0xb7, 0xb0, - 0x6c, 0x91, 0x09, 0x22, 0xd2, 0x1c, 0x63, 0x24, 0x4d, 0x31, 0x70, 0x32, 0x60, 0xa9, 0x62, 0x6f, - 0xaf, 0x46, 0x0c, 0xdd, 0x81, 0x2d, 0x55, 0xa5, 0xd9, 0x38, 0x2e, 0x66, 0x78, 0x49, 0x2f, 0x94, - 0x0e, 0xd8, 0xf0, 0xfc, 0x32, 0x60, 0xc2, 0x26, 0x21, 0x2b, 0x65, 0xd1, 0xed, 0xb4, 0x21, 0xd5, - 0x03, 0x6a, 0x22, 0x6c, 0x21, 0x35, 0xa4, 0x19, 0xc3, 0xbc, 0xab, 0xd1, 0xb1, 0xcf, 0x8c, 0x9a, - 0x58, 0xd8, 0x25, 0x58, 0x3d, 0x04, 0xdf, 0x43, 0xdb, 0xc1, 0x33, 0x56, 0x9f, 0xdb, 0x34, 0x7c, - 0x7b, 0xe5, 0x32, 0x4a, 0x0f, 0xae, 0xe1, 0x50, 0x99, 0x69, 0xb8, 0xff, 0x68, 0x7c, 0xea, 0x13, - 0x57, 0xd7, 0x5b, 0xb1, 0x78, 0xb6, 0xdf, 0xe0, 0x32, 0x52, 0xc0, 0x8d, 0xee, 0x2b, 0x0c, 0x66, - 0x04, 0x0c, 0xd9, 0xce, 0xda, 0x91, 0x9f, 0x61, 0xde, 0x35, 0x98, 0x1c, 0xc8, 0x39, 0x56, 0x08, - 0x42, 0x47, 0xb1, 0x38, 0x37, 0xaa, 0x41, 0xda, 0x66, 0x02, 0xa3, 0x9c, 0xd6, 0x80, 0x84, 0xb5, - 0xea, 0xba, 0xce, 0xaa, 0x51, 0x26, 0x56, 0x2b, 0x34, 0xac, 0x55, 0x79, 0xca, 0xc6, 0x82, 0xae, - 0x3d, 0xc5, 0x14, 0x62, 0x1c, 0x96, 0x50, 0x87, 0x51, 0xbd, 0x51, 0x9e, 0x86, 0x74, 0xac, 0x3f, - 0x1e, 0x74, 0x4e, 0xa5, 0x69, 0xad, 0xa9, 0xf7, 0x15, 0xca, 0x22, 0xf6, 0x04, 0x72, 0xc0, 0x14, - 0x54, 0xea, 0x85, 0x04, 0xde, 0x71, 0xc1, 0x90, 0x20, 0xc8, 0x7c, 0xd8, 0x91, 0xe0, 0x01, 0x8c, - 0x85, 0xd8, 0x66, 0xac, 0xbe, 0xaf, 0xad, 0xd0, 0x24, 0xd4, 0xc7, 0xce, 0xd1, 0xbe, 0x5c, 0x67, - 0x33, 0xd5, 0x07, 0xd2, 0xac, 0x1e, 0x2f, 0x09, 0x73, 0xd4, 0xfe, 0xb2, 0xb6, 0xce, 0xe9, 0x96, - 0x13, 0xa7, 0x3e, 0xa7, 0x30, 0x61, 0x5b, 0x5a, 0x9b, 0x94, 0x76, 0xfb, 0x3d, 0x59, 0xa3, 0x7e, - 0x2a, 0x8a, 0x25, 0x8b, 0x93, 0x84, 0xc2, 0x07, 0x4c, 0xde, 0xc9, 0xd7, 0x92, 0xb5, 0x34, 0x46, - 0xa7, 0xe9, 0xa4, 0x48, 0x7f, 0x10, 0xc3, 0xab, 0x77, 0x4d, 0x0c, 0xe9, 0xef, 0x35, 0x58, 0x51, - 0x69, 0x82, 0x1c, 0x72, 0x7e, 0x70, 0xf0, 0x66, 0xd8, 0xc4, 0xee, 0x38, 0xcf, 0xd7, 0x6a, 0xe3, - 0x22, 0x65, 0x0d, 0x47, 0x23, 0xb7, 0xf0, 0x06, 0x80, 0x0b, 0x4a, 0x8c, 0x16, 0x5b, 0x3d, 0xf8, - 0xbf, 0x6a, 0xe0, 0x78, 0x03, 0x69, 0x07, 0x1c, 0xd0, 0x85, 0x19, 0x48, 0x08, 0x8b, 0xf0, 0xce, - 0x1c, 0xfa, 0x92, 0xf2, 0x21, 0x11, 0x34, 0xc5, 0x83, 0x2d, 0xeb, 0x89, 0xbd, 0xcd, 0x77, 0x62, - 0x9b, 0xec, 0xd9, 0x60, 0xd8, 0xe6, 0x77, 0x4d, 0x32, 0xa0, 0x97, 0x67, 0x83, 0x1f, 0x50, 0xe2, - 0x2d, 0xb1, 0x5b, 0xe7, 0x32, 0x2e, 0xaa, 0x38, 0x77, 0x01, 0x69, 0x8f, 0xae, 0xb8, 0x4e, 0x0f, - 0xce, 0xea, 0xdc, 0x3d, 0xd6, 0x69, 0x25, 0x0b, 0x85, 0x4d, 0x8f, 0x62, 0xd7, 0xb0, 0xd3, 0xf1, - 0x15, 0x5f, 0xd9, 0x44, 0xcc, 0x59, 0x95, 0x20, 0xbe, 0x1b, 0x0c, 0xd7, 0x4a, 0x37, 0x46, 0xc5, - 0x2d, 0x44, 0x63, 0x8b, 0xdb, 0x4c, 0x31, 0xab, 0x19, 0xae, 0xe9, 0xa3, 0xac, 0x43, 0xcd, 0x31, - 0xe2, 0xbd, 0x06, 0x6a, 0x74, 0x39, 0xb2, 0xb9, 0x9d, 0x8e, 0x50, 0x77, 0x4d, 0x9b, 0x6c, 0x85, - 0x37, 0xcf, 0xfd, 0x5e, 0xbc, 0x0a, 0xc1, 0xa0, 0xd3, 0xe8, 0x5b, 0xbd, 0x74, 0xf9, 0xb9, 0x61, - 0xb5, 0xbb, 0x3b, 0x35, 0xd1, 0x76, 0x63, 0xb1, 0x4b, 0xb6, 0xd2, 0x46, 0xbc, 0xd6, 0x37, 0x60, - 0x2d, 0x74, 0x9d, 0x87, 0xb1, 0xfb, 0x75, 0xe3, 0x4a, 0xe1, 0x9a, 0x2e, 0x49, 0x09, 0xee, 0x59, - 0xed, 0xff, 0x3a, 0xb8, 0x75, 0xdb, 0x56, 0x88, 0xd6, 0xe9, 0xb8, 0xe2, 0xa9, 0xc7, 0xa1, 0x68, - 0xbd, 0x64, 0x0d, 0x1a, 0x80, 0xa6, 0x41, 0xa2, 0xb3, 0x86, 0x82, 0xf0, 0x6a, 0x61, 0xd8, 0xba, - 0xf2, 0x6d, 0x81, 0xd1, 0x62, 0xb1, 0xbd, 0x63, 0x8d, 0x48, 0xe7, 0x61, 0x48, 0xf6, 0x1f, 0xc7, - 0xe4, 0x91, 0x6e, 0xf9, 0x20, 0x26, 0xfb, 0xc1, 0x86, 0xf1, 0xdf, 0x02, 0xb2, 0x81, 0x07, 0xd5, - 0x4e, 0xe7, 0xe1, 0xe2, 0xa9, 0x5d, 0xa0, 0xb6, 0xd0, 0xe0, 0xd2, 0xdb, 0xbe, 0xe1, 0xba, 0x72, - 0xbc, 0xfa, 0xe3, 0xec, 0xe6, 0xdd, 0xcd, 0xf9, 0xe8, 0xac, 0xee, 0x15, 0xa0, 0x58, 0x4d, 0x7d, - 0xe5, 0xc1, 0x13, 0xa1, 0x0b, 0x44, 0x87, 0x6e, 0xc2, 0x35, 0xbd, 0x6e, 0xcb, 0x9b, 0xc7, 0x44, - 0x14, 0x7f, 0x56, 0xe8, 0x20, 0x68, 0x77, 0x93, 0x4d, 0xea, 0x60, 0xe0, 0x6f, 0x2d, 0x76, 0x1c, - 0x19, 0x36, 0xb7, 0x6d, 0xa7, 0xee, 0x6c, 0x78, 0x1d, 0x36, 0x15, 0xf9, 0xfa, 0x01, 0x8a, 0x0f, - 0x56, 0x74, 0x6d, 0x1c, 0x21, 0x12, 0xe9, 0x8e, 0xa9, 0xe6, 0x53, 0xf4, 0xa3, 0xb0, 0xad, 0x97, - 0xe3, 0x31, 0x6e, 0xb9, 0x6d, 0x91, 0x34, 0x85, 0xd0, 0xfe, 0x8c, 0x84, 0x86, 0x9b, 0x55, 0xe3, - 0x10, 0x57, 0xf7, 0xde, 0xb1, 0xd4, 0x89, 0x52, 0x6a, 0x26, 0x45, 0x8f, 0x66, 0xf0, 0x1e, 0xfa, - 0x74, 0xac, 0xa7, 0xf4, 0x73, 0xd7, 0xc7, 0x71, 0x8e, 0x16, 0xc9, 0x07, 0xb4, 0x4c, 0x49, 0xd0, - 0x61, 0x77, 0x42, 0x13, 0xcd, 0xb0, 0xdd, 0x70, 0xef, 0x79, 0xb8, 0xbf, 0x33, 0xde, 0x5f, 0x71, - 0xd5, 0xcf, 0x68, 0x58, 0xc8, 0x99, 0xec, 0xb9, 0x6b, 0x1b, 0x4d, 0xb0, 0x4a, 0x9b, 0x1d, 0xb0, - 0xe1, 0x4e, 0xa2, 0x45, 0x2a, 0x29, 0x49, 0x3b, 0xf7, 0xf5, 0x6f, 0x6e, 0x45, 0xb7, 0x16, 0x74, - 0x01, 0x05, 0xff, 0x49, 0x51, 0xd3, 0xa8, 0x29, 0x45, 0x22, 0xc1, 0x39, 0x16, 0x1d, 0x61, 0xb6, - 0x2a, 0xdd, 0xce, 0x31, 0xcb, 0x2a, 0x34, 0x0c, 0xb7, 0xea, 0x7a, 0x22, 0xa8, 0x1f, 0xd7, 0x2e, - 0xbd, 0x54, 0x85, 0x40, 0xaf, 0x52, 0x8c, 0x46, 0x3d, 0x20, 0x06, 0x72, 0xac, 0x7f, 0x2a, 0x72, - 0x57, 0x90, 0x6e, 0xeb, 0x51, 0xc7, 0x4b, 0x7c, 0xb6, 0xbf, 0xbb, 0xf7, 0xdb, 0xce, 0xfe, 0xee, - 0xfe, 0x33, 0xf6, 0x2a, 0xd3, 0xb8, 0x6c, 0x4b, 0xb0, 0xe7, 0x30, 0xc9, 0x16, 0xf4, 0x53, 0x45, - 0xd3, 0xa6, 0x2e, 0xd0, 0xc0, 0x70, 0xfb, 0x03, 0xf2, 0x30, 0xaa, 0xee, 0xb2, 0x3f, 0x05, 0xc6, - 0x38, 0x57, 0xe3, 0xde, 0x1c, 0xb7, 0x74, 0xa1, 0x7b, 0x17, 0xe7, 0xaf, 0xce, 0xde, 0x0e, 0xcf, - 0xbe, 0x8d, 0x40, 0xe7, 0xf2, 0x7c, 0xc4, 0xf2, 0x5a, 0x93, 0x73, 0x10, 0xad, 0xad, 0x35, 0x74, - 0x28, 0x34, 0xbc, 0x82, 0x1b, 0xc6, 0xa0, 0x41, 0x82, 0x50, 0x71, 0x5d, 0x2e, 0x5a, 0x26, 0x30, - 0xb2, 0xe4, 0x54, 0xb3, 0xee, 0x27, 0x05, 0xe6, 0x7e, 0x25, 0x20, 0xaa, 0xa7, 0x2d, 0x35, 0xaf, - 0x52, 0x9d, 0x10, 0x4b, 0xd4, 0x3f, 0xc3, 0x7c, 0x77, 0x90, 0xfd, 0x76, 0x8e, 0xed, 0xfc, 0xd4, - 0x20, 0xdb, 0xa3, 0x6e, 0x83, 0x0f, 0x9a, 0xdf, 0x69, 0x98, 0xa7, 0x1f, 0x77, 0xff, 0x0b, 0xaf, - 0x1a, 0xd5, 0x6f, 0xec, 0x15, 0x00, 0x00 + 0x40, 0x72, 0xb9, 0x0f, 0x60, 0x69, 0x5e, 0x7a, 0xba, 0x9f, 0xee, 0x7e, 0xba, 0x47, 0xfd, 0xee, + 0xe9, 0xd5, 0xab, 0xd1, 0xbf, 0xae, 0xcf, 0x58, 0x66, 0xe7, 0xf9, 0xa0, 0x4f, 0xff, 0x59, 0x1e, + 0x17, 0xd3, 0x88, 0x8b, 0x82, 0xe3, 0x5d, 0xc4, 0xe9, 0xa0, 0x3f, 0x17, 0x36, 0x66, 0x9d, 0x44, + 0x15, 0x56, 0x14, 0x36, 0xe2, 0x0b, 0x99, 0xda, 0x2c, 0x4a, 0xc5, 0x9d, 0x4c, 0xc4, 0x8e, 0x7b, + 0x09, 0x64, 0x21, 0xad, 0x8c, 0xf3, 0x1d, 0x93, 0xc4, 0xb9, 0x88, 0xf6, 0x82, 0x79, 0xfc, 0x59, + 0xce, 0xab, 0xf9, 0xea, 0xbd, 0x32, 0x42, 0xbb, 0x97, 0x78, 0x8c, 0xf7, 0x42, 0x71, 0xd6, 0x29, + 0xe2, 0xb9, 0x88, 0xf8, 0x9d, 0x14, 0x8b, 0x52, 0x69, 0xcb, 0x9b, 0x53, 0x92, 0x2c, 0xd6, 0x46, + 0xe0, 0x90, 0xca, 0x4e, 0x76, 0x5e, 0x60, 0xd4, 0x4a, 0x9b, 0x8b, 0xc1, 0xa5, 0x34, 0x09, 0x1b, + 0x0a, 0x6b, 0x65, 0x31, 0x35, 0xfd, 0x5e, 0x3d, 0xd8, 0x37, 0x89, 0x96, 0xa5, 0x1d, 0x74, 0xee, + 0x62, 0xcd, 0x72, 0x95, 0xc8, 0x32, 0xb0, 0x72, 0x2e, 0x54, 0x65, 0x83, 0x34, 0x4a, 0x55, 0x52, + 0xcd, 0xa1, 0x6e, 0x80, 0x89, 0xa8, 0xbb, 0x47, 0x3f, 0xa5, 0x56, 0x56, 0x45, 0x3c, 0xb3, 0xb6, + 0x3c, 0xe0, 0x87, 0x93, 0xaa, 0x48, 0xac, 0x54, 0x05, 0x7b, 0xe3, 0xf9, 0x5f, 0x16, 0xb2, 0x48, + 0xd5, 0x22, 0x54, 0xa5, 0x28, 0x3c, 0xb7, 0xc0, 0x1c, 0xf4, 0x7a, 0xb3, 0x42, 0x85, 0x8b, 0x5c, + 0xa4, 0xe1, 0x54, 0xf4, 0x26, 0x22, 0xb6, 0x95, 0x16, 0xa6, 0x67, 0x1a, 0x25, 0x7a, 0xbf, 0x18, + 0x91, 0x54, 0x5a, 0xda, 0xe5, 0x4e, 0x3b, 0xc4, 0xfd, 0xaf, 0x2b, 0xa1, 0x27, 0xf7, 0x84, 0x4e, + 0x85, 0xbd, 0xbd, 0xb9, 0xf0, 0x78, 0x6f, 0xbd, 0x38, 0xe0, 0x1f, 0x8d, 0xc8, 0x27, 0x9b, 0xbb, + 0x6e, 0x1f, 0xdb, 0x55, 0x95, 0x69, 0x6c, 0xc5, 0x83, 0x7b, 0xa6, 0xe7, 0xa9, 0x67, 0xfd, 0x2f, + 0x5a, 0x40, 0xbf, 0x82, 0x91, 0xb2, 0xf6, 0x2c, 0x17, 0x64, 0xfa, 0xc9, 0xd2, 0x4d, 0xad, 0x97, + 0x4a, 0x73, 0x35, 0xfe, 0xb4, 0xb1, 0xd8, 0x3e, 0x79, 0xc2, 0xd5, 0xf8, 0x93, 0x48, 0x2c, 0x8f, + 0x22, 0xbb, 0x2c, 0x85, 0x9a, 0xd0, 0x58, 0xf7, 0x58, 0xeb, 0x78, 0x19, 0x4a, 0xe3, 0x7e, 0xb7, + 0x24, 0xe4, 0x2a, 0x4e, 0xff, 0x31, 0xf4, 0x6c, 0x20, 0xa2, 0xee, 0xae, 0xff, 0x25, 0x17, 0x96, + 0xa9, 0x28, 0x0d, 0x13, 0x0d, 0x78, 0x44, 0x73, 0xac, 0xc7, 0x6b, 0xbf, 0x70, 0xff, 0x50, 0x85, + 0x30, 0xf7, 0xd8, 0x5a, 0x2d, 0xc7, 0x95, 0x15, 0x98, 0xd0, 0x09, 0x0f, 0xac, 0x1f, 0xdc, 0x1f, + 0xa7, 0xb3, 0x79, 0xc0, 0xad, 0xf8, 0x6c, 0x7b, 0x9f, 0xe2, 0xbb, 0xb8, 0x15, 0xf0, 0xcd, 0xc2, + 0xd8, 0x2c, 0x0b, 0x88, 0x10, 0x7e, 0x90, 0x86, 0x63, 0x95, 0x2e, 0xc3, 0xb8, 0x04, 0x4e, 0xe9, + 0xab, 0x4c, 0xe6, 0xa9, 0xa7, 0x68, 0x7d, 0x9c, 0xa6, 0x67, 0x77, 0xd0, 0xe2, 0x42, 0x1a, 0x44, + 0xab, 0xd0, 0x1e, 0x27, 0x9d, 0x79, 0xe0, 0xf9, 0xd1, 0xe0, 0xcb, 0xef, 0xc2, 0xfe, 0xe1, 0xf9, + 0x01, 0x64, 0x9e, 0x24, 0xb3, 0xd7, 0x32, 0x17, 0x14, 0x84, 0x1e, 0x21, 0xc8, 0xc7, 0xc9, 0x2c, + 0x99, 0x4c, 0xb9, 0xff, 0xe8, 0x6c, 0x09, 0xef, 0x0b, 0x0b, 0xbf, 0xf9, 0x5f, 0x1f, 0x3e, 0x47, + 0x68, 0xad, 0x34, 0xcc, 0xc3, 0x39, 0x48, 0x15, 0xa3, 0x72, 0x11, 0xe6, 0x6a, 0xea, 0xf1, 0x33, + 0x1a, 0x67, 0x0d, 0x78, 0x70, 0x3d, 0x9b, 0x40, 0xb4, 0x83, 0x01, 0xb9, 0xa1, 0x01, 0xd7, 0x45, + 0x33, 0x0e, 0xf4, 0xb1, 0x71, 0x22, 0xa7, 0x95, 0x8e, 0x1d, 0xda, 0x35, 0x0c, 0x6c, 0x12, 0x4b, + 0x8a, 0xc2, 0x7f, 0x17, 0xe7, 0x45, 0xa2, 0xe6, 0x25, 0x40, 0x17, 0xac, 0x8c, 0xa7, 0x82, 0x21, + 0x26, 0xe2, 0x2e, 0x62, 0x61, 0xc3, 0x41, 0x26, 0x53, 0x8b, 0x91, 0x8a, 0x8d, 0xad, 0x7d, 0xb4, + 0xe7, 0x7f, 0xa1, 0xe4, 0x50, 0x91, 0xb3, 0xc2, 0xd2, 0x84, 0x73, 0x8b, 0x2c, 0xa0, 0xf2, 0x9b, + 0xd1, 0xe5, 0x45, 0x64, 0x61, 0x4b, 0x92, 0xc7, 0xc6, 0x90, 0x21, 0x64, 0x95, 0x27, 0x8e, 0x1a, + 0x53, 0x0e, 0x38, 0x49, 0x83, 0x17, 0x92, 0x5c, 0xc4, 0x7a, 0x54, 0xa7, 0x96, 0xd7, 0xa4, 0x98, + 0xf3, 0x8d, 0x5d, 0xc2, 0xc8, 0xb8, 0x90, 0x73, 0xa7, 0x6f, 0xc4, 0x0b, 0x55, 0x90, 0x65, 0xf5, + 0x8a, 0x08, 0x70, 0xb5, 0x9b, 0xbc, 0x56, 0x41, 0x04, 0xf8, 0xe6, 0x79, 0x5a, 0xcc, 0xd5, 0x1d, + 0x05, 0x86, 0x3b, 0x08, 0xc0, 0xee, 0xbf, 0xdc, 0xdd, 0xdd, 0x30, 0xa7, 0x2a, 0x09, 0x34, 0xf2, + 0x05, 0xd9, 0xd3, 0x1a, 0x53, 0x88, 0x05, 0xfb, 0xe7, 0xe5, 0xc5, 0x1b, 0xe4, 0xe9, 0x8d, 0xf8, + 0xb3, 0x12, 0xc6, 0x1e, 0x7e, 0xc7, 0xf1, 0x1b, 0x47, 0x6f, 0xa0, 0x93, 0x49, 0x83, 0xd3, 0x4d, + 0x09, 0x4f, 0x89, 0x11, 0xe2, 0x2e, 0x70, 0x23, 0xc6, 0x22, 0xcd, 0xcd, 0x20, 0x7a, 0x4e, 0x5a, + 0xf8, 0xdf, 0xf5, 0xf3, 0x5a, 0xae, 0xdd, 0x12, 0x4c, 0x32, 0x92, 0x59, 0xd0, 0x6d, 0x05, 0xd4, + 0x9c, 0x72, 0x7d, 0x35, 0x1c, 0xf1, 0x60, 0x23, 0x9f, 0x9d, 0x72, 0xbe, 0x7f, 0x48, 0x16, 0x15, + 0xce, 0xa2, 0xd7, 0x4a, 0xcf, 0x4f, 0xe1, 0xd1, 0xc3, 0x26, 0x3b, 0x8b, 0x26, 0xb8, 0x3d, 0x4e, + 0x7e, 0x06, 0xac, 0x21, 0x05, 0x8e, 0x79, 0xbf, 0xfb, 0x81, 0xe2, 0x9f, 0x32, 0x03, 0x73, 0x85, + 0x8f, 0xf1, 0xbb, 0x38, 0xaf, 0xc0, 0xa5, 0x3c, 0xe8, 0xee, 0xad, 0xa1, 0x4b, 0x32, 0x91, 0xcc, + 0xde, 0x56, 0xf3, 0x75, 0xbe, 0x77, 0xbd, 0xae, 0x20, 0x53, 0xc2, 0x99, 0x58, 0x86, 0x70, 0x59, + 0x92, 0x79, 0xbd, 0xf7, 0xbb, 0x3b, 0x2f, 0x3f, 0xf4, 0x7c, 0x24, 0xfd, 0x7b, 0x7e, 0x02, 0xbd, + 0x4d, 0x19, 0x27, 0x94, 0x8a, 0xa3, 0x78, 0x8c, 0xff, 0x67, 0x60, 0x7c, 0x98, 0xca, 0x87, 0x99, + 0x9c, 0x58, 0xfc, 0xbe, 0x42, 0x09, 0xd0, 0x2a, 0xc7, 0xd3, 0x71, 0x4e, 0xef, 0xd7, 0x31, 0x88, + 0x9d, 0xc6, 0xe3, 0xd2, 0x5c, 0xa8, 0x64, 0x46, 0x5b, 0xc0, 0xf2, 0x2e, 0x99, 0x87, 0x8d, 0xa4, + 0x6b, 0x44, 0xea, 0x6d, 0xd9, 0x3c, 0x9c, 0xaa, 0x45, 0xe1, 0xe4, 0xc2, 0x31, 0xfc, 0x8d, 0x9a, + 0xd3, 0x02, 0xb0, 0x8c, 0x5a, 0x5c, 0x08, 0x77, 0x80, 0x7b, 0x76, 0xab, 0xdd, 0xd3, 0x8d, 0x9c, + 0x66, 0xab, 0xe1, 0x66, 0xef, 0x39, 0x1c, 0xa6, 0x69, 0xf0, 0x54, 0x50, 0x26, 0xf0, 0x0f, 0x08, + 0xe6, 0x24, 0xaf, 0x52, 0x61, 0xbc, 0x95, 0x75, 0xbe, 0xff, 0xd7, 0x5f, 0xcd, 0x1b, 0xd2, 0x96, + 0x7e, 0x4f, 0xc5, 0x24, 0xae, 0x72, 0x8b, 0xe4, 0x47, 0x4e, 0x6c, 0xa4, 0xcb, 0x76, 0xae, 0x03, + 0x2a, 0x7b, 0x8f, 0x71, 0xc0, 0xc5, 0x45, 0x1d, 0x48, 0x9c, 0x6a, 0xc1, 0x47, 0xfe, 0xd4, 0x12, + 0xc5, 0x3e, 0xb4, 0xc2, 0x7f, 0xea, 0xf1, 0x77, 0x17, 0x67, 0xa7, 0x20, 0x53, 0x93, 0x1e, 0x71, + 0xe4, 0x0f, 0x56, 0x9b, 0xd4, 0xdf, 0x38, 0x6f, 0xe8, 0xd5, 0xa4, 0x69, 0xa3, 0x86, 0xe6, 0x51, + 0x96, 0x5c, 0xee, 0x1c, 0xca, 0x89, 0xc7, 0xc9, 0xbf, 0x07, 0x44, 0xc5, 0xa1, 0x2b, 0x55, 0x89, + 0xca, 0x7d, 0x57, 0xbd, 0x76, 0x03, 0xcf, 0x95, 0xb7, 0x88, 0x56, 0xe7, 0x43, 0xab, 0x34, 0xa0, + 0x24, 0x2d, 0xce, 0xad, 0x98, 0x53, 0x9c, 0x27, 0xe7, 0x25, 0x77, 0x36, 0xd7, 0xcb, 0xb0, 0x7b, + 0x5e, 0x82, 0x58, 0xc8, 0x2e, 0x76, 0xa9, 0x52, 0x11, 0xb2, 0x6b, 0xa4, 0xb0, 0x11, 0x4c, 0x90, + 0x43, 0x19, 0x29, 0xc9, 0xce, 0xaf, 0x41, 0x1d, 0xc1, 0x96, 0x44, 0xb3, 0x2d, 0x31, 0x70, 0xd2, + 0x10, 0xa3, 0x22, 0x37, 0xc2, 0xa9, 0x2d, 0x48, 0xb5, 0xd8, 0x66, 0x04, 0x56, 0xa0, 0x22, 0xec, + 0xc8, 0xd1, 0x03, 0x78, 0x7b, 0x81, 0x08, 0x11, 0x8c, 0xe6, 0x9d, 0xb4, 0x19, 0x82, 0x9b, 0xfb, + 0x47, 0x3b, 0x7b, 0x07, 0x77, 0x4a, 0xa6, 0x6c, 0xd7, 0x0f, 0x4d, 0x99, 0x4b, 0xeb, 0x46, 0x91, + 0xa4, 0xc0, 0x79, 0x6a, 0xb3, 0xc1, 0xfe, 0x93, 0x27, 0xde, 0xaa, 0x20, 0xaf, 0xad, 0x0d, 0x1a, + 0x6b, 0x6b, 0x2b, 0x6c, 0x98, 0x29, 0x63, 0xe9, 0xa8, 0xa7, 0xc8, 0x2a, 0x6a, 0x12, 0x8e, 0x00, + 0xe9, 0xd3, 0xfa, 0xf1, 0x80, 0x03, 0x6e, 0x08, 0x7d, 0xaa, 0x90, 0x0f, 0xfe, 0x57, 0xec, 0x80, + 0xc8, 0x2d, 0x22, 0xbf, 0xe7, 0xc7, 0x4c, 0x8b, 0xc9, 0x2a, 0x01, 0xb7, 0x17, 0xb6, 0x16, 0x21, + 0x5d, 0xbf, 0x21, 0xfb, 0xff, 0x45, 0xca, 0x7a, 0xf1, 0x5a, 0x12, 0x21, 0xeb, 0x4a, 0xe5, 0x37, + 0x85, 0xbf, 0x67, 0xc2, 0x4f, 0xe6, 0xa8, 0x8c, 0x7e, 0xe3, 0x2e, 0x16, 0x83, 0x5a, 0xf5, 0x34, + 0x1c, 0x4e, 0xc2, 0xd8, 0x05, 0x49, 0xf4, 0xc0, 0x16, 0x91, 0xf0, 0xcd, 0x30, 0x6a, 0x56, 0xac, + 0x32, 0x9b, 0xc0, 0x3c, 0x6a, 0x01, 0x05, 0x2c, 0xc0, 0xc5, 0x61, 0xe8, 0x50, 0xb2, 0x5f, 0x3b, + 0xfd, 0x5e, 0xd3, 0x2a, 0xf5, 0x1d, 0x65, 0x0f, 0xfe, 0x2e, 0xe7, 0x04, 0x22, 0xab, 0x74, 0x0e, + 0xee, 0x75, 0x2c, 0x9e, 0x18, 0x18, 0x70, 0x88, 0x85, 0x6e, 0x41, 0xbf, 0x57, 0x77, 0x7e, 0x54, + 0x63, 0x51, 0xba, 0xc8, 0x96, 0x88, 0x23, 0x78, 0xd1, 0x90, 0x4d, 0x40, 0x53, 0x1d, 0x26, 0xf1, + 0x4e, 0x4f, 0x1f, 0x0d, 0x67, 0x75, 0x27, 0x37, 0x9c, 0x70, 0x86, 0x16, 0x2e, 0x53, 0x98, 0x29, + 0xe1, 0x38, 0x2c, 0x4d, 0xe5, 0x1d, 0x73, 0x5c, 0x1f, 0xa1, 0xf4, 0x40, 0xb7, 0xc5, 0xf6, 0x58, + 0x26, 0xf2, 0xf2, 0x84, 0x0f, 0x3a, 0x7d, 0x60, 0x6b, 0x61, 0x15, 0x75, 0x01, 0x11, 0xaf, 0x5f, + 0x38, 0x4e, 0x4d, 0x10, 0x5c, 0xb3, 0x88, 0xbf, 0xa1, 0x63, 0x8f, 0xfa, 0xbd, 0x7a, 0x02, 0xaa, + 0x41, 0xc4, 0xe0, 0xe1, 0x3d, 0x9d, 0xd5, 0xa6, 0x13, 0xda, 0x44, 0x84, 0xb6, 0xde, 0xb7, 0xb5, + 0xc3, 0x54, 0xe3, 0xb9, 0x84, 0x8e, 0xc3, 0xf8, 0x4e, 0xac, 0x97, 0x64, 0xba, 0x15, 0x9f, 0xed, + 0x0f, 0x3a, 0xc3, 0xa6, 0xc1, 0x63, 0x4f, 0xd8, 0xad, 0xeb, 0xbf, 0x88, 0x2e, 0xaa, 0x12, 0xd8, + 0xec, 0x0f, 0xda, 0x5e, 0x94, 0x5d, 0x9f, 0xbf, 0x3d, 0x60, 0x7d, 0x59, 0x94, 0x95, 0x6d, 0x44, + 0x97, 0x30, 0x6e, 0xa1, 0x74, 0xca, 0x1d, 0x48, 0x98, 0x5f, 0x35, 0xbb, 0xee, 0xd9, 0xc8, 0xff, + 0xe0, 0xf1, 0x39, 0xc0, 0x8a, 0x3f, 0xd7, 0xe9, 0x50, 0xbf, 0xc9, 0x62, 0xe3, 0x4d, 0x15, 0x60, + 0x31, 0x22, 0x96, 0x88, 0xaf, 0x79, 0x1c, 0x05, 0xca, 0x87, 0x2c, 0x04, 0x19, 0x92, 0x18, 0x33, + 0x8e, 0xbb, 0xff, 0x86, 0x63, 0xe8, 0xf0, 0x39, 0xd2, 0x1c, 0x05, 0x18, 0x3d, 0xaf, 0x96, 0x09, + 0x67, 0xae, 0x43, 0xc6, 0x89, 0x9b, 0x69, 0x1f, 0xb3, 0xe7, 0x2c, 0x95, 0x53, 0x69, 0x19, 0x96, + 0x8d, 0x41, 0xec, 0xc0, 0x44, 0x03, 0xfe, 0x0d, 0x97, 0x2c, 0x62, 0x8d, 0xb6, 0xbf, 0xf3, 0xe4, + 0x97, 0x97, 0x2f, 0x5e, 0xbc, 0x38, 0x64, 0xb7, 0x85, 0x28, 0x12, 0xbd, 0x2c, 0xad, 0x48, 0x99, + 0xd5, 0x71, 0x61, 0xe6, 0xd2, 0x18, 0x04, 0x60, 0xc8, 0x4e, 0xd0, 0x82, 0x68, 0x90, 0x6e, 0x61, + 0xd9, 0x22, 0x13, 0x44, 0xa4, 0x39, 0xda, 0x48, 0xea, 0x62, 0x60, 0x64, 0xc0, 0x52, 0xc5, 0xde, + 0x5e, 0x8d, 0x18, 0xaa, 0x03, 0x5b, 0xaa, 0x4a, 0xb3, 0x71, 0x5c, 0xcc, 0x30, 0x49, 0x13, 0x4a, + 0x07, 0x6c, 0x78, 0x7e, 0x19, 0x30, 0x61, 0x93, 0x90, 0x95, 0xb2, 0xe8, 0x76, 0x5a, 0x97, 0xea, + 0x01, 0x15, 0x11, 0xb6, 0x90, 0x1a, 0xd2, 0x8c, 0x61, 0xde, 0xd5, 0xe8, 0xd8, 0x67, 0x46, 0x4d, + 0x2c, 0xf4, 0x12, 0xac, 0x6e, 0x82, 0xef, 0xa1, 0xed, 0xe0, 0x19, 0xab, 0xcf, 0x6d, 0x18, 0xbe, + 0xbd, 0x72, 0x11, 0xa5, 0x07, 0xd7, 0x30, 0xa8, 0xcc, 0x34, 0xcc, 0x7f, 0xd4, 0x3f, 0xf5, 0x8e, + 0xab, 0xeb, 0x2d, 0x5f, 0x3c, 0xdb, 0x6f, 0x70, 0x19, 0x29, 0xe0, 0x46, 0xf7, 0x15, 0x06, 0x35, + 0x02, 0x86, 0x68, 0x67, 0x6d, 0xcb, 0xcf, 0xd0, 0xef, 0x1a, 0x74, 0x0e, 0x64, 0x1c, 0x2b, 0x04, + 0xa1, 0xa3, 0x58, 0x9c, 0x1b, 0xd5, 0x20, 0x6d, 0x33, 0x81, 0x56, 0x4e, 0x6b, 0x40, 0xc2, 0xda, + 0xe3, 0xba, 0x4e, 0xab, 0x51, 0x26, 0x56, 0x23, 0xd4, 0xac, 0x55, 0x79, 0xca, 0xc6, 0x82, 0xae, + 0x3d, 0xc5, 0x14, 0x62, 0x1c, 0x96, 0x38, 0x0e, 0xad, 0x7a, 0x73, 0x78, 0x1a, 0xd2, 0xb6, 0xfe, + 0x78, 0xd0, 0x39, 0x95, 0xa6, 0xd5, 0xa6, 0x5e, 0x57, 0x28, 0x0b, 0xdf, 0x13, 0xc8, 0x01, 0x53, + 0x38, 0x52, 0x2f, 0x24, 0xf0, 0x8e, 0x0b, 0x86, 0x00, 0x41, 0xe4, 0x43, 0x8f, 0x04, 0x2f, 0x60, + 0x2c, 0xf8, 0x36, 0x63, 0xf5, 0x7d, 0x6d, 0x85, 0x26, 0xa1, 0x3e, 0x76, 0x86, 0xf6, 0xe5, 0x3a, + 0x9a, 0x29, 0x3f, 0x10, 0x66, 0x75, 0x7b, 0x49, 0x98, 0x23, 0xf7, 0x97, 0xb5, 0x76, 0xee, 0x6c, + 0x39, 0x71, 0xc7, 0xe7, 0xe4, 0x26, 0x2c, 0x4b, 0x6b, 0x95, 0xd2, 0x6e, 0xbf, 0x27, 0x6b, 0xd4, + 0x4f, 0x45, 0xb1, 0x64, 0x71, 0x92, 0x90, 0xfb, 0x80, 0xc9, 0x3b, 0xf9, 0x5a, 0xb2, 0x96, 0xc6, + 0x68, 0x37, 0xed, 0x14, 0xe9, 0x0f, 0x7c, 0x78, 0xf5, 0xae, 0xf1, 0x21, 0xfd, 0xbd, 0x06, 0x2b, + 0x2a, 0x4d, 0x90, 0x43, 0xce, 0x0f, 0x36, 0xde, 0x0c, 0x1b, 0xdf, 0x1d, 0xe7, 0xf9, 0xfa, 0xd8, + 0xb8, 0x48, 0x59, 0xc3, 0xd1, 0x88, 0x2d, 0xcc, 0x00, 0x70, 0x41, 0x81, 0xd1, 0x62, 0xab, 0x07, + 0xff, 0x57, 0x0e, 0x1c, 0x6f, 0x20, 0xed, 0x80, 0x03, 0xba, 0x50, 0x03, 0x01, 0x61, 0xe1, 0xde, + 0x99, 0x43, 0x5f, 0x52, 0x3c, 0x24, 0x82, 0xba, 0x78, 0xb0, 0x65, 0xdd, 0xb1, 0xb7, 0xf1, 0x4e, + 0x6c, 0x93, 0x3d, 0x1b, 0x0c, 0xdb, 0xf8, 0xae, 0x49, 0x06, 0xf4, 0xf2, 0x6c, 0xf0, 0x03, 0x4a, + 0xbc, 0x25, 0x76, 0xeb, 0x5c, 0xc6, 0x45, 0x15, 0xe7, 0xce, 0x21, 0xed, 0xd6, 0x15, 0xd7, 0xe9, + 0xc1, 0x59, 0x1d, 0xbb, 0xc7, 0x3a, 0xad, 0x64, 0xa1, 0xb0, 0xe8, 0x51, 0xec, 0x1a, 0x76, 0x3a, + 0xbe, 0xe2, 0x2b, 0x9d, 0x88, 0x39, 0xab, 0x12, 0xc4, 0x77, 0x83, 0xe6, 0x5a, 0xe9, 0x46, 0xa9, + 0xb8, 0x85, 0x68, 0x6c, 0x71, 0x9b, 0x29, 0x66, 0x35, 0xc3, 0x35, 0x75, 0x94, 0x75, 0xa8, 0x38, + 0x46, 0xbc, 0xd7, 0x40, 0x8d, 0x2a, 0x47, 0x3a, 0xb7, 0xdd, 0x11, 0xf2, 0xae, 0x29, 0x93, 0xad, + 0xf0, 0xe6, 0xbd, 0xdf, 0x8b, 0x57, 0x2e, 0x18, 0x74, 0x9a, 0xf3, 0x56, 0x93, 0x2e, 0x3e, 0x37, + 0xb4, 0x76, 0x77, 0xa7, 0xc6, 0xdb, 0xae, 0x2d, 0x76, 0xc1, 0x56, 0xda, 0x88, 0xd7, 0xe7, 0x0d, + 0x58, 0x0b, 0x5d, 0xe7, 0x61, 0xec, 0x7e, 0xdd, 0xb8, 0x52, 0xb8, 0xa2, 0x4b, 0x52, 0x82, 0x7b, + 0x5a, 0xfb, 0xbf, 0x0e, 0x6e, 0xdd, 0xb2, 0x15, 0xa2, 0x75, 0x38, 0xae, 0x78, 0xea, 0x71, 0x28, + 0x5a, 0x2b, 0x59, 0x83, 0x06, 0xa0, 0x69, 0x90, 0xe8, 0xac, 0xa1, 0x20, 0xbc, 0x5a, 0x18, 0xb6, + 0xae, 0x7c, 0x5b, 0x60, 0xb4, 0x58, 0x6c, 0xaf, 0x58, 0x23, 0xd2, 0x79, 0x18, 0x92, 0xfd, 0xc7, + 0x31, 0x79, 0xa4, 0x5a, 0x3e, 0x88, 0xc9, 0x7e, 0xb0, 0xa1, 0xfc, 0xb7, 0x80, 0x6c, 0xe0, 0x41, + 0xb9, 0xd3, 0x79, 0x38, 0x79, 0x6a, 0x13, 0xa8, 0x2c, 0x34, 0xb8, 0xf4, 0xb6, 0x6f, 0xb8, 0x2e, + 0x1d, 0xaf, 0xfe, 0x38, 0xbb, 0x79, 0x77, 0x73, 0x3e, 0x3a, 0xab, 0x6b, 0x05, 0x28, 0x56, 0x53, + 0x5d, 0x79, 0x70, 0x47, 0xe8, 0x1c, 0xd1, 0xa1, 0x9b, 0x70, 0x4d, 0xaf, 0xdb, 0xf2, 0xe6, 0x31, + 0x11, 0xc5, 0x9f, 0x15, 0x2a, 0x08, 0xca, 0xdd, 0x64, 0x93, 0x3a, 0x18, 0xf8, 0x5b, 0x8b, 0x1d, + 0x47, 0x86, 0xcd, 0x6d, 0xdb, 0x1d, 0x77, 0x36, 0xbc, 0x0e, 0x9b, 0x8c, 0x7c, 0xfd, 0x00, 0xc5, + 0x07, 0x2b, 0xba, 0x36, 0x8e, 0x10, 0x89, 0x74, 0xc7, 0x94, 0xf3, 0x29, 0xea, 0x51, 0xd8, 0xe6, + 0xcb, 0xf1, 0x18, 0xb7, 0xdc, 0x36, 0x49, 0x9a, 0x44, 0x68, 0x3f, 0x23, 0xa1, 0xe0, 0x66, 0xd5, + 0x38, 0xc4, 0xd5, 0xbd, 0x77, 0x2c, 0x75, 0xa2, 0x94, 0x9a, 0x49, 0xd1, 0xa3, 0x1e, 0xbc, 0x87, + 0x3a, 0x1d, 0xeb, 0x29, 0x7d, 0xee, 0xfa, 0x38, 0xce, 0x51, 0x22, 0xf9, 0x80, 0x86, 0x29, 0x08, + 0x3a, 0xec, 0x4e, 0x68, 0xa2, 0x19, 0xb6, 0x1b, 0xee, 0x3d, 0x0f, 0xf7, 0x57, 0x44, 0xf5, 0x33, + 0xe2, 0x17, 0x72, 0x26, 0x7b, 0xee, 0xce, 0x46, 0xed, 0xab, 0xd2, 0x66, 0x07, 0x54, 0xb8, 0x93, + 0x68, 0x91, 0x4a, 0x8a, 0xd0, 0xce, 0xfd, 0xc3, 0x37, 0x97, 0xa2, 0x54, 0x0b, 0xba, 0x7d, 0x82, + 0xfc, 0xa4, 0xa8, 0x39, 0xd4, 0x94, 0x22, 0x91, 0x20, 0x1c, 0x8b, 0x72, 0x30, 0x5b, 0xe5, 0x6d, + 0xe7, 0x98, 0x65, 0x15, 0xaa, 0x85, 0x1b, 0x75, 0x05, 0x11, 0xbc, 0x8f, 0x3b, 0x97, 0x5e, 0xaa, + 0x42, 0xa0, 0x50, 0x29, 0x46, 0x7d, 0x1e, 0xe0, 0x02, 0x33, 0xd6, 0xdf, 0x89, 0xdc, 0xfd, 0xa3, + 0xdb, 0x5a, 0xd4, 0xf1, 0x12, 0x9f, 0xed, 0xef, 0xee, 0xfd, 0xb6, 0xb3, 0xbf, 0xbb, 0xff, 0x8c, + 0xbd, 0xca, 0x34, 0x6e, 0xda, 0x12, 0xd4, 0x39, 0x4c, 0xb2, 0x05, 0x7d, 0xa7, 0x68, 0x6a, 0xd4, + 0x05, 0xaa, 0x17, 0xae, 0x7e, 0x80, 0x1d, 0x4a, 0xd5, 0x25, 0xf6, 0xa7, 0xc0, 0x18, 0xe7, 0x6a, + 0xdc, 0x9b, 0xe3, 0x8a, 0x2e, 0x74, 0xef, 0xe2, 0xfc, 0xd5, 0xd9, 0xdb, 0xe1, 0xd9, 0xb7, 0xf0, + 0x77, 0x2e, 0xcf, 0x47, 0x2c, 0xaf, 0x4f, 0x72, 0x06, 0xa2, 0xae, 0xb5, 0x8a, 0x0e, 0x85, 0x86, + 0x55, 0x30, 0xc3, 0x18, 0x54, 0x47, 0xb0, 0x29, 0xee, 0xca, 0x45, 0x4b, 0x03, 0x46, 0x96, 0x9c, + 0x12, 0xd6, 0x7d, 0x4f, 0x60, 0xee, 0x13, 0x01, 0xf1, 0x3c, 0x2d, 0xa9, 0x49, 0x95, 0x92, 0x84, + 0x28, 0xa2, 0xfe, 0x06, 0xf3, 0xdd, 0x2e, 0xf6, 0xdb, 0x26, 0xb6, 0xf3, 0x53, 0x5d, 0x6c, 0x8f, + 0x4a, 0x0d, 0x7e, 0xa8, 0x79, 0xa7, 0x4e, 0x9e, 0xbe, 0xec, 0xfe, 0x17, 0x52, 0x67, 0xe8, 0x26, + 0xe9, 0x15, 0x00, 0x00 }; diff --git a/wled00/improv.cpp b/wled00/improv.cpp index 64b76418b..2267c3591 100644 --- a/wled00/improv.cpp +++ b/wled00/improv.cpp @@ -210,7 +210,7 @@ void sendImprovInfoResponse() { //Use serverDescription if it has been changed from the default "WLED", else mDNS name bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0); char vString[20]; - sprintf_P(vString, PSTR("0.14.2-b2/%i"), VERSION); + sprintf_P(vString, PSTR("0.14.2/%i"), VERSION); const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription}; sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str); diff --git a/wled00/wled.h b/wled00/wled.h index 8c5576547..9f6ba88fd 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -3,12 +3,12 @@ /* Main sketch, global variable declarations @title WLED project sketch - @version 0.14.2-b1 + @version 0.14.2 @author Christian Schwinne */ // version code in format yymmddb (b = daily build) -#define VERSION 2403110 +#define VERSION 2403170 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG From 6de617ecd5e835488a95f77c28fef8e5d824c964 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Sun, 17 Mar 2024 15:11:08 -0400 Subject: [PATCH 080/114] getSettingsJS: Fix missing DISABLE_INFRARED guard --- wled00/xml.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 04e0ebfdf..fddc242ea 100755 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -471,8 +471,10 @@ void getSettingsJS(byte subPage, char* dest) } sappend('c',SET_F("IP"),disablePullUp); sappend('v',SET_F("TT"),touchThreshold); +#ifndef WLED_DISABLE_INFRARED sappend('v',SET_F("IR"),irPin); sappend('v',SET_F("IT"),irEnabled); +#endif sappend('c',SET_F("MSO"),!irApplyToAllSelected); } From b849ea8eaacdf1b24becc998f6bbbc06e052d71f Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 18 Mar 2024 20:01:32 +0100 Subject: [PATCH 081/114] Fix for #3827 --- wled00/button.cpp | 3 --- wled00/e131.cpp | 1 - wled00/json.cpp | 2 -- wled00/ntp.cpp | 3 --- wled00/presets.cpp | 1 + wled00/remote.cpp | 1 - wled00/set.cpp | 1 - 7 files changed, 1 insertion(+), 11 deletions(-) diff --git a/wled00/button.cpp b/wled00/button.cpp index 29cb0abeb..cf4599834 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -21,7 +21,6 @@ void shortPressAction(uint8_t b) case 1: ++effectCurrent %= strip.getModeCount(); stateChanged = true; colorUpdated(CALL_MODE_BUTTON); break; } } else { - unloadPlaylist(); // applying a preset unloads the playlist applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET); } @@ -43,7 +42,6 @@ void longPressAction(uint8_t b) case 1: bri += 8; stateUpdated(CALL_MODE_BUTTON); buttonPressedTime[b] = millis(); break; // repeatable action } } else { - unloadPlaylist(); // applying a preset unloads the playlist applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET); } @@ -65,7 +63,6 @@ void doublePressAction(uint8_t b) case 1: ++effectPalette %= strip.getPaletteCount(); colorUpdated(CALL_MODE_BUTTON); break; } } else { - unloadPlaylist(); // applying a preset unloads the playlist applyPreset(macroDoublePress[b], CALL_MODE_BUTTON_PRESET); } diff --git a/wled00/e131.cpp b/wled00/e131.cpp index e54f60bf3..ec2efb50e 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -184,7 +184,6 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ // only apply preset if not in playlist, or playlist changed (currentPlaylist < 0 || dmxValPreset != currentPlaylist)) { presetCycCurr = dmxValPreset; - unloadPlaylist(); // applying a preset unloads the playlist applyPreset(dmxValPreset, CALL_MODE_NOTIFICATION); } diff --git a/wled00/json.cpp b/wled00/json.cpp index 389dc8ae5..84caedd22 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -442,13 +442,11 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId) currentPreset = root[F("pd")] | currentPreset; if (root["win"].isNull()) presetCycCurr = currentPreset; // otherwise it was set in handleSet() [set.cpp] presetToRestore = currentPreset; // stateUpdated() will clear the preset, so we need to restore it after - //unloadPlaylist(); // applying a preset unloads the playlist, may be needed here too? } else if (!root["ps"].isNull()) { ps = presetCycCurr; if (root["win"].isNull() && getVal(root["ps"], &ps, 0, 0) && ps > 0 && ps < 251 && ps != currentPreset) { // b) preset ID only or preset that does not change state (use embedded cycling limits if they exist in getVal()) presetCycCurr = ps; - unloadPlaylist(); // applying a preset unloads the playlist applyPreset(ps, callMode); // async load from file system (only preset ID was specified) return stateResponse; } diff --git a/wled00/ntp.cpp b/wled00/ntp.cpp index 0b2cf3665..d473186ed 100644 --- a/wled00/ntp.cpp +++ b/wled00/ntp.cpp @@ -399,7 +399,6 @@ void checkTimers() && isTodayInDateRange(((timerMonth[i] >> 4) & 0x0F), timerDay[i], timerMonth[i] & 0x0F, timerDayEnd[i]) ) { - unloadPlaylist(); applyPreset(timerMacro[i]); } } @@ -413,7 +412,6 @@ void checkTimers() && (timerWeekday[8] & 0x01) //timer is enabled && ((timerWeekday[8] >> weekdayMondayFirst()) & 0x01)) //timer should activate at current day of week { - unloadPlaylist(); applyPreset(timerMacro[8]); DEBUG_PRINTF_P(PSTR("Sunrise macro %d triggered."),timerMacro[8]); } @@ -428,7 +426,6 @@ void checkTimers() && (timerWeekday[9] & 0x01) //timer is enabled && ((timerWeekday[9] >> weekdayMondayFirst()) & 0x01)) //timer should activate at current day of week { - unloadPlaylist(); applyPreset(timerMacro[9]); DEBUG_PRINTF_P(PSTR("Sunset macro %d triggered."),timerMacro[9]); } diff --git a/wled00/presets.cpp b/wled00/presets.cpp index 7fbe49eb8..6efe3bb31 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -119,6 +119,7 @@ void initPresetsFile() bool applyPreset(byte index, byte callMode) { + unloadPlaylist(); // applying a preset unloads the playlist (#3827) DEBUG_PRINT(F("Request to apply preset: ")); DEBUG_PRINTLN(index); presetToApply = index; diff --git a/wled00/remote.cpp b/wled00/remote.cpp index 49fbc4b02..54cdf31f6 100644 --- a/wled00/remote.cpp +++ b/wled00/remote.cpp @@ -108,7 +108,6 @@ static void setOff() { void presetWithFallback(uint8_t presetID, uint8_t effectID, uint8_t paletteID) { resetNightMode(); - unloadPlaylist(); applyPresetWithFallback(presetID, CALL_MODE_BUTTON_PRESET, effectID, paletteID); } diff --git a/wled00/set.cpp b/wled00/set.cpp index 4e2e60b3d..6e7064bb3 100755 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -883,7 +883,6 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) //apply preset if (updateVal(req.c_str(), "PL=", &presetCycCurr, presetCycMin, presetCycMax)) { - unloadPlaylist(); applyPreset(presetCycCurr); } From 7a9eff7f35a51ceb0cae3f80fa0491e3497e7dc7 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 18 Mar 2024 20:23:30 +0100 Subject: [PATCH 082/114] Fix. --- wled00/FX_fcn.cpp | 1 - wled00/bus_manager.cpp | 9 +++++++++ wled00/bus_manager.h | 5 ----- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index edd3a068d..3566755f0 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -538,7 +538,6 @@ bool Segment::setColor(uint8_t slot, uint32_t c) { //returns true if changed } void Segment::setCCT(uint16_t k) { - if (!isCCT() || !correctWB) return; if (k > 255) { //kelvin value, convert to 0-255 if (k < 1900) k = 1900; if (k > 10091) k = 10091; diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index a9c3ac44d..eeb9a15e4 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -441,10 +441,19 @@ void BusPwm::setPixelColor(uint16_t pix, uint32_t c) { _data[0] = w; break; case TYPE_ANALOG_2CH: //warm white + cold white + #ifdef WLED_USE_IC_CCT + _data[0] = w; + _data[1] = cct; + #else Bus::calculateCCT(c, _data[0], _data[1]); + #endif break; case TYPE_ANALOG_5CH: //RGB + warm white + cold white + #ifdef WLED_USE_IC_CCT + _data[4] = cct; + #else Bus::calculateCCT(c, w, _data[4]); + #endif case TYPE_ANALOG_4CH: //RGBW _data[3] = w; case TYPE_ANALOG_3CH: //standard dumb RGB diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index 233c2a668..d4facb33b 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -194,10 +194,6 @@ class Bus { cct = (approximateKelvinFromRGB(c) - 1900) >> 5; } - #ifdef WLED_USE_IC_CCT - ww = w; - cw = cct; - #else //0 - linear (CCT 127 = 50% warm, 50% cold), 127 - additive CCT blending (CCT 127 = 100% warm, 100% cold) if (cct < _cctBlend) ww = 255; else ww = ((255-cct) * 255) / (255 - _cctBlend); @@ -206,7 +202,6 @@ class Bus { ww = (w * ww) / 255; //brightness scaling cw = (w * cw) / 255; - #endif } inline void setAutoWhiteMode(uint8_t m) { if (m < 5) _autoWhiteMode = m; } inline uint8_t getAutoWhiteMode() { return _autoWhiteMode; } From 62f845a94e7f84b1e2525c18ac3c9f5c0ae63010 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Mon, 18 Mar 2024 19:46:33 -0400 Subject: [PATCH 083/114] DDP: Support sources that don't push If the source never sends the push flag, WLED buffers the update but never publishes it to the LEDs. This causes the confusing case where the peek display shows one thing but the LEDs themselves something else. Add a static flag that tracks if we've seen a push from the source; until we do, apply every update as soon as it's received, per the DDP specification. --- wled00/e131.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index ec2efb50e..a67a672c2 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -11,6 +11,7 @@ //DDP protocol support, called by handleE131Packet //handles RGB data only void handleDDPPacket(e131_packet_t* p) { + static bool ddpSeenPush = false; // have we seen a push yet? int lastPushSeq = e131LastSequenceNumber[0]; //reject late packets belonging to previous frame (assuming 4 packets max. before push) @@ -34,6 +35,7 @@ void handleDDPPacket(e131_packet_t* p) { uint16_t c = 0; if (p->flags & DDP_TIMECODE_FLAG) c = 4; //packet has timecode flag, we do not support it, but data starts 4 bytes later + if (realtimeMode != REALTIME_MODE_DDP) ddpSeenPush = false; // just starting, no push yet realtimeLock(realtimeTimeoutMs, REALTIME_MODE_DDP); if (!realtimeOverride || (realtimeMode && useMainSegmentOnly)) { @@ -44,7 +46,8 @@ void handleDDPPacket(e131_packet_t* p) { } bool push = p->flags & DDP_PUSH_FLAG; - if (push) { + ddpSeenPush |= push; + if (!ddpSeenPush || push) { // if we've never seen a push, or this is one, render display e131NewData = true; byte sn = p->sequenceNum & 0xF; if (sn) e131LastSequenceNumber[0] = sn; From 505d319e01368b9ea0fd80926fdbbfedd5b43612 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Mon, 18 Mar 2024 19:49:56 -0400 Subject: [PATCH 084/114] Fix avgLoopMillis --- wled00/wled.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index fc16dabcc..07304e77a 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -269,6 +269,7 @@ void WLED::loop() maxLoopMillis = 0; maxUsermodMillis = 0; maxStripMillis = 0; + avgLoopMillis = 0; avgUsermodMillis = 0; avgStripMillis = 0; debugTime = millis(); From 5d3f22e06a2dfe248099978f7c611f249f63b8fd Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Tue, 19 Mar 2024 15:18:17 +0100 Subject: [PATCH 085/114] Changelog update and build bump. --- CHANGELOG.md | 13 ++++++++++++- wled00/wled.h | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ba1c987a..5a9a60dac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,18 @@ ## WLED changelog +#### Build 2403190 +- limit max PWM frequency (fix incorrect PWM resolution) +- Segment UI bugfix +- Updated AsyncWebServer (by @wlillmmiles) +- Simpler boot preset (fix for #3806) +- Effect: Fix for 2D Drift animation (#3816 by @BaptisteHudyma) +- Effect: Add twin option to 2D Drift +- MQTT cleanup +- DDP: Support sources that don't push (#3833 by @willmmiles) +- Usermod: Tetris AI usermod (#3711 by @muebau) + #### Build 2403171 -- merge 0.14.2 changes +- merge 0.14.2 changes into 0.15 #### Build 2403070 - Add additional segment options when controlling over e1.31 (#3616 by @demophoon) diff --git a/wled00/wled.h b/wled00/wled.h index 4eb6c8e17..36cd40164 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2403171 +#define VERSION 2403190 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG From e3271b8082e6fa776c659e22f1f2987011cf48b8 Mon Sep 17 00:00:00 2001 From: Woody Date: Tue, 19 Mar 2024 18:15:18 +0100 Subject: [PATCH 086/114] Change path for ESP02-binary --- .github/workflows/wled-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wled-ci.yml b/.github/workflows/wled-ci.yml index f9ffb6481..f9721fb27 100644 --- a/.github/workflows/wled-ci.yml +++ b/.github/workflows/wled-ci.yml @@ -61,7 +61,7 @@ jobs: name: firmware-${{ matrix.environment }} path: | build_output/release/*.bin - build_output/release/*_ESP02.bin.gz + build_output/release_gz/*_ESP02.bin.gz release: name: Create Release runs-on: ubuntu-latest From 7ee4b54154cdb21e4d066fd22af8a02b553898f3 Mon Sep 17 00:00:00 2001 From: Woody Date: Tue, 19 Mar 2024 20:06:09 +0100 Subject: [PATCH 087/114] optimize output_bins.py --- pio-scripts/output_bins.py | 55 +++++++++----------------------------- 1 file changed, 13 insertions(+), 42 deletions(-) diff --git a/pio-scripts/output_bins.py b/pio-scripts/output_bins.py index cfedacead..092754c38 100644 --- a/pio-scripts/output_bins.py +++ b/pio-scripts/output_bins.py @@ -3,7 +3,7 @@ import os import shutil import gzip -OUTPUT_DIR = "build_output{}".format(os.path.sep) +OUTPUT_DIR = os.path.join("build_output") def _get_cpp_define_value(env, define): define_list = [item[-1] for item in env["CPPDEFINES"] if item[0] == define] @@ -13,27 +13,20 @@ def _get_cpp_define_value(env, define): return None -def _create_dirs(dirs=["firmware", "map"]): - # check if output directories exist and create if necessary - if not os.path.isdir(OUTPUT_DIR): - os.mkdir(OUTPUT_DIR) - +def _create_dirs(dirs=["map", "release", "release_gz"]): for d in dirs: - if not os.path.isdir("{}{}".format(OUTPUT_DIR, d)): - os.mkdir("{}{}".format(OUTPUT_DIR, d)) + os.makedirs(os.path.join(OUTPUT_DIR, d), exist_ok=True) def create_release(source): release_name = _get_cpp_define_value(env, "WLED_RELEASE_NAME") - # get file extension of source file (.bin or .bin.gz) - ext = source.split(".", 1)[1] if release_name: - folder = "release" - if ext == "bin.gz": - folder = "release_gz" - _create_dirs([folder]) version = _get_cpp_define_value(env, "WLED_VERSION") - release_file = "{}{}{}WLED_{}_{}.{}".format(OUTPUT_DIR, folder, os.path.sep, version, release_name, ext) + release_file = os.path.join(OUTPUT_DIR, "release", f"WLED_{version}_{release_name}.bin") + release_gz_file = os.path.join(OUTPUT_DIR, "release_gz", f"WLED_{version}_{release_name}.bin.gz") + print(f"Copying {source} to {release_file}") shutil.copy(source, release_file) + print(f"Creating gzip file {release_gz_file} from {release_file}") + bin_gzip(release_file, release_gz_file) def bin_rename_copy(source, target, env): _create_dirs() @@ -41,38 +34,16 @@ def bin_rename_copy(source, target, env): # create string with location and file names based on variant map_file = "{}map{}{}.map".format(OUTPUT_DIR, os.path.sep, variant) - bin_file = "{}firmware{}{}.bin".format(OUTPUT_DIR, os.path.sep, variant) - # check if new target files exist and remove if necessary - for f in [map_file, bin_file]: - if os.path.isfile(f): - os.remove(f) - - # copy firmware.bin to firmware/.bin - shutil.copy(str(target[0]), bin_file) - - create_release(bin_file) + create_release(str(target[0])) # copy firmware.map to map/.map if os.path.isfile("firmware.map"): shutil.move("firmware.map", map_file) -def bin_gzip(source, target, env): - _create_dirs() - variant = env["PIOENV"] - - # create string with location and file names based on variant - bin_file = "{}firmware{}{}.bin".format(OUTPUT_DIR, os.path.sep, variant) - gzip_file = "{}firmware{}{}.bin.gz".format(OUTPUT_DIR, os.path.sep, variant) - - # check if new target files exist and remove if necessary - if os.path.isfile(gzip_file): os.remove(gzip_file) - - # write gzip firmware file - with open(bin_file,"rb") as fp: - with gzip.open(gzip_file, "wb", compresslevel = 9) as f: +def bin_gzip(source, target): + with open(source,"rb") as fp: + with gzip.open(target, "wb", compresslevel = 9) as f: shutil.copyfileobj(fp, f) - create_release(gzip_file) - -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_rename_copy, bin_gzip]) +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", bin_rename_copy) From 6d1b9ffad276aa0269fc482ffadb85a529b237f5 Mon Sep 17 00:00:00 2001 From: thatdonfc Date: Tue, 19 Mar 2024 14:04:09 -0700 Subject: [PATCH 088/114] Add SSD1309_64 I2C Support to FDL Usermod --- .../usermod_v2_four_line_display_ALT.h | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display_ALT.h b/usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display_ALT.h index 82a5e1a81..75aa90cfe 100644 --- a/usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display_ALT.h +++ b/usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display_ALT.h @@ -17,7 +17,7 @@ // for WLED. // // Dependencies -// * This Usermod works best, by far, when coupled +// * This Usermod works best, by far, when coupled // with RotaryEncoderUI ALT Usermod. // // Make sure to enable NTP and set your time zone in WLED Config | Time. @@ -87,6 +87,7 @@ typedef enum { SSD1306_64, // U8X8_SSD1306_128X64_NONAME_HW_I2C SSD1305, // U8X8_SSD1305_128X32_ADAFRUIT_HW_I2C SSD1305_64, // U8X8_SSD1305_128X64_ADAFRUIT_HW_I2C + SSD1309_64, // U8X8_SSD1309_128X64_NONAME0_HW_I2C SSD1306_SPI, // U8X8_SSD1306_128X32_NONAME_HW_SPI SSD1306_SPI64, // U8X8_SSD1306_128X64_NONAME_HW_SPI SSD1309_SPI64 // U8X8_SSD1309_128X64_NONAME0_4W_HW_SPI @@ -235,7 +236,7 @@ class FourLineDisplayUsermod : public Usermod { void updateSpeed(); void updateIntensity(); void drawStatusIcons(); - + /** * marks the position of the arrow showing * the current setting being changed @@ -246,8 +247,8 @@ class FourLineDisplayUsermod : public Usermod { //Draw the arrow for the current setting being changed void drawArrow(); - //Display the current effect or palette (desiredEntry) - // on the appropriate line (row). + //Display the current effect or palette (desiredEntry) + // on the appropriate line (row). void showCurrentEffectOrPalette(int inputEffPal, const char *qstring, uint8_t row); /** @@ -314,14 +315,14 @@ class FourLineDisplayUsermod : public Usermod { * addToConfig() can be used to add custom persistent settings to the cfg.json file in the "um" (usermod) object. * It will be called by WLED when settings are actually saved (for example, LED settings are saved) * If you want to force saving the current state, use serializeConfig() in your loop(). - * + * * CAUTION: serializeConfig() will initiate a filesystem write operation. * It might cause the LEDs to stutter and will cause flash wear if called too often. * Use it sparingly and always in the loop, never in network callbacks! - * + * * addToConfig() will also not yet add your setting to one of the settings pages automatically. * To make that work you still have to add the setting to the HTML, xml.cpp and set.cpp manually. - * + * * I highly recommend checking out the basics of ArduinoJson serialization and deserialization in order to use custom settings! */ void addToConfig(JsonObject& root) override; @@ -329,7 +330,7 @@ class FourLineDisplayUsermod : public Usermod { /* * readFromConfig() can be used to read back the custom settings you added with addToConfig(). * This is called by WLED when settings are loaded (currently this only happens once immediately after boot) - * + * * readFromConfig() is called BEFORE setup(). This means you can use your persistent values in setup() (e.g. pin assignments, buffer sizes), * but also that if you want to write persistent values to a dynamic buffer, you'd need to allocate it here instead of in setup. * If you don't know what that is, don't fret. It most likely doesn't affect your use case :) @@ -494,7 +495,7 @@ void FourLineDisplayUsermod::showTime() { } if (knownHour != hourCurrent) { // only update date when hour changes - sprintf_P(lineBuffer, PSTR("%s %2d "), monthShortStr(month(localTime)), day(localTime)); + sprintf_P(lineBuffer, PSTR("%s %2d "), monthShortStr(month(localTime)), day(localTime)); draw2x2String(2, lineHeight==1 ? 0 : lineHeight, lineBuffer); // adjust for 8 line displays, draw month and day } sprintf_P(lineBuffer,PSTR("%2d:%02d"), (useAMPM ? AmPmHour : hourCurrent), minuteCurrent); @@ -556,6 +557,7 @@ void FourLineDisplayUsermod::setup() { case SSD1306_64: u8x8 = (U8X8 *) new U8X8_SSD1306_128X64_NONAME_HW_I2C(); break; case SSD1305: u8x8 = (U8X8 *) new U8X8_SSD1305_128X32_ADAFRUIT_HW_I2C(); break; case SSD1305_64: u8x8 = (U8X8 *) new U8X8_SSD1305_128X64_ADAFRUIT_HW_I2C(); break; + case SSD1309_64: u8x8 = (U8X8 *) new U8X8_SSD1309_128X64_NONAME0_HW_I2C(); break; // U8X8 uses global SPI variable that is attached to VSPI bus on ESP32 case SSD1306_SPI: u8x8 = (U8X8 *) new U8X8_SSD1306_128X32_UNIVISION_4W_HW_SPI(ioPin[0], ioPin[1], ioPin[2]); break; // Pins are cs, dc, reset case SSD1306_SPI64: u8x8 = (U8X8 *) new U8X8_SSD1306_128X64_NONAME_4W_HW_SPI(ioPin[0], ioPin[1], ioPin[2]); break; // Pins are cs, dc, reset @@ -581,7 +583,7 @@ void FourLineDisplayUsermod::setup() { // gets called every time WiFi is (re-)connected. Initialize own network // interfaces here void FourLineDisplayUsermod::connected() { - knownSsid = WiFi.SSID(); //apActive ? apSSID : WiFi.SSID(); //apActive ? WiFi.softAPSSID() : + knownSsid = WiFi.SSID(); //apActive ? apSSID : WiFi.SSID(); //apActive ? WiFi.softAPSSID() : knownIp = Network.localIP(); //apActive ? IPAddress(4, 3, 2, 1) : Network.localIP(); networkOverlay(PSTR("NETWORK INFO"),7000); } @@ -637,7 +639,7 @@ void FourLineDisplayUsermod::redraw(bool forceRedraw) { powerON = !powerON; drawStatusIcons(); return; - } else if (knownnightlight != nightlightActive) { //trigger moon icon + } else if (knownnightlight != nightlightActive) { //trigger moon icon knownnightlight = nightlightActive; drawStatusIcons(); if (knownnightlight) { @@ -652,7 +654,7 @@ void FourLineDisplayUsermod::redraw(bool forceRedraw) { return; } else if (knownMode != effectCurrent || knownPalette != effectPalette) { if (displayTurnedOff) needRedraw = true; - else { + else { if (knownPalette != effectPalette) { showCurrentEffectOrPalette(effectPalette, JSON_palette_names, 2); knownPalette = effectPalette; } if (knownMode != effectCurrent) { showCurrentEffectOrPalette(effectCurrent, JSON_mode_names, 3); knownMode = effectCurrent; } lastRedraw = now; @@ -703,7 +705,7 @@ void FourLineDisplayUsermod::redraw(bool forceRedraw) { drawArrow(); drawStatusIcons(); - // Second row + // Second row updateBrightness(); updateSpeed(); updateIntensity(); @@ -805,8 +807,8 @@ void FourLineDisplayUsermod::drawArrow() { lockRedraw = false; } -//Display the current effect or palette (desiredEntry) -// on the appropriate line (row). +//Display the current effect or palette (desiredEntry) +// on the appropriate line (row). void FourLineDisplayUsermod::showCurrentEffectOrPalette(int inputEffPal, const char *qstring, uint8_t row) { #if defined(ARDUINO_ARCH_ESP32) && defined(FLD_ESP32_USE_THREADS) unsigned long now = millis(); @@ -857,7 +859,7 @@ void FourLineDisplayUsermod::showCurrentEffectOrPalette(int inputEffPal, const c while (smallChars1 < (MAX_MODE_LINE_SPACE-1)) smallBuffer1[smallChars1++]=' '; smallBuffer1[smallChars1] = 0; drawString(1, row*lineHeight, smallBuffer1, true); - while (smallChars2 < (MAX_MODE_LINE_SPACE-1)) smallBuffer2[smallChars2++]=' '; + while (smallChars2 < (MAX_MODE_LINE_SPACE-1)) smallBuffer2[smallChars2++]=' '; smallBuffer2[smallChars2] = 0; drawString(1, row*lineHeight+1, smallBuffer2, true); } @@ -1150,7 +1152,7 @@ void FourLineDisplayUsermod::onUpdateBegin(bool init) { xTaskCreatePinnedToCore( [](void * par) { // Function to implement the task // see https://www.freertos.org/vtaskdelayuntil.html - const TickType_t xFrequency = REFRESH_RATE_MS * portTICK_PERIOD_MS / 2; + const TickType_t xFrequency = REFRESH_RATE_MS * portTICK_PERIOD_MS / 2; TickType_t xLastWakeTime = xTaskGetTickCount(); for(;;) { delay(1); // DO NOT DELETE THIS LINE! It is needed to give the IDLE(0) task enough time and to keep the watchdog happy. @@ -1205,9 +1207,10 @@ void FourLineDisplayUsermod::appendConfigData() { oappend(SET_F("addOption(dd,'SSD1306 128x64',3);")); oappend(SET_F("addOption(dd,'SSD1305',4);")); oappend(SET_F("addOption(dd,'SSD1305 128x64',5);")); - oappend(SET_F("addOption(dd,'SSD1306 SPI',6);")); - oappend(SET_F("addOption(dd,'SSD1306 SPI 128x64',7);")); - oappend(SET_F("addOption(dd,'SSD1309 SPI 128x64',8);")); + oappend(SET_F("addOption(dd,'SSD1309 128x64',6);")); + oappend(SET_F("addOption(dd,'SSD1306 SPI',7);")); + oappend(SET_F("addOption(dd,'SSD1306 SPI 128x64',8);")); + oappend(SET_F("addOption(dd,'SSD1309 SPI 128x64',9);")); oappend(SET_F("addInfo('4LineDisplay:type',1,'
Change may require reboot','');")); oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'','SPI CS');")); oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'','SPI DC');")); @@ -1218,14 +1221,14 @@ void FourLineDisplayUsermod::appendConfigData() { * addToConfig() can be used to add custom persistent settings to the cfg.json file in the "um" (usermod) object. * It will be called by WLED when settings are actually saved (for example, LED settings are saved) * If you want to force saving the current state, use serializeConfig() in your loop(). - * + * * CAUTION: serializeConfig() will initiate a filesystem write operation. * It might cause the LEDs to stutter and will cause flash wear if called too often. * Use it sparingly and always in the loop, never in network callbacks! - * + * * addToConfig() will also not yet add your setting to one of the settings pages automatically. * To make that work you still have to add the setting to the HTML, xml.cpp and set.cpp manually. - * + * * I highly recommend checking out the basics of ArduinoJson serialization and deserialization in order to use custom settings! */ void FourLineDisplayUsermod::addToConfig(JsonObject& root) { @@ -1252,7 +1255,7 @@ void FourLineDisplayUsermod::addToConfig(JsonObject& root) { /* * readFromConfig() can be used to read back the custom settings you added with addToConfig(). * This is called by WLED when settings are loaded (currently this only happens once immediately after boot) - * + * * readFromConfig() is called BEFORE setup(). This means you can use your persistent values in setup() (e.g. pin assignments, buffer sizes), * but also that if you want to write persistent values to a dynamic buffer, you'd need to allocate it here instead of in setup. * If you don't know what that is, don't fret. It most likely doesn't affect your use case :) @@ -1346,6 +1349,10 @@ bool FourLineDisplayUsermod::readFromConfig(JsonObject& root) { u8x8_Setup(u8x8->getU8x8(), u8x8_d_ssd1305_128x64_adafruit, u8x8_cad_ssd13xx_fast_i2c, u8x8_byte_arduino_hw_i2c, u8x8_gpio_and_delay_arduino); u8x8_SetPin_HW_I2C(u8x8->getU8x8(), U8X8_PIN_NONE, U8X8_PIN_NONE, U8X8_PIN_NONE); break; + case SSD1309_64: + u8x8_Setup(u8x8->getU8x8(), u8x8_d_ssd1309_128x64_noname0, u8x8_cad_ssd13xx_fast_i2c, u8x8_byte_arduino_hw_i2c, u8x8_gpio_and_delay_arduino); + u8x8_SetPin_HW_I2C(u8x8->getU8x8(), U8X8_PIN_NONE, U8X8_PIN_NONE, U8X8_PIN_NONE); + break; case SSD1306_SPI: u8x8_Setup(u8x8->getU8x8(), u8x8_d_ssd1306_128x32_univision, u8x8_cad_001, u8x8_byte_arduino_hw_spi, u8x8_gpio_and_delay_arduino); u8x8_SetPin_4Wire_HW_SPI(u8x8->getU8x8(), ioPin[0], ioPin[1], ioPin[2]); // Pins are cs, dc, reset From ecee073e080e36b281836533b3997e5bacd37244 Mon Sep 17 00:00:00 2001 From: thatdonfc Date: Tue, 19 Mar 2024 14:04:24 -0700 Subject: [PATCH 089/114] Fix palette names when palette ID > 58 and not custom --- wled00/util.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/util.cpp b/wled00/util.cpp index fa6c8faff..1bd8ec319 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -265,8 +265,8 @@ uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLe } else return 0; } - if (src == JSON_palette_names && mode > GRADIENT_PALETTE_COUNT) { - snprintf_P(dest, maxLen, PSTR("~ Custom %d~"), 255-mode); + if (src == JSON_palette_names && mode > (GRADIENT_PALETTE_COUNT + 13)) { + snprintf_P(dest, maxLen, PSTR("~ Custom %d ~"), 255-mode); dest[maxLen-1] = '\0'; return strlen(dest); } From 92ebeddcb0761c9279d8fb97f58b2730f8bdd89b Mon Sep 17 00:00:00 2001 From: thatdonfc Date: Tue, 19 Mar 2024 14:48:04 -0700 Subject: [PATCH 090/114] Update Readme for Four Line Display Usermod --- .../readme.md | 63 ++++++++++++++----- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/usermods/usermod_v2_four_line_display_ALT/readme.md b/usermods/usermod_v2_four_line_display_ALT/readme.md index ea9f43610..35a55a88f 100644 --- a/usermods/usermod_v2_four_line_display_ALT/readme.md +++ b/usermods/usermod_v2_four_line_display_ALT/readme.md @@ -1,4 +1,4 @@ -# I2C 4 Line Display Usermod ALT +# I2C/SPI 4 Line Display Usermod ALT Thank you to the authors of the original version of these usermods. It would not have been possible without them! "usermod_v2_four_line_display" @@ -8,21 +8,20 @@ The core of these usermods are a copy of the originals. The main changes are to The display usermod UI has been completely changed. -The changes made to the RotaryEncoder usermod were made to support the new UI in the display usermod. -Without the display it, functions identical to the original. +The changes made to the RotaryEncoder usermod were made to support the new UI in the display usermod. +Without the display, it functions identical to the original. The original "usermod_v2_auto_save" will not work with the display just yet. Press the encoder to cycle through the options: - *Brightness - *Speed - *Intensity - *Palette - *Effect - *Main Color (only if display is used) - *Saturation (only if display is used) +* Brightness +* Speed +* Intensity +* Palette +* Effect +* Main Color (only if display is used) +* Saturation (only if display is used) -Press and hold the encoder to display Network Info - if AP is active, it will display AP, SSID and password +Press and hold the encoder to display Network Info. If AP is active, it will display AP, SSID and password Also shows if the timer is enabled @@ -30,11 +29,47 @@ Also shows if the timer is enabled ## Installation -Please refer to the original `usermod_v2_rotary_encoder_ui` readme for the main instructions -Then to activate this alternative usermod add `#define USE_ALT_DISPlAY` to the `usermods_list.cpp` file, +Please refer to the original `usermod_v2_rotary_encoder_ui` readme for the main instructions. + +Copy the example `platformio_override.sample.ini` from the usermod_v2_rotary_encoder_ui_ALT folder to the root directory of your particular build and rename it to `platformio_override.ini`. + +This file should be placed in the same directory as `platformio.ini`. + +Then, to activate this alternative usermod, add `#define USE_ALT_DISPlAY` (NOTE: CASE SENSITIVE) to the `usermods_list.cpp` file, or add `-D USE_ALT_DISPlAY` to the original `platformio_override.ini.sample` file +## Configuration + +These options are configurable in Config > Usermods + +### Usermod Setup + +* Global I2C GPIOs (HW) - Set the SDA and SCL pins + +### 4LineDisplay + +* `enabled` - enable/disable usermod +* `type` - display type in numeric format + * 1 = I2C SSD1306 128x32 + * 2 = I2C SH1106 128x32 + * 3 = I2C SSD1306 128x64 (4 double-height lines) + * 4 = I2C SSD1305 128x32 + * 5 = I2C SSD1305 128x64 (4 double-height lines) + * 6 = I2C SSD1309 128x64 (4 double-height lines) + * 7 = SPI SSD1306 128x32 + * 8 = SPI SSD1306 128x64 (4 double-height lines) + * 9 = SPI SSD1309 128x64 (4 double-height lines) +* `pin` - GPIO pins used for display; SPI displays can use SCK, MOSI, CS, DC & RST +* `flip` - flip/rotate display 180° +* `contrast` - set display contrast (higher contrast may reduce display lifetime) +* `screenTimeOutSec` - screen saver time-out in seconds +* `sleepMode` - enable/disable screen saver +* `clockMode` - enable/disable clock display in screen saver mode +* `showSeconds` - Show seconds on the clock display +* `i2c-freq-kHz` - I2C clock frequency in kHz (may help reduce dropped frames, range: 400-3400) + + ### PlatformIO requirements Note: the Four Line Display usermod requires the libraries `U8g2` and `Wire`. From 2dafa9644ffaf48e62d89b2ef6e3cf5b674e1006 Mon Sep 17 00:00:00 2001 From: thatdonfc Date: Tue, 19 Mar 2024 14:48:51 -0700 Subject: [PATCH 091/114] Update Readme for Rotary Encoder Usermod Add example platformio_override.sample.ini --- .../platformio–override.sample.ini | 17 +++++++++ .../readme.md | 35 +++++++++++++------ 2 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 usermods/usermod_v2_rotary_encoder_ui_ALT/platformio–override.sample.ini diff --git a/usermods/usermod_v2_rotary_encoder_ui_ALT/platformio–override.sample.ini b/usermods/usermod_v2_rotary_encoder_ui_ALT/platformio–override.sample.ini new file mode 100644 index 000000000..6b32c71fb --- /dev/null +++ b/usermods/usermod_v2_rotary_encoder_ui_ALT/platformio–override.sample.ini @@ -0,0 +1,17 @@ +[platformio] +default_envs = esp32dev + +[env:esp32dev] +board = esp32dev +platform = ${esp32.platform} +build_unflags = ${common.build_unflags} +build_flags = + ${common.build_flags_esp32} + -D USERMOD_FOUR_LINE_DISPLAY -D USE_ALT_DISPlAY + -D USERMOD_ROTARY_ENCODER_UI -D ENCODER_DT_PIN=18 -D ENCODER_CLK_PIN=5 -D ENCODER_SW_PIN=19 +upload_speed = 460800 +lib_deps = + ${esp32.lib_deps} + U8g2@~2.34.4 + Wire + diff --git a/usermods/usermod_v2_rotary_encoder_ui_ALT/readme.md b/usermods/usermod_v2_rotary_encoder_ui_ALT/readme.md index 516362380..10db879fb 100644 --- a/usermods/usermod_v2_rotary_encoder_ui_ALT/readme.md +++ b/usermods/usermod_v2_rotary_encoder_ui_ALT/readme.md @@ -8,18 +8,18 @@ The core of these usermods are a copy of the originals. The main changes are to The display usermod UI has been completely changed. -The changes made to the RotaryEncoder usermod were made to support the new UI in the display usermod. +The changes made to the RotaryEncoder usermod were made to support the new UI in the display usermod. Without the display, it functions identical to the original. The original "usermod_v2_auto_save" will not work with the display just yet. Press the encoder to cycle through the options: - *Brightness - *Speed - *Intensity - *Palette - *Effect - *Main Color (only if display is used) - *Saturation (only if display is used) +* Brightness +* Speed +* Intensity +* Palette +* Effect +* Main Color (only if display is used) +* Saturation (only if display is used) Press and hold the encoder to display Network Info if AP is active, it will display the AP, SSID and Password @@ -30,10 +30,23 @@ Also shows if the timer is enabled. ## Installation -Please refer to the original `usermod_v2_rotary_encoder_ui` readme for the main instructions.
-To activate this alternative usermod, add `#define USE_ALT_DISPlAY` to the `usermods_list.cpp` file, -or add `-D USE_ALT_DISPlAY` to the original `platformio_override.ini.sample` file. +Copy the example `platformio_override.sample.ini` to the root directory of your particular build and rename it to `platformio_override.ini`. +To activate this alternative usermod, add `#define USE_ALT_DISPlAY` (NOTE: CASE SENSITIVE) to the `usermods_list.cpp` file, or add `-D USE_ALT_DISPlAY` to your `platformio_override.ini` file + +### Define Your Options + +* `USERMOD_ROTARY_ENCODER_UI` - define this to have this user mod included wled00\usermods_list.cpp +* `USERMOD_FOUR_LINE_DISPLAY` - define this to have this the Four Line Display mod included wled00\usermods_list.cpp + also tells this usermod that the display is available + (see the Four Line Display usermod `readme.md` for more details) +* `USE_ALT_DISPlAY` - Mandatory to use Four Line Display +* `ENCODER_DT_PIN` - defaults to 18 +* `ENCODER_CLK_PIN` - defaults to 5 +* `ENCODER_SW_PIN` - defaults to 19 +* `USERMOD_ROTARY_ENCODER_GPIO` - GPIO functionality: + `INPUT_PULLUP` to use internal pull-up + `INPUT` to use pull-up on the PCB ### PlatformIO requirements From 2640203c88d0d68eb9848eab5509e35cdd309ca4 Mon Sep 17 00:00:00 2001 From: Will Miles Date: Tue, 19 Mar 2024 23:46:55 -0400 Subject: [PATCH 092/114] wled_server: Remove local content type variables Use the CONTENT_TYPEs exported by AsyncWebServer directly. --- wled00/wled_server.cpp | 55 +++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index fca932972..d184e9878 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -18,11 +18,6 @@ static const char s_unlock_ota [] PROGMEM = "Please unlock OTA in security setti static const char s_unlock_cfg [] PROGMEM = "Please unlock settings using PIN code!"; static const char s_notimplemented[] PROGMEM = "Not implemented"; static const char s_accessdenied[] PROGMEM = "Access Denied"; -static const char* s_javascript = CONTENT_TYPE_JAVASCRIPT; -static const char* s_json = CONTENT_TYPE_JSON; -static const char* s_html = CONTENT_TYPE_HTML; -static const char* s_plain = CONTENT_TYPE_PLAIN; -static const char* s_css = CONTENT_TYPE_CSS; //Is this an IP? static bool isIp(String str) { @@ -158,7 +153,7 @@ static String msgProcessor(const String& var) static void handleUpload(AsyncWebServerRequest *request, const String& filename, size_t index, uint8_t *data, size_t len, bool final) { if (!correctPIN) { - if (final) request->send(401, FPSTR(s_plain), FPSTR(s_unlock_cfg)); + if (final) request->send(401, FPSTR(CONTENT_TYPE_PLAIN), FPSTR(s_unlock_cfg)); return; } if (!index) { @@ -179,10 +174,10 @@ static void handleUpload(AsyncWebServerRequest *request, const String& filename, request->_tempFile.close(); if (filename.indexOf(F("cfg.json")) >= 0) { // check for filename with or without slash doReboot = true; - request->send(200, FPSTR(s_plain), F("Configuration restore successful.\nRebooting...")); + request->send(200, FPSTR(CONTENT_TYPE_PLAIN), F("Configuration restore successful.\nRebooting...")); } else { if (filename.indexOf(F("palette")) >= 0 && filename.indexOf(F(".json")) >= 0) strip.loadCustomPalettes(); - request->send(200, FPSTR(s_plain), F("File Uploaded!")); + request->send(200, FPSTR(CONTENT_TYPE_PLAIN), F("File Uploaded!")); } cacheInvalidate++; } @@ -235,12 +230,12 @@ void initServer() #ifdef WLED_ENABLE_WEBSOCKETS #ifndef WLED_DISABLE_2D server.on(F("/liveview2D"), HTTP_GET, [](AsyncWebServerRequest *request) { - handleStaticContent(request, "", 200, FPSTR(s_html), PAGE_liveviewws2D, PAGE_liveviewws2D_length); + handleStaticContent(request, "", 200, FPSTR(CONTENT_TYPE_HTML), PAGE_liveviewws2D, PAGE_liveviewws2D_length); }); #endif #endif server.on(F("/liveview"), HTTP_GET, [](AsyncWebServerRequest *request) { - handleStaticContent(request, "", 200, FPSTR(s_html), PAGE_liveview, PAGE_liveview_length); + handleStaticContent(request, "", 200, FPSTR(CONTENT_TYPE_HTML), PAGE_liveview, PAGE_liveview_length); }); //settings page @@ -251,7 +246,7 @@ void initServer() // "/settings/settings.js&p=x" request also handled by serveSettings() static const char _style_css[] PROGMEM = "/style.css"; server.on(_style_css, HTTP_GET, [](AsyncWebServerRequest *request) { - handleStaticContent(request, FPSTR(_style_css), 200, FPSTR(s_css), PAGE_settingsCss, PAGE_settingsCss_length); + handleStaticContent(request, FPSTR(_style_css), 200, FPSTR(CONTENT_TYPE_CSS), PAGE_settingsCss, PAGE_settingsCss_length); }); static const char _favicon_ico[] PROGMEM = "/favicon.ico"; @@ -262,7 +257,7 @@ void initServer() static const char _skin_css[] PROGMEM = "/skin.css"; server.on(_skin_css, HTTP_GET, [](AsyncWebServerRequest *request) { if (handleFileRead(request, FPSTR(_skin_css))) return; - AsyncWebServerResponse *response = request->beginResponse(200, FPSTR(s_css)); + AsyncWebServerResponse *response = request->beginResponse(200, FPSTR(CONTENT_TYPE_CSS)); request->send(response); }); @@ -332,25 +327,25 @@ void initServer() doSerializeConfig = true; //serializeConfig(); //Save new settings to FS } } - request->send(200, s_json, F("{\"success\":true}")); + request->send(200, CONTENT_TYPE_JSON, F("{\"success\":true}")); }, JSON_BUFFER_SIZE); server.addHandler(handler); server.on(F("/version"), HTTP_GET, [](AsyncWebServerRequest *request){ - request->send(200, FPSTR(s_plain), (String)VERSION); + request->send(200, FPSTR(CONTENT_TYPE_PLAIN), (String)VERSION); }); server.on(F("/uptime"), HTTP_GET, [](AsyncWebServerRequest *request){ - request->send(200, FPSTR(s_plain), (String)millis()); + request->send(200, FPSTR(CONTENT_TYPE_PLAIN), (String)millis()); }); server.on(F("/freeheap"), HTTP_GET, [](AsyncWebServerRequest *request){ - request->send(200, FPSTR(s_plain), (String)ESP.getFreeHeap()); + request->send(200, FPSTR(CONTENT_TYPE_PLAIN), (String)ESP.getFreeHeap()); }); #ifdef WLED_ENABLE_USERMOD_PAGE server.on("/u", HTTP_GET, [](AsyncWebServerRequest *request) { - handleStaticContent(request, "", 200, FPSTR(s_html), PAGE_usermod, PAGE_usermod_length); + handleStaticContent(request, "", 200, FPSTR(CONTENT_TYPE_HTML), PAGE_usermod, PAGE_usermod_length); }); #endif @@ -429,7 +424,7 @@ void initServer() #ifdef WLED_ENABLE_DMX server.on(SET_F("/dmxmap"), HTTP_GET, [](AsyncWebServerRequest *request){ - request->send_P(200, FPSTR(s_html), PAGE_dmxmap , dmxProcessor); + request->send_P(200, FPSTR(CONTENT_TYPE_HTML), PAGE_dmxmap , dmxProcessor); }); #else server.on(SET_F("/dmxmap"), HTTP_GET, [](AsyncWebServerRequest *request){ @@ -440,7 +435,7 @@ void initServer() server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { if (captivePortal(request)) return; if (!showWelcomePage || request->hasArg(F("sliders"))) { - handleStaticContent(request, F("/index.htm"), 200, FPSTR(s_html), PAGE_index, PAGE_index_L); + handleStaticContent(request, F("/index.htm"), 200, FPSTR(CONTENT_TYPE_HTML), PAGE_index, PAGE_index_L); } else { serveSettings(request); } @@ -449,20 +444,20 @@ void initServer() #ifdef WLED_ENABLE_PIXART static const char _pixart_htm[] PROGMEM = "/pixart.htm"; server.on(_pixart_htm, HTTP_GET, [](AsyncWebServerRequest *request) { - handleStaticContent(request, FPSTR(_pixart_htm), 200, FPSTR(s_html), PAGE_pixart, PAGE_pixart_L); + handleStaticContent(request, FPSTR(_pixart_htm), 200, FPSTR(CONTENT_TYPE_HTML), PAGE_pixart, PAGE_pixart_L); }); #endif #ifndef WLED_DISABLE_PXMAGIC static const char _pxmagic_htm[] PROGMEM = "/pxmagic.htm"; server.on(_pxmagic_htm, HTTP_GET, [](AsyncWebServerRequest *request) { - handleStaticContent(request, FPSTR(_pxmagic_htm), 200, FPSTR(s_html), PAGE_pxmagic, PAGE_pxmagic_L); + handleStaticContent(request, FPSTR(_pxmagic_htm), 200, FPSTR(CONTENT_TYPE_HTML), PAGE_pxmagic, PAGE_pxmagic_L); }); #endif static const char _cpal_htm[] PROGMEM = "/cpal.htm"; server.on(_cpal_htm, HTTP_GET, [](AsyncWebServerRequest *request) { - handleStaticContent(request, FPSTR(_cpal_htm), 200, FPSTR(s_html), PAGE_cpal, PAGE_cpal_L); + handleStaticContent(request, FPSTR(_cpal_htm), 200, FPSTR(CONTENT_TYPE_HTML), PAGE_cpal, PAGE_cpal_L); }); #ifdef WLED_ENABLE_WEBSOCKETS @@ -487,7 +482,7 @@ void initServer() #ifndef WLED_DISABLE_ALEXA if(espalexa.handleAlexaApiCall(request)) return; #endif - handleStaticContent(request, request->url(), 404, FPSTR(s_html), PAGE_404, PAGE_404_length); + handleStaticContent(request, request->url(), 404, FPSTR(CONTENT_TYPE_HTML), PAGE_404, PAGE_404_length); }); } @@ -498,7 +493,7 @@ void serveMessage(AsyncWebServerRequest* request, uint16_t code, const String& h messageSub = subl; optionType = optionT; - request->send_P(code, FPSTR(s_html), PAGE_msg, msgProcessor); + request->send_P(code, FPSTR(CONTENT_TYPE_HTML), PAGE_msg, msgProcessor); } @@ -506,7 +501,7 @@ void serveJsonError(AsyncWebServerRequest* request, uint16_t code, uint16_t erro { AsyncJsonResponse *response = new AsyncJsonResponse(64); if (error < ERR_NOT_IMPL) response->addHeader(F("Retry-After"), F("1")); - response->setContentType(s_json); + response->setContentType(CONTENT_TYPE_JSON); response->setCode(code); JsonObject obj = response->getRoot(); obj[F("error")] = error; @@ -522,12 +517,12 @@ void serveSettingsJS(AsyncWebServerRequest* request) byte subPage = request->arg(F("p")).toInt(); if (subPage > 10) { strcpy_P(buf, PSTR("alert('Settings for this request are not implemented.');")); - request->send(501, FPSTR(s_javascript), buf); + request->send(501, FPSTR(CONTENT_TYPE_JAVASCRIPT), buf); return; } if (subPage > 0 && !correctPIN && strlen(settingsPIN)>0) { strcpy_P(buf, PSTR("alert('PIN incorrect.');")); - request->send(401, FPSTR(s_javascript), buf); + request->send(401, FPSTR(CONTENT_TYPE_JAVASCRIPT), buf); return; } strcat_P(buf,PSTR("function GetV(){var d=document;")); @@ -535,7 +530,7 @@ void serveSettingsJS(AsyncWebServerRequest* request) strcat_P(buf,PSTR("}")); AsyncWebServerResponse *response; - response = request->beginResponse(200, FPSTR(s_javascript), buf); + response = request->beginResponse(200, FPSTR(CONTENT_TYPE_JAVASCRIPT), buf); response->addHeader(F("Cache-Control"), F("no-store")); response->addHeader(F("Expires"), F("0")); request->send(response); @@ -616,7 +611,7 @@ void serveSettings(AsyncWebServerRequest* request, bool post) { } int code = 200; - String contentType = FPSTR(s_html); + String contentType = FPSTR(CONTENT_TYPE_HTML); const uint8_t* content; size_t len; @@ -642,7 +637,7 @@ void serveSettings(AsyncWebServerRequest* request, bool post) { return; } case SUBPAGE_PINREQ : content = PAGE_settings_pin; len = PAGE_settings_pin_length; code = 401; break; - case SUBPAGE_CSS : content = PAGE_settingsCss; len = PAGE_settingsCss_length; contentType = FPSTR(s_css); break; + case SUBPAGE_CSS : content = PAGE_settingsCss; len = PAGE_settingsCss_length; contentType = FPSTR(CONTENT_TYPE_CSS); break; case SUBPAGE_JS : serveSettingsJS(request); return; case SUBPAGE_WELCOME : content = PAGE_welcome; len = PAGE_welcome_length; break; default: content = PAGE_settings; len = PAGE_settings_length; break; From 8b6bf08a2361aba3ec61cea88d1bd7bb741c937a Mon Sep 17 00:00:00 2001 From: Will Miles Date: Tue, 19 Mar 2024 23:50:32 -0400 Subject: [PATCH 093/114] serveLiveLeds: Use variable buffer size Allocate the serialization buffer size at the required length, rather than always allocating the maximum size. --- wled00/json.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/json.cpp b/wled00/json.cpp index f6cb645c0..c493ae2f2 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -1152,7 +1152,7 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient) } #endif - DynamicBuffer buffer(9 + (9*MAX_LIVE_LEDS) + 7 + 5 + 6 + 5 + 6 + 5 + 2); + DynamicBuffer buffer(9 + (9*(1+(used/n))) + 7 + 5 + 6 + 5 + 6 + 5 + 2); char* buf = buffer.data(); // assign buffer for oappnd() functions strncpy_P(buffer.data(), PSTR("{\"leds\":["), buffer.size()); buf += 9; // sizeof(PSTR()) from last line From b031fa15316a3aaebf79410268c8b386ed970984 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Wed, 20 Mar 2024 20:12:21 +0100 Subject: [PATCH 094/114] Palette cycling fix. Updated getPaletteCount() to return count of all available palettes, including custom ones. --- wled00/FX.h | 2 +- wled00/json.cpp | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/wled00/FX.h b/wled00/FX.h index 3aa19bc35..58c192bc9 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -810,7 +810,7 @@ class WS2812FX { // 96 bytes inline uint8_t getSegmentsNum(void) { return _segments.size(); } // returns currently present segments inline uint8_t getCurrSegmentId(void) { return _segment_index; } // returns current segment index (only valid while strip.isServicing()) inline uint8_t getMainSegmentId(void) { return _mainSegment; } // returns main segment index - inline uint8_t getPaletteCount() { return 13 + GRADIENT_PALETTE_COUNT; } // will only return built-in palette count + inline uint8_t getPaletteCount() { return 13 + GRADIENT_PALETTE_COUNT + customPalettes.size(); } inline uint8_t getTargetFps() { return _targetFps; } // returns rough FPS value for las 2s interval inline uint8_t getModeCount() { return _modeCount; } // returns number of registered modes/effects diff --git a/wled00/json.cpp b/wled00/json.cpp index 14b92c7e7..113b2b1f5 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -226,14 +226,19 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId) getVal(elem["ix"], &seg.intensity); uint8_t pal = seg.palette; + last = strip.getPaletteCount(); + if (!elem["pal"].isNull() && elem["pal"].is()) { + const char *tmp = elem["pal"].as(); + if (strlen(tmp) > 3 && (strchr(tmp,'r') || strchr(tmp,'~') != strrchr(tmp,'~'))) last = 0; // we have "X~Y(r|[w]~[-])" form + } if (seg.getLightCapabilities() & 1) { // ignore palette for White and On/Off segments - if (getVal(elem["pal"], &pal)) seg.setPalette(pal); + if (getVal(elem["pal"], &pal, 0, last)) seg.setPalette(pal); } getVal(elem["c1"], &seg.custom1); getVal(elem["c2"], &seg.custom2); uint8_t cust3 = seg.custom3; - getVal(elem["c3"], &cust3); // we can't pass reference to bitfield + getVal(elem["c3"], &cust3, 0, 31); // we can't pass reference to bitfield seg.custom3 = constrain(cust3, 0, 31); seg.check1 = getBoolVal(elem["o1"], seg.check1); @@ -850,8 +855,8 @@ void serializePalettes(JsonObject root, int page) int itemPerPage = 8; #endif - int palettesCount = strip.getPaletteCount(); int customPalettes = strip.customPalettes.size(); + int palettesCount = strip.getPaletteCount() - customPalettes; int maxPage = (palettesCount + customPalettes -1) / itemPerPage; if (page > maxPage) page = maxPage; From 33fe68d7eb2b3963f2dee9c3f4d7e615849dff6f Mon Sep 17 00:00:00 2001 From: thatdonfc Date: Wed, 20 Mar 2024 13:48:15 -0700 Subject: [PATCH 095/114] Revert breaking change --- usermods/usermod_v2_four_line_display_ALT/readme.md | 8 ++++---- .../usermod_v2_four_line_display_ALT.h | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/usermods/usermod_v2_four_line_display_ALT/readme.md b/usermods/usermod_v2_four_line_display_ALT/readme.md index 35a55a88f..a8f386dac 100644 --- a/usermods/usermod_v2_four_line_display_ALT/readme.md +++ b/usermods/usermod_v2_four_line_display_ALT/readme.md @@ -56,10 +56,10 @@ These options are configurable in Config > Usermods * 3 = I2C SSD1306 128x64 (4 double-height lines) * 4 = I2C SSD1305 128x32 * 5 = I2C SSD1305 128x64 (4 double-height lines) - * 6 = I2C SSD1309 128x64 (4 double-height lines) - * 7 = SPI SSD1306 128x32 - * 8 = SPI SSD1306 128x64 (4 double-height lines) - * 9 = SPI SSD1309 128x64 (4 double-height lines) + * 6 = SPI SSD1306 128x32 + * 7 = SPI SSD1306 128x64 (4 double-height lines) + * 8 = SPI SSD1309 128x64 (4 double-height lines) + * 9 = I2C SSD1309 128x64 (4 double-height lines) * `pin` - GPIO pins used for display; SPI displays can use SCK, MOSI, CS, DC & RST * `flip` - flip/rotate display 180° * `contrast` - set display contrast (higher contrast may reduce display lifetime) diff --git a/usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display_ALT.h b/usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display_ALT.h index 75aa90cfe..24eb9794f 100644 --- a/usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display_ALT.h +++ b/usermods/usermod_v2_four_line_display_ALT/usermod_v2_four_line_display_ALT.h @@ -87,10 +87,10 @@ typedef enum { SSD1306_64, // U8X8_SSD1306_128X64_NONAME_HW_I2C SSD1305, // U8X8_SSD1305_128X32_ADAFRUIT_HW_I2C SSD1305_64, // U8X8_SSD1305_128X64_ADAFRUIT_HW_I2C - SSD1309_64, // U8X8_SSD1309_128X64_NONAME0_HW_I2C SSD1306_SPI, // U8X8_SSD1306_128X32_NONAME_HW_SPI SSD1306_SPI64, // U8X8_SSD1306_128X64_NONAME_HW_SPI - SSD1309_SPI64 // U8X8_SSD1309_128X64_NONAME0_4W_HW_SPI + SSD1309_SPI64, // U8X8_SSD1309_128X64_NONAME0_4W_HW_SPI + SSD1309_64 // U8X8_SSD1309_128X64_NONAME0_HW_I2C } DisplayType; @@ -1207,10 +1207,10 @@ void FourLineDisplayUsermod::appendConfigData() { oappend(SET_F("addOption(dd,'SSD1306 128x64',3);")); oappend(SET_F("addOption(dd,'SSD1305',4);")); oappend(SET_F("addOption(dd,'SSD1305 128x64',5);")); - oappend(SET_F("addOption(dd,'SSD1309 128x64',6);")); - oappend(SET_F("addOption(dd,'SSD1306 SPI',7);")); - oappend(SET_F("addOption(dd,'SSD1306 SPI 128x64',8);")); - oappend(SET_F("addOption(dd,'SSD1309 SPI 128x64',9);")); + oappend(SET_F("addOption(dd,'SSD1309 128x64',9);")); + oappend(SET_F("addOption(dd,'SSD1306 SPI',6);")); + oappend(SET_F("addOption(dd,'SSD1306 SPI 128x64',7);")); + oappend(SET_F("addOption(dd,'SSD1309 SPI 128x64',8);")); oappend(SET_F("addInfo('4LineDisplay:type',1,'
Change may require reboot','');")); oappend(SET_F("addInfo('4LineDisplay:pin[]',0,'','SPI CS');")); oappend(SET_F("addInfo('4LineDisplay:pin[]',1,'','SPI DC');")); From 7bafe995e5f3a4ed0c8248d362095f4188db2bba Mon Sep 17 00:00:00 2001 From: Woody Date: Thu, 21 Mar 2024 12:00:18 +0100 Subject: [PATCH 096/114] Remove zlib dependency from package.json --- package-lock.json | 563 +++++++++++++++++++++++----------------------- package.json | 3 +- 2 files changed, 277 insertions(+), 289 deletions(-) diff --git a/package-lock.json b/package-lock.json index dd3fab2e6..055437e98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,8 +12,7 @@ "clean-css": "^5.3.3", "html-minifier-terser": "^7.2.0", "inliner": "^1.13.1", - "nodemon": "^3.0.2", - "zlib": "^1.0.5" + "nodemon": "^3.0.2" } }, "node_modules/@jridgewell/gen-mapping": { @@ -102,7 +101,7 @@ "node_modules/align-text": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", "dependencies": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -115,7 +114,7 @@ "node_modules/ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "integrity": "sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==", "engines": { "node": ">=0.10.0" } @@ -123,7 +122,7 @@ "node_modules/ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "engines": { "node": ">=0.10.0" } @@ -131,7 +130,7 @@ "node_modules/ansi-styles": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", "engines": { "node": ">=0.10.0" } @@ -159,12 +158,12 @@ "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "node_modules/asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { "safer-buffer": "~2.1.0" } @@ -172,7 +171,7 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { "node": ">=0.8" } @@ -180,20 +179,20 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { "node": "*" } }, "node_modules/aws4": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/balanced-match": { "version": "1.0.2", @@ -203,23 +202,26 @@ "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { "version": "1.1.11", @@ -258,7 +260,7 @@ "node_modules/camelcase": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", "engines": { "node": ">=0.10.0" } @@ -266,12 +268,12 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/center-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", "dependencies": { "align-text": "^0.1.3", "lazy-cache": "^1.0.3" @@ -283,7 +285,7 @@ "node_modules/chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", "dependencies": { "ansi-styles": "^2.2.1", "escape-string-regexp": "^1.0.2", @@ -306,7 +308,7 @@ "node_modules/cheerio": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.19.0.tgz", - "integrity": "sha1-dy5wFfLuKZZQltcepBdbdas1SSU=", + "integrity": "sha512-Fwcm3zkR37STnPC8FepSHeSYJM5Rd596TZOcfDUdojR4Q735aK1Xn+M+ISagNneuCwMjK28w4kX+ETILGNT/UQ==", "dependencies": { "css-select": "~1.0.0", "dom-serializer": "~0.1.0", @@ -318,16 +320,15 @@ "node": ">= 0.6" } }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -340,6 +341,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -366,18 +370,10 @@ "node": ">= 10.0" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", "dependencies": { "center-align": "^0.1.1", "right-align": "^0.1.1", @@ -387,7 +383,7 @@ "node_modules/coa": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "integrity": "sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ==", "dependencies": { "q": "^1.1.2" }, @@ -398,7 +394,7 @@ "node_modules/colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", "engines": { "node": ">=0.1.90" } @@ -430,7 +426,7 @@ "node_modules/configstore": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.4.0.tgz", - "integrity": "sha1-w1eB0FAdJowlxUuLF/YkDopPsCE=", + "integrity": "sha512-Zcx2SVdZC06IuRHd2MhkVYFNJBkZBj166LGdsJXRcqNC8Gs5Bwh8mosStNeCBBmtIm4wNii2uarD50qztjKOjw==", "dependencies": { "graceful-fs": "^4.1.2", "mkdirp": "^0.5.0", @@ -448,18 +444,18 @@ "node_modules/configstore/node_modules/uuid": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/css-select": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.0.0.tgz", - "integrity": "sha1-sRIcpRhI3SZOIkTQWM7iVN7rRLA=", + "integrity": "sha512-/xPlD7betkfd7ChGkLGGWx5HWyiHDOSn7aACLzdH0nwucPvB0EAm8hMBm7Xn7vGfAeRRN7KZ8wumGm8NoNcMRw==", "dependencies": { "boolbase": "~1.0.0", "css-what": "1.0", @@ -470,7 +466,7 @@ "node_modules/css-what": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-1.0.0.tgz", - "integrity": "sha1-18wt9FGAZm+Z0rFEYmOUaeAPc2w=", + "integrity": "sha512-60SUMPBreXrLXgvpM8kYpO0AOyMRhdRlXFX5BMQbZq1SIJCyNE56nqFQhmvREQdUJpedbGRYZ5wOyq3/F6q5Zw==", "engines": { "node": "*" } @@ -478,7 +474,7 @@ "node_modules/csso": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/csso/-/csso-2.0.0.tgz", - "integrity": "sha1-F4tDpEYhIhwndWCG9THgL0KQDug=", + "integrity": "sha512-tckZA0LhyEnToPoQDmncCA+TUS3aoIVl/MsSaoipR52Sfa+H83fJvIHRVOHMFn9zW6kIV1L0D7tUDFFjvN28lg==", "dependencies": { "clap": "^1.0.9", "source-map": "^0.5.3" @@ -490,10 +486,18 @@ "node": ">=0.10.0" } }, + "node_modules/csso/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { "assert-plus": "^1.0.0" }, @@ -512,7 +516,7 @@ "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { "node": ">=0.10.0" } @@ -528,7 +532,7 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } @@ -542,6 +546,11 @@ "entities": "^1.1.1" } }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, "node_modules/domelementtype": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", @@ -550,7 +559,7 @@ "node_modules/domhandler": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", "dependencies": { "domelementtype": "1" } @@ -558,7 +567,7 @@ "node_modules/domutils": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.4.3.tgz", - "integrity": "sha1-CGVRN5bGswYDGFDhdVFrr4C3Km8=", + "integrity": "sha512-ZkVgS/PpxjyJMb+S2iVHHEZjVnOUtjGp0/zstqKGTE9lrZtNHlNQmLwP/lhLMEApYbzc08BKMx9IFpKhaSbW1w==", "dependencies": { "domelementtype": "1" } @@ -586,12 +595,12 @@ "node_modules/duplexify/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -618,7 +627,7 @@ "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -633,19 +642,25 @@ } }, "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } }, "node_modules/es6-promise": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz", - "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=" + "integrity": "sha512-oyOjMhyKMLEjOOtvkwg0G4pAzLQ9WdbbeX7WdqKzvYXu+UFgD0Zo/Brq5Q49zNmnGPPzV5rmYvrr0jz1zWx8Iw==" }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } @@ -653,7 +668,7 @@ "node_modules/esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -670,15 +685,15 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" ] }, "node_modules/fast-deep-equal": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", @@ -699,7 +714,7 @@ "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { "node": "*" } @@ -718,9 +733,9 @@ } }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "hasInstallScript": true, "optional": true, "os": [ @@ -733,7 +748,7 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { "assert-plus": "^1.0.0" } @@ -752,7 +767,7 @@ "node_modules/got": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/got/-/got-3.3.1.tgz", - "integrity": "sha1-5dDtSvVfw+701WAHdp2YGSvLLso=", + "integrity": "sha512-7chPlc0pWHjvq7B6dEEXz4GphoDupOvBSSl6AwRsAJX7GPTZ+bturaZiIigX4Dp6KrAP67nvzuKkNc0SLA0DKg==", "dependencies": { "duplexify": "^3.2.0", "infinity-agent": "^2.0.0", @@ -772,31 +787,31 @@ "node_modules/got/node_modules/object-assign": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "integrity": "sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { "node": ">=4" } }, "node_modules/har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "deprecated": "this library is no longer supported", "dependencies": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" }, "engines": { @@ -806,7 +821,7 @@ "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -842,21 +857,10 @@ "node": "^14.13.1 || >=16.0.0" } }, - "node_modules/html-minifier-terser/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/htmlparser2": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", "dependencies": { "domelementtype": "1", "domhandler": "2.3", @@ -868,7 +872,7 @@ "node_modules/htmlparser2/node_modules/domutils": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", "dependencies": { "dom-serializer": "0", "domelementtype": "1" @@ -877,12 +881,12 @@ "node_modules/htmlparser2/node_modules/entities": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==" }, "node_modules/http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -912,7 +916,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "engines": { "node": ">=0.8.19" } @@ -920,7 +924,7 @@ "node_modules/infinity-agent": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/infinity-agent/-/infinity-agent-2.0.3.tgz", - "integrity": "sha1-ReDi/3qesDCyfWK3SzdEt6esQhY=" + "integrity": "sha512-CnfUJe5o2S9aAQWXGMhDZI4UL39MAJV3guOTfHHIdos4tuVHkl1j/J+1XLQn+CLIvqcpgQR/p+xXYXzcrhCe5w==" }, "node_modules/inherits": { "version": "2.0.4", @@ -935,7 +939,7 @@ "node_modules/inliner": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/inliner/-/inliner-1.13.1.tgz", - "integrity": "sha1-5QApgev1Dp2fMTcRSBz/Ei1PP8s=", + "integrity": "sha512-yoS+56puOu+Ug8FBRtxtTFnEn2NHqFs8BNQgSOvzh3J0ommbwNw8VKiaVNYjWK6fgPuByq95KyV0LC+qV9IwLw==", "dependencies": { "ansi-escapes": "^1.4.0", "ansi-styles": "^2.2.1", @@ -1010,7 +1014,7 @@ "node_modules/is-npm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "integrity": "sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==", "engines": { "node": ">=0.10.0" } @@ -1026,7 +1030,7 @@ "node_modules/is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "integrity": "sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==", "engines": { "node": ">=0.10.0" } @@ -1034,7 +1038,7 @@ "node_modules/is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "engines": { "node": ">=0.10.0" } @@ -1042,22 +1046,22 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/js-yaml": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", - "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", + "integrity": "sha512-BLv3oxhfET+w5fjPwq3PsAsxzi9i3qzU//HMpWVz0A6KplF86HdR9x2TGnv9DXhSUrO7LO8czUiTd3yb3mLSvg==", "dependencies": { "argparse": "^1.0.7", "esprima": "^2.6.0" @@ -1069,7 +1073,7 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jschardet": { "version": "1.6.0", @@ -1080,9 +1084,9 @@ } }, "node_modules/json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -1092,26 +1096,26 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "engines": [ - "node >=0.6.0" - ], + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", - "json-schema": "0.2.3", + "json-schema": "0.4.0", "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" } }, "node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dependencies": { "is-buffer": "^1.1.5" }, @@ -1122,7 +1126,7 @@ "node_modules/latest-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-1.0.1.tgz", - "integrity": "sha1-cs/Ebj6NG+ZR4eu1Tqn26pbzdLs=", + "integrity": "sha512-HERbxp4SBlmI380+eM0B0u4nxjfTaPeydIMzl9+9UQ4nSu3xMWKlX9WoT34e4wy7VWe67c53Nv9qPVjS8fHKgg==", "dependencies": { "package-json": "^1.0.0" }, @@ -1136,7 +1140,7 @@ "node_modules/lazy-cache": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", "engines": { "node": ">=0.10.0" } @@ -1144,17 +1148,17 @@ "node_modules/lodash": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==" }, "node_modules/lodash._arrayeach": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", - "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=" + "integrity": "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==" }, "node_modules/lodash._baseassign": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", "dependencies": { "lodash._basecopy": "^3.0.0", "lodash.keys": "^3.0.0" @@ -1163,12 +1167,12 @@ "node_modules/lodash._basecopy": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==" }, "node_modules/lodash._baseeach": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash._baseeach/-/lodash._baseeach-3.0.4.tgz", - "integrity": "sha1-z4cGVyyhROjZ11InyZDamC+TKvM=", + "integrity": "sha512-IqUZ9MQo2UT1XPGuBntInqTOlc+oV+bCo0kMp+yuKGsfvRSNgUW0YjWVZUrG/gs+8z/Eyuc0jkJjOBESt9BXxg==", "dependencies": { "lodash.keys": "^3.0.0" } @@ -1176,12 +1180,12 @@ "node_modules/lodash._bindcallback": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==" }, "node_modules/lodash._createassigner": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "integrity": "sha512-LziVL7IDnJjQeeV95Wvhw6G28Z8Q6da87LWKOPWmzBLv4u6FAT/x5v00pyGW0u38UoogNF2JnD3bGgZZDaNEBw==", "dependencies": { "lodash._bindcallback": "^3.0.0", "lodash._isiterateecall": "^3.0.0", @@ -1191,17 +1195,17 @@ "node_modules/lodash._getnative": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==" }, "node_modules/lodash._isiterateecall": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + "integrity": "sha512-De+ZbrMu6eThFti/CSzhRvTKMgQToLxbij58LMfM8JnYDNSOjkjTCIaa8ixglOeGh2nyPlakbt5bJWJ7gvpYlQ==" }, "node_modules/lodash.assign": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", - "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "integrity": "sha512-/VVxzgGBmbphasTg51FrztxQJ/VgAUpol6zmJuSVSGcNg4g7FA4z7rQV8Ovr9V3vFBNWZhvKWHfpAytjTVUfFA==", "dependencies": { "lodash._baseassign": "^3.0.0", "lodash._createassigner": "^3.0.0", @@ -1211,7 +1215,7 @@ "node_modules/lodash.defaults": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-3.1.2.tgz", - "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", + "integrity": "sha512-X7135IXFQt5JDFnYxOVAzVz+kFvwDn3N8DJYf+nrz/mMWEuSu7+OL6rWqsk3+VR1T4TejFCSu5isBJOLSID2bg==", "dependencies": { "lodash.assign": "^3.0.0", "lodash.restparam": "^3.0.0" @@ -1220,7 +1224,7 @@ "node_modules/lodash.foreach": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-3.0.3.tgz", - "integrity": "sha1-b9fvt5aRrs1n/erCdhyY5wHWw5o=", + "integrity": "sha512-PA7Lp7pe2HMJBoB1vELegEIF3waUFnM0fWDKJVYolwZ4zHh6WTmnq0xmzfQksD66gx2quhDNyBdyaE2T8/DP3Q==", "dependencies": { "lodash._arrayeach": "^3.0.0", "lodash._baseeach": "^3.0.0", @@ -1231,17 +1235,17 @@ "node_modules/lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" }, "node_modules/lodash.isarray": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==" }, "node_modules/lodash.keys": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", "dependencies": { "lodash._getnative": "^3.0.0", "lodash.isarguments": "^3.0.0", @@ -1251,12 +1255,12 @@ "node_modules/lodash.restparam": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + "integrity": "sha512-L4/arjjuq4noiUJpt3yS6KIKDtJwNe2fIYgMqyYYKoeIfV1iEqvPwhCx23o+R9dzouGihDAPN1dTIRWa7zk8tw==" }, "node_modules/longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", "engines": { "node": ">=0.10.0" } @@ -1300,19 +1304,19 @@ } }, "node_modules/mime-db": { - "version": "1.44.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.27", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", - "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.44.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -1330,16 +1334,19 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -1348,12 +1355,12 @@ "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/nested-error-stacks": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz", - "integrity": "sha1-GfYZWRUZ8JZ2mlupqG5u7sgjw88=", + "integrity": "sha512-o32anp9JA7oezPOFSfG2BBXSdHepOm5FpJvwxHWDtfJ3Bg3xdi68S6ijPlEOfUg6quxZWyvJM+8fHk1yMDKspA==", "dependencies": { "inherits": "~2.0.1" } @@ -1415,20 +1422,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/nodemon/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/nodemon/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1481,7 +1474,7 @@ "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } @@ -1489,7 +1482,7 @@ "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } @@ -1497,7 +1490,7 @@ "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "engines": { "node": ">=0.10.0" } @@ -1505,7 +1498,7 @@ "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "engines": { "node": ">=0.10.0" } @@ -1522,7 +1515,7 @@ "node_modules/package-json": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-1.2.0.tgz", - "integrity": "sha1-yOysCUInzfdqMWh07QXifMk5oOA=", + "integrity": "sha512-knDtirWWqKVJrLY3gEBLflVvueTMpyjbAwX/9j/EKi2DsjNemp5voS8cyKyGh57SNaMJNhNRZbIaWdneOcLU1g==", "dependencies": { "got": "^3.2.0", "registry-url": "^3.0.0" @@ -1552,7 +1545,7 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -1568,7 +1561,7 @@ "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "engines": { "node": ">=0.10.0" } @@ -1576,7 +1569,7 @@ "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dependencies": { "pinkie": "^2.0.0" }, @@ -1587,7 +1580,7 @@ "node_modules/prepend-http": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "integrity": "sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==", "engines": { "node": ">=0.10.0" } @@ -1606,9 +1599,9 @@ } }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/pstree.remy": { "version": "1.1.8", @@ -1616,9 +1609,9 @@ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -1626,7 +1619,7 @@ "node_modules/q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" @@ -1657,7 +1650,7 @@ "node_modules/read-all-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "integrity": "sha512-DI1drPHbmBcUDWrJ7ull/F2Qb8HkwBncVx8/RpKYFSIACYaVRQReISYPdZz/mt1y1+qMCOrfReTopERmaxtP6w==", "dependencies": { "pinkie-promise": "^2.0.0", "readable-stream": "^2.0.0" @@ -1669,12 +1662,12 @@ "node_modules/read-all-stream/node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/read-all-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1701,7 +1694,7 @@ "node_modules/readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -1723,7 +1716,7 @@ "node_modules/registry-url": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", "dependencies": { "rc": "^1.0.1" }, @@ -1734,7 +1727,7 @@ "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "engines": { "node": ">= 0.10" } @@ -1742,7 +1735,7 @@ "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "engines": { "node": ">=0.10" } @@ -1750,7 +1743,7 @@ "node_modules/repeating": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", - "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "integrity": "sha512-Nh30JLeMHdoI+AsQ5eblhZ7YlTsM9wiJQe/AHIunlK3KWzvXhXb36IJ7K1IOeRjIOtzMjdUHjwXUFxKJoPTSOg==", "dependencies": { "is-finite": "^1.0.0" }, @@ -1795,7 +1788,7 @@ "node_modules/right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", "dependencies": { "align-text": "^0.1.1" }, @@ -1833,36 +1826,6 @@ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "dependencies": { - "semver": "^5.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", @@ -1876,18 +1839,48 @@ "node": ">=10" } }, + "node_modules/semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==", + "dependencies": { + "semver": "^5.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", "engines": { "node": "*" } }, "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } @@ -1901,23 +1894,15 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -1939,19 +1924,19 @@ } }, "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" }, "node_modules/string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, "node_modules/string-length": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/string-length/-/string-length-1.0.1.tgz", - "integrity": "sha1-VpcPscOFWOnnC3KL894mmsRa36w=", + "integrity": "sha512-MNCACnufWUf3pQ57O5WTBMkKhzYIaKEcUioO0XHrTMafrbBaNk4IyDOLHBv5xbXO0jLLdsYWeFjpjG2hVHRDtw==", "dependencies": { "strip-ansi": "^3.0.0" }, @@ -1962,7 +1947,7 @@ "node_modules/strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -1973,7 +1958,7 @@ "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "engines": { "node": ">=0.10.0" } @@ -1981,7 +1966,7 @@ "node_modules/supports-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "engines": { "node": ">=0.8.0" } @@ -1989,7 +1974,7 @@ "node_modules/svgo": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.6.6.tgz", - "integrity": "sha1-s0CIkDbyD5tEdUMHfQ9Vc+0ETAg=", + "integrity": "sha512-C5A1r5SjFesNoKsmc+kWBxmB04iBGH2D/nFy8HJaME9+SyZKcmqcN8QG+GwxIc7D2+JWhaaW7uaM9+XwfplTEQ==", "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", "dependencies": { "coa": "~1.0.1", @@ -2032,7 +2017,7 @@ "node_modules/then-fs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/then-fs/-/then-fs-2.0.0.tgz", - "integrity": "sha1-cveS3Z0xcFqRrhnr/Piz+WjIHaI=", + "integrity": "sha512-5ffcBcU+vFUCYDNi/o507IqjqrTkuGsLVZ1Fp50hwgZRY7ufVFa9jFfTy5uZ2QnSKacKigWKeaXkOqLa4DsjLw==", "dependencies": { "promise": ">=3.2 <8" } @@ -2040,7 +2025,7 @@ "node_modules/timed-out": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-2.0.0.tgz", - "integrity": "sha1-84sK6B03R9YoAB9B2vxlKs5nHAo=", + "integrity": "sha512-pqqJOi1rF5zNs/ps4vmbE4SFCrM4iR7LW+GHAsHqO/EumqbIWceioevYLM5xZRgQSH6gFgL9J/uB7EcJhQ9niQ==", "engines": { "node": ">=0.10.0" } @@ -2087,7 +2072,7 @@ "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -2098,12 +2083,12 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", "dependencies": { "source-map": "~0.5.1", "yargs": "~3.10.0" @@ -2118,10 +2103,18 @@ "uglify-to-browserify": "~1.0.0" } }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/uglify-to-browserify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", "optional": true }, "node_modules/undefsafe": { @@ -2132,7 +2125,7 @@ "node_modules/update-notifier": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.5.0.tgz", - "integrity": "sha1-B7XcIGazYnqztPUwEw9+3doHpMw=", + "integrity": "sha512-zOGOlUKDAgDlLHLv7Oiszz3pSj8fKlSJ3i0u49sEakjXUEVJ6DMjo/Mh/B6mg2eOALvRTJkd0kbChcipQoYCng==", "dependencies": { "chalk": "^1.0.0", "configstore": "^1.0.0", @@ -2147,9 +2140,9 @@ } }, "node_modules/uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } @@ -2157,7 +2150,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "3.4.0", @@ -2171,7 +2164,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], @@ -2181,10 +2174,15 @@ "extsprintf": "^1.2.0" } }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, "node_modules/whet.extend": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "integrity": "sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA==", "engines": { "node": ">=0.6.0" } @@ -2192,7 +2190,7 @@ "node_modules/window-size": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", "engines": { "node": ">= 0.8.0" } @@ -2200,7 +2198,7 @@ "node_modules/wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", "engines": { "node": ">=0.4.0" } @@ -2208,12 +2206,12 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -2223,7 +2221,7 @@ "node_modules/xdg-basedir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", + "integrity": "sha512-NF1pPn594TaRSUO/HARoB4jK8I+rWgcpVlpQCK6/6o5PHyLUt2CSiDrpUZbQ6rROck+W2EwF8mBJcTs+W98J9w==", "dependencies": { "os-homedir": "^1.0.0" }, @@ -2239,22 +2237,13 @@ "node_modules/yargs": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", "dependencies": { "camelcase": "^1.0.2", "cliui": "^2.1.0", "decamelize": "^1.0.0", "window-size": "0.1.0" } - }, - "node_modules/zlib": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/zlib/-/zlib-1.0.5.tgz", - "integrity": "sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=", - "hasInstallScript": true, - "engines": { - "node": ">=0.2.0" - } } } } diff --git a/package.json b/package.json index f2c0e3d65..413fa8cf3 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "clean-css": "^5.3.3", "html-minifier-terser": "^7.2.0", "inliner": "^1.13.1", - "nodemon": "^3.0.2", - "zlib": "^1.0.5" + "nodemon": "^3.0.2" } } From 1c1c3fd8325932c07ad82a3d8a38f0ebfa09524a Mon Sep 17 00:00:00 2001 From: Woody Date: Thu, 21 Mar 2024 12:03:35 +0100 Subject: [PATCH 097/114] Use npm ci instead of npm install --- .github/workflows/wled-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wled-ci.yml b/.github/workflows/wled-ci.yml index f9ffb6481..ab5c7be37 100644 --- a/.github/workflows/wled-ci.yml +++ b/.github/workflows/wled-ci.yml @@ -37,7 +37,7 @@ jobs: uses: actions/setup-node@v4 with: cache: 'npm' - - run: npm install + - run: npm ci - name: Cache PlatformIO uses: actions/cache@v4 with: From ecfdc6f0a804e00c3362bfb02968b99ed00d64a3 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Fri, 22 Mar 2024 20:49:13 +0100 Subject: [PATCH 098/114] Bugfixes: - #3843 - #3844 - network scan on new install - misc optimization --- wled00/cfg.cpp | 4 ++-- wled00/const.h | 1 + wled00/data/index.js | 2 +- wled00/data/settings_wifi.htm | 2 +- wled00/fcn_declare.h | 1 + wled00/playlist.cpp | 11 +++++++---- wled00/presets.cpp | 9 +++++++++ wled00/wled.h | 2 +- 8 files changed, 23 insertions(+), 9 deletions(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index e51b666e4..6ccf8aa44 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -632,12 +632,12 @@ static const char s_cfg_json[] PROGMEM = "/cfg.json"; void deserializeConfigFromFS() { bool success = deserializeConfigSec(); + #ifdef WLED_ADD_EEPROM_SUPPORT if (!success) { //if file does not exist, try reading from EEPROM - #ifdef WLED_ADD_EEPROM_SUPPORT deEEPSettings(); return; - #endif } + #endif if (!requestJSONBufferLock(1)) return; diff --git a/wled00/const.h b/wled00/const.h index 540d0946b..73873d041 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -375,6 +375,7 @@ //Playlist option byte #define PL_OPTION_SHUFFLE 0x01 +#define PL_OPTION_RESTORE 0x02 // Segment capability byte #define SEG_CAPABILITY_RGB 0x01 diff --git a/wled00/data/index.js b/wled00/data/index.js index 36c3eb1b9..4ad2044ad 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -1984,7 +1984,7 @@ function makeP(i,pl)
End preset:
diff --git a/wled00/data/settings_wifi.htm b/wled00/data/settings_wifi.htm index 76e733671..3577e80d2 100644 --- a/wled00/data/settings_wifi.htm +++ b/wled00/data/settings_wifi.htm @@ -84,7 +84,7 @@ option.textContent = "Other network..."; select.appendChild(option); - if (input.value === "" || found) input.replaceWith(select); + if (input.value === "" || input.value === "Your_Network" || found) input.replaceWith(select); else select.remove(); } diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 20ac21129..f1b013e99 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -233,6 +233,7 @@ const char *getPresetsFileName(bool persistent = true); void initPresetsFile(); void handlePresets(); bool applyPreset(byte index, byte callMode = CALL_MODE_DIRECT_CHANGE); +bool applyPresetFromPlaylist(byte index); void applyPresetWithFallback(uint8_t presetID, uint8_t callMode, uint8_t effectID = 0, uint8_t paletteID = 0); inline bool applyTemporaryPreset() {return applyPreset(255);}; void savePreset(byte index, const char* pname = nullptr, JsonObject saveobj = JsonObject()); diff --git a/wled00/playlist.cpp b/wled00/playlist.cpp index bcbcb4516..882ccb0e0 100644 --- a/wled00/playlist.cpp +++ b/wled00/playlist.cpp @@ -109,7 +109,10 @@ int16_t loadPlaylist(JsonObject playlistObj, byte presetId) { if (playlistRepeat > 0) playlistRepeat++; //add one extra repetition immediately since it will be deducted on first start playlistEndPreset = playlistObj["end"] | 0; // if end preset is 255 restore original preset (if any running) upon playlist end - if (playlistEndPreset == 255 && currentPreset > 0) playlistEndPreset = currentPreset; + if (playlistEndPreset == 255 && currentPreset > 0) { + playlistEndPreset = currentPreset; + playlistOptions |= PL_OPTION_RESTORE; // for async save operation + } if (playlistEndPreset > 250) playlistEndPreset = 0; shuffle = shuffle || playlistObj["r"]; if (shuffle) playlistOptions |= PL_OPTION_SHUFFLE; @@ -135,7 +138,7 @@ void handlePlaylist() { if (!playlistIndex) { if (playlistRepeat == 1) { //stop if all repetitions are done unloadPlaylist(); - if (playlistEndPreset) applyPreset(playlistEndPreset); + if (playlistEndPreset) applyPresetFromPlaylist(playlistEndPreset); return; } if (playlistRepeat > 1) playlistRepeat--; // decrease repeat count on each index reset if not an endless playlist @@ -146,7 +149,7 @@ void handlePlaylist() { jsonTransitionOnce = true; strip.setTransition(fadeTransition ? playlistEntries[playlistIndex].tr * 100 : 0); playlistEntryDur = playlistEntries[playlistIndex].dur; - applyPreset(playlistEntries[playlistIndex].preset); + applyPresetFromPlaylist(playlistEntries[playlistIndex].preset); } } @@ -157,7 +160,7 @@ void serializePlaylist(JsonObject sObj) { JsonArray dur = playlist.createNestedArray("dur"); JsonArray transition = playlist.createNestedArray(F("transition")); playlist[F("repeat")] = (playlistIndex < 0 && playlistRepeat > 0) ? playlistRepeat - 1 : playlistRepeat; // remove added repetition count (if not yet running) - playlist["end"] = playlistEndPreset; + playlist["end"] = playlistOptions & PL_OPTION_RESTORE ? 255 : playlistEndPreset; playlist["r"] = playlistOptions & PL_OPTION_SHUFFLE; for (int i=0; i Date: Sun, 24 Mar 2024 12:27:32 +0100 Subject: [PATCH 099/114] Update requirements.txt to solve CI build errors use latest platformIO package, to avoid build errors due to missing 'scons' > Tool Manager: Installing platformio/tool-scons @ ~4.40400.0 > Error: Could not find the package with 'platformio/tool-scons @ ~4.40400.0' requirements for your system 'linux_x86_64' > Error: Process completed with exit code 1. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1c0644f98..d6f86e202 100644 --- a/requirements.txt +++ b/requirements.txt @@ -36,7 +36,7 @@ marshmallow==3.19.0 # via platformio packaging==23.1 # via marshmallow -platformio==6.1.6 +platformio==6.1.14 # via -r requirements.in pyelftools==0.29 # via platformio From c32ee40ca0215ddb22a69ed92516f133aac8cb75 Mon Sep 17 00:00:00 2001 From: Woody Date: Sun, 24 Mar 2024 14:19:49 +0100 Subject: [PATCH 100/114] =?UTF-8?q?add=20node:=20prefix=20to=20Core=20modu?= =?UTF-8?q?les=20The=20node:=20prefix=20makes=20it=20clear=20that=20you?= =?UTF-8?q?=E2=80=99re=20importing=20a=20built-in=20module,=20not=20a=20us?= =?UTF-8?q?er-defined=20or=20third-party=20module.=20This=20can=20help=20a?= =?UTF-8?q?void=20confusion.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/cdata.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/cdata.js b/tools/cdata.js index 16475d811..c7ab6ec7d 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -15,10 +15,10 @@ * It uses NodeJS packages to inline, minify and GZIP files. See writeHtmlGzipped and writeChunks invocations at the bottom of the page. */ -const fs = require("fs"); +const fs = require("node:fs"); const path = require("path"); const inliner = require("inliner"); -const zlib = require("zlib"); +const zlib = require("node:zlib"); const CleanCSS = require("clean-css"); const minifyHtml = require("html-minifier-terser").minify; const packageJson = require("../package.json"); From 23d80002397047b59a06a962a0e9f7203ddd0092 Mon Sep 17 00:00:00 2001 From: Woody Date: Sun, 24 Mar 2024 14:34:17 +0100 Subject: [PATCH 101/114] Remove accidental space in cdata.js --- tools/cdata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/cdata.js b/tools/cdata.js index c7ab6ec7d..3b8af46da 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -18,7 +18,7 @@ const fs = require("node:fs"); const path = require("path"); const inliner = require("inliner"); -const zlib = require("node:zlib"); +const zlib = require("node:zlib"); const CleanCSS = require("clean-css"); const minifyHtml = require("html-minifier-terser").minify; const packageJson = require("../package.json"); From 0a344ada976abedb1f8eb33c860e58cca583a111 Mon Sep 17 00:00:00 2001 From: Woody Date: Sun, 24 Mar 2024 15:23:33 +0100 Subject: [PATCH 102/114] Add bin.gz binaries for 160mhz builds --- .github/workflows/wled-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wled-ci.yml b/.github/workflows/wled-ci.yml index f9721fb27..feb0e531a 100644 --- a/.github/workflows/wled-ci.yml +++ b/.github/workflows/wled-ci.yml @@ -61,7 +61,7 @@ jobs: name: firmware-${{ matrix.environment }} path: | build_output/release/*.bin - build_output/release_gz/*_ESP02.bin.gz + build_output/release_gz/*_ESP02*.bin.gz release: name: Create Release runs-on: ubuntu-latest From 47f44680a31fee019a1417e0043484a77ed8b168 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sun, 24 Mar 2024 17:37:11 +0100 Subject: [PATCH 103/114] Multi-update - 0.15.0-b2 - WS2805 support (NeoPixelBus 2.7.9) - generic PSRAM support (ESP32 rev.1 still needs compile fix) - BREAKING: default LEDPIN 2 (due to PSRAM) - PinManager optimisations --- CHANGELOG.md | 12 +++ package-lock.json | 4 +- package.json | 2 +- platformio.ini | 12 +-- platformio_override.sample.ini | 5 +- wled00/FX.h | 9 +- wled00/FX_fcn.cpp | 6 ++ wled00/bus_manager.h | 14 +-- wled00/bus_wrapper.h | 182 +++++++++++++++++++++------------ wled00/cfg.cpp | 2 +- wled00/const.h | 12 ++- wled00/data/settings_leds.htm | 13 ++- wled00/file.cpp | 13 +-- wled00/improv.cpp | 2 +- wled00/json.cpp | 2 +- wled00/pin_manager.cpp | 14 ++- wled00/pin_manager.h | 6 +- wled00/presets.cpp | 2 - wled00/wled.cpp | 42 +------- wled00/wled.h | 8 +- wled00/xml.cpp | 2 +- 21 files changed, 193 insertions(+), 171 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a9a60dac..00d70866f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ ## WLED changelog +#### Build 2403240 +- v0.15.0-b2 +- WS2805 support (RGB + WW + CW, 600kbps) +- Unified PSRAM use +- NeoPixelBus v2.7.9 (for future WS2805 support) +- Ubiquitous PSRAM mode for all variants of ESP32 +- SSD1309_64 I2C Support for FLD Usermod (#3836 by @THATDONFC) +- Palette cycling fix (add support for `{"seg":[{"pal":"X~Y~"}]}` or `{"seg":[{"pal":"X~Yr"}]}`) +- FW1906 Support (#3810 by @deece and @Robert-github-com) +- ESPAsyncWebServer 2.2.0 (#3828 by @willmmiles) +- Bugfixes: #3843, #3844 + #### Build 2403190 - limit max PWM frequency (fix incorrect PWM resolution) - Segment UI bugfix diff --git a/package-lock.json b/package-lock.json index dd3fab2e6..037ad0eee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wled", - "version": "0.15.0-b1", + "version": "0.15.0-b2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "wled", - "version": "0.15.0-b1", + "version": "0.15.0-b2", "license": "ISC", "dependencies": { "clean-css": "^5.3.3", diff --git a/package.json b/package.json index f2c0e3d65..ef28439e5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wled", - "version": "0.15.0-b1", + "version": "0.15.0-b2", "description": "Tools for WLED project", "main": "tools/cdata.js", "directories": { diff --git a/platformio.ini b/platformio.ini index 947578d98..c0467c8f3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -47,8 +47,8 @@ platform_packages = platformio/framework-arduinoespressif8266 platformio/tool-esptoolpy #@ ~1.30000.0 ## previous platform for 8266, in case of problems with the new one -## you'll need makuna/NeoPixelBus@ 2.6.9 for arduino_core_3_2_0, which does not support Ucs890x -;; platform_wled_default = ${common.arduino_core_3_2_0} +## you'll need makuna/NeoPixelBus@ 2.6.9 for arduino_core_3_0_2, which does not support Ucs890x +;; platform_wled_default = ${common.arduino_core_3_0_2} ;; platform_packages = tasmota/framework-arduinoespressif8266 @ 3.20704.7 ;; platformio/toolchain-xtensa @ ~2.40802.200502 ;; platformio/tool-esptool @ ~1.413.0 @@ -143,7 +143,7 @@ lib_compat_mode = strict lib_deps = fastled/FastLED @ 3.6.0 IRremoteESP8266 @ 2.8.2 - makuna/NeoPixelBus @ 2.7.8 + makuna/NeoPixelBus @ 2.7.9 https://github.com/Aircoookie/ESPAsyncWebServer.git @ ^2.2.0 # for I2C interface ;Wire @@ -392,8 +392,7 @@ board_build.flash_mode = qio board_build.partitions = ${esp32.default_partitions} build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_WROVER - -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue - -D WLED_USE_PSRAM + -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue ;; Older ESP32 (rev.<3) need a PSRAM fix (increases static RAM used) https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/external-ram.html -D LEDPIN=25 lib_deps = ${esp32.lib_deps} @@ -445,7 +444,6 @@ build_flags = ${common.build_flags} ${esp32s3.build_flags} -D WLED_RELEASE_NAME= ;-D ARDUINO_USB_CDC_ON_BOOT=0 ;; -D ARDUINO_USB_MODE=1 ;; for boards with serial-to-USB chip -D ARDUINO_USB_CDC_ON_BOOT=1 -D ARDUINO_USB_MODE=1 ;; for boards with USB-OTG connector only (USBCDC or "TinyUSB") ; -D WLED_RELEASE_NAME=ESP32-S3_PSRAM - -D WLED_USE_PSRAM -DBOARD_HAS_PSRAM ; tells WLED that PSRAM shall be used lib_deps = ${esp32s3.lib_deps} board_build.partitions = tools/WLED_ESP32_8MB.csv board_build.f_flash = 80000000L @@ -461,12 +459,10 @@ board_build.partitions = tools/WLED_ESP32_4MB_1MB_FS.csv ;board_build.f_flash = 80000000L build_unflags = ${common.build_unflags} build_flags = ${common.build_flags} ${esp32s2.build_flags} -D WLED_RELEASE_NAME=ESP32-S2 - -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DLOLIN_WIFI_FIX ; seems to work much better with this - -D WLED_USE_PSRAM -D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0 -D LEDPIN=16 diff --git a/platformio_override.sample.ini b/platformio_override.sample.ini index 29f5c6b57..d7d41f3a6 100644 --- a/platformio_override.sample.ini +++ b/platformio_override.sample.ini @@ -155,9 +155,8 @@ build_flags = ${common.build_flags_esp8266} ; set default color order of your led strip ; -D DEFAULT_LED_COLOR_ORDER=COL_ORDER_GRB ; -; use PSRAM if a device (ESP) has one -; -DBOARD_HAS_PSRAM -; -D WLED_USE_PSRAM +; use PSRAM on classic ESP32 rev.1 (rev.3 or above has no issues) +; -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue ; ; configure I2C and SPI interface (for various hardware) ; -D I2CSDAPIN=33 # initialise interface diff --git a/wled00/FX.h b/wled00/FX.h index 58c192bc9..1089a0b8b 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -59,13 +59,12 @@ /* Not used in all effects yet */ #define WLED_FPS 42 #define FRAMETIME_FIXED (1000/WLED_FPS) -//#define FRAMETIME _frametime #define FRAMETIME strip.getFrameTime() /* each segment uses 82 bytes of SRAM memory, so if you're application fails because of insufficient memory, decreasing MAX_NUM_SEGMENTS may help */ #ifdef ESP8266 - #define MAX_NUM_SEGMENTS 12 + #define MAX_NUM_SEGMENTS 16 /* How much data bytes all segments combined may allocate */ #define MAX_SEGMENT_DATA 5120 #else @@ -73,11 +72,7 @@ #define MAX_NUM_SEGMENTS 32 #endif #if defined(ARDUINO_ARCH_ESP32S2) - #if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) - #define MAX_SEGMENT_DATA MAX_NUM_SEGMENTS*1024 // 32k by default - #else - #define MAX_SEGMENT_DATA MAX_NUM_SEGMENTS*768 // 24k by default - #endif + #define MAX_SEGMENT_DATA MAX_NUM_SEGMENTS*768 // 24k by default (S2 is short on free RAM) #else #define MAX_SEGMENT_DATA MAX_NUM_SEGMENTS*1280 // 40k by default #endif diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 3566755f0..766c71e59 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1098,6 +1098,12 @@ void WS2812FX::finalizeInit(void) { uint16_t prevLen = 0; for (int i = 0; i < defNumBusses && i < WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES; i++) { uint8_t defPin[] = {defDataPins[i]}; + // when booting without config (1st boot) we need to make sure GPIOs defined for LED output don't clash with hardware + // i.e. DEBUG (GPIO1), DMX (2), SPI RAM/FLASH (16&17 on ESP32-WROVER/PICO), etc + if (pinManager.isPinAllocated(defPin[0])) { + defPin[0] = 1; // start with GPIO1 and work upwards + while (pinManager.isPinAllocated(defPin[0]) && defPin[0] < WLED_NUM_PINS) defPin[0]++; + } uint16_t start = prevLen; uint16_t count = defCounts[(i < defNumCounts) ? i : defNumCounts -1]; prevLen += count; diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index d4facb33b..c128f8c09 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -35,7 +35,7 @@ struct BusConfig { uint8_t skipAmount; bool refreshReq; uint8_t autoWhite; - uint8_t pins[5] = {LEDPIN, 255, 255, 255, 255}; + uint8_t pins[5] = {255, 255, 255, 255, 255}; uint16_t frequency; bool doubleBuffer; uint8_t milliAmpsPerLed; @@ -56,9 +56,9 @@ struct BusConfig { refreshReq = (bool) GET_BIT(busType,7); type = busType & 0x7F; // bit 7 may be/is hacked to include refresh info (1=refresh in off state, 0=no refresh) size_t nPins = 1; - if (type >= TYPE_NET_DDP_RGB && type < 96) nPins = 4; //virtual network bus. 4 "pins" store IP address - else if (type > 47) nPins = 2; - else if (type > 40 && type < 46) nPins = NUM_PWM_PINS(type); + if (IS_VIRTUAL(type)) nPins = 4; //virtual network bus. 4 "pins" store IP address + else if (IS_2PIN(type)) nPins = 2; + else if (IS_PWM(type)) nPins = NUM_PWM_PINS(type); for (size_t i = 0; i < nPins; i++) pins[i] = ppins[i]; } @@ -160,7 +160,8 @@ class Bus { virtual bool hasWhite(void) { return Bus::hasWhite(_type); } static bool hasWhite(uint8_t type) { if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || - type == TYPE_SK6812_RGBW || type == TYPE_TM1814 || type == TYPE_UCS8904 || type == TYPE_FW1906) return true; // digital types with white channel + type == TYPE_SK6812_RGBW || type == TYPE_TM1814 || type == TYPE_UCS8904 || + type == TYPE_FW1906 || type == TYPE_WS2805) return true; // digital types with white channel if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true; // analog types with white channel if (type == TYPE_NET_DDP_RGBW || type == TYPE_NET_ARTNET_RGBW) return true; // network types with white channel return false; @@ -168,7 +169,8 @@ class Bus { virtual bool hasCCT(void) { return Bus::hasCCT(_type); } static bool hasCCT(uint8_t type) { if (type == TYPE_WS2812_2CH_X3 || type == TYPE_WS2812_WWA || - type == TYPE_ANALOG_2CH || type == TYPE_ANALOG_5CH || type == TYPE_FW1906) return true; + type == TYPE_ANALOG_2CH || type == TYPE_ANALOG_5CH || + type == TYPE_FW1906 || type == TYPE_WS2805 ) return true; return false; } static int16_t getCCT() { return _cct; } diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index fafe3a460..d13b1a945 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -74,38 +74,37 @@ #define I_8266_U1_APA106_3 82 #define I_8266_DM_APA106_3 83 #define I_8266_BB_APA106_3 84 +//WS2805 +#define I_8266_U0_2805_5 89 +#define I_8266_U1_2805_5 90 +#define I_8266_DM_2805_5 91 +#define I_8266_BB_2805_5 92 /*** ESP32 Neopixel methods ***/ //RGB #define I_32_RN_NEO_3 21 #define I_32_I0_NEO_3 22 #define I_32_I1_NEO_3 23 -#define I_32_BB_NEO_3 24 // bitbanging on ESP32 not recommended //RGBW #define I_32_RN_NEO_4 25 #define I_32_I0_NEO_4 26 #define I_32_I1_NEO_4 27 -#define I_32_BB_NEO_4 28 // bitbanging on ESP32 not recommended //400Kbps #define I_32_RN_400_3 29 #define I_32_I0_400_3 30 #define I_32_I1_400_3 31 -#define I_32_BB_400_3 32 // bitbanging on ESP32 not recommended //TM1814 (RGBW) #define I_32_RN_TM1_4 33 #define I_32_I0_TM1_4 34 #define I_32_I1_TM1_4 35 -//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) //TM1829 (RGB) #define I_32_RN_TM2_3 36 #define I_32_I0_TM2_3 37 #define I_32_I1_TM2_3 38 -//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) //UCS8903 (RGB) #define I_32_RN_UCS_3 57 #define I_32_I0_UCS_3 58 #define I_32_I1_UCS_3 59 -//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) //UCS8904 (RGBW) #define I_32_RN_UCS_4 60 #define I_32_I0_UCS_4 61 @@ -114,11 +113,14 @@ #define I_32_RN_FW6_5 63 #define I_32_I0_FW6_5 64 #define I_32_I1_FW6_5 65 -//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) +//APA106 #define I_32_RN_APA106_3 85 #define I_32_I0_APA106_3 86 #define I_32_I1_APA106_3 87 -#define I_32_BB_APA106_3 88 // bitbangging on ESP32 not recommended +//WS2805 +#define I_32_RN_2805_5 93 +#define I_32_I0_2805_5 94 +#define I_32_I1_2805_5 95 //APA102 @@ -192,6 +194,11 @@ #define B_8266_U1_FW6_5 NeoPixelBusLg //esp8266, gpio2 #define B_8266_DM_FW6_5 NeoPixelBusLg //esp8266, gpio3 #define B_8266_BB_FW6_5 NeoPixelBusLg //esp8266, bb +//WS2805 GRBCW +#define B_8266_U0_2805_5 NeoPixelBusLg //esp8266, gpio1 +#define B_8266_U1_2805_5 NeoPixelBusLg //esp8266, gpio2 +#define B_8266_DM_2805_5 NeoPixelBusLg //esp8266, gpio3 +#define B_8266_BB_2805_5 NeoPixelBusLg //esp8266, bb #endif /*** ESP32 Neopixel methods ***/ @@ -204,7 +211,6 @@ #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_NEO_3 NeoPixelBusLg #endif -//#define B_32_BB_NEO_3 NeoPixelBusLg // NeoEsp8266BitBang800KbpsMethod //RGBW #define B_32_RN_NEO_4 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS @@ -213,7 +219,6 @@ #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_NEO_4 NeoPixelBusLg #endif -//#define B_32_BB_NEO_4 NeoPixelBusLg // NeoEsp8266BitBang800KbpsMethod //400Kbps #define B_32_RN_400_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS @@ -222,7 +227,6 @@ #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_400_3 NeoPixelBusLg #endif -//#define B_32_BB_400_3 NeoPixelBusLg // NeoEsp8266BitBang400KbpsMethod //TM1814 (RGBW) #define B_32_RN_TM1_4 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS @@ -231,7 +235,6 @@ #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_TM1_4 NeoPixelBusLg #endif -//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) //TM1829 (RGB) #define B_32_RN_TM2_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS @@ -240,7 +243,6 @@ #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_TM2_3 NeoPixelBusLg #endif -//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) //UCS8903 #define B_32_RN_UCS_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS @@ -249,7 +251,6 @@ #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_UCS_3 NeoPixelBusLg #endif -//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) //UCS8904 #define B_32_RN_UCS_4 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS @@ -258,7 +259,6 @@ #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_UCS_4 NeoPixelBusLg #endif -//Bit Bang theoratically possible, but very undesirable and not needed (no pin restrictions on RMT and I2S) #define B_32_RN_APA106_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS #define B_32_I0_APA106_3 NeoPixelBusLg @@ -266,7 +266,6 @@ #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_APA106_3 NeoPixelBusLg #endif -//#define B_32_BB_APA106_3 NeoPixelBusLg // NeoEsp8266BitBang800KbpsMethod //FW1906 GRBCW #define B_32_RN_FW6_5 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS @@ -275,7 +274,14 @@ #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_FW6_5 NeoPixelBusLg #endif - +//WS2805 RGBWC +#define B_32_RN_2805_5 NeoPixelBusLg +#ifndef WLED_NO_I2S0_PIXELBUS +#define B_32_I0_2805_5 NeoPixelBusLg +#endif +#ifndef WLED_NO_I2S1_PIXELBUS +#define B_32_I1_2805_5 NeoPixelBusLg +#endif #endif //APA102 @@ -382,6 +388,10 @@ class PolyBus { case I_8266_U1_FW6_5: (static_cast(busPtr))->Begin(); break; case I_8266_DM_FW6_5: (static_cast(busPtr))->Begin(); break; case I_8266_BB_FW6_5: (static_cast(busPtr))->Begin(); break; + case I_8266_U0_2805_5: (static_cast(busPtr))->Begin(); break; + case I_8266_U1_2805_5: (static_cast(busPtr))->Begin(); break; + case I_8266_DM_2805_5: (static_cast(busPtr))->Begin(); break; + case I_8266_BB_2805_5: (static_cast(busPtr))->Begin(); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->Begin(); break; @@ -391,7 +401,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_3: (static_cast(busPtr))->Begin(); break; #endif -// case I_32_BB_NEO_3: (static_cast(busPtr))->Begin(); break; case I_32_RN_NEO_4: (static_cast(busPtr))->Begin(); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_NEO_4: (static_cast(busPtr))->Begin(); break; @@ -399,7 +408,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_4: (static_cast(busPtr))->Begin(); break; #endif -// case I_32_BB_NEO_4: (static_cast(busPtr))->Begin(); break; case I_32_RN_400_3: (static_cast(busPtr))->Begin(); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_400_3: (static_cast(busPtr))->Begin(); break; @@ -407,7 +415,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_400_3: (static_cast(busPtr))->Begin(); break; #endif -// case I_32_BB_400_3: (static_cast(busPtr))->Begin(); break; case I_32_RN_TM1_4: beginTM1814(busPtr); break; case I_32_RN_TM2_3: (static_cast(busPtr))->Begin(); break; #ifndef WLED_NO_I2S0_PIXELBUS @@ -425,7 +432,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_3: (static_cast(busPtr))->Begin(); break; #endif -// case I_32_BB_UCS_3: (static_cast(busPtr))->Begin(); break; case I_32_RN_UCS_4: (static_cast(busPtr))->Begin(); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_UCS_4: (static_cast(busPtr))->Begin(); break; @@ -440,8 +446,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_FW6_5: (static_cast(busPtr))->Begin(); break; #endif - -// case I_32_BB_UCS_4: (static_cast(busPtr))->Begin(); break; case I_32_RN_APA106_3: (static_cast(busPtr))->Begin(); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_APA106_3: (static_cast(busPtr))->Begin(); break; @@ -449,7 +453,13 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_APA106_3: (static_cast(busPtr))->Begin(); break; #endif -// case I_32_BB_APA106_3: (static_cast(busPtr))->Begin(); break; + case I_32_RN_2805_5: (static_cast(busPtr))->Begin(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_2805_5: (static_cast(busPtr))->Begin(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_2805_5: (static_cast(busPtr))->Begin(); break; + #endif // ESP32 can (and should, to avoid inadvertantly driving the chip select signal) specify the pins used for SPI, but only in begin() case I_HS_DOT_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; case I_HS_LPD_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; @@ -506,6 +516,10 @@ class PolyBus { case I_8266_U1_FW6_5: busPtr = new B_8266_U1_FW6_5(len, pins[0]); break; case I_8266_DM_FW6_5: busPtr = new B_8266_DM_FW6_5(len, pins[0]); break; case I_8266_BB_FW6_5: busPtr = new B_8266_BB_FW6_5(len, pins[0]); break; + case I_8266_U0_2805_5: busPtr = new B_8266_U0_2805_5(len, pins[0]); break; + case I_8266_U1_2805_5: busPtr = new B_8266_U1_2805_5(len, pins[0]); break; + case I_8266_DM_2805_5: busPtr = new B_8266_DM_2805_5(len, pins[0]); break; + case I_8266_BB_2805_5: busPtr = new B_8266_BB_2805_5(len, pins[0]); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: busPtr = new B_32_RN_NEO_3(len, pins[0], (NeoBusChannel)channel); break; @@ -515,7 +529,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_3: busPtr = new B_32_I1_NEO_3(len, pins[0]); break; #endif -// case I_32_BB_NEO_3: busPtr = new B_32_BB_NEO_3(len, pins[0], (NeoBusChannel)channel); break; case I_32_RN_NEO_4: busPtr = new B_32_RN_NEO_4(len, pins[0], (NeoBusChannel)channel); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_NEO_4: busPtr = new B_32_I0_NEO_4(len, pins[0]); break; @@ -523,7 +536,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_4: busPtr = new B_32_I1_NEO_4(len, pins[0]); break; #endif -// case I_32_BB_NEO_4: busPtr = new B_32_BB_NEO_4(len, pins[0], (NeoBusChannel)channel); break; case I_32_RN_400_3: busPtr = new B_32_RN_400_3(len, pins[0], (NeoBusChannel)channel); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_400_3: busPtr = new B_32_I0_400_3(len, pins[0]); break; @@ -531,7 +543,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_400_3: busPtr = new B_32_I1_400_3(len, pins[0]); break; #endif -// case I_32_BB_400_3: busPtr = new B_32_BB_400_3(len, pins[0], (NeoBusChannel)channel); break; case I_32_RN_TM1_4: busPtr = new B_32_RN_TM1_4(len, pins[0], (NeoBusChannel)channel); break; case I_32_RN_TM2_3: busPtr = new B_32_RN_TM2_3(len, pins[0], (NeoBusChannel)channel); break; #ifndef WLED_NO_I2S0_PIXELBUS @@ -549,7 +560,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_3: busPtr = new B_32_I1_UCS_3(len, pins[0]); break; #endif -// case I_32_BB_UCS_3: busPtr = new B_32_BB_UCS_3(len, pins[0], (NeoBusChannel)channel); break; case I_32_RN_UCS_4: busPtr = new B_32_RN_UCS_4(len, pins[0], (NeoBusChannel)channel); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_UCS_4: busPtr = new B_32_I0_UCS_4(len, pins[0]); break; @@ -557,7 +567,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_4: busPtr = new B_32_I1_UCS_4(len, pins[0]); break; #endif -// case I_32_BB_UCS_4: busPtr = new B_32_BB_UCS_4(len, pins[0], (NeoBusChannel)channel); break; case I_32_RN_APA106_3: busPtr = new B_32_RN_APA106_3(len, pins[0], (NeoBusChannel)channel); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_APA106_3: busPtr = new B_32_I0_APA106_3(len, pins[0]); break; @@ -565,7 +574,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_APA106_3: busPtr = new B_32_I1_APA106_3(len, pins[0]); break; #endif -// case I_32_BB_APA106_3: busPtr = new B_32_BB_APA106_3(len, pins[0], (NeoBusChannel)channel); break; case I_32_RN_FW6_5: busPtr = new B_32_RN_FW6_5(len, pins[0], (NeoBusChannel)channel); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_FW6_5: busPtr = new B_32_I0_FW6_5(len, pins[0]); break; @@ -573,6 +581,13 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_FW6_5: busPtr = new B_32_I1_FW6_5(len, pins[0]); break; #endif + case I_32_RN_2805_5: busPtr = new B_32_RN_2805_5(len, pins[0], (NeoBusChannel)channel); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_2805_5: busPtr = new B_32_I0_2805_5(len, pins[0]); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_2805_5: busPtr = new B_32_I1_2805_5(len, pins[0]); break; + #endif #endif // for 2-wire: pins[1] is clk, pins[0] is dat. begin expects (len, clk, dat) case I_HS_DOT_3: busPtr = new B_HS_DOT_3(len, pins[1], pins[0]); break; @@ -630,6 +645,10 @@ class PolyBus { case I_8266_U1_FW6_5: (static_cast(busPtr))->Show(consistent); break; case I_8266_DM_FW6_5: (static_cast(busPtr))->Show(consistent); break; case I_8266_BB_FW6_5: (static_cast(busPtr))->Show(consistent); break; + case I_8266_U0_2805_5: (static_cast(busPtr))->Show(consistent); break; + case I_8266_U1_2805_5: (static_cast(busPtr))->Show(consistent); break; + case I_8266_DM_2805_5: (static_cast(busPtr))->Show(consistent); break; + case I_8266_BB_2805_5: (static_cast(busPtr))->Show(consistent); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->Show(consistent); break; @@ -639,7 +658,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_3: (static_cast(busPtr))->Show(consistent); break; #endif -// case I_32_BB_NEO_3: (static_cast(busPtr))->Show(consistent); break; case I_32_RN_NEO_4: (static_cast(busPtr))->Show(consistent); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_NEO_4: (static_cast(busPtr))->Show(consistent); break; @@ -647,7 +665,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_4: (static_cast(busPtr))->Show(consistent); break; #endif -// case I_32_BB_NEO_4: (static_cast(busPtr))->Show(consistent); break; case I_32_RN_400_3: (static_cast(busPtr))->Show(consistent); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_400_3: (static_cast(busPtr))->Show(consistent); break; @@ -655,7 +672,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_400_3: (static_cast(busPtr))->Show(consistent); break; #endif -// case I_32_BB_400_3: (static_cast(busPtr))->Show(consistent); break; case I_32_RN_TM1_4: (static_cast(busPtr))->Show(consistent); break; case I_32_RN_TM2_3: (static_cast(busPtr))->Show(consistent); break; #ifndef WLED_NO_I2S0_PIXELBUS @@ -673,7 +689,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_3: (static_cast(busPtr))->Show(consistent); break; #endif -// case I_32_BB_UCS_3: (static_cast(busPtr))->Show(consistent); break; case I_32_RN_UCS_4: (static_cast(busPtr))->Show(consistent); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_UCS_4: (static_cast(busPtr))->Show(consistent); break; @@ -681,7 +696,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_4: (static_cast(busPtr))->Show(consistent); break; #endif -// case I_32_BB_UCS_4: (static_cast(busPtr))->Show(consistent); break; case I_32_RN_APA106_3: (static_cast(busPtr))->Show(consistent); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_APA106_3: (static_cast(busPtr))->Show(consistent); break; @@ -689,7 +703,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_APA106_3: (static_cast(busPtr))->Show(consistent); break; #endif -// case I_32_BB_APA106_3: (static_cast(busPtr))->Show(consistent); break; case I_32_RN_FW6_5: (static_cast(busPtr))->Show(consistent); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_FW6_5: (static_cast(busPtr))->Show(consistent); break; @@ -697,6 +710,13 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_FW6_5: (static_cast(busPtr))->Show(consistent); break; #endif + case I_32_RN_2805_5: (static_cast(busPtr))->Show(consistent); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_2805_5: (static_cast(busPtr))->Show(consistent); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_2805_5: (static_cast(busPtr))->Show(consistent); break; + #endif #endif case I_HS_DOT_3: (static_cast(busPtr))->Show(consistent); break; case I_SS_DOT_3: (static_cast(busPtr))->Show(consistent); break; @@ -750,6 +770,10 @@ class PolyBus { case I_8266_U1_FW6_5: return (static_cast(busPtr))->CanShow(); break; case I_8266_DM_FW6_5: return (static_cast(busPtr))->CanShow(); break; case I_8266_BB_FW6_5: return (static_cast(busPtr))->CanShow(); break; + case I_8266_U0_2805_5: return (static_cast(busPtr))->CanShow(); break; + case I_8266_U1_2805_5: return (static_cast(busPtr))->CanShow(); break; + case I_8266_DM_2805_5: return (static_cast(busPtr))->CanShow(); break; + case I_8266_BB_2805_5: return (static_cast(busPtr))->CanShow(); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: return (static_cast(busPtr))->CanShow(); break; @@ -759,7 +783,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_3: return (static_cast(busPtr))->CanShow(); break; #endif -// case I_32_BB_NEO_3: return (static_cast(busPtr))->CanShow(); break; case I_32_RN_NEO_4: return (static_cast(busPtr))->CanShow(); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_NEO_4: return (static_cast(busPtr))->CanShow(); break; @@ -767,7 +790,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_4: return (static_cast(busPtr))->CanShow(); break; #endif -// case I_32_BB_NEO_4: return (static_cast(busPtr))->CanShow(); break; case I_32_RN_400_3: return (static_cast(busPtr))->CanShow(); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_400_3: return (static_cast(busPtr))->CanShow(); break; @@ -775,7 +797,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_400_3: return (static_cast(busPtr))->CanShow(); break; #endif -// case I_32_BB_400_3: return (static_cast(busPtr))->CanShow(); break; case I_32_RN_TM1_4: return (static_cast(busPtr))->CanShow(); break; case I_32_RN_TM2_3: return (static_cast(busPtr))->CanShow(); break; #ifndef WLED_NO_I2S0_PIXELBUS @@ -793,7 +814,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_3: return (static_cast(busPtr))->CanShow(); break; #endif -// case I_32_BB_UCS_3: return (static_cast(busPtr))->CanShow(); break; case I_32_RN_UCS_4: return (static_cast(busPtr))->CanShow(); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_UCS_4: return (static_cast(busPtr))->CanShow(); break; @@ -801,7 +821,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_4: return (static_cast(busPtr))->CanShow(); break; #endif -// case I_32_BB_UCS_4: return (static_cast(busPtr))->CanShow(); break; case I_32_RN_APA106_3: return (static_cast(busPtr))->CanShow(); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_APA106_3: return (static_cast(busPtr))->CanShow(); break; @@ -809,7 +828,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_APA106_3: return (static_cast(busPtr))->CanShow(); break; #endif -// case I_32_BB_APA106_3: return (static_cast(busPtr))->CanShow(); break; case I_32_RN_FW6_5: return (static_cast(busPtr))->CanShow(); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_FW6_5: return (static_cast(busPtr))->CanShow(); break; @@ -817,6 +835,13 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_FW6_5: return (static_cast(busPtr))->CanShow(); break; #endif + case I_32_RN_2805_5: return (static_cast(busPtr))->CanShow(); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_2805_5: return (static_cast(busPtr))->CanShow(); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_2805_5: return (static_cast(busPtr))->CanShow(); break; + #endif #endif case I_HS_DOT_3: return (static_cast(busPtr))->CanShow(); break; case I_SS_DOT_3: return (static_cast(busPtr))->CanShow(); break; @@ -896,6 +921,10 @@ class PolyBus { case I_8266_U1_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; case I_8266_DM_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; case I_8266_BB_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + case I_8266_U0_2805_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + case I_8266_U1_2805_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + case I_8266_DM_2805_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + case I_8266_BB_2805_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; @@ -905,7 +934,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif -// case I_32_BB_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_32_RN_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; @@ -913,7 +941,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; #endif -// case I_32_BB_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; case I_32_RN_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; @@ -921,7 +948,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif -// case I_32_BB_400_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(colB)); break; case I_32_RN_TM1_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; case I_32_RN_TM2_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #ifndef WLED_NO_I2S0_PIXELBUS @@ -939,7 +965,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; #endif -// case I_32_BB_UCS_3: (static_cast(busPtr))->SetPixelColor(pix, Rgb48Color(RgbColor(col))); break; case I_32_RN_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; @@ -947,7 +972,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; #endif -// case I_32_BB_UCS_4: (static_cast(busPtr))->SetPixelColor(pix, Rgbw64Color(col)); break; case I_32_RN_APA106_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_APA106_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; @@ -955,7 +979,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_APA106_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; #endif -// case I_32_BB_APA106_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_32_RN_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; @@ -963,6 +986,13 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_FW6_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; #endif + case I_32_RN_2805_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_2805_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_2805_5: (static_cast(busPtr))->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + #endif #endif case I_HS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_SS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; @@ -1017,6 +1047,10 @@ class PolyBus { case I_8266_U1_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; case I_8266_DM_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; case I_8266_BB_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U0_2805_5: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_U1_2805_5: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_DM_2805_5: (static_cast(busPtr))->SetLuminance(b); break; + case I_8266_BB_2805_5: (static_cast(busPtr))->SetLuminance(b); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; @@ -1026,7 +1060,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; #endif -// case I_32_BB_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; case I_32_RN_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; @@ -1034,7 +1067,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; #endif -// case I_32_BB_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; case I_32_RN_400_3: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_400_3: (static_cast(busPtr))->SetLuminance(b); break; @@ -1042,7 +1074,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_400_3: (static_cast(busPtr))->SetLuminance(b); break; #endif -// case I_32_BB_400_3: (static_cast(busPtr))->SetLuminance(b); break; case I_32_RN_TM1_4: (static_cast(busPtr))->SetLuminance(b); break; case I_32_RN_TM2_3: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS @@ -1060,7 +1091,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; #endif -// case I_32_BB_UCS_3: (static_cast(busPtr))->SetLuminance(b); break; case I_32_RN_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; @@ -1068,7 +1098,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; #endif -// case I_32_BB_UCS_4: (static_cast(busPtr))->SetLuminance(b); break; case I_32_RN_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; @@ -1076,7 +1105,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; #endif -// case I_32_BB_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; case I_32_RN_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; @@ -1084,7 +1112,13 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_FW6_5: (static_cast(busPtr))->SetLuminance(b); break; #endif - + case I_32_RN_2805_5: (static_cast(busPtr))->SetLuminance(b); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_2805_5: (static_cast(busPtr))->SetLuminance(b); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_2805_5: (static_cast(busPtr))->SetLuminance(b); break; + #endif #endif case I_HS_DOT_3: (static_cast(busPtr))->SetLuminance(b); break; case I_SS_DOT_3: (static_cast(busPtr))->SetLuminance(b); break; @@ -1140,6 +1174,10 @@ class PolyBus { case I_8266_U1_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W case I_8266_DM_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W case I_8266_BB_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + case I_8266_U0_2805_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + case I_8266_U1_2805_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + case I_8266_DM_2805_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + case I_8266_BB_2805_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1149,7 +1187,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; #endif -// case I_32_BB_NEO_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_RN_NEO_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_NEO_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1157,7 +1194,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; #endif -// case I_32_BB_NEO_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_RN_400_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_400_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1165,7 +1201,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_400_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; #endif -// case I_32_BB_400_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_RN_TM1_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_RN_TM2_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; #ifndef WLED_NO_I2S0_PIXELBUS @@ -1183,7 +1218,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_3: { Rgb48Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,0); } break; #endif -// case I_32_BB_UCS_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_RN_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; @@ -1191,7 +1225,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R>>8,c.G>>8,c.B>>8,c.W>>8); } break; #endif -// case I_32_BB_UCS_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_RN_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1199,7 +1232,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; #endif -// case I_32_BB_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_RN_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W @@ -1207,6 +1239,13 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_FW6_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W #endif + case I_32_RN_2805_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_2805_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_2805_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W + #endif #endif case I_HS_DOT_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_SS_DOT_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1280,6 +1319,10 @@ class PolyBus { case I_8266_U1_FW6_5: delete (static_cast(busPtr)); break; case I_8266_DM_FW6_5: delete (static_cast(busPtr)); break; case I_8266_BB_FW6_5: delete (static_cast(busPtr)); break; + case I_8266_U0_2805_5: delete (static_cast(busPtr)); break; + case I_8266_U1_2805_5: delete (static_cast(busPtr)); break; + case I_8266_DM_2805_5: delete (static_cast(busPtr)); break; + case I_8266_BB_2805_5: delete (static_cast(busPtr)); break; #endif #ifdef ARDUINO_ARCH_ESP32 case I_32_RN_NEO_3: delete (static_cast(busPtr)); break; @@ -1289,7 +1332,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_3: delete (static_cast(busPtr)); break; #endif -// case I_32_BB_NEO_3: delete (static_cast(busPtr)); break; case I_32_RN_NEO_4: delete (static_cast(busPtr)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_NEO_4: delete (static_cast(busPtr)); break; @@ -1297,7 +1339,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_NEO_4: delete (static_cast(busPtr)); break; #endif -// case I_32_BB_NEO_4: delete (static_cast(busPtr)); break; case I_32_RN_400_3: delete (static_cast(busPtr)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_400_3: delete (static_cast(busPtr)); break; @@ -1305,7 +1346,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_400_3: delete (static_cast(busPtr)); break; #endif -// case I_32_BB_400_3: delete (static_cast(busPtr)); break; case I_32_RN_TM1_4: delete (static_cast(busPtr)); break; case I_32_RN_TM2_3: delete (static_cast(busPtr)); break; #ifndef WLED_NO_I2S0_PIXELBUS @@ -1323,7 +1363,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_3: delete (static_cast(busPtr)); break; #endif -// case I_32_BB_UCS_3: delete (static_cast(busPtr)); break; case I_32_RN_UCS_4: delete (static_cast(busPtr)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_UCS_4: delete (static_cast(busPtr)); break; @@ -1331,7 +1370,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_UCS_4: delete (static_cast(busPtr)); break; #endif -// case I_32_BB_UCS_4: delete (static_cast(busPtr)); break; case I_32_RN_APA106_3: delete (static_cast(busPtr)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_APA106_3: delete (static_cast(busPtr)); break; @@ -1339,7 +1377,6 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_APA106_3: delete (static_cast(busPtr)); break; #endif -// case I_32_BB_APA106_3: delete (static_cast(busPtr)); break; case I_32_RN_FW6_5: delete (static_cast(busPtr)); break; #ifndef WLED_NO_I2S0_PIXELBUS case I_32_I0_FW6_5: delete (static_cast(busPtr)); break; @@ -1347,6 +1384,13 @@ class PolyBus { #ifndef WLED_NO_I2S1_PIXELBUS case I_32_I1_FW6_5: delete (static_cast(busPtr)); break; #endif + case I_32_RN_2805_5: delete (static_cast(busPtr)); break; + #ifndef WLED_NO_I2S0_PIXELBUS + case I_32_I0_2805_5: delete (static_cast(busPtr)); break; + #endif + #ifndef WLED_NO_I2S1_PIXELBUS + case I_32_I1_2805_5: delete (static_cast(busPtr)); break; + #endif #endif case I_HS_DOT_3: delete (static_cast(busPtr)); break; case I_SS_DOT_3: delete (static_cast(busPtr)); break; @@ -1410,6 +1454,8 @@ class PolyBus { return I_8266_U0_APA106_3 + offset; case TYPE_FW1906: return I_8266_U0_FW6_5 + offset; + case TYPE_WS2805: + return I_8266_U0_2805_5 + offset; } #else //ESP32 uint8_t offset = 0; //0 = RMT (num 0-7) 8 = I2S0 9 = I2S1 @@ -1452,6 +1498,8 @@ class PolyBus { return I_32_RN_APA106_3 + offset; case TYPE_FW1906: return I_32_RN_FW6_5 + offset; + case TYPE_WS2805: + return I_32_RN_2805_5 + offset; } #endif } diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 6ccf8aa44..a1794a755 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -185,7 +185,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { uint8_t maPerLed = elm[F("ledma")] | 55; uint16_t maMax = elm[F("maxpwr")] | (ablMilliampsMax * length) / total; // rough (incorrect?) per strip ABL calculation when no config exists // To disable brightness limiter we either set output max current to 0 or single LED current to 0 (we choose output max current) - if ((ledType > TYPE_TM1814 && ledType < TYPE_WS2801) || ledType >= TYPE_NET_DDP_RGB) { // analog and virtual + if (IS_PWM(ledType) || IS_ONOFF(ledType) || IS_VIRTUAL(ledType)) { // analog and virtual maPerLed = 0; maMax = 0; } diff --git a/wled00/const.h b/wled00/const.h index 73873d041..de07c314a 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -274,6 +274,7 @@ #define TYPE_UCS8904 29 //first RGBW digital type (hardcoded in busmanager.cpp, memUsage()) #define TYPE_SK6812_RGBW 30 #define TYPE_TM1814 31 +#define TYPE_WS2805 32 //RGB + WW + CW //"Analog" types (40-47) #define TYPE_ONOFF 40 //binary output (relays etc.; NOT PWM) #define TYPE_ANALOG_1CH 41 //single channel PWM. Uses value of brightest RGBW channel @@ -298,6 +299,7 @@ #define IS_DIGITAL(t) (((t) > 15 && (t) < 40) || ((t) > 47 && (t) < 64)) //digital are 16-39 and 48-63 #define IS_2PIN(t) ((t) > 47 && (t) < 64) #define IS_16BIT(t) ((t) == TYPE_UCS8903 || (t) == TYPE_UCS8904) +#define IS_ONOFF(t) ((t) == 40) #define IS_PWM(t) ((t) > 40 && (t) < 46) //does not include on/Off type #define NUM_PWM_PINS(t) ((t) - 40) //for analog PWM 41-45 only #define IS_VIRTUAL(t) ((t) >= 80 && (t) < 96) //this was a poor choice a better would be 96-111 @@ -513,11 +515,11 @@ //this is merely a default now and can be changed at runtime #ifndef LEDPIN -#if defined(ESP8266) || (defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM)) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ARDUINO_ESP32_PICO) - #define LEDPIN 2 // GPIO2 (D4) on Wemos D1 mini compatible boards, and on boards where GPIO16 is not available -#else - #define LEDPIN 16 // aligns with GPIO2 (D4) on Wemos D1 mini32 compatible boards -#endif +//#if defined(ESP8266) || (defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM)) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(ARDUINO_ESP32_PICO) + #define LEDPIN 2 // GPIO2 (D4) on Wemos D1 mini compatible boards, safe to use on any board +//#else +// #define LEDPIN 16 // aligns with GPIO2 (D4) on Wemos D1 mini32 compatible boards +//#endif #endif #ifdef WLED_ENABLE_DMX diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index 061d5a9ac..fee523ffc 100644 --- a/wled00/data/settings_leds.htm +++ b/wled00/data/settings_leds.htm @@ -23,6 +23,8 @@ function isD2P(t) { return t > 47 && t < 64; } // is digital 2 pin type function is16b(t) { return t == 26 || t == 29 } // is digital 16 bit type function isVir(t) { return t >= 80 && t < 96; } // is virtual type + function hasW(t) { return (t >= 18 && t <= 21) || (t >= 28 && t <= 32) || (t >= 44 && t <= 45) || (t >= 88 && t <= 89); } + function hasCCT(t) { return t == 20 || t == 21 || t == 42 || t == 45 || t == 28 || t == 32; } // https://www.educative.io/edpresso/how-to-dynamically-load-a-js-file-in-javascript function loadJS(FILE_URL, async = true) { let scE = d.createElement("script"); @@ -203,7 +205,7 @@ function UI(change=false) { - let isRGBW = false, gRGBW = false, memu = 0; + let gRGBW = false, memu = 0; let busMA = 0; let sLC = 0, sPC = 0, sDI = 0, maxLC = 0; const ablEN = d.Sf.ABL.checked; @@ -243,15 +245,15 @@ d.Sf["MA"+n].min = (isVir(t) || isAna(t)) ? 0 : 250; } gId("rf"+n).onclick = (t == 31) ? (()=>{return false}) : (()=>{}); // prevent change for TM1814 - gRGBW |= isRGBW = ((t > 17 && t < 22) || (t > 27 && t < 32) || (t > 40 && t < 46 && t != 43) || t == 88); // RGBW checkbox, TYPE_xxxx values from const.h + gRGBW |= hasW(t); // RGBW checkbox, TYPE_xxxx values from const.h gId("co"+n).style.display = (isVir(t) || isAna(t)) ? "none":"inline"; // hide color order for PWM - gId("dig"+n+"w").style.display = (isDig(t) && isRGBW) ? "inline":"none"; // show swap channels dropdown - if (!(isDig(t) && isRGBW)) d.Sf["WO"+n].value = 0; // reset swapping + gId("dig"+n+"w").style.display = (isDig(t) && hasW(t)) ? "inline":"none"; // show swap channels dropdown + if (!(isDig(t) && hasW(t))) d.Sf["WO"+n].value = 0; // reset swapping gId("dig"+n+"c").style.display = (isAna(t)) ? "none":"inline"; // hide count for analog gId("dig"+n+"r").style.display = (isVir(t)) ? "none":"inline"; // hide reversed for virtual gId("dig"+n+"s").style.display = (isVir(t) || isAna(t)) ? "none":"inline"; // hide skip 1st for virtual & analog gId("dig"+n+"f").style.display = (isDig(t)) ? "inline":"none"; // hide refresh - gId("dig"+n+"a").style.display = (isRGBW) ? "inline":"none"; // auto calculate white + gId("dig"+n+"a").style.display = (hasW(t)) ? "inline":"none"; // auto calculate white gId("dig"+n+"l").style.display = (isD2P(t) || isPWM(t)) ? "inline":"none"; // bus clock speed / PWM speed (relative) (not On/Off) gId("rev"+n).innerHTML = isAna(t) ? "Inverted output":"Reversed (rotated 180°)"; // change reverse text for analog //gId("psd"+n).innerHTML = isAna(t) ? "Index:":"Start:"; // change analog start description @@ -386,6 +388,7 @@ ${i+1}: \ \ \ +\ \ \ \ diff --git a/wled00/file.cpp b/wled00/file.cpp index 6511d4d07..dc41c6f12 100644 --- a/wled00/file.cpp +++ b/wled00/file.cpp @@ -376,20 +376,15 @@ void updateFSInfo() { } -#if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) +#ifdef ARDUINO_ARCH_ESP32 // caching presets in PSRAM may prevent occasional flashes seen when HomeAssitant polls WLED // original idea by @akaricchi (https://github.com/Akaricchi) -// returns a pointer to the PSRAM buffer updates size parameter +// returns a pointer to the PSRAM buffer, updates size parameter static const uint8_t *getPresetCache(size_t &size) { static unsigned long presetsCachedTime; static uint8_t *presetsCached; static size_t presetsCachedSize; - if (!psramFound()) { - size = 0; - return nullptr; - } - if (presetsModifiedTime != presetsCachedTime) { if (presetsCached) { free(presetsCached); @@ -421,8 +416,8 @@ bool handleFileRead(AsyncWebServerRequest* request, String path){ DEBUG_PRINT(F("WS FileRead: ")); DEBUG_PRINTLN(path); if(path.endsWith("/")) path += "index.htm"; if(path.indexOf(F("sec")) > -1) return false; - #if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) - if (path.endsWith(FPSTR(getPresetsFileName()))) { + #ifdef ARDUINO_ARCH_ESP32 + if (psramFound() && path.endsWith(FPSTR(getPresetsFileName()))) { size_t psize; const uint8_t *presets = getPresetCache(psize); if (presets) { diff --git a/wled00/improv.cpp b/wled00/improv.cpp index 9c2fb20e7..0090b4bd6 100644 --- a/wled00/improv.cpp +++ b/wled00/improv.cpp @@ -210,7 +210,7 @@ void sendImprovInfoResponse() { //Use serverDescription if it has been changed from the default "WLED", else mDNS name bool useMdnsName = (strcmp(serverDescription, "WLED") == 0 && strlen(cmDNS) > 0); char vString[20]; - sprintf_P(vString, PSTR("0.15.0-b1/%i"), VERSION); + sprintf_P(vString, PSTR("0.15.0-b2/%i"), VERSION); const char *str[4] = {"WLED", vString, bString, useMdnsName ? cmDNS : serverDescription}; sendImprovRPCResult(ImprovRPCType::Request_Info, 4, str); diff --git a/wled00/json.cpp b/wled00/json.cpp index 113b2b1f5..29464a9d9 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -752,7 +752,7 @@ void serializeInfo(JsonObject root) #endif root[F("freeheap")] = ESP.getFreeHeap(); - #if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) + #if defined(ARDUINO_ARCH_ESP32) if (psramFound()) root[F("psram")] = ESP.getFreePsram(); #endif root[F("uptime")] = millis()/1000 + rolloverMillis*4294967; diff --git a/wled00/pin_manager.cpp b/wled00/pin_manager.cpp index 044dc6c92..34705ee94 100644 --- a/wled00/pin_manager.cpp +++ b/wled00/pin_manager.cpp @@ -209,11 +209,10 @@ bool PinManagerClass::allocatePin(byte gpio, bool output, PinOwner tag) // if tag is set to PinOwner::None, checks for ANY owner of the pin. // if tag is set to any other value, checks if that tag is the current owner of the pin. -bool PinManagerClass::isPinAllocated(byte gpio, PinOwner tag) +bool PinManagerClass::isPinAllocated(byte gpio, PinOwner tag) const { if (!isPinOk(gpio, false)) return true; if ((tag != PinOwner::None) && (ownerTag[gpio] != tag)) return false; - if (gpio >= WLED_NUM_PINS) return false; // catch error case, to avoid array out-of-bounds access byte by = gpio >> 3; byte bi = gpio - (by<<3); return bitRead(pinAlloc[by], bi); @@ -236,8 +235,9 @@ bool PinManagerClass::isPinAllocated(byte gpio, PinOwner tag) */ // Check if supplied GPIO is ok to use -bool PinManagerClass::isPinOk(byte gpio, bool output) +bool PinManagerClass::isPinOk(byte gpio, bool output) const { + if (gpio >= WLED_NUM_PINS) return false; // catch error case, to avoid array out-of-bounds access #ifdef ARDUINO_ARCH_ESP32 if (digitalPinIsValid(gpio)) { #if defined(CONFIG_IDF_TARGET_ESP32C3) @@ -257,9 +257,7 @@ bool PinManagerClass::isPinOk(byte gpio, bool output) // GPIO46 is input only and pulled down #else if (gpio > 5 && gpio < 12) return false; //SPI flash pins - #ifdef BOARD_HAS_PSRAM - if (gpio == 16 || gpio == 17) return false; //PSRAM pins - #endif + if (gpio == 16 || gpio == 17) return !psramFound(); //PSRAM pins on ESP32 (these are IO) #endif if (output) return digitalPinCanOutput(gpio); else return true; @@ -272,8 +270,8 @@ bool PinManagerClass::isPinOk(byte gpio, bool output) return false; } -PinOwner PinManagerClass::getPinOwner(byte gpio) { - if (gpio >= WLED_NUM_PINS) return PinOwner::None; // catch error case, to avoid array out-of-bounds access +PinOwner PinManagerClass::getPinOwner(byte gpio) const +{ if (!isPinOk(gpio, false)) return PinOwner::None; return ownerTag[gpio]; } diff --git a/wled00/pin_manager.h b/wled00/pin_manager.h index 6a50df588..464bd54ae 100644 --- a/wled00/pin_manager.h +++ b/wled00/pin_manager.h @@ -108,11 +108,11 @@ class PinManagerClass { inline void deallocatePin(byte gpio) { deallocatePin(gpio, PinOwner::None); } // will return true for reserved pins - bool isPinAllocated(byte gpio, PinOwner tag = PinOwner::None); + bool isPinAllocated(byte gpio, PinOwner tag = PinOwner::None) const; // will return false for reserved pins - bool isPinOk(byte gpio, bool output = true); + bool isPinOk(byte gpio, bool output = true) const; - PinOwner getPinOwner(byte gpio); + PinOwner getPinOwner(byte gpio) const; #ifdef ARDUINO_ARCH_ESP32 byte allocateLedc(byte channels); diff --git a/wled00/presets.cpp b/wled00/presets.cpp index 1b13184d2..5a0af0e7f 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -56,11 +56,9 @@ static void doSaveState() { size_t len = measureJson(*fileDoc) + 1; DEBUG_PRINTLN(len); // if possible use SPI RAM on ESP32 - #if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) if (psramFound()) tmpRAMbuffer = (char*) ps_malloc(len); else - #endif tmpRAMbuffer = (char*) malloc(len); if (tmpRAMbuffer!=nullptr) { serializeJson(*fileDoc, tmpRAMbuffer, len); diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 07304e77a..878eb26a4 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -240,7 +240,7 @@ void WLED::loop() DEBUG_PRINT(F("Runtime: ")); DEBUG_PRINTLN(millis()); DEBUG_PRINT(F("Unix time: ")); toki.printTime(toki.getTime()); DEBUG_PRINT(F("Free heap: ")); DEBUG_PRINTLN(ESP.getFreeHeap()); - #if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) + #if defined(ARDUINO_ARCH_ESP32) if (psramFound()) { DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB"); DEBUG_PRINT(F("Free PSRAM: ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB"); @@ -366,42 +366,13 @@ void WLED::setup() #endif DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap()); -#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) -/* - * The following code is obsolete as PinManager::isPinOK() will return false for reserved GPIO. - * Additionally xml.cpp will inform UI about reserved GPIO. - * - - #if defined(CONFIG_IDF_TARGET_ESP32S3) - // S3: reserve GPIO 33-37 for "octal" PSRAM - managed_pin_type pins[] = { {33, true}, {34, true}, {35, true}, {36, true}, {37, true} }; - pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM); - #elif defined(CONFIG_IDF_TARGET_ESP32S2) - // S2: reserve GPIO 26-32 for PSRAM (may fail due to isPinOk() but that will also prevent other allocation) - managed_pin_type pins[] = { {26, true}, {27, true}, {28, true}, {29, true}, {30, true}, {31, true}, {32, true} }; - pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM); - #elif defined(CONFIG_IDF_TARGET_ESP32C3) - // C3: reserve GPIO 12-17 for PSRAM (may fail due to isPinOk() but that will also prevent other allocation) - managed_pin_type pins[] = { {12, true}, {13, true}, {14, true}, {15, true}, {16, true}, {17, true} }; - pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM); - #else - // GPIO16/GPIO17 reserved for SPI RAM - managed_pin_type pins[] = { {16, true}, {17, true} }; - pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM); - #endif -*/ - #if defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) - pDoc = new PSRAMDynamicJsonDocument(2*JSON_BUFFER_SIZE); - if (!pDoc) pDoc = new PSRAMDynamicJsonDocument(JSON_BUFFER_SIZE); // falback if double sized buffer could not be allocated - // if the above still fails requestJsonBufferLock() will always return false preventing crashes +#if defined(ARDUINO_ARCH_ESP32) + pDoc = new PSRAMDynamicJsonDocument((psramFound() ? 2 : 1)*JSON_BUFFER_SIZE); + // if the above fails requestJsonBufferLock() will always return false preventing crashes if (psramFound()) { DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB"); DEBUG_PRINT(F("Free PSRAM : ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB"); } - #else - if (!pDoc) pDoc = &gDoc; // just in case ... (it should be globally assigned) - DEBUG_PRINTLN(F("PSRAM not used.")); - #endif #endif #if defined(ARDUINO_ESP32_PICO) // special handling for PICO-D4: gpio16+17 are in use for onboard SPI FLASH (not PSRAM) @@ -409,9 +380,6 @@ void WLED::setup() pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM); #endif - //DEBUG_PRINT(F("LEDs inited. heap usage ~")); - //DEBUG_PRINTLN(heapPreAlloc - ESP.getFreeHeap()); - #if defined(WLED_DEBUG) && !defined(WLED_DEBUG_HOST) pinManager.allocatePin(hardwareTX, true, PinOwner::DebugOut); // TX (GPIO1 on ESP32) reserved for debug output #endif @@ -555,7 +523,7 @@ void WLED::setup() void WLED::beginStrip() { // Initialize NeoPixel Strip and button - strip.finalizeInit(); // busses created during deserializeConfig() + strip.finalizeInit(); // busses created during deserializeConfig() if config existed strip.makeAutoSegments(); strip.setBrightness(0); strip.setShowCallback(handleOverlayDraw); diff --git a/wled00/wled.h b/wled00/wled.h index 3e1e9f80f..62fd4ec4d 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -3,12 +3,12 @@ /* Main sketch, global variable declarations @title WLED project sketch - @version 0.15.0-b1 + @version 0.15.0-b2 @author Christian Schwinne */ // version code in format yymmddb (b = daily build) -#define VERSION 2403220 +#define VERSION 2403240 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG @@ -158,7 +158,7 @@ // The following is a construct to enable code to compile without it. // There is a code that will still not use PSRAM though: // AsyncJsonResponse is a derived class that implements DynamicJsonDocument (AsyncJson-v6.h) -#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) +#if defined(ARDUINO_ARCH_ESP32) struct PSRAM_Allocator { void* allocate(size_t size) { if (psramFound()) return ps_malloc(size); // use PSRAM if it exists @@ -781,7 +781,7 @@ WLED_GLOBAL int8_t spi_sclk _INIT(SPISCLKPIN); #endif // global ArduinoJson buffer -#if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) && defined(WLED_USE_PSRAM) +#if defined(ARDUINO_ARCH_ESP32) WLED_GLOBAL JsonDocument *pDoc _INIT(nullptr); #else WLED_GLOBAL StaticJsonDocument gDoc; diff --git a/wled00/xml.cpp b/wled00/xml.cpp index fddc242ea..fc754c4a2 100755 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -163,7 +163,7 @@ void appendGPIOinfo() { //Note: Using pin 3 (RX) disables Adalight / Serial JSON - #if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM) + #if defined(ARDUINO_ARCH_ESP32) #if !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32C3) if (psramFound()) oappend(SET_F(",16,17")); // GPIO16 & GPIO17 reserved for SPI RAM on ESP32 (not on S2, S3 or C3) #elif defined(CONFIG_IDF_TARGET_ESP32S3) From 4b19759dd6845f6eba8a8e38937e6939a86d2896 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sun, 24 Mar 2024 20:34:22 +0100 Subject: [PATCH 104/114] Rotary encoder palette count bugfix --- .../usermod_v2_rotary_encoder_ui_ALT.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h b/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h index 6a15b520b..e5a5f24f7 100644 --- a/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h +++ b/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h @@ -392,26 +392,26 @@ byte RotaryEncoderUIUsermod::readPin(uint8_t pin) { * modes_alpha_indexes and palettes_alpha_indexes. */ void RotaryEncoderUIUsermod::sortModesAndPalettes() { - DEBUG_PRINTLN(F("Sorting modes and palettes.")); + DEBUG_PRINT(F("Sorting modes: ")); DEBUG_PRINTLN(strip.getModeCount()); //modes_qstrings = re_findModeStrings(JSON_mode_names, strip.getModeCount()); modes_qstrings = strip.getModeDataSrc(); modes_alpha_indexes = re_initIndexArray(strip.getModeCount()); re_sortModes(modes_qstrings, modes_alpha_indexes, strip.getModeCount(), MODE_SORT_SKIP_COUNT); - palettes_qstrings = re_findModeStrings(JSON_palette_names, strip.getPaletteCount()+strip.customPalettes.size()); - palettes_alpha_indexes = re_initIndexArray(strip.getPaletteCount()+strip.customPalettes.size()); + DEBUG_PRINT(F("Sorting palettes: ")); DEBUG_PRINT(strip.getPaletteCount()); DEBUG_PRINT('/'); DEBUG_PRINTLN(strip.customPalettes.size()); + palettes_qstrings = re_findModeStrings(JSON_palette_names, strip.getPaletteCount()); + palettes_alpha_indexes = re_initIndexArray(strip.getPaletteCount()); if (strip.customPalettes.size()) { for (int i=0; i Date: Tue, 26 Mar 2024 17:18:52 +0100 Subject: [PATCH 105/114] fileDoc removal (optimisation) --- wled00/json.cpp | 2 +- wled00/playlist.cpp | 3 +-- wled00/presets.cpp | 29 +++++++++++++---------------- wled00/util.cpp | 2 -- wled00/wled.h | 3 +-- wled00/ws.cpp | 2 +- 6 files changed, 17 insertions(+), 24 deletions(-) diff --git a/wled00/json.cpp b/wled00/json.cpp index 29464a9d9..76cb4667f 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -303,7 +303,7 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId) return true; } -// deserializes WLED state (fileDoc points to doc object if called from web server) +// deserializes WLED state // presetId is non-0 if called from handlePreset() bool deserializeState(JsonObject root, byte callMode, byte presetId) { diff --git a/wled00/playlist.cpp b/wled00/playlist.cpp index 882ccb0e0..67c4f6049 100644 --- a/wled00/playlist.cpp +++ b/wled00/playlist.cpp @@ -125,8 +125,7 @@ int16_t loadPlaylist(JsonObject playlistObj, byte presetId) { void handlePlaylist() { static unsigned long presetCycledTime = 0; - // if fileDoc is not null JSON buffer is in use so just quit - if (currentPlaylist < 0 || playlistEntries == nullptr || fileDoc != nullptr) return; + if (currentPlaylist < 0 || playlistEntries == nullptr) return; if (millis() - presetCycledTime > (100*playlistEntryDur)) { presetCycledTime = millis(); diff --git a/wled00/presets.cpp b/wled00/presets.cpp index 5a0af0e7f..857b2fbb3 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -27,7 +27,7 @@ static void doSaveState() { unsigned long start = millis(); while (strip.isUpdating() && millis()-start < (2*FRAMETIME_FIXED)+1) yield(); // wait 2 frames - if (!requestJSONBufferLock(10)) return; // will set fileDoc + if (!requestJSONBufferLock(10)) return; initPresetsFile(); // just in case if someone deleted presets.json using /edit JsonObject sObj = pDoc->to(); @@ -53,7 +53,7 @@ static void doSaveState() { #if defined(ARDUINO_ARCH_ESP32) if (!persist) { if (tmpRAMbuffer!=nullptr) free(tmpRAMbuffer); - size_t len = measureJson(*fileDoc) + 1; + size_t len = measureJson(*pDoc) + 1; DEBUG_PRINTLN(len); // if possible use SPI RAM on ESP32 if (psramFound()) @@ -61,13 +61,13 @@ static void doSaveState() { else tmpRAMbuffer = (char*) malloc(len); if (tmpRAMbuffer!=nullptr) { - serializeJson(*fileDoc, tmpRAMbuffer, len); + serializeJson(*pDoc, tmpRAMbuffer, len); } else { - writeObjectToFileUsingId(getPresetsFileName(persist), presetToSave, fileDoc); + writeObjectToFileUsingId(getPresetsFileName(persist), presetToSave, pDoc); } } else #endif - writeObjectToFileUsingId(getPresetsFileName(persist), presetToSave, fileDoc); + writeObjectToFileUsingId(getPresetsFileName(persist), presetToSave, pDoc); if (persist) presetsModifiedTime = toki.second(); //unix time releaseJSONBufferLock(); @@ -152,7 +152,7 @@ void handlePresets() return; } - if (presetToApply == 0 || fileDoc) return; // no preset waiting to apply, or JSON buffer is already allocated, return to loop until free + if (presetToApply == 0 || !requestJSONBufferLock(9)) return; // no preset waiting to apply, or JSON buffer is already allocated, return to loop until free bool changePreset = false; uint8_t tmpPreset = presetToApply; // store temporary since deserializeState() may call applyPreset() @@ -160,9 +160,6 @@ void handlePresets() JsonObject fdo; - // allocate buffer - if (!requestJSONBufferLock(9)) return; // will also assign fileDoc - presetToApply = 0; //clear request for preset callModeToApply = 0; @@ -171,14 +168,14 @@ void handlePresets() #ifdef ARDUINO_ARCH_ESP32 if (tmpPreset==255 && tmpRAMbuffer!=nullptr) { - deserializeJson(*fileDoc,tmpRAMbuffer); + deserializeJson(*pDoc,tmpRAMbuffer); errorFlag = ERR_NONE; } else #endif { - errorFlag = readObjectFromFileUsingId(getPresetsFileName(tmpPreset < 255), tmpPreset, fileDoc) ? ERR_NONE : ERR_FS_PLOAD; + errorFlag = readObjectFromFileUsingId(getPresetsFileName(tmpPreset < 255), tmpPreset, pDoc) ? ERR_NONE : ERR_FS_PLOAD; } - fdo = fileDoc->as(); + fdo = pDoc->as(); //HTTP API commands const char* httpwin = fdo["win"]; @@ -205,13 +202,13 @@ void handlePresets() } #endif - releaseJSONBufferLock(); // will also clear fileDoc + releaseJSONBufferLock(); if (changePreset) notify(tmpMode); // force UDP notification stateUpdated(tmpMode); // was colorUpdated() if anything breaks updateInterfaces(tmpMode); } -//called from handleSet(PS=) [network callback (fileDoc==nullptr), IR (irrational), deserializeState, UDP] and deserializeState() [network callback (filedoc!=nullptr)] +//called from handleSet(PS=) [network callback (sObj is empty), IR (irrational), deserializeState, UDP] and deserializeState() [network callback (filedoc!=nullptr)] void savePreset(byte index, const char* pname, JsonObject sObj) { if (!saveName) saveName = new char[33]; @@ -249,7 +246,7 @@ void savePreset(byte index, const char* pname, JsonObject sObj) if (sObj[F("playlist")].isNull()) { // we will save API call immediately (often causes presets.json corruption) presetToSave = 0; - if (index <= 250 && fileDoc) { // cannot save API calls to temporary preset (255) + if (index <= 250) { // cannot save API calls to temporary preset (255) sObj.remove("o"); sObj.remove("v"); sObj.remove("time"); @@ -257,7 +254,7 @@ void savePreset(byte index, const char* pname, JsonObject sObj) sObj.remove(F("psave")); if (sObj["n"].isNull()) sObj["n"] = saveName; initPresetsFile(); // just in case if someone deleted presets.json using /edit - writeObjectToFileUsingId(getPresetsFileName(), index, fileDoc); + writeObjectToFileUsingId(getPresetsFileName(), index, pDoc); presetsModifiedTime = toki.second(); //unix time updateFSInfo(); } diff --git a/wled00/util.cpp b/wled00/util.cpp index 1bd8ec319..ad7e4b670 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -228,7 +228,6 @@ bool requestJSONBufferLock(uint8_t module) DEBUG_PRINT(F("JSON buffer locked. (")); DEBUG_PRINT(jsonBufferLock); DEBUG_PRINTLN(")"); - fileDoc = pDoc; // used for applying presets (presets.cpp) pDoc->clear(); return true; } @@ -239,7 +238,6 @@ void releaseJSONBufferLock() DEBUG_PRINT(F("JSON buffer released. (")); DEBUG_PRINT(jsonBufferLock); DEBUG_PRINTLN(")"); - fileDoc = nullptr; jsonBufferLock = 0; } diff --git a/wled00/wled.h b/wled00/wled.h index 62fd4ec4d..1361f9f7e 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2403240 +#define VERSION 2403260 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG @@ -692,7 +692,6 @@ WLED_GLOBAL uint16_t olen _INIT(0); WLED_GLOBAL size_t fsBytesUsed _INIT(0); WLED_GLOBAL size_t fsBytesTotal _INIT(0); WLED_GLOBAL unsigned long presetsModifiedTime _INIT(0L); -WLED_GLOBAL JsonDocument* fileDoc; WLED_GLOBAL bool doCloseFile _INIT(false); // presets diff --git a/wled00/ws.cpp b/wled00/ws.cpp index 16636bb1e..307a0959e 100644 --- a/wled00/ws.cpp +++ b/wled00/ws.cpp @@ -55,7 +55,7 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp } else { verboseResponse = deserializeState(root); } - releaseJSONBufferLock(); // will clean fileDoc + releaseJSONBufferLock(); if (!interfaceUpdateCallMode) { // individual client response only needed if no WS broadcast soon if (verboseResponse) { From d6e73fde50bd5836299c2a1b3226dfba6e640f48 Mon Sep 17 00:00:00 2001 From: Woody Date: Tue, 26 Mar 2024 17:34:01 +0100 Subject: [PATCH 106/114] only create bin.gz files for esp8266 --- pio-scripts/output_bins.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pio-scripts/output_bins.py b/pio-scripts/output_bins.py index 092754c38..10077bca4 100644 --- a/pio-scripts/output_bins.py +++ b/pio-scripts/output_bins.py @@ -22,7 +22,7 @@ def create_release(source): if release_name: version = _get_cpp_define_value(env, "WLED_VERSION") release_file = os.path.join(OUTPUT_DIR, "release", f"WLED_{version}_{release_name}.bin") - release_gz_file = os.path.join(OUTPUT_DIR, "release_gz", f"WLED_{version}_{release_name}.bin.gz") + release_gz_file = release_file + ".gz" print(f"Copying {source} to {release_file}") shutil.copy(source, release_file) print(f"Creating gzip file {release_gz_file} from {release_file}") @@ -42,6 +42,10 @@ def bin_rename_copy(source, target, env): shutil.move("firmware.map", map_file) def bin_gzip(source, target): + # only create gzip for esp8266 + if not env["PIOPLATFORM"] == "espressif8266": + return + with open(source,"rb") as fp: with gzip.open(target, "wb", compresslevel = 9) as f: shutil.copyfileobj(fp, f) From d7739f9764a72e9174e584d3da1cd39def980cea Mon Sep 17 00:00:00 2001 From: Woody Date: Tue, 26 Mar 2024 17:41:28 +0100 Subject: [PATCH 107/114] Revert "Change path for ESP02-binary" This reverts commit e3271b8082e6fa776c659e22f1f2987011cf48b8. --- .github/workflows/wled-ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/wled-ci.yml b/.github/workflows/wled-ci.yml index feb0e531a..32dae8777 100644 --- a/.github/workflows/wled-ci.yml +++ b/.github/workflows/wled-ci.yml @@ -61,7 +61,7 @@ jobs: name: firmware-${{ matrix.environment }} path: | build_output/release/*.bin - build_output/release_gz/*_ESP02*.bin.gz + build_output/release/*_ESP02*.bin.gz release: name: Create Release runs-on: ubuntu-latest From 5d152baac019c435d01880af5aaf07de67526b1d Mon Sep 17 00:00:00 2001 From: Woody Date: Wed, 27 Mar 2024 21:19:03 +0100 Subject: [PATCH 108/114] Do not create release_gz folder --- pio-scripts/output_bins.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pio-scripts/output_bins.py b/pio-scripts/output_bins.py index 10077bca4..6df06d8c8 100644 --- a/pio-scripts/output_bins.py +++ b/pio-scripts/output_bins.py @@ -13,7 +13,7 @@ def _get_cpp_define_value(env, define): return None -def _create_dirs(dirs=["map", "release", "release_gz"]): +def _create_dirs(dirs=["map", "release"]): for d in dirs: os.makedirs(os.path.join(OUTPUT_DIR, d), exist_ok=True) From 6f6356e617caa890e0be8fdf6f8864a2389a337f Mon Sep 17 00:00:00 2001 From: Woody Date: Wed, 27 Mar 2024 21:34:51 +0100 Subject: [PATCH 109/114] fix print output for bin.gz file --- pio-scripts/output_bins.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pio-scripts/output_bins.py b/pio-scripts/output_bins.py index 6df06d8c8..e4a458a9e 100644 --- a/pio-scripts/output_bins.py +++ b/pio-scripts/output_bins.py @@ -25,7 +25,6 @@ def create_release(source): release_gz_file = release_file + ".gz" print(f"Copying {source} to {release_file}") shutil.copy(source, release_file) - print(f"Creating gzip file {release_gz_file} from {release_file}") bin_gzip(release_file, release_gz_file) def bin_rename_copy(source, target, env): @@ -45,7 +44,8 @@ def bin_gzip(source, target): # only create gzip for esp8266 if not env["PIOPLATFORM"] == "espressif8266": return - + + print(f"Creating gzip file {target} from {source}") with open(source,"rb") as fp: with gzip.open(target, "wb", compresslevel = 9) as f: shutil.copyfileobj(fp, f) From 5f37c19d42051f570b801d520c5f59616d01fbd5 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Thu, 28 Mar 2024 16:03:06 +0100 Subject: [PATCH 110/114] PSRAM fix & CCT IC - prevent PSRAM use on ESP32 rev.1 without compile fix - add runtime selection for CCT IC (Athom 15W bulb) --- platformio.ini | 2 +- tools/WLED_ESP32-wrover_4MB.csv | 6 ++--- wled00/bus_manager.cpp | 39 +++++++++++++++++---------------- wled00/cfg.cpp | 2 ++ wled00/data/settings_leds.htm | 1 + wled00/file.cpp | 2 +- wled00/json.cpp | 2 +- wled00/presets.cpp | 2 +- wled00/set.cpp | 1 + wled00/wled.cpp | 9 +++++--- wled00/wled.h | 18 ++++++++++----- wled00/xml.cpp | 1 + 12 files changed, 51 insertions(+), 34 deletions(-) mode change 100755 => 100644 wled00/set.cpp mode change 100755 => 100644 wled00/xml.cpp diff --git a/platformio.ini b/platformio.ini index c0467c8f3..345d66d91 100644 --- a/platformio.ini +++ b/platformio.ini @@ -389,7 +389,7 @@ platform = ${esp32.platform} board = ttgo-t7-v14-mini32 board_build.f_flash = 80000000L board_build.flash_mode = qio -board_build.partitions = ${esp32.default_partitions} +board_build.partitions = tools/WLED_ESP32-wrover_4MB.csv build_unflags = ${common.build_unflags} build_flags = ${common.build_flags_esp32} -D WLED_RELEASE_NAME=ESP32_WROVER -DBOARD_HAS_PSRAM -mfix-esp32-psram-cache-issue ;; Older ESP32 (rev.<3) need a PSRAM fix (increases static RAM used) https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/external-ram.html diff --git a/tools/WLED_ESP32-wrover_4MB.csv b/tools/WLED_ESP32-wrover_4MB.csv index a179a89d0..39c88e543 100644 --- a/tools/WLED_ESP32-wrover_4MB.csv +++ b/tools/WLED_ESP32-wrover_4MB.csv @@ -1,6 +1,6 @@ # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, -app0, app, ota_0, 0x10000, 0x180000, -app1, app, ota_1, 0x190000,0x180000, -spiffs, data, spiffs, 0x310000,0xF0000, +app0, app, ota_0, 0x10000, 0x1A0000, +app1, app, ota_1, 0x1B0000,0x1A0000, +spiffs, data, spiffs, 0x350000,0xB0000, diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index eeb9a15e4..88b4cc32b 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -9,6 +9,8 @@ #include "bus_wrapper.h" #include "bus_manager.h" +extern bool cctICused; + //colors.cpp uint32_t colorBalanceFromKelvin(uint16_t kelvin, uint32_t rgb); @@ -210,7 +212,7 @@ void BusDigital::show() { if (_data) { size_t channels = getNumberOfChannels(); - int16_t oldCCT = _cct; // temporarily save bus CCT + int16_t oldCCT = Bus::_cct; // temporarily save bus CCT for (size_t i=0; i<_len; i++) { size_t offset = i * channels; uint8_t co = _colorOrderMap.getPixelColorOrder(i+_start, _colorOrder); @@ -229,7 +231,7 @@ void BusDigital::show() { // unfortunately as a segment may span multiple buses or a bus may contain multiple segments and each segment may have different CCT // we need to extract and appy CCT value for each pixel individually even though all buses share the same _cct variable // TODO: there is an issue if CCT is calculated from RGB value (_cct==-1), we cannot do that with double buffer - _cct = _data[offset+channels-1]; + Bus::_cct = _data[offset+channels-1]; Bus::calculateCCT(c, cctWW, cctCW); } uint16_t pix = i; @@ -241,7 +243,7 @@ void BusDigital::show() { if (_skip) PolyBus::setPixelColor(_busPtr, _iType, 0, 0, _colorOrderMap.getPixelColorOrder(_start, _colorOrder)); // paint skipped pixels black #endif for (int i=1; i<_skip; i++) PolyBus::setPixelColor(_busPtr, _iType, i, 0, _colorOrderMap.getPixelColorOrder(_start, _colorOrder)); // paint skipped pixels black - _cct = oldCCT; + Bus::_cct = oldCCT; } else { if (newBri < _bri) { uint16_t hwLen = _len; @@ -291,7 +293,7 @@ void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { if (!_valid) return; uint8_t cctWW = 0, cctCW = 0; if (hasWhite()) c = autoWhiteCalc(c); - if (_cct >= 1900) c = colorBalanceFromKelvin(_cct, c); //color correction from CCT + if (Bus::_cct >= 1900) c = colorBalanceFromKelvin(Bus::_cct, c); //color correction from CCT if (_data) { size_t offset = pix * getNumberOfChannels(); if (hasRGB()) { @@ -302,7 +304,7 @@ void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { if (hasWhite()) _data[offset++] = W(c); // unfortunately as a segment may span multiple buses or a bus may contain multiple segments and each segment may have different CCT // we need to store CCT value for each pixel (if there is a color correction in play, convert K in CCT ratio) - if (hasCCT()) _data[offset] = _cct >= 1900 ? (_cct - 1900) >> 5 : (_cct < 0 ? 127 : _cct); // TODO: if _cct == -1 we simply ignore it + if (hasCCT()) _data[offset] = Bus::_cct >= 1900 ? (Bus::_cct - 1900) >> 5 : (Bus::_cct < 0 ? 127 : Bus::_cct); // TODO: if _cct == -1 we simply ignore it } else { if (_reversed) pix = _len - pix -1; pix += _skip; @@ -428,8 +430,8 @@ BusPwm::BusPwm(BusConfig &bc) void BusPwm::setPixelColor(uint16_t pix, uint32_t c) { if (pix != 0 || !_valid) return; //only react to first pixel if (_type != TYPE_ANALOG_3CH) c = autoWhiteCalc(c); - if (_cct >= 1900 && (_type == TYPE_ANALOG_3CH || _type == TYPE_ANALOG_4CH)) { - c = colorBalanceFromKelvin(_cct, c); //color correction from CCT + if (Bus::_cct >= 1900 && (_type == TYPE_ANALOG_3CH || _type == TYPE_ANALOG_4CH)) { + c = colorBalanceFromKelvin(Bus::_cct, c); //color correction from CCT } uint8_t r = R(c); uint8_t g = G(c); @@ -441,19 +443,18 @@ void BusPwm::setPixelColor(uint16_t pix, uint32_t c) { _data[0] = w; break; case TYPE_ANALOG_2CH: //warm white + cold white - #ifdef WLED_USE_IC_CCT - _data[0] = w; - _data[1] = cct; - #else - Bus::calculateCCT(c, _data[0], _data[1]); - #endif + if (cctICused) { + _data[0] = w; + _data[1] = Bus::_cct < 0 || Bus::_cct > 255 ? 127 : Bus::_cct; + } else { + Bus::calculateCCT(c, _data[0], _data[1]); + } break; case TYPE_ANALOG_5CH: //RGB + warm white + cold white - #ifdef WLED_USE_IC_CCT - _data[4] = cct; - #else - Bus::calculateCCT(c, w, _data[4]); - #endif + if (cctICused) + _data[4] = Bus::_cct < 0 || Bus::_cct > 255 ? 127 : Bus::_cct; + else + Bus::calculateCCT(c, w, _data[4]); case TYPE_ANALOG_4CH: //RGBW _data[3] = w; case TYPE_ANALOG_3CH: //standard dumb RGB @@ -618,7 +619,7 @@ BusNetwork::BusNetwork(BusConfig &bc) void BusNetwork::setPixelColor(uint16_t pix, uint32_t c) { if (!_valid || pix >= _len) return; if (_rgbw) c = autoWhiteCalc(c); - if (_cct >= 1900) c = colorBalanceFromKelvin(_cct, c); //color correction from CCT + if (Bus::_cct >= 1900) c = colorBalanceFromKelvin(Bus::_cct, c); //color correction from CCT uint16_t offset = pix * _UDPchannels; _data[offset] = R(c); _data[offset+1] = G(c); diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index a1794a755..4dd1d133a 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -110,6 +110,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { Bus::setGlobalAWMode(hw_led[F("rgbwm")] | AW_GLOBAL_DISABLED); CJSON(correctWB, hw_led["cct"]); CJSON(cctFromRgb, hw_led[F("cr")]); + CJSON(cctICused, hw_led[F("ic")]); CJSON(strip.cctBlending, hw_led[F("cb")]); Bus::setCCTBlend(strip.cctBlending); strip.setTargetFps(hw_led["fps"]); //NOP if 0, default 42 FPS @@ -767,6 +768,7 @@ void serializeConfig() { hw_led[F("ledma")] = 0; // no longer used hw_led["cct"] = correctWB; hw_led[F("cr")] = cctFromRgb; + hw_led[F("ic")] = cctICused; hw_led[F("cb")] = strip.cctBlending; hw_led["fps"] = strip.getTargetFps(); hw_led[F("rgbwm")] = Bus::getGlobalAWMode(); // global auto white mode override diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index fee523ffc..dddedd471 100644 --- a/wled00/data/settings_leds.htm +++ b/wled00/data/settings_leds.htm @@ -866,6 +866,7 @@ Swap:
Calculate CCT from RGB:
+ CCT IC used (Athom 15W):
CCT additive blending: %

Advanced

diff --git a/wled00/file.cpp b/wled00/file.cpp index dc41c6f12..eae50ff1d 100644 --- a/wled00/file.cpp +++ b/wled00/file.cpp @@ -417,7 +417,7 @@ bool handleFileRead(AsyncWebServerRequest* request, String path){ if(path.endsWith("/")) path += "index.htm"; if(path.indexOf(F("sec")) > -1) return false; #ifdef ARDUINO_ARCH_ESP32 - if (psramFound() && path.endsWith(FPSTR(getPresetsFileName()))) { + if (psramSafe && psramFound() && path.endsWith(FPSTR(getPresetsFileName()))) { size_t psize; const uint8_t *presets = getPresetCache(psize); if (presets) { diff --git a/wled00/json.cpp b/wled00/json.cpp index 76cb4667f..02eb22ba4 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -753,7 +753,7 @@ void serializeInfo(JsonObject root) root[F("freeheap")] = ESP.getFreeHeap(); #if defined(ARDUINO_ARCH_ESP32) - if (psramFound()) root[F("psram")] = ESP.getFreePsram(); + if (psramSafe && psramFound()) root[F("psram")] = ESP.getFreePsram(); #endif root[F("uptime")] = millis()/1000 + rolloverMillis*4294967; diff --git a/wled00/presets.cpp b/wled00/presets.cpp index 857b2fbb3..2916d337a 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -56,7 +56,7 @@ static void doSaveState() { size_t len = measureJson(*pDoc) + 1; DEBUG_PRINTLN(len); // if possible use SPI RAM on ESP32 - if (psramFound()) + if (psramSafe && psramFound()) tmpRAMbuffer = (char*) ps_malloc(len); else tmpRAMbuffer = (char*) malloc(len); diff --git a/wled00/set.cpp b/wled00/set.cpp old mode 100755 new mode 100644 index 6e7064bb3..9b3b6bea7 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -123,6 +123,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) autoSegments = request->hasArg(F("MS")); correctWB = request->hasArg(F("CCT")); cctFromRgb = request->hasArg(F("CR")); + cctICused = request->hasArg(F("IC")); strip.cctBlending = request->arg(F("CB")).toInt(); Bus::setCCTBlend(strip.cctBlending); Bus::setGlobalAWMode(request->arg(F("AW")).toInt()); diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 878eb26a4..7b753da3b 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -241,7 +241,7 @@ void WLED::loop() DEBUG_PRINT(F("Unix time: ")); toki.printTime(toki.getTime()); DEBUG_PRINT(F("Free heap: ")); DEBUG_PRINTLN(ESP.getFreeHeap()); #if defined(ARDUINO_ARCH_ESP32) - if (psramFound()) { + if (psramSafe && psramFound()) { DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB"); DEBUG_PRINT(F("Free PSRAM: ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB"); } @@ -367,9 +367,12 @@ void WLED::setup() DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap()); #if defined(ARDUINO_ARCH_ESP32) - pDoc = new PSRAMDynamicJsonDocument((psramFound() ? 2 : 1)*JSON_BUFFER_SIZE); + #ifndef BOARD_HAS_PSRAM + if (psramFound() && ESP.getChipRevision() < 3) psramSafe = false; + #endif + pDoc = new PSRAMDynamicJsonDocument((psramSafe && psramFound() ? 2 : 1)*JSON_BUFFER_SIZE); // if the above fails requestJsonBufferLock() will always return false preventing crashes - if (psramFound()) { + if (psramSafe && psramFound()) { DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB"); DEBUG_PRINT(F("Free PSRAM : ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB"); } diff --git a/wled00/wled.h b/wled00/wled.h index 1361f9f7e..35b99260a 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2403260 +#define VERSION 2403280 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG @@ -159,14 +159,15 @@ // There is a code that will still not use PSRAM though: // AsyncJsonResponse is a derived class that implements DynamicJsonDocument (AsyncJson-v6.h) #if defined(ARDUINO_ARCH_ESP32) +extern bool psramSafe; struct PSRAM_Allocator { void* allocate(size_t size) { - if (psramFound()) return ps_malloc(size); // use PSRAM if it exists - else return malloc(size); // fallback + if (psramSafe && psramFound()) return ps_malloc(size); // use PSRAM if it exists + else return malloc(size); // fallback } void* reallocate(void* ptr, size_t new_size) { - if (psramFound()) return ps_realloc(ptr, new_size); // use PSRAM if it exists - else return realloc(ptr, new_size); // fallback + if (psramSafe && psramFound()) return ps_realloc(ptr, new_size); // use PSRAM if it exists + else return realloc(ptr, new_size); // fallback } void deallocate(void* pointer) { free(pointer); @@ -348,6 +349,11 @@ WLED_GLOBAL bool useGlobalLedBuffer _INIT(true); // double buffering enabled on #endif WLED_GLOBAL bool correctWB _INIT(false); // CCT color correction of RGB color WLED_GLOBAL bool cctFromRgb _INIT(false); // CCT is calculated from RGB instead of using seg.cct +#ifdef WLED_USE_IC_CCT +WLED_GLOBAL bool cctICused _INIT(true); // CCT IC used (Athom 15W bulbs) +#else +WLED_GLOBAL bool cctICused _INIT(false); // CCT IC used (Athom 15W bulbs) +#endif WLED_GLOBAL bool gammaCorrectCol _INIT(true); // use gamma correction on colors WLED_GLOBAL bool gammaCorrectBri _INIT(false); // use gamma correction on brightness WLED_GLOBAL float gammaCorrectVal _INIT(2.8f); // gamma correction value @@ -705,6 +711,8 @@ WLED_GLOBAL byte optionType; WLED_GLOBAL bool doSerializeConfig _INIT(false); // flag to initiate saving of config WLED_GLOBAL bool doReboot _INIT(false); // flag to initiate reboot from async handlers +WLED_GLOBAL bool psramSafe _INIT(true); // is it safe to use PSRAM (on ESP32 rev.1; compiler fix used "-mfix-esp32-psram-cache-issue") + // status led #if defined(STATUSLED) WLED_GLOBAL unsigned long ledStatusLastMillis _INIT(0); diff --git a/wled00/xml.cpp b/wled00/xml.cpp old mode 100755 new mode 100644 index fc754c4a2..c91f0dd7e --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -360,6 +360,7 @@ void getSettingsJS(byte subPage, char* dest) sappend('c',SET_F("MS"),autoSegments); sappend('c',SET_F("CCT"),correctWB); + sappend('c',SET_F("IC"),cctICused); sappend('c',SET_F("CR"),cctFromRgb); sappend('v',SET_F("CB"),strip.cctBlending); sappend('v',SET_F("FR"),strip.getTargetFps()); From 2900bda8f971c72879f1c7684376472f06ae477a Mon Sep 17 00:00:00 2001 From: Will Miles Date: Fri, 29 Mar 2024 09:33:12 -0400 Subject: [PATCH 111/114] Select ESP8266 framework version via platform By explicitly listing an unversioned framework dependency in 'platform_packages', we were overriding the selection via the 'platform' specification, allowing PlatformIO to select any random version. Remove this line to allow 'platform' to add the framework dependency with the expected version. --- platformio.ini | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index 345d66d91..0e09b499b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -41,8 +41,7 @@ arduino_core_git = https://github.com/platformio/platform-espressif8266#feature/ platform_wled_default = ${common.arduino_core_3_1_2} # We use 2.7.4.7 for all, includes PWM flicker fix and Wstring optimization #platform_packages = tasmota/framework-arduinoespressif8266 @ 3.20704.7 -platform_packages = platformio/framework-arduinoespressif8266 - platformio/toolchain-xtensa @ ~2.100300.220621 #2.40802.200502 +platform_packages = platformio/toolchain-xtensa @ ~2.100300.220621 #2.40802.200502 platformio/tool-esptool #@ ~1.413.0 platformio/tool-esptoolpy #@ ~1.30000.0 From f21ab3588d797e0de38fce58e0670a00fdde9775 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Fri, 29 Mar 2024 16:43:37 +0100 Subject: [PATCH 112/114] Individual color channel control for JSON API - fixes #3860 - debug verbose - PSRAM detection --- wled00/FX_fcn.cpp | 26 +++----------------------- wled00/json.cpp | 40 +++++++++++++++++++++++++++------------- wled00/wled.cpp | 8 ++++++-- 3 files changed, 36 insertions(+), 38 deletions(-) diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 766c71e59..f97268f9b 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1205,7 +1205,6 @@ void WS2812FX::service() { seg.next_time = nowUp + delay; } -// if (_segment_index == _queuedChangesSegId) setUpSegmentFromQueuedChanges(); _segment_index++; } _virtualSegmentLength = 0; @@ -1213,7 +1212,7 @@ void WS2812FX::service() { _triggered = false; #ifdef WLED_DEBUG - if (millis() - nowUp > _frametime) DEBUG_PRINTLN(F("Slow effects.")); + if (millis() - nowUp > _frametime) DEBUG_PRINTF_P(PSTR("Slow effects %u/%d.\n"), (unsigned)(millis()-nowUp), (int)_frametime); #endif if (doShow) { yield(); @@ -1221,7 +1220,7 @@ void WS2812FX::service() { show(); } #ifdef WLED_DEBUG - if (millis() - nowUp > _frametime) DEBUG_PRINTLN(F("Slow strip.")); + if (millis() - nowUp > _frametime) DEBUG_PRINTF_P(PSTR("Slow strip %u/%d.\n"), (unsigned)(millis()-nowUp), (int)_frametime); #endif } @@ -1431,31 +1430,12 @@ void WS2812FX::setSegment(uint8_t segId, uint16_t i1, uint16_t i2, uint8_t group appendSegment(Segment(0, strip.getLengthTotal())); segId = getSegmentsNum()-1; // segments are added at the end of list } -/* - if (_queuedChangesSegId == segId) _queuedChangesSegId = 255; // cancel queued change if already queued for this segment - - if (segId < getMaxSegments() && segId == getCurrSegmentId() && isServicing()) { // queue change to prevent concurrent access - // queuing a change for a second segment will lead to the loss of the first change if not yet applied - // however this is not a problem as the queued change is applied immediately after the effect function in that segment returns - _qStart = i1; _qStop = i2; _qStartY = startY; _qStopY = stopY; - _qGrouping = grouping; _qSpacing = spacing; _qOffset = offset; - _queuedChangesSegId = segId; - DEBUG_PRINT(F("Segment queued: ")); DEBUG_PRINTLN(segId); - return; // queued changes are applied immediately after effect function returns - } -*/ suspend(); _segments[segId].setUp(i1, i2, grouping, spacing, offset, startY, stopY); resume(); if (segId > 0 && segId == getSegmentsNum()-1 && i2 <= i1) _segments.pop_back(); // if last segment was deleted remove it from vector } -/* -void WS2812FX::setUpSegmentFromQueuedChanges() { - if (_queuedChangesSegId >= getSegmentsNum()) return; - _segments[_queuedChangesSegId].setUp(_qStart, _qStop, _qGrouping, _qSpacing, _qOffset, _qStartY, _qStopY); - _queuedChangesSegId = 255; -} -*/ + void WS2812FX::resetSegments() { _segments.clear(); // destructs all Segment as part of clearing #ifndef WLED_DISABLE_2D diff --git a/wled00/json.cpp b/wled00/json.cpp index 02eb22ba4..fd1527a21 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -142,28 +142,42 @@ bool deserializeSegment(JsonObject elem, byte it, byte presetId) { if (seg.getLightCapabilities() & 3) { // segment has RGB or White - for (size_t i = 0; i < 3; i++) - { + for (size_t i = 0; i < NUM_COLORS; i++) { + // JSON "col" array can contain the following values for each of segment's colors (primary, background, custom): + // "col":[int|string|object|array, int|string|object|array, int|string|object|array] + // int = Kelvin temperature or 0 for black + // string = hex representation of [WW]RRGGBB + // object = individual channel control {"r":0,"g":127,"b":255,"w":255}, each being optional (valid to send {}) + // array = direct channel values [r,g,b,w] (w element being optional) int rgbw[] = {0,0,0,0}; bool colValid = false; JsonArray colX = colarr[i]; if (colX.isNull()) { - byte brgbw[] = {0,0,0,0}; - const char* hexCol = colarr[i]; - if (hexCol == nullptr) { //Kelvin color temperature (or invalid), e.g 2400 - int kelvin = colarr[i] | -1; - if (kelvin < 0) continue; - if (kelvin == 0) seg.setColor(i, 0); - if (kelvin > 0) colorKtoRGB(kelvin, brgbw); + JsonObject oCol = colarr[i]; + if (!oCol.isNull()) { + // we have a JSON object for color {"w":123,"r":123,...}; allows individual channel control + rgbw[0] = oCol["r"] | R(seg.colors[i]); + rgbw[1] = oCol["g"] | G(seg.colors[i]); + rgbw[2] = oCol["b"] | B(seg.colors[i]); + rgbw[3] = oCol["w"] | W(seg.colors[i]); colValid = true; - } else { //HEX string, e.g. "FFAA00" - colValid = colorFromHexString(brgbw, hexCol); + } else { + byte brgbw[] = {0,0,0,0}; + const char* hexCol = colarr[i]; + if (hexCol == nullptr) { //Kelvin color temperature (or invalid), e.g 2400 + int kelvin = colarr[i] | -1; + if (kelvin < 0) continue; + if (kelvin == 0) seg.setColor(i, 0); + if (kelvin > 0) colorKtoRGB(kelvin, brgbw); + colValid = true; + } else { //HEX string, e.g. "FFAA00" + colValid = colorFromHexString(brgbw, hexCol); + } + for (size_t c = 0; c < 4; c++) rgbw[c] = brgbw[c]; } - for (size_t c = 0; c < 4; c++) rgbw[c] = brgbw[c]; } else { //Array of ints (RGB or RGBW color), e.g. [255,160,0] byte sz = colX.size(); if (sz == 0) continue; //do nothing on empty array - copyArray(colX, rgbw, 4); colValid = true; } diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 7b753da3b..c64ea935c 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -241,9 +241,10 @@ void WLED::loop() DEBUG_PRINT(F("Unix time: ")); toki.printTime(toki.getTime()); DEBUG_PRINT(F("Free heap: ")); DEBUG_PRINTLN(ESP.getFreeHeap()); #if defined(ARDUINO_ARCH_ESP32) - if (psramSafe && psramFound()) { + if (psramFound()) { DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB"); DEBUG_PRINT(F("Free PSRAM: ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB"); + if (!psramSafe) DEBUG_PRINTLN(F("Not using PSRAM.")); } #endif DEBUG_PRINT(F("Wifi state: ")); DEBUG_PRINTLN(WiFi.status()); @@ -369,10 +370,12 @@ void WLED::setup() #if defined(ARDUINO_ARCH_ESP32) #ifndef BOARD_HAS_PSRAM if (psramFound() && ESP.getChipRevision() < 3) psramSafe = false; + if (!psramSafe) DEBUG_PRINTLN(F("Not using PSRAM.")); #endif pDoc = new PSRAMDynamicJsonDocument((psramSafe && psramFound() ? 2 : 1)*JSON_BUFFER_SIZE); + DEBUG_PRINT(F("JSON buffer allocated: ")); DEBUG_PRINTLN((psramSafe && psramFound() ? 2 : 1)*JSON_BUFFER_SIZE); // if the above fails requestJsonBufferLock() will always return false preventing crashes - if (psramSafe && psramFound()) { + if (psramFound()) { DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB"); DEBUG_PRINT(F("Free PSRAM : ")); DEBUG_PRINT(ESP.getFreePsram()/1024); DEBUG_PRINTLN("kB"); } @@ -423,6 +426,7 @@ void WLED::setup() DEBUG_PRINTLN(F("Reading config")); deserializeConfigFromFS(); + DEBUG_PRINT(F("heap ")); DEBUG_PRINTLN(ESP.getFreeHeap()); #if defined(STATUSLED) && STATUSLED>=0 if (!pinManager.isPinAllocated(STATUSLED)) { From 157dbffc593a967f9ac15719de243a4628d57bea Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Fri, 29 Mar 2024 18:56:43 +0100 Subject: [PATCH 113/114] Changelog update --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00d70866f..c79827017 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ ## WLED changelog +#### Build 2403280 +- Individual color channel control for JSON API (fixes #3860) + - "col":[int|string|object|array, int|string|object|array, int|string|object|array] + int = Kelvin temperature or 0 for black + string = hex representation of [WW]RRGGBB + object = individual channel control {"r":0,"g":127,"b":255,"w":255}, each being optional (valid to send {}) + array = direct channel values [r,g,b,w] (w element being optional) +- runtime selection for CCT IC (Athom 15W bulb) +- #3850 (by @w00000dy) +- Rotary encoder palette count bugfix +- bugfixes and optimisations + #### Build 2403240 - v0.15.0-b2 - WS2805 support (RGB + WW + CW, 600kbps) From 20ed81cd86a7eb3ee1ffcfad4d7c3b2cf84d2a3a Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sat, 30 Mar 2024 11:02:28 +0100 Subject: [PATCH 114/114] Prefer I2S1 over RMT on ESP32 - remove Audioreactive limitation --- wled00/bus_manager.cpp | 2 +- wled00/bus_wrapper.h | 37 +++++++++++++++++++++++++++++-------- wled00/const.h | 20 ++++++-------------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index 88b4cc32b..764ab6e2b 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -129,7 +129,7 @@ BusDigital::BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com) if (bc.type == TYPE_WS2812_1CH_X3) lenToCreate = NUM_ICS_WS2812_1CH_3X(bc.count); // only needs a third of "RGB" LEDs for NeoPixelBus _busPtr = PolyBus::create(_iType, _pins, lenToCreate + _skip, nr, _frequencykHz); _valid = (_busPtr != nullptr); - DEBUG_PRINTF("%successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u). mA=%d/%d\n", _valid?"S":"Uns", nr, bc.count, bc.type, _pins[0], _pins[1], _iType, _milliAmpsPerLed, _milliAmpsMax); + DEBUG_PRINTF_P(PSTR("%successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u). mA=%d/%d\n"), _valid?"S":"Uns", nr, bc.count, bc.type, _pins[0], IS_2PIN(bc.type)?_pins[1]:255, _iType, _milliAmpsPerLed, _milliAmpsMax); } //fine tune power estimation constants for your setup diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index d13b1a945..ebbeca4ad 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -206,81 +206,101 @@ //RGB #define B_32_RN_NEO_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS -#define B_32_I0_NEO_3 NeoPixelBusLg +#define B_32_I0_NEO_3 NeoPixelBusLg +//#define B_32_I0_NEO_3 NeoPixelBusLg // parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS -#define B_32_I1_NEO_3 NeoPixelBusLg +#define B_32_I1_NEO_3 NeoPixelBusLg +//#define B_32_I1_NEO_3 NeoPixelBusLg // parallel I2S #endif //RGBW -#define B_32_RN_NEO_4 NeoPixelBusLg +#define B_32_RN_NEO_4 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS -#define B_32_I0_NEO_4 NeoPixelBusLg +#define B_32_I0_NEO_4 NeoPixelBusLg +//#define B_32_I0_NEO_4 NeoPixelBusLg // parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS -#define B_32_I1_NEO_4 NeoPixelBusLg +#define B_32_I1_NEO_4 NeoPixelBusLg +//#define B_32_I1_NEO_4 NeoPixelBusLg // parallel I2S #endif //400Kbps #define B_32_RN_400_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS #define B_32_I0_400_3 NeoPixelBusLg +//#define B_32_I0_400_3 NeoPixelBusLg // parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_400_3 NeoPixelBusLg +//#define B_32_I1_400_3 NeoPixelBusLg // parallel I2S #endif //TM1814 (RGBW) #define B_32_RN_TM1_4 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS #define B_32_I0_TM1_4 NeoPixelBusLg +//#define B_32_I0_TM1_4 NeoPixelBusLg // parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_TM1_4 NeoPixelBusLg +//#define B_32_I1_TM1_4 NeoPixelBusLg // parallel I2S #endif //TM1829 (RGB) #define B_32_RN_TM2_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS #define B_32_I0_TM2_3 NeoPixelBusLg +//#define B_32_I0_TM2_3 NeoPixelBusLg // parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_TM2_3 NeoPixelBusLg +//#define B_32_I1_TM2_3 NeoPixelBusLg // parallel I2S #endif //UCS8903 #define B_32_RN_UCS_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS #define B_32_I0_UCS_3 NeoPixelBusLg +//#define B_32_I0_UCS_3 NeoPixelBusLg // parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_UCS_3 NeoPixelBusLg +//#define B_32_I1_UCS_3 NeoPixelBusLg // parallel I2S #endif //UCS8904 #define B_32_RN_UCS_4 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS #define B_32_I0_UCS_4 NeoPixelBusLg +//#define B_32_I0_UCS_4 NeoPixelBusLg// parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_UCS_4 NeoPixelBusLg +//#define B_32_I1_UCS_4 NeoPixelBusLg// parallel I2S #endif #define B_32_RN_APA106_3 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS #define B_32_I0_APA106_3 NeoPixelBusLg +//#define B_32_I0_APA106_3 NeoPixelBusLg // parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_APA106_3 NeoPixelBusLg +//#define B_32_I1_APA106_3 NeoPixelBusLg // parallel I2S #endif //FW1906 GRBCW #define B_32_RN_FW6_5 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS #define B_32_I0_FW6_5 NeoPixelBusLg +//#define B_32_I0_FW6_5 NeoPixelBusLg // parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_FW6_5 NeoPixelBusLg +//#define B_32_I1_FW6_5 NeoPixelBusLg // parallel I2S #endif //WS2805 RGBWC #define B_32_RN_2805_5 NeoPixelBusLg #ifndef WLED_NO_I2S0_PIXELBUS #define B_32_I0_2805_5 NeoPixelBusLg +//#define B_32_I0_2805_5 NeoPixelBusLg // parallel I2S #endif #ifndef WLED_NO_I2S1_PIXELBUS #define B_32_I1_2805_5 NeoPixelBusLg +//#define B_32_I1_2805_5 NeoPixelBusLg // parallel I2S #endif #endif @@ -1458,11 +1478,11 @@ class PolyBus { return I_8266_U0_2805_5 + offset; } #else //ESP32 - uint8_t offset = 0; //0 = RMT (num 0-7) 8 = I2S0 9 = I2S1 + uint8_t offset = 0; // 0 = RMT (num 1-8), 1 = I2S0 (used by Audioreactive), 2 = I2S1 #if defined(CONFIG_IDF_TARGET_ESP32S2) // ESP32-S2 only has 4 RMT channels if (num > 4) return I_NONE; - if (num > 3) offset = 1; // only one I2S + if (num > 3) offset = 1; // only one I2S (use last to allow Audioreactive) #elif defined(CONFIG_IDF_TARGET_ESP32C3) // On ESP32-C3 only the first 2 RMT channels are usable for transmitting if (num > 1) return I_NONE; @@ -1474,7 +1494,8 @@ class PolyBus { #else // standard ESP32 has 8 RMT and 2 I2S channels if (num > 9) return I_NONE; - if (num > 7) offset = num -7; + if (num > 8) offset = 1; + if (num == 0) offset = 2; // prefer I2S1 for 1st bus (less flickering but more RAM needed) #endif switch (busType) { case TYPE_WS2812_1CH_X3: diff --git a/wled00/const.h b/wled00/const.h index de07c314a..c8a4b7ffe 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -53,24 +53,16 @@ #define WLED_MAX_BUSSES 3 // will allow 2 digital & 1 analog (or the other way around) #define WLED_MIN_VIRTUAL_BUSSES 3 #elif defined(CONFIG_IDF_TARGET_ESP32S2) // 4 RMT, 8 LEDC, only has 1 I2S bus, supported in NPB - #if defined(USERMOD_AUDIOREACTIVE) // requested by @softhack007 https://github.com/blazoncek/WLED/issues/33 - #define WLED_MAX_BUSSES 6 // will allow 4 digital & 2 analog - #define WLED_MIN_VIRTUAL_BUSSES 4 - #else - #define WLED_MAX_BUSSES 7 // will allow 5 digital & 2 analog - #define WLED_MIN_VIRTUAL_BUSSES 3 - #endif + // the 5th bus (I2S) will prevent Audioreactive usermod from functioning (it is last used though) + #define WLED_MAX_BUSSES 7 // will allow 5 digital & 2 analog + #define WLED_MIN_VIRTUAL_BUSSES 3 #elif defined(CONFIG_IDF_TARGET_ESP32S3) // 4 RMT, 8 LEDC, has 2 I2S but NPB does not support them ATM #define WLED_MAX_BUSSES 6 // will allow 4 digital & 2 analog #define WLED_MIN_VIRTUAL_BUSSES 4 #else - #if defined(USERMOD_AUDIOREACTIVE) // requested by @softhack007 https://github.com/blazoncek/WLED/issues/33 - #define WLED_MAX_BUSSES 8 - #define WLED_MIN_VIRTUAL_BUSSES 2 - #else - #define WLED_MAX_BUSSES 10 - #define WLED_MIN_VIRTUAL_BUSSES 0 - #endif + // the 10th digital bus (I2S0) will prevent Audioreactive usermod from functioning (it is last used though) + #define WLED_MAX_BUSSES 10 + #define WLED_MIN_VIRTUAL_BUSSES 0 #endif #endif #else