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 c37da380..927e9e16 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 @@ -185,6 +185,123 @@ class FourLineDisplayUsermod : public Usermod { u8x8_cad_EndTransfer(u8x8_struct); } + /** + * Wrappers for screen drawing + */ + void setFlipMode(uint8_t mode) { + if (type == NONE || !enabled) return; + u8x8->setFlipMode(mode); + } + void setContrast(uint8_t contrast) { + if (type == NONE || !enabled) return; + u8x8->setContrast(contrast); + } + void drawString(uint8_t col, uint8_t row, const char *string, bool ignoreLH=false) { + if (type == NONE || !enabled) return; + u8x8->setFont(u8x8_font_chroma48medium8_r); + if (!ignoreLH && lineHeight==2) u8x8->draw1x2String(col, row, string); + else u8x8->drawString(col, row, string); + } + void draw2x2String(uint8_t col, uint8_t row, const char *string) { + if (type == NONE || !enabled) return; + u8x8->setFont(u8x8_font_chroma48medium8_r); + u8x8->draw2x2String(col, row, string); + } + void drawGlyph(uint8_t col, uint8_t row, char glyph, const uint8_t *font, bool ignoreLH=false) { + if (type == NONE || !enabled) return; + u8x8->setFont(font); + if (!ignoreLH && lineHeight==2) u8x8->draw1x2Glyph(col, row, glyph); + else u8x8->drawGlyph(col, row, glyph); + } + void draw2x2Glyph(uint8_t col, uint8_t row, char glyph, const uint8_t *font) { + if (type == NONE || !enabled) return; + u8x8->setFont(font); + u8x8->draw2x2Glyph(col, row, glyph); + } + uint8_t getCols() { + if (type==NONE || !enabled) return 0; + return u8x8->getCols(); + } + void clear() { + if (type == NONE || !enabled) return; + u8x8->clear(); + } + void setPowerSave(uint8_t save) { + if (type == NONE || !enabled) return; + u8x8->setPowerSave(save); + } + + void center(String &line, uint8_t width) { + int len = line.length(); + if (len0; i--) line = ' ' + line; + for (byte i=line.length(); i 11) { AmPmHour -= 12; isitAM = false; } + if (AmPmHour == 0) { AmPmHour = 12; } + } + if (knownHour != hourCurrent) { + // only update date when hour changes + 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); + draw2x2String(2, lineHeight*2, lineBuffer); //draw hour, min. blink ":" depending on odd/even seconds + if (useAMPM) drawString(12, lineHeight*2, (isitAM ? "AM" : "PM"), true); //draw am/pm if using 12 time + + drawStatusIcons(); //icons power, wifi, timer, etc + + knownMinute = minuteCurrent; + knownHour = hourCurrent; + } + if (showSeconds && secondCurrent != lastSecond) { + lastSecond = secondCurrent; + draw2x2String(6, lineHeight*2, secondCurrent%2 ? " " : ":"); + sprintf_P(lineBuffer, PSTR("%02d"), secondCurrent); + drawString(12, lineHeight*2+1, lineBuffer, true); // even with double sized rows print seconds in 1 line + } + drawing = false; + } + public: // gets called once at boot. Do all initialization that doesn't depend on @@ -195,14 +312,21 @@ class FourLineDisplayUsermod : public Usermod { bool isHW, isSPI = (type == SSD1306_SPI || type == SSD1306_SPI64); PinOwner po = PinOwner::UM_FourLineDisplay; if (isSPI) { + PinManagerPinType cspins[2] = { { ioPin[3], true }, { ioPin[4], true } }; + if (!pinManager.allocateMultiplePins(cspins, 2, PinOwner::UM_FourLineDisplay)) { type=NONE; return; } isHW = (ioPin[0]==spi_sclk && ioPin[1]==spi_mosi && ioPin[2]==spi_cs); if (isHW) po = PinOwner::HW_SPI; // allow multiple allocations of HW I2C bus pins - PinManagerPinType pins[5] = { { ioPin[0], true }, { ioPin[1], true }, { ioPin[2], true }, { ioPin[3], true }, { ioPin[4], true }}; - if (!pinManager.allocateMultiplePins(pins, 5, po)) { type=NONE; return; } + PinManagerPinType pins[3] = { { ioPin[0], true }, { ioPin[1], true }, { ioPin[2], true } }; + if (!pinManager.allocateMultiplePins(pins, 5, po)) { + pinManager.deallocatePin(ioPin[3], PinOwner::UM_FourLineDisplay); + pinManager.deallocatePin(ioPin[4], PinOwner::UM_FourLineDisplay); + type = NONE; + return; + } } else { isHW = (ioPin[0]==i2c_scl && ioPin[1]==i2c_sda); if (isHW) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins - PinManagerPinType pins[2] = { { ioPin[0], true }, { ioPin[1], true } }; + PinManagerPinType pins[2] = { {ioPin[0], true }, { ioPin[1], true } }; if (!pinManager.allocateMultiplePins(pins, 2, po)) { type=NONE; return; } } @@ -320,58 +444,6 @@ class FourLineDisplayUsermod : public Usermod { #endif } - /** - * Wrappers for screen drawing - */ - void setFlipMode(uint8_t mode) { - if (type == NONE || !enabled) return; - u8x8->setFlipMode(mode); - } - void setContrast(uint8_t contrast) { - if (type == NONE || !enabled) return; - u8x8->setContrast(contrast); - } - void drawString(uint8_t col, uint8_t row, const char *string, bool ignoreLH=false) { - if (type == NONE || !enabled) return; - u8x8->setFont(u8x8_font_chroma48medium8_r); - if (!ignoreLH && lineHeight==2) u8x8->draw1x2String(col, row, string); - else u8x8->drawString(col, row, string); - } - void draw2x2String(uint8_t col, uint8_t row, const char *string) { - if (type == NONE || !enabled) return; - u8x8->setFont(u8x8_font_chroma48medium8_r); - u8x8->draw2x2String(col, row, string); - } - void drawGlyph(uint8_t col, uint8_t row, char glyph, const uint8_t *font, bool ignoreLH=false) { - if (type == NONE || !enabled) return; - u8x8->setFont(font); - if (!ignoreLH && lineHeight==2) u8x8->draw1x2Glyph(col, row, glyph); - else u8x8->drawGlyph(col, row, glyph); - } - void draw2x2Glyph(uint8_t col, uint8_t row, char glyph, const uint8_t *font) { - if (type == NONE || !enabled) return; - u8x8->setFont(font); - u8x8->draw2x2Glyph(col, row, glyph); - } - uint8_t getCols() { - if (type==NONE || !enabled) return 0; - return u8x8->getCols(); - } - void clear() { - if (type == NONE || !enabled) return; - u8x8->clear(); - } - void setPowerSave(uint8_t save) { - if (type == NONE || !enabled) return; - u8x8->setPowerSave(save); - } - - void center(String &line, uint8_t width) { - int len = line.length(); - if (len0; i--) line = ' ' + line; - for (byte i=line.length(); i 11) { AmPmHour -= 12; isitAM = false; } - if (AmPmHour == 0) { AmPmHour = 12; } - } - if (knownHour != hourCurrent) { - // only update date when hour changes - 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); - draw2x2String(2, lineHeight*2, lineBuffer); //draw hour, min. blink ":" depending on odd/even seconds - if (useAMPM) drawString(12, lineHeight*2, (isitAM ? "AM" : "PM"), true); //draw am/pm if using 12 time - - drawStatusIcons(); //icons power, wifi, timer, etc - - knownMinute = minuteCurrent; - knownHour = hourCurrent; - } - if (showSeconds && secondCurrent != lastSecond) { - lastSecond = secondCurrent; - draw2x2String(6, lineHeight*2, secondCurrent%2 ? " " : ":"); - sprintf_P(lineBuffer, PSTR("%02d"), secondCurrent); - drawString(12, lineHeight*2+1, lineBuffer, true); // even with double sized rows print seconds in 1 line - } - drawing = false; - } - /** * handleButton() can be used to override default button behaviour. Returning true * will prevent button working in a default way. diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 6511e754..f5528a43 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -271,12 +271,11 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { CJSON(i2c_sda, hw_if_i2c[0]); CJSON(i2c_scl, hw_if_i2c[1]); PinManagerPinType i2c[2] = { { i2c_sda, true }, { i2c_scl, true } }; - if (pinManager.allocateMultiplePins(i2c, 2, PinOwner::HW_I2C)) { + if (i2c_scl >= 0 && i2c_sda >= 0 && pinManager.allocateMultiplePins(i2c, 2, PinOwner::HW_I2C)) { #ifdef ESP32 Wire.setPins(i2c_sda, i2c_scl); // this will fail if Wire is initilised (Wire.begin() called prior) #endif Wire.begin(); - pinManager.deallocateMultiplePins(i2c, 2, PinOwner::HW_I2C); } else { i2c_sda = -1; i2c_scl = -1; @@ -286,13 +285,12 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { CJSON(spi_sclk, hw_if_spi[1]); CJSON(spi_cs, hw_if_spi[2]); PinManagerPinType spi[3] = { { spi_mosi, true }, { spi_sclk, true }, { spi_cs, true } }; - if (pinManager.allocateMultiplePins(spi, 3, PinOwner::HW_SPI)) { + if (spi_mosi >= 0 && spi_sclk >= 0 && spi_cs >= 0 && pinManager.allocateMultiplePins(spi, 3, PinOwner::HW_SPI)) { #ifdef ESP8266 SPI.begin(); #else SPI.begin(spi_sclk, (int8_t)-1, spi_mosi, spi_cs); #endif - pinManager.deallocateMultiplePins(spi, 3, PinOwner::HW_SPI); } else { spi_mosi = -1; spi_sclk = -1; diff --git a/wled00/data/settings_um.htm b/wled00/data/settings_um.htm index e2328566..039aeaef 100644 --- a/wled00/data/settings_um.htm +++ b/wled00/data/settings_um.htm @@ -58,6 +58,20 @@ if (o.value==pins[i] && pinO[i]==="if") { o.style.color="lime"; break; } if (o.value==pins[i] || o.value<-1 || o.value>39) { o.style.color="red"; break; } else o.style.color=o.value>33?"orange":"#fff"; } + } else { + switch (o.name) { + case "SDA": break; + case "SCL": break; + case "MOSI": break; + case "SCLK": break; + case "CS": break; + default: return; + } + for (var i=0; i39) { o.style.color="red"; break; } else o.style.color=o.value>33?"orange":"#fff"; + } } } function getPins(o) { @@ -80,7 +94,6 @@ } } } - function updPins() {} function addField(k,f,o,a=false) { //key, field, (sub)object, isArray if (isO(o)) { urows += '
'; @@ -158,7 +171,9 @@ // https://stackoverflow.com/questions/26440494/insert-text-after-this-input-element-with-javascript function addInfo(name,el,txt) { let obj = d.getElementsByName(name); - if (obj[el]) obj[el].insertAdjacentHTML('afterend', ' '+txt); + if (!obj.length) return; + if (typeof el === "string" && obj[0]) obj[0].placeholder = el; + else if (obj[el]) obj[el].insertAdjacentHTML('afterend', ' '+txt); } // load settings and insert values into DOM function ldS() { @@ -209,14 +224,14 @@

Usermod Setup

Global I2C GPIOs (HW)
(only changable on ESP32, change requires reboot!)
- SDA: - SCL: + SDA: + SCL:
Global SPI GPIOs (HW)
(only changable on ESP32, change requires reboot!)
- MOSI: - SCLK: - CS: + MOSI: + SCLK: + CS:
Loading settings...

diff --git a/wled00/html_settings.h b/wled00/html_settings.h index a9f0263b..f3857ce9 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -1582,162 +1582,166 @@ const uint8_t PAGE_settings_sec[] PROGMEM = { // Autogenerated from wled00/data/settings_um.htm, do not edit!! -const uint16_t PAGE_settings_um_length = 2451; +const uint16_t PAGE_settings_um_length = 2522; const uint8_t PAGE_settings_um[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xb5, 0x58, 0x6d, 0x73, 0xdb, 0xb8, - 0x11, 0xfe, 0xee, 0x5f, 0x41, 0x23, 0x1e, 0x9b, 0x1c, 0xd1, 0x94, 0x1c, 0xf7, 0xae, 0x89, 0x24, - 0xc8, 0x4d, 0x9c, 0xe4, 0xa2, 0x5e, 0x12, 0x7b, 0x46, 0xb9, 0xbb, 0xe9, 0xb8, 0x9e, 0x33, 0x4d, - 0x42, 0x12, 0x62, 0x0a, 0x64, 0x01, 0xd0, 0x2f, 0x95, 0xf5, 0xdf, 0xfb, 0x2c, 0x48, 0xea, 0xc5, - 0xb1, 0x93, 0x66, 0x3a, 0xfd, 0x22, 0x89, 0xe0, 0x62, 0xb1, 0x78, 0x76, 0xf7, 0xd9, 0x5d, 0xf5, - 0xb7, 0xdf, 0x9c, 0x1c, 0x7f, 0xfe, 0xc7, 0xe9, 0x5b, 0x6f, 0x6a, 0x67, 0xd9, 0xa0, 0x5f, 0x7f, - 0x8a, 0x38, 0xf5, 0xb2, 0x58, 0x4d, 0x38, 0x13, 0x8a, 0x0d, 0xfa, 0x33, 0x61, 0x63, 0x2f, 0x99, - 0xc6, 0xda, 0x08, 0xcb, 0x59, 0x69, 0xc7, 0xfb, 0x2f, 0x9a, 0xd5, 0x2d, 0x15, 0xcf, 0x04, 0x67, - 0xd7, 0x52, 0xdc, 0x14, 0xb9, 0xb6, 0xcc, 0x4b, 0x72, 0x65, 0x85, 0x82, 0xd8, 0x8d, 0x4c, 0xed, - 0x94, 0xff, 0xd4, 0xe9, 0x2c, 0x45, 0x1f, 0xbc, 0x4a, 0xc5, 0xb5, 0x4c, 0xc4, 0xbe, 0x7b, 0x08, - 0xa5, 0x92, 0x56, 0xc6, 0xd9, 0xbe, 0x49, 0xe2, 0x4c, 0xf0, 0x83, 0x70, 0x16, 0xdf, 0xca, 0x59, - 0x39, 0x5b, 0x3e, 0x97, 0x46, 0x68, 0xf7, 0x10, 0x5f, 0xe2, 0x59, 0xe5, 0xec, 0xab, 0x93, 0x07, - 0x7d, 0x2b, 0x6d, 0x26, 0x06, 0xbf, 0x41, 0x72, 0x96, 0xa7, 0xde, 0x48, 0x58, 0x2b, 0xd5, 0xc4, - 0xf4, 0xdb, 0xd5, 0x7a, 0xdf, 0x24, 0x5a, 0x16, 0x76, 0xb0, 0x75, 0x1d, 0x6b, 0x2f, 0xbf, 0x51, - 0x42, 0x87, 0x59, 0x9e, 0xc8, 0x22, 0x2c, 0x75, 0x7e, 0x63, 0xc2, 0x94, 0xa7, 0x79, 0x52, 0xce, - 0x60, 0x5f, 0x58, 0xce, 0x8e, 0xc7, 0x13, 0x3e, 0x5f, 0x84, 0x85, 0x54, 0x86, 0x9f, 0xfd, 0x1c, - 0xfe, 0x35, 0x7c, 0x11, 0xbe, 0x0c, 0x0f, 0x3a, 0xe1, 0xc1, 0xc1, 0x39, 0x2d, 0x9e, 0xf0, 0x33, - 0xa6, 0xcd, 0x75, 0xca, 0xc2, 0xef, 0x7f, 0x9d, 0xd3, 0x29, 0x7c, 0xfb, 0x20, 0x54, 0xe5, 0xec, - 0x23, 0xef, 0xf4, 0xc6, 0xa5, 0x4a, 0xac, 0xcc, 0x95, 0x37, 0x19, 0xa6, 0xbe, 0x08, 0xe6, 0x5a, - 0xd8, 0x52, 0x2b, 0x2f, 0x8d, 0x26, 0xc2, 0xbe, 0xcd, 0x04, 0x19, 0xf0, 0xfa, 0xce, 0xbd, 0x5a, - 0x2c, 0x45, 0xa5, 0x39, 0x59, 0x13, 0x15, 0xbb, 0xbb, 0x2c, 0xbf, 0xfc, 0x22, 0x12, 0xcb, 0x38, - 0xb7, 0x77, 0x85, 0xc8, 0xc7, 0xb4, 0xb6, 0xfd, 0x4a, 0xeb, 0xf8, 0x2e, 0x92, 0xc6, 0x7d, 0x6f, - 0xec, 0x7f, 0xef, 0x07, 0xf3, 0x1b, 0xa9, 0xd2, 0xfc, 0x26, 0xca, 0x0b, 0xa1, 0x7c, 0x36, 0xb5, - 0xb6, 0x30, 0xdd, 0x76, 0x7b, 0x22, 0xed, 0xb4, 0xbc, 0x8c, 0x92, 0x7c, 0xd6, 0x7e, 0x25, 0x75, - 0x92, 0xe7, 0xf9, 0x95, 0x14, 0xed, 0x3f, 0x3e, 0xbc, 0x7d, 0xd3, 0xbe, 0x91, 0x57, 0xb2, 0xdd, - 0x60, 0xf8, 0xac, 0xac, 0x40, 0xdd, 0x37, 0xf5, 0x02, 0x5b, 0xd3, 0xfe, 0xfa, 0xa1, 0xf6, 0xf6, - 0x52, 0x2a, 0x64, 0x7f, 0x1a, 0x91, 0x8d, 0xd7, 0xa5, 0xb3, 0x3c, 0x4e, 0xff, 0x3e, 0xf2, 0x45, - 0x68, 0xf9, 0x76, 0x27, 0x98, 0x67, 0xc2, 0x7a, 0x8a, 0xa7, 0x51, 0xa2, 0x45, 0x6c, 0x45, 0x0d, - 0x80, 0xcf, 0x2a, 0x5f, 0xb1, 0xa0, 0xa7, 0x22, 0x28, 0x7b, 0x65, 0xad, 0x96, 0x97, 0xa5, 0x15, - 0x78, 0xa1, 0x13, 0x16, 0x8a, 0x20, 0x7c, 0xb8, 0x4e, 0x38, 0xe0, 0x38, 0x2b, 0x6e, 0x6d, 0xfb, - 0x4b, 0x7c, 0x1d, 0x37, 0x0a, 0xbe, 0x12, 0x8c, 0xcd, 0x9d, 0x82, 0x0a, 0x1b, 0x84, 0x69, 0x74, - 0x99, 0xa7, 0x77, 0x51, 0x5c, 0xc0, 0xe8, 0xf4, 0x78, 0x2a, 0xb3, 0xd4, 0x57, 0x24, 0x1f, 0xa7, - 0xe9, 0xdb, 0x6b, 0x58, 0xf1, 0x41, 0x1a, 0x84, 0xab, 0xd0, 0x3e, 0x23, 0x9b, 0x59, 0xe8, 0x07, - 0x7c, 0x30, 0xff, 0x45, 0xd8, 0xdf, 0xfd, 0x60, 0xf1, 0xb8, 0x9c, 0xd0, 0x3a, 0xd7, 0x30, 0x0f, - 0x72, 0x88, 0x75, 0x93, 0x67, 0x22, 0xca, 0xf2, 0x89, 0xcf, 0xde, 0xd2, 0xba, 0x57, 0x5f, 0x1e, - 0xc0, 0x78, 0x63, 0x99, 0x09, 0x77, 0x0d, 0x04, 0xb7, 0xc6, 0x75, 0x3f, 0xd4, 0xeb, 0xf0, 0x24, - 0x36, 0x8e, 0xe5, 0xa4, 0xd4, 0xb1, 0x43, 0xab, 0xba, 0x86, 0x37, 0x8e, 0xb1, 0x21, 0x8d, 0xfe, - 0xa9, 0x86, 0x0a, 0xbe, 0x2a, 0x00, 0x9a, 0xf0, 0x8a, 0x78, 0x22, 0xbc, 0x34, 0xb6, 0xf1, 0x36, - 0xe0, 0x5d, 0x03, 0x78, 0x04, 0x77, 0x30, 0x3a, 0xa0, 0x8b, 0xf0, 0xa8, 0xfd, 0x82, 0x10, 0x74, - 0xfa, 0xa2, 0x42, 0xe7, 0x36, 0x4f, 0xf2, 0x6c, 0x77, 0xd7, 0x77, 0x61, 0xd9, 0x09, 0x7d, 0x97, - 0x04, 0x9c, 0x24, 0xb2, 0x91, 0xcd, 0x35, 0xb4, 0x52, 0x28, 0x0e, 0xad, 0x98, 0xd1, 0xc5, 0x93, - 0x61, 0xc1, 0x82, 0xe0, 0xfe, 0xbe, 0x16, 0xc3, 0xfe, 0x59, 0x01, 0x83, 0xdf, 0x41, 0xbf, 0xf7, - 0x31, 0x4f, 0x45, 0xe4, 0x9d, 0x66, 0x22, 0x36, 0xc2, 0x03, 0x10, 0x42, 0x7b, 0x14, 0x3a, 0xde, - 0xf0, 0x14, 0x26, 0x85, 0x1b, 0x1a, 0xcd, 0xa6, 0xc6, 0x2a, 0xf3, 0x82, 0x00, 0x52, 0x29, 0xec, - 0x75, 0xb9, 0x81, 0x33, 0x28, 0x25, 0x58, 0x39, 0x63, 0x41, 0x24, 0x15, 0x00, 0x7d, 0xff, 0xf9, - 0xe3, 0x07, 0xce, 0x3e, 0xe5, 0x5e, 0x9d, 0xd2, 0xc6, 0x43, 0x3e, 0xda, 0x38, 0x23, 0x28, 0xd8, - 0x46, 0x7a, 0xbc, 0x5b, 0x4f, 0x0f, 0xce, 0x79, 0x0b, 0xf9, 0x20, 0xb6, 0x39, 0xf7, 0x3b, 0xf7, - 0x9b, 0x79, 0x34, 0x7c, 0x4c, 0x90, 0x7f, 0x25, 0x98, 0x4c, 0x45, 0x72, 0x45, 0x31, 0x1a, 0xcc, - 0x89, 0x2d, 0x14, 0x17, 0x11, 0xb1, 0x4d, 0xa4, 0x45, 0x91, 0xc5, 0x09, 0xa2, 0xe8, 0xec, 0x1c, - 0xc1, 0x06, 0x3b, 0x4d, 0x79, 0x69, 0xac, 0xf6, 0xf7, 0x0f, 0x83, 0x9e, 0x1c, 0xfb, 0x0c, 0xf7, - 0xb8, 0x14, 0x1a, 0xb8, 0x8b, 0x88, 0x02, 0x12, 0x89, 0x0a, 0xb6, 0xc0, 0xa3, 0x6a, 0x04, 0x3b, - 0xe1, 0x61, 0x10, 0x8c, 0x73, 0xed, 0x93, 0x5a, 0x09, 0x3a, 0x90, 0x7d, 0x22, 0x99, 0x28, 0x13, - 0x6a, 0x62, 0xa7, 0x3d, 0xd9, 0x6a, 0x05, 0xd0, 0x63, 0xb7, 0x39, 0xb1, 0xcc, 0x99, 0x3c, 0x0f, - 0xe6, 0x78, 0x14, 0xd1, 0x75, 0x9c, 0x95, 0x30, 0x93, 0x44, 0xb1, 0x08, 0xb5, 0x72, 0x0c, 0xad, - 0x2b, 0x21, 0x00, 0x6c, 0xef, 0x10, 0x6d, 0xf0, 0x6c, 0xae, 0x39, 0xcb, 0xe4, 0x4c, 0xb0, 0xde, - 0x25, 0x52, 0xea, 0x6a, 0xf1, 0xc8, 0xfe, 0xfb, 0xfb, 0x7a, 0xa5, 0xbf, 0x7f, 0xb0, 0xfc, 0x3d, - 0x38, 0x7c, 0xf9, 0x95, 0x1e, 0x2d, 0xd2, 0x46, 0xcd, 0xe6, 0x9b, 0xe5, 0x9e, 0xc3, 0x23, 0x06, - 0x07, 0xab, 0x89, 0x60, 0x5d, 0xf6, 0x6c, 0x3c, 0x1e, 0xb3, 0xc5, 0x0a, 0x44, 0x44, 0xd1, 0x29, - 0x0e, 0x24, 0xc4, 0x61, 0x44, 0xc5, 0x61, 0xee, 0xee, 0x94, 0x1b, 0xf6, 0x4c, 0x85, 0xf2, 0x1c, - 0xf1, 0x7e, 0xe2, 0x98, 0x2c, 0x42, 0xf8, 0x68, 0x29, 0x48, 0x38, 0xa8, 0x85, 0x65, 0x10, 0x38, - 0x96, 0xe6, 0x2a, 0x6c, 0x34, 0xc9, 0xa0, 0x27, 0x32, 0xc4, 0x1a, 0x41, 0xdd, 0x00, 0xfb, 0x0d, - 0x97, 0x90, 0xa6, 0x4d, 0x52, 0x94, 0x2b, 0xf0, 0x2d, 0xc0, 0xb7, 0x7d, 0xd9, 0x20, 0x6f, 0x09, - 0xf9, 0x33, 0x7b, 0x3e, 0xe0, 0x1d, 0xe4, 0x86, 0xf3, 0x49, 0x51, 0x9a, 0xa9, 0x4f, 0x6b, 0x81, - 0xe3, 0xfc, 0xea, 0xd9, 0x99, 0x14, 0x34, 0x76, 0x7c, 0x25, 0xfd, 0xb4, 0xe8, 0x13, 0xa6, 0x3c, - 0x62, 0xc6, 0xf2, 0xb6, 0x74, 0xf4, 0x0a, 0xce, 0xb2, 0x48, 0xdd, 0x72, 0x30, 0x5f, 0xad, 0x81, - 0x82, 0xde, 0x49, 0x01, 0xe2, 0x42, 0xa8, 0x86, 0x00, 0x14, 0x75, 0x66, 0x09, 0xb6, 0x0a, 0x82, - 0xb9, 0x2b, 0x6d, 0x2d, 0xbe, 0xd7, 0x9f, 0x6a, 0xcf, 0xf9, 0xaf, 0xae, 0xbd, 0xdd, 0xe7, 0x3f, - 0x77, 0x8a, 0x5b, 0x36, 0xd8, 0xeb, 0xad, 0xfc, 0x21, 0x43, 0xfd, 0x88, 0x3f, 0xa0, 0x85, 0x95, - 0xea, 0x4a, 0xe1, 0x32, 0x14, 0x71, 0x96, 0xe2, 0x45, 0xaa, 0x24, 0x2b, 0x53, 0xbc, 0x84, 0xd3, - 0x83, 0xa3, 0x35, 0x1b, 0xa0, 0x22, 0xe8, 0xae, 0x9e, 0x5b, 0x78, 0xdf, 0xb2, 0x6e, 0x75, 0xf1, - 0x38, 0x08, 0x6a, 0xe5, 0x0f, 0x0d, 0x20, 0x74, 0x5f, 0x35, 0x40, 0x68, 0x00, 0xb1, 0x79, 0xbb, - 0x33, 0x7d, 0x1e, 0xa2, 0x62, 0x38, 0x38, 0x5d, 0x56, 0x9a, 0x30, 0x6f, 0xca, 0x9f, 0xea, 0x99, - 0x1b, 0x69, 0x13, 0x60, 0x1e, 0xcc, 0x13, 0xb0, 0x11, 0xbb, 0xcc, 0x41, 0xbe, 0xb1, 0x62, 0xdd, - 0x9c, 0x33, 0x97, 0xcc, 0x97, 0xf9, 0x2d, 0x0b, 0x0d, 0xdf, 0xab, 0x32, 0x81, 0x59, 0x5d, 0x0a, - 0xb6, 0xd7, 0xf2, 0xd5, 0x11, 0xab, 0x92, 0x1d, 0x91, 0xde, 0x45, 0xf4, 0x54, 0xd1, 0xde, 0x73, - 0x3a, 0xea, 0x64, 0xee, 0x1a, 0x7e, 0x51, 0xef, 0xda, 0x99, 0xab, 0x05, 0xbb, 0x08, 0xeb, 0xd8, - 0xe3, 0x76, 0x2d, 0xd6, 0x8e, 0x7c, 0xc2, 0xd9, 0x43, 0xdb, 0xc2, 0xd9, 0xe1, 0x4b, 0xe6, 0xcd, - 0xa4, 0xe2, 0x6c, 0xff, 0x00, 0xda, 0xb3, 0xd8, 0x18, 0xce, 0x0c, 0xdb, 0x83, 0xb9, 0x4c, 0x2a, - 0xd4, 0xa4, 0xae, 0x13, 0x45, 0xd1, 0x28, 0x38, 0x8b, 0xd5, 0xdd, 0x52, 0xe6, 0xf6, 0x36, 0x63, - 0x7b, 0xb5, 0x05, 0xa9, 0x18, 0xc7, 0x65, 0x66, 0xc9, 0x7e, 0xaa, 0x69, 0x64, 0xfb, 0x86, 0x15, - 0x0f, 0xdc, 0xf9, 0x13, 0xdc, 0xd9, 0x63, 0x17, 0x8b, 0x07, 0xce, 0x41, 0x70, 0xd6, 0x21, 0x20, - 0x1a, 0x5b, 0x49, 0x22, 0x15, 0xb7, 0x27, 0x63, 0x27, 0xd0, 0x3a, 0x00, 0x07, 0xd7, 0x22, 0x17, - 0xde, 0xce, 0xdc, 0x2e, 0xba, 0x1e, 0x2e, 0xb8, 0x84, 0x8c, 0xf3, 0xfc, 0xa8, 0x79, 0xdd, 0x97, - 0xaa, 0x28, 0xad, 0x47, 0x90, 0x73, 0x36, 0x95, 0x69, 0x8a, 0xde, 0xd0, 0xab, 0x9a, 0xb0, 0x9d, - 0xb9, 0x58, 0x74, 0x69, 0xf7, 0xce, 0x5c, 0x1e, 0x51, 0x26, 0x02, 0x4b, 0xd8, 0x58, 0x1b, 0x3c, - 0x8e, 0xe1, 0x32, 0x36, 0xb8, 0xe8, 0x4a, 0x70, 0xfc, 0xff, 0xac, 0x6d, 0x67, 0x9e, 0x2f, 0xa0, - 0x6c, 0x65, 0xf6, 0x86, 0xa6, 0x9d, 0xb9, 0xc3, 0x98, 0x93, 0xe1, 0x4b, 0x0f, 0x62, 0xc3, 0xb7, - 0x55, 0xef, 0xcc, 0xcd, 0x02, 0xf5, 0xd9, 0x29, 0xaa, 0x03, 0xc6, 0xb7, 0x53, 0x69, 0xc2, 0xbd, - 0x9d, 0xf9, 0xd3, 0xc8, 0x2d, 0xf6, 0x02, 0x74, 0x9d, 0x97, 0x7a, 0x70, 0xb1, 0xd8, 0x48, 0xc9, - 0x37, 0x3a, 0x2f, 0x50, 0x75, 0x55, 0x55, 0x40, 0x9e, 0xea, 0x70, 0x44, 0x46, 0x1d, 0x5c, 0x80, - 0xa4, 0x5d, 0xef, 0xfd, 0xcc, 0xeb, 0xbb, 0x4f, 0xb0, 0xb4, 0x49, 0x9e, 0xe0, 0xec, 0xe0, 0x9c, - 0x2a, 0x8b, 0x04, 0xe7, 0x0f, 0x3f, 0x9d, 0xfe, 0xf6, 0x99, 0x6e, 0x26, 0x23, 0x1b, 0x4f, 0x48, - 0x0a, 0xee, 0xad, 0xa2, 0xa3, 0x5a, 0x04, 0x00, 0xf7, 0xf7, 0xab, 0x1a, 0x54, 0x2f, 0x05, 0x95, - 0x09, 0x02, 0x8f, 0x0e, 0xc1, 0x9e, 0x74, 0xb5, 0xac, 0xb7, 0x99, 0x78, 0x32, 0x8a, 0x9b, 0x1e, - 0x69, 0x59, 0x8d, 0x5a, 0x2d, 0x5d, 0xd5, 0x3f, 0xc3, 0xd7, 0x5f, 0x23, 0x11, 0x7b, 0x55, 0xbf, - 0xb5, 0xcd, 0x8d, 0xd3, 0x05, 0xe3, 0x9c, 0xea, 0xf5, 0x05, 0x17, 0xd3, 0xeb, 0x0b, 0x2e, 0x60, - 0xd7, 0x16, 0x1e, 0x34, 0x66, 0xd5, 0x72, 0x68, 0x2a, 0x23, 0x83, 0x45, 0x5d, 0xa4, 0x1f, 0xb6, - 0x6f, 0xd4, 0xf0, 0xec, 0x43, 0xc4, 0x75, 0x4f, 0x32, 0x2a, 0x62, 0x0d, 0xd0, 0x6a, 0xec, 0x9a, - 0x5a, 0x50, 0xf7, 0x72, 0x21, 0xd8, 0x58, 0x2d, 0xf5, 0x94, 0x59, 0xb6, 0xe1, 0xa4, 0x93, 0x82, - 0x7e, 0x55, 0xd4, 0xe2, 0x38, 0x93, 0x24, 0x00, 0x9a, 0x08, 0xaa, 0x1d, 0x3d, 0x02, 0x4d, 0x7e, - 0xed, 0xb7, 0xdc, 0xed, 0x03, 0x53, 0xd4, 0x70, 0xa2, 0x3c, 0x01, 0x67, 0x38, 0x81, 0xdb, 0x50, - 0x6c, 0x34, 0x93, 0xa8, 0x56, 0x84, 0x31, 0xe9, 0xa9, 0x58, 0x1e, 0xd5, 0x93, 0x5e, 0x7c, 0x42, - 0xdb, 0x64, 0xd6, 0x09, 0x7f, 0xbe, 0xfe, 0x02, 0xa4, 0xdf, 0x94, 0x6b, 0x11, 0xd1, 0x6d, 0x71, - 0x7f, 0x5a, 0x80, 0xaf, 0xa9, 0x8d, 0xa2, 0xa0, 0x11, 0xe9, 0x90, 0x02, 0x91, 0xdb, 0x60, 0x33, - 0xee, 0x86, 0x6a, 0x9c, 0x37, 0x17, 0x6a, 0xac, 0x7f, 0x24, 0xb2, 0x60, 0x3a, 0x0e, 0xd9, 0xdd, - 0xa5, 0x4f, 0x84, 0x34, 0x7a, 0x2b, 0xfb, 0x2a, 0xfd, 0x02, 0xdc, 0x94, 0xa5, 0x8e, 0x0b, 0x2d, - 0xf2, 0x18, 0xad, 0x1c, 0xae, 0x81, 0x7a, 0xba, 0xab, 0x2e, 0x4d, 0xd1, 0x63, 0x2d, 0xb5, 0xde, - 0xc1, 0x53, 0xcb, 0x36, 0x1f, 0x0b, 0xe2, 0x5b, 0x6a, 0x0b, 0x8f, 0xdc, 0x38, 0x81, 0x69, 0x82, - 0xb5, 0x5c, 0x5b, 0x47, 0x3c, 0xda, 0x62, 0xed, 0x64, 0x3c, 0x89, 0xbe, 0x18, 0x40, 0x15, 0xce, - 0x31, 0xfe, 0x4d, 0xf3, 0xb4, 0xcb, 0x60, 0x0c, 0x5b, 0x04, 0x91, 0x9d, 0x62, 0x4a, 0x40, 0x93, - 0x8c, 0x0b, 0xe5, 0x57, 0x4d, 0xdb, 0x07, 0x8a, 0xd0, 0x9a, 0xca, 0xb7, 0x6b, 0x33, 0x52, 0x69, - 0xe0, 0xca, 0x3b, 0x22, 0xcc, 0x4c, 0x2a, 0x81, 0x34, 0x11, 0x4e, 0x99, 0x8f, 0x9e, 0x71, 0xb9, - 0x9f, 0xbc, 0x56, 0xcd, 0x6a, 0x22, 0x2a, 0x67, 0xe1, 0xaa, 0xdf, 0xa8, 0xa8, 0x81, 0x33, 0x16, - 0x52, 0x21, 0x74, 0x22, 0xeb, 0x9d, 0x07, 0x20, 0x7a, 0xa4, 0xd2, 0xd5, 0x62, 0x4b, 0x56, 0x99, - 0x6a, 0x0c, 0xc2, 0x87, 0x03, 0x62, 0x8c, 0x7e, 0x1b, 0x3f, 0x2e, 0xc2, 0xb5, 0x7a, 0xb4, 0xac, - 0x89, 0xc8, 0xf0, 0x1e, 0xa3, 0x64, 0x73, 0xfb, 0x1a, 0xbe, 0xe5, 0x6c, 0xd9, 0xb2, 0x6e, 0xf6, - 0xf3, 0x2a, 0x47, 0x33, 0x9f, 0x97, 0x2a, 0x8d, 0x88, 0x37, 0x4e, 0xb5, 0x30, 0xc6, 0xeb, 0xcb, - 0xc1, 0x28, 0xbe, 0x16, 0xfd, 0xb6, 0x1c, 0x78, 0x36, 0xf7, 0xea, 0x49, 0x58, 0xfe, 0x1b, 0xdd, - 0x7d, 0x55, 0x04, 0x0c, 0xba, 0xdd, 0xf0, 0xb1, 0xde, 0xb8, 0x9a, 0x5c, 0xeb, 0x89, 0xea, 0x1b, - 0xae, 0x68, 0xe6, 0xb1, 0xb6, 0x01, 0x88, 0x47, 0x05, 0x7f, 0xc1, 0x42, 0x34, 0x0a, 0xf0, 0x04, - 0xa6, 0x02, 0x38, 0x91, 0xa0, 0xfc, 0x2f, 0x7c, 0x10, 0xae, 0xcf, 0x34, 0x62, 0x63, 0xe6, 0x30, - 0xd7, 0x23, 0x6a, 0xf3, 0x04, 0xe6, 0x0b, 0x41, 0x23, 0xd1, 0x9b, 0xca, 0x70, 0x9f, 0x86, 0xac, - 0xd1, 0x38, 0x72, 0x84, 0xfa, 0x3b, 0xee, 0x94, 0x4a, 0x7b, 0xe7, 0xa3, 0x2a, 0xb9, 0x55, 0xd0, - 0xea, 0x4c, 0x42, 0x66, 0xb1, 0xd5, 0x6f, 0xd7, 0xb3, 0x79, 0xdf, 0x9d, 0x3c, 0xf8, 0x9b, 0x9c, - 0xd1, 0x48, 0xef, 0x95, 0x3a, 0xf3, 0x59, 0xdd, 0x77, 0x82, 0x4c, 0x82, 0x1e, 0x04, 0x9d, 0x00, - 0x1c, 0x22, 0xe2, 0x14, 0xdc, 0x8b, 0x01, 0x0e, 0xbc, 0x4d, 0x08, 0x70, 0x86, 0xa8, 0x04, 0x1d, - 0xc3, 0xcd, 0xb3, 0x2d, 0x4f, 0xe2, 0x99, 0x7e, 0xfd, 0x69, 0x1a, 0xe6, 0x1f, 0x8d, 0x51, 0x94, - 0x5d, 0x1c, 0x72, 0x56, 0xe4, 0xc6, 0x32, 0xec, 0xab, 0x2c, 0x40, 0x71, 0x26, 0xf3, 0xc9, 0x6e, - 0x52, 0x90, 0xca, 0xeb, 0xa6, 0x20, 0xdb, 0x1c, 0xf3, 0xce, 0x0d, 0x1b, 0x6c, 0xad, 0x2f, 0x4e, - 0x45, 0x56, 0xbc, 0x26, 0xde, 0x2f, 0xad, 0xc5, 0xd5, 0xab, 0xb2, 0x53, 0x3d, 0x90, 0xce, 0x24, - 0x93, 0xc9, 0x15, 0x67, 0xef, 0xc9, 0x98, 0xa3, 0x7e, 0xbb, 0x7a, 0x01, 0x83, 0xa1, 0x61, 0xb9, - 0x67, 0xeb, 0x89, 0x4d, 0xaf, 0x69, 0xd3, 0xeb, 0x38, 0xb9, 0x5a, 0xed, 0xdb, 0x38, 0xa5, 0xb2, - 0x97, 0xd5, 0xe1, 0xb2, 0x14, 0xd1, 0x30, 0xd0, 0x14, 0xb1, 0x72, 0xb7, 0xce, 0x8c, 0x29, 0x93, - 0x65, 0x7b, 0xe0, 0xda, 0xf5, 0xee, 0x44, 0x0b, 0xa1, 0x7a, 0xb5, 0x3f, 0xbb, 0x2a, 0x87, 0x33, - 0x07, 0xbb, 0xcf, 0x0e, 0x3a, 0x9d, 0xce, 0x5f, 0x7a, 0xde, 0xf1, 0xe6, 0xc0, 0x09, 0xd5, 0xe9, - 0x36, 0x79, 0x04, 0x0a, 0x07, 0xde, 0xba, 0x5e, 0x8a, 0x8d, 0x4d, 0xbd, 0x98, 0x0f, 0x1e, 0x68, - 0xdd, 0xda, 0x7d, 0xf6, 0xf2, 0xc5, 0x8b, 0x17, 0xa4, 0xb5, 0xcc, 0x52, 0x17, 0xee, 0xe4, 0x9c, - 0xcd, 0x2c, 0x88, 0x6a, 0xed, 0x2e, 0xc5, 0x2a, 0x60, 0xa6, 0xcf, 0xd7, 0xff, 0xb7, 0x29, 0x0b, - 0x38, 0xf8, 0xf9, 0x60, 0xeb, 0x97, 0x2c, 0xbf, 0x8c, 0x33, 0x6f, 0xd8, 0x37, 0x65, 0x31, 0x78, - 0x8e, 0x5d, 0xf8, 0x3a, 0xf6, 0x7e, 0x39, 0x1d, 0x9e, 0x18, 0xcf, 0x7f, 0xff, 0x47, 0x40, 0x57, - 0xef, 0xcb, 0x4d, 0x9b, 0xea, 0x71, 0x64, 0xb0, 0xe5, 0x23, 0x2e, 0xee, 0xe8, 0x5f, 0x2b, 0x35, - 0xa1, 0xff, 0x8c, 0x68, 0xfc, 0x7e, 0x3b, 0x3a, 0x3d, 0x7c, 0x1e, 0x56, 0x6b, 0xc2, 0xd3, 0xe2, - 0x5f, 0xa5, 0x44, 0x06, 0xe2, 0x07, 0xda, 0x45, 0xbb, 0x1d, 0x50, 0x06, 0x92, 0xca, 0xd1, 0x9b, - 0x57, 0xdd, 0xba, 0xa9, 0xa8, 0x3d, 0x55, 0xd7, 0xd4, 0x55, 0x57, 0x57, 0xf5, 0x79, 0x87, 0xcb, - 0xe0, 0x7a, 0xf3, 0xca, 0xb9, 0xd1, 0x29, 0xe6, 0x6c, 0xd9, 0xaa, 0xaf, 0xb5, 0x7f, 0xde, 0x96, - 0xab, 0x4d, 0xd3, 0x3c, 0x4b, 0x31, 0xd3, 0xb8, 0x1d, 0x03, 0x6f, 0x74, 0xfc, 0xa1, 0xbb, 0xd1, - 0xbe, 0x7c, 0xf7, 0xa0, 0xe3, 0x0f, 0xd0, 0xf4, 0x9d, 0x93, 0x36, 0x0f, 0xc2, 0x8e, 0xc1, 0x53, - 0xfd, 0x7f, 0x83, 0xf0, 0xe8, 0x74, 0xf8, 0xff, 0x87, 0xf5, 0xe3, 0xc9, 0x68, 0xf8, 0x83, 0xb8, - 0xd2, 0x96, 0x1f, 0x04, 0xd6, 0x6d, 0x71, 0xc8, 0xfe, 0xfa, 0xc3, 0xd0, 0xfe, 0xfa, 0xe3, 0xd8, - 0xfe, 0x8a, 0xb3, 0x8e, 0x47, 0x8f, 0x9f, 0xb4, 0xf5, 0xd4, 0x51, 0xc7, 0xa3, 0xef, 0x5e, 0x6a, - 0xe3, 0x1c, 0xc8, 0x3b, 0x5e, 0xaa, 0x78, 0x0d, 0x45, 0x60, 0xd0, 0xfc, 0x61, 0xd4, 0x30, 0x7b, - 0x14, 0x45, 0x4d, 0x26, 0xe9, 0xef, 0x51, 0xd3, 0x92, 0x65, 0xb6, 0x7e, 0x88, 0x66, 0xda, 0xc4, - 0xa7, 0xf8, 0x22, 0xce, 0x25, 0x02, 0xa6, 0x7f, 0x8a, 0xff, 0x03, 0x76, 0xda, 0xd5, 0xdf, 0x3f, - 0x16, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x58, 0x5b, 0x73, 0xdb, 0xb8, + 0x15, 0x7e, 0xf7, 0xaf, 0xa0, 0x11, 0x8f, 0x4d, 0x8e, 0x68, 0x4a, 0x8e, 0xbb, 0xdb, 0x44, 0x12, + 0xe4, 0x26, 0x4e, 0x76, 0xa3, 0xe6, 0x62, 0xcf, 0x68, 0x2f, 0xd3, 0x71, 0x3d, 0x6b, 0x9a, 0x84, + 0x24, 0xc4, 0x14, 0xc8, 0x02, 0xa0, 0x2f, 0x95, 0xf5, 0xdf, 0xfb, 0x1d, 0x90, 0xd4, 0xc5, 0xb1, + 0xd3, 0xcd, 0x76, 0xf6, 0xa5, 0x2f, 0x12, 0x09, 0x1c, 0x1c, 0x9c, 0xf3, 0x9d, 0x3b, 0xfb, 0xdb, + 0x6f, 0x4e, 0x8e, 0x7f, 0xfa, 0xc7, 0xe9, 0x5b, 0x6f, 0x6a, 0x67, 0xd9, 0xa0, 0x5f, 0xff, 0x8a, + 0x38, 0xf5, 0xb2, 0x58, 0x4d, 0x38, 0x13, 0x8a, 0x0d, 0xfa, 0x33, 0x61, 0x63, 0x2f, 0x99, 0xc6, + 0xda, 0x08, 0xcb, 0x59, 0x69, 0xc7, 0xfb, 0x2f, 0x9a, 0xd5, 0x2d, 0x15, 0xcf, 0x04, 0x67, 0xd7, + 0x52, 0xdc, 0x14, 0xb9, 0xb6, 0xcc, 0x4b, 0x72, 0x65, 0x85, 0x02, 0xd9, 0x8d, 0x4c, 0xed, 0x94, + 0x7f, 0xd7, 0xe9, 0x2c, 0x49, 0x1f, 0x6c, 0xa5, 0xe2, 0x5a, 0x26, 0x62, 0xdf, 0xbd, 0x84, 0x52, + 0x49, 0x2b, 0xe3, 0x6c, 0xdf, 0x24, 0x71, 0x26, 0xf8, 0x41, 0x38, 0x8b, 0x6f, 0xe5, 0xac, 0x9c, + 0x2d, 0xdf, 0x4b, 0x23, 0xb4, 0x7b, 0x89, 0x2f, 0xf1, 0xae, 0x72, 0xf6, 0xc5, 0xcd, 0x83, 0xbe, + 0x95, 0x36, 0x13, 0x83, 0x9f, 0x41, 0x39, 0xcb, 0x53, 0x6f, 0x24, 0xac, 0x95, 0x6a, 0x62, 0xfa, + 0xed, 0x6a, 0xbd, 0x6f, 0x12, 0x2d, 0x0b, 0x3b, 0xd8, 0xba, 0x8e, 0xb5, 0x97, 0xdf, 0x28, 0xa1, + 0xc3, 0x2c, 0x4f, 0x64, 0x11, 0x96, 0x3a, 0xbf, 0x31, 0x61, 0xca, 0xd3, 0x3c, 0x29, 0x67, 0x90, + 0x2f, 0x2c, 0x67, 0xc7, 0xe3, 0x09, 0x9f, 0x2f, 0xc2, 0x42, 0x2a, 0xc3, 0xcf, 0xbe, 0x0f, 0xff, + 0x1a, 0xbe, 0x08, 0x5f, 0x86, 0x07, 0x9d, 0xf0, 0xe0, 0xe0, 0x9c, 0x16, 0x4f, 0xf8, 0x19, 0xd3, + 0xe6, 0x3a, 0x65, 0xe1, 0x7f, 0xff, 0x3b, 0xa7, 0x5b, 0xf8, 0xf6, 0x41, 0xa8, 0xca, 0xd9, 0x47, + 0xde, 0xe9, 0x8d, 0x4b, 0x95, 0x58, 0x99, 0x2b, 0x6f, 0x32, 0x4c, 0x7d, 0x11, 0xcc, 0xb5, 0xb0, + 0xa5, 0x56, 0x5e, 0x1a, 0x4d, 0x84, 0x7d, 0x9b, 0x09, 0x12, 0xe0, 0xf5, 0x9d, 0xdb, 0x5a, 0x2c, + 0x49, 0xa5, 0x39, 0x59, 0x23, 0x15, 0xbb, 0xbb, 0x2c, 0xbf, 0xfc, 0x2c, 0x12, 0xcb, 0x38, 0xb7, + 0x77, 0x85, 0xc8, 0xc7, 0xb4, 0xb6, 0xfd, 0x4a, 0xeb, 0xf8, 0x2e, 0x92, 0xc6, 0xfd, 0x6f, 0x9c, + 0x7f, 0xe7, 0x07, 0xf3, 0x1b, 0xa9, 0xd2, 0xfc, 0x26, 0xca, 0x0b, 0xa1, 0x7c, 0x36, 0xb5, 0xb6, + 0x30, 0xdd, 0x76, 0x7b, 0x22, 0xed, 0xb4, 0xbc, 0x8c, 0x92, 0x7c, 0xd6, 0x7e, 0x25, 0x75, 0x92, + 0xe7, 0xf9, 0x95, 0x14, 0xed, 0x5f, 0x3f, 0xbc, 0x7d, 0xd3, 0xbe, 0x91, 0x57, 0xb2, 0xdd, 0x60, + 0xf8, 0xac, 0xac, 0x40, 0xdd, 0x37, 0xf5, 0x02, 0x5b, 0xe3, 0xfe, 0xfa, 0x21, 0xf7, 0xf6, 0x92, + 0x2a, 0x64, 0xbf, 0x19, 0x91, 0x8d, 0xd7, 0xa9, 0xb3, 0x3c, 0x4e, 0xff, 0x3e, 0xf2, 0x45, 0x68, + 0xf9, 0x76, 0x27, 0x98, 0x67, 0xc2, 0x7a, 0x8a, 0xa7, 0x51, 0xa2, 0x45, 0x6c, 0x45, 0x0d, 0x80, + 0xcf, 0x2a, 0x5b, 0xb1, 0xa0, 0xa7, 0x22, 0x30, 0x7b, 0x65, 0xad, 0x96, 0x97, 0xa5, 0x15, 0xd8, + 0xd0, 0x09, 0x0b, 0x45, 0x10, 0x3e, 0x5c, 0x27, 0x1c, 0x70, 0x9d, 0x15, 0xb7, 0xb6, 0xfd, 0x39, + 0xbe, 0x8e, 0x1b, 0x06, 0x5f, 0x10, 0xc6, 0xe6, 0x4e, 0x81, 0x85, 0x0d, 0xc2, 0x34, 0xba, 0xcc, + 0xd3, 0xbb, 0x28, 0x2e, 0x20, 0x74, 0x7a, 0x3c, 0x95, 0x59, 0xea, 0x2b, 0xa2, 0x8f, 0xd3, 0xf4, + 0xed, 0x35, 0xa4, 0xf8, 0x20, 0x0d, 0xdc, 0x55, 0x68, 0x9f, 0x91, 0xcc, 0x2c, 0xf4, 0x03, 0x3e, + 0x98, 0xff, 0x28, 0xec, 0x2f, 0x7e, 0xb0, 0x78, 0x9c, 0x4e, 0x68, 0x9d, 0x6b, 0x88, 0x07, 0x3a, + 0xf8, 0xba, 0xc9, 0x33, 0x11, 0x65, 0xf9, 0xc4, 0x67, 0x6f, 0x69, 0xdd, 0xab, 0x95, 0x07, 0x30, + 0xde, 0x58, 0x66, 0xc2, 0xa9, 0x01, 0xe7, 0xd6, 0x50, 0xf7, 0x43, 0xbd, 0x0e, 0x4b, 0xe2, 0xe0, + 0x58, 0x4e, 0x4a, 0x1d, 0x3b, 0xb4, 0x2a, 0x35, 0xbc, 0x71, 0x8c, 0x03, 0x69, 0xf4, 0x4f, 0x35, + 0x54, 0xb0, 0x55, 0x01, 0xd0, 0x84, 0x57, 0xc4, 0x13, 0xe1, 0xa5, 0xb1, 0x8d, 0xb7, 0x01, 0xef, + 0x1a, 0xc0, 0x23, 0x98, 0x83, 0xd1, 0x05, 0x5d, 0xb8, 0x47, 0x6d, 0x17, 0xb8, 0xa0, 0xe3, 0x17, + 0x15, 0x3a, 0xb7, 0x79, 0x92, 0x67, 0xbb, 0xbb, 0xbe, 0x73, 0xcb, 0x4e, 0xe8, 0xbb, 0x20, 0xe0, + 0x44, 0x91, 0x8d, 0x6c, 0xae, 0xc1, 0x95, 0x5c, 0x71, 0x68, 0xc5, 0x8c, 0x14, 0x4f, 0x86, 0x05, + 0x0b, 0x82, 0xfb, 0xfb, 0x9a, 0x0c, 0xe7, 0x67, 0x05, 0x04, 0xfe, 0x01, 0xfc, 0xbd, 0x8f, 0x79, + 0x2a, 0x22, 0xef, 0x34, 0x13, 0xb1, 0x11, 0x1e, 0x80, 0x10, 0xda, 0x23, 0xd7, 0xf1, 0x86, 0xa7, + 0x10, 0x29, 0xdc, 0xe0, 0x68, 0x36, 0x39, 0x56, 0x91, 0x17, 0x04, 0xa0, 0x4a, 0x21, 0xaf, 0x8b, + 0x0d, 0xdc, 0x41, 0x21, 0xc1, 0xca, 0x19, 0x0b, 0x22, 0xa9, 0x00, 0xe8, 0xbb, 0x9f, 0x3e, 0x7e, + 0xe0, 0xec, 0x53, 0xee, 0xd5, 0x21, 0x6d, 0x3c, 0xc4, 0xa3, 0x8d, 0x33, 0x82, 0x82, 0x6d, 0x84, + 0xc7, 0x0f, 0xeb, 0xe1, 0xc1, 0x39, 0x6f, 0x21, 0x1e, 0xc4, 0x36, 0xe7, 0x7e, 0xe7, 0x7e, 0x33, + 0x8e, 0x86, 0x8f, 0x11, 0xf2, 0x2f, 0x08, 0x93, 0xa9, 0x48, 0xae, 0xc8, 0x47, 0x83, 0x39, 0x65, + 0x0b, 0xc5, 0x45, 0x44, 0xd9, 0x26, 0xd2, 0xa2, 0xc8, 0xe2, 0x04, 0x5e, 0x74, 0x76, 0x0e, 0x67, + 0x83, 0x9c, 0xa6, 0xbc, 0x34, 0x56, 0xfb, 0xfb, 0x87, 0x41, 0x4f, 0x8e, 0x7d, 0x06, 0x3d, 0x2e, + 0x85, 0x06, 0xee, 0x22, 0x22, 0x87, 0x44, 0xa0, 0x22, 0x5b, 0xe0, 0x55, 0x35, 0x84, 0x9d, 0xf0, + 0x30, 0x08, 0xe6, 0xe3, 0x5c, 0xfb, 0xc4, 0x57, 0x22, 0x1f, 0xc8, 0x3e, 0x65, 0x99, 0x28, 0x13, + 0x6a, 0x62, 0xa7, 0x3d, 0xd9, 0x6a, 0x05, 0x60, 0x64, 0xb7, 0x39, 0xa5, 0x99, 0x33, 0x79, 0x1e, + 0xcc, 0xf1, 0x2a, 0xa2, 0xeb, 0x38, 0x2b, 0x21, 0x27, 0x91, 0x62, 0x11, 0x7c, 0xe5, 0x18, 0x6c, + 0x57, 0x44, 0x40, 0xd8, 0xde, 0xc1, 0xdd, 0x60, 0xda, 0x5c, 0x73, 0x96, 0xc9, 0x99, 0x60, 0xbd, + 0x4b, 0xc4, 0xd4, 0xd5, 0xe2, 0x91, 0xf3, 0xf7, 0xf7, 0xf5, 0x4a, 0x7f, 0xff, 0x60, 0xf9, 0x3c, + 0x38, 0x7c, 0xf9, 0x05, 0x1f, 0x2d, 0xd2, 0x86, 0xcd, 0xe6, 0xce, 0xf2, 0xcc, 0xe1, 0x11, 0x83, + 0x85, 0xd5, 0x44, 0xb0, 0x2e, 0x7b, 0x36, 0x1e, 0x8f, 0xd9, 0x62, 0x21, 0x32, 0x23, 0xe6, 0xe6, + 0x46, 0xda, 0x64, 0xea, 0x57, 0xb8, 0x05, 0xf3, 0x04, 0x2e, 0xc2, 0x46, 0x6f, 0x5e, 0xb1, 0x6e, + 0xf5, 0x74, 0xfc, 0xa1, 0x7e, 0xfa, 0x78, 0x32, 0x1a, 0xae, 0x16, 0xdf, 0xd7, 0x8f, 0xc7, 0x23, + 0xd6, 0x75, 0xd7, 0xf6, 0x52, 0x31, 0x8e, 0xcb, 0xcc, 0x76, 0x2b, 0x9b, 0x2d, 0x08, 0xb9, 0xff, + 0x4f, 0xd4, 0x56, 0xce, 0x87, 0xe8, 0x3b, 0xc5, 0x8d, 0xe4, 0xa9, 0x90, 0xa2, 0xca, 0xfd, 0x01, + 0x29, 0x4e, 0x39, 0xc5, 0x9e, 0xa9, 0x50, 0x9e, 0x23, 0x4f, 0x9c, 0xb8, 0x0a, 0x10, 0x21, 0xec, + 0xb4, 0x14, 0x44, 0x1c, 0xd4, 0xc4, 0x32, 0x08, 0x5c, 0x75, 0xe3, 0x2a, 0x6c, 0x38, 0xc9, 0xa0, + 0x47, 0x46, 0xf1, 0xc8, 0x45, 0x1b, 0x87, 0xfc, 0x8a, 0x2b, 0x13, 0xa7, 0xcd, 0x62, 0x22, 0x2b, + 0x01, 0xc8, 0x67, 0x2d, 0xd0, 0xb7, 0x7d, 0xd9, 0x40, 0x6f, 0x09, 0xfa, 0x33, 0x7b, 0x3e, 0xe0, + 0x1d, 0xe4, 0x14, 0x67, 0x94, 0xa2, 0x34, 0x53, 0x9f, 0xd6, 0x02, 0x57, 0x2b, 0xab, 0x77, 0x27, + 0x52, 0xd0, 0xc8, 0xf1, 0x05, 0xf5, 0xd3, 0xa4, 0x4f, 0x88, 0xf2, 0x88, 0x18, 0x4b, 0x6d, 0xe9, + 0xea, 0x15, 0x9c, 0x48, 0xd3, 0x3f, 0x48, 0x81, 0xe4, 0x8e, 0x70, 0x0e, 0x01, 0x1e, 0x6a, 0xf1, + 0x12, 0x58, 0x85, 0x60, 0x74, 0xe5, 0xbf, 0xc5, 0xf7, 0xfa, 0x53, 0xed, 0x39, 0x63, 0xd5, 0xfd, + 0x49, 0xf7, 0xf9, 0xf7, 0x9d, 0xe2, 0x96, 0x0d, 0xf6, 0x7a, 0x2b, 0xec, 0x65, 0xa8, 0x1f, 0xc1, + 0x1e, 0x5c, 0x58, 0xa9, 0xae, 0x14, 0x04, 0x27, 0xf7, 0xb2, 0xe4, 0x1c, 0x52, 0x25, 0x59, 0x99, + 0x62, 0x13, 0x16, 0x0e, 0x8e, 0xd6, 0x64, 0x00, 0x8b, 0xa0, 0xbb, 0x7a, 0x6f, 0x61, 0xbf, 0x65, + 0xdd, 0xea, 0xe2, 0x71, 0x85, 0xd5, 0x0a, 0x7b, 0x0d, 0xa5, 0x75, 0x5f, 0x35, 0x4a, 0x6b, 0x28, + 0xbd, 0xa9, 0xdd, 0x99, 0x3e, 0x0f, 0x51, 0x55, 0x1d, 0x74, 0x2e, 0x73, 0x99, 0x30, 0x6b, 0x5a, + 0x04, 0xd5, 0xab, 0x63, 0x32, 0xab, 0xc3, 0xf1, 0x32, 0x47, 0x81, 0x8a, 0x15, 0xeb, 0x66, 0x9c, + 0xb9, 0x84, 0x77, 0x99, 0xdf, 0xb2, 0xd0, 0xf0, 0xbd, 0xca, 0xed, 0x99, 0xd5, 0xa5, 0x60, 0x7b, + 0x2d, 0x5f, 0x1d, 0xb1, 0x2a, 0x21, 0xc2, 0xad, 0xbb, 0xf0, 0x94, 0xca, 0xb5, 0x7b, 0x8e, 0x47, + 0x9d, 0xf0, 0xba, 0x86, 0x5f, 0xd4, 0xa7, 0x76, 0xe6, 0x6a, 0xc1, 0x2e, 0xc2, 0xda, 0xcf, 0xb8, + 0x5d, 0xf3, 0xab, 0x23, 0x9f, 0x70, 0xf6, 0xd0, 0xda, 0x71, 0x76, 0xf8, 0x92, 0x79, 0x33, 0xa9, + 0x38, 0xdb, 0x3f, 0x00, 0xf7, 0x2c, 0x36, 0x86, 0x33, 0xc3, 0xf6, 0x20, 0x2e, 0x93, 0x0a, 0x75, + 0xbb, 0xeb, 0x48, 0x51, 0x58, 0x0b, 0xce, 0x62, 0x75, 0xb7, 0xa4, 0xb9, 0xbd, 0xcd, 0xd8, 0x5e, + 0x6f, 0x33, 0x37, 0xe0, 0x0c, 0xd5, 0x7d, 0x92, 0x7d, 0x43, 0x8a, 0x07, 0xe6, 0xfc, 0x0e, 0xe6, + 0xec, 0xb1, 0x8b, 0xc5, 0x03, 0xe3, 0xc0, 0x11, 0x6b, 0x17, 0x10, 0x8d, 0xac, 0x44, 0x91, 0x8a, + 0xdb, 0x93, 0xb1, 0x23, 0x68, 0x1d, 0xa0, 0x4e, 0xd5, 0x24, 0x17, 0xde, 0xce, 0xdc, 0x2e, 0xba, + 0x1e, 0x14, 0x5c, 0x42, 0xc6, 0x79, 0x76, 0xd4, 0x6c, 0xf7, 0xa5, 0x2a, 0x4a, 0xeb, 0x11, 0xe4, + 0x9c, 0x4d, 0x65, 0x9a, 0xa2, 0x7f, 0xf6, 0xaa, 0x46, 0x75, 0x67, 0x2e, 0x16, 0x5d, 0x3a, 0xbd, + 0x33, 0x97, 0x47, 0x14, 0x75, 0xc0, 0x12, 0x32, 0xd6, 0x02, 0x8f, 0x63, 0x98, 0x8c, 0x0d, 0x2e, + 0xba, 0x12, 0x75, 0xf0, 0x7f, 0xe6, 0xb6, 0x33, 0xcf, 0x16, 0x60, 0xb6, 0x12, 0x7b, 0x83, 0xd3, + 0xce, 0xdc, 0x61, 0xcc, 0x49, 0xf0, 0xa5, 0x05, 0x71, 0xe0, 0xeb, 0xac, 0x77, 0xe6, 0x66, 0x81, + 0x1e, 0xc6, 0x31, 0xaa, 0x1d, 0xc6, 0xb7, 0x53, 0x69, 0xc2, 0xbd, 0x9d, 0xf9, 0xd3, 0xc8, 0x2d, + 0xf6, 0x02, 0x74, 0xe6, 0x97, 0x7a, 0x70, 0xb1, 0xd8, 0x08, 0xc9, 0x37, 0x3a, 0x2f, 0xd0, 0x99, + 0xa8, 0xaa, 0xc8, 0x3e, 0xd5, 0x05, 0x8a, 0x8c, 0xba, 0xdc, 0x00, 0x41, 0xbb, 0xde, 0x1f, 0x9b, + 0xd7, 0x77, 0x9f, 0x20, 0x69, 0x13, 0x3c, 0xc1, 0xd9, 0xc1, 0x39, 0x55, 0x5f, 0x89, 0x04, 0x3f, + 0xfc, 0x74, 0xfa, 0xf3, 0x4f, 0xa4, 0x99, 0x8c, 0x6c, 0x3c, 0x21, 0x2a, 0x98, 0xb7, 0xf2, 0x8e, + 0x6a, 0x11, 0x00, 0xdc, 0xdf, 0xaf, 0xea, 0x74, 0xbd, 0x14, 0x54, 0x22, 0x08, 0xbc, 0x3a, 0x04, + 0x7b, 0xd2, 0xd5, 0xad, 0xde, 0x66, 0xe0, 0xc9, 0x28, 0x6e, 0xfa, 0xc8, 0x65, 0xe9, 0x69, 0xb5, + 0x74, 0xd5, 0x23, 0x18, 0xbe, 0xbe, 0x8d, 0x40, 0xec, 0x55, 0x3d, 0xe9, 0x36, 0x37, 0x8e, 0x17, + 0x84, 0x73, 0xac, 0xd7, 0x17, 0x9c, 0x4f, 0xaf, 0x2f, 0x38, 0x87, 0x5d, 0x5b, 0x78, 0xd0, 0xbc, + 0x56, 0xcb, 0xa1, 0xa9, 0x84, 0x0c, 0x16, 0x75, 0x23, 0xf3, 0xb0, 0xc5, 0xa5, 0xa6, 0x70, 0x1f, + 0x24, 0xae, 0xc3, 0x94, 0x51, 0x11, 0x6b, 0x80, 0x56, 0x63, 0xd7, 0xe4, 0xfd, 0xba, 0xdf, 0x0d, + 0x91, 0x79, 0xd5, 0x92, 0x4f, 0x99, 0x65, 0x1b, 0x46, 0x3a, 0x29, 0xe8, 0xa9, 0x4a, 0x2d, 0x2e, + 0x67, 0x12, 0x05, 0x40, 0x13, 0x41, 0x75, 0xa2, 0x47, 0xa0, 0xc9, 0x2f, 0xed, 0x96, 0xbb, 0x73, + 0xc8, 0x14, 0x35, 0x9c, 0x28, 0x45, 0xc0, 0x19, 0x46, 0xe0, 0x36, 0x14, 0x1b, 0x0d, 0x37, 0x2a, + 0x13, 0x61, 0x4c, 0x7c, 0xaa, 0x8c, 0x8e, 0x52, 0x49, 0x1b, 0x9f, 0xd0, 0x5a, 0x9a, 0xf5, 0xe4, + 0x3e, 0x5f, 0xdf, 0x40, 0x82, 0x6f, 0x6a, 0xb3, 0x88, 0x48, 0x5b, 0xe8, 0x4f, 0x0b, 0xb0, 0x35, + 0xb5, 0x9a, 0xe4, 0x34, 0x22, 0x1d, 0x92, 0x23, 0x72, 0x1b, 0x6c, 0xfa, 0xdd, 0x50, 0x8d, 0xf3, + 0x46, 0xa1, 0x46, 0xfa, 0x47, 0x3c, 0x8b, 0x44, 0xaf, 0x6e, 0x27, 0xff, 0x81, 0x67, 0xa3, 0x3b, + 0x5f, 0x4d, 0x5b, 0x76, 0x77, 0x57, 0x9e, 0x75, 0xce, 0x8f, 0xe8, 0x27, 0x72, 0x70, 0x4e, 0xf3, + 0x2c, 0x45, 0xc9, 0xb5, 0x5d, 0x2a, 0x3e, 0xb4, 0x0b, 0x09, 0x51, 0x8b, 0xd0, 0xdc, 0xbf, 0x4a, + 0x3f, 0x63, 0x5f, 0x59, 0x6a, 0x66, 0x31, 0x7d, 0x8c, 0xd1, 0x25, 0x43, 0x7b, 0x94, 0xdc, 0x5d, + 0x75, 0x69, 0x8a, 0x1e, 0x6b, 0x21, 0xbf, 0xaf, 0x4d, 0x47, 0xd4, 0x0e, 0xcf, 0xc7, 0x82, 0xf2, + 0x34, 0xb5, 0xdc, 0x47, 0x6e, 0x54, 0xc3, 0xa4, 0xc6, 0x5a, 0xae, 0x65, 0xa6, 0xfc, 0xdb, 0x62, + 0xed, 0x64, 0x3c, 0x89, 0x3e, 0x1b, 0x40, 0x1c, 0xce, 0x31, 0x5a, 0x4f, 0xf3, 0xb4, 0xcb, 0xa0, + 0x04, 0x5b, 0x04, 0x91, 0x9d, 0x62, 0x02, 0xc3, 0x00, 0x02, 0x20, 0xf2, 0xab, 0xa6, 0xa5, 0x46, + 0x6a, 0xd1, 0x9a, 0x4a, 0xbc, 0xeb, 0x45, 0x52, 0x69, 0x20, 0xf3, 0x1d, 0x25, 0xda, 0x4c, 0x2a, + 0x81, 0xf0, 0x12, 0x8e, 0x99, 0x8f, 0x7e, 0x7c, 0x79, 0x9e, 0xac, 0x5d, 0xcd, 0xc1, 0x22, 0x2a, + 0x67, 0xe1, 0xaa, 0x27, 0xa9, 0x52, 0x0a, 0x67, 0x2c, 0xa4, 0x02, 0xea, 0x48, 0xd6, 0xbb, 0x13, + 0x40, 0xfb, 0x48, 0x85, 0xac, 0xc9, 0x96, 0xd9, 0x68, 0xaa, 0x07, 0xfd, 0xe9, 0xe1, 0x80, 0x32, + 0x4d, 0xbf, 0x8d, 0x87, 0x8b, 0x70, 0xad, 0x8e, 0x2d, 0x6b, 0x29, 0x32, 0x43, 0x8f, 0x51, 0x90, + 0xba, 0x73, 0x4d, 0x9e, 0xe6, 0x6c, 0x39, 0x0e, 0x6c, 0xce, 0x4a, 0x2a, 0xc7, 0xa0, 0x94, 0x97, + 0x2a, 0x8d, 0x28, 0xdf, 0x9c, 0x6a, 0x61, 0x8c, 0xd7, 0x97, 0x83, 0x51, 0x7c, 0x2d, 0xfa, 0x6d, + 0x39, 0xf0, 0x6c, 0xee, 0xd5, 0x5f, 0x19, 0xe4, 0xbf, 0x31, 0x39, 0x55, 0xc5, 0xc3, 0x60, 0x92, + 0x08, 0x1f, 0x9b, 0x3b, 0xaa, 0xaf, 0x02, 0xf5, 0xb4, 0xfa, 0x15, 0x53, 0x34, 0xb3, 0x6e, 0xdb, + 0x00, 0xc4, 0xa3, 0x82, 0xbf, 0x60, 0x21, 0x1a, 0x0c, 0x58, 0x02, 0x13, 0x17, 0x35, 0xc0, 0x80, + 0xf2, 0x77, 0xd8, 0x20, 0x5c, 0x9f, 0x17, 0xc5, 0xc6, 0x3c, 0x67, 0xae, 0x47, 0xd4, 0x0a, 0x0a, + 0xcc, 0x6e, 0x82, 0xc6, 0xcd, 0x37, 0x95, 0xe0, 0x3e, 0x0d, 0xb0, 0xa3, 0x71, 0xe4, 0x12, 0xf1, + 0x2f, 0xd0, 0x29, 0x95, 0xf6, 0xce, 0x47, 0x35, 0x73, 0xab, 0x48, 0xc7, 0x33, 0x09, 0x9a, 0xc5, + 0x56, 0xbf, 0x5d, 0x7f, 0xf7, 0xe8, 0xbb, 0x9b, 0x07, 0x7f, 0x93, 0x33, 0xfa, 0x5c, 0xe2, 0x95, + 0x3a, 0xf3, 0x59, 0xdd, 0x9c, 0x22, 0x09, 0x05, 0x3d, 0x10, 0x3a, 0x02, 0x18, 0x44, 0xc4, 0x29, + 0x72, 0x36, 0x86, 0x63, 0xe4, 0x7b, 0x42, 0x80, 0x33, 0x78, 0x25, 0xd2, 0x38, 0xcc, 0x3c, 0xdb, + 0xf2, 0x24, 0xde, 0xe9, 0xe9, 0x37, 0xd3, 0x54, 0x8c, 0xd1, 0x18, 0xc5, 0xdc, 0xf9, 0x21, 0x67, + 0x45, 0x6e, 0x2c, 0xc3, 0xb9, 0x4a, 0x02, 0x14, 0x75, 0x12, 0x9f, 0xe4, 0x26, 0x06, 0xa9, 0xbc, + 0x6e, 0x0a, 0xb9, 0xcd, 0x31, 0x4b, 0xde, 0xb0, 0xc1, 0xd6, 0xfa, 0xe2, 0x54, 0x64, 0xc5, 0x6b, + 0xaa, 0x17, 0xa5, 0xb5, 0x50, 0xbd, 0x2a, 0x57, 0xd5, 0x0b, 0xf1, 0x4c, 0x32, 0x99, 0x5c, 0x71, + 0xf6, 0x8e, 0x84, 0x39, 0xea, 0xb7, 0xab, 0x0d, 0x08, 0x0c, 0x0e, 0xcb, 0x33, 0x5b, 0x4f, 0x1c, + 0x7a, 0x4d, 0x87, 0x5e, 0xc7, 0xc9, 0xd5, 0xea, 0xdc, 0xc6, 0x2d, 0x95, 0xbc, 0xac, 0x76, 0x97, + 0x25, 0x89, 0x86, 0x80, 0xa6, 0x88, 0x95, 0xd3, 0x3a, 0x33, 0xa6, 0x4c, 0x96, 0x6d, 0x85, 0xeb, + 0xe9, 0xbb, 0x13, 0x2d, 0x84, 0xea, 0xd5, 0xf6, 0xec, 0xaa, 0x1c, 0xc6, 0x1c, 0xec, 0x3e, 0x3b, + 0xe8, 0x74, 0x3a, 0x7f, 0xe9, 0x79, 0xc7, 0x9b, 0xc3, 0x3c, 0x58, 0xa7, 0xdb, 0x64, 0x11, 0x30, + 0x1c, 0x78, 0xeb, 0x7c, 0xc9, 0x37, 0x36, 0xf9, 0x62, 0x88, 0x78, 0xc0, 0x75, 0x6b, 0xf7, 0xd9, + 0xcb, 0x17, 0x2f, 0x5e, 0x10, 0xd7, 0x32, 0x4b, 0x9d, 0xbb, 0x93, 0x71, 0x36, 0xa3, 0x20, 0xaa, + 0xb9, 0xbb, 0x10, 0xab, 0x80, 0x99, 0x3e, 0x5f, 0xff, 0x26, 0x56, 0x16, 0x30, 0xf0, 0xf3, 0xc1, + 0xd6, 0x8f, 0x59, 0x7e, 0x19, 0x67, 0xde, 0xb0, 0x6f, 0xca, 0x62, 0xf0, 0x1c, 0xa7, 0xf0, 0x77, + 0xec, 0xfd, 0x78, 0x3a, 0x3c, 0x31, 0x9e, 0xff, 0xee, 0xd7, 0x80, 0x54, 0xef, 0xcb, 0x4d, 0x99, + 0xea, 0x99, 0x65, 0xb0, 0xe5, 0xc3, 0x2f, 0xee, 0xe8, 0x8b, 0xa0, 0x9a, 0xd0, 0xf7, 0x38, 0xfa, + 0xb4, 0xf1, 0x76, 0x74, 0x7a, 0xf8, 0x3c, 0xac, 0xd6, 0x84, 0xa7, 0xc5, 0xbf, 0x4a, 0x89, 0x08, + 0xc4, 0x03, 0xda, 0x4c, 0xbb, 0x1d, 0x50, 0x04, 0x12, 0x4b, 0xcc, 0x80, 0xdd, 0xba, 0x19, 0xa9, + 0x2d, 0x55, 0xd7, 0xe2, 0x55, 0x37, 0x58, 0xf5, 0x87, 0x87, 0x4b, 0xe7, 0xc2, 0xd4, 0x48, 0x66, + 0x74, 0x8c, 0xf9, 0xde, 0x5a, 0xe3, 0x41, 0xe3, 0x5c, 0xb0, 0xe7, 0x6d, 0x2d, 0xdb, 0x47, 0x6f, + 0x3d, 0x17, 0xbb, 0x83, 0x03, 0x0f, 0x53, 0x65, 0x77, 0xa3, 0xfb, 0x79, 0xfa, 0xbe, 0xfa, 0x8b, + 0x22, 0x0d, 0xa7, 0x5f, 0xbd, 0xf0, 0xa9, 0xfb, 0x70, 0x8e, 0x70, 0xf7, 0xb6, 0x1e, 0x1b, 0x23, + 0x6a, 0xbc, 0x47, 0xa7, 0xc3, 0x3f, 0x1f, 0x64, 0x1a, 0xaa, 0xbf, 0x11, 0x65, 0x37, 0x87, 0xff, + 0x21, 0x98, 0xdd, 0x49, 0x87, 0xf3, 0xfb, 0x6f, 0x07, 0xfa, 0xfd, 0x1f, 0x45, 0xfa, 0x3d, 0xae, + 0x3c, 0x1e, 0x7d, 0xa3, 0x92, 0xc7, 0xa3, 0xdf, 0x7b, 0xdd, 0xd6, 0xc6, 0x7d, 0x38, 0x57, 0xe5, + 0x2e, 0x0a, 0x56, 0xd4, 0x89, 0x41, 0xf3, 0xbd, 0xae, 0x49, 0xfe, 0x51, 0x14, 0x35, 0xc1, 0xa6, + 0xff, 0x9c, 0x4c, 0x84, 0xac, 0x41, 0x39, 0x17, 0x31, 0x4d, 0x79, 0x99, 0x92, 0x34, 0x7d, 0xa9, + 0xff, 0x0f, 0x76, 0xa1, 0x03, 0xfa, 0xbf, 0x17, 0x00, 0x00 }; diff --git a/wled00/set.cpp b/wled00/set.cpp index 70f624fd..27c187a7 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -478,49 +478,53 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) if (!requestJSONBufferLock(5)) return; // global I2C & SPI pins - uint8_t oldpins[3]; - int8_t hw_sda_pin = max(-1,min(33,(int)request->arg(F("SDA")).toInt())); - int8_t hw_scl_pin = max(-1,min(33,(int)request->arg(F("SCL")).toInt())); - oldpins[0] = i2c_sda; - oldpins[1] = i2c_scl; - pinManager.deallocateMultiplePins(oldpins, 2, PinOwner::HW_I2C); + int8_t hw_sda_pin = !request->arg(F("SDA")).length() ? -1 : max(-1,min(33,(int)request->arg(F("SDA")).toInt())); + int8_t hw_scl_pin = !request->arg(F("SCL")).length() ? -1 : max(-1,min(33,(int)request->arg(F("SCL")).toInt())); #ifdef ESP8266 // cannot change pins on ESP8266 - if (hw_sda_pin != HW_PIN_SDA) hw_sda_pin = HW_PIN_SDA; - if (hw_scl_pin != HW_PIN_SCL) hw_scl_pin = HW_PIN_SCL; + if (hw_sda_pin >= 0 && hw_sda_pin != HW_PIN_SDA) hw_sda_pin = HW_PIN_SDA; + if (hw_scl_pin >= 0 && hw_scl_pin != HW_PIN_SCL) hw_scl_pin = HW_PIN_SCL; #endif PinManagerPinType i2c[2] = { { hw_sda_pin, true }, { hw_scl_pin, true } }; - if (pinManager.allocateMultiplePins(i2c, 2, PinOwner::HW_I2C)) { + if (hw_sda_pin >= 0 && hw_scl_pin >= 0 && pinManager.allocateMultiplePins(i2c, 2, PinOwner::HW_I2C)) { i2c_sda = hw_sda_pin; i2c_scl = hw_scl_pin; #ifdef ESP32 Wire.setPins(i2c_sda, i2c_scl); // this will fail if Wire is initilised (Wire.begin() called) - pinManager.deallocateMultiplePins(i2c, 2, PinOwner::HW_I2C); #endif + Wire.begin(); } else { + // there is no Wire.end() + DEBUG_PRINTLN(F("Could not allocate I2C pins.")); + uint8_t i2c[2] = { i2c_scl, i2c_sda }; + pinManager.deallocateMultiplePins(i2c, 2, PinOwner::HW_I2C); // just in case deallocation of old pins i2c_sda = -1; i2c_scl = -1; } - int8_t hw_mosi_pin = max(-1,min(33,(int)request->arg(F("MOSI")).toInt())); - int8_t hw_sclk_pin = max(-1,min(33,(int)request->arg(F("SCLK")).toInt())); - int8_t hw_cs_pin = max(-1,min(33,(int)request->arg(F("CS")).toInt())); - oldpins[0] = spi_mosi; - oldpins[1] = spi_sclk; - oldpins[2] = spi_cs; - pinManager.deallocateMultiplePins(oldpins, 3, PinOwner::HW_SPI); + int8_t hw_mosi_pin = !request->arg(F("MOSI")).length() ? -1 : max(-1,min(33,(int)request->arg(F("MOSI")).toInt())); + int8_t hw_sclk_pin = !request->arg(F("SCLK")).length() ? -1 : max(-1,min(33,(int)request->arg(F("SCLK")).toInt())); + int8_t hw_cs_pin = !request->arg(F("CS")).length() ? -1 : max(-1,min(33,(int)request->arg(F("CS")).toInt())); #ifdef ESP8266 // cannot change pins on ESP8266 - if (hw_mosi_pin != HW_PIN_DATASPI) hw_mosi_pin = HW_PIN_DATASPI; - if (hw_sclk_pin != HW_PIN_CLOCKSPI) hw_sclk_pin = HW_PIN_CLOCKSPI; - if (hw_cs_pin != HW_PIN_CSSPI) hw_cs_pin = HW_PIN_CSSPI; + if (hw_mosi_pin >= 0 && hw_mosi_pin != HW_PIN_DATASPI) hw_mosi_pin = HW_PIN_DATASPI; + if (hw_sclk_pin >= 0 && hw_sclk_pin != HW_PIN_CLOCKSPI) hw_sclk_pin = HW_PIN_CLOCKSPI; + if (hw_cs_pin >= 0 && hw_cs_pin != HW_PIN_CSSPI) hw_cs_pin = HW_PIN_CSSPI; #endif PinManagerPinType spi[3] = { { hw_mosi_pin, true }, { hw_sclk_pin, true }, { hw_cs_pin, true } }; - if (pinManager.allocateMultiplePins(spi, 3, PinOwner::HW_SPI)) { + if (hw_mosi_pin >= 0 && hw_sclk_pin >= 0 && hw_cs_pin >= 0 && pinManager.allocateMultiplePins(spi, 3, PinOwner::HW_SPI)) { spi_mosi = hw_mosi_pin; spi_sclk = hw_sclk_pin; spi_cs = hw_cs_pin; - pinManager.deallocateMultiplePins(spi, 3, PinOwner::HW_SPI); + #ifdef ESP8266 + SPI.begin(); + #else + SPI.begin(spi_sclk, (int8_t)-1, spi_mosi, spi_cs); + #endif } else { + //SPI.end(); + DEBUG_PRINTLN(F("Could not allocate SPI pins.")); + uint8_t spi[3] = { spi_mosi, spi_sclk, spi_cs }; + pinManager.deallocateMultiplePins(spi, 3, PinOwner::HW_SPI); // just in case deallocation of old pins spi_mosi = -1; spi_sclk = -1; spi_cs = -1; @@ -536,7 +540,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) // POST request parameters are combined as _ int umNameEnd = name.indexOf(":"); - if (umNameEnd<1) break; // parameter does not contain ":" or on 1st place -> wrong + if (umNameEnd<1) continue; // parameter does not contain ":" or on 1st place -> wrong JsonObject mod = um[name.substring(0,umNameEnd)]; // get a usermod JSON object if (mod.isNull()) { diff --git a/wled00/wled.h b/wled00/wled.h index 39b0f4b8..17e533eb 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2208141 +#define VERSION 2208151 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 8e3a4f26..93de72db 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -639,6 +639,11 @@ void getSettingsJS(byte subPage, char* dest) sappend('v',SET_F("MOSI"),spi_mosi); sappend('v',SET_F("SCLK"),spi_sclk); sappend('v',SET_F("CS"),spi_cs); + oappend(SET_F("addInfo('SDA','")); oappendi(HW_PIN_SDA); oappend(SET_F("');")); + oappend(SET_F("addInfo('SCL','")); oappendi(HW_PIN_SCL); oappend(SET_F("');")); + oappend(SET_F("addInfo('MOSI','")); oappendi(HW_PIN_DATASPI); oappend(SET_F("');")); + oappend(SET_F("addInfo('SCLK','")); oappendi(HW_PIN_CLOCKSPI); oappend(SET_F("');")); + oappend(SET_F("addInfo('CS','")); oappendi(HW_PIN_CSSPI); oappend(SET_F("');")); usermods.appendConfigData(); }