diff --git a/lib/TFT_eSPI/Extensions/Button.h b/lib/TFT_eSPI/Extensions/Button.h index 7e0c509..3a0e2d5 100644 --- a/lib/TFT_eSPI/Extensions/Button.h +++ b/lib/TFT_eSPI/Extensions/Button.h @@ -6,8 +6,8 @@ // within button ***************************************************************************************/ -class TFT_eSPI_Button : public TFT_eSPI { - +class TFT_eSPI_Button +{ public: TFT_eSPI_Button(void); // "Classic" initButton() uses centre & size diff --git a/lib/TFT_eSPI/Extensions/Sprite.cpp b/lib/TFT_eSPI/Extensions/Sprite.cpp index 80dadfe..bab2fac 100644 --- a/lib/TFT_eSPI/Extensions/Sprite.cpp +++ b/lib/TFT_eSPI/Extensions/Sprite.cpp @@ -223,10 +223,7 @@ void* TFT_eSprite::callocSprite(int16_t w, int16_t h, uint8_t frames) ***************************************************************************************/ void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) { - if (_colorMap != nullptr) - { - free(_colorMap); - } + if (!_created) return; if (colorMap == nullptr) { @@ -236,7 +233,7 @@ void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) } // Allocate and clear memory for 16 color map - _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); + if (_colorMap == nullptr) _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); if (colors > 16) colors = 16; @@ -254,6 +251,8 @@ void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) ***************************************************************************************/ void TFT_eSprite::createPalette(const uint16_t colorMap[], uint8_t colors) { + if (!_created) return; + if (colorMap == nullptr) { // Create a color map using the default FLASH map @@ -261,7 +260,7 @@ void TFT_eSprite::createPalette(const uint16_t colorMap[], uint8_t colors) } // Allocate and clear memory for 16 color map - _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); + if (_colorMap == nullptr) _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); if (colors > 16) colors = 16; @@ -310,13 +309,9 @@ void* TFT_eSprite::setColorDepth(int8_t b) else if ( b > 1 ) _bpp = 4; else _bpp = 1; - // Can't change an existing sprite's colour depth so delete it - if (_created) free(_img8_1); - - // If it existed, re-create the sprite with the new colour depth - if (_created) - { - _created = false; + // Can't change an existing sprite's colour depth so delete and create a new one + if (_created) { + deleteSprite(); return createSprite(_dwidth, _dheight); } @@ -380,7 +375,7 @@ void TFT_eSprite::deleteSprite(void) if (_colorMap != nullptr) { free(_colorMap); - _colorMap = nullptr; + _colorMap = nullptr; } if (_created) diff --git a/lib/TFT_eSPI/Extensions/Touch.cpp b/lib/TFT_eSPI/Extensions/Touch.cpp index 0c3ee01..3d3ed82 100644 --- a/lib/TFT_eSPI/Extensions/Touch.cpp +++ b/lib/TFT_eSPI/Extensions/Touch.cpp @@ -10,6 +10,11 @@ // See license in root directory. +// Define a default pressure threshold +#ifndef Z_THRESHOLD + #define Z_THRESHOLD 350 // Touch pressure threshold for validating touches +#endif + /*************************************************************************************** ** Function name: begin_touch_read_write - was spi_begin_touch ** Description: Start transaction and select touch controller @@ -161,7 +166,6 @@ uint8_t TFT_eSPI::validTouch(uint16_t *x, uint16_t *y, uint16_t threshold){ ** Function name: getTouch ** Description: read callibrated position. Return false if not pressed. ***************************************************************************************/ -#define Z_THRESHOLD 350 // Touch pressure threshold for validating touches uint8_t TFT_eSPI::getTouch(uint16_t *x, uint16_t *y, uint16_t threshold){ uint16_t x_tmp, y_tmp; diff --git a/lib/TFT_eSPI/Kconfig b/lib/TFT_eSPI/Kconfig index f3c30be..1433ee5 100644 --- a/lib/TFT_eSPI/Kconfig +++ b/lib/TFT_eSPI/Kconfig @@ -150,12 +150,16 @@ menu "TFT_eSPI" endchoice - config TFT_PARALLEL_8_BIT - bool "Enable 8-bit parallel mode (otherwise SPI is assumed)" - default "n" - depends on IDF_TARGET_ESP32 + choice TFT_INTERFACE + prompt "LCD Interface" + default TFT_SPI help - Use 8-bit parallel bus to send data to the LCD. If not set SPI will be used. + Communication interface between the microcontroller and the LCD. + config TFT_SPI + bool "SPI" + config TFT_PARALLEL_8_BIT + bool "Parallel (8 bit)" + endchoice menu "Display Data pins" depends on TFT_PARALLEL_8_BIT @@ -211,11 +215,11 @@ menu "TFT_eSPI" endmenu menu "Display SPI config" - depends on !TFT_PARALLEL_8_BIT + depends on TFT_SPI choice TFT_SPI_PORT prompt "SPI port" - default TFT_SPI_2_HOST + default TFT_VSPI_PORT help The ESP32 has 2 free SPI ports i.e. VSPI (SPI2) and HSPI (SPI3), the VSPI is the default. If the VSPI port is in use and pins are @@ -232,6 +236,7 @@ menu "TFT_eSPI" default -1 range -1 32 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 help Master In Slave Out pin. Can be labelled as SDO in some displays @@ -241,6 +246,7 @@ menu "TFT_eSPI" default -1 range -1 32 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 help Master Out Slave In pin. Can be labelled as SDA or SDI in some displays @@ -250,6 +256,7 @@ menu "TFT_eSPI" default -1 range -1 32 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 help Labelled in some displays as WR @@ -287,6 +294,7 @@ menu "TFT_eSPI" default -1 range -1 33 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 config TFT_DC int "TFT Data/Command pin" @@ -300,6 +308,7 @@ menu "TFT_eSPI" default -1 range -1 33 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 config ENABLE_BL bool "Enable backlight control" @@ -311,6 +320,7 @@ menu "TFT_eSPI" default -1 range -1 33 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 help Pin for the backlight control signal @@ -379,6 +389,7 @@ menu "TFT_eSPI" default -1 range -1 33 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 config SPI_TOUCH_FREQUENCY int "SPI frequency for XPT2046 chip (Hz)" @@ -387,4 +398,10 @@ menu "TFT_eSPI" endif endmenu + menu "Other settings" + config DISABLE_WARNINGS + bool "Disable Library warnings" + default n + endmenu + endmenu diff --git a/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32.c b/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32.c index 5534f05..1b0435f 100644 --- a/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32.c +++ b/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32.c @@ -41,11 +41,11 @@ #endif #else #ifdef USE_HSPI_PORT - #define DMA_CHANNEL 2 - spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = (spi_host_device_t) SPI3_HOST; // Draws once then freezes #else // use FSPI port - #define DMA_CHANNEL 1 - spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = (spi_host_device_t) SPI2_HOST; // Draws once then freezes #endif #endif #endif @@ -64,29 +64,35 @@ //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** -** Function name: beginSDA -** Description: Detach SPI from pin to permit software SPI +** Function name: beginSDA - VSPI port only, FPSI port only for S2 +** Description: Detach MOSI and attach MISO to SDA for reads ***************************************************************************************/ void TFT_eSPI::begin_SDA_Read(void) { - pinMatrixOutDetach(TFT_MOSI, false, false); - pinMode(TFT_MOSI, INPUT); - pinMatrixInAttach(TFT_MOSI, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_INPUT); + #ifdef CONFIG_IDF_TARGET_ESP32 + pinMatrixInAttach(TFT_MOSI, VSPIQ_IN_IDX, false); + #else // S2 + pinMatrixInAttach(TFT_MOSI, FSPIQ_IN_IDX, false); + #endif SET_BUS_READ_MODE; } /*************************************************************************************** -** Function name: endSDA -** Description: Attach SPI pins after software SPI +** Function name: endSDA - VSPI port only, FPSI port only for S2 +** Description: Attach MOSI to SDA and detach MISO for writes ***************************************************************************************/ void TFT_eSPI::end_SDA_Read(void) { - pinMode(TFT_MOSI, OUTPUT); - pinMatrixOutAttach(TFT_MOSI, VSPID_OUT_IDX, false, false); - pinMode(TFT_MISO, INPUT); - pinMatrixInAttach(TFT_MISO, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_OUTPUT); + #ifdef CONFIG_IDF_TARGET_ESP32 + pinMatrixOutAttach(TFT_MOSI, VSPID_OUT_IDX, false, false); + #else // S2 + pinMatrixOutAttach(TFT_MOSI, FSPID_OUT_IDX, false, false); + #endif SET_BUS_WRITE_MODE; } + //////////////////////////////////////////////////////////////////////////////////////// #endif // #if defined (TFT_SDA_READ) //////////////////////////////////////////////////////////////////////////////////////// @@ -761,6 +767,17 @@ void IRAM_ATTR dc_callback(spi_transaction_t *spi_tx) else {DC_C;} } +/*************************************************************************************** +** Function name: dma_end_callback +** Description: Clear DMA run flag to stop retransmission loop +***************************************************************************************/ +extern "C" void dma_end_callback(); + +void IRAM_ATTR dma_end_callback(spi_transaction_t *spi_tx) +{ + WRITE_PERI_REG(SPI_DMA_CONF_REG(spi_host), 0); +} + /*************************************************************************************** ** Function name: initDMA ** Description: Initialise the DMA engine - returns true if init OK @@ -776,6 +793,12 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) .sclk_io_num = TFT_SCLK, .quadwp_io_num = -1, .quadhd_io_num = -1, + #ifdef CONFIG_IDF_TARGET_ESP32S2 + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + #endif .max_transfer_sz = TFT_WIDTH * TFT_HEIGHT * 2 + 8, // TFT screen size .flags = 0, .intr_flags = 0 @@ -798,7 +821,11 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) .flags = SPI_DEVICE_NO_DUMMY, //0, .queue_size = 1, .pre_cb = 0, //dc_callback, //Callback to handle D/C line - .post_cb = 0 + #ifdef CONFIG_IDF_TARGET_ESP32 + .post_cb = 0 + #else + .post_cb = dma_end_callback + #endif }; ret = spi_bus_initialize(spi_host, &buscfg, DMA_CHANNEL); ESP_ERROR_CHECK(ret); diff --git a/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.c b/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.c index 4e1b15b..e33a5ac 100644 --- a/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.c +++ b/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_C3.c @@ -66,27 +66,24 @@ //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** -** Function name: beginSDA -** Description: Detach SPI from pin to permit software SPI +** Function name: beginSDA - FPSI port only +** Description: Detach MOSI and attach MISO to SDA for reads ***************************************************************************************/ void TFT_eSPI::begin_SDA_Read(void) { - pinMatrixOutDetach(TFT_MOSI, false, false); - pinMode(TFT_MOSI, INPUT); - pinMatrixInAttach(TFT_MOSI, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_INPUT); + pinMatrixInAttach(TFT_MOSI, FSPIQ_IN_IDX, false); SET_BUS_READ_MODE; } /*************************************************************************************** -** Function name: endSDA -** Description: Attach SPI pins after software SPI +** Function name: endSDA - FPSI port only +** Description: Attach MOSI to SDA and detach MISO for writes ***************************************************************************************/ void TFT_eSPI::end_SDA_Read(void) { - pinMode(TFT_MOSI, OUTPUT); - pinMatrixOutAttach(TFT_MOSI, VSPID_OUT_IDX, false, false); - pinMode(TFT_MISO, INPUT); - pinMatrixInAttach(TFT_MISO, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_OUTPUT); + pinMatrixOutAttach(TFT_MOSI, FSPID_OUT_IDX, false, false); SET_BUS_WRITE_MODE; } //////////////////////////////////////////////////////////////////////////////////////// diff --git a/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.c b/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.c index 3bdf9d0..5bc7914 100644 --- a/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.c +++ b/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.c @@ -43,11 +43,11 @@ #endif #else #ifdef USE_HSPI_PORT - #define DMA_CHANNEL 2 - spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = SPI3_HOST; #else // use FSPI port - #define DMA_CHANNEL 1 - spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = SPI2_HOST; #endif #endif #endif @@ -57,27 +57,24 @@ //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** -** Function name: beginSDA -** Description: Detach SPI from pin to permit software SPI +** Function name: beginSDA - FPSI port only +** Description: Detach MOSI and attach MISO to SDA for reads ***************************************************************************************/ void TFT_eSPI::begin_SDA_Read(void) { - pinMatrixOutDetach(TFT_MOSI, false, false); - pinMode(TFT_MOSI, INPUT); - pinMatrixInAttach(TFT_MOSI, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_INPUT); + pinMatrixInAttach(TFT_MOSI, FSPIQ_IN_IDX, false); SET_BUS_READ_MODE; } /*************************************************************************************** -** Function name: endSDA -** Description: Attach SPI pins after software SPI +** Function name: endSDA - FPSI port only +** Description: Attach MOSI to SDA and detach MISO for writes ***************************************************************************************/ void TFT_eSPI::end_SDA_Read(void) { - pinMode(TFT_MOSI, OUTPUT); - pinMatrixOutAttach(TFT_MOSI, VSPID_OUT_IDX, false, false); - pinMode(TFT_MISO, INPUT); - pinMatrixInAttach(TFT_MISO, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_OUTPUT); + pinMatrixOutAttach(TFT_MOSI, FSPID_OUT_IDX, false, false); SET_BUS_WRITE_MODE; } //////////////////////////////////////////////////////////////////////////////////////// @@ -96,21 +93,20 @@ uint8_t TFT_eSPI::readByte(void) #if defined (TFT_PARALLEL_8_BIT) RD_L; - uint32_t reg; // Read all GPIO pins 0-31 - reg = gpio_input_get(); // Read three times to allow for bus access time - reg = gpio_input_get(); - reg = gpio_input_get(); // Data should be stable now - RD_H; + b = gpio_get_level((gpio_num_t)TFT_D0); // Read three times to allow for bus access time + b = gpio_get_level((gpio_num_t)TFT_D0); + b = gpio_get_level((gpio_num_t)TFT_D0); // Data should be stable now // Check GPIO bits used and build value - b = (((reg>>TFT_D0)&1) << 0); - b |= (((reg>>TFT_D1)&1) << 1); - b |= (((reg>>TFT_D2)&1) << 2); - b |= (((reg>>TFT_D3)&1) << 3); - b |= (((reg>>TFT_D4)&1) << 4); - b |= (((reg>>TFT_D5)&1) << 5); - b |= (((reg>>TFT_D6)&1) << 6); - b |= (((reg>>TFT_D7)&1) << 7); + b = (gpio_get_level((gpio_num_t)TFT_D0) << 0); + b |= (gpio_get_level((gpio_num_t)TFT_D1) << 1); + b |= (gpio_get_level((gpio_num_t)TFT_D2) << 2); + b |= (gpio_get_level((gpio_num_t)TFT_D3) << 3); + b |= (gpio_get_level((gpio_num_t)TFT_D4) << 4); + b |= (gpio_get_level((gpio_num_t)TFT_D5) << 5); + b |= (gpio_get_level((gpio_num_t)TFT_D6) << 6); + b |= (gpio_get_level((gpio_num_t)TFT_D7) << 7); + RD_H; #endif return b; @@ -644,6 +640,15 @@ void TFT_eSPI::pushPixelsDMA(uint16_t* image, uint32_t len) for (uint32_t i = 0; i < len; i++) (image[i] = image[i] << 8 | image[i] >> 8); } + // DMA byte count for transmit is 64Kbytes maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32768 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + while(len>0x4000) { // Transfer 16 bit pixels in blocks if len*2 over 65536 bytes + pushPixels(image, 0x400); + len -= 0x400; image+= 0x400; // Arbitrarily send 1K pixel blocks (2Kbytes) + } + esp_err_t ret; static spi_transaction_t trans; @@ -670,11 +675,20 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t { if ((w == 0) || (h == 0) || (!DMA_Enabled)) return; + uint16_t *buffer = (uint16_t*)image; uint32_t len = w*h; dmaWait(); setAddrWindow(x, y, w, h); + // DMA byte count for transmit is 64Kbytes maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32768 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + while(len>0x4000) { // Transfer 16 bit pixels in blocks if len*2 over 65536 bytes + pushPixels(buffer, 0x400); + len -= 0x400; buffer+= 0x400; // Arbitrarily send 1K pixel blocks (2Kbytes) + } esp_err_t ret; static spi_transaction_t trans; @@ -682,7 +696,7 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t memset(&trans, 0, sizeof(spi_transaction_t)); trans.user = (void *)1; - trans.tx_buffer = image; //Data pointer + trans.tx_buffer = buffer; //Data pointer trans.length = len * 16; //Data length, in bits trans.flags = 0; //SPI_TRANS_USE_TXDATA flag @@ -752,6 +766,15 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t setAddrWindow(x, y, dw, dh); + // DMA byte count for transmit is 64Kbytes maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32768 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + while(len>0x4000) { // Transfer 16 bit pixels in blocks if len*2 over 65536 bytes + pushPixels(buffer, 0x400); + len -= 0x400; buffer+= 0x400; // Arbitrarily send 1K pixel blocks (2Kbytes) + } + esp_err_t ret; static spi_transaction_t trans; @@ -775,7 +798,7 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t // The DMA functions here work with SPI only (not parallel) /*************************************************************************************** ** Function name: dc_callback -** Description: Toggles DC line during transaction +** Description: Toggles DC line during transaction (not used) ***************************************************************************************/ extern "C" void dc_callback(); @@ -785,6 +808,17 @@ void IRAM_ATTR dc_callback(spi_transaction_t *spi_tx) else {DC_C;} } +/*************************************************************************************** +** Function name: dma_end_callback +** Description: Clear DMA run flag to stop retransmission loop +***************************************************************************************/ +extern "C" void dma_end_callback(); + +void IRAM_ATTR dma_end_callback(spi_transaction_t *spi_tx) +{ + WRITE_PERI_REG(SPI_DMA_CONF_REG(spi_host), 0); +} + /*************************************************************************************** ** Function name: initDMA ** Description: Initialise the DMA engine - returns true if init OK @@ -800,7 +834,7 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) .sclk_io_num = TFT_SCLK, .quadwp_io_num = -1, .quadhd_io_num = -1, - .max_transfer_sz = TFT_WIDTH * TFT_HEIGHT * 2 + 8, // TFT screen size + .max_transfer_sz = 65536, // ESP32 S3 max size is 64Kbytes .flags = 0, .intr_flags = 0 }; @@ -820,9 +854,9 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) .input_delay_ns = 0, .spics_io_num = pin, .flags = SPI_DEVICE_NO_DUMMY, //0, - .queue_size = 1, - .pre_cb = 0, //dc_callback, //Callback to handle D/C line - .post_cb = 0 + .queue_size = 1, // Not using queues + .pre_cb = 0, //dc_callback, //Callback to handle D/C line (not used) + .post_cb = dma_end_callback //Callback to end transmission }; ret = spi_bus_initialize(spi_host, &buscfg, DMA_CHANNEL); ESP_ERROR_CHECK(ret); diff --git a/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.h b/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.h index 197ebc5..4438fe9 100644 --- a/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.h +++ b/lib/TFT_eSPI/Processors/TFT_eSPI_ESP32_S3.h @@ -7,10 +7,6 @@ #ifndef _TFT_eSPI_ESP32H_ #define _TFT_eSPI_ESP32H_ -#if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - #warning >>>>------>> DMA is not supported on the ESP32 S3 (possible future update) -#endif - // Processor ID reported by getSetup() #define PROCESSOR_ID 0x32 @@ -110,6 +106,10 @@ SPI3_HOST = 2 #endif #endif +#if !defined(DISABLE_ALL_LIBRARY_WARNINGS) && defined (ESP32_PARALLEL) + #warning >>>>------>> DMA is not supported in parallel mode +#endif + // Processor specific code used by SPI bus transaction startWrite and endWrite functions #if !defined (ESP32_PARALLEL) #define _spi_cmd (volatile uint32_t*)(SPI_CMD_REG(SPI_PORT)) @@ -134,7 +134,7 @@ SPI3_HOST = 2 #if !defined(TFT_PARALLEL_8_BIT) && !defined(SPI_18BIT_DRIVER) #define ESP32_DMA // Code to check if DMA is busy, used by SPI DMA + transaction + endWrite functions - #define DMA_BUSY_CHECK //dmaWait() + #define DMA_BUSY_CHECK dmaWait() #else #define DMA_BUSY_CHECK #endif @@ -366,7 +366,7 @@ SPI3_HOST = 2 #define PARALLEL_INIT_TFT_DATA_BUS \ for (int32_t c = 0; c<256; c++) \ { \ - xset_mask[c] = 0; \ + xset_mask[c] = 0; \ if ( c & 0x01 ) xset_mask[c] |= (1 << (TFT_D0-MASK_OFFSET)); \ if ( c & 0x02 ) xset_mask[c] |= (1 << (TFT_D1-MASK_OFFSET)); \ if ( c & 0x04 ) xset_mask[c] |= (1 << (TFT_D2-MASK_OFFSET)); \ @@ -374,8 +374,8 @@ SPI3_HOST = 2 if ( c & 0x10 ) xset_mask[c] |= (1 << (TFT_D4-MASK_OFFSET)); \ if ( c & 0x20 ) xset_mask[c] |= (1 << (TFT_D5-MASK_OFFSET)); \ if ( c & 0x40 ) xset_mask[c] |= (1 << (TFT_D6-MASK_OFFSET)); \ - if ( c & 0x80 ) xset_mask[c] |= (1 << (TFT_D7-MASK_OFFSET)); \ - } \ + if ( c & 0x80 ) xset_mask[c] |= (1 << (TFT_D7-MASK_OFFSET)); \ + } \ // Mask for the 8 data bits to set pin directions #define GPIO_DIR_MASK ((1 << (TFT_D0-MASK_OFFSET)) | (1 << (TFT_D1-MASK_OFFSET)) | (1 << (TFT_D2-MASK_OFFSET)) | (1 << (TFT_D3-MASK_OFFSET)) | (1 << (TFT_D4-MASK_OFFSET)) | (1 << (TFT_D5-MASK_OFFSET)) | (1 << (TFT_D6-MASK_OFFSET)) | (1 << (TFT_D7-MASK_OFFSET))) @@ -511,14 +511,14 @@ SPI3_HOST = 2 // Macros to write commands/pixel colour data to an Raspberry Pi TFT //////////////////////////////////////////////////////////////////////////////////////// #elif defined (RPI_DISPLAY_TYPE) - - // ESP32 low level SPI writes for 8, 16 and 32 bit values + // ESP32-S3 low level SPI writes for 8, 16 and 32 bit values // to avoid the function call overhead - #define TFT_WRITE_BITS(D, B) \ - WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ - WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), D); \ - SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \ - while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ + *_spi_w = D; \ + *_spi_cmd = SPI_UPDATE; \ + while (*_spi_cmd & SPI_UPDATE); \ + *_spi_cmd = SPI_USR; \ + while (*_spi_cmd & SPI_USR); // Write 8 bits #define tft_Write_8(C) TFT_WRITE_BITS((C)<<8, 16) @@ -546,34 +546,6 @@ SPI3_HOST = 2 // Macros for all other SPI displays //////////////////////////////////////////////////////////////////////////////////////// #else -/* Old macros - // ESP32 low level SPI writes for 8, 16 and 32 bit values - // to avoid the function call overhead - #define TFT_WRITE_BITS(D, B) \ - WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ - WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), D); \ - SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \ - while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); - - // Write 8 bits - #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) - - // Write 16 bits with corrected endianness for 16 bit colours - #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) - - // Write 16 bits - #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) - - // Write 32 bits - #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) - - // Write two address coordinates - #define tft_Write_32C(C,D) TFT_WRITE_BITS((uint16_t)((D)<<8 | (D)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) - - // Write same value twice - #define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) -//*/ -//* Replacement slimmer macros #if !defined(CONFIG_IDF_TARGET_ESP32S3) #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ *_spi_w = D; \ @@ -598,13 +570,13 @@ SPI3_HOST = 2 #define tft_Write_16N(C) *_spi_mosi_dlen = 16-1; \ *_spi_w = ((C)<<8 | (C)>>8); \ *_spi_cmd = SPI_USR; -#else + #else #define tft_Write_16N(C) *_spi_mosi_dlen = 16-1; \ *_spi_w = ((C)<<8 | (C)>>8); \ *_spi_cmd = SPI_UPDATE; \ while (*_spi_cmd & SPI_UPDATE); \ *_spi_cmd = SPI_USR; -#endif + #endif // Write 16 bits #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) @@ -618,7 +590,6 @@ SPI3_HOST = 2 // Write same value twice #define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) -//*/ #endif #ifndef tft_Write_16N diff --git a/lib/TFT_eSPI/Processors/TFT_eSPI_RP2040.c b/lib/TFT_eSPI/Processors/TFT_eSPI_RP2040.c index a902571..6ca1fef 100644 --- a/lib/TFT_eSPI/Processors/TFT_eSPI_RP2040.c +++ b/lib/TFT_eSPI/Processors/TFT_eSPI_RP2040.c @@ -29,10 +29,15 @@ #include "pio_SPI.pio.h" #endif #elif defined (TFT_PARALLEL_8_BIT) - // SPI PIO code for 8 bit parallel interface (16 bit colour) - #include "pio_8bit_parallel.pio.h" + #if defined (SSD1963_DRIVER) + // PIO code for 8 bit parallel interface (18 bit colour) + #include "pio_8bit_parallel_18bpp.pio.h" + #else + // PIO code for 8 bit parallel interface (16 bit colour) + #include "pio_8bit_parallel.pio.h" + #endif #else // must be TFT_PARALLEL_16_BIT - // SPI PIO code for 16 bit parallel interface (16 bit colour) + // PIO code for 16 bit parallel interface (16 bit colour) #include "pio_16bit_parallel.pio.h" #endif @@ -279,7 +284,7 @@ void pioinit(uint16_t clock_div, uint16_t fract_div) { // PIO handles pixel block fill writes void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) { -#if defined (SPI_18BIT_DRIVER) +#if defined (SPI_18BIT_DRIVER) || (defined (SSD1963_DRIVER) && defined (TFT_PARALLEL_8_BIT)) uint32_t col = ((color & 0xF800)<<8) | ((color & 0x07E0)<<5) | ((color & 0x001F)<<3); if (len) { WAIT_FOR_STALL; @@ -327,7 +332,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ ** Description: Write a sequence of pixels ***************************************************************************************/ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ -#if defined (SPI_18BIT_DRIVER) +#if defined (SPI_18BIT_DRIVER) || (defined (SSD1963_DRIVER) && defined (TFT_PARALLEL_8_BIT)) uint16_t *data = (uint16_t*)data_in; if (_swapBytes) { while ( len-- ) { diff --git a/lib/TFT_eSPI/Processors/TFT_eSPI_RP2040.h b/lib/TFT_eSPI/Processors/TFT_eSPI_RP2040.h index c0e0086..08c1d14 100644 --- a/lib/TFT_eSPI/Processors/TFT_eSPI_RP2040.h +++ b/lib/TFT_eSPI/Processors/TFT_eSPI_RP2040.h @@ -165,8 +165,13 @@ #define DC_C WAIT_FOR_STALL; \ tft_pio->sm[pio_sm].instr = pio_instr_clr_dc - // Flush has happened before this and mode changed back to 16 bit - #define DC_D tft_pio->sm[pio_sm].instr = pio_instr_set_dc + #ifndef RM68120_DRIVER + // Flush has happened before this and mode changed back to 16 bit + #define DC_D tft_pio->sm[pio_sm].instr = pio_instr_set_dc + #else + // Need to wait for stall since RM68120 commands are 16 bit + #define DC_D WAIT_FOR_STALL; tft_pio->sm[pio_sm].instr = pio_instr_set_dc + #endif #endif #endif @@ -408,7 +413,7 @@ // Temporary - to be deleted #define GPIO_DIR_MASK 0 - #if defined (SPI_18BIT_DRIVER) // SPI 18 bit colour + #if defined (SPI_18BIT_DRIVER) || defined (SSD1963_DRIVER) // 18 bit colour (3 bytes) // This writes 8 bits, then switches back to 16 bit mode automatically // Have already waited for pio stalled (last data write complete) when DC switched to command mode // The wait for stall allows DC to be changed immediately afterwards diff --git a/lib/TFT_eSPI/Processors/TFT_eSPI_STM32.c b/lib/TFT_eSPI/Processors/TFT_eSPI_STM32.c index 9fcd013..950677c 100644 --- a/lib/TFT_eSPI/Processors/TFT_eSPI_STM32.c +++ b/lib/TFT_eSPI/Processors/TFT_eSPI_STM32.c @@ -598,6 +598,8 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); // Enable DMA end interrupt handler #elif (TFT_SPI_PORT == 2) HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn); // Enable DMA end interrupt handler + #elif (TFT_SPI_PORT == 3) + HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); #endif __HAL_LINKDMA(&spiHal, hdmatx, dmaHal); // Attach DMA engine to SPI peripheral diff --git a/lib/TFT_eSPI/Processors/pio_8bit_parallel_18bpp.pio.h b/lib/TFT_eSPI/Processors/pio_8bit_parallel_18bpp.pio.h new file mode 100644 index 0000000..b2aaff4 --- /dev/null +++ b/lib/TFT_eSPI/Processors/pio_8bit_parallel_18bpp.pio.h @@ -0,0 +1,73 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// -------------------------------------------------- // + +#pragma once + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------ // +// tft_io // +// ------ // + +#define tft_io_wrap_target 11 +#define tft_io_wrap 31 + +#define tft_io_offset_block_fill 0u +#define tft_io_offset_start_tx 11u +#define tft_io_offset_start_8 18u +#define tft_io_offset_set_addr_window 21u + +static const uint16_t tft_io_program_instructions[] = { + 0x98a0, // 0: pull block side 1 + 0xa027, // 1: mov x, osr + 0x80a0, // 2: pull block + 0xa047, // 3: mov y, osr + 0xb8e1, // 4: mov osr, x side 1 + 0x7110, // 5: out pins, 16 side 0 [1] + 0xb942, // 6: nop side 1 [1] + 0x7108, // 7: out pins, 8 side 0 [1] + 0xb942, // 8: nop side 1 [1] + 0x7108, // 9: out pins, 8 side 0 [1] + 0x1884, // 10: jmp y--, 4 side 1 + // .wrap_target + 0x98a0, // 11: pull block side 1 + 0x7110, // 12: out pins, 16 side 0 [1] + 0xb942, // 13: nop side 1 [1] + 0x7108, // 14: out pins, 8 side 0 [1] + 0xb942, // 15: nop side 1 [1] + 0x7108, // 16: out pins, 8 side 0 [1] + 0x180b, // 17: jmp 11 side 1 + 0x98a0, // 18: pull block side 1 + 0x7100, // 19: out pins, 32 side 0 [1] + 0x180b, // 20: jmp 11 side 1 + 0xf822, // 21: set x, 2 side 1 + 0xe000, // 22: set pins, 0 + 0x80a0, // 23: pull block + 0x7000, // 24: out pins, 32 side 0 + 0x003e, // 25: jmp !x, 30 + 0x98a0, // 26: pull block side 1 + 0xe001, // 27: set pins, 1 + 0x7108, // 28: out pins, 8 side 0 [1] + 0x19fc, // 29: jmp !osre, 28 side 1 [1] + 0x1856, // 30: jmp x--, 22 side 1 + 0xe001, // 31: set pins, 1 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program tft_io_program = { + .instructions = tft_io_program_instructions, + .length = 32, + .origin = -1, +}; + +static inline pio_sm_config tft_io_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + tft_io_wrap_target, offset + tft_io_wrap); + sm_config_set_sideset(&c, 2, true, false); + return c; +} +#endif diff --git a/lib/TFT_eSPI/README.md b/lib/TFT_eSPI/README.md index 914e0c5..1a4b675 100644 --- a/lib/TFT_eSPI/README.md +++ b/lib/TFT_eSPI/README.md @@ -1,21 +1,24 @@ A ["Discussions"](https://github.com/Bodmer/TFT_eSPI/discussions) facility has been added for Q&A etc. Use the ["Issues"](https://github.com/Bodmer/TFT_eSPI/issues) tab only for problems with the library. Thanks! # News -1. New functions have been added to draw smooth (antialiased) arcs, circles, and rounded rectangle outlines. New sketches for the arcs are provided in the "Smooth Graphics" examples folder. Arcs can be drawn with or without anti-aliasing. The arc ends can be straight or rounded. Further demo examples will be added soon! +1. New functions have been added to draw smooth (antialiased) arcs, circles, and rounded rectangle outlines. New sketches are provided in the "Smooth Graphics" examples folder. Arcs can be drawn with or without anti-aliasing (which will then render faster). The arc ends can be straight or rounded. The arc drawing algorithm uses an optimised fixed point sqrt() function to improve performance on processors that do not have a hardware Floating Point Unit (e.g. RP2040). Here are two demo images, on the left smooth (anti-aliased) arcs with rounded ends, the image to the right is the same resolution (grabbed from the same 240x240 TFT) with the smoothing diasbled (no anti-aliasing): -2. An excellent new compatible library is available which can render TrueType fonts on a TFT screen (or into a sprite). This has been developed by takkaO [and is available here](https://github.com/takkaO/OpenFontRender). I have been reluctant to support yet another font format but this is an amazing library which is very easy to use. It provides access to compact font files, with fully scaleable anti-aliased glyphs. Left, middle and right justified text can also be printed to the screen. I have added TFT_eSPI specific examples to the OpenFontRender library and tested on RP2040 and ESP32 processors, however the ESP8266 does not have sufficient RAM. Here is a demo screen where a single 12kbyte font file binary was used to render fully anti-aliased glyphs of gradually increasing size on a 320x480 TFT screen: + ![arcs](https://github.com/Bodmer/Github-images/blob/main/aa_arc_240x240.png) ![pixelated_arcs](https://github.com/Bodmer/Github-images/blob/main/no_aa_arc_240x240.png) + + Here the smooth arcs have been used to create anti-aliased meter gauges on a 320x240 TFT: + + ![arcs](https://github.com/Bodmer/Github-images/blob/main/xarc_meters_320x240.png) + +2. An excellent new compatible library is available which can render TrueType fonts on a TFT screen (or into a sprite). This has been developed by [takkaO](https://github.com/takkaO/OpenFontRender), I have created a branch with some bug fixes [here](https://github.com/Bodmer/OpenFontRender). The library provides access to compact font files, with fully scaleable anti-aliased glyphs. Left, middle and right justified text can also be printed to the screen. I have added TFT_eSPI specific examples to the OpenFontRender library and tested on RP2040 and ESP32 processors, the ESP8266 does not have sufficient RAM due to the glyph render complexity. Here is a demo screen where a single 12kbyte font file binary was used to render fully anti-aliased glyphs of gradually increasing size on a 320x480 TFT screen: ![ttf_font_demo](https://i.imgur.com/bKkilIb.png) -3. The following is now deprecated due to the number of issues it can cause in certain circumstances. For ESP32 ONLY, the TFT configuration (user setup) can now be included inside an Arduino IDE sketch providing the instructions in the example Generic->Sketch_with_tft_setup are followed. See ReadMe tab in that sketch for the instructions. If the setup is not in the sketch then the library settings will be used. This means that "per project" configurations are possible without modifying the library setup files. Please note that ALL the other examples in the library will use the library settings unless they are adapted and the "tft_setup.h" header file included. Note: there are issues with this approach, [#2007](https://github.com/Bodmer/TFT_eSPI/discussions/2007#discussioncomment-3834755) proposes an alternative method. - -4. New GUI examples have been added for sliders, buttons, graphs and meters. These examples require a new support library here: +3. New GUI examples have been added for sliders, buttons, graphs and meters. These examples require a new support library here: [TFT_eWidget](https://github.com/Bodmer/TFT_eWidget) -5. Support has been added in v2.4.70 for the RP2040 with 16 bit parallel displays. This has been tested and the screen update performance is very good (4ms to clear 320 x 480 screen with HC8357C). The use of the RP2040 PIO makes it easy to change the write cycle timing for different displays. DMA with 16 bit transfers is also supported. +4. Support has been added in v2.4.70 for the RP2040 with 16 bit parallel displays. This has been tested and the screen update performance is very good (4ms to clear 320 x 480 screen with HC8357C). The use of the RP2040 PIO makes it easy to change the write cycle timing for different displays. DMA with 16 bit transfers is also supported. -6. Support for HX8357B and HX8357C screens has been added (only tested with RP2040 and 16 bit parallel interface) -7. Support for the ESP32-S2, ESP32-S3 and ESP32-C3 has been added (DMA not supported at the moment). Tested with v2.0.3 RC1 of the ESP32 board package. Example setups: +5. Support for the ESP32-S2, ESP32-S3 and ESP32-C3 has been added (DMA only on ESP32 S3 at the moment). Tested with v2.0.3 RC1 of the ESP32 board package. Example setups: [Setup70_ESP32_S2_ILI9341.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70_ESP32_S2_ILI9341.h) @@ -25,20 +28,18 @@ A ["Discussions"](https://github.com/Bodmer/TFT_eSPI/discussions) facility has b [Setup70d_ILI9488_S3_Parallel.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70d_ILI9488_S3_Parallel.h) -8. Smooth fonts can now be rendered direct to the TFT with very little flicker for quickly changing values. This is achieved by a line-by-line and block-by-block update of the glyph area without drawing pixels twice. This is a "breaking" change for some sketches because a new true/false parameter is needed to render the background. The default is false if the parameter is missing, Examples: +6. Smooth fonts can now be rendered direct to the TFT with very little flicker for quickly changing values. This is achieved by a line-by-line and block-by-block update of the glyph area without drawing pixels twice. This is a "breaking" change for some sketches because a new true/false parameter is needed to render the background. The default is false if the parameter is missing, Examples: tft.setTextColor(TFT_WHITE, TFT_BLUE, true); spr.setTextColor(TFT_BLUE, TFT_BLACK, true); Note: background rendering for Smooth fonts is also now available when using the print stream e.g. with: tft.println("Hello World"); -9. New anti-aliased graphics functions to draw lines, wedge shaped lines, circles and rounded rectangles. [Examples are included](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/Smooth%20Graphics). Examples have also been added to [display PNG compressed images](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/PNG%20Images) (note: requires ~40kbytes RAM). +7. New anti-aliased graphics functions to draw lines, wedge shaped lines, circles and rounded rectangles. [Examples are included](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/Smooth%20Graphics). Examples have also been added to [display PNG compressed images](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/PNG%20Images) (note: requires ~40kbytes RAM). -10. Frank Boesing has created an extension library for TFT_eSPI that allows a large range of ready-built fonts to be used. Frank's library (adapted to permit rendering in sprites as well as TFT) can be [downloaded here](https://github.com/Bodmer/TFT_eSPI_ext). More than 3300 additional Fonts are [available here](https://github.com/FrankBoesing/fonts/tree/master/ofl). The TFT_eSPI_ext library contains examples that demonstrate the use of the fonts. +8. Users of PowerPoint experienced with running macros may be interested in the [pptm sketch generator here](https://github.com/Bodmer/PowerPoint_to_sketch), this converts graphics and tables drawn in PowerPoint slides into an Arduino sketch that renders the graphics on a 480x320 TFT. This is based on VB macros [created by Kris Kasprzak here](https://github.com/KrisKasprzak/Powerpoint-ILI9341_t3). -11. Users of PowerPoint experienced with running macros may be interested in the [pptm sketch generator here](https://github.com/Bodmer/PowerPoint_to_sketch), this converts graphics and tables drawn in PowerPoint slides into an Arduino sketch that renders the graphics on a 480x320 TFT. This is based on VB macros [created by Kris Kasprzak here](https://github.com/KrisKasprzak/Powerpoint-ILI9341_t3). - -12. The library contains two new functions for rectangles filled with a horizontal or vertical coloured gradient: +9. The library contains two new functions for rectangles filled with a horizontal or vertical coloured gradient: tft.fillRectHGradient(x, y, w, h, color1, color2); @@ -46,19 +47,25 @@ Note: background rendering for Smooth fonts is also now available when using the ![Gradient](https://i.imgur.com/atR0DmP.png) -13. The RP2040 8 bit parallel interface uses the PIO. The PIO now manages the "setWindow" and "block fill" actions, releasing the processor for other tasks when areas of the screen are being filled with a colour. The PIO can optionally be used for SPI interface displays if #define RP2040_PIO_SPI is put in the setup file. Touch screens and pixel read operations are not supported when the PIO interface is used. +10. The RP2040 8 bit parallel interface uses the PIO. The PIO now manages the "setWindow" and "block fill" actions, releasing the processor for other tasks when areas of the screen are being filled with a colour. The PIO can optionally be used for SPI interface displays if #define RP2040_PIO_SPI is put in the setup file. Touch screens and pixel read operations are not supported when the PIO interface is used. The RP2040 PIO features only work with [Earle Philhower's board package](https://github.com/earlephilhower/arduino-pico), NOT the Arduino Mbed version. The use of PIO for SPI allows the RP2040 to be over-clocked (up to 250MHz works on my boards) in Earle's board package whilst still maintaining high SPI clock rates. -14. DMA can now be used with the Raspberry Pi Pico (RP2040) when used with both 8 bit parallel and 16 bit colour SPI displays. See "Bouncy_Circles" sketch. +11. DMA can now be used with the Raspberry Pi Pico (RP2040) when used with 8/16 bit parallel and 16 bit colour SPI displays. See "Bouncy_Circles" sketch. ["Bouncing circles"](https://www.youtube.com/watch?v=njFXIzCTQ_Q&lc=UgymaUIwOIuihvYh-Qt4AaABAg) # TFT_eSPI -An Arduino IDE compatible graphics and fonts library for 32 bit processors. The library is targeted at 32 bit processors, it has been performance optimised for RP2040, STM32, ESP8266 and ESP32 types, other processors may be used but will use the slower generic Arduino interface calls. The library can be loaded using the Arduino IDE's Library Manager. Direct Memory Access (DMA) can be used with the ESP32, RP2040 and STM32 processors with SPI interface displays to improve rendering performance. DMA with a parallel interface (8 and 16 bit parallel) is only supported with the RP2040. +A feature rich Arduino IDE compatible graphics and fonts library for 32 bit processors. The library is targeted at 32 bit processors, it has been performance optimised for RP2040, STM32, ESP8266 and ESP32 types, other 32 bit processors may be used but will use the slower generic Arduino interface calls. The library can be loaded using the Arduino IDE's Library Manager. Direct Memory Access (DMA) can be used with the ESP32, RP2040 and STM32 processors with SPI interface displays to improve rendering performance. DMA with a parallel interface (8 and 16 bit) is only supported with the RP2040. + +The updates for the ESP32 S2/C3/S3 means that the library requires the ESP32 Arduino board package 2.x.x or later. + +The screen controller, interface pins and library configuration settings must be defined inside the library. They can NOT be defined in the Arduino sketch. See the User_Setup_Select.h file for details. This approach has significant advantages, it keeps the examples clean from long configuration options and once the setup is defined any example can be run without modification. PlatformIO users can define these settings on a per project basis within a platformio.ini file, see Docs folder in library. + +Lots of example sketches are provided which demonstrate using the functions in the library. Due to the popularity of the library there are lots of online tutorials for TFT_eSPI that have been created by enthusiastic users. Optimised drivers have been tested with the following processors: @@ -67,9 +74,24 @@ Optimised drivers have been tested with the following processors: * ESP8266 * STM32F1xx, STM32F2xx, STM32F4xx, STM32F767 (higher RAM processors recommended) -For other processors only SPI interface displays are supported and the slower Arduino SPI library functions are used by the library. Higher clock speed processors such as used for the Teensy 3.x and 4.x boards will still provide a very good performance with the generic Arduino SPI functions. +The library supports the following interface types for these processors: -"Four wire" SPI and 8 bit parallel interfaces are supported. Due to lack of GPIO pins the 8 bit parallel interface is NOT supported on the ESP8266. 8 bit parallel interface TFTs (e.g. UNO format mcufriend shields) can used with the STM32 Nucleo 64/144 range or the UNO format ESP32 (see below for ESP32). +| Processor | 4 wire SPI | 8 bit parallel | 16 bit parallel | DMA support | +|-----------| :---: | :---: | :---: | :---: | +| RP2040 | Yes | Yes | Yes | Yes (all) | +| ESP32 | Yes | Yes | No | Yes (SPI only) | +| ESP32 C3 | Yes | No | No | No | +| ESP32 S2 | Yes | No | No | No | +| ESP32 S3 | Yes | Yes | No | Yes (SPI only) | +| ESP8266 | Yes | No | No | No | +| STM32Fxxx | Yes | Yes | No | Yes (SPI only) | +| Other | Yes | No | No | No | + +For other (generic) processors only SPI interface displays are supported and the slower Arduino SPI library functions are used by the library. Higher clock speed processors such as used for the Teensy 3.x and 4.x boards will still provide a very good performance with the generic Arduino SPI functions. + +Due to lack of GPIO pins the 8 bit parallel interface is NOT supported on the ESP8266. 8 bit parallel interface TFTs (e.g. UNO format mcufriend shields) can used with the STM32 Nucleo 64/144 range or the UNO format ESP32 (see below for ESP32). + +Support for the XPT2046 touch screen controller is built into the library and can be used with SPI interface displays. Third party touch support libraries are also available when using a display parallel interface. Displays using the following controllers are supported: @@ -89,7 +111,7 @@ Displays using the following controllers are supported: * RM68140 * S6D02A1 * SSD1351 -* SSD1963 +* SSD1963 (this controller only has a parallel interface option) * ST7735 * ST7789 * ST7796 @@ -204,10 +226,3 @@ You can take this one step further and have your own setup select file and then #include <../TFT_eSPI_Setups/my_setup_select.h> ``` To select a new setup you then edit your own my_setup_select.h file (which will not get overwritten during an upgrade). - -# ePaper displays - -The library was intended to support only TFT displays but using a Sprite as a 1 bit per pixel screen buffer permits support for the Waveshare 2 and 3 colour SPI ePaper displays. This addition to the library is experimental and only one example is provided. Further examples will be added. - -![Example](https://i.imgur.com/L2tV129.jpg?1) - diff --git a/lib/TFT_eSPI/TFT_Drivers/GC9A01_Rotation.h b/lib/TFT_eSPI/TFT_Drivers/GC9A01_Rotation.h index a4c8f3e..48724e7 100644 --- a/lib/TFT_eSPI/TFT_Drivers/GC9A01_Rotation.h +++ b/lib/TFT_eSPI/TFT_Drivers/GC9A01_Rotation.h @@ -9,20 +9,48 @@ writedata(TFT_MAD_BGR); _width = _init_width; _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 2; + rowstart = 1; + } +#endif break; case 1: // Landscape (Portrait + 90) writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR); _width = _init_height; _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 1; + rowstart = 2; + } +#endif break; case 2: // Inverter portrait writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR); _width = _init_width; _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 2; + rowstart = 1; + } +#endif break; case 3: // Inverted landscape writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR); _width = _init_height; _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 1; + rowstart = 2; + } +#endif break; } diff --git a/lib/TFT_eSPI/TFT_Drivers/RM68120_Defines.h b/lib/TFT_eSPI/TFT_Drivers/RM68120_Defines.h index d9fed9a..627e467 100644 --- a/lib/TFT_eSPI/TFT_Drivers/RM68120_Defines.h +++ b/lib/TFT_eSPI/TFT_Drivers/RM68120_Defines.h @@ -14,24 +14,26 @@ #define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked // Generic commands used by TFT_eSPI.cpp -#define TFT_NOP 0x0000 -#define TFT_SWRST 0x0100 +#define TFT_NOP 0x0000 +#define TFT_SWRST 0x0100 -#define TFT_CASET 0x2A00 -#define TFT_PASET 0x2B00 -#define TFT_RAMWR 0x2C00 +#define TFT_CASET 0x2A00 +#define TFT_PASET 0x2B00 +#define TFT_RAMWR 0x2C00 -#define TFT_RAMRD 0x2E00 -#define TFT_IDXRD 0xDD00 // ILI9341 only, indexed control register read +#define TFT_RAMRD 0x2E00 +#define TFT_IDXRD 0xDD00 // ILI9341 only, indexed control register read -#define TFT_MADCTL 0x3600 -#define TFT_MAD_MY 0x80 -#define TFT_MAD_MX 0x40 -#define TFT_MAD_MV 0x20 -#define TFT_MAD_ML 0x10 -#define TFT_MAD_BGR 0x08 -#define TFT_MAD_MH 0x04 -#define TFT_MAD_RGB 0x00 +#define TFT_MADCTL 0x3600 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_H_FLIP 0x02 +#define TFT_MAD_V_FLIP 0x01 #ifdef TFT_RGB_ORDER #if (TFT_RGB_ORDER == 1) diff --git a/lib/TFT_eSPI/TFT_Drivers/RM68120_Init.h b/lib/TFT_eSPI/TFT_Drivers/RM68120_Init.h index 4d38836..5b7e8f4 100644 --- a/lib/TFT_eSPI/TFT_Drivers/RM68120_Init.h +++ b/lib/TFT_eSPI/TFT_Drivers/RM68120_Init.h @@ -1,423 +1,263 @@ +// Initialisation for RM68120 -writeRegister(0xF000, 0x55); -writeRegister(0xF001, 0xAA); -writeRegister(0xF002, 0x52); -writeRegister(0xF003, 0x08); -writeRegister(0xF004, 0x01); +//ENABLE PAGE 1 +writeRegister8(0xF000, 0x55); +writeRegister8(0xF001, 0xAA); +writeRegister8(0xF002, 0x52); +writeRegister8(0xF003, 0x08); +writeRegister8(0xF004, 0x01); //GAMMA SETING RED -writeRegister(0xD100, 0x00); -writeRegister(0xD101, 0x00); -writeRegister(0xD102, 0x1b); -writeRegister(0xD103, 0x44); -writeRegister(0xD104, 0x62); -writeRegister(0xD105, 0x00); -writeRegister(0xD106, 0x7b); -writeRegister(0xD107, 0xa1); -writeRegister(0xD108, 0xc0); -writeRegister(0xD109, 0xee); -writeRegister(0xD10A, 0x55); -writeRegister(0xD10B, 0x10); -writeRegister(0xD10C, 0x2c); -writeRegister(0xD10D, 0x43); -writeRegister(0xD10E, 0x57); -writeRegister(0xD10F, 0x55); -writeRegister(0xD110, 0x68); -writeRegister(0xD111, 0x78); -writeRegister(0xD112, 0x87); -writeRegister(0xD113, 0x94); -writeRegister(0xD114, 0x55); -writeRegister(0xD115, 0xa0); -writeRegister(0xD116, 0xac); -writeRegister(0xD117, 0xb6); -writeRegister(0xD118, 0xc1); -writeRegister(0xD119, 0x55); -writeRegister(0xD11A, 0xcb); -writeRegister(0xD11B, 0xcd); -writeRegister(0xD11C, 0xd6); -writeRegister(0xD11D, 0xdf); -writeRegister(0xD11E, 0x95); -writeRegister(0xD11F, 0xe8); -writeRegister(0xD120, 0xf1); -writeRegister(0xD121, 0xfa); -writeRegister(0xD122, 0x02); -writeRegister(0xD123, 0xaa); -writeRegister(0xD124, 0x0b); -writeRegister(0xD125, 0x13); -writeRegister(0xD126, 0x1d); -writeRegister(0xD127, 0x26); -writeRegister(0xD128, 0xaa); -writeRegister(0xD129, 0x30); -writeRegister(0xD12A, 0x3c); -writeRegister(0xD12B, 0x4A); -writeRegister(0xD12C, 0x63); -writeRegister(0xD12D, 0xea); -writeRegister(0xD12E, 0x79); -writeRegister(0xD12F, 0xa6); -writeRegister(0xD130, 0xd0); -writeRegister(0xD131, 0x20); -writeRegister(0xD132, 0x0f); -writeRegister(0xD133, 0x8e); -writeRegister(0xD134, 0xff); -//GAMMA SETING GREEN -writeRegister(0xD200, 0x00); -writeRegister(0xD201, 0x00); -writeRegister(0xD202, 0x1b); -writeRegister(0xD203, 0x44); -writeRegister(0xD204, 0x62); -writeRegister(0xD205, 0x00); -writeRegister(0xD206, 0x7b); -writeRegister(0xD207, 0xa1); -writeRegister(0xD208, 0xc0); -writeRegister(0xD209, 0xee); -writeRegister(0xD20A, 0x55); -writeRegister(0xD20B, 0x10); -writeRegister(0xD20C, 0x2c); -writeRegister(0xD20D, 0x43); -writeRegister(0xD20E, 0x57); -writeRegister(0xD20F, 0x55); -writeRegister(0xD210, 0x68); -writeRegister(0xD211, 0x78); -writeRegister(0xD212, 0x87); -writeRegister(0xD213, 0x94); -writeRegister(0xD214, 0x55); -writeRegister(0xD215, 0xa0); -writeRegister(0xD216, 0xac); -writeRegister(0xD217, 0xb6); -writeRegister(0xD218, 0xc1); -writeRegister(0xD219, 0x55); -writeRegister(0xD21A, 0xcb); -writeRegister(0xD21B, 0xcd); -writeRegister(0xD21C, 0xd6); -writeRegister(0xD21D, 0xdf); -writeRegister(0xD21E, 0x95); -writeRegister(0xD21F, 0xe8); -writeRegister(0xD220, 0xf1); -writeRegister(0xD221, 0xfa); -writeRegister(0xD222, 0x02); -writeRegister(0xD223, 0xaa); -writeRegister(0xD224, 0x0b); -writeRegister(0xD225, 0x13); -writeRegister(0xD226, 0x1d); -writeRegister(0xD227, 0x26); -writeRegister(0xD228, 0xaa); -writeRegister(0xD229, 0x30); -writeRegister(0xD22A, 0x3c); -writeRegister(0xD22B, 0x4a); -writeRegister(0xD22C, 0x63); -writeRegister(0xD22D, 0xea); -writeRegister(0xD22E, 0x79); -writeRegister(0xD22F, 0xa6); -writeRegister(0xD230, 0xd0); -writeRegister(0xD231, 0x20); -writeRegister(0xD232, 0x0f); -writeRegister(0xD233, 0x8e); -writeRegister(0xD234, 0xff); - -//GAMMA SETING BLUE -writeRegister(0xD300, 0x00); -writeRegister(0xD301, 0x00); -writeRegister(0xD302, 0x1b); -writeRegister(0xD303, 0x44); -writeRegister(0xD304, 0x62); -writeRegister(0xD305, 0x00); -writeRegister(0xD306, 0x7b); -writeRegister(0xD307, 0xa1); -writeRegister(0xD308, 0xc0); -writeRegister(0xD309, 0xee); -writeRegister(0xD30A, 0x55); -writeRegister(0xD30B, 0x10); -writeRegister(0xD30C, 0x2c); -writeRegister(0xD30D, 0x43); -writeRegister(0xD30E, 0x57); -writeRegister(0xD30F, 0x55); -writeRegister(0xD310, 0x68); -writeRegister(0xD311, 0x78); -writeRegister(0xD312, 0x87); -writeRegister(0xD313, 0x94); -writeRegister(0xD314, 0x55); -writeRegister(0xD315, 0xa0); -writeRegister(0xD316, 0xac); -writeRegister(0xD317, 0xb6); -writeRegister(0xD318, 0xc1); -writeRegister(0xD319, 0x55); -writeRegister(0xD31A, 0xcb); -writeRegister(0xD31B, 0xcd); -writeRegister(0xD31C, 0xd6); -writeRegister(0xD31D, 0xdf); -writeRegister(0xD31E, 0x95); -writeRegister(0xD31F, 0xe8); -writeRegister(0xD320, 0xf1); -writeRegister(0xD321, 0xfa); -writeRegister(0xD322, 0x02); -writeRegister(0xD323, 0xaa); -writeRegister(0xD324, 0x0b); -writeRegister(0xD325, 0x13); -writeRegister(0xD326, 0x1d); -writeRegister(0xD327, 0x26); -writeRegister(0xD328, 0xaa); -writeRegister(0xD329, 0x30); -writeRegister(0xD32A, 0x3c); -writeRegister(0xD32B, 0x4A); -writeRegister(0xD32C, 0x63); -writeRegister(0xD32D, 0xea); -writeRegister(0xD32E, 0x79); -writeRegister(0xD32F, 0xa6); -writeRegister(0xD330, 0xd0); -writeRegister(0xD331, 0x20); -writeRegister(0xD332, 0x0f); -writeRegister(0xD333, 0x8e); -writeRegister(0xD334, 0xff); - - -//GAMMA SETING RED -writeRegister(0xD400, 0x00); -writeRegister(0xD401, 0x00); -writeRegister(0xD402, 0x1b); -writeRegister(0xD403, 0x44); -writeRegister(0xD404, 0x62); -writeRegister(0xD405, 0x00); -writeRegister(0xD406, 0x7b); -writeRegister(0xD407, 0xa1); -writeRegister(0xD408, 0xc0); -writeRegister(0xD409, 0xee); -writeRegister(0xD40A, 0x55); -writeRegister(0xD40B, 0x10); -writeRegister(0xD40C, 0x2c); -writeRegister(0xD40D, 0x43); -writeRegister(0xD40E, 0x57); -writeRegister(0xD40F, 0x55); -writeRegister(0xD410, 0x68); -writeRegister(0xD411, 0x78); -writeRegister(0xD412, 0x87); -writeRegister(0xD413, 0x94); -writeRegister(0xD414, 0x55); -writeRegister(0xD415, 0xa0); -writeRegister(0xD416, 0xac); -writeRegister(0xD417, 0xb6); -writeRegister(0xD418, 0xc1); -writeRegister(0xD419, 0x55); -writeRegister(0xD41A, 0xcb); -writeRegister(0xD41B, 0xcd); -writeRegister(0xD41C, 0xd6); -writeRegister(0xD41D, 0xdf); -writeRegister(0xD41E, 0x95); -writeRegister(0xD41F, 0xe8); -writeRegister(0xD420, 0xf1); -writeRegister(0xD421, 0xfa); -writeRegister(0xD422, 0x02); -writeRegister(0xD423, 0xaa); -writeRegister(0xD424, 0x0b); -writeRegister(0xD425, 0x13); -writeRegister(0xD426, 0x1d); -writeRegister(0xD427, 0x26); -writeRegister(0xD428, 0xaa); -writeRegister(0xD429, 0x30); -writeRegister(0xD42A, 0x3c); -writeRegister(0xD42B, 0x4A); -writeRegister(0xD42C, 0x63); -writeRegister(0xD42D, 0xea); -writeRegister(0xD42E, 0x79); -writeRegister(0xD42F, 0xa6); -writeRegister(0xD430, 0xd0); -writeRegister(0xD431, 0x20); -writeRegister(0xD432, 0x0f); -writeRegister(0xD433, 0x8e); -writeRegister(0xD434, 0xff); +writeRegister8(0xD400, 0x00); +writeRegister8(0xD401, 0x00); +writeRegister8(0xD402, 0x1b); +writeRegister8(0xD403, 0x44); +writeRegister8(0xD404, 0x62); +writeRegister8(0xD405, 0x00); +writeRegister8(0xD406, 0x7b); +writeRegister8(0xD407, 0xa1); +writeRegister8(0xD408, 0xc0); +writeRegister8(0xD409, 0xee); +writeRegister8(0xD40A, 0x55); +writeRegister8(0xD40B, 0x10); +writeRegister8(0xD40C, 0x2c); +writeRegister8(0xD40D, 0x43); +writeRegister8(0xD40E, 0x57); +writeRegister8(0xD40F, 0x55); +writeRegister8(0xD410, 0x68); +writeRegister8(0xD411, 0x78); +writeRegister8(0xD412, 0x87); +writeRegister8(0xD413, 0x94); +writeRegister8(0xD414, 0x55); +writeRegister8(0xD415, 0xa0); +writeRegister8(0xD416, 0xac); +writeRegister8(0xD417, 0xb6); +writeRegister8(0xD418, 0xc1); +writeRegister8(0xD419, 0x55); +writeRegister8(0xD41A, 0xcb); +writeRegister8(0xD41B, 0xcd); +writeRegister8(0xD41C, 0xd6); +writeRegister8(0xD41D, 0xdf); +writeRegister8(0xD41E, 0x95); +writeRegister8(0xD41F, 0xe8); +writeRegister8(0xD420, 0xf1); +writeRegister8(0xD421, 0xfa); +writeRegister8(0xD422, 0x02); +writeRegister8(0xD423, 0xaa); +writeRegister8(0xD424, 0x0b); +writeRegister8(0xD425, 0x13); +writeRegister8(0xD426, 0x1d); +writeRegister8(0xD427, 0x26); +writeRegister8(0xD428, 0xaa); +writeRegister8(0xD429, 0x30); +writeRegister8(0xD42A, 0x3c); +writeRegister8(0xD42B, 0x4A); +writeRegister8(0xD42C, 0x63); +writeRegister8(0xD42D, 0xea); +writeRegister8(0xD42E, 0x79); +writeRegister8(0xD42F, 0xa6); +writeRegister8(0xD430, 0xd0); +writeRegister8(0xD431, 0x20); +writeRegister8(0xD432, 0x0f); +writeRegister8(0xD433, 0x8e); +writeRegister8(0xD434, 0xff); //GAMMA SETING GREEN -writeRegister(0xD500, 0x00); -writeRegister(0xD501, 0x00); -writeRegister(0xD502, 0x1b); -writeRegister(0xD503, 0x44); -writeRegister(0xD504, 0x62); -writeRegister(0xD505, 0x00); -writeRegister(0xD506, 0x7b); -writeRegister(0xD507, 0xa1); -writeRegister(0xD508, 0xc0); -writeRegister(0xD509, 0xee); -writeRegister(0xD50A, 0x55); -writeRegister(0xD50B, 0x10); -writeRegister(0xD50C, 0x2c); -writeRegister(0xD50D, 0x43); -writeRegister(0xD50E, 0x57); -writeRegister(0xD50F, 0x55); -writeRegister(0xD510, 0x68); -writeRegister(0xD511, 0x78); -writeRegister(0xD512, 0x87); -writeRegister(0xD513, 0x94); -writeRegister(0xD514, 0x55); -writeRegister(0xD515, 0xa0); -writeRegister(0xD516, 0xac); -writeRegister(0xD517, 0xb6); -writeRegister(0xD518, 0xc1); -writeRegister(0xD519, 0x55); -writeRegister(0xD51A, 0xcb); -writeRegister(0xD51B, 0xcd); -writeRegister(0xD51C, 0xd6); -writeRegister(0xD51D, 0xdf); -writeRegister(0xD51E, 0x95); -writeRegister(0xD51F, 0xe8); -writeRegister(0xD520, 0xf1); -writeRegister(0xD521, 0xfa); -writeRegister(0xD522, 0x02); -writeRegister(0xD523, 0xaa); -writeRegister(0xD524, 0x0b); -writeRegister(0xD525, 0x13); -writeRegister(0xD526, 0x1d); -writeRegister(0xD527, 0x26); -writeRegister(0xD528, 0xaa); -writeRegister(0xD529, 0x30); -writeRegister(0xD52A, 0x3c); -writeRegister(0xD52B, 0x4a); -writeRegister(0xD52C, 0x63); -writeRegister(0xD52D, 0xea); -writeRegister(0xD52E, 0x79); -writeRegister(0xD52F, 0xa6); -writeRegister(0xD530, 0xd0); -writeRegister(0xD531, 0x20); -writeRegister(0xD532, 0x0f); -writeRegister(0xD533, 0x8e); -writeRegister(0xD534, 0xff); +writeRegister8(0xD500, 0x00); +writeRegister8(0xD501, 0x00); +writeRegister8(0xD502, 0x1b); +writeRegister8(0xD503, 0x44); +writeRegister8(0xD504, 0x62); +writeRegister8(0xD505, 0x00); +writeRegister8(0xD506, 0x7b); +writeRegister8(0xD507, 0xa1); +writeRegister8(0xD508, 0xc0); +writeRegister8(0xD509, 0xee); +writeRegister8(0xD50A, 0x55); +writeRegister8(0xD50B, 0x10); +writeRegister8(0xD50C, 0x2c); +writeRegister8(0xD50D, 0x43); +writeRegister8(0xD50E, 0x57); +writeRegister8(0xD50F, 0x55); +writeRegister8(0xD510, 0x68); +writeRegister8(0xD511, 0x78); +writeRegister8(0xD512, 0x87); +writeRegister8(0xD513, 0x94); +writeRegister8(0xD514, 0x55); +writeRegister8(0xD515, 0xa0); +writeRegister8(0xD516, 0xac); +writeRegister8(0xD517, 0xb6); +writeRegister8(0xD518, 0xc1); +writeRegister8(0xD519, 0x55); +writeRegister8(0xD51A, 0xcb); +writeRegister8(0xD51B, 0xcd); +writeRegister8(0xD51C, 0xd6); +writeRegister8(0xD51D, 0xdf); +writeRegister8(0xD51E, 0x95); +writeRegister8(0xD51F, 0xe8); +writeRegister8(0xD520, 0xf1); +writeRegister8(0xD521, 0xfa); +writeRegister8(0xD522, 0x02); +writeRegister8(0xD523, 0xaa); +writeRegister8(0xD524, 0x0b); +writeRegister8(0xD525, 0x13); +writeRegister8(0xD526, 0x1d); +writeRegister8(0xD527, 0x26); +writeRegister8(0xD528, 0xaa); +writeRegister8(0xD529, 0x30); +writeRegister8(0xD52A, 0x3c); +writeRegister8(0xD52B, 0x4a); +writeRegister8(0xD52C, 0x63); +writeRegister8(0xD52D, 0xea); +writeRegister8(0xD52E, 0x79); +writeRegister8(0xD52F, 0xa6); +writeRegister8(0xD530, 0xd0); +writeRegister8(0xD531, 0x20); +writeRegister8(0xD532, 0x0f); +writeRegister8(0xD533, 0x8e); +writeRegister8(0xD534, 0xff); //GAMMA SETING BLUE -writeRegister(0xD600, 0x00); -writeRegister(0xD601, 0x00); -writeRegister(0xD602, 0x1b); -writeRegister(0xD603, 0x44); -writeRegister(0xD604, 0x62); -writeRegister(0xD605, 0x00); -writeRegister(0xD606, 0x7b); -writeRegister(0xD607, 0xa1); -writeRegister(0xD608, 0xc0); -writeRegister(0xD609, 0xee); -writeRegister(0xD60A, 0x55); -writeRegister(0xD60B, 0x10); -writeRegister(0xD60C, 0x2c); -writeRegister(0xD60D, 0x43); -writeRegister(0xD60E, 0x57); -writeRegister(0xD60F, 0x55); -writeRegister(0xD610, 0x68); -writeRegister(0xD611, 0x78); -writeRegister(0xD612, 0x87); -writeRegister(0xD613, 0x94); -writeRegister(0xD614, 0x55); -writeRegister(0xD615, 0xa0); -writeRegister(0xD616, 0xac); -writeRegister(0xD617, 0xb6); -writeRegister(0xD618, 0xc1); -writeRegister(0xD619, 0x55); -writeRegister(0xD61A, 0xcb); -writeRegister(0xD61B, 0xcd); -writeRegister(0xD61C, 0xd6); -writeRegister(0xD61D, 0xdf); -writeRegister(0xD61E, 0x95); -writeRegister(0xD61F, 0xe8); -writeRegister(0xD620, 0xf1); -writeRegister(0xD621, 0xfa); -writeRegister(0xD622, 0x02); -writeRegister(0xD623, 0xaa); -writeRegister(0xD624, 0x0b); -writeRegister(0xD625, 0x13); -writeRegister(0xD626, 0x1d); -writeRegister(0xD627, 0x26); -writeRegister(0xD628, 0xaa); -writeRegister(0xD629, 0x30); -writeRegister(0xD62A, 0x3c); -writeRegister(0xD62B, 0x4A); -writeRegister(0xD62C, 0x63); -writeRegister(0xD62D, 0xea); -writeRegister(0xD62E, 0x79); -writeRegister(0xD62F, 0xa6); -writeRegister(0xD630, 0xd0); -writeRegister(0xD631, 0x20); -writeRegister(0xD632, 0x0f); -writeRegister(0xD633, 0x8e); -writeRegister(0xD634, 0xff); +writeRegister8(0xD600, 0x00); +writeRegister8(0xD601, 0x00); +writeRegister8(0xD602, 0x1b); +writeRegister8(0xD603, 0x44); +writeRegister8(0xD604, 0x62); +writeRegister8(0xD605, 0x00); +writeRegister8(0xD606, 0x7b); +writeRegister8(0xD607, 0xa1); +writeRegister8(0xD608, 0xc0); +writeRegister8(0xD609, 0xee); +writeRegister8(0xD60A, 0x55); +writeRegister8(0xD60B, 0x10); +writeRegister8(0xD60C, 0x2c); +writeRegister8(0xD60D, 0x43); +writeRegister8(0xD60E, 0x57); +writeRegister8(0xD60F, 0x55); +writeRegister8(0xD610, 0x68); +writeRegister8(0xD611, 0x78); +writeRegister8(0xD612, 0x87); +writeRegister8(0xD613, 0x94); +writeRegister8(0xD614, 0x55); +writeRegister8(0xD615, 0xa0); +writeRegister8(0xD616, 0xac); +writeRegister8(0xD617, 0xb6); +writeRegister8(0xD618, 0xc1); +writeRegister8(0xD619, 0x55); +writeRegister8(0xD61A, 0xcb); +writeRegister8(0xD61B, 0xcd); +writeRegister8(0xD61C, 0xd6); +writeRegister8(0xD61D, 0xdf); +writeRegister8(0xD61E, 0x95); +writeRegister8(0xD61F, 0xe8); +writeRegister8(0xD620, 0xf1); +writeRegister8(0xD621, 0xfa); +writeRegister8(0xD622, 0x02); +writeRegister8(0xD623, 0xaa); +writeRegister8(0xD624, 0x0b); +writeRegister8(0xD625, 0x13); +writeRegister8(0xD626, 0x1d); +writeRegister8(0xD627, 0x26); +writeRegister8(0xD628, 0xaa); +writeRegister8(0xD629, 0x30); +writeRegister8(0xD62A, 0x3c); +writeRegister8(0xD62B, 0x4A); +writeRegister8(0xD62C, 0x63); +writeRegister8(0xD62D, 0xea); +writeRegister8(0xD62E, 0x79); +writeRegister8(0xD62F, 0xa6); +writeRegister8(0xD630, 0xd0); +writeRegister8(0xD631, 0x20); +writeRegister8(0xD632, 0x0f); +writeRegister8(0xD633, 0x8e); +writeRegister8(0xD634, 0xff); //AVDD VOLTAGE SETTING -writeRegister(0xB000, 0x05); -writeRegister(0xB001, 0x05); -writeRegister(0xB002, 0x05); +writeRegister8(0xB000, 0x05); +writeRegister8(0xB001, 0x05); +writeRegister8(0xB002, 0x05); //AVEE VOLTAGE SETTING -writeRegister(0xB100, 0x05); -writeRegister(0xB101, 0x05); -writeRegister(0xB102, 0x05); +writeRegister8(0xB100, 0x05); +writeRegister8(0xB101, 0x05); +writeRegister8(0xB102, 0x05); //AVDD Boosting -writeRegister(0xB600, 0x34); -writeRegister(0xB601, 0x34); -writeRegister(0xB603, 0x34); +writeRegister8(0xB600, 0x34); +writeRegister8(0xB601, 0x34); +writeRegister8(0xB603, 0x34); //AVEE Boosting -writeRegister(0xB700, 0x24); -writeRegister(0xB701, 0x24); -writeRegister(0xB702, 0x24); +writeRegister8(0xB700, 0x24); +writeRegister8(0xB701, 0x24); +writeRegister8(0xB702, 0x24); //VCL Boosting -writeRegister(0xB800, 0x24); -writeRegister(0xB801, 0x24); -writeRegister(0xB802, 0x24); +writeRegister8(0xB800, 0x24); +writeRegister8(0xB801, 0x24); +writeRegister8(0xB802, 0x24); //VGLX VOLTAGE SETTING -writeRegister(0xBA00, 0x14); -writeRegister(0xBA01, 0x14); -writeRegister(0xBA02, 0x14); +writeRegister8(0xBA00, 0x14); +writeRegister8(0xBA01, 0x14); +writeRegister8(0xBA02, 0x14); //VCL Boosting -writeRegister(0xB900, 0x24); -writeRegister(0xB901, 0x24); -writeRegister(0xB902, 0x24); +writeRegister8(0xB900, 0x24); +writeRegister8(0xB901, 0x24); +writeRegister8(0xB902, 0x24); //Gamma Voltage -writeRegister(0xBc00, 0x00); -writeRegister(0xBc01, 0xa0);//vgmp=5.0 -writeRegister(0xBc02, 0x00); -writeRegister(0xBd00, 0x00); -writeRegister(0xBd01, 0xa0);//vgmn=5.0 -writeRegister(0xBd02, 0x00); +writeRegister8(0xBc00, 0x00); +writeRegister8(0xBc01, 0xa0);//vgmp=5.0 +writeRegister8(0xBc02, 0x00); +writeRegister8(0xBd00, 0x00); +writeRegister8(0xBd01, 0xa0);//vgmn=5.0 +writeRegister8(0xBd02, 0x00); //VCOM Setting -writeRegister(0xBe01, 0x3d);//3 -//ENABLE PAGE 0 -writeRegister(0xF000, 0x55); -writeRegister(0xF001, 0xAA); -writeRegister(0xF002, 0x52); -writeRegister(0xF003, 0x08); -writeRegister(0xF004, 0x00); -//Vivid Color Function Control -writeRegister(0xB400, 0x10); -//Z-INVERSION -writeRegister(0xBC00, 0x05); -writeRegister(0xBC01, 0x05); -writeRegister(0xBC02, 0x05); +writeRegister8(0xBe01, 0x3d);//3 +//ENABLE PAGE 0 +writeRegister8(0xF000, 0x55); +writeRegister8(0xF001, 0xAA); +writeRegister8(0xF002, 0x52); +writeRegister8(0xF003, 0x08); +writeRegister8(0xF004, 0x00); +//Vivid Color Function Control +writeRegister8(0xB400, 0x10); +//Z-INVERSION +writeRegister8(0xBC00, 0x05); +writeRegister8(0xBC01, 0x05); +writeRegister8(0xBC02, 0x05); //*************** add on 20111021**********************// -writeRegister(0xB700, 0x22);//GATE EQ CONTROL -writeRegister(0xB701, 0x22);//GATE EQ CONTROL -writeRegister(0xC80B, 0x2A);//DISPLAY TIMING CONTROL -writeRegister(0xC80C, 0x2A);//DISPLAY TIMING CONTROL -writeRegister(0xC80F, 0x2A);//DISPLAY TIMING CONTROL -writeRegister(0xC810, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xB700, 0x22);//GATE EQ CONTROL +writeRegister8(0xB701, 0x22);//GATE EQ CONTROL +writeRegister8(0xC80B, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xC80C, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xC80F, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xC810, 0x2A);//DISPLAY TIMING CONTROL //*************** add on 20111021**********************// //PWM_ENH_OE =1 -writeRegister(0xd000, 0x01); +writeRegister8(0xd000, 0x01); //DM_SEL =1 -writeRegister(0xb300, 0x10); +writeRegister8(0xb300, 0x10); //VBPDA=07h -writeRegister(0xBd02, 0x07); +writeRegister8(0xBd02, 0x07); //VBPDb=07h -writeRegister(0xBe02, 0x07); +writeRegister8(0xBe02, 0x07); //VBPDc=07h -writeRegister(0xBf02, 0x07); +writeRegister8(0xBf02, 0x07); + //ENABLE PAGE 2 -writeRegister(0xF000, 0x55); -writeRegister(0xF001, 0xAA); -writeRegister(0xF002, 0x52); -writeRegister(0xF003, 0x08); -writeRegister(0xF004, 0x02); +writeRegister8(0xF000, 0x55); +writeRegister8(0xF001, 0xAA); +writeRegister8(0xF002, 0x52); +writeRegister8(0xF003, 0x08); +writeRegister8(0xF004, 0x02); //SDREG0 =0 -writeRegister(0xc301, 0xa9); +writeRegister8(0xc301, 0xa9); //DS=14 -writeRegister(0xfe01, 0x94); +writeRegister8(0xfe01, 0x94); //OSC =60h -writeRegister(0xf600, 0x60); +writeRegister8(0xf600, 0x60); //TE ON -writeRegister(0x3500, 0x00); +writeRegister8(0x3500, 0x00); +writeRegister8(0xFFFF, 0xFF); + //SLEEP OUT writecommand(0x1100); delay(100); @@ -425,5 +265,5 @@ delay(100); writecommand(0x2900); delay(100); -writeRegister(0x3A00, 0x55); -writeRegister(0x3600, 0xA3); +writeRegister16(0x3A00, 0x55); +writeRegister8(0x3600, TFT_MAD_COLOR_ORDER); diff --git a/lib/TFT_eSPI/TFT_Drivers/RM68120_Rotation.h b/lib/TFT_eSPI/TFT_Drivers/RM68120_Rotation.h index 26ebb49..492493a 100644 --- a/lib/TFT_eSPI/TFT_Drivers/RM68120_Rotation.h +++ b/lib/TFT_eSPI/TFT_Drivers/RM68120_Rotation.h @@ -2,28 +2,28 @@ // This is the command sequence that rotates the RM68120 driver coordinate frame rotation = m % 4; // Limit the range of values to 0-3 + uint8_t reg = 0; - writecommand(TFT_MADCTL); switch (rotation) { case 0: - writedata(TFT_MAD_COLOR_ORDER); + reg = TFT_MAD_COLOR_ORDER; _width = _init_width; _height = _init_height; break; case 1: - writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER); + reg = TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER; _width = _init_height; _height = _init_width; break; case 2: - writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + reg = TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER; _width = _init_width; _height = _init_height; break; case 3: - writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + reg = TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER; _width = _init_height; _height = _init_width; break; - } + writeRegister16(TFT_MADCTL, reg); \ No newline at end of file diff --git a/lib/TFT_eSPI/TFT_Drivers/ST7789_Init.h b/lib/TFT_eSPI/TFT_Drivers/ST7789_Init.h index dc6798d..9fa2918 100644 --- a/lib/TFT_eSPI/TFT_Drivers/ST7789_Init.h +++ b/lib/TFT_eSPI/TFT_Drivers/ST7789_Init.h @@ -141,8 +141,14 @@ writecommand(ST7789_MADCTL); writedata(TFT_MAD_COLOR_ORDER); - writecommand(0x3A); - writedata(0x05); + // writecommand(ST7789_RAMCTRL); + // writedata(0x00); + // writedata(0xE0); // 5 to 6 bit conversion: r0 = r5, b0 = b5 + + writecommand(ST7789_COLMOD); + writedata(0x55); + delay(10); + //--------------------------------ST7789V Frame rate setting----------------------------------// writecommand(ST7789_PORCTRL); writedata(0x0b); diff --git a/lib/TFT_eSPI/TFT_config.h b/lib/TFT_eSPI/TFT_config.h index c4d087b..2607e24 100644 --- a/lib/TFT_eSPI/TFT_config.h +++ b/lib/TFT_eSPI/TFT_config.h @@ -12,7 +12,7 @@ * @author Ricard Bitriá Ribes (https://github.com/dracir9) * Created Date: 22-01-2022 * ----- - * Last Modified: 14-04-2022 + * Last Modified: 25-02-2023 * Modified By: Ricard Bitriá Ribes * ----- * @copyright (c) 2022 Ricard Bitriá Ribes @@ -161,6 +161,8 @@ // 8 BIT PARALLEL BUS #ifdef CONFIG_TFT_PARALLEL_8_BIT + #define TFT_PARALLEL_8_BIT + #if CONFIG_TFT_D0 == -1 #error "Invalid Data 0 pin. Check TFT_eSPI configuration" #else @@ -305,4 +307,12 @@ #define SPI_TOUCH_FREQUENCY CONFIG_SPI_TOUCH_FREQUENCY #endif +/*************************************************************************************** +** Section 6: Others +***************************************************************************************/ + +#ifdef CONFIG_DISABLE_WARNINGS + #define DISABLE_ALL_LIBRARY_WARNINGS +#endif + #endif // TFT_CONFIG_H diff --git a/lib/TFT_eSPI/TFT_eSPI.cpp b/lib/TFT_eSPI/TFT_eSPI.cpp index 44a19f2..67bd87e 100644 --- a/lib/TFT_eSPI/TFT_eSPI.cpp +++ b/lib/TFT_eSPI/TFT_eSPI.cpp @@ -533,25 +533,33 @@ TFT_eSPI::TFT_eSPI(int16_t w, int16_t h) void TFT_eSPI::initBus(void) { #ifdef TFT_CS - pinMode(TFT_CS, OUTPUT); - digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) + if (TFT_CS >= 0) { + pinMode(TFT_CS, OUTPUT); + digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) + } #endif // Configure chip select for touchscreen controller if present #ifdef TOUCH_CS - pinMode(TOUCH_CS, OUTPUT); - digitalWrite(TOUCH_CS, HIGH); // Chip select high (inactive) + if (TOUCH_CS >= 0) { + pinMode(TOUCH_CS, OUTPUT); + digitalWrite(TOUCH_CS, HIGH); // Chip select high (inactive) + } #endif // In parallel mode and with the RP2040 processor, the TFT_WR line is handled in the PIO #if defined (TFT_WR) && !defined (ARDUINO_ARCH_RP2040) && !defined (ARDUINO_ARCH_MBED) - pinMode(TFT_WR, OUTPUT); - digitalWrite(TFT_WR, HIGH); // Set write strobe high (inactive) + if (TFT_WR >= 0) { + pinMode(TFT_WR, OUTPUT); + digitalWrite(TFT_WR, HIGH); // Set write strobe high (inactive) + } #endif #ifdef TFT_DC - pinMode(TFT_DC, OUTPUT); - digitalWrite(TFT_DC, HIGH); // Data/Command high = data mode + if (TFT_DC >= 0) { + pinMode(TFT_DC, OUTPUT); + digitalWrite(TFT_DC, HIGH); // Data/Command high = data mode + } #endif #ifdef TFT_RST @@ -564,8 +572,10 @@ void TFT_eSPI::initBus(void) { #if defined (TFT_PARALLEL_8_BIT) // Make sure read is high before we set the bus to output - pinMode(TFT_RD, OUTPUT); - digitalWrite(TFT_RD, HIGH); + if (TFT_RD >= 0) { + pinMode(TFT_RD, OUTPUT); + digitalWrite(TFT_RD, HIGH); + } #if !defined (ARDUINO_ARCH_RP2040) && !defined (ARDUINO_ARCH_MBED)// PIO manages pins // Set TFT data bus lines to output @@ -649,8 +659,10 @@ void TFT_eSPI::init(uint8_t tc) #if defined (TFT_CS) && !defined(RP2040_PIO_INTERFACE) // Set to output once again in case MISO is used for CS - pinMode(TFT_CS, OUTPUT); - digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) + if (TFT_CS >= 0) { + pinMode(TFT_CS, OUTPUT); + digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) + } #elif defined (ARDUINO_ARCH_ESP8266) && !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_SPI) spi.setHwCs(1); // Use hardware SS toggling #endif @@ -658,8 +670,10 @@ void TFT_eSPI::init(uint8_t tc) // Set to output once again in case MISO is used for DC #if defined (TFT_DC) && !defined(RP2040_PIO_INTERFACE) + if (TFT_DC >= 0) { pinMode(TFT_DC, OUTPUT); digitalWrite(TFT_DC, HIGH); // Data/Command high = data mode + } #endif _booted = false; @@ -670,7 +684,9 @@ void TFT_eSPI::init(uint8_t tc) #ifdef TFT_RST #if !defined(RP2040_PIO_INTERFACE) // Set to output once again in case MISO is used for TFT_RST - pinMode(TFT_RST, OUTPUT); + if (TFT_RST >= 0) { + pinMode(TFT_RST, OUTPUT); + } #endif if (TFT_RST >= 0) { writecommand(0x00); // Put SPI bus in known state for TFT with CS tied low @@ -768,13 +784,17 @@ void TFT_eSPI::init(uint8_t tc) setRotation(rotation); #if defined (TFT_BL) && defined (TFT_BACKLIGHT_ON) - pinMode(TFT_BL, OUTPUT); - digitalWrite(TFT_BL, TFT_BACKLIGHT_ON); + if (TFT_BL >= 0) { + pinMode(TFT_BL, OUTPUT); + digitalWrite(TFT_BL, TFT_BACKLIGHT_ON); + } #else #if defined (TFT_BL) && defined (M5STACK) // Turn on the back-light LED - pinMode(TFT_BL, OUTPUT); - digitalWrite(TFT_BL, HIGH); + if (TFT_BL >= 0) { + pinMode(TFT_BL, OUTPUT); + digitalWrite(TFT_BL, HIGH); + } #endif #endif } @@ -968,7 +988,6 @@ void TFT_eSPI::writecommand(uint8_t c) DC_D; end_tft_write(); - } #else void TFT_eSPI::writecommand(uint16_t c) @@ -984,7 +1003,7 @@ void TFT_eSPI::writecommand(uint16_t c) end_tft_write(); } -void TFT_eSPI::writeRegister(uint16_t c, uint8_t d) +void TFT_eSPI::writeRegister8(uint16_t c, uint8_t d) { begin_tft_write(); @@ -999,6 +1018,22 @@ void TFT_eSPI::writeRegister(uint16_t c, uint8_t d) end_tft_write(); } +void TFT_eSPI::writeRegister16(uint16_t c, uint16_t d) +{ + begin_tft_write(); + + DC_C; + + tft_Write_16(c); + + DC_D; + + tft_Write_16(d); + + end_tft_write(); + +} + #endif /*************************************************************************************** @@ -1147,7 +1182,7 @@ uint16_t TFT_eSPI::readPixel(int32_t x0, int32_t y0) // Set masked pins D0- D7 to output busDir(GPIO_DIR_MASK, OUTPUT); - #ifdef ILI9486_DRIVER + #if defined (ILI9486_DRIVER) || defined (ST7796_DRIVER) return bgr; #else // Swap Red and Blue (could check MADCTL setting to see if this is needed) @@ -1181,6 +1216,13 @@ uint16_t TFT_eSPI::readPixel(int32_t x0, int32_t y0) #if defined (ST7796_DRIVER) // Read the 2 bytes color = ((tft_Read_8()) << 8) | (tft_Read_8()); + #elif defined (ST7735_DRIVER) + // Read the 3 RGB bytes, colour is in LS 6 bits of the top 7 bits of each byte + // as the TFT stores colours as 18 bits + uint8_t r = tft_Read_8()<<1; + uint8_t g = tft_Read_8()<<1; + uint8_t b = tft_Read_8()<<1; + color = color565(r, g, b); #else // Read the 3 RGB bytes, colour is actually only in the top 6 bits of each byte // as the TFT stores colours as 18 bits @@ -1287,7 +1329,7 @@ void TFT_eSPI::readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *da int32_t lw = dw; uint16_t* line = data; while (lw--) { - #ifdef ILI9486_DRIVER + #if defined (ILI9486_DRIVER) || defined (ST7796_DRIVER) // Read the RGB 16 bit colour *line++ = readByte() | (readByte() << 8); #else @@ -1341,6 +1383,13 @@ void TFT_eSPI::readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *da #if defined (ST7796_DRIVER) // Read the 2 bytes color = ((tft_Read_8()) << 8) | (tft_Read_8()); + #elif defined (ST7735_DRIVER) + // Read the 3 RGB bytes, colour is in LS 6 bits of the top 7 bits of each byte + // as the TFT stores colours as 18 bits + uint8_t r = tft_Read_8()<<1; + uint8_t g = tft_Read_8()<<1; + uint8_t b = tft_Read_8()<<1; + color = color565(r, g, b); #else // Read the 3 RGB bytes, colour is actually only in the top 6 bits of each byte // as the TFT stores colours as 18 bits @@ -2040,7 +2089,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *da /*************************************************************************************** ** Function name: pushMaskedImage -** Description: Render a 16 bit colour image with a 1bpp mask +** Description: Render a 16 bit colour image to TFT with a 1bpp mask ***************************************************************************************/ // Can be used with a 16bpp sprite and a 1bpp sprite for the mask void TFT_eSPI::pushMaskedImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *img, uint8_t *mask) @@ -2109,7 +2158,6 @@ void TFT_eSPI::pushMaskedImage(int32_t x, int32_t y, int32_t w, int32_t h, uint1 xp += clearCount; clearCount = 0; pushImage(x + xp, y, setCount, 1, iptr + xp); // pushImage handles clipping - //pushImageDMA(x + xp, y, setCount, 1, iptr + xp); xp += setCount; } } while (setCount || mptr < eptr); @@ -3132,14 +3180,15 @@ void TFT_eSPI::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32 { if (_vpOoB) return; - if (c < 32) return; #ifdef LOAD_GLCD //>>>>>>>>>>>>>>>>>> #ifdef LOAD_GFXFF - if(!gfxFont) { // 'Classic' built-in font + if(!gfxFont) { // 'Classic' built-in GLCD font #endif //>>>>>>>>>>>>>>>>>> + if (c > 255) return; + int32_t xd = x + _xDatum; int32_t yd = y + _yDatum; @@ -3403,6 +3452,18 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #endif DC_D; + #elif defined (RM68120_DRIVER) + DC_C; tft_Write_16(TFT_CASET+0); DC_D; tft_Write_16(x0 >> 8); + DC_C; tft_Write_16(TFT_CASET+1); DC_D; tft_Write_16(x0 & 0xFF); + DC_C; tft_Write_16(TFT_CASET+2); DC_D; tft_Write_16(x1 >> 8); + DC_C; tft_Write_16(TFT_CASET+3); DC_D; tft_Write_16(x1 & 0xFF); + DC_C; tft_Write_16(TFT_PASET+0); DC_D; tft_Write_16(y0 >> 8); + DC_C; tft_Write_16(TFT_PASET+1); DC_D; tft_Write_16(y0 & 0xFF); + DC_C; tft_Write_16(TFT_PASET+2); DC_D; tft_Write_16(y1 >> 8); + DC_C; tft_Write_16(TFT_PASET+3); DC_D; tft_Write_16(y1 & 0xFF); + + DC_C; tft_Write_16(TFT_RAMWR); + DC_D; #else // This is for the RP2040 and PIO interface (SPI or parallel) WAIT_FOR_STALL; @@ -3630,6 +3691,24 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) #endif #endif while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + #elif defined (RM68120_DRIVER) + if (addr_col != x) { + DC_C; tft_Write_16(TFT_CASET+0); DC_D; tft_Write_16(x >> 8); + DC_C; tft_Write_16(TFT_CASET+1); DC_D; tft_Write_16(x & 0xFF); + DC_C; tft_Write_16(TFT_CASET+2); DC_D; tft_Write_16(x >> 8); + DC_C; tft_Write_16(TFT_CASET+3); DC_D; tft_Write_16(x & 0xFF); + addr_col = x; + } + if (addr_row != y) { + DC_C; tft_Write_16(TFT_PASET+0); DC_D; tft_Write_16(y >> 8); + DC_C; tft_Write_16(TFT_PASET+1); DC_D; tft_Write_16(y & 0xFF); + DC_C; tft_Write_16(TFT_PASET+2); DC_D; tft_Write_16(y >> 8); + DC_C; tft_Write_16(TFT_PASET+3); DC_D; tft_Write_16(y & 0xFF); + addr_row = y; + } + DC_C; tft_Write_16(TFT_RAMWR); DC_D; + + TX_FIFO = color; #else // This is for the RP2040 and PIO interface (SPI or parallel) WAIT_FOR_STALL; @@ -3640,7 +3719,7 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) TX_FIFO = (y<<16) | y; TX_FIFO = TFT_RAMWR; //DC set high by PIO - #if defined (SPI_18BIT_DRIVER) + #if defined (SPI_18BIT_DRIVER) || (defined (SSD1963_DRIVER) && defined (TFT_PARALLEL_8_BIT)) TX_FIFO = ((color & 0xF800)<<8) | ((color & 0x07E0)<<5) | ((color & 0x001F)<<3); #else TX_FIFO = color; @@ -3885,7 +3964,7 @@ uint16_t TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color, uint8_t alpha ** Function name: drawSmoothArc ** Description: Draw a smooth arc clockwise from 6 o'clock ***************************************************************************************/ -void TFT_eSPI::drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t startAngle, int32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool roundEnds) +void TFT_eSPI::drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool roundEnds) // Centre at x,y // r = arc outer radius, ir = arc inner radius. Inclusive so arc thickness = r - ir + 1 // Angles in range 0-360 @@ -3895,7 +3974,7 @@ void TFT_eSPI::drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, int32_ { inTransaction = true; - if (endAngle != startAngle) + if (endAngle != startAngle && (startAngle != 0 || endAngle != 360)) { float sx = -sinf(startAngle * deg2rad); float sy = +cosf(startAngle * deg2rad); @@ -3927,17 +4006,9 @@ void TFT_eSPI::drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, int32_ drawWedgeLine(asx, asy, aex, aey, 0.3, 0.3, fg_color, bg_color); } - if (endAngle > startAngle) - { - // Draw arc in single sweep - drawArc(x, y, r, ir, startAngle, endAngle, fg_color, bg_color); - } - else - { - // Arc sweeps through 6 o'clock so draw in two parts - drawArc(x, y, r, ir, startAngle, 360, fg_color, bg_color); - drawArc(x, y, r, ir, 0, endAngle, fg_color, bg_color); - } + // Draw arc + drawArc(x, y, r, ir, startAngle, endAngle, fg_color, bg_color); + } else // Draw full 360 { @@ -3949,12 +4020,12 @@ void TFT_eSPI::drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, int32_ } /*************************************************************************************** -** Function name: sqrt_fraction +** Function name: sqrt_fraction (private function) ** Description: Smooth graphics support function for alpha derivation ***************************************************************************************/ // Compute the fixed point square root of an integer and // return the 8 MS bits of fractional part. -// Quicker than sqrt() for processors that do not have and FPU (e.g. RP2040) +// Quicker than sqrt() for processors that do not have an FPU (e.g. RP2040) inline uint8_t TFT_eSPI::sqrt_fraction(uint32_t num) { if (num > (0x40000000)) return 0; uint32_t bsh = 0x00004000; @@ -3983,45 +4054,46 @@ inline uint8_t TFT_eSPI::sqrt_fraction(uint32_t num) { ***************************************************************************************/ // Centre at x,y // r = arc outer radius, ir = arc inner radius. Inclusive, so arc thickness = r-ir+1 -// Angles MUST be in range 0-360, end angle MUST be greater than start angle +// Angles MUST be in range 0-360 // Arc foreground fg_color anti-aliased with background colour along sides // smooth is optional, default is true, smooth=false means no antialiasing // Note: Arc ends are not anti-aliased (use drawSmoothArc instead for that) void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, - int32_t startAngle, int32_t endAngle, + uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool smooth) { - if (_vpOoB) return; + if (endAngle > 360) endAngle = 360; + if (startAngle > 360) startAngle = 360; + if (_vpOoB || startAngle == endAngle) return; if (r < ir) transpose(r, ir); // Required that r > ir if (r <= 0 || ir < 0) return; // Invalid r, ir can be zero (circle sector) - if (endAngle < startAngle) transpose(startAngle, endAngle); - if (startAngle < 0) startAngle = 0; - if (endAngle > 360) endAngle = 360; + if (endAngle < startAngle) { + // Arc sweeps through 6 o'clock so draw in two parts + if (startAngle < 360) drawArc(x, y, r, ir, startAngle, 360, fg_color, bg_color, smooth); + if (endAngle == 0) return; + startAngle = 0; + } inTransaction = true; - int32_t xs = 0; // x start position for quadrant scan - uint8_t alpha = 0; // alpha value for blending pixels + int32_t xs = 0; // x start position for quadrant scan + uint8_t alpha = 0; // alpha value for blending pixels - int32_t r2 = r * r; // Outer arc radius^2 - if (smooth) r++; // Outer AA zone radius - int32_t r1 = r * r; // Outer AA radius^2 - int16_t w = r - ir; // Width of arc (r - ir + 1) - int32_t r3 = ir * ir; // Inner arc radius^2 - if (smooth) ir--; // Inner AA zone radius - int32_t r4 = ir * ir; // Inner AA radius^2 - - // Float variants of adjusted inner and outer arc radii - //float irf = ir; - //float rf = r; + uint32_t r2 = r * r; // Outer arc radius^2 + if (smooth) r++; // Outer AA zone radius + uint32_t r1 = r * r; // Outer AA radius^2 + int16_t w = r - ir; // Width of arc (r - ir + 1) + uint32_t r3 = ir * ir; // Inner arc radius^2 + if (smooth) ir--; // Inner AA zone radius + uint32_t r4 = ir * ir; // Inner AA radius^2 // 1 | 2 // ---¦--- Arc quadrant index // 0 | 3 // Fixed point U16.16 slope table for arc start/end in each quadrant - uint32_t startSlope[4] = {0, 0, 0xFFFFFFFF, 0}; - uint32_t endSlope[4] = {0, 0xFFFFFFFF, 0, 0}; + uint32_t startSlope[4] = {0, 0, 0xFFFFFFFF, 0}; + uint32_t endSlope[4] = {0, 0xFFFFFFFF, 0, 0}; // Ensure maximum U16.16 slope of arc ends is ~ 0x8000 0000 constexpr float minDivisor = 1.0f/0x8000; @@ -4034,13 +4106,13 @@ void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t slope = (fabscos/(fabssin + minDivisor)) * (float)(1<<16); // Update slope table, add slope for arc start - if (startAngle < 90) { + if (startAngle <= 90) { startSlope[0] = slope; } - else if (startAngle < 180) { + else if (startAngle <= 180) { startSlope[1] = slope; } - else if (startAngle < 270) { + else if (startAngle <= 270) { startSlope[1] = 0xFFFFFFFF; startSlope[2] = slope; } @@ -4058,16 +4130,16 @@ void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, slope = (uint32_t)((fabscos/(fabssin + minDivisor)) * (float)(1<<16)); // Work out which quadrants will need to be drawn and add slope for arc end - if (endAngle < 90) { + if (endAngle <= 90) { endSlope[0] = slope; endSlope[1] = 0; - endSlope[2] = 0xFFFFFFFF; + startSlope[2] = 0; } - else if (endAngle < 180) { + else if (endAngle <= 180) { endSlope[1] = slope; - endSlope[2] = 0xFFFFFFFF; + startSlope[2] = 0; } - else if (endAngle < 270) { + else if (endAngle <= 270) { endSlope[2] = slope; } else { @@ -4091,7 +4163,6 @@ void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, // If in outer zone calculate alpha if (hyp > r2) { - //alpha = (uint8_t)((rf - sqrtf(hyp)) * 255); alpha = ~sqrt_fraction(hyp); // Outer AA zone } // If within arc fill zone, get line start and lengths for each quadrant @@ -4110,7 +4181,7 @@ void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, xst[2] = cx; // Bottom right line start len[2]++; } - if (slope >= startSlope[3] && slope <= endSlope[3]) { // slope lo -> hi + if (slope <= endSlope[3] && slope >= startSlope[3]) { // slope lo -> hi xst[3] = cx; // Top right line start len[3]++; } @@ -4118,7 +4189,6 @@ void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, } else { if (hyp <= r4) break; // Skip inner pixels - //alpha = (uint8_t)((sqrtf(hyp) - irf) * 255.0); alpha = sqrt_fraction(hyp); // Inner AA zone } @@ -4134,7 +4204,7 @@ void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, drawPixel(x + cx - r, y + cy - r, pcol); if (slope <= startSlope[2] && slope >= endSlope[2]) // TR drawPixel(x - cx + r, y + cy - r, pcol); - if (slope >= startSlope[3] && slope <= endSlope[3]) // BR + if (slope <= endSlope[3] && slope >= startSlope[3]) // BR drawPixel(x - cx + r, y - cy + r, pcol); } // Add line in inner zone @@ -4190,19 +4260,12 @@ void TFT_eSPI::fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, int32_t hyp2 = (r - cx) * (r - cx) + dy2; if (hyp2 <= r1) break; if (hyp2 >= r2) continue; -//* + uint8_t alpha = ~sqrt_fraction(hyp2); if (alpha > 246) break; xs = cx; if (alpha < 9) continue; - //*/ -/* - float alphaf = (float)r - sqrtf(hyp2); - if (alphaf > HiAlphaTheshold) break; - xs = cx; - if (alphaf < LoAlphaTheshold) continue; - uint8_t alpha = alphaf * 255; -//*/ + if (bg_color == 0x00FFFFFF) { drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); drawPixel(x - cx + r, y + cy - r, color, alpha, bg_color); @@ -4242,7 +4305,7 @@ void TFT_eSPI::drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, { if (_vpOoB) return; if (r < ir) transpose(r, ir); // Required that r > ir - if (r <= 0 || ir < 0) return; // Invalid + if (r <= 0 || ir < 0) return; // Invalid w -= 2*r; h -= 2*r; @@ -4254,13 +4317,7 @@ void TFT_eSPI::drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, x += r; y += r; -/* - float alphaGain = 1.0; - if (w != 0 || h != 0) { - if (r - ir < 2) alphaGain = 1.5; // Boost brightness for thin lines - if (r - ir < 1) alphaGain = 1.7; - } -*/ + uint16_t t = r - ir + 1; int32_t xs = 0; int32_t cx = 0; @@ -4273,8 +4330,6 @@ void TFT_eSPI::drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, ir--; int32_t r4 = ir * ir; // Inner AA zone radius^2 - //float irf = ir; - //float rf = r; uint8_t alpha = 0; // Scan top left quadrant x y r ir fg_color bg_color @@ -4295,8 +4350,7 @@ void TFT_eSPI::drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, // If in outer zone calculate alpha if (hyp > r2) { - alpha = ~sqrt_fraction(hyp); - //alpha = (uint8_t)((rf - sqrtf(hyp)) * 255); // Outer AA zone + alpha = ~sqrt_fraction(hyp); // Outer AA zone } // If within arc fill zone, get line lengths for each quadrant else if (hyp >= r3) { @@ -4306,8 +4360,7 @@ void TFT_eSPI::drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, } else { if (hyp <= r4) break; // Skip inner pixels - //alpha = (uint8_t)((sqrtf(hyp) - irf) * 255); // Inner AA zone - alpha = sqrt_fraction(hyp); + alpha = sqrt_fraction(hyp); // Inner AA zone } if (alpha < 16) continue; // Skip low alpha pixels @@ -4378,13 +4431,7 @@ void TFT_eSPI::fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, i if (alpha > 246) break; xs = cx; if (alpha < 9) continue; -/* - float alphaf = (float)r - sqrtf(hyp2); - if (alphaf > HiAlphaTheshold) break; - xs = cx; - if (alphaf < LoAlphaTheshold) continue; - uint8_t alpha = alphaf * 255; -*/ + drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); drawPixel(x - cx + r + w, y + cy - r, color, alpha, bg_color); drawPixel(x - cx + r + w, y - cy + r + h, color, alpha, bg_color); @@ -4462,16 +4509,25 @@ void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, f // Track edge to minimise calculations if (!endX) { endX = true; xs = xp; } if (alpha > HiAlphaTheshold) { - if (swin) { setWindow(xp, yp, width()-1, yp); swin = false; } - pushColor(fg_color); + #ifdef GC9A01_DRIVER + drawPixel(xp, yp, fg_color); + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fg_color); + #endif continue; } //Blend color with background and plot if (bg_color == 0x00FFFFFF) { bg = readPixel(xp, yp); swin = true; } - if (swin) { setWindow(xp, yp, width()-1, yp); swin = false; } - pushColor(alphaBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #ifdef GC9A01_DRIVER + uint16_t pcol = alphaBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg); + drawPixel(xp, yp, pcol); + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(alphaBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #endif } } @@ -4490,16 +4546,25 @@ void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, f // Track line boundary if (!endX) { endX = true; xs = xp; } if (alpha > HiAlphaTheshold) { - if (swin) { setWindow(xp, yp, width()-1, yp); swin = false; } - pushColor(fg_color); + #ifdef GC9A01_DRIVER + drawPixel(xp, yp, fg_color); + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fg_color); + #endif continue; } //Blend colour with background and plot if (bg_color == 0x00FFFFFF) { bg = readPixel(xp, yp); swin = true; } - if (swin) { setWindow(xp, yp, width()-1, yp); swin = false; } - pushColor(alphaBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #ifdef GC9A01_DRIVER + uint16_t pcol = alphaBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg); + drawPixel(xp, yp, pcol); + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(alphaBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #endif } } @@ -4908,10 +4973,13 @@ uint16_t TFT_eSPI::decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining) *************************************************************************************x*/ inline uint16_t TFT_eSPI::alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc) { + // Split out and blend 5 bit red and blue channels uint32_t rxb = bgc & 0xF81F; rxb += ((fgc & 0xF81F) - rxb) * (alpha >> 2) >> 6; + // Split out and blend 6 bit green channel uint32_t xgx = bgc & 0x07E0; xgx += ((fgc & 0x07E0) - xgx) * alpha >> 8; + // Recombine channels return (rxb & 0xF81F) | (xgx & 0x07E0); } @@ -4998,7 +5066,6 @@ size_t TFT_eSPI::write(uint8_t utf8) #endif if (uniCode == '\n') uniCode+=22; // Make it a valid space character to stop errors - else if (uniCode < 32) return 1; uint16_t cwidth = 0; uint16_t cheight = 0; @@ -5017,7 +5084,7 @@ size_t TFT_eSPI::write(uint8_t utf8) #ifdef LOAD_FONT2 if (textfont == 2) { - if (uniCode > 127) return 1; + if (uniCode < 32 || uniCode > 127) return 1; cwidth = pgm_read_byte(widtbl_f16 + uniCode-32); cheight = chr_hgt_f16; @@ -5033,7 +5100,7 @@ size_t TFT_eSPI::write(uint8_t utf8) #ifdef LOAD_RLE { if ((textfont>2) && (textfont<9)) { - if (uniCode > 127) return 1; + if (uniCode < 32 || uniCode > 127) return 1; // Uses the fontinfo struct array to avoid lots of 'if' or 'switch' statements cwidth = pgm_read_byte( (uint8_t *)pgm_read_dword( &(fontdata[textfont].widthtbl ) ) + uniCode-32 ); cheight= pgm_read_byte( &fontdata[textfont].height ); @@ -5927,10 +5994,12 @@ void TFT_eSPI::getSetup(setup_t &tft_settings) #ifdef SPI_READ_FREQUENCY tft_settings.tft_rd_freq = SPI_READ_FREQUENCY/100000; #endif - #ifdef TFT_SPI_PORT - tft_settings.port = TFT_SPI_PORT; - #else - tft_settings.port = 255; + #ifndef GENERIC_PROCESSOR + #ifdef TFT_SPI_PORT + tft_settings.port = TFT_SPI_PORT; + #else + tft_settings.port = 255; + #endif #endif #ifdef RP2040_PIO_SPI tft_settings.interface = 0x10; diff --git a/lib/TFT_eSPI/TFT_eSPI.h b/lib/TFT_eSPI/TFT_eSPI.h index edb319f..21a940b 100644 --- a/lib/TFT_eSPI/TFT_eSPI.h +++ b/lib/TFT_eSPI/TFT_eSPI.h @@ -16,7 +16,7 @@ #ifndef _TFT_eSPIH_ #define _TFT_eSPIH_ -#define TFT_ESPI_VERSION "2.5.0" +#define TFT_ESPI_VERSION "2.5.23" // Bit level feature flags // Bit 0 set: viewport capability @@ -86,7 +86,9 @@ #elif defined(ARDUINO_ARCH_ESP8266) || defined(ESP32) #include #else - #define PROGMEM + #ifndef PROGMEM + #define PROGMEM + #endif #endif // Include the processor specific drivers @@ -104,6 +106,7 @@ #include "Processors/TFT_eSPI_RP2040.h" #else #include "Processors/TFT_eSPI_Generic.h" + #define GENERIC_PROCESSOR #endif /*************************************************************************************** @@ -141,6 +144,17 @@ #define SPI_BUSY_CHECK #endif +// If half duplex SDA mode is defined then MISO pin should be -1 +#ifdef TFT_SDA_READ + #ifdef TFT_MISO + #if TFT_MISO != -1 + #undef TFT_MISO + #define TFT_MISO -1 + #warning TFT_MISO set to -1 + #endif + #endif +#endif + /*************************************************************************************** ** Section 4: Setup fonts ***************************************************************************************/ @@ -353,7 +367,9 @@ uint32_t setup_id; // ID available to use in a user setup int32_t esp; // Processor code uint8_t trans; // SPI transaction support uint8_t serial; // Serial (SPI) or parallel +#ifndef GENERIC_PROCESSOR uint8_t port; // SPI port +#endif uint8_t overlap; // ESP8266 overlap mode uint8_t interface; // Interface type @@ -526,12 +542,12 @@ class TFT_eSPI : public Print { friend class TFT_eSprite; // Sprite class has ac // By default the arc is drawn with square ends unless the "roundEnds" parameter is included and set true // Angle = 0 is at 6 o'clock position, 90 at 9 o'clock etc. The angles must be in range 0-360 or they will be clipped to these limits // The start angle may be larger than the end angle. Arcs are always drawn clockwise from the start angle. - void drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t startAngle, int32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool roundEnds = false); + void drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool roundEnds = false); - // As per "drawSmoothArc" except endAngle should be greater than startAngle (angles will be swapped otherwise) + // As per "drawSmoothArc" except the ends of the arc are NOT anti-aliased, this facilitates dynamic arc length changes with + // arc segments and ensures clean segment joints. // The sides of the arc are anti-aliased by default. If smoothArc is false sides will NOT be anti-aliased - // The ends of the arc are NOT anti-aliased, this facilitates dynamic arc length changes with arc segments and ensures clean segment joints - void drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t startAngle, int32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool smoothArc = true); + void drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool smoothArc = true); // Draw an anti-aliased filled circle at x, y with radius r // Note: The thickness of line is 3 pixels to reduce the visible "braiding" effect of anti-aliasing narrow lines @@ -683,11 +699,12 @@ class TFT_eSPI : public Print { friend class TFT_eSprite; // Sprite class has ac // Low level read/write void spiwrite(uint8_t); // legacy support only -#ifndef RM68120_DRIVER - void writecommand(uint8_t c); // Send a command, function resets DC/RS high ready for data +#ifdef RM68120_DRIVER + void writecommand(uint16_t c); // Send a 16 bit command, function resets DC/RS high ready for data + void writeRegister8(uint16_t c, uint8_t d); // Write 8 bit data data to 16 bit command register + void writeRegister16(uint16_t c, uint16_t d); // Write 16 bit data data to 16 bit command register #else - void writecommand(uint16_t c); // Send a command, function resets DC/RS high ready for data - void writeRegister(uint16_t c, uint8_t d); // Write data to 16 bit command register + void writecommand(uint8_t c); // Send an 8 bit command, function resets DC/RS high ready for data #endif void writedata(uint8_t d); // Send data with DC/RS set high diff --git a/lib/TFT_eSPI/User_Setup_Select.h b/lib/TFT_eSPI/User_Setup_Select.h index d34885f..bcea618 100644 --- a/lib/TFT_eSPI/User_Setup_Select.h +++ b/lib/TFT_eSPI/User_Setup_Select.h @@ -116,6 +116,8 @@ //#include // Setup file for ESP32 and Lilygo TTV ST7789 SPI bus TFT 135x240 //#include // Setup file for Lilygo T-Display RP2040 (ST7789 on SPI bus with 135x240 TFT) +//#include // Setup file for Pico Explorer Base by Pimoroni for RP2040 (ST7789 on SPI bus with 240x240 TFT) + //#include // Setup file for ESP32 and GC9A01 240 x 240 TFT //#include // Setup file for ESP32 based WT32_SC01 from Seeed @@ -126,27 +128,29 @@ //#include // Setup file for the ESP32 TouchDown based on ILI9488 480 x 320 TFT -//#include // Setup file for the ESP32 TouchDown S3 based on ILI9488 480 x 320 TFT +//#include // Setup file for the ESP32 TouchDown S3 based on ILI9488 480 x 320 TFT #ifdef NERDMINERV2 #include #endif - #ifdef NERMINER_S3_AMOLED #include //Just a stub. No driver implementation for S3 AMOLED in TFT_eSPI #endif +//#include // For the LilyGo T-HMI S3 based ESP32S3 with ST7789 240 x 320 TFT +//#include // For the ESP32 S3 Box Lite (may also work with ESP32 S3 Box) + +//#include // For the LilyGo T-Dongle S3 based ESP32 with ST7735 80 x 160 TFT +// #include // For the LilyGo T-Embed S3 based ESP32S3 with ST7789 170 x 320 TFT +#ifdef NERMINER_T_QT +#include // For the LilyGo T-QT Pro S3 based ESP32S3 with GC9A01 128 x 128 TFT +#endif #ifdef NERMINER_S3_DONGLE #include #endif - -#ifdef NERMINER_T_QT -#include -#endif //#include // Setup file for Bw16-based boards with ST7735 160 x 80 TFT //#include // Template file for a setup - //#include // Setup file for Dustin Watts PCB with ILI9488 //#include // Setup file for Dustin Watts PCB with ST7796 //#include // Setup file for Dustin Watts Pico PCB with ST7796 diff --git a/lib/TFT_eSPI/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h b/lib/TFT_eSPI/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h index fce7120..0a1d75c 100644 --- a/lib/TFT_eSPI/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h +++ b/lib/TFT_eSPI/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h @@ -8,6 +8,19 @@ //#define TFT_PARALLEL_8_BIT #define TFT_PARALLEL_16_BIT +// The parallel interface write cycle period is derived from a division of the CPU clock +// speed so scales with the processor clock. This means that the divider ratio may need +// to be increased when overclocking. I may also need to be adjusted dependant on the +// display controller type (ILI94341, HX8357C etc). If RP2040_PIO_CLK_DIV is not defined +// the library will set default values which may not suit your display. +// The display controller data sheet will specify the minimum write cycle period. The +// controllers often work reliably for shorter periods, however if the period is too short +// the display may not initialise or graphics will become corrupted. +// PIO write cycle frequency = (CPU clock/(4 * RP2040_PIO_CLK_DIV)) +//#define RP2040_PIO_CLK_DIV 1 // 32ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 2 // 64ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 3 // 96ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 4 // 96ns write cycle at 125MHz CPU clock //////////////////////////////////////////////////////////////////////////////////////////// // Display driver type diff --git a/lib/TFT_eSPI/User_Setups/Setup138_Pico_Explorer_Base_RP2040_ST7789.h b/lib/TFT_eSPI/User_Setups/Setup138_Pico_Explorer_Base_RP2040_ST7789.h new file mode 100644 index 0000000..ca3bcfd --- /dev/null +++ b/lib/TFT_eSPI/User_Setups/Setup138_Pico_Explorer_Base_RP2040_ST7789.h @@ -0,0 +1,32 @@ +// Pico Explorer Base by Pimoroni (RP2040) (ST7789 on SPI bus with 240x240 TFT) +#define USER_SETUP_ID 138 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + +#define CGRAM_OFFSET // Library will add offsets required + +// For Pico Explorer Base (PR2040) +#define TFT_CS 17 // Chip Select pin +#define TFT_DC 16 // Data Command control pin +#define TFT_RST -1 // No Reset pin +#define TFT_MOSI 19 +#define TFT_SCLK 18 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +// #define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 +#define SPI_READ_FREQUENCY 20000000 +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/lib/TFT_eSPI/User_Setups/Setup13_ILI9481_Parallel.h b/lib/TFT_eSPI/User_Setups/Setup13_ILI9481_Parallel.h index cf3e412..f8881ea 100644 --- a/lib/TFT_eSPI/User_Setups/Setup13_ILI9481_Parallel.h +++ b/lib/TFT_eSPI/User_Setups/Setup13_ILI9481_Parallel.h @@ -1,7 +1,7 @@ // See SetupX_Template.h for all options available #define USER_SETUP_ID 13 -#define ESP32_PARALLEL +#define TFT_PARALLEL_8_BIT #define ILI9481_DRIVER diff --git a/lib/TFT_eSPI/User_Setups/Setup17_ePaper.h b/lib/TFT_eSPI/User_Setups/Setup17_ePaper.h index c86b08a..5671a15 100644 --- a/lib/TFT_eSPI/User_Setups/Setup17_ePaper.h +++ b/lib/TFT_eSPI/User_Setups/Setup17_ePaper.h @@ -1,34 +1,9 @@ -// See SetupX_Template.h for all options available -#define USER_SETUP_ID 17 - #define EPD_DRIVER // ePaper driver - -// READ THIS READ THIS READ THIS READ THIS READ THIS READ THIS -// Install the ePaper library for your own display size and type -// from here: -// https://github.com/Bodmer/EPD_Libraries - -// Note: Pin allocations for the ePaper signals are defined in -// the ePaper library's epdif.h file. There follows the default -// pins already included in epdif.h file for the ESP8266: - -/////////////////////////////////////////////////////////////////// -// For ESP8266 connect as follows: // -// Display 3.3V to NodeMCU 3V3 // -// Display GND to NodeMCU GND // -// // -// Display GPIO NodeMCU pin // -// BUSY 5 D1 // -// RESET 4 D2 // -// DC 0 D3 // -// CS 2 D4 // -// CLK 14 D5 // -// D6 (MISO not connected to display) // -// DIN 13 D7 // -// // -/////////////////////////////////////////////////////////////////// - +#define TFT_MISO -1 +#define TFT_MOSI -1 +#define TFT_SCLK -1 +#define TFT_RST -1 #define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH #define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters diff --git a/lib/TFT_eSPI/User_Setups/Setup202_SSD1351_128.h b/lib/TFT_eSPI/User_Setups/Setup202_SSD1351_128.h index 793de6c..8cbc4bf 100644 --- a/lib/TFT_eSPI/User_Setups/Setup202_SSD1351_128.h +++ b/lib/TFT_eSPI/User_Setups/Setup202_SSD1351_128.h @@ -28,7 +28,7 @@ #define TFT_DC 2 #define TFT_RST 4 #define TFT_CS 15 -#elif defined(ESP8266) +#elif defined (ARDUINO_ARCH_ESP8266) //#define TFT_MOSI PIN_D5 // Can't change //#define TFT_SCLK PIN_D7 // Can't change #define TFT_DC PIN_D3 diff --git a/lib/TFT_eSPI/User_Setups/Setup206_LilyGo_T_Display_S3.h b/lib/TFT_eSPI/User_Setups/Setup206_LilyGo_T_Display_S3.h index 88fec71..42678ac 100644 --- a/lib/TFT_eSPI/User_Setups/Setup206_LilyGo_T_Display_S3.h +++ b/lib/TFT_eSPI/User_Setups/Setup206_LilyGo_T_Display_S3.h @@ -3,11 +3,11 @@ #define USER_SETUP_ID 206 #define ST7789_DRIVER -// #define INIT_SEQUENCE_3 // Using this initialisation sequence improves the display image +#define INIT_SEQUENCE_3 // Using this initialisation sequence improves the display image #define CGRAM_OFFSET -// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue -#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red +#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red #define TFT_INVERSION_ON // #define TFT_INVERSION_OFF diff --git a/lib/TFT_eSPI/User_Setups/Setup207_LilyGo_T_HMI.h b/lib/TFT_eSPI/User_Setups/Setup207_LilyGo_T_HMI.h new file mode 100644 index 0000000..8606ef3 --- /dev/null +++ b/lib/TFT_eSPI/User_Setups/Setup207_LilyGo_T_HMI.h @@ -0,0 +1,48 @@ +// ST7789 240 x 240 display with no chip select line +#define USER_SETUP_ID 207 + +#define ST7789_DRIVER // Configure all registers + +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 320 + +#define CGRAM_OFFSET +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// #define TFT_INVERSION_ON +#define TFT_INVERSION_OFF + +#define TFT_PARALLEL_8_BIT + +// The ESP32 and TFT the pins used for testing are: +#define TFT_CS 6 // Chip select control pin (library pulls permanently low +#define TFT_DC 7 // Data Command control pin +#define TFT_RST -1 // Reset pin, toggles on startup + +#define TFT_WR 8 // Write strobe control pin +#define TFT_RD -1 // Read strobe control pin + +#define TFT_D0 48 // Must use pins in the range 0-31 or alternatively 32-48 +#define TFT_D1 47 // so a single register write sets/clears all bits. +#define TFT_D2 39 // Pins can be randomly assigned, this does not affect +#define TFT_D3 40 // TFT screen update performance. +#define TFT_D4 41 +#define TFT_D5 42 +#define TFT_D6 45 +#define TFT_D7 46 + +#define TFT_BL 38 // LED back-light + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/lib/TFT_eSPI/User_Setups/Setup208_ESP32_S3_Box_Lite.h b/lib/TFT_eSPI/User_Setups/Setup208_ESP32_S3_Box_Lite.h new file mode 100644 index 0000000..a25e4ea --- /dev/null +++ b/lib/TFT_eSPI/User_Setups/Setup208_ESP32_S3_Box_Lite.h @@ -0,0 +1,32 @@ +// Display configuration for ST7789-based ESP32-S3-Box-Lite + +#define USER_SETUP_ID 208 +#define USER_SETUP_INFO "ESP32-S3-BOX-LITE" + +#define ST7789_DRIVER +#define TFT_RGB_ORDER TFT_BGR + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 320 + +#define TFT_BL 45 +#define TFT_BACKLIGHT_ON LOW + +#define TFT_CS 5 +#define TFT_DC 4 +#define TFT_RST 48 + +#define TFT_MOSI 6 +#define TFT_SCLK 7 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 diff --git a/lib/TFT_eSPI/User_Setups/Setup209_LilyGo_T_Dongle_S3.h b/lib/TFT_eSPI/User_Setups/Setup209_LilyGo_T_Dongle_S3.h new file mode 100644 index 0000000..1a28a82 --- /dev/null +++ b/lib/TFT_eSPI/User_Setups/Setup209_LilyGo_T_Dongle_S3.h @@ -0,0 +1,52 @@ +// Config for LilyGo T-Dongle S3 w ESP32 and ST7735 80 x 160 display +#define USER_SETUP_ID 209 + +#define ST7735_DRIVER // Configure all registers + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 +// #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +#define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_REDTAB +//#define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +//#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF + +// Generic ESP32 setup +#define TFT_MISO -1 +#define TFT_MOSI 3 +#define TFT_SCLK 5 +#define TFT_CS 4 +#define TFT_DC 2 +#define TFT_RST 1 // Connect reset to ensure display initialises + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 27000000 +//#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/lib/TFT_eSPI/User_Setups/Setup210_LilyGo_T_Embed_S3.h b/lib/TFT_eSPI/User_Setups/Setup210_LilyGo_T_Embed_S3.h new file mode 100644 index 0000000..d3b815a --- /dev/null +++ b/lib/TFT_eSPI/User_Setups/Setup210_LilyGo_T_Embed_S3.h @@ -0,0 +1,43 @@ +// ST7789 170 x 320 display with no chip select line +#define USER_SETUP_ID 210 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 170 +#define TFT_HEIGHT 320 + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF +#define TFT_BACKLIGHT_ON 1 + +#define TFT_BL 15 // LED back-light +#define TFT_MISO -1 // Not connected +#define TFT_MOSI 11 +#define TFT_SCLK 12 +#define TFT_CS 10 +#define TFT_DC 13 +#define TFT_RST 9 // Connect reset to ensure display initialises + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/lib/TFT_eSPI/User_Setups/Setup300_TTGO_T_Dongle.h b/lib/TFT_eSPI/User_Setups/Setup300_TTGO_T_Dongle.h deleted file mode 100644 index 73456dd..0000000 --- a/lib/TFT_eSPI/User_Setups/Setup300_TTGO_T_Dongle.h +++ /dev/null @@ -1,37 +0,0 @@ -#define USER_SETUP_ID 300 - -#define ST7735_DRIVER - -#define TFT_WIDTH 80 -#define TFT_HEIGHT 160 - -#define TFT_RST 1 -#define TFT_MISO -1 -#define TFT_MOSI 3 -#define TFT_SCLK 5 -#define TFT_CS 4 -#define TFT_DC 2 -// #define TFT_BL 38 -// #define TFT_BACKLIGHT_ON LOW - -#define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) - -#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH -#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters -#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters -#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm -#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. -#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. -// #define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT -#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts - -// Comment out the #define below to stop the SPIFFS filing system and smooth font code being loaded -// this will save ~20kbytes of FLASH -#define SMOOTH_FONT - -#define SPI_FREQUENCY 50000000 // Actually sets it to 26.67MHz = 80/3 - -// #define SPI_FREQUENCY 40000000 // Maximum to use SPIFFS -// #define SPI_FREQUENCY 80000000 - -#define TFT_RGB_ORDER TFT_BGR \ No newline at end of file diff --git a/lib/TFT_eSPI/User_Setups/Setup70f_ESP32_S2_ST7735.h b/lib/TFT_eSPI/User_Setups/Setup70f_ESP32_S2_ST7735.h new file mode 100644 index 0000000..f0cc51d --- /dev/null +++ b/lib/TFT_eSPI/User_Setups/Setup70f_ESP32_S2_ST7735.h @@ -0,0 +1,44 @@ +// Setup for the ESP32 S2 with ST7735 80x160 display +// See SetupX_Template.h for all options available + +#define USER_SETUP_ID 70 + +#define ST7735_DRIVER + +#define TFT_SDA_READ // Display has a bidirectional SDA pin (no MISO) + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + +#define ST7735_GREENTAB160x80 +//#define ST7735_REDTAB160x80 + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + + // Typical board default pins +#define TFT_CS 10 // 10 or 34 + +#define TFT_MOSI 11 // 11 or 35 +#define TFT_SCLK 12 // 12 or 36 + +#define TFT_DC 14 +#define TFT_RST 15 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +// FSPI port must be used for SDA reads. Do not use #define USE_HSPI_PORT + +#define SPI_FREQUENCY 27000000 +#define SPI_READ_FREQUENCY 16000000 diff --git a/lib/TFT_eSPI/build/.cmake/api/v1/query/client-vscode/query.json b/lib/TFT_eSPI/build/.cmake/api/v1/query/client-vscode/query.json deleted file mode 100644 index 82bb964..0000000 --- a/lib/TFT_eSPI/build/.cmake/api/v1/query/client-vscode/query.json +++ /dev/null @@ -1 +0,0 @@ -{"requests":[{"kind":"cache","version":2},{"kind":"codemodel","version":2},{"kind":"toolchains","version":1},{"kind":"cmakeFiles","version":1}]} \ No newline at end of file diff --git a/lib/TFT_eSPI/build/CMakeCache.txt b/lib/TFT_eSPI/build/CMakeCache.txt deleted file mode 100644 index 67084bd..0000000 --- a/lib/TFT_eSPI/build/CMakeCache.txt +++ /dev/null @@ -1,96 +0,0 @@ -# This is the CMakeCache file. -# For build in directory: d:/Users/19021/Documents/Arduino/libraries/TFT_eSPI/build -# It was generated by CMake: C:/Program Files/CMake/bin/cmake.exe -# You can edit this file to change values found and used by cmake. -# If you do not want to change any of the values, simply exit the editor. -# If you do want to change a value, simply edit, save, and exit the editor. -# The syntax for the file is as follows: -# KEY:TYPE=VALUE -# KEY is the name of a variable in the cache. -# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. -# VALUE is the current value for the KEY. - -######################## -# EXTERNAL cache entries -######################## - -//For backwards compatibility, what version of CMake commands and -// syntax should this version of CMake try to support. -CMAKE_BACKWARDS_COMPATIBILITY:STRING=2.4 - -//No help, variable specified on the command line. -CMAKE_BUILD_TYPE:STRING=Debug - -//No help, variable specified on the command line. -CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=TRUE - -//Program used to build from makefiles. -CMAKE_MAKE_PROGRAM:STRING=nmake - -//Value Computed by CMake -CMAKE_PROJECT_DESCRIPTION:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_HOMEPAGE_URL:STATIC= - -//Value Computed by CMake -CMAKE_PROJECT_NAME:STATIC=Project - -//Single output directory for building all executables. -EXECUTABLE_OUTPUT_PATH:PATH= - -//Single output directory for building all libraries. -LIBRARY_OUTPUT_PATH:PATH= - -//Value Computed by CMake -Project_BINARY_DIR:STATIC=D:/Users/19021/Documents/Arduino/libraries/TFT_eSPI/build - -//Value Computed by CMake -Project_IS_TOP_LEVEL:STATIC=ON - -//Value Computed by CMake -Project_SOURCE_DIR:STATIC=D:/Users/19021/Documents/Arduino/libraries/TFT_eSPI - - -######################## -# INTERNAL cache entries -######################## - -//This is the directory where this CMakeCache.txt was created -CMAKE_CACHEFILE_DIR:INTERNAL=d:/Users/19021/Documents/Arduino/libraries/TFT_eSPI/build -//Major version of cmake used to create the current loaded cache -CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 -//Minor version of cmake used to create the current loaded cache -CMAKE_CACHE_MINOR_VERSION:INTERNAL=23 -//Patch version of cmake used to create the current loaded cache -CMAKE_CACHE_PATCH_VERSION:INTERNAL=2 -//Path to CMake executable. -CMAKE_COMMAND:INTERNAL=C:/Program Files/CMake/bin/cmake.exe -//Path to cpack program executable. -CMAKE_CPACK_COMMAND:INTERNAL=C:/Program Files/CMake/bin/cpack.exe -//Path to ctest program executable. -CMAKE_CTEST_COMMAND:INTERNAL=C:/Program Files/CMake/bin/ctest.exe -//Path to cache edit program executable. -CMAKE_EDIT_COMMAND:INTERNAL=C:/Program Files/CMake/bin/cmake-gui.exe -//Name of external makefile project generator. -CMAKE_EXTRA_GENERATOR:INTERNAL= -//Name of generator. -CMAKE_GENERATOR:INTERNAL=NMake Makefiles -//Generator instance identifier. -CMAKE_GENERATOR_INSTANCE:INTERNAL= -//Name of generator platform. -CMAKE_GENERATOR_PLATFORM:INTERNAL= -//Name of generator toolset. -CMAKE_GENERATOR_TOOLSET:INTERNAL= -//Source directory with the top level CMakeLists.txt file for this -// project -CMAKE_HOME_DIRECTORY:INTERNAL=D:/Users/19021/Documents/Arduino/libraries/TFT_eSPI -//ADVANCED property for variable: CMAKE_MAKE_PROGRAM -CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 -//number of local generators -CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1 -//Platform information initialized -CMAKE_PLATFORM_INFO_INITIALIZED:INTERNAL=1 -//Path to CMake installation. -CMAKE_ROOT:INTERNAL=C:/Program Files/CMake/share/cmake-3.23 - diff --git a/lib/TFT_eSPI/build/CMakeFiles/3.23.2/CMakeSystem.cmake b/lib/TFT_eSPI/build/CMakeFiles/3.23.2/CMakeSystem.cmake deleted file mode 100644 index 013b053..0000000 --- a/lib/TFT_eSPI/build/CMakeFiles/3.23.2/CMakeSystem.cmake +++ /dev/null @@ -1,15 +0,0 @@ -set(CMAKE_HOST_SYSTEM "Windows-10.0.19042") -set(CMAKE_HOST_SYSTEM_NAME "Windows") -set(CMAKE_HOST_SYSTEM_VERSION "10.0.19042") -set(CMAKE_HOST_SYSTEM_PROCESSOR "AMD64") - - - -set(CMAKE_SYSTEM "Windows-10.0.19042") -set(CMAKE_SYSTEM_NAME "Windows") -set(CMAKE_SYSTEM_VERSION "10.0.19042") -set(CMAKE_SYSTEM_PROCESSOR "AMD64") - -set(CMAKE_CROSSCOMPILING "FALSE") - -set(CMAKE_SYSTEM_LOADED 1) diff --git a/lib/TFT_eSPI/build/CMakeFiles/CMakeOutput.log b/lib/TFT_eSPI/build/CMakeFiles/CMakeOutput.log deleted file mode 100644 index ad29f51..0000000 --- a/lib/TFT_eSPI/build/CMakeFiles/CMakeOutput.log +++ /dev/null @@ -1 +0,0 @@ -The system is: Windows - 10.0.19042 - AMD64 diff --git a/lib/TFT_eSPI/build/CMakeFiles/cmake.check_cache b/lib/TFT_eSPI/build/CMakeFiles/cmake.check_cache deleted file mode 100644 index 3dccd73..0000000 --- a/lib/TFT_eSPI/build/CMakeFiles/cmake.check_cache +++ /dev/null @@ -1 +0,0 @@ -# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/lib/TFT_eSPI/docs/PlatformIO/rp2040.txt b/lib/TFT_eSPI/docs/PlatformIO/rp2040.txt new file mode 100644 index 0000000..fc6ef3e --- /dev/null +++ b/lib/TFT_eSPI/docs/PlatformIO/rp2040.txt @@ -0,0 +1,63 @@ +;PlatformIO User notes: + +;It is possible to load settings from the calling program rather than modifying +;the library for each project by modifying the "platformio.ini" file. + +;The User_Setup_Select.h file will not load the user setting header files if +;USER_SETUP_LOADED is defined. + +;Instead of using #define, use the -D prefix, for example: + +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter, extra scripting +; Upload options: custom port, speed and extra flags +; Library options: dependencies, extra library storages +; +; Please visit documentation for the other options and examples +; http://docs.platformio.org/page/projectconf.html + +[env:pico] +platform = https://github.com/maxgerhardt/platform-raspberrypi.git +board = pico +framework = arduino +board_build.core = earlephilhower +board_build.filesystem_size = 0.5m +lib_deps = bodmer/TFT_eSPI@^2.5.21 +; change microcontroller +board_build.mcu = rp2040 + +; change MCU frequency +board_build.f_cpu = 133000000L + +build_flags = + -Os + -DUSER_SETUP_LOADED=1 + ; Define the TFT driver, pins etc here: + -DTFT_PARALLEL_8_BIT=1 + -DRM68120_DRIVER=1 + -DRP2040_PIO_CLK_DIV=1 + -DTFT_DC=28 + -DTFT_WR=22 + -DTFT_RST=2 + + -DTFT_D0=6 + -DTFT_D1=7 + -DTFT_D2=8 + -DTFT_D3=9 + -DTFT_D4=10 + -DTFT_D5=11 + -DTFT_D6=12 + -DTFT_D7=13 + + -DTFT_BL=16 + -DTFT_BACKLIGHT_ON=HIGH + + -DLOAD_GLCD=1 + -DLOAD_FONT2=1 + -DLOAD_FONT4=1 + -DLOAD_FONT6=1 + -DLOAD_FONT7=1 + -DLOAD_FONT8=1 + -DLOAD_GFXFF=1 + -DSMOOTH_FONT=1 diff --git a/lib/TFT_eSPI/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino b/lib/TFT_eSPI/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino index 923cb39..bbd1834 100644 --- a/lib/TFT_eSPI/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino +++ b/lib/TFT_eSPI/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino @@ -15,7 +15,7 @@ #define TFT_GREY 0x2104 // Dark grey 16 bit colour -#include "alert.h" // Out of range alert icon +#include "Alert.h" // Out of range alert icon #include // Hardware-specific library #include diff --git a/lib/TFT_eSPI/examples/PNG Images/Flash_PNG/Flash_PNG.ino b/lib/TFT_eSPI/examples/PNG Images/Flash_PNG/Flash_PNG.ino index 6fcbadb..ca05753 100644 --- a/lib/TFT_eSPI/examples/PNG Images/Flash_PNG/Flash_PNG.ino +++ b/lib/TFT_eSPI/examples/PNG Images/Flash_PNG/Flash_PNG.ino @@ -18,7 +18,7 @@ PNG png; // PNG decoder inatance -#define MAX_IMAGE_WDITH 240 // Adjust for your images +#define MAX_IMAGE_WIDTH 240 // Adjust for your images int16_t xpos = 0; int16_t ypos = 0; @@ -50,7 +50,7 @@ void loop() { int16_t rc = png.openFLASH((uint8_t *)panda, sizeof(panda), pngDraw); if (rc == PNG_SUCCESS) { - Serial.println("Successfully png file"); + Serial.println("Successfully opened png file"); Serial.printf("image specs: (%d x %d), %d bpp, pixel type: %d\n", png.getWidth(), png.getHeight(), png.getBpp(), png.getPixelType()); tft.startWrite(); uint32_t dt = millis(); @@ -72,7 +72,7 @@ void loop() // you will need to adapt this function to suit. // Callback function to draw pixels to the display void pngDraw(PNGDRAW *pDraw) { - uint16_t lineBuffer[MAX_IMAGE_WDITH]; + uint16_t lineBuffer[MAX_IMAGE_WIDTH]; png.getLineAsRGB565(pDraw, lineBuffer, PNG_RGB565_BIG_ENDIAN, 0xffffffff); tft.pushImage(xpos, ypos + pDraw->y, pDraw->iWidth, 1, lineBuffer); } diff --git a/lib/TFT_eSPI/examples/PNG Images/Flash_transparent_PNG/Flash_transparent_PNG.ino b/lib/TFT_eSPI/examples/PNG Images/Flash_transparent_PNG/Flash_transparent_PNG.ino new file mode 100644 index 0000000..39e09a6 --- /dev/null +++ b/lib/TFT_eSPI/examples/PNG Images/Flash_transparent_PNG/Flash_transparent_PNG.ino @@ -0,0 +1,86 @@ + +// This example renders a png file that is stored in a FLASH array +// using the PNGdec library (available via library manager). + +// The example png is encoded as ARGB 8 bits per pixel with indexed colour +// It was created using GIMP and has a transparent background area. + +// Image files can be converted to arrays using the tool here: +// https://notisrac.github.io/FileToCArray/ +// To use this tool: +// 1. Drag and drop PNG image file on "Browse..." button +// 2. Tick box "Treat as binary" +// 3. Click "Convert" +// 4. Click "Save as file" and move the header file to sketch folder +// (alternatively use the "Copy to clipboard" and paste into a new tab) +// 5. Open the sketch in IDE +// 6. Include the header file containing the array (SpongeBob.h in this example) + +// Include the PNG decoder library, available via the IDE library manager +#include + +// Include image array +#include "SpongeBob.h" + +PNG png; // PNG decoder instance + +#define MAX_IMAGE_WIDTH 240 // Sets rendering line buffer lengths, adjust for your images + +// Include the TFT library - see https://github.com/Bodmer/TFT_eSPI for library information +#include "SPI.h" +#include // Hardware-specific library +TFT_eSPI tft = TFT_eSPI(); // Invoke custom library + +// Position variables must be global (PNGdec does not handle position coordinates) +int16_t xpos = 0; +int16_t ypos = 0; + +//==================================================================================== +// Setup +//==================================================================================== +void setup() +{ + Serial.begin(115200); + Serial.println("\n\n Using the PNGdec library"); + + // Initialise the TFT + tft.begin(); + tft.fillScreen(TFT_BLACK); + + Serial.println("\r\nInitialisation done."); +} + +//==================================================================================== +// Loop +//==================================================================================== +void loop() +{ + uint16_t pngw = 0, pngh = 0; // To store width and height of image + + int16_t rc = png.openFLASH((uint8_t *)bob, sizeof(bob), pngDraw); + + if (rc == PNG_SUCCESS) { + Serial.println("Successfully opened png file"); + pngw = png.getWidth(); + pngh = png.getHeight(); + Serial.printf("Image metrics: (%d x %d), %d bpp, pixel type: %d\n", pngw, pngh, png.getBpp(), png.getPixelType()); + + tft.startWrite(); + uint32_t dt = millis(); + rc = png.decode(NULL, 0); + tft.endWrite(); + Serial.print(millis() - dt); Serial.println("ms"); + tft.endWrite(); + + // png.close(); // Required for files, not needed for FLASH arrays + } + + delay(250); + + // Randomly change position + xpos = random(tft.width() - pngw); + ypos = random(tft.height() - pngh); + + // Fill screen with a random colour at random intervals + if (random(100) < 20) tft.fillScreen(random(0x10000)); +} diff --git a/lib/TFT_eSPI/examples/PNG Images/Flash_transparent_PNG/SpongeBob.h b/lib/TFT_eSPI/examples/PNG Images/Flash_transparent_PNG/SpongeBob.h new file mode 100644 index 0000000..7aa29e9 --- /dev/null +++ b/lib/TFT_eSPI/examples/PNG Images/Flash_transparent_PNG/SpongeBob.h @@ -0,0 +1,1355 @@ +// array size is 21621 +static const unsigned char bob[] PROGMEM = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x76, 0x08, 0x06, 0x00, 0x00, 0x00, 0x03, 0x6e, 0x57, + 0xa2, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0xbd, 0x77, 0x98, 0x64, + 0x65, 0x99, 0xf7, 0xff, 0x79, 0xce, 0x39, 0x75, 0x2a, 0xc7, 0xee, 0xea, 0x9c, 0xe3, 0xf4, 0xe4, + 0xc0, 0x24, 0x60, 0x80, 0x95, 0x8c, 0x60, 0x00, 0x03, 0x20, 0x71, 0xdd, 0x55, 0x56, 0x57, 0xd6, + 0xb0, 0xbe, 0xee, 0xeb, 0xba, 0x2a, 0x86, 0x75, 0x55, 0x44, 0x74, 0x5d, 0xc5, 0x35, 0x80, 0xa0, + 0xa2, 0x20, 0x92, 0x83, 0x3a, 0x30, 0xc0, 0x00, 0x33, 0x30, 0x39, 0x31, 0xd3, 0x93, 0x3a, 0xe7, + 0xea, 0x50, 0x5d, 0xb9, 0xea, 0x9c, 0xf3, 0xfc, 0xfe, 0xa8, 0xea, 0xea, 0xee, 0x09, 0xb8, 0xeb, + 0xbe, 0x2b, 0xfa, 0xbb, 0x3c, 0x73, 0xd5, 0xd5, 0x5d, 0x53, 0xd5, 0xa7, 0xce, 0x73, 0xee, 0xe7, + 0x4e, 0xdf, 0xfb, 0x7b, 0xdf, 0x05, 0x7f, 0x39, 0xfe, 0x72, 0xfc, 0xe5, 0xf8, 0xcb, 0xf1, 0x97, + 0xe3, 0x2f, 0xc7, 0x5f, 0x8e, 0xbf, 0x1c, 0x7f, 0x39, 0xfe, 0x72, 0xfc, 0xe5, 0xf8, 0xef, 0x1d, + 0xe2, 0x7f, 0xf4, 0xd7, 0x12, 0xd1, 0x76, 0xa8, 0x62, 0xc9, 0x59, 0xbb, 0xd5, 0x4a, 0xaf, 0x36, + 0xc5, 0xa0, 0x51, 0x25, 0x9f, 0xba, 0x60, 0x60, 0x38, 0xa9, 0x67, 0x86, 0xf0, 0x9b, 0x63, 0x00, + 0x8c, 0x7b, 0xaa, 0xce, 0x7d, 0xb9, 0xa5, 0xb5, 0x75, 0x7a, 0xdc, 0x95, 0xb4, 0x05, 0xde, 0x6d, + 0x1f, 0x31, 0xc2, 0x8a, 0x0d, 0xb2, 0x6d, 0xe3, 0xdb, 0xa6, 0x33, 0xb6, 0xa7, 0x1f, 0xbd, 0x64, + 0xf4, 0xd8, 0xda, 0x07, 0xcf, 0x2a, 0x6d, 0x9a, 0x98, 0x6a, 0x54, 0x3a, 0xfa, 0x56, 0xb9, 0x8f, + 0x95, 0xac, 0x77, 0xeb, 0xe3, 0xa8, 0xfa, 0x38, 0x42, 0x80, 0x02, 0x18, 0xd9, 0x0a, 0xc6, 0x6d, + 0xbe, 0x83, 0x87, 0xeb, 0xf9, 0xdd, 0xd6, 0xf6, 0xfe, 0x8c, 0xe5, 0xcd, 0xbd, 0x06, 0x0e, 0x61, + 0x8f, 0x99, 0x67, 0x65, 0xdc, 0xc6, 0xbe, 0xd5, 0xcf, 0x2c, 0x08, 0x37, 0xf7, 0xcb, 0xea, 0xd2, + 0xd2, 0x1e, 0x24, 0xd3, 0xe4, 0x72, 0xa0, 0x08, 0xb0, 0xcc, 0x1a, 0xf6, 0xb6, 0x3a, 0x8c, 0xad, + 0x0b, 0xfb, 0xfa, 0xf0, 0x65, 0x0e, 0x17, 0xaf, 0x7b, 0xca, 0xdb, 0x2c, 0xac, 0x6c, 0x75, 0x70, + 0xd2, 0x3b, 0x74, 0xd9, 0x6b, 0x81, 0x16, 0x33, 0x64, 0xbd, 0xc3, 0x79, 0x44, 0xaf, 0x92, 0xd2, + 0x20, 0x59, 0xe2, 0xca, 0x7a, 0x45, 0xe4, 0xee, 0xe3, 0x41, 0x77, 0xf7, 0x73, 0x1b, 0x7a, 0x62, + 0x8e, 0x8c, 0xad, 0x2d, 0xed, 0x15, 0x2f, 0x61, 0x8b, 0xa7, 0x00, 0x88, 0x7b, 0x1b, 0xb4, 0xac, + 0xd9, 0x60, 0x04, 0x33, 0x7b, 0xc0, 0x4c, 0x22, 0xc8, 0x20, 0x85, 0x0b, 0xa4, 0x1d, 0xc1, 0xe4, + 0xff, 0xaf, 0x04, 0x7c, 0xd5, 0xd3, 0x95, 0x6f, 0x5d, 0xd0, 0xaf, 0x3d, 0x10, 0x8a, 0x8e, 0xb9, + 0x74, 0x1b, 0xa0, 0x7a, 0x98, 0x56, 0x8d, 0x6c, 0xc4, 0x1e, 0x48, 0x25, 0x1b, 0x7b, 0xd2, 0x18, + 0x0e, 0x51, 0x7a, 0xa8, 0xca, 0xe5, 0x35, 0x26, 0x3d, 0x41, 0xbb, 0x4a, 0x6d, 0x55, 0x10, 0x87, + 0x5d, 0x67, 0x7c, 0x72, 0x9a, 0xc8, 0xf8, 0x04, 0xd3, 0x66, 0xd6, 0xb0, 0xec, 0xd9, 0x04, 0x19, + 0xbf, 0xae, 0x65, 0x84, 0xd3, 0xa6, 0xc5, 0xf1, 0xb8, 0xbc, 0x94, 0x04, 0x7d, 0xf8, 0xfd, 0x5e, + 0x84, 0x80, 0xe8, 0x74, 0x82, 0xe1, 0xe1, 0x31, 0x92, 0x99, 0x0c, 0x19, 0xbb, 0x8b, 0xa8, 0xa8, + 0x93, 0xb1, 0xc6, 0xa9, 0x09, 0xb4, 0xac, 0x70, 0x1d, 0x2b, 0x0b, 0x79, 0xad, 0x81, 0x98, 0x6e, + 0x66, 0x75, 0x97, 0x74, 0xda, 0x43, 0x21, 0x0d, 0x87, 0xdd, 0x46, 0x30, 0xe0, 0xc5, 0x30, 0x2d, + 0xc6, 0x27, 0xe2, 0x0c, 0x27, 0x52, 0x0c, 0xdb, 0x9c, 0xe9, 0x68, 0xd3, 0x40, 0x54, 0x28, 0x16, + 0x02, 0x81, 0x2d, 0xb2, 0xd0, 0xeb, 0x1e, 0xc8, 0x38, 0x3d, 0x6a, 0x6f, 0xda, 0x6b, 0x78, 0x9c, + 0x65, 0x21, 0x17, 0x15, 0x65, 0x41, 0x02, 0x21, 0x0f, 0xb9, 0x6c, 0x8e, 0x9e, 0xbe, 0x71, 0xba, + 0xc7, 0xc6, 0x32, 0x49, 0x61, 0x33, 0xe3, 0xb2, 0xd6, 0x95, 0x6c, 0x1e, 0x9f, 0x30, 0x3d, 0x03, + 0x39, 0x10, 0xe8, 0xc3, 0x1d, 0x5e, 0xd7, 0x90, 0xe5, 0xf2, 0xa8, 0x3d, 0x51, 0x45, 0xa4, 0x4c, + 0x45, 0x2a, 0x86, 0x54, 0x14, 0xdb, 0x94, 0xc3, 0xa7, 0x0c, 0xd6, 0xca, 0x57, 0xba, 0x82, 0xe2, + 0xb6, 0xcd, 0xa5, 0xfa, 0x36, 0x1a, 0x86, 0xad, 0x3f, 0x6b, 0x01, 0x5f, 0xfc, 0xc8, 0xaa, 0x0d, + 0x67, 0x0e, 0x8c, 0xfd, 0xa6, 0x4a, 0x99, 0x70, 0x9e, 0xb3, 0x61, 0x25, 0x95, 0xe5, 0x7e, 0x6c, + 0xba, 0x46, 0x3a, 0x99, 0x65, 0x32, 0x9a, 0x64, 0x62, 0x3c, 0x81, 0x94, 0x12, 0xb7, 0xc7, 0x41, + 0x28, 0xe4, 0xc2, 0xef, 0x73, 0x61, 0xb7, 0x69, 0x08, 0x04, 0x12, 0x49, 0x32, 0x9d, 0x25, 0x12, + 0x89, 0x11, 0x89, 0xc4, 0xb1, 0xa4, 0xc4, 0xe3, 0xb1, 0x13, 0x2e, 0xf5, 0xe0, 0xf5, 0x3a, 0xd1, + 0x35, 0x0d, 0x21, 0x00, 0x09, 0x12, 0x48, 0xa6, 0xb3, 0x8c, 0x8c, 0x4e, 0x33, 0x32, 0x12, 0x25, + 0x1a, 0x4d, 0x22, 0x25, 0xe8, 0x36, 0x15, 0x9f, 0xdf, 0x89, 0xdf, 0xe7, 0x22, 0x18, 0x74, 0xe2, + 0x76, 0x3b, 0xb0, 0xdb, 0x6d, 0x28, 0x42, 0x20, 0x0a, 0xcb, 0xb2, 0xa4, 0x24, 0x95, 0xce, 0x12, + 0x19, 0x8b, 0x31, 0x30, 0x38, 0xc9, 0xe8, 0xe8, 0x14, 0xa9, 0x64, 0x16, 0x97, 0xdb, 0x4e, 0xb8, + 0xdc, 0x4f, 0x65, 0x79, 0x80, 0x70, 0xd8, 0x83, 0xd3, 0x69, 0x27, 0x67, 0x09, 0x14, 0xcb, 0x42, + 0xd7, 0x14, 0x2c, 0x60, 0x2a, 0x9a, 0xa0, 0xb7, 0x6f, 0x82, 0xd1, 0xd1, 0x69, 0xa6, 0x26, 0x63, + 0x98, 0x86, 0x09, 0x02, 0x9c, 0x2e, 0x07, 0x3e, 0xbf, 0x8b, 0x80, 0xdf, 0x4d, 0x69, 0xa9, 0x07, + 0x8f, 0x5b, 0x47, 0x00, 0xd9, 0xac, 0x49, 0x5f, 0xef, 0x24, 0x2f, 0x77, 0xf7, 0xf3, 0x5a, 0x43, + 0xfc, 0xbb, 0x7b, 0x1b, 0x92, 0x1f, 0xdb, 0x5f, 0x67, 0x66, 0xff, 0x2c, 0x05, 0x7c, 0xc1, 0x53, + 0xb5, 0xda, 0xa2, 0xd1, 0xdc, 0x83, 0xcd, 0xe3, 0xa3, 0x6f, 0x2f, 0x2f, 0x2f, 0x17, 0x6f, 0xbb, + 0x6c, 0x2d, 0x76, 0x9b, 0x0a, 0x42, 0x80, 0x94, 0x20, 0x04, 0x42, 0x14, 0x4e, 0x2d, 0x65, 0xe1, + 0x87, 0x44, 0x08, 0x81, 0x2c, 0x9a, 0xf7, 0xfc, 0x73, 0x0a, 0xef, 0x93, 0x85, 0xf7, 0xe5, 0xdf, + 0x31, 0xff, 0xb2, 0x0a, 0xa7, 0x2c, 0x5c, 0xb1, 0x28, 0xfa, 0x07, 0x13, 0xb0, 0x2c, 0x89, 0x76, + 0xc2, 0x8a, 0x84, 0x04, 0x89, 0x28, 0x5c, 0xce, 0xcc, 0xe7, 0xe4, 0xcf, 0x33, 0xf3, 0x5c, 0xa8, + 0x02, 0x69, 0x4a, 0x90, 0x92, 0xe9, 0x94, 0xc5, 0x57, 0xbe, 0x76, 0x80, 0x35, 0xab, 0x4b, 0x79, + 0xfb, 0xa5, 0x95, 0x28, 0x85, 0xdd, 0x65, 0x29, 0x02, 0x55, 0x51, 0xb0, 0x4c, 0x93, 0x99, 0x0b, + 0x17, 0x85, 0xb5, 0x49, 0x40, 0x48, 0x39, 0x6f, 0x3d, 0x08, 0xc1, 0x54, 0x2c, 0xc5, 0x33, 0xaf, + 0xec, 0x95, 0xcf, 0x94, 0x0d, 0x7d, 0xaf, 0x33, 0x64, 0xdc, 0xfa, 0xea, 0x22, 0xcc, 0x37, 0x53, + 0xc0, 0xca, 0x1f, 0xf2, 0x47, 0x21, 0x93, 0x15, 0xe5, 0xb1, 0xec, 0xa5, 0x42, 0xd5, 0x44, 0x26, + 0x6b, 0x92, 0xc9, 0x19, 0xc5, 0xdd, 0x22, 0x44, 0x5e, 0x7f, 0xa4, 0x94, 0xc5, 0x87, 0x29, 0x25, + 0x13, 0x89, 0x34, 0x7d, 0xe3, 0x51, 0xa6, 0x53, 0x99, 0xbc, 0x30, 0xe7, 0x6e, 0x00, 0xcb, 0x42, + 0x48, 0x89, 0x90, 0xf2, 0xd4, 0x7b, 0x4e, 0xe4, 0xb5, 0xd1, 0x90, 0x12, 0x69, 0x59, 0x20, 0x25, + 0x39, 0x43, 0xf2, 0xe0, 0x43, 0x7d, 0xfc, 0xfa, 0xf1, 0x21, 0x64, 0xe1, 0x5c, 0x16, 0x70, 0xe8, + 0x78, 0x9c, 0xc9, 0xb8, 0xc1, 0x8c, 0x44, 0x66, 0x37, 0x5a, 0xe1, 0xfa, 0x80, 0x74, 0xc6, 0xe0, + 0x85, 0x57, 0x22, 0x4c, 0xc5, 0x72, 0x00, 0x38, 0xec, 0x02, 0x84, 0xc2, 0x81, 0xd7, 0xa7, 0xc8, + 0x19, 0x32, 0x2f, 0x5c, 0xe0, 0xbe, 0x9f, 0xf7, 0xf0, 0xc0, 0xc3, 0x7d, 0xe4, 0x4c, 0x89, 0x22, + 0x44, 0xc1, 0x3a, 0x14, 0x36, 0xa3, 0x2c, 0x8a, 0x16, 0x6b, 0xe6, 0x77, 0x29, 0xf1, 0x7b, 0x1c, + 0xac, 0x5b, 0xd8, 0x22, 0x96, 0xed, 0x2d, 0xbb, 0xa5, 0x64, 0xa2, 0xf1, 0x43, 0x6f, 0xb6, 0x06, + 0xff, 0xb7, 0x05, 0x7c, 0xd9, 0x0b, 0x5e, 0x51, 0x93, 0x98, 0x7c, 0x8b, 0x27, 0x13, 0xb7, 0x35, + 0xb5, 0x9c, 0x85, 0xc7, 0xd7, 0xc4, 0xe0, 0xd0, 0x54, 0xfe, 0x76, 0xce, 0x59, 0xf4, 0xcc, 0x82, + 0x25, 0x30, 0x30, 0x31, 0xcd, 0xa6, 0x03, 0x47, 0x78, 0xf9, 0x70, 0x17, 0x1b, 0xf7, 0x1d, 0x66, + 0x6f, 0xdf, 0x08, 0x19, 0xc3, 0x2c, 0x68, 0xed, 0xc9, 0x7f, 0x73, 0xd2, 0x79, 0x80, 0xdd, 0x07, + 0x63, 0x7c, 0xfb, 0xbb, 0x47, 0x49, 0x65, 0x2d, 0xa4, 0x94, 0x28, 0x02, 0x5c, 0x6e, 0x8d, 0x57, + 0xb7, 0x8e, 0x91, 0xcc, 0x98, 0x48, 0x09, 0x39, 0x09, 0xbf, 0x7e, 0xb4, 0x8f, 0x5d, 0x7b, 0xa7, + 0x4e, 0xbd, 0xb2, 0xc2, 0xf5, 0x4c, 0x27, 0x2d, 0xbe, 0x79, 0xe7, 0x21, 0x9e, 0x7d, 0x71, 0x14, + 0x4b, 0x80, 0xa6, 0x29, 0x34, 0x36, 0x79, 0xd8, 0xbf, 0x7f, 0x8a, 0x44, 0xca, 0x44, 0x2a, 0x82, + 0x74, 0x4e, 0xb2, 0xf1, 0xb9, 0x21, 0x32, 0x39, 0x89, 0x2a, 0x94, 0x79, 0x97, 0x39, 0xb3, 0x51, + 0x2c, 0x29, 0x19, 0x9e, 0x8a, 0xf3, 0xd2, 0xa1, 0x6e, 0x26, 0x0a, 0x31, 0x98, 0x00, 0x42, 0x41, + 0x17, 0x25, 0x7a, 0x56, 0xa9, 0x9e, 0x9c, 0xfe, 0x60, 0x53, 0x6f, 0x20, 0xf0, 0x67, 0x25, 0xe0, + 0xf2, 0xa8, 0x66, 0x0f, 0xc6, 0x8c, 0xb7, 0xd8, 0xec, 0x3e, 0xa5, 0xa5, 0x6d, 0x11, 0xd5, 0x35, + 0x8d, 0xec, 0xde, 0xdb, 0x4d, 0x3c, 0x99, 0x39, 0x41, 0x54, 0xf9, 0x67, 0xa6, 0x84, 0xae, 0xd1, + 0x09, 0x2c, 0x29, 0xf3, 0xe6, 0x4e, 0x4a, 0x0e, 0x0f, 0x8d, 0xb0, 0xfd, 0x58, 0x3f, 0x19, 0xd3, + 0xca, 0xcb, 0x53, 0xcc, 0xd1, 0xda, 0x39, 0x66, 0x7b, 0xae, 0x89, 0xaf, 0x2c, 0x77, 0xf0, 0xca, + 0xd6, 0x51, 0xf6, 0x1c, 0x88, 0x62, 0x02, 0xc9, 0xac, 0x85, 0xd3, 0xa9, 0x71, 0xe8, 0x70, 0x94, + 0x23, 0x5d, 0x09, 0x26, 0x62, 0x06, 0x86, 0x95, 0xd7, 0x34, 0x39, 0xd7, 0x74, 0x9e, 0xb0, 0x69, + 0x04, 0x50, 0xe2, 0xb7, 0x71, 0xed, 0x35, 0x0d, 0x3c, 0xfd, 0xf4, 0x20, 0x07, 0x0e, 0xc7, 0xf9, + 0xe9, 0x2f, 0xfb, 0x78, 0xe5, 0x95, 0x18, 0xfb, 0xf6, 0x2b, 0x7c, 0xe5, 0x1b, 0x5d, 0x7c, 0xf7, + 0x87, 0x5d, 0x6c, 0x7c, 0x7e, 0x8c, 0x91, 0xd1, 0x34, 0x8b, 0x17, 0xfa, 0x50, 0x84, 0x3c, 0xcd, + 0x66, 0x11, 0xf4, 0x45, 0xa2, 0x8c, 0x44, 0xa7, 0xd9, 0xdf, 0x37, 0x42, 0xce, 0xcc, 0xc7, 0x55, + 0x76, 0x9b, 0x86, 0xd3, 0xe9, 0x20, 0x14, 0xf1, 0xb6, 0xba, 0xb2, 0xfa, 0x92, 0x37, 0x53, 0xc0, + 0xda, 0x7f, 0xf7, 0x0f, 0x22, 0xe5, 0x8e, 0xf3, 0xda, 0xfb, 0x93, 0xe7, 0x95, 0x55, 0xb6, 0xe3, + 0xf3, 0xf9, 0x71, 0xb9, 0x5d, 0x0c, 0x0d, 0xd5, 0xb3, 0x6b, 0x6f, 0x2f, 0xeb, 0x57, 0x37, 0x63, + 0x53, 0x95, 0x82, 0x59, 0xcc, 0x3b, 0x43, 0x05, 0x89, 0xae, 0xaa, 0xf3, 0x4d, 0xaf, 0x84, 0xa1, + 0xa9, 0x28, 0xc7, 0x86, 0x9d, 0x2c, 0xa8, 0x0e, 0xa3, 0xce, 0x73, 0xb2, 0x73, 0xb7, 0x47, 0xc1, + 0xe4, 0x4b, 0x28, 0x0f, 0xd9, 0xb8, 0xe6, 0xbd, 0x8d, 0xdc, 0xf5, 0xfd, 0xc3, 0xfc, 0xae, 0xb9, + 0x94, 0xce, 0x23, 0x61, 0x9c, 0xae, 0x66, 0x96, 0x2e, 0x5b, 0xcf, 0xbf, 0xff, 0xc7, 0x18, 0x91, + 0xb1, 0x5e, 0x6a, 0xaa, 0xfb, 0xe9, 0xed, 0x8d, 0xb0, 0x6a, 0x45, 0x09, 0x52, 0x8a, 0x39, 0xfe, + 0x77, 0xfe, 0x67, 0x0b, 0x21, 0xa9, 0xab, 0x73, 0x71, 0xf8, 0xa8, 0x9f, 0x5f, 0x3f, 0xba, 0x8e, + 0x75, 0xeb, 0xd6, 0xf1, 0x7f, 0x3e, 0x55, 0x87, 0xd3, 0xe9, 0xc0, 0x34, 0x4d, 0x86, 0x87, 0x47, + 0xd8, 0xb7, 0x6f, 0x2f, 0xc1, 0xd0, 0x46, 0x36, 0xbf, 0xdc, 0x4d, 0x45, 0xd8, 0x4e, 0x79, 0xa9, + 0xbd, 0xa8, 0xb9, 0xc5, 0x8d, 0x28, 0x25, 0x42, 0xc9, 0x5f, 0xe3, 0x64, 0x32, 0x49, 0x3c, 0x93, + 0x25, 0xe8, 0x72, 0x60, 0x49, 0x89, 0x65, 0x59, 0xb8, 0x9c, 0x53, 0x38, 0xed, 0x39, 0xfe, 0xac, + 0x04, 0x5c, 0x3a, 0x92, 0x5e, 0xe2, 0xc8, 0x68, 0xb6, 0x86, 0xa6, 0x36, 0x10, 0x02, 0x4d, 0xb3, + 0xb1, 0xe2, 0x8c, 0xf5, 0xec, 0x7c, 0xed, 0x65, 0x0e, 0x74, 0x0e, 0xb1, 0xa4, 0xa3, 0x1a, 0x6d, + 0x66, 0xfd, 0x85, 0x78, 0xb6, 0x3c, 0xe8, 0xa3, 0x7f, 0x62, 0x6a, 0x36, 0xc0, 0x29, 0xdc, 0xf0, + 0x63, 0x23, 0x11, 0x6a, 0x4a, 0xfd, 0xf8, 0xec, 0xfa, 0x49, 0x9e, 0xb7, 0x18, 0x4a, 0xc9, 0xbc, + 0xf3, 0x1c, 0x9b, 0xca, 0x71, 0xe4, 0x58, 0x8e, 0xd6, 0xf6, 0x0f, 0x70, 0xc9, 0xa5, 0x97, 0xf2, + 0xf7, 0x4d, 0x4d, 0xb8, 0xdd, 0x6e, 0x6c, 0x36, 0x1b, 0xb9, 0x5c, 0x8e, 0x64, 0x32, 0x41, 0x57, + 0x57, 0x37, 0xbf, 0xfd, 0xed, 0x6f, 0xf9, 0xde, 0x0f, 0x7e, 0x49, 0xd6, 0x94, 0x9c, 0xbf, 0xa1, + 0x0c, 0xa7, 0x36, 0xf7, 0x64, 0x20, 0x91, 0x6c, 0xdf, 0x33, 0xcd, 0xc3, 0x8f, 0x36, 0xf3, 0xbd, + 0xef, 0xdd, 0xc9, 0x82, 0x05, 0x0b, 0xd0, 0x34, 0x6d, 0x5e, 0xa0, 0xd7, 0xd2, 0xd2, 0xc2, 0x86, + 0x0d, 0x67, 0x73, 0xcd, 0x35, 0xd7, 0xf0, 0xfc, 0xf3, 0xcf, 0xf3, 0xcf, 0x9f, 0xff, 0x1e, 0x1f, + 0x78, 0x7f, 0x92, 0xd5, 0xcb, 0x03, 0xa8, 0x73, 0x36, 0x8b, 0x22, 0xa0, 0xc2, 0xef, 0xa5, 0x7b, + 0x6c, 0x1c, 0x29, 0x25, 0x56, 0x61, 0x57, 0x66, 0x72, 0x26, 0xc9, 0x74, 0x1a, 0x4b, 0x75, 0x49, + 0x48, 0x5b, 0x90, 0x78, 0xd3, 0x04, 0xac, 0xfe, 0x77, 0xde, 0xbc, 0xea, 0x90, 0xcf, 0xdd, 0x3c, + 0x22, 0xef, 0x6a, 0x16, 0x75, 0xa5, 0x8b, 0x96, 0xae, 0x40, 0x55, 0xf3, 0x16, 0x5e, 0x55, 0x35, + 0xca, 0xca, 0xab, 0x38, 0x78, 0xb0, 0x97, 0x64, 0x62, 0x92, 0xf2, 0x72, 0x5f, 0xfe, 0x9e, 0x16, + 0x82, 0x12, 0xa7, 0x6e, 0x63, 0x74, 0x3a, 0x4e, 0x3a, 0x97, 0xcb, 0x47, 0xa0, 0x85, 0x1b, 0x69, + 0x58, 0x16, 0x5e, 0xbb, 0x93, 0x12, 0x8f, 0x73, 0xbe, 0x70, 0x4f, 0x88, 0xc0, 0x07, 0xc7, 0xb3, + 0x7c, 0xe3, 0x9b, 0x39, 0x2e, 0xbc, 0xf8, 0x4b, 0x5c, 0x7d, 0xf5, 0xd5, 0xd4, 0xd6, 0xd6, 0xe2, + 0x70, 0x38, 0x50, 0x55, 0x15, 0x21, 0x04, 0xaa, 0xaa, 0xe2, 0x70, 0x38, 0xa9, 0xac, 0xac, 0x64, + 0xfd, 0xfa, 0xf5, 0x9c, 0x71, 0xc6, 0x05, 0x3c, 0xfd, 0x4c, 0x94, 0x6d, 0xdb, 0xb6, 0xb1, 0x70, + 0x91, 0x07, 0x87, 0x7d, 0xd6, 0x13, 0x75, 0x76, 0x27, 0xf9, 0xe5, 0x43, 0x6d, 0x7c, 0xe2, 0x1f, + 0x6f, 0xa3, 0xa1, 0xa1, 0x01, 0x45, 0x51, 0x8a, 0x9f, 0x37, 0xb3, 0xf9, 0x66, 0xae, 0xd1, 0xe1, + 0x70, 0xd0, 0xde, 0xde, 0xce, 0x92, 0xa5, 0x67, 0x73, 0xdf, 0xcf, 0x8e, 0xa0, 0x6a, 0xbd, 0xd4, + 0xd5, 0x38, 0x0b, 0x5e, 0x24, 0xaf, 0xcf, 0x6e, 0x87, 0x8e, 0x5d, 0xb3, 0x11, 0x72, 0xbb, 0xa8, + 0x0a, 0xfa, 0x50, 0x84, 0x20, 0x9b, 0x35, 0xe8, 0x3c, 0x32, 0x48, 0x04, 0xdd, 0x3a, 0x58, 0x63, + 0xfe, 0x74, 0xe4, 0xdb, 0xc9, 0x9e, 0x3f, 0x7d, 0x01, 0x47, 0x75, 0xd1, 0x3a, 0xa9, 0x5d, 0xbf, + 0xf4, 0xa8, 0xbc, 0x71, 0x65, 0xfb, 0x59, 0x4a, 0xb8, 0xac, 0x6c, 0xde, 0x4d, 0x51, 0x55, 0x95, + 0xb2, 0xf2, 0x2a, 0x5e, 0x3f, 0xd8, 0x8d, 0x66, 0x33, 0x28, 0x09, 0xba, 0x11, 0x14, 0x5e, 0x53, + 0x04, 0x0e, 0xcd, 0xc6, 0x50, 0x34, 0x76, 0x82, 0x16, 0x0b, 0x5c, 0x76, 0x1b, 0x15, 0x41, 0xef, + 0x3c, 0x0d, 0x9e, 0x9b, 0x4e, 0x4d, 0x26, 0x4c, 0xbe, 0x7e, 0x47, 0x82, 0xeb, 0x6e, 0xf8, 0x1a, + 0x6b, 0xd6, 0xac, 0x29, 0x0a, 0xe4, 0x54, 0x8f, 0xfc, 0x66, 0x53, 0x09, 0x85, 0x42, 0xac, 0x5f, + 0xbf, 0x9e, 0xa9, 0xe9, 0x4a, 0x7e, 0x76, 0xff, 0xb3, 0x2c, 0x59, 0x62, 0xc3, 0xe3, 0xd6, 0x88, + 0xa5, 0x2c, 0x7e, 0x70, 0xb7, 0xc5, 0xfb, 0xff, 0xe6, 0x0b, 0x54, 0x55, 0x55, 0xcd, 0xfb, 0xbb, + 0x93, 0x02, 0xf7, 0x39, 0x42, 0x0f, 0x06, 0x83, 0x2c, 0x5f, 0xbe, 0x9a, 0x07, 0x1f, 0xea, 0xc5, + 0xee, 0x38, 0x4e, 0x4d, 0x95, 0xa3, 0x78, 0xbd, 0xaa, 0x80, 0x12, 0xaf, 0x8b, 0x52, 0xaf, 0x0b, + 0x45, 0x14, 0x36, 0xbc, 0xa6, 0x32, 0x15, 0x4d, 0x33, 0x92, 0xee, 0x8d, 0xf7, 0x34, 0x25, 0xef, + 0xea, 0xfb, 0xa6, 0x1c, 0xf9, 0x93, 0x17, 0xf0, 0x86, 0xb7, 0x2e, 0xf6, 0x2f, 0xe9, 0xb7, 0xee, + 0x58, 0x98, 0x2b, 0xaf, 0x5b, 0xb6, 0x62, 0x75, 0x51, 0x7b, 0xe6, 0xde, 0x10, 0x55, 0xd3, 0xf0, + 0xfb, 0x4b, 0x38, 0x74, 0x60, 0x1f, 0x0d, 0x0d, 0x25, 0x68, 0xaa, 0x28, 0x6a, 0xb2, 0xc7, 0x61, + 0x43, 0x55, 0x54, 0xc6, 0xa6, 0xe3, 0x45, 0x0d, 0x06, 0x08, 0x7b, 0xbd, 0x54, 0x04, 0xbc, 0x27, + 0x09, 0x0a, 0x99, 0xcf, 0x73, 0x1f, 0x7c, 0x64, 0x84, 0xa6, 0xd6, 0xbf, 0xe7, 0x9c, 0x73, 0xce, + 0x9d, 0xa7, 0x6d, 0x6f, 0x24, 0x14, 0x00, 0x4d, 0xd3, 0x68, 0x6b, 0x6b, 0xc3, 0xeb, 0x5b, 0xc0, + 0xbd, 0xf7, 0x3d, 0xc3, 0xd2, 0xe5, 0x36, 0x76, 0xed, 0x8d, 0xe2, 0xf6, 0xdd, 0xcc, 0xfa, 0x75, + 0xeb, 0x4f, 0x7b, 0xae, 0x62, 0x3e, 0x7e, 0xc2, 0xe6, 0x71, 0xb9, 0x5c, 0x2c, 0x5a, 0xb4, 0x94, + 0x9f, 0xdd, 0xff, 0x3a, 0x75, 0xf5, 0x63, 0x94, 0x04, 0x6c, 0x45, 0xff, 0x2e, 0x4f, 0x71, 0x1d, + 0xa5, 0x61, 0x1f, 0x43, 0x47, 0xe3, 0xf6, 0xd8, 0x44, 0x65, 0x58, 0xfb, 0x54, 0xe5, 0xe3, 0x83, + 0xdf, 0x1f, 0x35, 0xfe, 0x64, 0x05, 0x7c, 0xce, 0xf3, 0xab, 0x03, 0x0b, 0x87, 0x79, 0x60, 0x61, + 0xbf, 0x75, 0xee, 0xba, 0xb3, 0xce, 0xc6, 0xe7, 0xf3, 0x9f, 0xfa, 0x46, 0x0b, 0xb0, 0xdb, 0x1d, + 0x8c, 0x8d, 0x4e, 0x50, 0x5e, 0xaa, 0xe2, 0x74, 0xd8, 0x8a, 0x81, 0x89, 0x10, 0x82, 0x12, 0xaf, + 0x9b, 0xb2, 0x80, 0x97, 0x6c, 0xd6, 0x22, 0x63, 0x18, 0xb8, 0xec, 0x76, 0x96, 0xd4, 0x95, 0x63, + 0xb7, 0xa9, 0xb3, 0x01, 0xcc, 0x9c, 0xf3, 0x0e, 0x8f, 0xe7, 0x78, 0xec, 0x89, 0x4a, 0x6e, 0xb8, + 0xe1, 0x43, 0xb8, 0x5c, 0xae, 0xd3, 0x0a, 0x57, 0x16, 0x82, 0x9a, 0x54, 0x3a, 0x4d, 0x2e, 0x9b, + 0x2d, 0x6a, 0xb2, 0xa2, 0x28, 0xd4, 0xd4, 0xd4, 0x60, 0x5a, 0x15, 0x3c, 0xf1, 0xc4, 0x33, 0x74, + 0x1e, 0x72, 0xf2, 0xf6, 0x77, 0xfc, 0x1d, 0xc1, 0x60, 0x10, 0x45, 0x51, 0x4e, 0x3a, 0x87, 0x69, + 0x9a, 0x64, 0x32, 0x19, 0x72, 0xb9, 0x7c, 0x60, 0x74, 0xa2, 0xf9, 0x76, 0xb9, 0x5c, 0xd4, 0xd5, + 0xb5, 0x72, 0xff, 0x2f, 0x9e, 0x62, 0xe5, 0x0a, 0x15, 0x5d, 0x13, 0x27, 0x4a, 0xb6, 0xa8, 0xd9, + 0xba, 0x4d, 0xc5, 0xe7, 0x73, 0x8b, 0xc9, 0x03, 0x5d, 0xad, 0x42, 0xc6, 0x77, 0x89, 0xf7, 0xd5, + 0x76, 0x0e, 0xff, 0x7c, 0xfc, 0x4f, 0x2f, 0xc8, 0xba, 0xe4, 0x79, 0x44, 0xd5, 0xc8, 0xe4, 0x47, + 0x17, 0x0d, 0xe7, 0x2e, 0x3c, 0xf3, 0xec, 0x73, 0x28, 0x2b, 0x2b, 0x3f, 0x29, 0xe2, 0x9d, 0x97, + 0x1f, 0x2a, 0x02, 0xb7, 0x37, 0x44, 0x22, 0x19, 0x23, 0xe4, 0x77, 0x9e, 0xb4, 0xf0, 0x52, 0x8f, + 0x93, 0xd2, 0x05, 0xf5, 0x64, 0x4d, 0x0b, 0x45, 0x80, 0x26, 0xc4, 0x49, 0x82, 0x9d, 0x81, 0x28, + 0x0f, 0x1f, 0x8d, 0xb3, 0x7e, 0xfd, 0x75, 0x04, 0x02, 0x81, 0x37, 0x14, 0x6e, 0x24, 0x32, 0xce, + 0xaf, 0x7f, 0xfd, 0x10, 0x8f, 0xfc, 0xf6, 0x79, 0x72, 0x96, 0xc2, 0x9a, 0x8e, 0x06, 0xde, 0xf3, + 0x9e, 0x77, 0xb3, 0x68, 0xd1, 0x22, 0x34, 0x4d, 0xe3, 0x82, 0x0b, 0x2e, 0xe0, 0xd8, 0xb1, 0xe3, + 0x8c, 0x8e, 0x1f, 0xa6, 0xb4, 0xb4, 0xf4, 0xa4, 0x73, 0xe5, 0xcf, 0x11, 0xe1, 0x67, 0x3f, 0xff, + 0x39, 0x8f, 0x3f, 0xb3, 0x11, 0x13, 0x85, 0xb3, 0x56, 0x2e, 0xe6, 0x9d, 0x57, 0xbe, 0x93, 0xa5, + 0x4b, 0x96, 0x62, 0xb3, 0xd9, 0x8a, 0x9a, 0xdc, 0xd4, 0xd4, 0x44, 0x4b, 0xeb, 0x75, 0xec, 0xdc, + 0xfd, 0x63, 0x36, 0xac, 0x0b, 0x91, 0x0f, 0x43, 0xc4, 0x49, 0xa9, 0x18, 0x40, 0x4d, 0x95, 0x9f, + 0x45, 0x55, 0xa5, 0xb6, 0xc4, 0xf1, 0xb1, 0xff, 0x8c, 0xb7, 0x8f, 0xef, 0xd8, 0x05, 0x7d, 0x7f, + 0x52, 0x1a, 0x5c, 0x35, 0xea, 0x17, 0xe1, 0xe9, 0xda, 0xb7, 0x2f, 0xe9, 0xca, 0xde, 0xb9, 0xbc, + 0x75, 0xa1, 0xd6, 0xd2, 0xd6, 0x51, 0x58, 0xe8, 0x1b, 0x20, 0x9f, 0x52, 0x90, 0x4a, 0x26, 0xc9, + 0x24, 0x47, 0x28, 0x0f, 0xfb, 0x10, 0x8a, 0x38, 0x01, 0x20, 0x28, 0xf8, 0x4a, 0x21, 0x98, 0x79, + 0x69, 0x5e, 0xea, 0x51, 0x38, 0x0c, 0x29, 0xd8, 0xf4, 0x62, 0x9c, 0x25, 0x4b, 0xaf, 0xa3, 0xa2, + 0xa2, 0xe2, 0xb4, 0xe6, 0x74, 0x7c, 0x7c, 0x9c, 0x4f, 0x7f, 0xf6, 0x73, 0x7c, 0x39, 0x5e, 0xc5, + 0xd1, 0x8b, 0x6f, 0xa1, 0x6b, 0xf9, 0xa5, 0x6c, 0x36, 0xbc, 0xfc, 0xe6, 0x9e, 0xbb, 0x09, 0xe5, + 0xa2, 0xb4, 0xb6, 0xb6, 0x60, 0xb7, 0xdb, 0xa9, 0xad, 0xad, 0xe1, 0xa5, 0x97, 0x5e, 0x62, 0xfd, + 0xfa, 0xf5, 0xb8, 0xdd, 0xee, 0xe2, 0xf9, 0xa4, 0x94, 0xc4, 0xe2, 0x71, 0xbe, 0x7a, 0xfb, 0x1d, + 0xdc, 0x36, 0x1e, 0xa2, 0xeb, 0xd2, 0x0f, 0xd3, 0x7b, 0xc6, 0xdb, 0xd8, 0x4c, 0x29, 0x4f, 0xde, + 0xf3, 0x13, 0x02, 0xc9, 0x31, 0x16, 0x2c, 0x58, 0x30, 0x4f, 0xc8, 0xe1, 0x70, 0x39, 0xbf, 0xfc, + 0xe5, 0x26, 0xd6, 0xad, 0xb5, 0x0a, 0x69, 0xe1, 0x9c, 0xfc, 0xbd, 0xf0, 0x10, 0x05, 0x90, 0xc1, + 0xee, 0x76, 0xd0, 0x77, 0xec, 0x98, 0x2b, 0x59, 0x9a, 0x09, 0x19, 0xff, 0xaa, 0x3d, 0x35, 0xfc, + 0x4d, 0xf3, 0x8f, 0x5a, 0x84, 0x78, 0x43, 0xa0, 0xa3, 0x6c, 0xda, 0xb4, 0x55, 0x4d, 0x4f, 0x5e, + 0x5b, 0x86, 0x69, 0x6f, 0x6e, 0x69, 0xa3, 0x00, 0xe9, 0xe6, 0xd5, 0x4b, 0x72, 0x32, 0x0a, 0x45, + 0x3e, 0x0d, 0x71, 0x38, 0x9d, 0x1c, 0xef, 0x1e, 0x25, 0x67, 0x99, 0x27, 0x23, 0x5c, 0x85, 0x9d, + 0x1e, 0x4d, 0xa5, 0xe9, 0x9f, 0x98, 0x26, 0x6b, 0x5a, 0xc5, 0xd3, 0xc9, 0x99, 0x97, 0x01, 0xc3, + 0x92, 0x8c, 0x8d, 0x79, 0x08, 0x87, 0xc3, 0xa7, 0xd5, 0x5c, 0xd3, 0x34, 0x79, 0xe2, 0xc9, 0x27, + 0xb9, 0xdf, 0xb9, 0x18, 0xf3, 0xcc, 0x2b, 0x90, 0x9a, 0x8e, 0x54, 0x55, 0x68, 0x5c, 0x4c, 0xcf, + 0xfb, 0x3e, 0xc3, 0xad, 0xdb, 0xc7, 0xb9, 0xf7, 0xbe, 0x9f, 0x92, 0xc9, 0x64, 0xa8, 0xa8, 0xa8, + 0x60, 0xfd, 0xfa, 0xf5, 0x6c, 0xdb, 0xb6, 0x0d, 0xcb, 0xb2, 0x8a, 0xbe, 0x56, 0x4a, 0xc9, 0xf6, + 0xed, 0xdb, 0x79, 0x60, 0x44, 0xc3, 0x3c, 0xfb, 0x6d, 0x48, 0x87, 0x0b, 0x4b, 0xd5, 0x90, 0xb5, + 0x6d, 0x0c, 0x5e, 0xff, 0x59, 0xfe, 0xef, 0x8e, 0x71, 0x36, 0x6e, 0x7c, 0x16, 0xcb, 0x9a, 0x95, + 0x4b, 0x59, 0x59, 0x98, 0xba, 0x86, 0xf3, 0x39, 0xde, 0x93, 0x06, 0xa5, 0x00, 0xd4, 0x88, 0x39, + 0x3e, 0x5c, 0x16, 0x81, 0x6b, 0x2a, 0x4a, 0xbd, 0x94, 0x95, 0x84, 0x45, 0xe9, 0x88, 0xfd, 0xda, + 0x92, 0x48, 0x68, 0xf5, 0x9f, 0x14, 0x92, 0xe5, 0x48, 0x79, 0x16, 0x95, 0x8e, 0xf0, 0xb6, 0xb2, + 0xd2, 0x6a, 0x9c, 0x2e, 0x17, 0x42, 0xcc, 0xe2, 0x74, 0x12, 0x89, 0x94, 0x60, 0x9a, 0x06, 0xd9, + 0x6c, 0x06, 0xd3, 0x34, 0x8b, 0xeb, 0x0a, 0x95, 0x94, 0x20, 0x6c, 0x95, 0x1c, 0x3e, 0x3a, 0x3a, + 0x8b, 0x2a, 0xcd, 0xdc, 0x50, 0x04, 0x39, 0xcb, 0x62, 0x67, 0x57, 0x3f, 0xaf, 0x1c, 0xee, 0x66, + 0xeb, 0xe1, 0x5e, 0x32, 0x46, 0x1e, 0x8f, 0x17, 0x72, 0x0e, 0x60, 0x0c, 0x20, 0x74, 0x6c, 0xb6, + 0xd3, 0x7b, 0x91, 0x78, 0x3c, 0xce, 0xa6, 0x2d, 0x3b, 0x49, 0x2e, 0x3e, 0x3b, 0x7f, 0xe6, 0x74, + 0x12, 0xf1, 0xca, 0xe3, 0x88, 0x03, 0x5b, 0x40, 0x28, 0xc4, 0xfe, 0xea, 0x6a, 0xee, 0xd8, 0x3d, + 0xc1, 0x96, 0x2d, 0x5b, 0x00, 0x58, 0xbf, 0x7e, 0x3d, 0x9b, 0x37, 0x6f, 0x26, 0x93, 0xc9, 0x14, + 0x85, 0x61, 0x18, 0x06, 0xdb, 0xb6, 0x6d, 0x67, 0xb0, 0x6d, 0x0d, 0x08, 0x05, 0x46, 0xfb, 0xe0, + 0x81, 0x3b, 0x11, 0x4f, 0xdf, 0x0d, 0xb9, 0x0c, 0xe3, 0xe7, 0x5c, 0xc9, 0x5d, 0x0f, 0x3f, 0xc7, + 0xd0, 0xd0, 0x10, 0x96, 0x65, 0x15, 0xb5, 0x78, 0xe1, 0xc2, 0xa5, 0x3c, 0xf9, 0xf4, 0x24, 0x0f, + 0x3d, 0x31, 0xc4, 0x0f, 0x7e, 0x72, 0x8c, 0x27, 0x7e, 0x37, 0xc2, 0x58, 0x34, 0x37, 0x0b, 0xd2, + 0x14, 0x34, 0x59, 0x55, 0x14, 0xea, 0xaa, 0xcb, 0xf0, 0x8d, 0xd8, 0xf4, 0x50, 0x4a, 0x7b, 0xd7, + 0xb2, 0xc3, 0xe5, 0xe2, 0x4f, 0x46, 0xc0, 0x6e, 0x35, 0x79, 0x4e, 0x69, 0x3c, 0x69, 0x2b, 0x2d, + 0xab, 0x44, 0x51, 0x66, 0xd1, 0xa8, 0x7c, 0x11, 0x01, 0xfa, 0xfb, 0x7b, 0xd8, 0xf8, 0xbb, 0x07, + 0x78, 0xf2, 0x89, 0x1f, 0xf2, 0xdc, 0xb3, 0x0f, 0x31, 0x38, 0xd8, 0x83, 0x94, 0x16, 0x8a, 0xaa, + 0xb2, 0xe2, 0x8c, 0xb5, 0x1c, 0x3a, 0x92, 0xe2, 0x48, 0xd7, 0x18, 0x96, 0x9c, 0x55, 0xf8, 0x19, + 0xb0, 0xde, 0x30, 0xad, 0xfc, 0xfd, 0x8c, 0xc5, 0x38, 0x3a, 0x34, 0x5e, 0xd4, 0x5c, 0xf1, 0xdf, + 0x28, 0x78, 0x25, 0x93, 0x49, 0xc6, 0x72, 0x3a, 0xd2, 0x1b, 0x00, 0x21, 0x50, 0x5e, 0x79, 0x0c, + 0x79, 0xfb, 0x2d, 0xc8, 0x2f, 0xdd, 0x84, 0xdc, 0x78, 0x3f, 0x20, 0x39, 0xb6, 0xee, 0x0a, 0x7e, + 0xfc, 0x8b, 0x87, 0x99, 0x9c, 0x9c, 0xa2, 0x34, 0x1c, 0x46, 0x51, 0x14, 0x06, 0x07, 0x06, 0x8a, + 0x1a, 0x9c, 0x4e, 0xa7, 0xe9, 0xea, 0x1f, 0x22, 0x57, 0x5a, 0x85, 0xc8, 0x66, 0x10, 0x4f, 0xdd, + 0x0d, 0xbf, 0xfc, 0x3a, 0xf2, 0x47, 0x9f, 0x45, 0xfe, 0xe6, 0x27, 0xe0, 0xf0, 0xb0, 0xbd, 0x76, + 0x0d, 0xdb, 0xb7, 0xef, 0xc8, 0xc3, 0x93, 0x52, 0x32, 0x39, 0x39, 0xc9, 0xd6, 0xad, 0x5b, 0xd8, + 0xf4, 0x7c, 0x3f, 0x07, 0xf6, 0x4f, 0x90, 0xce, 0x48, 0x1e, 0x7d, 0xbc, 0x97, 0x8f, 0xfe, 0xe3, + 0x2e, 0x06, 0x46, 0x33, 0x27, 0x5c, 0xb9, 0xc4, 0x1f, 0x70, 0xa1, 0x92, 0x44, 0x19, 0x2d, 0xbd, + 0x30, 0xa9, 0x38, 0x9d, 0x7f, 0x32, 0x02, 0x6e, 0xde, 0x17, 0x70, 0x79, 0x72, 0x6e, 0x11, 0x0a, + 0x9d, 0x6c, 0x26, 0x47, 0x86, 0x07, 0x79, 0x75, 0xeb, 0x93, 0x4c, 0x4d, 0xf5, 0x93, 0xcb, 0x25, + 0x99, 0x98, 0xe8, 0x66, 0xcb, 0x2b, 0x8f, 0x70, 0xec, 0xe8, 0x61, 0xa4, 0x04, 0x87, 0xc3, 0xc9, + 0x19, 0xeb, 0xcf, 0x63, 0xcf, 0xfe, 0x18, 0xbb, 0xf7, 0xf7, 0x61, 0x4a, 0xc9, 0xcc, 0x3f, 0x4d, + 0x51, 0xf0, 0xbb, 0x9c, 0x45, 0x7f, 0xdc, 0x33, 0x3e, 0x49, 0xb2, 0x50, 0x91, 0x9a, 0xb1, 0xd5, + 0x42, 0x80, 0x22, 0x92, 0xa4, 0x52, 0xa9, 0xd3, 0x5e, 0x9f, 0x61, 0x18, 0x24, 0x4d, 0x09, 0x8a, + 0x9a, 0x4f, 0xab, 0x06, 0x8e, 0x81, 0x25, 0x21, 0x35, 0x0d, 0x8f, 0xdc, 0x85, 0xe8, 0x3e, 0x08, + 0x81, 0x52, 0x5e, 0xd0, 0x1b, 0x38, 0x72, 0xf4, 0x08, 0x4e, 0x87, 0x83, 0x05, 0xed, 0xed, 0x74, + 0x1e, 0x3e, 0x3c, 0x0f, 0x12, 0x95, 0x92, 0xfc, 0x39, 0xd2, 0x09, 0x44, 0xdf, 0xe1, 0xfc, 0x7f, + 0x9a, 0x26, 0x6c, 0xfc, 0x25, 0xa2, 0xff, 0x08, 0x53, 0x0d, 0x1d, 0xec, 0xdc, 0x77, 0x80, 0x74, + 0x26, 0xc3, 0xfe, 0xfd, 0xfb, 0xf9, 0xc4, 0xc7, 0x3f, 0x82, 0xd7, 0x75, 0x3f, 0xf7, 0xfe, 0x68, + 0x25, 0xff, 0xf2, 0xa9, 0x45, 0xdc, 0xfa, 0x81, 0x66, 0xbe, 0xfe, 0xaf, 0x2b, 0x68, 0x69, 0xf6, + 0xf0, 0xf0, 0x63, 0x7d, 0x18, 0x72, 0x0e, 0xd4, 0x5a, 0x4c, 0xdf, 0x14, 0xc8, 0xe9, 0xd5, 0x22, + 0xa7, 0x68, 0x7f, 0x12, 0x02, 0x3e, 0xa3, 0xb3, 0x52, 0x97, 0x81, 0xe4, 0xc5, 0xa1, 0x50, 0x95, + 0xf0, 0x9d, 0x14, 0xc5, 0x4a, 0x8e, 0x1e, 0x3b, 0x8c, 0x69, 0x26, 0xe6, 0x21, 0x53, 0x96, 0x95, + 0x65, 0xef, 0xde, 0x17, 0x18, 0x19, 0x19, 0x02, 0xc0, 0xe9, 0x74, 0xb1, 0xf6, 0xec, 0xf3, 0x19, + 0x18, 0xd1, 0x39, 0x70, 0x68, 0x08, 0xab, 0x08, 0xf1, 0x09, 0x16, 0x54, 0x85, 0x71, 0xe9, 0x3a, + 0x52, 0x4a, 0xb2, 0xa6, 0x99, 0x37, 0xd3, 0x33, 0x10, 0x36, 0xf9, 0xe8, 0xba, 0xbc, 0x3c, 0xc5, + 0xe8, 0xe8, 0xe8, 0x29, 0xab, 0x4b, 0x90, 0x4f, 0xc9, 0x02, 0x9a, 0x04, 0xb3, 0x80, 0xf7, 0x0a, + 0x65, 0x36, 0x2e, 0x18, 0xed, 0x86, 0x57, 0x9f, 0x06, 0x60, 0xac, 0x61, 0x09, 0x47, 0x8e, 0x1d, + 0xc7, 0xb2, 0x2c, 0xfc, 0xc1, 0x20, 0x23, 0x23, 0x23, 0xc5, 0x6b, 0x56, 0x15, 0x05, 0x87, 0xae, + 0xa1, 0x64, 0x92, 0x48, 0xbb, 0x13, 0xab, 0xb4, 0x6a, 0xce, 0x2e, 0xee, 0x81, 0xee, 0x83, 0x98, + 0xbe, 0x52, 0x5e, 0x1f, 0x98, 0xe4, 0xd9, 0x67, 0x9f, 0xe5, 0x73, 0x9f, 0xbb, 0x95, 0xf7, 0x5d, + 0x33, 0xc4, 0xcd, 0xef, 0x6b, 0xa0, 0x3c, 0xa4, 0x17, 0x63, 0x12, 0x9f, 0x5b, 0x63, 0xc3, 0xd9, + 0x61, 0xf6, 0xed, 0x8f, 0x92, 0x48, 0x9a, 0x73, 0xc2, 0x13, 0x41, 0x22, 0x9e, 0xce, 0xe3, 0xd6, + 0xf3, 0xd1, 0xec, 0x37, 0x57, 0xc0, 0x1a, 0x46, 0x7b, 0xe5, 0x88, 0xba, 0xb8, 0xb9, 0x6d, 0x11, + 0xba, 0x6e, 0x9f, 0x17, 0xdc, 0x64, 0x32, 0x39, 0xa2, 0x53, 0xc3, 0xa7, 0x0e, 0x7c, 0x8c, 0x69, + 0x0e, 0x1d, 0xdc, 0x83, 0x61, 0x18, 0x05, 0x21, 0xd8, 0x59, 0xb9, 0xe6, 0x2c, 0x7a, 0x07, 0x4c, + 0x46, 0x23, 0xb1, 0xe2, 0xba, 0x7d, 0x4e, 0x3b, 0x67, 0xb5, 0x37, 0xd2, 0x18, 0x2e, 0xa1, 0x3a, + 0xe8, 0xc7, 0xa5, 0x6b, 0xf3, 0x62, 0x36, 0x45, 0x48, 0x9a, 0x9a, 0x6c, 0x74, 0x77, 0x77, 0x21, + 0x4f, 0xe7, 0x42, 0xdc, 0x2e, 0xaa, 0xfd, 0x36, 0x44, 0x6c, 0x12, 0x14, 0x05, 0x9a, 0x97, 0x80, + 0xa6, 0x15, 0xf2, 0x2c, 0x89, 0x3c, 0xf8, 0x2a, 0x24, 0xa6, 0xc9, 0x05, 0xca, 0xe8, 0xee, 0x1d, + 0x44, 0x4a, 0x49, 0x55, 0x45, 0x25, 0x93, 0x93, 0x93, 0x73, 0x36, 0x89, 0x9d, 0x96, 0xc6, 0x7a, + 0xf4, 0x91, 0x5e, 0xb0, 0x3b, 0xa0, 0x71, 0x31, 0xa8, 0x05, 0x25, 0x33, 0x73, 0x28, 0xd3, 0x63, + 0xa0, 0x6a, 0x3c, 0x1e, 0xb7, 0x71, 0xdb, 0xe7, 0xff, 0x9a, 0x8f, 0x7e, 0x44, 0x70, 0xfe, 0xd9, + 0x25, 0xd8, 0x54, 0x51, 0x0c, 0x3a, 0xe5, 0x9c, 0x24, 0x40, 0x55, 0x45, 0x7e, 0x9f, 0x89, 0x99, + 0x90, 0x53, 0xe2, 0xf3, 0xbb, 0x10, 0x38, 0xb1, 0xac, 0x4a, 0xa4, 0x0c, 0xbc, 0xf9, 0x02, 0x5e, + 0x7a, 0xbc, 0xc4, 0xdd, 0xde, 0x67, 0x7d, 0x7e, 0x89, 0xa7, 0x29, 0x54, 0x53, 0xd7, 0x70, 0x62, + 0x2e, 0x8f, 0x61, 0x18, 0x64, 0xb2, 0xd3, 0xa7, 0x44, 0x90, 0x24, 0x30, 0x3e, 0x7e, 0x8c, 0xe9, + 0xe8, 0x54, 0xf1, 0xfd, 0x9a, 0xa6, 0x51, 0x5e, 0xd5, 0x42, 0xe7, 0x91, 0xc1, 0xa2, 0x16, 0x0b, + 0xc0, 0xef, 0xd4, 0x39, 0xa3, 0xb9, 0x9a, 0xd5, 0xcd, 0x35, 0x38, 0x34, 0x75, 0x36, 0x4d, 0x2a, + 0xdc, 0xb8, 0xc6, 0x7a, 0x17, 0x7b, 0x76, 0x6f, 0x26, 0x95, 0x4a, 0xcd, 0x43, 0xbf, 0x66, 0x3e, + 0xd3, 0xe9, 0x74, 0xb2, 0x6e, 0xc5, 0x12, 0x5c, 0x7d, 0x87, 0xf2, 0x1a, 0xd2, 0xb2, 0x1c, 0xaa, + 0x5a, 0x67, 0x17, 0x97, 0x4a, 0xa0, 0x66, 0xd2, 0xc5, 0x80, 0x47, 0x02, 0x36, 0xdd, 0x36, 0x0f, + 0xbc, 0xd0, 0x34, 0x8d, 0x55, 0x2b, 0x57, 0x50, 0x7b, 0x6c, 0x17, 0x18, 0x26, 0xe2, 0xcc, 0xcb, + 0x50, 0x56, 0x9d, 0x5f, 0xf4, 0x13, 0x96, 0xdd, 0x05, 0x99, 0x14, 0xd5, 0x93, 0x3d, 0x7c, 0xe6, + 0xd3, 0xed, 0xac, 0x5f, 0x15, 0x3a, 0xa5, 0x0e, 0x9a, 0xa6, 0xe4, 0xf0, 0x91, 0x18, 0xc1, 0x51, + 0x49, 0xf2, 0xf9, 0x18, 0xb1, 0xce, 0x24, 0x46, 0x2a, 0xbf, 0xda, 0xa0, 0xdf, 0x89, 0x4d, 0x57, + 0x91, 0x18, 0x05, 0x5a, 0xc2, 0x9b, 0x28, 0xe0, 0x65, 0x9b, 0x17, 0x28, 0xcd, 0x7b, 0x2b, 0xbe, + 0x74, 0xc6, 0xa1, 0xd0, 0x95, 0xcb, 0x97, 0xae, 0x16, 0x79, 0xc4, 0x47, 0xcc, 0xcb, 0x72, 0x6c, + 0x36, 0x1b, 0x0e, 0x3d, 0x30, 0x8f, 0xb9, 0x31, 0x2b, 0x64, 0x81, 0x61, 0xa6, 0x98, 0x9c, 0x9a, + 0x9a, 0x2d, 0x1b, 0x02, 0x5e, 0xaf, 0x97, 0x58, 0x2c, 0x83, 0x65, 0xc9, 0xd9, 0x42, 0x84, 0x98, + 0xcd, 0x8c, 0xc5, 0xdc, 0x74, 0xaa, 0x10, 0x4d, 0x57, 0x94, 0xea, 0x94, 0x87, 0xf6, 0x72, 0x6c, + 0xef, 0x2e, 0x8c, 0x89, 0x31, 0xac, 0x54, 0x12, 0xac, 0x42, 0x5a, 0x25, 0x25, 0x8a, 0xa2, 0x70, + 0xde, 0xb9, 0xe7, 0xb0, 0xf6, 0xf8, 0x56, 0x48, 0xc6, 0x90, 0xe1, 0x5a, 0xc4, 0xbb, 0x6e, 0x05, + 0x67, 0x20, 0xcf, 0xca, 0x08, 0x94, 0x61, 0x3a, 0xdc, 0x90, 0x4b, 0x23, 0xc8, 0xa7, 0x46, 0xbd, + 0xbd, 0xbd, 0x38, 0x1c, 0x8e, 0x79, 0xb0, 0xe4, 0xe2, 0xc5, 0x4b, 0xb8, 0x30, 0x98, 0x41, 0x19, + 0x38, 0x82, 0xf4, 0x87, 0xe1, 0x96, 0x7f, 0x43, 0x5c, 0x72, 0x23, 0x62, 0xd9, 0x79, 0x28, 0x6d, + 0xcb, 0x08, 0x3f, 0x7f, 0x3f, 0x9f, 0xbd, 0xea, 0x38, 0x97, 0x5d, 0x54, 0x81, 0xa6, 0x9c, 0x50, + 0xed, 0x2a, 0x5c, 0xef, 0xc0, 0x48, 0x9a, 0x67, 0x9e, 0x19, 0xe4, 0xe2, 0x0f, 0xd4, 0x13, 0x5a, + 0xef, 0xc5, 0x8c, 0x9a, 0x0c, 0xde, 0x13, 0x61, 0x6a, 0x6b, 0x1c, 0x8f, 0xd3, 0x4e, 0x7d, 0x5d, + 0x09, 0x1e, 0xbd, 0x2f, 0xe1, 0xd4, 0x27, 0xfe, 0xa8, 0x12, 0x3e, 0x09, 0xe8, 0x58, 0x76, 0xa3, + 0xee, 0xe9, 0x88, 0xc4, 0x7f, 0xb2, 0xaa, 0xb2, 0xdd, 0x51, 0xdf, 0xd8, 0x34, 0x07, 0x7f, 0x98, + 0xdd, 0xf5, 0x8a, 0x22, 0x18, 0x1d, 0x8d, 0x10, 0x9b, 0x1e, 0x2c, 0xae, 0xf4, 0x44, 0x1c, 0xb9, + 0xa4, 0xb4, 0x91, 0x70, 0xb8, 0xac, 0xf8, 0xff, 0x86, 0x61, 0x32, 0x19, 0xe9, 0xa1, 0xb9, 0xb1, + 0x74, 0xb6, 0xe4, 0x36, 0x83, 0x62, 0x9d, 0x50, 0xa0, 0x97, 0x96, 0x24, 0xd5, 0x9f, 0x65, 0x7a, + 0x73, 0x9c, 0xc6, 0xb8, 0x89, 0xed, 0xf0, 0xd3, 0xa4, 0x76, 0x3f, 0x40, 0x74, 0xd3, 0x6f, 0xc9, + 0x4e, 0x65, 0xb0, 0x97, 0x57, 0xa3, 0x38, 0x5d, 0x05, 0x33, 0xed, 0xc6, 0x2b, 0x53, 0xbc, 0xb0, + 0x75, 0x0f, 0x89, 0xda, 0x76, 0xa8, 0x6d, 0x83, 0xba, 0x36, 0x08, 0x56, 0x20, 0x2e, 0xbb, 0x19, + 0x2a, 0xea, 0x71, 0x76, 0x6e, 0xe7, 0xe6, 0xf6, 0x20, 0x8b, 0x16, 0x2e, 0x64, 0xc7, 0x8e, 0x1d, + 0x3c, 0xf7, 0xec, 0xb3, 0x9c, 0x7d, 0xf6, 0xd9, 0x78, 0x3c, 0x1e, 0x84, 0x10, 0xe8, 0xba, 0x4e, + 0x6d, 0x4d, 0x15, 0xbb, 0xef, 0xbf, 0x97, 0x81, 0xba, 0x25, 0xc8, 0x40, 0x18, 0x71, 0xc6, 0x05, + 0xc8, 0x35, 0x17, 0xe3, 0xeb, 0xdc, 0xc9, 0xe7, 0x9a, 0x7f, 0xc6, 0xf5, 0xd7, 0xd6, 0x62, 0x57, + 0x67, 0xad, 0x8b, 0x9c, 0x53, 0x13, 0x4e, 0x66, 0x2c, 0xee, 0xbe, 0xaf, 0x0b, 0x81, 0xc2, 0x95, + 0xab, 0x2b, 0x61, 0xda, 0xc0, 0xb7, 0xd2, 0x8d, 0x6f, 0xb5, 0x9b, 0x54, 0x57, 0x9a, 0xc4, 0x9e, + 0x14, 0xfe, 0x85, 0x3e, 0xfa, 0x87, 0x0f, 0x4d, 0x4f, 0x87, 0xa7, 0xef, 0x3d, 0xf2, 0x1f, 0xb9, + 0xf8, 0x9b, 0xa6, 0xc1, 0x3e, 0xfb, 0x20, 0x1e, 0x7b, 0x54, 0x96, 0x57, 0x54, 0xcf, 0x31, 0xbf, + 0x62, 0x9e, 0x9f, 0x15, 0x42, 0xa1, 0xb6, 0xb6, 0x01, 0x21, 0x6c, 0xf3, 0x10, 0xa1, 0xfc, 0x6b, + 0x05, 0xb3, 0xac, 0x9e, 0x1c, 0x2c, 0x66, 0xb3, 0x26, 0x86, 0x69, 0xce, 0xde, 0x9c, 0xb9, 0x18, + 0x6e, 0xe1, 0x79, 0x6e, 0xda, 0x64, 0xec, 0xe1, 0x49, 0x92, 0x07, 0x53, 0xf8, 0xcf, 0xf4, 0x50, + 0xf7, 0xfe, 0x30, 0x0d, 0x1f, 0xa9, 0x26, 0x74, 0x59, 0x90, 0x8a, 0xf7, 0x5b, 0x58, 0xc9, 0x7b, + 0x18, 0xbe, 0xe7, 0x9b, 0x98, 0x89, 0x58, 0x11, 0x73, 0xbe, 0xe4, 0x92, 0x8b, 0xf9, 0x68, 0x79, + 0x1c, 0xdf, 0xb6, 0xdf, 0xe4, 0x6f, 0xfd, 0xba, 0x4b, 0xe0, 0xaf, 0x3f, 0x8f, 0x6c, 0x5d, 0x8e, + 0x88, 0x4f, 0xb1, 0xa1, 0x67, 0x0b, 0xeb, 0xd6, 0xae, 0x25, 0x93, 0xc9, 0x70, 0xb8, 0x73, 0x17, + 0xd7, 0x5e, 0x33, 0xcc, 0x0f, 0x7f, 0xf8, 0x1d, 0xa6, 0xa3, 0xd1, 0xa2, 0x16, 0x2f, 0xec, 0xe8, + 0xe0, 0x5f, 0x6e, 0xb8, 0x82, 0x8e, 0x5f, 0x7d, 0x2d, 0x1f, 0x5c, 0x65, 0xd3, 0x84, 0x5e, 0x78, + 0x80, 0xcf, 0x57, 0xdf, 0xc5, 0xfb, 0x6f, 0xa8, 0xc3, 0xa9, 0x8a, 0xa2, 0xad, 0x91, 0x33, 0xf7, + 0x44, 0x4a, 0xd2, 0x39, 0xc9, 0xcf, 0x1f, 0xec, 0xe3, 0x89, 0x27, 0xfb, 0xf9, 0x9b, 0xf7, 0x37, + 0xe1, 0x0b, 0xab, 0x28, 0x9a, 0x00, 0x2b, 0x4f, 0xfe, 0x0b, 0x6e, 0xf0, 0x61, 0xaf, 0xb6, 0xe1, + 0x3a, 0x0e, 0xcb, 0x1c, 0xa5, 0x35, 0xb5, 0xc3, 0xe9, 0xc7, 0x57, 0x75, 0xeb, 0xa5, 0x6f, 0x9e, + 0x0f, 0x9e, 0x45, 0xfd, 0x4f, 0x9d, 0x95, 0x16, 0xa0, 0xca, 0xaa, 0xea, 0x6a, 0x42, 0x25, 0xcd, + 0xf3, 0xaa, 0x2f, 0x30, 0xc3, 0xa2, 0xd0, 0xf1, 0xcf, 0xa1, 0x22, 0xe5, 0xcd, 0xba, 0x46, 0x3a, + 0xa3, 0x30, 0x19, 0x4d, 0x16, 0x80, 0x92, 0xf9, 0xc1, 0x99, 0x94, 0x92, 0xcc, 0xb8, 0x41, 0xe4, + 0xd7, 0x93, 0x78, 0x56, 0xb9, 0x09, 0x6c, 0xf0, 0xa1, 0x87, 0x34, 0x84, 0x02, 0x46, 0xd2, 0x62, + 0x6a, 0x73, 0x1c, 0x2b, 0x6d, 0x51, 0x7a, 0x49, 0x08, 0x69, 0xec, 0x20, 0xdd, 0x77, 0x3c, 0x0f, + 0x6e, 0x08, 0x81, 0xdb, 0xed, 0xe6, 0xef, 0x3f, 0xfc, 0x21, 0xbe, 0x52, 0x9f, 0x66, 0xe1, 0x23, + 0xdf, 0x82, 0x9e, 0x43, 0x90, 0x98, 0x86, 0xc1, 0x2e, 0xd6, 0x6e, 0xfc, 0x31, 0xff, 0xe7, 0xa6, + 0xab, 0xa8, 0xa9, 0xa9, 0xa1, 0xa7, 0xa7, 0x07, 0x4d, 0xdd, 0xc9, 0x5f, 0x9d, 0x13, 0x62, 0xd9, + 0x92, 0x17, 0xb9, 0xf3, 0x5b, 0xdf, 0x60, 0x6c, 0x2c, 0x52, 0xdc, 0x28, 0x17, 0x5e, 0x78, 0x01, + 0xdf, 0xfe, 0x87, 0xeb, 0xb9, 0xf0, 0xd1, 0x2f, 0x51, 0x75, 0xe7, 0xfb, 0xf9, 0xe2, 0xe2, 0x5f, + 0xf1, 0xb7, 0x37, 0xd6, 0xe3, 0xb2, 0xcd, 0x87, 0x67, 0x45, 0x9e, 0x52, 0xc9, 0x74, 0xda, 0xe2, + 0xee, 0x9f, 0xf5, 0x70, 0xe7, 0xb7, 0x0f, 0xf2, 0xc9, 0x8f, 0x2f, 0x62, 0x51, 0x9b, 0x17, 0x47, + 0xa5, 0x8e, 0xea, 0x57, 0xc9, 0x45, 0x0d, 0x8c, 0x84, 0xc5, 0xe8, 0x03, 0x13, 0xb8, 0x1a, 0x1c, + 0x58, 0xfd, 0x26, 0x8b, 0x6b, 0x6b, 0x68, 0x3f, 0xec, 0x58, 0xbe, 0xe0, 0xa8, 0xe3, 0xc6, 0xc5, + 0xc7, 0x83, 0xea, 0x9b, 0x62, 0xa2, 0xdb, 0x6f, 0xf2, 0xd9, 0x43, 0x93, 0xea, 0xc7, 0x4a, 0x0d, + 0xbf, 0xb3, 0xbc, 0xaa, 0xfa, 0xa4, 0x20, 0xaa, 0xb8, 0x33, 0x14, 0x85, 0x50, 0x30, 0xcc, 0xf0, + 0xf0, 0x08, 0x86, 0x11, 0xcb, 0xfb, 0xd2, 0xc2, 0xc6, 0xa8, 0xa8, 0x58, 0x42, 0x7b, 0xfb, 0x22, + 0x14, 0xb5, 0x50, 0x25, 0x2a, 0x14, 0xc8, 0x47, 0x46, 0xc6, 0x98, 0x8e, 0x8e, 0x51, 0x57, 0x53, + 0x82, 0x22, 0xe6, 0x9f, 0x37, 0x37, 0x6d, 0x12, 0x79, 0x68, 0x92, 0xc0, 0xf9, 0x3e, 0x62, 0x7b, + 0x92, 0x24, 0x5f, 0x4f, 0xe3, 0x5e, 0xe8, 0xc8, 0xbb, 0x04, 0x4d, 0xc1, 0xb7, 0xd2, 0x8d, 0xe6, + 0x55, 0x51, 0x6c, 0x0a, 0xd9, 0xf1, 0x1c, 0xaa, 0x67, 0x3d, 0xf6, 0x8a, 0xba, 0xa2, 0x0b, 0xd0, + 0x75, 0x9d, 0x15, 0xcb, 0x97, 0x73, 0xfe, 0xc2, 0x3a, 0x96, 0xf4, 0x6d, 0xa3, 0x61, 0xe7, 0x93, + 0x5c, 0xe5, 0x9c, 0xe0, 0x93, 0x7f, 0xfd, 0x1e, 0x56, 0xad, 0x5a, 0x45, 0x3a, 0x9d, 0xe6, 0x47, + 0x3f, 0xfc, 0x1e, 0x97, 0x5d, 0x32, 0x4c, 0x7d, 0xa5, 0x83, 0xe6, 0x46, 0x0f, 0x39, 0xa3, 0x93, + 0x1f, 0xff, 0x78, 0x27, 0x75, 0xf5, 0x2d, 0x84, 0x42, 0x21, 0x14, 0x45, 0x41, 0x51, 0x04, 0x9d, + 0x07, 0x77, 0xf0, 0x91, 0xeb, 0x46, 0x79, 0xcf, 0x3b, 0x6b, 0x70, 0x68, 0x4a, 0x5e, 0x73, 0xe7, + 0x38, 0x5d, 0x0b, 0xc9, 0xb1, 0xfe, 0x14, 0x5f, 0xfa, 0xca, 0x01, 0x1e, 0xb9, 0xbf, 0x9b, 0x2f, + 0x7e, 0x79, 0x05, 0x97, 0x5d, 0x58, 0x51, 0x28, 0x3c, 0x40, 0x6c, 0x6f, 0x02, 0x33, 0x66, 0xe2, + 0xac, 0xd3, 0x11, 0x4e, 0x05, 0xbd, 0xcc, 0x46, 0xaa, 0x2f, 0x83, 0xaf, 0xca, 0x45, 0x2a, 0x9b, + 0x53, 0x86, 0x8d, 0xd8, 0x86, 0xc9, 0x80, 0xf9, 0xe3, 0xde, 0xef, 0xe4, 0x62, 0x7f, 0xf4, 0x6a, + 0x92, 0x62, 0xb8, 0x13, 0x29, 0x2d, 0x75, 0x4f, 0xd7, 0xf1, 0x9d, 0x1f, 0xab, 0xa9, 0x6f, 0xa4, + 0xb4, 0x34, 0x7c, 0x42, 0x10, 0x35, 0xab, 0xc9, 0x81, 0x60, 0x88, 0x0d, 0x1b, 0x2e, 0x63, 0xcf, + 0x9e, 0x6d, 0x44, 0x22, 0xdd, 0x48, 0x69, 0x52, 0x12, 0x6a, 0x60, 0xe5, 0xaa, 0x75, 0x68, 0x9a, + 0x36, 0x4f, 0xff, 0x15, 0x55, 0xa5, 0xb5, 0x7d, 0x21, 0xaf, 0x6d, 0x79, 0x8a, 0xa1, 0xd1, 0x28, + 0xd5, 0x15, 0xb3, 0x1a, 0x6e, 0x99, 0x92, 0xc9, 0x17, 0xa6, 0x71, 0xaf, 0x76, 0xe1, 0xaa, 0xb3, + 0xa3, 0x28, 0x02, 0x2d, 0xa4, 0x21, 0x14, 0x41, 0x74, 0x5b, 0x82, 0xc4, 0x81, 0x14, 0x15, 0xd7, + 0x95, 0xa0, 0xa8, 0x05, 0xef, 0x67, 0xd9, 0x51, 0xbc, 0x81, 0x79, 0x06, 0x66, 0x26, 0x22, 0xee, + 0xe8, 0xe8, 0x60, 0x41, 0x47, 0x07, 0xb2, 0x00, 0x2b, 0x02, 0xe4, 0x72, 0x39, 0x1e, 0x7b, 0xf4, + 0x51, 0x4a, 0x42, 0xcf, 0xb2, 0xa4, 0xa3, 0xba, 0x90, 0x67, 0xc3, 0x05, 0x1b, 0x4a, 0x28, 0x0f, + 0xf7, 0xf1, 0x9d, 0x6f, 0xdf, 0xcc, 0xe2, 0xa5, 0x37, 0x50, 0x57, 0x57, 0xcb, 0xc6, 0xdf, 0xfd, + 0x80, 0x9b, 0x6f, 0xc8, 0xb2, 0x62, 0x51, 0x05, 0x0a, 0x32, 0xcf, 0xd3, 0x2e, 0xd6, 0x7c, 0x25, + 0xa9, 0x9c, 0xe4, 0xc5, 0x97, 0xc7, 0xf8, 0xf2, 0xbf, 0xed, 0xa7, 0x34, 0xa4, 0x73, 0xfb, 0xfb, + 0x16, 0xb2, 0xae, 0x3d, 0x88, 0x25, 0x25, 0xdb, 0x77, 0x45, 0x89, 0x46, 0x73, 0xb4, 0xb4, 0x79, + 0xa9, 0xab, 0xcc, 0x6f, 0x4e, 0x77, 0x8b, 0xa3, 0x40, 0x2c, 0x04, 0x15, 0x41, 0x73, 0x53, 0x25, + 0x95, 0x5b, 0xfb, 0x94, 0xca, 0x90, 0xbd, 0x0e, 0x18, 0xfc, 0xa3, 0x6b, 0xf0, 0xc1, 0x7b, 0xe2, + 0xb2, 0xed, 0x16, 0xed, 0x98, 0x23, 0x9d, 0xbc, 0x21, 0x3d, 0x10, 0x73, 0x54, 0x54, 0xd6, 0xa2, + 0xeb, 0x8e, 0xa2, 0x39, 0x3c, 0x31, 0x67, 0xb2, 0xdb, 0x1d, 0xd4, 0xd7, 0x35, 0xd1, 0xd0, 0xd8, + 0x41, 0x73, 0xd3, 0x62, 0x9a, 0x5b, 0x3b, 0x70, 0x38, 0x1c, 0xf3, 0x02, 0xb3, 0x99, 0xc3, 0xe9, + 0x72, 0xa3, 0xa8, 0x0e, 0x0e, 0x1d, 0xdc, 0x4f, 0x5d, 0x5d, 0x29, 0xba, 0x4d, 0x05, 0x09, 0x99, + 0x31, 0x83, 0xd8, 0xd6, 0x04, 0x25, 0x17, 0xfb, 0x51, 0x34, 0x81, 0x2d, 0xa0, 0xa1, 0xda, 0x0a, + 0x55, 0x27, 0x87, 0x82, 0xd6, 0xea, 0x64, 0x34, 0x95, 0xa3, 0xab, 0x37, 0x89, 0xdf, 0xa6, 0xb2, + 0xf5, 0x91, 0x71, 0x5e, 0x57, 0x1a, 0xa8, 0xae, 0xa9, 0xc1, 0x6e, 0xb7, 0x9f, 0x44, 0xb9, 0x99, + 0xfb, 0x7b, 0x32, 0x99, 0xe4, 0xa1, 0x87, 0x1e, 0xe2, 0xc8, 0xe1, 0x3b, 0xf9, 0xc0, 0x4d, 0xd5, + 0x78, 0x1c, 0xca, 0x9c, 0x1a, 0x35, 0x94, 0x97, 0xd9, 0x59, 0xb6, 0xdc, 0xc5, 0x4f, 0x7f, 0xfa, + 0x08, 0x5e, 0xf7, 0x6b, 0x7c, 0xf8, 0x83, 0x41, 0x9a, 0x6b, 0x9d, 0x45, 0xdf, 0x25, 0xc8, 0x17, + 0x13, 0x0c, 0x4b, 0x72, 0xb4, 0x27, 0xc9, 0x1d, 0x77, 0x76, 0x72, 0xd7, 0x0f, 0x8e, 0x70, 0xd3, + 0x0d, 0xcd, 0x7c, 0xea, 0x1f, 0x17, 0xb2, 0xf0, 0x9c, 0x20, 0xb9, 0x51, 0x03, 0x5b, 0x48, 0x23, + 0x63, 0xc0, 0xbf, 0x7f, 0xf7, 0x30, 0x0f, 0x3f, 0xd2, 0x8f, 0x4d, 0xd7, 0x68, 0x6e, 0xf6, 0x60, + 0x53, 0x04, 0x58, 0x92, 0xd8, 0xf6, 0x04, 0x9e, 0x45, 0x2e, 0x6c, 0x1e, 0x8d, 0xee, 0xce, 0x31, + 0x75, 0xc4, 0xa6, 0xf5, 0xed, 0xbe, 0x3f, 0xf9, 0xc2, 0x9b, 0x52, 0x2e, 0xb4, 0x7d, 0xce, 0x98, + 0xcc, 0xf8, 0xcc, 0x63, 0x9e, 0x91, 0xf1, 0xb7, 0x8e, 0x1d, 0x19, 0xb2, 0xb9, 0x3d, 0x01, 0xbc, + 0x3e, 0xff, 0x1c, 0x33, 0x3c, 0x1f, 0x86, 0x13, 0x05, 0xf2, 0x9d, 0xae, 0xdb, 0xe7, 0x60, 0xd6, + 0xe2, 0x14, 0xbe, 0x5b, 0x10, 0x08, 0x84, 0x98, 0x9c, 0xca, 0x32, 0x3c, 0xd4, 0x4b, 0x6d, 0x4d, + 0x09, 0x8a, 0x10, 0xc4, 0xf7, 0xa7, 0x10, 0x1e, 0x05, 0x77, 0x9b, 0xb3, 0x40, 0xf3, 0x99, 0x8d, + 0x01, 0xba, 0xc6, 0xb3, 0x7c, 0xed, 0x3b, 0x87, 0xd8, 0xfa, 0xea, 0x38, 0xcb, 0x96, 0x85, 0xa8, + 0x0c, 0xeb, 0xf8, 0x3b, 0xec, 0xbc, 0xbc, 0xfd, 0x19, 0xee, 0xbe, 0x7b, 0x33, 0x52, 0x6a, 0x84, + 0x42, 0x21, 0x34, 0x4d, 0x43, 0x55, 0xd5, 0x02, 0xa2, 0x66, 0x31, 0x3d, 0x3d, 0xcd, 0xf6, 0xed, + 0xdb, 0xf9, 0xf7, 0x7f, 0xbf, 0x9d, 0xd2, 0x92, 0xc7, 0xf9, 0xc0, 0x4d, 0x35, 0xf8, 0x5c, 0xf3, + 0x97, 0x6b, 0x4a, 0xd8, 0xd7, 0x19, 0xe3, 0x57, 0x0f, 0xf7, 0x71, 0xd3, 0x0d, 0x8d, 0x5c, 0x72, + 0x7e, 0x39, 0x6e, 0xbb, 0x3a, 0x0f, 0xbc, 0x30, 0x10, 0x74, 0x0d, 0xa4, 0xf9, 0xc1, 0xdd, 0xc7, + 0xf8, 0xca, 0xbf, 0x1d, 0xa0, 0xa5, 0xd5, 0xc7, 0x97, 0x6e, 0x5b, 0xce, 0x45, 0xe7, 0x95, 0xe1, + 0x71, 0xaa, 0x28, 0x8a, 0xc0, 0x5e, 0xa6, 0x21, 0x85, 0x60, 0xc7, 0x9e, 0x29, 0xf6, 0xee, 0x9b, + 0xe4, 0x9b, 0xdf, 0x58, 0x85, 0xc3, 0x99, 0xdf, 0x48, 0x3e, 0x8f, 0x46, 0x7a, 0xd8, 0x20, 0x75, + 0x2c, 0x83, 0x7f, 0x8d, 0x1b, 0x0b, 0xc9, 0xd1, 0xe3, 0xfd, 0x0c, 0x05, 0xc6, 0x9f, 0xdf, 0xfe, + 0x53, 0x5e, 0xf8, 0xa3, 0x9b, 0x68, 0x80, 0xed, 0xcd, 0x96, 0xdc, 0x0e, 0x0f, 0xe6, 0x5e, 0x0d, + 0xb1, 0xfc, 0x70, 0xec, 0xae, 0xf8, 0x8b, 0xbf, 0x08, 0x35, 0xb7, 0x9c, 0xc5, 0x8a, 0x33, 0xd6, + 0xa2, 0xaa, 0xda, 0x29, 0x7d, 0xf2, 0x1b, 0x51, 0x69, 0xe6, 0xbd, 0x4f, 0x51, 0x58, 0xb4, 0x74, + 0x19, 0x5b, 0x36, 0x8f, 0x73, 0xa4, 0x6b, 0x8c, 0x05, 0xcd, 0x65, 0x64, 0x86, 0x73, 0x68, 0x01, + 0x75, 0x1e, 0x58, 0x02, 0xd0, 0x3b, 0x92, 0xe6, 0x5b, 0xdf, 0x3e, 0x48, 0x22, 0x61, 0x72, 0xc1, + 0x05, 0x95, 0x74, 0xb4, 0x79, 0xd0, 0x54, 0x41, 0x79, 0xa5, 0xc2, 0x3f, 0xdc, 0xd2, 0xc4, 0xe0, + 0x68, 0x86, 0x17, 0x5e, 0xfc, 0x3a, 0xb7, 0x7d, 0xee, 0x5f, 0x98, 0x8a, 0x56, 0x63, 0x77, 0x54, + 0x20, 0xa5, 0xc0, 0x34, 0x52, 0x98, 0xc6, 0x61, 0xd6, 0xad, 0x57, 0xb9, 0xf5, 0xc3, 0x95, 0x34, + 0xd5, 0xd4, 0xe6, 0x3b, 0x27, 0x4e, 0xe0, 0x5b, 0x8f, 0x46, 0x32, 0x24, 0xe2, 0x06, 0x1f, 0xfb, + 0x48, 0x2b, 0x4e, 0x4d, 0x14, 0xab, 0x1d, 0x12, 0x48, 0x1b, 0x92, 0xa3, 0xdd, 0x29, 0xee, 0xbe, + 0xe7, 0x18, 0x9b, 0x5f, 0x1c, 0xe6, 0x92, 0x4b, 0xaa, 0xb8, 0xfb, 0x47, 0xeb, 0x69, 0x6f, 0xf6, + 0xe4, 0x69, 0xbe, 0x85, 0x6d, 0x20, 0x05, 0xe4, 0x0c, 0xc9, 0xc6, 0xcd, 0x11, 0x3e, 0xfe, 0xf1, + 0xd7, 0x38, 0xe3, 0x8c, 0x52, 0xdc, 0x0e, 0x85, 0x55, 0x0b, 0x7d, 0x58, 0x59, 0x49, 0xaa, 0x37, + 0xc3, 0xc4, 0x33, 0x51, 0xc2, 0x57, 0x86, 0x0a, 0x2e, 0xc6, 0x42, 0x5a, 0x52, 0x98, 0xa6, 0x7c, + 0xf3, 0x19, 0x1d, 0x8f, 0xae, 0x1d, 0x7f, 0x30, 0xfd, 0x7c, 0xd9, 0xe6, 0xf6, 0x4c, 0xc3, 0x13, + 0xf2, 0xf0, 0xee, 0x55, 0x81, 0x40, 0x09, 0x2d, 0x6d, 0x0b, 0xfe, 0x47, 0x70, 0xaa, 0x10, 0x02, + 0x9b, 0x4d, 0x67, 0xe5, 0x9a, 0xb3, 0xd9, 0xb1, 0xe5, 0x69, 0x2a, 0x2b, 0xfc, 0x28, 0x1e, 0x85, + 0xcc, 0x40, 0xb6, 0xd0, 0xde, 0x23, 0x11, 0x32, 0xef, 0xf3, 0x42, 0x3e, 0x1b, 0x5f, 0xfe, 0xc2, + 0x52, 0x7a, 0xfa, 0x53, 0x5c, 0x77, 0xfd, 0x66, 0x76, 0xec, 0x88, 0xf0, 0xc1, 0xbf, 0x6d, 0xa5, + 0xa9, 0xde, 0x85, 0x66, 0x49, 0xaa, 0x4b, 0x75, 0xae, 0xbd, 0xaa, 0x96, 0xab, 0xaf, 0x82, 0x64, + 0xda, 0x64, 0x7c, 0x6a, 0x0a, 0xc3, 0x04, 0xb7, 0x4b, 0x21, 0xe4, 0x6b, 0x45, 0xd7, 0x44, 0xbe, + 0x04, 0x79, 0x42, 0x4b, 0xcc, 0x4c, 0x3a, 0x57, 0x55, 0xe6, 0xa0, 0xaa, 0xcc, 0x51, 0xcc, 0x04, + 0x72, 0x08, 0xc6, 0xc6, 0x32, 0x6c, 0x79, 0x2d, 0xc2, 0xaf, 0x7e, 0xd5, 0x8b, 0x04, 0xde, 0x7a, + 0x69, 0x35, 0x1f, 0xfb, 0x48, 0x3b, 0x55, 0xe5, 0x76, 0x14, 0xe6, 0x9e, 0x2b, 0x0f, 0xc6, 0x4c, + 0xc5, 0x4d, 0x7e, 0xf6, 0xcb, 0x1e, 0xbe, 0xfa, 0xc5, 0x7d, 0x9c, 0x61, 0x98, 0x54, 0x97, 0xdb, + 0x71, 0x3b, 0x54, 0xa4, 0x84, 0x74, 0x4f, 0x9a, 0xcc, 0xb8, 0x49, 0xe5, 0xf5, 0xa5, 0xa8, 0xae, + 0x7c, 0x41, 0x24, 0x1e, 0xcb, 0x90, 0x4c, 0x25, 0x8a, 0x01, 0xd9, 0x9b, 0x4e, 0xd9, 0xf9, 0xcd, + 0x79, 0xa3, 0xc3, 0x3c, 0x52, 0x76, 0x91, 0xee, 0xd0, 0x37, 0x97, 0xf5, 0x1e, 0x59, 0xd8, 0xd0, + 0xdc, 0x8c, 0x36, 0x27, 0xff, 0xfd, 0x43, 0x85, 0xec, 0xf1, 0x78, 0xa9, 0x6d, 0x5c, 0xc9, 0xa1, + 0x43, 0x47, 0x59, 0xdc, 0x5a, 0x41, 0xf4, 0xa9, 0x69, 0xa6, 0x17, 0x24, 0xf0, 0xaf, 0x74, 0x83, + 0xc8, 0xa3, 0x5d, 0x1e, 0xa7, 0x8a, 0x40, 0xd2, 0xd6, 0xe8, 0xe1, 0xda, 0x6b, 0x9a, 0x79, 0xf2, + 0xeb, 0xaf, 0xb3, 0xed, 0x89, 0x7e, 0xce, 0x7d, 0x4f, 0x23, 0xd7, 0x5d, 0xd7, 0x40, 0x7d, 0xb5, + 0x13, 0x5d, 0xcd, 0xe7, 0x7a, 0x1e, 0xbb, 0x82, 0xa7, 0xdc, 0x3e, 0x2f, 0xbf, 0x16, 0xf2, 0x84, + 0xb2, 0xce, 0x09, 0x00, 0xc5, 0x8c, 0x06, 0x4a, 0x60, 0xf7, 0xfe, 0x18, 0x8f, 0x3d, 0x39, 0x40, + 0x3a, 0x63, 0x72, 0xc6, 0xaa, 0x52, 0xbe, 0xfa, 0xd5, 0x95, 0x54, 0x96, 0x39, 0xd0, 0x0a, 0x65, + 0xcd, 0xb9, 0xd7, 0x2e, 0xa5, 0x24, 0x63, 0x4a, 0x76, 0x1f, 0x98, 0xe6, 0x2b, 0x5f, 0xd9, 0xcf, + 0xee, 0x8d, 0xa3, 0x5c, 0xee, 0x05, 0xbf, 0x53, 0xe4, 0x81, 0xc8, 0x42, 0x86, 0xe0, 0x6a, 0x75, + 0xe2, 0x6a, 0xa1, 0xd8, 0x04, 0x07, 0x90, 0x4c, 0x65, 0x31, 0x4c, 0x43, 0x4a, 0x54, 0xf8, 0x03, + 0xfb, 0xd2, 0x2a, 0xb6, 0xb4, 0xd8, 0xad, 0xb4, 0x29, 0xd4, 0xe6, 0x54, 0x76, 0xa8, 0xee, 0x8d, + 0xdb, 0x54, 0xff, 0x4b, 0xa5, 0x2b, 0xb3, 0xfe, 0xd0, 0x64, 0x24, 0xca, 0x13, 0x13, 0xfb, 0x72, + 0x0b, 0xe3, 0xb1, 0x18, 0x81, 0x60, 0xe8, 0xb4, 0x2c, 0x8b, 0xff, 0xba, 0xb9, 0x96, 0x54, 0xd7, + 0xd6, 0xb0, 0xfb, 0xd5, 0x03, 0xe8, 0xcb, 0x6c, 0x84, 0xde, 0x15, 0x60, 0xfc, 0xfe, 0x49, 0xe2, + 0x5b, 0x12, 0x38, 0x17, 0x38, 0x40, 0x05, 0xcd, 0xa7, 0xe2, 0x5d, 0xea, 0x42, 0xb7, 0x09, 0xae, + 0x7a, 0x67, 0x2d, 0x1b, 0x1f, 0xeb, 0x61, 0x6d, 0x6f, 0x82, 0xc8, 0x0f, 0x3b, 0xb9, 0xf9, 0x07, + 0x47, 0x68, 0x3a, 0xbf, 0x92, 0x2b, 0xdf, 0x55, 0xcf, 0xaa, 0xe5, 0x41, 0x2a, 0x4a, 0x6d, 0xb3, + 0x1a, 0x3b, 0x8b, 0xbb, 0xcd, 0x14, 0xa0, 0xe7, 0xd7, 0x68, 0xe7, 0x3e, 0x2f, 0xfc, 0xba, 0xa0, + 0xdd, 0xcb, 0xb2, 0xe5, 0x8b, 0xf2, 0xcf, 0x0d, 0x13, 0x61, 0x49, 0x90, 0x79, 0xe1, 0xca, 0xbc, + 0x63, 0x07, 0x21, 0x48, 0x66, 0x2d, 0x5e, 0x3f, 0x12, 0xe3, 0x27, 0xf7, 0x1d, 0xe3, 0xfe, 0xfb, + 0x7a, 0xe8, 0x30, 0x24, 0xd7, 0x86, 0x04, 0x21, 0x45, 0x32, 0x6a, 0x0a, 0x42, 0x41, 0x17, 0x8a, + 0x32, 0x0b, 0x77, 0xcd, 0xd0, 0x79, 0x84, 0xcc, 0x37, 0xb4, 0xa5, 0xd3, 0x39, 0x0c, 0xc3, 0x25, + 0x52, 0x99, 0x80, 0x80, 0x5e, 0x2a, 0xba, 0x9c, 0xee, 0xec, 0xae, 0x92, 0x0b, 0x8c, 0xd7, 0x7d, + 0x8b, 0xf5, 0x80, 0xba, 0x4b, 0xa9, 0x9b, 0xdc, 0x34, 0xfa, 0xb6, 0xfe, 0x79, 0x35, 0xd2, 0x8a, + 0x83, 0x65, 0x81, 0xd4, 0x93, 0xaa, 0xdf, 0x0c, 0xba, 0xde, 0x1d, 0x1f, 0x88, 0xb8, 0xa6, 0xb6, + 0xd8, 0x3e, 0x6c, 0xe5, 0x54, 0xbf, 0x1e, 0x19, 0xfb, 0x51, 0xe9, 0x21, 0x3e, 0x1b, 0x59, 0xc0, + 0xf8, 0xff, 0x48, 0xc0, 0x89, 0x68, 0x0b, 0xf1, 0xa8, 0x20, 0x9d, 0x9e, 0x24, 0x12, 0x19, 0x3b, + 0xa5, 0x80, 0xa5, 0x94, 0x85, 0x0e, 0x83, 0x38, 0x1e, 0x8f, 0xef, 0x24, 0x5a, 0xed, 0x29, 0x19, + 0x23, 0x76, 0x07, 0x0e, 0x77, 0x39, 0xa9, 0x6c, 0x8e, 0xe0, 0x99, 0x5e, 0xbc, 0x8b, 0x9c, 0xa4, + 0x7b, 0xb2, 0x48, 0x53, 0xa2, 0xb8, 0x14, 0x1c, 0xb5, 0x76, 0x94, 0x42, 0x34, 0xdd, 0x58, 0xe3, + 0xe4, 0xbd, 0x37, 0xb5, 0xf2, 0xf8, 0x3f, 0xef, 0xe2, 0x6c, 0x17, 0x34, 0x09, 0x8b, 0xe1, 0xe7, + 0x07, 0xf9, 0xde, 0x53, 0xfd, 0x8c, 0x86, 0xed, 0x9c, 0x71, 0x4e, 0x39, 0xe7, 0x9c, 0x5d, 0xc6, + 0x9a, 0x55, 0x21, 0x6a, 0xaa, 0x9d, 0x38, 0xed, 0x2a, 0xaa, 0x22, 0x39, 0x55, 0x5b, 0xd1, 0x49, + 0x29, 0x1f, 0xe0, 0xd2, 0x80, 0x9c, 0x55, 0xa0, 0x95, 0x09, 0x66, 0x08, 0x63, 0x16, 0x12, 0x53, + 0x42, 0x74, 0xda, 0x60, 0xdb, 0xce, 0x49, 0x1e, 0x7c, 0xa8, 0x97, 0xa7, 0x9f, 0x1a, 0x20, 0x1c, + 0xb5, 0xb8, 0xd2, 0x07, 0x2d, 0xbe, 0xd9, 0xc0, 0x33, 0x21, 0x25, 0x8d, 0x41, 0x0d, 0x55, 0x9d, + 0x5f, 0x65, 0x9a, 0x81, 0x62, 0x05, 0xa0, 0xeb, 0x1a, 0x59, 0x6f, 0x26, 0x93, 0x0e, 0x24, 0x9f, + 0x2e, 0xdb, 0xec, 0xbb, 0x2a, 0xfd, 0x2b, 0xf3, 0xab, 0xde, 0xa7, 0xb4, 0xa6, 0xba, 0x5c, 0xa9, + 0x98, 0xd4, 0xa6, 0xac, 0x81, 0x35, 0xb9, 0x23, 0xa1, 0x27, 0x7c, 0x37, 0x2b, 0x65, 0x99, 0xbd, + 0x96, 0x21, 0xcf, 0x66, 0x54, 0xf9, 0xa4, 0xf3, 0x2e, 0x73, 0xd1, 0x9a, 0x29, 0x57, 0xd9, 0xe2, + 0x4a, 0xbb, 0xb2, 0x74, 0xe1, 0x42, 0x3c, 0x5e, 0x81, 0x85, 0x64, 0xf3, 0x76, 0xf9, 0xa1, 0xfb, + 0x8c, 0xc1, 0x55, 0xa5, 0x3b, 0xd5, 0x73, 0x23, 0x2b, 0xa3, 0x99, 0x3f, 0x58, 0xc0, 0x5b, 0xce, + 0x3b, 0x24, 0x2f, 0xde, 0x58, 0xf3, 0xdd, 0x89, 0x70, 0xea, 0x9a, 0xe3, 0x47, 0xf6, 0xd5, 0xd6, + 0xd6, 0x35, 0xcc, 0x4b, 0x4f, 0xf2, 0xfc, 0x28, 0x83, 0x9d, 0x3b, 0xb7, 0xd0, 0xdb, 0xb3, 0x93, + 0xea, 0x9a, 0xa5, 0xac, 0x3e, 0xe3, 0x6c, 0x6c, 0xba, 0xfe, 0x7b, 0x89, 0xe5, 0x6e, 0x6f, 0x80, + 0x44, 0x2c, 0x8a, 0xdf, 0x65, 0xc7, 0xe6, 0xd7, 0xb0, 0x2d, 0xd5, 0x4e, 0xf9, 0x3e, 0x15, 0xc9, + 0x65, 0x17, 0x55, 0xf2, 0xf0, 0x43, 0x3d, 0x0c, 0xef, 0x9b, 0xa0, 0x42, 0x17, 0x54, 0xe8, 0x92, + 0x4a, 0x9b, 0x42, 0x3a, 0x9b, 0xa5, 0xff, 0xc9, 0x3e, 0xee, 0xfb, 0x75, 0x1f, 0x5f, 0xd3, 0x05, + 0xee, 0x5a, 0x0f, 0xeb, 0xd6, 0x96, 0xb2, 0x7a, 0x4d, 0x88, 0xc5, 0x8b, 0x82, 0x94, 0x97, 0xd9, + 0xf1, 0x7a, 0x34, 0x74, 0x5d, 0x41, 0x11, 0x02, 0x55, 0xcc, 0xd4, 0x66, 0xe5, 0x49, 0xf1, 0x84, + 0x25, 0xf3, 0xd1, 0x75, 0x36, 0x6b, 0x31, 0x39, 0x95, 0xe3, 0xe8, 0xf1, 0x38, 0xbf, 0xf9, 0xcd, + 0x10, 0xbf, 0xf9, 0xed, 0x30, 0xfd, 0x83, 0x12, 0x65, 0x2a, 0xce, 0xe5, 0x41, 0x68, 0x0b, 0xe7, + 0x49, 0xef, 0x32, 0x0f, 0x6b, 0xe5, 0x1b, 0xdb, 0x55, 0x08, 0xf8, 0xed, 0xf3, 0x70, 0xfb, 0xb9, + 0x9b, 0x48, 0x4a, 0x89, 0xcd, 0xa6, 0x21, 0x71, 0xda, 0xf7, 0x0f, 0x65, 0x5f, 0xa8, 0xff, 0xd9, + 0x42, 0xfb, 0xbb, 0xcf, 0xb9, 0x52, 0x5c, 0xfe, 0xdd, 0xcb, 0xa9, 0xab, 0xad, 0x23, 0x1a, 0x8d, + 0x2a, 0x0f, 0xfd, 0xfa, 0xa1, 0xf6, 0xef, 0x3c, 0xfe, 0x9d, 0x17, 0x26, 0x82, 0xc3, 0xc6, 0xfa, + 0x63, 0x6e, 0xc7, 0x45, 0x67, 0x56, 0x88, 0xf3, 0x6f, 0x2e, 0xa3, 0xb9, 0xd1, 0x83, 0x6e, 0x13, + 0x08, 0x2b, 0x5f, 0x84, 0x44, 0xc2, 0xe2, 0x85, 0x21, 0x76, 0x7e, 0x2d, 0xd9, 0xb0, 0xcb, 0x21, + 0x2a, 0x21, 0xda, 0xfd, 0x07, 0x0b, 0x18, 0xa0, 0xb7, 0xd4, 0xea, 0x73, 0xe9, 0xea, 0xed, 0x9e, + 0x43, 0x5d, 0x5f, 0x3f, 0x72, 0xe8, 0xa0, 0xbe, 0x78, 0xd9, 0xf2, 0x39, 0xd8, 0xb3, 0x20, 0x16, + 0x8b, 0x33, 0x34, 0xd8, 0x09, 0x18, 0xf4, 0xf5, 0xee, 0xa4, 0x24, 0x54, 0x49, 0xfb, 0x82, 0x8e, + 0xdf, 0xe7, 0x8d, 0xd1, 0x34, 0x1b, 0x99, 0x9c, 0x39, 0x8f, 0x5a, 0x7b, 0xba, 0xa3, 0xbc, 0x54, + 0xe7, 0xc6, 0x9b, 0x9a, 0xf9, 0xde, 0x27, 0x26, 0xb9, 0x58, 0xe6, 0x49, 0x01, 0x00, 0x76, 0xa0, + 0xc5, 0x21, 0x68, 0x75, 0x40, 0x46, 0xc2, 0xd8, 0x50, 0x8c, 0xfe, 0xfb, 0x63, 0x7c, 0xe7, 0x9e, + 0x2e, 0x22, 0x1a, 0x28, 0x41, 0x1b, 0x75, 0x8d, 0x1e, 0x5a, 0xda, 0x7c, 0x78, 0x3d, 0x1a, 0x75, + 0x75, 0xf9, 0x76, 0x16, 0xa7, 0xd3, 0x86, 0xd7, 0x9b, 0x27, 0x1d, 0x4c, 0x4f, 0x67, 0x49, 0x67, + 0x0c, 0x46, 0x47, 0xd3, 0x8c, 0x8d, 0xa5, 0x39, 0x74, 0x68, 0x9a, 0xae, 0x1e, 0x41, 0xa8, 0xa4, + 0x9e, 0x15, 0xcb, 0xcf, 0xe5, 0x13, 0x9f, 0x3c, 0x1b, 0xc3, 0x30, 0xb8, 0xfd, 0x73, 0x9f, 0xa5, + 0xd2, 0x1c, 0x2c, 0xd2, 0x65, 0xe7, 0x6a, 0x6a, 0x5c, 0x0a, 0xfc, 0x7e, 0x35, 0x1f, 0x8c, 0x9d, + 0x66, 0x35, 0x7e, 0xbf, 0x13, 0x7f, 0xda, 0xc6, 0xa5, 0x87, 0xde, 0xe5, 0x78, 0xff, 0xd7, 0x3e, + 0x42, 0x5b, 0x6b, 0x5b, 0x91, 0x7f, 0xed, 0x72, 0xb9, 0xb8, 0xe5, 0x83, 0xb7, 0x50, 0xfe, 0x70, + 0x99, 0xed, 0xb1, 0xc7, 0x6e, 0xb3, 0xfd, 0xdb, 0xd7, 0x5b, 0xa8, 0x0e, 0xdb, 0x91, 0x12, 0xb2, + 0x86, 0x64, 0x6c, 0x22, 0xc7, 0xf0, 0x70, 0x9a, 0x89, 0xa9, 0x0c, 0x4b, 0x17, 0xfa, 0x28, 0x0b, + 0xdb, 0x59, 0x12, 0x2e, 0x29, 0xd9, 0xd7, 0x9b, 0x5e, 0x0d, 0xfc, 0xcf, 0x04, 0x7c, 0x70, 0xf9, + 0xa0, 0xa5, 0xf7, 0xb8, 0xbe, 0x1f, 0xb0, 0x9c, 0xef, 0xf5, 0xed, 0xdd, 0x72, 0x66, 0x79, 0x45, + 0x25, 0x65, 0x15, 0x15, 0xa4, 0xd3, 0x06, 0xa3, 0xa3, 0x71, 0x62, 0xd3, 0xa3, 0xe4, 0x72, 0x89, + 0x22, 0x20, 0xd2, 0xdf, 0x7f, 0x94, 0xd6, 0xb6, 0xf6, 0x62, 0x6e, 0xfa, 0x06, 0x11, 0x17, 0x53, + 0xd1, 0x24, 0xb2, 0x36, 0x54, 0xf4, 0x9f, 0x9c, 0x32, 0x0d, 0x03, 0x55, 0x11, 0x9c, 0xbb, 0xa1, + 0x8c, 0xc7, 0xce, 0xab, 0xa4, 0x7f, 0xd3, 0x20, 0x0d, 0xf6, 0x59, 0x3f, 0x9b, 0xdf, 0xd5, 0x02, + 0x9b, 0x90, 0x54, 0xdb, 0x04, 0x35, 0x36, 0xc9, 0x5a, 0x20, 0x27, 0x05, 0x69, 0x33, 0x47, 0xe7, + 0xbe, 0x49, 0x5e, 0x1c, 0x2e, 0xe1, 0x7d, 0xd7, 0x5d, 0xc7, 0x74, 0x5c, 0xb0, 0xef, 0x40, 0x37, + 0xa6, 0x69, 0x92, 0x4e, 0xa7, 0x89, 0x44, 0xc6, 0xd8, 0xbb, 0xf7, 0x10, 0xda, 0x78, 0x84, 0x6a, + 0x1b, 0x58, 0x42, 0x90, 0x69, 0x5a, 0xc8, 0xdd, 0x77, 0x7f, 0x8f, 0x05, 0x0b, 0xda, 0x09, 0x04, + 0x02, 0xa8, 0xaa, 0x4a, 0x77, 0x77, 0x37, 0xf7, 0x36, 0x36, 0x31, 0x75, 0x70, 0x90, 0x80, 0x9a, + 0x1f, 0x45, 0x31, 0x53, 0x82, 0x90, 0x12, 0x92, 0x42, 0xa0, 0x69, 0x73, 0x3a, 0x29, 0xe7, 0xd6, + 0xb0, 0x67, 0x2c, 0x96, 0x53, 0xa7, 0xa6, 0xa6, 0x82, 0x8b, 0x2e, 0xbb, 0x9a, 0xc6, 0xa6, 0x76, + 0xc4, 0x9c, 0x08, 0x6e, 0x06, 0x8d, 0xbb, 0xfc, 0xf2, 0x2b, 0x38, 0x78, 0xf0, 0x00, 0x3b, 0x76, + 0x6c, 0x62, 0xa2, 0xd1, 0xc3, 0x6f, 0x37, 0x0e, 0xf1, 0xf2, 0xf6, 0x71, 0x8e, 0xeb, 0xb9, 0x5c, + 0xc4, 0x19, 0x55, 0x3f, 0xb5, 0xa8, 0x43, 0x59, 0xbf, 0x2a, 0x84, 0xcd, 0xa6, 0xd0, 0x50, 0xad, + 0x69, 0xb2, 0x34, 0xf3, 0xae, 0xf2, 0x43, 0x55, 0x0f, 0x8f, 0x2c, 0x18, 0x34, 0xfe, 0x60, 0x01, + 0x03, 0xec, 0xa9, 0x4f, 0x66, 0x3a, 0x5e, 0x09, 0xbf, 0x33, 0x6a, 0x33, 0x9e, 0xd9, 0xb5, 0x6d, + 0xf3, 0x8a, 0xb4, 0xd1, 0xce, 0x7f, 0xfe, 0xe7, 0x4e, 0xa6, 0xa6, 0x6c, 0x64, 0x32, 0x71, 0x4a, + 0x4a, 0x92, 0xac, 0x5d, 0xa7, 0xd1, 0xdc, 0x24, 0x48, 0xc4, 0x27, 0xc8, 0x65, 0xb3, 0x28, 0x0e, + 0xe7, 0x69, 0x79, 0xd4, 0x52, 0x4a, 0x7c, 0x3e, 0x1f, 0x03, 0x5d, 0x89, 0x22, 0xfb, 0x52, 0x9c, + 0x3e, 0x26, 0x03, 0x20, 0x1c, 0xd2, 0xb9, 0xfa, 0xbd, 0x0d, 0xdc, 0xfe, 0xf2, 0x08, 0x15, 0x96, + 0x89, 0x43, 0x91, 0xa7, 0xa0, 0xe6, 0xc9, 0x02, 0xc8, 0x28, 0xb1, 0x09, 0xb0, 0xa9, 0x50, 0x69, + 0x13, 0xbc, 0xae, 0x28, 0x5c, 0x79, 0xe5, 0x95, 0x74, 0x74, 0x74, 0x14, 0xe8, 0xad, 0x60, 0x49, + 0x8b, 0x78, 0x3c, 0xce, 0xe7, 0x3f, 0xff, 0x79, 0x8e, 0x46, 0x35, 0x6a, 0x99, 0x00, 0x00, 0x20, + 0x00, 0x49, 0x44, 0x41, 0x54, 0xdd, 0xf3, 0x1d, 0xce, 0xf1, 0xc1, 0x84, 0x01, 0x4f, 0x99, 0x06, + 0x55, 0x55, 0x95, 0x94, 0x94, 0x94, 0x14, 0x4d, 0x6d, 0x49, 0x49, 0x09, 0x4d, 0x2d, 0x2d, 0x4c, + 0xec, 0x7b, 0x89, 0xfa, 0x82, 0x99, 0x94, 0x42, 0x16, 0x46, 0x46, 0x80, 0xe9, 0x51, 0x29, 0x0d, + 0xdb, 0x67, 0x83, 0xf4, 0xd9, 0x84, 0xaa, 0x78, 0x7d, 0x9a, 0xa6, 0x52, 0x5d, 0xe5, 0xa6, 0xaf, + 0x77, 0x2b, 0xf5, 0x0d, 0xeb, 0x50, 0x14, 0xdb, 0x49, 0x2d, 0x40, 0x0e, 0x87, 0x83, 0x4b, 0x2e, + 0xb9, 0x8c, 0xeb, 0xaf, 0xff, 0x29, 0x91, 0xa6, 0xa4, 0x34, 0x2f, 0x48, 0x77, 0xda, 0xde, 0x6f, + 0x3e, 0x8d, 0x83, 0x2f, 0xe7, 0xb6, 0x89, 0x4f, 0x0e, 0x8e, 0x26, 0x3e, 0xa9, 0x28, 0x42, 0x11, + 0x52, 0x52, 0x1d, 0x76, 0xa2, 0x76, 0xd9, 0xdc, 0x86, 0xc7, 0x14, 0xff, 0x65, 0x0d, 0x2e, 0x3f, + 0x50, 0x2a, 0x50, 0x93, 0xe5, 0xb2, 0xaf, 0xca, 0x63, 0xda, 0xdc, 0x2d, 0x42, 0x18, 0x8a, 0x4c, + 0xd8, 0xa6, 0x95, 0x50, 0xdf, 0xc0, 0xf3, 0xa1, 0xb8, 0xb0, 0x9a, 0x6a, 0x7e, 0xf4, 0xfa, 0x93, + 0xa3, 0x77, 0xf6, 0xee, 0x0c, 0x69, 0x5f, 0xff, 0xfa, 0xbd, 0x34, 0xb7, 0x34, 0x93, 0x4e, 0xa5, + 0xd9, 0xb7, 0x6f, 0x3f, 0x8f, 0x3c, 0xf2, 0x30, 0x3f, 0xfe, 0xf1, 0x26, 0xce, 0x3c, 0xcb, 0xe0, + 0x2d, 0xe7, 0x4b, 0x1c, 0x2e, 0x90, 0xd6, 0x7c, 0xc5, 0x94, 0x72, 0xc6, 0x6f, 0x49, 0xbc, 0x5e, + 0x1f, 0x91, 0xf1, 0x2c, 0x91, 0xa9, 0x24, 0x65, 0x01, 0xd7, 0x1b, 0x6a, 0x3a, 0x52, 0xa2, 0x00, + 0x67, 0x9f, 0x59, 0xca, 0xe3, 0x17, 0x55, 0xd3, 0xff, 0x58, 0x2f, 0xcd, 0x8e, 0x93, 0x37, 0x82, + 0x14, 0xb3, 0xa4, 0x81, 0xbc, 0xa8, 0xc1, 0xa3, 0x49, 0x64, 0x26, 0x43, 0x76, 0x4e, 0x6b, 0x4b, + 0xde, 0xb7, 0xab, 0x78, 0xbd, 0x5e, 0x1a, 0x1b, 0x1b, 0xd9, 0x2e, 0x35, 0x0c, 0x69, 0xe2, 0x50, + 0x25, 0xa9, 0xc8, 0x28, 0x03, 0x03, 0x03, 0x34, 0x36, 0x36, 0x16, 0x53, 0x23, 0xbb, 0xdd, 0x4e, + 0x79, 0x79, 0x19, 0xdb, 0x0d, 0x05, 0x4b, 0x5a, 0xa8, 0x85, 0x4d, 0x24, 0x05, 0x98, 0x52, 0x60, + 0x7a, 0x74, 0x02, 0x3e, 0x1d, 0x59, 0x20, 0x35, 0xcc, 0x2d, 0x8b, 0xca, 0x19, 0x9f, 0x2c, 0x25, + 0x35, 0xd5, 0x41, 0x36, 0x6e, 0xda, 0xc8, 0x74, 0xf4, 0xdd, 0x04, 0x82, 0x0d, 0xa7, 0x5c, 0x6e, + 0x59, 0x59, 0x39, 0xc1, 0xaa, 0x5a, 0x26, 0xde, 0x95, 0xb8, 0xcf, 0xb6, 0x7a, 0xf0, 0x6f, 0x47, + 0x97, 0x0f, 0x65, 0x01, 0xfc, 0x5f, 0xaa, 0xdd, 0xba, 0xad, 0x33, 0x69, 0x8d, 0x4f, 0x65, 0x95, + 0xf2, 0x12, 0x3b, 0x08, 0x0b, 0xc4, 0x20, 0x52, 0x31, 0xff, 0x6b, 0x51, 0x74, 0xc9, 0x76, 0x4d, + 0xcb, 0xf5, 0x58, 0xdf, 0x57, 0x7f, 0x12, 0xbc, 0xae, 0x36, 0x31, 0x6d, 0x0b, 0x99, 0x80, 0xb4, + 0xc8, 0x99, 0x29, 0x86, 0x9c, 0x59, 0x26, 0x6d, 0x1e, 0x9e, 0xf6, 0xfb, 0x30, 0x7a, 0x93, 0xe2, + 0x73, 0x97, 0xbf, 0x9d, 0xe5, 0x2b, 0x96, 0x33, 0x1e, 0x19, 0xa7, 0xab, 0xab, 0x8b, 0xb7, 0xbd, + 0xed, 0x0a, 0xae, 0xb8, 0xe2, 0x72, 0x3a, 0x0f, 0x1f, 0xe6, 0x17, 0xf7, 0xdf, 0xcf, 0xad, 0x1f, + 0xf9, 0x1d, 0x1f, 0xbc, 0xa5, 0x83, 0x35, 0xeb, 0x6a, 0x0b, 0x66, 0x2c, 0xbf, 0x40, 0xab, 0xe0, + 0xbb, 0x11, 0x79, 0x0a, 0x4d, 0x65, 0x6d, 0x07, 0x2f, 0xbd, 0xbc, 0x87, 0x8b, 0x2f, 0x5c, 0x86, + 0x5b, 0x57, 0x11, 0x27, 0x28, 0xae, 0x60, 0xbe, 0x36, 0xf8, 0x5c, 0x2a, 0x37, 0xde, 0xd0, 0xc4, + 0x3f, 0x6f, 0x1e, 0xa6, 0x26, 0x99, 0xc5, 0xae, 0xcc, 0xbe, 0x4f, 0x48, 0x51, 0xdc, 0x40, 0x33, + 0x44, 0x37, 0x09, 0xd8, 0x85, 0xc4, 0x9a, 0x9e, 0x62, 0x78, 0x78, 0x98, 0xa5, 0x4b, 0x97, 0xce, + 0xa3, 0x00, 0x09, 0x21, 0x68, 0x6f, 0x6f, 0x27, 0xea, 0xf0, 0x92, 0x65, 0x0a, 0x3b, 0x02, 0x6f, + 0x2a, 0x4e, 0x5f, 0x5f, 0x5f, 0x81, 0xef, 0x2d, 0x67, 0x7b, 0x87, 0x5b, 0x5b, 0x79, 0x4e, 0xe8, + 0x18, 0x32, 0x8d, 0xa2, 0x14, 0xd8, 0x29, 0x52, 0x60, 0x48, 0x89, 0x69, 0x57, 0xb0, 0xeb, 0xe2, + 0xb4, 0xbd, 0xce, 0x33, 0x47, 0xc0, 0xef, 0x24, 0x14, 0x3c, 0xcc, 0xf1, 0x63, 0x2f, 0xb3, 0x62, + 0x55, 0x2d, 0x70, 0x72, 0xc6, 0x21, 0x2d, 0x89, 0xa9, 0xe4, 0xa4, 0x65, 0x4d, 0x74, 0x8b, 0xe3, + 0xb6, 0x62, 0x17, 0xb9, 0xe3, 0x6d, 0xe9, 0xd7, 0xa7, 0x8e, 0x9a, 0xe3, 0xd1, 0xe9, 0x5c, 0x79, + 0x45, 0x89, 0x8e, 0xcf, 0xab, 0xa3, 0x5a, 0x59, 0xd2, 0x46, 0xee, 0xf7, 0x0b, 0xb8, 0xa2, 0xbb, + 0x46, 0x58, 0xc7, 0xcc, 0x8b, 0x1c, 0xf7, 0x4c, 0x5d, 0xfb, 0x95, 0xb7, 0xb5, 0xe9, 0xe7, 0x9f, + 0x5f, 0x41, 0xd0, 0x9b, 0x7f, 0x4b, 0xce, 0x90, 0x8c, 0x8d, 0x67, 0x19, 0x1b, 0x4d, 0xb1, 0x77, + 0x5f, 0x94, 0x57, 0xa4, 0xc6, 0x53, 0x4f, 0xdc, 0xc1, 0x93, 0x4f, 0x3c, 0xcc, 0xf2, 0x15, 0x6b, + 0x18, 0x1b, 0x1b, 0xa3, 0xa3, 0xa3, 0x83, 0xda, 0xda, 0x5a, 0x16, 0x2f, 0x5a, 0xc4, 0x17, 0xbe, + 0xf0, 0x05, 0x8e, 0x1f, 0xbf, 0x89, 0x1f, 0xfe, 0xf0, 0x07, 0x3c, 0xf5, 0xe4, 0x73, 0x7c, 0xf0, + 0x96, 0x33, 0xf0, 0x78, 0x61, 0xfb, 0xb6, 0x17, 0x89, 0x44, 0x8e, 0x62, 0xb3, 0xb9, 0x59, 0xba, + 0xec, 0x3c, 0x9a, 0x9a, 0x5a, 0x68, 0x6d, 0x6f, 0x27, 0x3a, 0x35, 0xc1, 0xf6, 0x1d, 0xc7, 0x38, + 0x7b, 0x5d, 0x2b, 0x2a, 0xb3, 0x2d, 0xa4, 0xe2, 0x04, 0x2d, 0xce, 0x13, 0x50, 0x25, 0xcb, 0x97, + 0x04, 0x78, 0xcb, 0x35, 0xcd, 0x1c, 0xfd, 0xde, 0x21, 0x16, 0x3b, 0xf2, 0x6a, 0x2b, 0xc5, 0x89, + 0x51, 0xb1, 0x28, 0xf2, 0xb1, 0x75, 0x21, 0xf0, 0x66, 0x12, 0x6c, 0xd9, 0xb2, 0x05, 0x87, 0xc3, + 0x89, 0xdf, 0xef, 0xc3, 0xed, 0x76, 0x17, 0x89, 0x77, 0x52, 0x4a, 0x0c, 0xbb, 0x93, 0xac, 0x39, + 0x85, 0x5b, 0x83, 0x12, 0x61, 0xf0, 0xe8, 0xa3, 0x8f, 0x32, 0x39, 0x39, 0x89, 0xa2, 0x28, 0x98, + 0xa6, 0x49, 0x7f, 0x7f, 0x3f, 0x7b, 0x76, 0xef, 0xc1, 0xca, 0x66, 0x66, 0x45, 0x57, 0xf8, 0x80, + 0xb4, 0x25, 0x08, 0xd7, 0x79, 0xf1, 0xfa, 0x6c, 0x45, 0xad, 0x15, 0xa7, 0x0c, 0x2b, 0xf3, 0xc1, + 0x61, 0x4b, 0x4b, 0x29, 0x3b, 0x77, 0x3d, 0xce, 0x82, 0x8e, 0x8b, 0x70, 0xb9, 0xc3, 0xf3, 0x70, + 0x04, 0xd3, 0x34, 0x39, 0x7a, 0xfc, 0x28, 0xc3, 0x35, 0xfd, 0x19, 0x2b, 0x3b, 0x79, 0xef, 0xe4, + 0x95, 0xf1, 0xe2, 0x6e, 0xcc, 0xfd, 0x67, 0x45, 0xef, 0x54, 0x34, 0x35, 0x1d, 0x99, 0xc8, 0x94, + 0xb7, 0x35, 0xb9, 0xd1, 0x6d, 0x62, 0x5e, 0x53, 0xfa, 0x1b, 0x0a, 0xd8, 0x8a, 0x98, 0xf6, 0xec, + 0x3e, 0xef, 0x17, 0xae, 0xae, 0xf0, 0x38, 0xae, 0xb8, 0xb4, 0x12, 0xb7, 0xae, 0x90, 0x31, 0x2d, + 0xb2, 0x46, 0x3e, 0x2d, 0xac, 0x0c, 0xeb, 0x54, 0x87, 0x6d, 0xac, 0x5c, 0xec, 0xe7, 0x86, 0x6b, + 0xeb, 0xc9, 0x98, 0x16, 0x91, 0xb1, 0x1c, 0xaf, 0xbf, 0xbe, 0x87, 0x07, 0x1e, 0x8c, 0xd0, 0xd3, + 0xd3, 0x43, 0x4d, 0x4d, 0x4d, 0xa1, 0xae, 0xaa, 0xd0, 0xd2, 0xd2, 0xc2, 0x17, 0xbf, 0xf8, 0x25, + 0x76, 0xed, 0xda, 0xc5, 0xb7, 0xbf, 0xf5, 0x2d, 0x5c, 0x9e, 0x97, 0x68, 0x6f, 0x1b, 0x45, 0x51, + 0x20, 0x97, 0x9b, 0x62, 0xe7, 0x8e, 0xa7, 0x41, 0x5e, 0x4a, 0x73, 0x4b, 0x2b, 0xcb, 0x57, 0x9e, + 0xc1, 0xd6, 0x97, 0x9e, 0x65, 0x60, 0x70, 0x92, 0xba, 0xea, 0xd0, 0x1b, 0x53, 0xde, 0x85, 0xc0, + 0xa9, 0xc3, 0xbb, 0xaf, 0xac, 0xe5, 0x1f, 0x36, 0x0e, 0x52, 0xd3, 0x1d, 0x25, 0xa0, 0x9e, 0x9c, + 0xf0, 0x8a, 0x22, 0xb6, 0x9c, 0xb7, 0x18, 0x8d, 0xba, 0xc1, 0x93, 0xb7, 0x7f, 0x99, 0x5f, 0x7e, + 0xfd, 0xab, 0x28, 0x4e, 0x27, 0x42, 0xb7, 0x93, 0x05, 0x84, 0xaa, 0x61, 0x9a, 0x06, 0x72, 0x22, + 0x82, 0x59, 0x92, 0x17, 0x5a, 0x83, 0x03, 0x0e, 0x3e, 0xf9, 0x10, 0xf7, 0x3e, 0xf1, 0x6b, 0x32, + 0xe4, 0x53, 0x2b, 0x1d, 0x89, 0x4b, 0x81, 0x0e, 0x57, 0xa1, 0x69, 0xae, 0x60, 0x29, 0x24, 0x82, + 0x8c, 0x69, 0x51, 0x53, 0xe7, 0xc6, 0x69, 0x53, 0x66, 0xa7, 0x08, 0x9d, 0x60, 0x25, 0xe6, 0xba, + 0x9a, 0xd2, 0xa0, 0x87, 0x74, 0x6a, 0x07, 0xe3, 0xe3, 0x5d, 0x38, 0x5d, 0xa5, 0x48, 0x69, 0x91, + 0x4e, 0x67, 0xe8, 0xeb, 0xeb, 0xe3, 0x91, 0x47, 0x1e, 0xe1, 0x9e, 0x97, 0xef, 0x91, 0x89, 0x0f, + 0x0c, 0x3c, 0xa6, 0xb7, 0xd8, 0x06, 0xe6, 0xae, 0x49, 0x7f, 0x8b, 0x53, 0xc9, 0x3c, 0xad, 0x44, + 0x87, 0x87, 0x33, 0x48, 0x04, 0xc9, 0x94, 0x45, 0x4e, 0x5a, 0xff, 0x35, 0x01, 0x2b, 0x21, 0x73, + 0xad, 0xbb, 0x5f, 0x59, 0x7c, 0xe9, 0x45, 0x65, 0xb8, 0xec, 0x0a, 0x47, 0xba, 0x92, 0x7c, 0xfe, + 0x8b, 0xfb, 0xd8, 0xb3, 0x6f, 0x1a, 0x9f, 0x57, 0xa7, 0xbe, 0xde, 0xc9, 0xc2, 0x85, 0x3e, 0xd6, + 0xad, 0x2b, 0xa5, 0xb6, 0xc6, 0x4d, 0x65, 0x99, 0x9d, 0xca, 0x52, 0x9d, 0xea, 0xb7, 0x94, 0x33, + 0x30, 0x94, 0x2b, 0x52, 0x65, 0xe7, 0x2e, 0xc8, 0x66, 0xb3, 0xb1, 0x66, 0xcd, 0x1a, 0xda, 0xda, + 0xfe, 0x83, 0x3b, 0xee, 0xb8, 0x9d, 0x9e, 0x9e, 0x6f, 0xd1, 0xd8, 0x68, 0x14, 0x5e, 0xcf, 0xb0, + 0x77, 0xef, 0xf3, 0x84, 0xcb, 0xca, 0xf0, 0xf9, 0x02, 0x2c, 0x5e, 0xbe, 0x96, 0xe3, 0xdd, 0x5b, + 0xa9, 0xae, 0x0c, 0xa0, 0x15, 0xda, 0x3b, 0x4f, 0x15, 0x78, 0xcd, 0x3c, 0x6f, 0x6d, 0x72, 0x73, + 0xf5, 0x8d, 0xcd, 0x3c, 0xf0, 0x99, 0x5d, 0x9c, 0xab, 0x48, 0x54, 0x31, 0x6b, 0xc8, 0x2d, 0x29, + 0xe9, 0xcf, 0xc0, 0xce, 0x38, 0xc4, 0x2c, 0x49, 0x83, 0x5d, 0x61, 0xbd, 0x57, 0xb2, 0xc6, 0x4d, + 0x01, 0x22, 0x8c, 0x81, 0x88, 0x93, 0xb5, 0x20, 0x69, 0x81, 0x54, 0x25, 0xce, 0x32, 0x81, 0x4d, + 0xc9, 0x7f, 0x6a, 0xbb, 0x13, 0x3a, 0x9c, 0xf9, 0x5d, 0x22, 0x4e, 0xe0, 0x8c, 0x99, 0x45, 0x42, + 0xec, 0x6c, 0xaf, 0x56, 0x54, 0x0a, 0xea, 0xca, 0x1d, 0x88, 0x99, 0x9a, 0xf5, 0x0c, 0x06, 0x3e, + 0x2f, 0xfd, 0x93, 0x85, 0xd4, 0x5b, 0xa0, 0xdb, 0x6d, 0xd8, 0x1d, 0x39, 0xfa, 0x7a, 0x77, 0x31, + 0x1d, 0x73, 0xb1, 0x63, 0xc7, 0x4e, 0x1e, 0x7e, 0xe4, 0x61, 0x5e, 0x9d, 0x7a, 0xd5, 0x4c, 0xac, + 0x4d, 0x45, 0xf5, 0xbf, 0x53, 0x7f, 0xa2, 0x2f, 0xb0, 0x7d, 0x7a, 0xb4, 0x29, 0x93, 0x06, 0x28, + 0x7b, 0xd5, 0x6d, 0xb7, 0x72, 0xd6, 0xda, 0x4c, 0xe6, 0xf8, 0x17, 0x6c, 0x0d, 0xb9, 0x12, 0xd3, + 0xec, 0x28, 0x40, 0x9f, 0x39, 0x84, 0x56, 0x86, 0xae, 0x67, 0x81, 0xc8, 0x1b, 0x0b, 0x58, 0xf6, + 0x4f, 0xaa, 0xad, 0x86, 0x21, 0x96, 0x2e, 0x69, 0x25, 0x97, 0x93, 0xfc, 0xfa, 0xd1, 0x5e, 0x1e, + 0x89, 0x8d, 0x4b, 0xc7, 0x17, 0x1c, 0x91, 0x21, 0x17, 0xb9, 0xc3, 0x4c, 0x5a, 0x4f, 0x1e, 0x1a, + 0xce, 0xe5, 0x6e, 0xe8, 0x6c, 0x2c, 0xb7, 0xbb, 0xa9, 0xad, 0xd5, 0x39, 0xe3, 0x0c, 0x3f, 0x8b, + 0x16, 0x85, 0x78, 0xf6, 0x59, 0x9d, 0x73, 0xce, 0xad, 0x3a, 0x25, 0xa0, 0x21, 0xa5, 0x24, 0x10, + 0x08, 0xf0, 0x8e, 0x77, 0xbc, 0x93, 0x7f, 0xfd, 0xca, 0xaf, 0xa8, 0xaf, 0xef, 0x2e, 0x06, 0x5c, + 0x86, 0x11, 0xe5, 0xe8, 0x91, 0x43, 0xac, 0x5c, 0xb5, 0x96, 0x60, 0xa8, 0x84, 0xd1, 0x41, 0x3f, + 0x99, 0x8c, 0x81, 0xea, 0xd4, 0x8b, 0x41, 0xc9, 0x29, 0xfd, 0xb1, 0x10, 0xa8, 0xc0, 0x15, 0x97, + 0x57, 0xb3, 0xe9, 0xf9, 0x11, 0x7a, 0x7e, 0x37, 0x40, 0x53, 0xa1, 0x29, 0x24, 0x2b, 0x05, 0x9b, + 0xa3, 0x92, 0xe7, 0xe3, 0x90, 0xcd, 0x47, 0x3a, 0x1c, 0xcc, 0xe4, 0x07, 0xa6, 0xad, 0xf7, 0x89, + 0x22, 0x23, 0x29, 0x6d, 0x4a, 0x5e, 0x9e, 0x86, 0xdd, 0x49, 0x30, 0xa4, 0x64, 0x81, 0x43, 0xb2, + 0xc1, 0x2f, 0x08, 0x6a, 0x05, 0x76, 0x28, 0x12, 0x61, 0xe5, 0x87, 0xc9, 0xcc, 0xb6, 0xde, 0x88, + 0xa2, 0x68, 0xc5, 0x9c, 0x98, 0x7d, 0x5a, 0x53, 0x68, 0x6d, 0xf5, 0x16, 0x40, 0x94, 0x22, 0x20, + 0xfd, 0x86, 0x50, 0x2d, 0x98, 0xfc, 0xf4, 0xe7, 0xb7, 0xf1, 0x68, 0xa7, 0x25, 0xa3, 0xeb, 0x27, + 0x27, 0x6d, 0x7f, 0xad, 0x47, 0x14, 0xdd, 0xf6, 0x8f, 0x0e, 0x77, 0xee, 0x77, 0x63, 0x1b, 0xa2, + 0xe9, 0x62, 0xee, 0xfc, 0x43, 0xbb, 0x2b, 0xbd, 0x51, 0xfb, 0x49, 0xf8, 0x55, 0xde, 0xf9, 0x96, + 0x0a, 0x9f, 0x5a, 0x16, 0xb2, 0xe3, 0x76, 0xdb, 0x40, 0xe4, 0x9b, 0x08, 0xac, 0x31, 0xd5, 0x93, + 0x1b, 0xcf, 0xf8, 0x4f, 0x25, 0xe1, 0xa2, 0x80, 0x2b, 0x1e, 0xaf, 0x57, 0xd3, 0xaf, 0x59, 0xef, + 0x3d, 0xd3, 0xe5, 0xd5, 0x4b, 0x82, 0x76, 0x26, 0x26, 0x32, 0x6c, 0xdd, 0x3e, 0x81, 0xb6, 0xc1, + 0xb5, 0x45, 0xab, 0x31, 0x2e, 0x12, 0xa5, 0xe9, 0x14, 0x96, 0x85, 0xd5, 0x5b, 0xf6, 0x09, 0xab, + 0x34, 0xf1, 0xd5, 0x8f, 0xfd, 0xed, 0xe7, 0x44, 0x5b, 0x5b, 0x2b, 0x9b, 0x37, 0xbf, 0xc4, 0xd7, + 0x6f, 0x7f, 0x90, 0x5b, 0x6f, 0xfd, 0x07, 0xea, 0xeb, 0xeb, 0x4f, 0xd9, 0x7b, 0x3b, 0x53, 0xa3, + 0x4d, 0x24, 0x92, 0x58, 0x56, 0xae, 0x58, 0x57, 0x9e, 0x09, 0x5e, 0x06, 0x07, 0x8f, 0xd2, 0xb1, + 0x70, 0x29, 0x4e, 0xa7, 0x13, 0xbb, 0x33, 0x44, 0x22, 0x9d, 0xc1, 0xe5, 0xd4, 0x67, 0x37, 0xc8, + 0x09, 0xcc, 0xcb, 0xd9, 0xa2, 0x3e, 0x94, 0xf8, 0x34, 0x3e, 0xf4, 0x77, 0x6d, 0x7c, 0x6c, 0xcf, + 0x38, 0xe1, 0xa9, 0x0c, 0x3e, 0x05, 0x5e, 0x4f, 0x48, 0x36, 0xc5, 0x24, 0xb9, 0x39, 0xba, 0x63, + 0x02, 0xfb, 0x92, 0x92, 0x65, 0x1e, 0x70, 0x2b, 0xf9, 0x8d, 0xd2, 0x97, 0x81, 0x4d, 0x73, 0x36, + 0xc1, 0xcb, 0x49, 0x88, 0xe4, 0xe0, 0xbd, 0x61, 0xf0, 0xa8, 0x33, 0x55, 0xad, 0xfc, 0xcf, 0x62, + 0x89, 0xbb, 0xb0, 0xcb, 0x84, 0x9c, 0x45, 0xb1, 0x2c, 0x09, 0x51, 0xaf, 0x46, 0x79, 0xb9, 0xb3, + 0xe0, 0x16, 0xc4, 0x3c, 0x4a, 0xed, 0xc9, 0xd9, 0x40, 0xfe, 0xbf, 0x4d, 0xcb, 0x22, 0xfe, 0xf6, + 0xf1, 0xe3, 0x18, 0xe2, 0x22, 0x67, 0x83, 0x39, 0x28, 0xec, 0xd9, 0x4c, 0xa4, 0x2d, 0x31, 0xcf, + 0xde, 0x86, 0x5f, 0x0d, 0xd9, 0xd3, 0x2f, 0xca, 0x1f, 0x2e, 0xfc, 0x1d, 0x57, 0x7d, 0xe3, 0xb6, + 0x55, 0x62, 0xcd, 0x0a, 0x3f, 0xa6, 0x21, 0x31, 0x2d, 0x89, 0x62, 0x49, 0xce, 0x3d, 0xb3, 0x84, + 0x4f, 0xf5, 0x25, 0xce, 0xf9, 0xe1, 0xb6, 0xa9, 0x7d, 0xf2, 0x2e, 0x71, 0xf6, 0xd4, 0x2d, 0xf2, + 0xd8, 0x29, 0x49, 0x77, 0xb9, 0xb2, 0xa8, 0x5b, 0x4b, 0x4f, 0xaf, 0x5c, 0xbb, 0x26, 0x88, 0x2a, + 0x24, 0x23, 0x63, 0x19, 0xba, 0x72, 0x59, 0x53, 0x6f, 0xcf, 0xdd, 0x1b, 0x59, 0x1f, 0x4d, 0x8c, + 0xb5, 0xa6, 0xac, 0xb1, 0xf6, 0x8c, 0xa5, 0x8c, 0x98, 0x3f, 0xa1, 0x4a, 0x24, 0x15, 0x45, 0x70, + 0xc1, 0x05, 0x17, 0x70, 0xd3, 0x4d, 0x37, 0xf2, 0x9d, 0xef, 0xfc, 0x07, 0x37, 0xdf, 0x7c, 0xf3, + 0x49, 0xf0, 0xe5, 0xcc, 0x23, 0x9b, 0xcd, 0xb2, 0x73, 0xc7, 0x4e, 0xbe, 0xfd, 0xed, 0x6f, 0xd0, + 0xd6, 0x36, 0xc8, 0x89, 0xd8, 0x47, 0x26, 0x33, 0x41, 0x34, 0x3a, 0x55, 0xa0, 0xe4, 0x6a, 0x58, + 0xd6, 0x7c, 0x0f, 0x6c, 0x5a, 0x92, 0xa3, 0x23, 0x13, 0x6c, 0x3b, 0xd6, 0xcf, 0x54, 0x32, 0x3d, + 0x6f, 0x80, 0x9a, 0x40, 0xb0, 0x6a, 0x59, 0x80, 0x1b, 0xff, 0xae, 0x83, 0xd7, 0x72, 0x90, 0x94, + 0x92, 0xdd, 0xf1, 0xf9, 0xc2, 0x9d, 0x39, 0xc6, 0x4c, 0x88, 0x17, 0xb2, 0x09, 0x0b, 0xd0, 0xc5, + 0xc9, 0x8c, 0x87, 0x23, 0x39, 0xd8, 0x13, 0xcf, 0x6f, 0x26, 0x59, 0x80, 0x34, 0xe5, 0x5c, 0xf7, + 0xa9, 0xcc, 0x2d, 0x54, 0xe4, 0x25, 0x9e, 0xb5, 0xc0, 0xd7, 0xe6, 0xa7, 0xba, 0xd2, 0x39, 0xbf, + 0x9a, 0x55, 0xf8, 0x19, 0x4d, 0x67, 0xd9, 0xd7, 0x37, 0xc2, 0xd1, 0xd1, 0x09, 0xb2, 0x86, 0x89, + 0x94, 0x16, 0xd9, 0xac, 0x41, 0xd4, 0x4c, 0x1b, 0xd2, 0x69, 0xff, 0x52, 0x7d, 0xab, 0xfd, 0xf8, + 0xf8, 0x12, 0x2b, 0x15, 0x69, 0xcb, 0x9d, 0xe4, 0x4c, 0x73, 0xaf, 0xe8, 0x7e, 0xf5, 0x80, 0x78, + 0xfb, 0xb5, 0x6f, 0x6f, 0x10, 0xb1, 0x58, 0x16, 0x81, 0xc0, 0x6e, 0x13, 0xb8, 0xed, 0x79, 0xae, + 0x58, 0xc8, 0x6f, 0xe3, 0xc3, 0x7f, 0xd3, 0x2c, 0xbe, 0x72, 0xde, 0xb2, 0x8a, 0xf0, 0x41, 0xf7, + 0x73, 0x25, 0x4f, 0xb8, 0x3b, 0x4e, 0xcd, 0xaa, 0x1c, 0x72, 0x97, 0x97, 0xf6, 0x3b, 0x16, 0x37, + 0x35, 0xf8, 0x40, 0x4a, 0xfa, 0xfa, 0x13, 0x44, 0x1a, 0xb2, 0x51, 0xa5, 0x42, 0x3e, 0x35, 0x4f, + 0xe5, 0xeb, 0x94, 0x29, 0xa5, 0x45, 0x3e, 0x7d, 0xef, 0xfd, 0xf7, 0xb1, 0x73, 0xe7, 0x4e, 0x1a, + 0x1a, 0x1a, 0x38, 0xff, 0xfc, 0xf3, 0x71, 0x3a, 0x9d, 0x58, 0x96, 0x85, 0x69, 0x9a, 0xe4, 0x72, + 0x39, 0x12, 0x89, 0x04, 0x9d, 0x9d, 0x9d, 0x3c, 0xf8, 0xe0, 0x03, 0xfc, 0xc3, 0x47, 0x6f, 0xe5, + 0xe3, 0x9f, 0xb8, 0x86, 0x9a, 0xda, 0xdf, 0x50, 0x5d, 0x9d, 0x9f, 0x2f, 0x39, 0x37, 0x4d, 0xb1, + 0xac, 0x2c, 0xd3, 0xd1, 0x28, 0x48, 0xc8, 0x66, 0xb2, 0x64, 0xd2, 0x99, 0xa2, 0x00, 0x67, 0xa6, + 0xc9, 0xed, 0xee, 0x1e, 0xa0, 0x27, 0x32, 0xc9, 0x6b, 0x47, 0xfb, 0x48, 0x64, 0x8d, 0xb9, 0x2d, + 0xb8, 0xd8, 0x14, 0x78, 0xcf, 0x55, 0xb5, 0x54, 0x5e, 0x54, 0xc5, 0xab, 0xf1, 0xbc, 0x20, 0x4f, + 0x75, 0xa4, 0x81, 0x84, 0x35, 0x7b, 0xe7, 0xbd, 0x9a, 0xc0, 0x7b, 0x42, 0x35, 0xc2, 0x02, 0x0e, + 0x24, 0x05, 0x69, 0x8b, 0xa2, 0xe6, 0x8a, 0x82, 0x7d, 0x96, 0x72, 0xb6, 0xfa, 0x24, 0x85, 0x2c, + 0x22, 0x59, 0xd3, 0x16, 0xb4, 0x2d, 0x0a, 0xe0, 0xf7, 0xaa, 0xf3, 0xe8, 0xa2, 0x52, 0x4a, 0xa6, + 0x52, 0x19, 0x36, 0x1f, 0x3c, 0x4e, 0xe7, 0xe0, 0x28, 0xbb, 0xbb, 0xfa, 0xd9, 0xd7, 0x93, 0xef, + 0xd1, 0xca, 0xe5, 0x0c, 0xd2, 0x58, 0xa6, 0x92, 0x93, 0x3b, 0xb6, 0x2e, 0x88, 0x9d, 0xb6, 0xfa, + 0x6f, 0x25, 0x62, 0x94, 0x98, 0x59, 0x96, 0x2c, 0x0a, 0xb0, 0xf9, 0xa5, 0x31, 0xc6, 0xa7, 0x8d, + 0x79, 0xe6, 0x5f, 0x08, 0x81, 0xa6, 0xc0, 0x5b, 0xce, 0x2d, 0xe7, 0x4a, 0x77, 0x6d, 0x5d, 0x6e, + 0xc0, 0xfc, 0x5c, 0x78, 0xa7, 0xd3, 0x76, 0x92, 0x89, 0x56, 0x7c, 0xe9, 0xab, 0x9b, 0x22, 0x5e, + 0x7b, 0x59, 0x99, 0x8e, 0x65, 0xc2, 0xd1, 0x23, 0x71, 0x52, 0x9e, 0xda, 0xb4, 0xd6, 0xa3, 0x8c, + 0xc3, 0xfe, 0x59, 0x2d, 0xf8, 0xeb, 0xc1, 0x6c, 0x68, 0x93, 0xf6, 0xc5, 0xce, 0x60, 0xf7, 0x59, + 0xef, 0xfa, 0xd0, 0x35, 0x95, 0x4b, 0x2a, 0x3b, 0x58, 0xd0, 0xd6, 0x8e, 0xaa, 0xa9, 0x45, 0xd3, + 0x33, 0x3a, 0x3a, 0x42, 0x67, 0xe7, 0x41, 0x72, 0xb9, 0x09, 0x96, 0xaf, 0x08, 0x71, 0xf1, 0x25, + 0x6d, 0x5c, 0x75, 0x65, 0x07, 0x87, 0x3a, 0x07, 0x90, 0xd2, 0x3a, 0x21, 0x6c, 0x92, 0x30, 0x27, + 0x68, 0xb1, 0x24, 0x64, 0x32, 0xe6, 0x1c, 0x7f, 0x2b, 0x18, 0x9b, 0x4e, 0x30, 0x63, 0xf9, 0xa6, + 0xd3, 0x29, 0x46, 0xa7, 0x13, 0x34, 0x86, 0xfd, 0xf3, 0xe0, 0xc0, 0xa0, 0x57, 0xe3, 0x93, 0xff, + 0x67, 0x11, 0x37, 0x77, 0x46, 0x19, 0xdf, 0x7e, 0x6a, 0xb2, 0xa2, 0x21, 0x21, 0x9a, 0xcb, 0x83, + 0xd7, 0x02, 0x81, 0x69, 0xe5, 0x2b, 0x45, 0x27, 0x1e, 0xc3, 0xa6, 0x64, 0xca, 0x10, 0x38, 0xf5, + 0xd9, 0x9e, 0xe6, 0xb9, 0x41, 0x52, 0x1e, 0x1d, 0x2d, 0x4e, 0x3d, 0x65, 0x48, 0x51, 0xb8, 0x72, + 0x45, 0x08, 0xbb, 0x4d, 0x99, 0xdd, 0x00, 0x05, 0x4a, 0xd0, 0xa1, 0x81, 0x31, 0xd2, 0xb9, 0x5c, + 0x91, 0x8a, 0x3c, 0x32, 0x1d, 0x23, 0x95, 0x33, 0x48, 0x65, 0x0d, 0xa2, 0x96, 0x6b, 0xa2, 0x47, + 0xba, 0xe2, 0x70, 0xec, 0xf4, 0x15, 0xb7, 0xf6, 0xca, 0xec, 0x44, 0x24, 0xd9, 0xf7, 0xcf, 0x9f, + 0xdd, 0xdd, 0xee, 0xf7, 0xe9, 0x8c, 0x4f, 0x66, 0x08, 0xfb, 0xb5, 0xd9, 0x52, 0x64, 0xc1, 0x8a, + 0x39, 0x34, 0xc9, 0x85, 0xe7, 0x95, 0xf3, 0xd3, 0x67, 0x46, 0xaf, 0x48, 0x07, 0x65, 0x18, 0x52, + 0x83, 0x45, 0x01, 0x87, 0x8f, 0x04, 0x45, 0xfa, 0x31, 0x87, 0xb7, 0xb5, 0x56, 0x17, 0x4e, 0x5d, + 0x25, 0x67, 0x4a, 0x86, 0x46, 0x53, 0x58, 0x72, 0xf0, 0x5e, 0x12, 0xfa, 0x49, 0xfd, 0x9b, 0x13, + 0x7f, 0x65, 0xec, 0x2d, 0xdd, 0xea, 0x3c, 0x3f, 0xb9, 0x28, 0xbe, 0xfe, 0xd5, 0xc4, 0xee, 0xf7, + 0x6d, 0xd5, 0x9e, 0x5b, 0xaa, 0x18, 0x39, 0x96, 0x6f, 0x17, 0x7e, 0xef, 0x70, 0xd0, 0xb6, 0x66, + 0xfd, 0x4a, 0x6e, 0xbc, 0x79, 0x05, 0xb5, 0xb5, 0x7e, 0xfc, 0x01, 0x07, 0x02, 0xc1, 0xc8, 0xf0, + 0x10, 0x87, 0x8f, 0x38, 0x30, 0xcd, 0x24, 0xf3, 0x07, 0x85, 0x0a, 0x84, 0x50, 0x71, 0x3a, 0x5d, + 0x45, 0x2e, 0xd6, 0x64, 0x2c, 0x79, 0x42, 0xc8, 0x5c, 0x40, 0xa5, 0xe6, 0xcc, 0xd7, 0x9a, 0xa9, + 0x07, 0x15, 0x27, 0xce, 0x21, 0x69, 0x6f, 0x72, 0xf3, 0xcf, 0x9f, 0x5e, 0xca, 0xdf, 0x7f, 0xe4, + 0x35, 0xfa, 0x07, 0x4e, 0x1e, 0x6a, 0x63, 0x01, 0xcf, 0x4e, 0x4b, 0x50, 0x04, 0x36, 0x24, 0x3b, + 0x62, 0x30, 0x21, 0x4f, 0x36, 0xe5, 0x59, 0x04, 0x49, 0x4b, 0x14, 0x21, 0x48, 0x31, 0xc3, 0xe6, + 0x91, 0xb3, 0xa6, 0x59, 0x16, 0xae, 0xc9, 0x40, 0x32, 0x51, 0xe6, 0x64, 0xe1, 0x42, 0xff, 0x49, + 0x93, 0x72, 0x93, 0xb9, 0x1c, 0x91, 0x58, 0xac, 0x58, 0x94, 0x01, 0x41, 0xce, 0xb4, 0x48, 0x19, + 0x26, 0xa9, 0x44, 0x06, 0x33, 0xe3, 0xdc, 0x5f, 0x3d, 0xa6, 0xbf, 0xe1, 0xdc, 0x8e, 0xcc, 0xa0, + 0x66, 0xf3, 0x8c, 0xa4, 0x72, 0xff, 0xf8, 0x89, 0x0e, 0x26, 0xc6, 0xb3, 0xd8, 0xb4, 0x7c, 0x07, + 0xa5, 0x54, 0xf2, 0x20, 0x16, 0x80, 0x61, 0x4a, 0x52, 0x39, 0x8b, 0xea, 0x6a, 0x37, 0x61, 0x33, + 0x27, 0x8e, 0xc7, 0xe3, 0xf3, 0x4d, 0xb4, 0x70, 0x4d, 0xdb, 0x54, 0xd7, 0xf4, 0x99, 0x55, 0xe5, + 0x76, 0xec, 0xba, 0x82, 0x61, 0x4a, 0x46, 0xc7, 0x2d, 0x54, 0xd9, 0x6c, 0x89, 0x81, 0xc6, 0x53, + 0x7e, 0x70, 0x64, 0x5d, 0xff, 0xc1, 0xa9, 0xeb, 0xc7, 0x7f, 0xac, 0xaf, 0x4c, 0x5e, 0xa8, 0x2f, + 0xb6, 0x2a, 0xeb, 0xd7, 0xdb, 0xeb, 0x3a, 0xde, 0xeb, 0x7b, 0xe9, 0xa2, 0x8b, 0x0d, 0xde, 0xfa, + 0xd6, 0x6a, 0x96, 0x2c, 0xa9, 0x20, 0x10, 0x70, 0x16, 0x67, 0x47, 0x05, 0x83, 0x41, 0x7c, 0xbe, + 0xaa, 0x53, 0x46, 0x93, 0x8a, 0xa2, 0xe3, 0x72, 0xb9, 0x90, 0x52, 0x52, 0x5a, 0x56, 0xce, 0xd0, + 0xd0, 0xe4, 0xec, 0xb0, 0x52, 0x29, 0x09, 0xba, 0x9d, 0x45, 0x82, 0x9f, 0xaa, 0x28, 0x78, 0xec, + 0xfa, 0x6c, 0x61, 0xa2, 0xa0, 0x5f, 0xa2, 0xc0, 0x20, 0xbc, 0xe4, 0x82, 0x72, 0x3e, 0xf1, 0xb1, + 0x45, 0x78, 0xdc, 0x73, 0xd9, 0x5d, 0xb3, 0xbb, 0x65, 0xd4, 0x12, 0xfc, 0x62, 0x02, 0xee, 0x9b, + 0x80, 0x03, 0x39, 0x4e, 0xd9, 0xb9, 0xa8, 0x21, 0xb1, 0x2b, 0xb2, 0x00, 0x9c, 0xcc, 0x52, 0x42, + 0xa4, 0x28, 0xc0, 0xa0, 0x05, 0x61, 0x09, 0x29, 0x18, 0xcd, 0x41, 0xc3, 0xaa, 0x52, 0xea, 0x6a, + 0x5c, 0xb3, 0x30, 0xe9, 0x1c, 0x52, 0x9f, 0x69, 0xc9, 0x79, 0xdd, 0x21, 0x36, 0x55, 0xc5, 0xad, + 0x69, 0xa8, 0x9a, 0x82, 0x4d, 0x8f, 0xa0, 0xdb, 0xfb, 0xdf, 0x10, 0xff, 0x77, 0x05, 0xe4, 0xfb, + 0xcf, 0x14, 0x65, 0x8b, 0xd6, 0xaf, 0x0b, 0x13, 0x08, 0xda, 0x09, 0x05, 0x75, 0x2c, 0x0b, 0x1e, + 0x7d, 0x7a, 0x98, 0xb1, 0xa8, 0x81, 0x14, 0x30, 0x10, 0xc9, 0xf0, 0xf4, 0xef, 0x46, 0x48, 0x24, + 0x4d, 0x92, 0xa6, 0x89, 0x32, 0x67, 0x93, 0x15, 0xb2, 0x3e, 0x53, 0xb1, 0x5c, 0xb1, 0xf2, 0xfc, + 0x58, 0x06, 0x89, 0x99, 0x93, 0x4c, 0x8e, 0x5b, 0xc8, 0xb2, 0xd4, 0x6a, 0xe3, 0xfc, 0x7d, 0xb7, + 0x86, 0x36, 0xbb, 0x2e, 0xf2, 0x3f, 0xaa, 0xf8, 0xc3, 0x5b, 0x3d, 0xde, 0xca, 0x71, 0xc7, 0xbc, + 0x2d, 0x3f, 0xba, 0x66, 0xda, 0x1a, 0x5b, 0x67, 0x18, 0xbb, 0x97, 0xa5, 0x53, 0x43, 0xe9, 0xc0, + 0x6d, 0x93, 0xf6, 0xf4, 0xd4, 0xbe, 0xdd, 0xdb, 0x0a, 0x98, 0xef, 0x6c, 0xb4, 0x6b, 0xd3, 0x1d, + 0xd4, 0xd5, 0xb7, 0x23, 0x84, 0x5a, 0xec, 0x8e, 0xc8, 0xcb, 0x4f, 0xe0, 0x74, 0x96, 0xe2, 0xf1, + 0x78, 0xf3, 0x1b, 0xa1, 0xa4, 0x14, 0xdd, 0x59, 0xc7, 0xd0, 0xf0, 0x54, 0x51, 0x1f, 0xaa, 0x4b, + 0x7c, 0x34, 0x84, 0x43, 0x68, 0x8a, 0x42, 0x6d, 0x49, 0x90, 0x52, 0xaf, 0xab, 0x68, 0x06, 0x67, + 0x58, 0x39, 0x33, 0x21, 0x97, 0x2e, 0x04, 0x37, 0x5f, 0x5f, 0xcf, 0x87, 0x6e, 0x69, 0x2d, 0x04, + 0x73, 0xf2, 0x94, 0x09, 0x8a, 0xfc, 0x3d, 0xed, 0x1e, 0x5a, 0x11, 0xa9, 0x12, 0xb3, 0xa3, 0x88, + 0xe5, 0x8c, 0x56, 0xcb, 0x82, 0x56, 0x4b, 0x5e, 0x37, 0x60, 0xc3, 0xb9, 0x65, 0x38, 0xf5, 0x13, + 0xba, 0x7f, 0x25, 0xd8, 0x15, 0x05, 0xa7, 0xcd, 0x36, 0x0b, 0x75, 0x4a, 0x49, 0x4d, 0xc8, 0x8f, + 0xc3, 0xa6, 0xe2, 0x76, 0x3b, 0x70, 0xe9, 0x56, 0x4d, 0xa2, 0x22, 0x13, 0x7e, 0x23, 0x01, 0xc7, + 0x33, 0x87, 0x15, 0x97, 0x33, 0x81, 0x5d, 0x95, 0x5c, 0x76, 0x61, 0x39, 0x41, 0xb7, 0x42, 0x34, + 0x6e, 0xf0, 0xca, 0xcb, 0x11, 0x14, 0x25, 0xbf, 0xfe, 0xf1, 0xf1, 0x2c, 0x42, 0x51, 0x38, 0x74, + 0x28, 0x46, 0x44, 0xba, 0x73, 0x42, 0x0f, 0xca, 0xf9, 0x02, 0xce, 0x09, 0xd3, 0x1c, 0x14, 0xaf, + 0xcf, 0x6c, 0x56, 0xdd, 0xae, 0xb0, 0xa0, 0x55, 0xa3, 0xf5, 0xf1, 0x89, 0x0b, 0xd7, 0xdd, 0x51, + 0x72, 0xe7, 0xda, 0xef, 0x04, 0x9e, 0x6a, 0x78, 0xcc, 0x3b, 0xcc, 0x03, 0x9e, 0xc1, 0xec, 0x4e, + 0xf5, 0xd1, 0x92, 0x97, 0xfd, 0xc1, 0x53, 0xa2, 0x26, 0x25, 0xa3, 0x2f, 0xf6, 0x35, 0xe8, 0xdf, + 0x88, 0x4c, 0x1e, 0x97, 0x3d, 0x5d, 0xc7, 0x99, 0x4b, 0x88, 0x12, 0x02, 0x1a, 0x1b, 0x9a, 0x29, + 0x09, 0xb5, 0xcc, 0x16, 0x1b, 0x04, 0x08, 0xa1, 0xd0, 0xd8, 0xb8, 0x18, 0x67, 0x61, 0xb2, 0x81, + 0xaa, 0x28, 0xb4, 0x77, 0x2c, 0xe1, 0xc0, 0xc1, 0x09, 0x12, 0xe9, 0x3c, 0xbe, 0x6a, 0x13, 0x82, + 0x55, 0x0d, 0x55, 0x5c, 0xba, 0xa2, 0x83, 0x55, 0x8d, 0x55, 0xd8, 0x94, 0x7c, 0x6a, 0x32, 0x99, + 0x48, 0x31, 0x30, 0x31, 0x4d, 0x22, 0x9b, 0x2b, 0x42, 0x57, 0x42, 0xe4, 0xb1, 0xea, 0x5b, 0x3f, + 0xdc, 0xca, 0x4d, 0xd7, 0xd7, 0xa2, 0x69, 0x27, 0xb2, 0x37, 0x24, 0xf3, 0x47, 0x97, 0xc9, 0x82, + 0x15, 0x90, 0xd8, 0x14, 0x81, 0x4b, 0x53, 0xd0, 0x55, 0x85, 0xa8, 0x05, 0x53, 0x86, 0x2c, 0xb2, + 0xa6, 0x64, 0x31, 0x56, 0x98, 0x7d, 0xde, 0x9b, 0x85, 0xcc, 0x02, 0x3f, 0x1b, 0xce, 0x2e, 0x43, + 0x91, 0x27, 0xf6, 0x5b, 0x81, 0xc3, 0xa6, 0xb2, 0xb8, 0xae, 0x02, 0xb7, 0xc3, 0x8e, 0xae, 0xa9, + 0xb4, 0x54, 0x94, 0xd1, 0x51, 0x53, 0x86, 0x22, 0x04, 0x7e, 0xaf, 0x93, 0x2a, 0x35, 0xd8, 0xe1, + 0x98, 0xf6, 0xff, 0xd3, 0xea, 0xdd, 0x65, 0xa7, 0xad, 0xa9, 0xba, 0xfd, 0xcd, 0x72, 0x77, 0xb7, + 0x4a, 0xff, 0x60, 0x1a, 0x87, 0xae, 0x90, 0xce, 0xc1, 0x03, 0x0f, 0xf5, 0xb1, 0x6a, 0x55, 0x88, + 0x80, 0x57, 0x23, 0x63, 0x48, 0x36, 0x3d, 0x3f, 0xc2, 0x74, 0xd4, 0xe4, 0xae, 0xbb, 0x0f, 0x93, + 0xab, 0x4c, 0x3f, 0x80, 0xc3, 0x18, 0x9d, 0xe7, 0xe1, 0xc2, 0x4f, 0xf8, 0x6b, 0xc5, 0xcf, 0xad, + 0x6d, 0x77, 0x5e, 0xba, 0xa8, 0xfc, 0x3d, 0x6f, 0xaf, 0x46, 0x11, 0x82, 0xb4, 0x69, 0x81, 0xa6, + 0xa0, 0x16, 0x82, 0x89, 0x78, 0xd2, 0xe2, 0x85, 0x17, 0x23, 0x7c, 0xeb, 0x07, 0x87, 0xd8, 0x75, + 0x89, 0xf9, 0x82, 0xbe, 0xc4, 0xbc, 0x38, 0x72, 0xfe, 0xd4, 0x49, 0x34, 0x91, 0x0b, 0x5f, 0x6a, + 0x2c, 0x5f, 0x34, 0x18, 0xdf, 0xda, 0x31, 0x61, 0x6f, 0xb8, 0xe0, 0xa2, 0x77, 0xe1, 0xf6, 0xb8, + 0x99, 0x3b, 0xdb, 0x23, 0x16, 0x9b, 0xe6, 0xd5, 0xad, 0xcf, 0x31, 0x39, 0x79, 0x1c, 0x29, 0xa1, + 0xb2, 0x6a, 0x29, 0xeb, 0xd7, 0x9d, 0x87, 0x66, 0xd3, 0xe6, 0x4c, 0x0b, 0x10, 0xf4, 0xf7, 0x75, + 0x93, 0x8d, 0x1d, 0x64, 0xcd, 0xca, 0x7a, 0x54, 0x65, 0x3e, 0xcc, 0x27, 0x81, 0x9e, 0xb1, 0x28, + 0xbb, 0xba, 0xfb, 0x30, 0x2c, 0x0b, 0xbb, 0xa6, 0x71, 0x46, 0x73, 0x1d, 0x95, 0x01, 0xcf, 0xec, + 0x40, 0x72, 0x24, 0x7d, 0xc3, 0x19, 0x3e, 0xf7, 0xc5, 0xbd, 0xdc, 0xf7, 0xd3, 0x3e, 0xa4, 0x25, + 0x58, 0x55, 0x5f, 0xc9, 0xca, 0xc6, 0x1a, 0x6c, 0xaa, 0xc2, 0x68, 0x2c, 0xc1, 0x91, 0xa1, 0x51, + 0x8e, 0x0d, 0x47, 0xb0, 0x69, 0x36, 0xae, 0x3e, 0x7b, 0x25, 0xab, 0x1a, 0x6a, 0xa8, 0xf2, 0x7b, + 0x18, 0x4f, 0xa4, 0x38, 0x38, 0x34, 0xca, 0xab, 0x9d, 0x5d, 0x0c, 0xf5, 0x0f, 0xb0, 0x54, 0xcb, + 0xb2, 0xc0, 0x01, 0x0e, 0x55, 0x14, 0x05, 0x1d, 0x37, 0x05, 0x0f, 0x67, 0x04, 0x9f, 0xba, 0x63, + 0x15, 0xef, 0xbd, 0xb2, 0xa6, 0x30, 0x80, 0xf5, 0x14, 0x13, 0x73, 0x65, 0xbe, 0x2b, 0xd8, 0xb4, + 0x2c, 0x74, 0x65, 0x96, 0x74, 0x6f, 0x4a, 0x38, 0x70, 0x78, 0x90, 0xfb, 0x8e, 0x1c, 0x8d, 0xee, + 0x68, 0xb4, 0x9a, 0x36, 0xad, 0x1b, 0x9f, 0x38, 0x65, 0x65, 0x6f, 0xbf, 0xbf, 0x2a, 0xbb, 0x3d, + 0xf5, 0xe2, 0xba, 0x47, 0x43, 0xcd, 0x6f, 0x7d, 0x4b, 0x15, 0x07, 0x0e, 0x4c, 0xb1, 0x7f, 0x7f, + 0x94, 0x6f, 0xdc, 0xbe, 0x0a, 0x97, 0x4b, 0xe1, 0xc9, 0x27, 0x87, 0xb8, 0xf3, 0xae, 0xc3, 0x18, + 0x0e, 0x48, 0x5e, 0x1a, 0x1a, 0x77, 0x9d, 0xcf, 0x45, 0x63, 0x57, 0x0c, 0xec, 0x2c, 0x0a, 0x38, + 0xf4, 0x1b, 0x97, 0x2d, 0xf7, 0x8a, 0xbc, 0xe3, 0x92, 0xc3, 0xa1, 0x0f, 0x7f, 0xfb, 0x2b, 0xab, + 0x44, 0x79, 0xc8, 0x36, 0xbf, 0x2b, 0x41, 0xe4, 0xd3, 0x83, 0x8c, 0x21, 0x79, 0x7a, 0xe3, 0x28, + 0xc1, 0x90, 0xce, 0xc7, 0x6e, 0xdf, 0x9b, 0x3e, 0xba, 0xc2, 0x79, 0x71, 0xfc, 0x5f, 0xfb, 0x5e, + 0x3c, 0xd5, 0x45, 0x5d, 0xbc, 0xcb, 0x77, 0xc9, 0x59, 0x3b, 0xac, 0x47, 0xce, 0xac, 0xff, 0x2b, + 0xfb, 0xa2, 0xa5, 0xcb, 0x4e, 0x18, 0xff, 0x2c, 0x31, 0x8c, 0x1c, 0x53, 0x93, 0xf9, 0xc1, 0x2b, + 0x25, 0xa5, 0x61, 0xd4, 0x13, 0x3a, 0x11, 0x67, 0x26, 0xd7, 0xed, 0x7c, 0xed, 0x45, 0xd6, 0x2c, + 0xf7, 0x12, 0x0e, 0xba, 0x8b, 0xe4, 0xb5, 0xfc, 0xc8, 0x07, 0x8b, 0xcd, 0x07, 0xbb, 0x98, 0x4c, + 0x26, 0xf3, 0x01, 0x0c, 0xe0, 0xd4, 0x75, 0xce, 0x5b, 0xd8, 0x8c, 0xdb, 0x6e, 0x9b, 0x37, 0x4d, + 0xbe, 0x7f, 0x34, 0xc3, 0x67, 0xbf, 0xb0, 0x97, 0xdd, 0xcf, 0x67, 0xf9, 0xfe, 0x2d, 0xd7, 0xb2, + 0xb8, 0xbc, 0x34, 0xff, 0x4d, 0x2e, 0x85, 0x51, 0x4e, 0x7b, 0x7b, 0x87, 0xf8, 0xf5, 0xab, 0x7b, + 0x58, 0xd3, 0xda, 0xc0, 0xbb, 0xd7, 0x2c, 0xc9, 0x0b, 0xa1, 0xe0, 0x42, 0x12, 0x59, 0x83, 0x3d, + 0x7d, 0x83, 0xdc, 0xbd, 0xe9, 0x55, 0x0e, 0xec, 0x39, 0xc0, 0x05, 0x3e, 0x93, 0x52, 0x15, 0x0c, + 0x60, 0xe3, 0x94, 0xa4, 0xfd, 0xda, 0x06, 0xbe, 0x7c, 0xdb, 0x72, 0x82, 0x9e, 0x13, 0xfa, 0x97, + 0xe6, 0x4b, 0x78, 0xde, 0x3c, 0xec, 0xb9, 0x53, 0x74, 0xa3, 0xb1, 0x34, 0xbf, 0x78, 0x6a, 0xa7, + 0xf5, 0x60, 0x43, 0xe0, 0xd3, 0xbb, 0x57, 0xf5, 0x7d, 0x6d, 0x22, 0x18, 0x3f, 0xa5, 0xe7, 0x28, + 0xed, 0x54, 0x1b, 0xb2, 0xdb, 0x6a, 0x1e, 0xb7, 0x76, 0x27, 0x6a, 0xb5, 0x0a, 0x05, 0xf3, 0xa8, + 0x61, 0xf7, 0xee, 0xcc, 0x38, 0xa8, 0xd2, 0x65, 0xf2, 0x4a, 0x46, 0x71, 0x65, 0xb6, 0x88, 0x94, + 0xb2, 0x47, 0x5d, 0xc1, 0x13, 0x91, 0xc5, 0xf1, 0xed, 0xf3, 0xdc, 0x8d, 0x95, 0x36, 0x2e, 0xa9, + 0xef, 0xd4, 0x3f, 0xf0, 0x89, 0x0f, 0x77, 0x88, 0x70, 0x89, 0x6d, 0xb6, 0xa7, 0x63, 0x6e, 0x97, + 0xa1, 0x80, 0x81, 0x91, 0x0c, 0xdb, 0x76, 0x8c, 0xd3, 0xb1, 0xd0, 0xcb, 0xd2, 0x72, 0x8f, 0x43, + 0x93, 0xe2, 0x7d, 0x65, 0x77, 0xb5, 0x9c, 0x92, 0xdd, 0xdb, 0x5f, 0xe2, 0xd8, 0xd4, 0x53, 0x59, + 0xb2, 0xa9, 0xa7, 0xa7, 0x53, 0x66, 0xb3, 0x99, 0x79, 0x1e, 0x6f, 0x86, 0x17, 0x5d, 0x1a, 0xae, + 0x20, 0x5c, 0x56, 0x81, 0x72, 0x0a, 0xc6, 0x47, 0x1e, 0xf0, 0x50, 0xa8, 0xae, 0x69, 0x66, 0x78, + 0x34, 0x5a, 0x08, 0x6c, 0x66, 0xf3, 0xbe, 0x8c, 0x69, 0x91, 0x2c, 0x8c, 0x1b, 0x9c, 0x99, 0x17, + 0x99, 0xca, 0xe6, 0x18, 0x9d, 0x4e, 0xc0, 0x09, 0x93, 0x30, 0x6a, 0xca, 0xec, 0x7c, 0xf9, 0xf3, + 0xcb, 0x78, 0xcb, 0x3b, 0x7c, 0xdc, 0xf5, 0x9b, 0x17, 0x38, 0x36, 0x32, 0x8e, 0x65, 0x59, 0xa8, + 0x52, 0x12, 0x72, 0xd8, 0x39, 0xaf, 0xbd, 0x81, 0x3b, 0xae, 0x7b, 0x1b, 0xed, 0x15, 0xa5, 0x3c, + 0xb5, 0xeb, 0x10, 0x86, 0x99, 0xff, 0xca, 0x00, 0x69, 0x49, 0x5c, 0x9a, 0xca, 0xfa, 0xc6, 0x5a, + 0xbe, 0x7d, 0xe3, 0x3b, 0xf9, 0xf8, 0x0d, 0x57, 0xf1, 0xbc, 0xf4, 0x33, 0x64, 0xc0, 0x2b, 0xd3, + 0xe0, 0x38, 0x2b, 0xcc, 0x27, 0x3f, 0xd6, 0x41, 0xe0, 0x74, 0xc2, 0x9d, 0x91, 0xf0, 0xdc, 0x1e, + 0xe8, 0x39, 0x8f, 0x7c, 0x03, 0x9f, 0xc0, 0x6e, 0x2a, 0x8a, 0x0f, 0xe5, 0x1d, 0x7a, 0x46, 0xd5, + 0x4f, 0x67, 0xa6, 0x23, 0xed, 0x66, 0xb7, 0xad, 0x5e, 0xac, 0xb0, 0xb7, 0x53, 0xa6, 0x2f, 0xa2, + 0xcc, 0xfd, 0x0e, 0xb5, 0x21, 0xfd, 0x71, 0x73, 0x49, 0xe6, 0xa3, 0xc6, 0x62, 0xdb, 0xea, 0x6c, + 0x83, 0xfd, 0xe2, 0xd4, 0xbb, 0x1c, 0x57, 0xc7, 0x6f, 0x3b, 0x51, 0xb8, 0x00, 0x9a, 0x18, 0xe5, + 0x5f, 0x6f, 0x58, 0x51, 0xa7, 0x2f, 0x5b, 0xe4, 0xcb, 0x47, 0x5f, 0xe2, 0x04, 0xd4, 0x57, 0xe6, + 0x77, 0x60, 0x57, 0x57, 0x9c, 0xd7, 0x5f, 0x9f, 0x62, 0xd7, 0x8e, 0x29, 0x8e, 0x76, 0x27, 0xc8, + 0x55, 0x06, 0x24, 0xe6, 0xa9, 0xaf, 0xe9, 0x40, 0xdd, 0x68, 0xe6, 0xdc, 0x07, 0x6b, 0x6e, 0x88, + 0x98, 0x63, 0x87, 0xa3, 0x93, 0x93, 0x81, 0x70, 0x79, 0x05, 0x27, 0xb7, 0x35, 0x89, 0xdf, 0xc7, + 0xe4, 0xc1, 0xe7, 0x0f, 0x90, 0x8c, 0xaa, 0xf3, 0x90, 0x68, 0x49, 0x7e, 0x4a, 0x9e, 0xa6, 0x08, + 0xd2, 0x73, 0x68, 0xba, 0x52, 0x48, 0x26, 0x13, 0x29, 0x1a, 0xca, 0x82, 0x85, 0x79, 0x5b, 0xb3, + 0x7d, 0x4a, 0x95, 0xa5, 0x3a, 0x9f, 0xfd, 0xe7, 0x85, 0xfc, 0xe2, 0xc1, 0x5e, 0xfe, 0xfe, 0x47, + 0xf7, 0x73, 0xdd, 0xf2, 0xf5, 0x5c, 0xbe, 0x72, 0x11, 0x01, 0x97, 0x03, 0x2c, 0x0b, 0x4d, 0x08, + 0x56, 0x37, 0x54, 0xb3, 0xa8, 0xaa, 0x6c, 0x36, 0xb7, 0x9c, 0x33, 0x5c, 0xc6, 0xa9, 0x69, 0x5c, + 0xb6, 0xac, 0x83, 0xfd, 0x7d, 0xc3, 0xdc, 0xf5, 0xcc, 0x8b, 0x9c, 0x77, 0x69, 0x19, 0x5f, 0xfc, + 0xfc, 0x32, 0x1a, 0xaa, 0x9d, 0x88, 0x37, 0x2a, 0x7b, 0xcd, 0x81, 0x2c, 0x4d, 0x29, 0xe9, 0x1f, + 0x8f, 0x02, 0x82, 0xda, 0x92, 0xc2, 0xd8, 0xe1, 0x9c, 0x81, 0x69, 0x64, 0x65, 0x45, 0xca, 0xdc, + 0x61, 0xaa, 0xf2, 0x0d, 0x87, 0x95, 0x8e, 0x6f, 0xe8, 0x9e, 0xfb, 0xfa, 0x48, 0xfe, 0x91, 0xfe, + 0xfd, 0xc4, 0x77, 0xa7, 0x30, 0x17, 0x2f, 0xec, 0x08, 0x60, 0xb3, 0x09, 0x86, 0x23, 0x59, 0x82, + 0x7e, 0x0d, 0xbb, 0x26, 0xc8, 0x1a, 0x16, 0xa6, 0x05, 0x4e, 0x3d, 0x4f, 0xd1, 0x3c, 0x7a, 0x34, + 0xce, 0x92, 0x85, 0x01, 0xfe, 0xf6, 0xe3, 0x5b, 0x98, 0xbc, 0x2e, 0xb7, 0xd7, 0xb9, 0x36, 0x76, + 0x5b, 0xe4, 0xe2, 0xf4, 0x69, 0xeb, 0x54, 0x93, 0x8b, 0x46, 0xa3, 0xf5, 0xaf, 0xa9, 0x2f, 0x4c, + 0x4c, 0x4c, 0xbc, 0x3d, 0x5c, 0x5e, 0xce, 0x7f, 0xaf, 0x1d, 0x62, 0xce, 0xc4, 0xd7, 0xb9, 0x2d, + 0xf5, 0x05, 0xa6, 0x86, 0x5d, 0x53, 0xf1, 0x3a, 0x1c, 0x24, 0xd2, 0xd9, 0x59, 0x4f, 0x82, 0x40, + 0x3b, 0x0d, 0xff, 0x4b, 0x08, 0x81, 0xcf, 0xa5, 0xf2, 0xfe, 0xeb, 0x1b, 0x39, 0xeb, 0xac, 0x72, + 0xee, 0xfa, 0xfe, 0x5e, 0x7e, 0x76, 0xd7, 0x36, 0xfe, 0xaa, 0xad, 0x9d, 0x0d, 0x1d, 0xcd, 0xb4, + 0x55, 0x86, 0x09, 0xb9, 0x5d, 0x78, 0x5c, 0x5a, 0xa1, 0xd9, 0x6c, 0x86, 0x29, 0x6a, 0xd1, 0x37, + 0x11, 0x65, 0x77, 0xcf, 0x00, 0x4f, 0xef, 0x7a, 0x9d, 0x97, 0xbb, 0x8f, 0xf0, 0xa1, 0x7f, 0x6c, + 0xe5, 0xc3, 0x1f, 0x6c, 0xa7, 0xb2, 0xd4, 0xc6, 0xac, 0x61, 0x79, 0x43, 0xb2, 0x11, 0x52, 0x4a, + 0x7a, 0xc6, 0xa2, 0xec, 0xec, 0xea, 0xc3, 0x65, 0xd7, 0x29, 0xf5, 0xb9, 0x70, 0xe9, 0x36, 0x26, + 0xa3, 0x29, 0xa6, 0x89, 0x73, 0x2c, 0xac, 0x45, 0x85, 0xb0, 0xfe, 0x57, 0x7a, 0x59, 0x34, 0x59, + 0xf0, 0x13, 0x29, 0x43, 0xf2, 0xe3, 0x7b, 0xbb, 0xf8, 0xe0, 0xdf, 0xb6, 0xa0, 0x7b, 0x04, 0xdb, + 0x76, 0x4d, 0xa0, 0x6a, 0x2a, 0x6b, 0x57, 0x06, 0x10, 0x08, 0x96, 0x2e, 0x0d, 0x52, 0xd7, 0xe0, + 0xe5, 0x81, 0xde, 0xae, 0x89, 0x58, 0x1d, 0x17, 0x45, 0x2e, 0x4e, 0xbf, 0xe1, 0x0c, 0xe4, 0x6e, + 0x87, 0xd3, 0x59, 0x1e, 0x70, 0x9d, 0x9d, 0x4a, 0x25, 0x4e, 0xbb, 0xf8, 0xd9, 0xb6, 0xd4, 0x53, + 0xdc, 0x20, 0x99, 0x9f, 0x64, 0x67, 0x19, 0xb3, 0xc9, 0xea, 0xcc, 0x1d, 0x50, 0x04, 0xd4, 0x94, + 0x04, 0x18, 0x99, 0x8e, 0x61, 0x15, 0xee, 0x8b, 0x22, 0xa0, 0xdc, 0xef, 0x41, 0x9c, 0x26, 0x01, + 0x12, 0x12, 0x54, 0x29, 0x58, 0xd8, 0xe8, 0xe6, 0x1b, 0x5f, 0x5d, 0x42, 0xe7, 0xd1, 0x38, 0x0f, + 0x3f, 0xdc, 0xcf, 0x17, 0x37, 0xed, 0x24, 0xd2, 0x2f, 0xf1, 0x69, 0x1e, 0x2a, 0x83, 0x3e, 0x5c, + 0xba, 0x0d, 0x24, 0x8c, 0xc5, 0x12, 0x44, 0x62, 0x31, 0x26, 0x32, 0x71, 0x82, 0x15, 0x82, 0x33, + 0xcf, 0x0c, 0x73, 0xef, 0xbf, 0xae, 0x65, 0xd5, 0xf2, 0x00, 0x33, 0xf3, 0xc5, 0x65, 0xca, 0x86, + 0x31, 0xe0, 0x44, 0x6b, 0x9e, 0xce, 0x7f, 0xc0, 0x09, 0x85, 0xfe, 0x99, 0xba, 0xb0, 0x25, 0x25, + 0x43, 0x53, 0xd3, 0xa7, 0x6c, 0x7c, 0xcf, 0x9a, 0xb5, 0xc4, 0x7d, 0x99, 0xd1, 0xd1, 0xd2, 0xf8, + 0xff, 0xca, 0xec, 0x0e, 0x2d, 0xa5, 0xbb, 0x72, 0xdb, 0x77, 0x4c, 0xda, 0xea, 0xeb, 0xbc, 0xfc, + 0xf6, 0xb7, 0x03, 0xbc, 0xfd, 0xed, 0x35, 0x04, 0x3d, 0x2e, 0x3c, 0x5e, 0x1b, 0x0f, 0xfe, 0xba, + 0x8f, 0x25, 0x8b, 0xfd, 0xb8, 0x75, 0x58, 0x73, 0x46, 0x80, 0xa7, 0x7e, 0x37, 0x42, 0xca, 0x5f, + 0x63, 0x68, 0x53, 0x4a, 0x1c, 0x0e, 0xbf, 0xb1, 0x0e, 0x4a, 0xb0, 0xa4, 0xd0, 0x52, 0xc9, 0xf8, + 0xc9, 0xe5, 0xb5, 0x99, 0x29, 0x73, 0xa9, 0x24, 0xba, 0xdd, 0x81, 0xaa, 0x28, 0xa7, 0x92, 0x2f, + 0x99, 0x4c, 0x66, 0x66, 0x07, 0xce, 0x33, 0x7b, 0x8a, 0x94, 0xd4, 0x86, 0x7c, 0x44, 0x93, 0x61, + 0x0e, 0x0f, 0x8d, 0x22, 0x91, 0x54, 0x07, 0x83, 0x94, 0x78, 0x9d, 0x79, 0xf5, 0x13, 0x27, 0x5c, + 0xc8, 0x8c, 0xdd, 0x35, 0x05, 0xb9, 0x2d, 0x61, 0x70, 0x48, 0x16, 0x2f, 0xb1, 0xb1, 0xe8, 0x9f, + 0x3c, 0x7c, 0xe2, 0xa3, 0xed, 0xf4, 0x0f, 0x67, 0x18, 0x1e, 0x4e, 0x31, 0xd8, 0x9f, 0xe0, 0x78, + 0x57, 0x96, 0x64, 0xca, 0xe4, 0x82, 0x36, 0x3f, 0xe5, 0x95, 0x15, 0x54, 0x54, 0x38, 0xa9, 0xaf, + 0x72, 0xe2, 0x71, 0xa9, 0x79, 0xaa, 0xac, 0x90, 0xc8, 0x69, 0x1b, 0xd9, 0x9d, 0xa5, 0xc8, 0x71, + 0x1d, 0xfb, 0xa5, 0x43, 0xc5, 0x56, 0x15, 0x4e, 0x53, 0xb7, 0x56, 0x84, 0xa0, 0xcc, 0xef, 0x61, + 0x68, 0x72, 0x8a, 0x2a, 0xbf, 0x0f, 0x47, 0xa1, 0x77, 0xda, 0xe3, 0xb6, 0x63, 0x19, 0x4e, 0x92, + 0xc9, 0xff, 0xbd, 0x46, 0x34, 0xcd, 0x5e, 0xeb, 0xff, 0xc8, 0x77, 0x1f, 0x8a, 0x7d, 0xf3, 0xb9, + 0x97, 0xb6, 0x3b, 0xb7, 0xa7, 0x62, 0xf2, 0x0b, 0x5f, 0xde, 0x2b, 0x6e, 0xfd, 0xf0, 0x02, 0xca, + 0xca, 0x5d, 0x1c, 0x3b, 0x16, 0xe7, 0x33, 0xb7, 0xed, 0x65, 0xf5, 0xea, 0x52, 0x86, 0x86, 0x92, + 0xdc, 0xdb, 0xd9, 0x1d, 0x8b, 0x9d, 0x21, 0xde, 0xa9, 0xfa, 0xcb, 0x93, 0xbf, 0xef, 0xc4, 0x8e, + 0xb4, 0x3b, 0x21, 0xb0, 0x3d, 0x39, 0x36, 0x72, 0xfc, 0xda, 0x54, 0x62, 0x0d, 0x2e, 0xb7, 0x6b, + 0x5e, 0x9e, 0xd8, 0x75, 0xfc, 0x18, 0x3b, 0x77, 0xfe, 0x8e, 0x40, 0xa0, 0x9e, 0x73, 0xcf, 0xbb, + 0x30, 0xdf, 0x30, 0x2e, 0xc4, 0x3c, 0x55, 0x95, 0x27, 0x38, 0xb8, 0xb9, 0xb7, 0x50, 0x55, 0x04, + 0x4b, 0xea, 0xca, 0x68, 0x2a, 0x0f, 0x92, 0x33, 0x2c, 0xfc, 0x2e, 0x7b, 0x81, 0xba, 0x32, 0xeb, + 0xab, 0xe7, 0xff, 0x9d, 0x00, 0x9b, 0x85, 0xbe, 0x61, 0x84, 0xdc, 0xbe, 0x52, 0x12, 0xdf, 0x6d, + 0x46, 0x29, 0xcf, 0xa2, 0x2f, 0x9b, 0xa2, 0xa5, 0x39, 0x4e, 0x5b, 0xad, 0x13, 0xb9, 0x36, 0x98, + 0xaf, 0x64, 0xc9, 0xbc, 0x50, 0x84, 0x00, 0xa1, 0x14, 0xe8, 0x40, 0x49, 0x0d, 0xa3, 0xdb, 0x43, + 0x76, 0x57, 0x00, 0xab, 0xdb, 0x81, 0x6d, 0x45, 0x0c, 0xfb, 0xe5, 0x03, 0x08, 0x9b, 0x39, 0xbf, + 0x1d, 0xe6, 0x84, 0xaf, 0x23, 0x98, 0xf9, 0x02, 0xb0, 0xe6, 0xb2, 0x10, 0x35, 0x21, 0x3f, 0x76, + 0x4d, 0x29, 0x7c, 0xf1, 0x16, 0x84, 0x82, 0x6e, 0x5a, 0xab, 0x53, 0x34, 0x44, 0xec, 0x81, 0xc1, + 0x49, 0x97, 0x18, 0x0b, 0xfe, 0xbf, 0x97, 0xb4, 0x66, 0x0c, 0x7b, 0xff, 0x93, 0xff, 0x3b, 0xd5, + 0x7d, 0xc8, 0x9e, 0xfc, 0x6b, 0xb7, 0x6e, 0x7f, 0xed, 0x99, 0xa7, 0x73, 0x57, 0x3f, 0x77, 0xc7, + 0x96, 0x25, 0x01, 0x4c, 0x22, 0xba, 0x86, 0x55, 0x6a, 0x8d, 0xde, 0x7d, 0xfc, 0xf8, 0xb8, 0xe2, + 0x0c, 0x0c, 0x6a, 0xd7, 0xf3, 0xf5, 0xa9, 0x73, 0xa3, 0xaf, 0x40, 0xf4, 0xf7, 0x9e, 0x38, 0x6b, + 0x1b, 0xb7, 0xd2, 0xa5, 0xea, 0x58, 0xba, 0xcb, 0xa4, 0xaf, 0xa7, 0x8b, 0xf6, 0x85, 0x8b, 0x8a, + 0x37, 0xdf, 0x34, 0x4d, 0x7a, 0x7a, 0x0e, 0x63, 0x59, 0x71, 0xc6, 0xc7, 0x0f, 0xd1, 0xdf, 0xdf, + 0x4e, 0x63, 0x63, 0xf3, 0x49, 0x0c, 0x4a, 0xaf, 0xc7, 0xc3, 0x48, 0x5f, 0xaa, 0x88, 0x3c, 0x89, + 0x39, 0xda, 0x9f, 0x47, 0x69, 0x04, 0x5e, 0xbb, 0x9e, 0x67, 0xbe, 0x9f, 0x10, 0xd8, 0x9c, 0x38, + 0xa2, 0x58, 0xce, 0xf1, 0x04, 0xda, 0xd2, 0x08, 0x4a, 0x63, 0x94, 0xdc, 0xcb, 0x61, 0x32, 0x4f, + 0x95, 0x41, 0xba, 0x1c, 0xe1, 0xb6, 0x10, 0xe1, 0x2c, 0xc2, 0x63, 0xa2, 0x84, 0x33, 0x98, 0x42, + 0x42, 0x56, 0xc3, 0x1a, 0xd3, 0xb1, 0xc6, 0x6d, 0xc8, 0x88, 0x06, 0x52, 0xa0, 0xd4, 0xa7, 0x71, + 0x5c, 0x3b, 0x80, 0xd6, 0x10, 0x2f, 0x46, 0xc9, 0xa7, 0xf4, 0xc0, 0x27, 0x4c, 0x82, 0x57, 0x14, + 0x81, 0xb3, 0x30, 0xf8, 0x7c, 0xe6, 0x9a, 0x74, 0x4d, 0xa5, 0xa1, 0xda, 0x27, 0x2a, 0x07, 0x87, + 0xde, 0xd1, 0xf0, 0x7a, 0xd9, 0xbf, 0x8d, 0xd1, 0x9d, 0xf9, 0x7f, 0x2e, 0xe0, 0xf1, 0x6b, 0x0f, + 0x4a, 0xe0, 0x37, 0x85, 0x07, 0xa1, 0x17, 0xe5, 0xbf, 0x1b, 0x86, 0x70, 0x8d, 0xa6, 0x33, 0xa8, + 0x41, 0x1d, 0xf7, 0x55, 0x46, 0x96, 0x32, 0xcb, 0x50, 0xf5, 0x09, 0x63, 0x40, 0xfc, 0xd7, 0xa7, + 0x78, 0xbd, 0xd2, 0x96, 0xb1, 0x42, 0x3b, 0x7d, 0x1b, 0x1b, 0xbc, 0xd6, 0xdf, 0x1d, 0x3f, 0xba, + 0x47, 0xaf, 0xad, 0xaf, 0xc7, 0xe5, 0xf6, 0xcc, 0xc3, 0x82, 0xf2, 0x6b, 0x35, 0x99, 0x9c, 0x88, + 0xcc, 0x17, 0x70, 0x41, 0x42, 0x6e, 0x8f, 0x87, 0x68, 0x0c, 0x52, 0xe9, 0x1c, 0x2e, 0x87, 0x6d, + 0x3e, 0xb5, 0xb2, 0x50, 0x3c, 0xc8, 0x64, 0x72, 0x18, 0x85, 0x39, 0x97, 0xba, 0x6e, 0xc3, 0x66, + 0x53, 0x67, 0x3b, 0xfd, 0xe5, 0x2c, 0xfa, 0x94, 0xcd, 0x19, 0x24, 0x12, 0x69, 0x62, 0xa9, 0x4c, + 0x91, 0x2c, 0x67, 0x5b, 0x39, 0x86, 0x77, 0x95, 0x07, 0x75, 0xc2, 0x87, 0xd2, 0xeb, 0xc3, 0xea, + 0x75, 0x61, 0xf6, 0x69, 0x98, 0x9d, 0x4e, 0x30, 0x05, 0x28, 0x12, 0xe1, 0xb2, 0x10, 0x7e, 0x13, + 0xed, 0xbc, 0x18, 0xda, 0x82, 0x18, 0x4a, 0x38, 0x05, 0x8a, 0x9c, 0x2d, 0x42, 0x48, 0x39, 0xbf, + 0x0f, 0x89, 0x22, 0xa1, 0x33, 0x3f, 0x13, 0xac, 0xc0, 0xba, 0x60, 0x0e, 0x6d, 0x76, 0x6e, 0x97, + 0xa3, 0xa2, 0xaa, 0x78, 0xba, 0xbd, 0x6a, 0x69, 0xd4, 0x25, 0x4e, 0xd3, 0x9c, 0xf0, 0x3f, 0x13, + 0xf0, 0x49, 0x95, 0xa2, 0x73, 0x12, 0x59, 0xa0, 0xf0, 0xa5, 0x8a, 0x31, 0xf8, 0xe8, 0x1f, 0x7e, + 0xf2, 0x21, 0xd5, 0xbb, 0xb1, 0xcb, 0xed, 0x79, 0xda, 0x39, 0x32, 0xfc, 0xb6, 0x43, 0x07, 0xf7, + 0x8b, 0xe5, 0x2b, 0xf3, 0x5f, 0xaa, 0xa1, 0x69, 0x2a, 0xe1, 0x70, 0x15, 0xa3, 0xa3, 0xaf, 0x17, + 0x18, 0x1b, 0xa7, 0x20, 0xcc, 0x21, 0xd0, 0x75, 0x3b, 0xfe, 0x50, 0x3d, 0xdb, 0x77, 0x75, 0xb3, + 0x66, 0x75, 0x73, 0xfe, 0x8b, 0x23, 0x2d, 0x49, 0x2c, 0x9e, 0xa6, 0xaf, 0x2f, 0xc2, 0xb1, 0xae, + 0x49, 0x26, 0x26, 0x0d, 0x72, 0x46, 0x02, 0xcb, 0x8a, 0xa1, 0xdb, 0x34, 0xbc, 0x1e, 0x17, 0x7e, + 0x9f, 0x87, 0x60, 0xd0, 0x83, 0xdf, 0xeb, 0x24, 0x93, 0xcd, 0x31, 0x38, 0x3c, 0xc9, 0xc8, 0xc8, + 0x24, 0xa9, 0x34, 0x68, 0x5a, 0x35, 0xbe, 0x40, 0x33, 0xaa, 0xa2, 0x91, 0x88, 0x0f, 0x91, 0x4e, + 0x1f, 0x40, 0xd7, 0x33, 0x78, 0xbd, 0x2e, 0x42, 0x2d, 0x3e, 0xc2, 0x21, 0x1f, 0x7e, 0x97, 0x0f, + 0x5d, 0xb7, 0xe5, 0x7b, 0x95, 0x75, 0x0b, 0xa9, 0xe4, 0x67, 0x53, 0x8f, 0x8d, 0x4f, 0xd3, 0xbf, + 0x27, 0x42, 0x3a, 0x9d, 0x45, 0x55, 0x04, 0x15, 0x15, 0x21, 0xea, 0x6a, 0xc3, 0xf8, 0x7c, 0x2e, + 0x34, 0x55, 0xc1, 0x30, 0x2d, 0x62, 0xb1, 0x14, 0x83, 0x83, 0x13, 0x0c, 0x0c, 0x4d, 0x90, 0x48, + 0x26, 0x51, 0x15, 0x85, 0x96, 0xa6, 0x6a, 0xda, 0xda, 0x2a, 0x71, 0x3b, 0xed, 0xf3, 0xb0, 0xea, + 0x4c, 0xce, 0x60, 0x64, 0x78, 0x82, 0xa9, 0x95, 0x63, 0xd1, 0xa3, 0x4d, 0xca, 0xff, 0x4e, 0x90, + 0xc5, 0xff, 0xe2, 0xb1, 0x63, 0xd9, 0x40, 0xba, 0x72, 0x53, 0xd3, 0xf5, 0x0e, 0x4d, 0xfe, 0x52, + 0xed, 0xda, 0x76, 0x69, 0x65, 0x65, 0x35, 0x95, 0xd5, 0xb5, 0x48, 0x09, 0x0d, 0x8d, 0x2d, 0x74, + 0x77, 0x1f, 0x20, 0x1e, 0x1f, 0xc1, 0xe7, 0x0b, 0x9c, 0x14, 0xa0, 0x49, 0x69, 0x31, 0xd0, 0xd7, + 0x4b, 0xf7, 0xb1, 0xfd, 0x4c, 0x47, 0x07, 0xe8, 0xea, 0x1e, 0xc4, 0xeb, 0xf5, 0x10, 0x8f, 0x67, + 0x30, 0xad, 0x4a, 0xda, 0x16, 0x5c, 0xcb, 0xfa, 0x0d, 0xe7, 0x62, 0x77, 0xf8, 0x48, 0xa7, 0xa6, + 0x19, 0x1d, 0x39, 0xc0, 0x40, 0xff, 0x6b, 0xf4, 0xf7, 0x3f, 0xc7, 0xc8, 0x58, 0x37, 0x92, 0x2c, + 0x42, 0x48, 0x8c, 0x1c, 0xd8, 0x6c, 0x4b, 0x58, 0xbe, 0xe2, 0x6f, 0xa8, 0xad, 0x5b, 0x47, 0x69, + 0xb8, 0x0d, 0x97, 0x2b, 0xdf, 0xad, 0x90, 0xcd, 0x26, 0x88, 0x8c, 0x1d, 0xa6, 0xaf, 0x67, 0x0b, + 0xfb, 0xf7, 0x3f, 0x46, 0xe7, 0x91, 0x17, 0x71, 0x39, 0x25, 0x9a, 0x6d, 0x16, 0x2a, 0x51, 0x2c, + 0x81, 0x33, 0x67, 0xc3, 0x9b, 0xd6, 0x19, 0x1c, 0xb2, 0xd8, 0x9d, 0x70, 0x72, 0xe1, 0xc5, 0x57, + 0xa0, 0x58, 0xc3, 0xec, 0xd9, 0x7f, 0x94, 0xed, 0x3b, 0xf7, 0xa0, 0x69, 0x0a, 0x9a, 0xa6, 0xa0, + 0x28, 0x5e, 0x6c, 0x7a, 0x29, 0xf1, 0x84, 0x8b, 0xc1, 0x41, 0x0f, 0x7d, 0xbd, 0x47, 0xe8, 0x58, + 0x60, 0x63, 0x78, 0xf4, 0x28, 0xdb, 0x77, 0x77, 0x52, 0x53, 0x5d, 0x41, 0x75, 0x55, 0x08, 0xb7, + 0xdb, 0x4e, 0x26, 0x63, 0x70, 0xec, 0xd8, 0x10, 0x9d, 0x9d, 0x53, 0x1c, 0x5e, 0x5a, 0x65, 0x9f, + 0xb6, 0xf5, 0xff, 0xaf, 0x4c, 0x29, 0xfd, 0xa3, 0x8c, 0x3e, 0xbd, 0x7c, 0x53, 0xa8, 0x66, 0x61, + 0xbf, 0x71, 0x60, 0x61, 0xae, 0xc2, 0x77, 0xde, 0xf9, 0x97, 0x63, 0x77, 0xe4, 0x0b, 0x0b, 0xb1, + 0xf8, 0x34, 0x89, 0x78, 0x8c, 0x70, 0xb8, 0xa2, 0xd8, 0x6e, 0x3a, 0xe3, 0x63, 0x0f, 0x1f, 0xda, + 0xcf, 0xbe, 0xdd, 0xdb, 0x11, 0xe1, 0x77, 0x60, 0x04, 0xcf, 0xc1, 0xea, 0x3c, 0xc4, 0x7b, 0xdf, + 0xf3, 0x4e, 0x14, 0x01, 0x6e, 0x77, 0x18, 0x97, 0xbb, 0x14, 0x21, 0xd4, 0x79, 0x66, 0xdb, 0xb2, + 0xb2, 0x24, 0x13, 0x13, 0x44, 0x22, 0x87, 0x99, 0x9a, 0x1c, 0x60, 0xd3, 0xf3, 0x07, 0xf9, 0xe5, + 0x2f, 0x7f, 0x45, 0x2c, 0x9e, 0xe2, 0x9d, 0xef, 0xbc, 0x86, 0x6b, 0xae, 0x79, 0x1f, 0x0b, 0x16, + 0x2c, 0x98, 0xd7, 0x2f, 0x25, 0x25, 0x1c, 0x3b, 0x76, 0x84, 0x4f, 0x7f, 0xfa, 0x93, 0x24, 0x93, + 0x19, 0x26, 0x87, 0x3b, 0xf9, 0x4c, 0x15, 0x2c, 0x71, 0x3b, 0x40, 0x82, 0x6a, 0x29, 0xd8, 0xd3, + 0x0a, 0x18, 0x82, 0xbb, 0xbb, 0x23, 0xfc, 0xcc, 0x5e, 0xc6, 0x19, 0xab, 0x57, 0xf2, 0xe9, 0x4f, + 0xff, 0x13, 0x65, 0xe1, 0x20, 0xe9, 0xf4, 0x24, 0x86, 0x61, 0x30, 0x3a, 0x36, 0xc2, 0x2b, 0xaf, + 0x6c, 0x65, 0xd3, 0xa6, 0x17, 0xe9, 0xec, 0xec, 0x61, 0xe1, 0xc2, 0x15, 0xbc, 0xe7, 0x3d, 0xef, + 0x65, 0xdd, 0xda, 0x55, 0xa4, 0xd3, 0x3d, 0x6c, 0x7b, 0xf5, 0xfb, 0x0c, 0x0e, 0x3e, 0x85, 0x94, + 0xd1, 0x42, 0xae, 0xed, 0x40, 0x55, 0x5a, 0x78, 0xf4, 0xa9, 0x3e, 0x76, 0xdc, 0x10, 0xdd, 0xa7, + 0x9f, 0x69, 0xae, 0x19, 0x69, 0xb2, 0xd2, 0x7f, 0x96, 0x02, 0x6e, 0x1b, 0xb2, 0x8b, 0xd5, 0xc7, + 0x9c, 0x7f, 0xb3, 0x7c, 0x77, 0xee, 0x7b, 0xab, 0x17, 0x5d, 0xa0, 0xb6, 0x2f, 0x5c, 0x72, 0x42, + 0x6f, 0xb6, 0x9c, 0xc7, 0xe5, 0xea, 0xeb, 0xee, 0x62, 0xdb, 0xae, 0x2e, 0x6c, 0x0b, 0x3f, 0x83, + 0xad, 0xf2, 0x1c, 0x8c, 0x5c, 0x86, 0xee, 0x47, 0xee, 0xe6, 0x33, 0x1f, 0xfb, 0x7b, 0xec, 0x76, + 0xfb, 0x69, 0xd1, 0xb0, 0x99, 0xc2, 0xfa, 0xcc, 0x39, 0x0d, 0xc3, 0x64, 0x68, 0x68, 0x88, 0x27, + 0x9e, 0x78, 0x9c, 0xfb, 0xef, 0xff, 0x05, 0x03, 0x03, 0x03, 0x5c, 0x76, 0xd9, 0x5b, 0xb9, 0xfa, + 0xea, 0xf7, 0xb2, 0x7c, 0xc5, 0x0a, 0x5c, 0x4e, 0x27, 0x47, 0x8f, 0x1e, 0xe5, 0x5f, 0xfe, 0xe5, + 0x5f, 0x58, 0xba, 0x74, 0x29, 0x37, 0xde, 0x74, 0x23, 0x3f, 0xf8, 0xcf, 0x1f, 0x30, 0xfa, 0x93, + 0xef, 0xf2, 0xb9, 0xb6, 0x0a, 0xdc, 0xaa, 0x5a, 0x20, 0xd6, 0xc1, 0x68, 0xc6, 0xe0, 0xe3, 0x47, + 0x27, 0xb8, 0xfe, 0xf6, 0x6f, 0x13, 0x0c, 0x06, 0xb9, 0xf7, 0xde, 0x7b, 0xf9, 0xe0, 0x07, 0x3f, + 0x48, 0x6c, 0x7a, 0x9a, 0xc7, 0x1e, 0x7f, 0x9c, 0x97, 0x5f, 0x7e, 0x99, 0x70, 0xb8, 0x8c, 0x2b, + 0xae, 0xb8, 0x9c, 0x8b, 0x2e, 0xba, 0x88, 0x86, 0x86, 0x7c, 0x8b, 0xad, 0xa2, 0xe4, 0x79, 0xd2, + 0x46, 0x2e, 0xc5, 0xd8, 0xd8, 0x41, 0x26, 0x27, 0x8e, 0x21, 0xa5, 0xc4, 0xe5, 0x29, 0xc3, 0xe9, + 0xa8, 0xe7, 0x93, 0xff, 0xf4, 0x59, 0x1e, 0xb2, 0xbf, 0xfa, 0xba, 0xfb, 0x72, 0x75, 0xf5, 0xf8, + 0x3b, 0x3a, 0x93, 0x7f, 0x56, 0x26, 0x7a, 0xe6, 0x38, 0x5c, 0x99, 0x91, 0xde, 0x2e, 0x7e, 0x5b, + 0x3d, 0xc4, 0x40, 0x6f, 0xcf, 0x91, 0xba, 0xc6, 0xe6, 0x56, 0x74, 0xbb, 0xbd, 0x00, 0x27, 0x32, + 0xbf, 0xda, 0x34, 0x1d, 0x65, 0xff, 0xeb, 0xbd, 0xd8, 0x57, 0x7e, 0x03, 0x35, 0xb4, 0x02, 0x50, + 0xd0, 0x74, 0xc1, 0xff, 0xd7, 0xde, 0x99, 0x86, 0x49, 0x55, 0x5d, 0x7b, 0xff, 0xb7, 0xcf, 0x39, + 0x35, 0x57, 0x77, 0x55, 0xf5, 0x3c, 0x41, 0x37, 0x74, 0x03, 0x32, 0x8f, 0x22, 0xa2, 0x06, 0x15, + 0x05, 0x45, 0x05, 0x51, 0x71, 0xbc, 0xc6, 0x68, 0x9c, 0xa7, 0x7b, 0x73, 0xbd, 0x37, 0x4f, 0xbc, + 0x57, 0xcd, 0x6b, 0x06, 0xcd, 0x4d, 0xa2, 0xaf, 0x57, 0xe3, 0x78, 0x45, 0x6f, 0xd0, 0x68, 0x90, + 0x38, 0x83, 0xca, 0x10, 0xc1, 0x01, 0x08, 0x20, 0xa3, 0xd0, 0x8c, 0x4d, 0x33, 0xf4, 0x3c, 0x55, + 0x55, 0xd7, 0x5c, 0x75, 0xce, 0xd9, 0xef, 0x87, 0xea, 0xae, 0x1e, 0x80, 0x57, 0xe3, 0x87, 0xd0, + 0x3e, 0x0f, 0xfb, 0x4b, 0xd7, 0xd3, 0x5d, 0xdd, 0x5d, 0xe7, 0xfc, 0xcf, 0x5a, 0x7b, 0xed, 0xb5, + 0xd6, 0xff, 0xbf, 0xda, 0x53, 0x26, 0xb1, 0x58, 0x2c, 0x23, 0x24, 0x7a, 0xa2, 0x8c, 0x55, 0x4f, + 0x90, 0x2a, 0xd0, 0x34, 0xc1, 0xa0, 0x41, 0x83, 0xb8, 0xfd, 0xf6, 0x3b, 0xb8, 0xea, 0xaa, 0x05, + 0xac, 0x5d, 0xbb, 0x96, 0x97, 0x5f, 0xfe, 0x1f, 0x16, 0x2c, 0x58, 0xc0, 0xf4, 0xe9, 0xd3, 0x39, + 0xe3, 0x8c, 0x33, 0xd8, 0xb0, 0x61, 0x03, 0x33, 0x66, 0xcc, 0xe0, 0xe6, 0x9b, 0x6f, 0xc6, 0xe5, + 0x72, 0x71, 0xf7, 0xdd, 0x77, 0xf3, 0x8b, 0xd6, 0x36, 0xfe, 0xe3, 0xc3, 0x3f, 0x33, 0xa7, 0x30, + 0x1b, 0x97, 0x2a, 0x08, 0xa4, 0x24, 0x4b, 0x9b, 0x03, 0x54, 0x5d, 0xfd, 0x23, 0x66, 0xce, 0x3c, + 0x1f, 0x8f, 0xc7, 0x8b, 0xdb, 0xed, 0xe6, 0xe1, 0x87, 0x1f, 0x26, 0x1e, 0x8f, 0x33, 0x6b, 0xd6, + 0x6c, 0x16, 0x2e, 0x5c, 0x48, 0x55, 0x55, 0x15, 0x6e, 0xb7, 0x3b, 0xe3, 0x21, 0x7a, 0x4b, 0x3a, + 0x59, 0xac, 0x4e, 0x8a, 0x4b, 0x26, 0x51, 0x5c, 0x32, 0x29, 0x13, 0x92, 0x75, 0x76, 0x86, 0x70, + 0x39, 0x5c, 0xa8, 0x41, 0xd5, 0xa2, 0x0e, 0x89, 0xd9, 0x81, 0x68, 0x61, 0x8d, 0x4b, 0x91, 0xf1, + 0xa4, 0x45, 0x4f, 0xa6, 0x50, 0x34, 0x81, 0xa2, 0xaa, 0xc9, 0x96, 0x51, 0xba, 0x1c, 0xd0, 0x00, + 0x03, 0xd8, 0xda, 0xdc, 0x47, 0x3a, 0x6d, 0xf1, 0x57, 0x42, 0x4d, 0xf5, 0x3f, 0x0f, 0x06, 0xfc, + 0x22, 0xbf, 0xb0, 0xe8, 0xd8, 0x96, 0x1a, 0xd3, 0x64, 0xf7, 0xae, 0x7d, 0xe8, 0xc3, 0x7e, 0x8e, + 0x25, 0x67, 0x42, 0x97, 0x0b, 0x96, 0x08, 0x45, 0xc3, 0x9e, 0x97, 0x4f, 0x34, 0x1a, 0xfd, 0xff, + 0x8e, 0xd8, 0x39, 0x11, 0xe0, 0x9a, 0xa6, 0x91, 0x9f, 0x9f, 0xcf, 0xdc, 0xb9, 0x73, 0x99, 0x35, + 0x6b, 0x16, 0x7b, 0xf7, 0xee, 0xe5, 0x9d, 0x77, 0xde, 0x61, 0xd5, 0xaa, 0x55, 0xdc, 0x7a, 0xeb, + 0x6d, 0xcc, 0x9d, 0x7b, 0x59, 0xc6, 0x33, 0x14, 0x14, 0x14, 0xf0, 0xf8, 0x6f, 0x1e, 0xe7, 0xa9, + 0xa2, 0x42, 0x7e, 0xff, 0xe4, 0x6f, 0x18, 0xe5, 0xb6, 0x11, 0x36, 0x24, 0xfe, 0xd1, 0x93, 0xf9, + 0xe5, 0x7d, 0xf7, 0xe1, 0xf5, 0xfa, 0x10, 0x42, 0x30, 0x75, 0xea, 0x54, 0xde, 0x7d, 0xf7, 0xdd, + 0x0c, 0xf5, 0xa5, 0x7b, 0x8b, 0xf9, 0x76, 0x83, 0xbb, 0xba, 0xa8, 0xa4, 0x2e, 0x17, 0xe5, 0xe5, + 0xe5, 0x98, 0xdb, 0x8f, 0x22, 0xfd, 0x2e, 0x35, 0xe7, 0xf9, 0x9c, 0x71, 0xfa, 0x4a, 0xf3, 0x35, + 0xdb, 0x6e, 0x65, 0x44, 0x39, 0x0e, 0x11, 0x16, 0xba, 0x6c, 0xac, 0x48, 0xfd, 0xda, 0xf7, 0xa1, + 0xf6, 0x6b, 0xff, 0x65, 0xba, 0x39, 0xa0, 0x01, 0x5e, 0x77, 0x7a, 0xbb, 0x1c, 0xfb, 0xa9, 0xad, + 0xdd, 0x30, 0x53, 0x32, 0x18, 0x0c, 0x88, 0x9e, 0xfc, 0x74, 0xba, 0x1c, 0x69, 0x1a, 0x06, 0x7b, + 0x76, 0xef, 0xa1, 0xc9, 0xb6, 0x00, 0x6b, 0xe1, 0x74, 0x44, 0x57, 0x43, 0x6b, 0xba, 0x93, 0x51, + 0xe0, 0xce, 0x2f, 0xa6, 0xa1, 0xa1, 0x81, 0xe2, 0xe2, 0xe2, 0xef, 0xfc, 0x19, 0x14, 0x45, 0xc1, + 0xe9, 0x74, 0x30, 0x61, 0xc2, 0x04, 0xc6, 0x8d, 0x1b, 0x47, 0x2a, 0x95, 0xc2, 0x62, 0xb1, 0x64, + 0x66, 0x30, 0x76, 0x7b, 0x91, 0x54, 0x2a, 0xc5, 0xc1, 0x9a, 0x1a, 0x1e, 0xa8, 0x2a, 0xe0, 0xa2, + 0x02, 0x0f, 0x6d, 0x29, 0x83, 0xfb, 0xf7, 0xef, 0x61, 0xc7, 0x8e, 0x1d, 0x0c, 0x1e, 0x3c, 0x18, + 0x55, 0xed, 0x21, 0x6c, 0xd3, 0xa7, 0xce, 0x2f, 0x8f, 0xd1, 0xb5, 0xfe, 0xa6, 0x9d, 0xb1, 0xa8, + 0xa8, 0x08, 0xcb, 0x9f, 0x06, 0x0d, 0x4b, 0xbe, 0x60, 0xdf, 0x79, 0x16, 0xcd, 0xb9, 0x57, 0xcf, + 0x1a, 0xac, 0x4e, 0xbb, 0x33, 0x8f, 0xd2, 0x22, 0x3b, 0x4d, 0x2d, 0x09, 0xfe, 0xf5, 0xa9, 0xad, + 0x8f, 0xac, 0x1b, 0x13, 0x39, 0x08, 0xc1, 0x3f, 0x0d, 0x68, 0x80, 0xd3, 0xfd, 0xcd, 0xa9, 0x74, + 0x2b, 0xa9, 0xbf, 0x03, 0xd3, 0x94, 0x28, 0x0a, 0xe8, 0xa9, 0x24, 0x35, 0xfb, 0xf6, 0x52, 0x7b, + 0xf0, 0x20, 0xb1, 0xdc, 0x1b, 0xb1, 0x8f, 0xbe, 0x1a, 0x84, 0xd6, 0x4b, 0xa6, 0x18, 0x4c, 0x29, + 0xc8, 0xca, 0x2b, 0xe2, 0x0f, 0xcf, 0x3f, 0x4d, 0x55, 0x45, 0x05, 0x12, 0x49, 0x2a, 0x99, 0xca, + 0x3c, 0x1c, 0xba, 0x9e, 0xfa, 0xd6, 0x16, 0xdd, 0x2d, 0x98, 0x66, 0x77, 0x38, 0x70, 0xbb, 0xb3, + 0x49, 0xa5, 0x52, 0x84, 0x43, 0x9d, 0x44, 0x63, 0xd1, 0xf4, 0x74, 0x71, 0x20, 0x10, 0xec, 0xa4, + 0x79, 0xe5, 0x47, 0x4c, 0x1b, 0x55, 0x88, 0x21, 0xc1, 0xa7, 0xa9, 0x5c, 0x94, 0xa5, 0xf0, 0xcc, + 0xd3, 0x4f, 0x53, 0x5b, 0x7b, 0x08, 0xab, 0xd5, 0xd2, 0xab, 0xd3, 0xf2, 0x3b, 0x06, 0x37, 0x52, + 0x62, 0x4a, 0x93, 0xf5, 0xeb, 0xd7, 0x32, 0x6f, 0x72, 0x92, 0xbb, 0xef, 0x2a, 0x2f, 0x18, 0x33, + 0xb2, 0x12, 0x87, 0x96, 0xf6, 0x02, 0x8a, 0x94, 0x94, 0x16, 0xd8, 0x18, 0xe1, 0xc9, 0x52, 0xd7, + 0xfa, 0xdb, 0xcf, 0x2d, 0x0a, 0x88, 0xc5, 0x4d, 0x5e, 0xa9, 0x0f, 0x68, 0x80, 0x65, 0x17, 0x49, + 0x2a, 0x12, 0x0e, 0x60, 0x98, 0xe9, 0xa6, 0xba, 0x0d, 0x6b, 0xd7, 0xd1, 0x14, 0x3f, 0x0d, 0xdb, + 0x98, 0x7f, 0xc7, 0x91, 0x3b, 0x09, 0xba, 0x22, 0x63, 0x89, 0xc8, 0x8c, 0xd9, 0x09, 0xfb, 0x1b, + 0x59, 0xf9, 0xca, 0xb3, 0x0c, 0xaa, 0x7f, 0x97, 0x69, 0x83, 0xdc, 0xe9, 0x9b, 0xdb, 0x5b, 0xe8, + 0x44, 0x93, 0xf4, 0x93, 0x3d, 0xe9, 0xa7, 0xe9, 0x4c, 0x9f, 0x92, 0x23, 0x00, 0x31, 0x20, 0xd6, + 0xab, 0xdc, 0x68, 0x4b, 0xff, 0xa4, 0x3d, 0x6c, 0xf0, 0xd8, 0xd2, 0x16, 0x7e, 0x56, 0x54, 0x42, + 0xb6, 0x45, 0xcd, 0xfc, 0xd6, 0xd9, 0xb9, 0x6e, 0x5e, 0xf9, 0x6a, 0x2d, 0x6d, 0x39, 0xdb, 0x38, + 0x6f, 0x8c, 0x2b, 0x9d, 0xf1, 0xe9, 0x3b, 0x85, 0x3a, 0xd3, 0x79, 0xd9, 0x9d, 0x79, 0xf7, 0x87, + 0x0d, 0xea, 0xfd, 0x29, 0x1c, 0x56, 0x95, 0x92, 0x1c, 0x15, 0x87, 0x35, 0x7d, 0xfc, 0x8a, 0x25, + 0x4c, 0x3e, 0xd8, 0x14, 0xa2, 0xd3, 0xeb, 0xe6, 0xee, 0x7b, 0x4e, 0x63, 0xda, 0x94, 0x49, 0x58, + 0x55, 0x41, 0x20, 0x6c, 0xf0, 0xd5, 0x96, 0x00, 0x36, 0x8b, 0x60, 0xea, 0x44, 0x2f, 0x56, 0x8b, + 0xc2, 0xd0, 0xc1, 0x2e, 0xc1, 0x61, 0x5b, 0x65, 0x72, 0x93, 0x45, 0x81, 0xf0, 0xc0, 0xb6, 0x60, + 0x69, 0xd8, 0x90, 0x52, 0x27, 0xe8, 0xaf, 0x23, 0x16, 0x0e, 0x71, 0xf8, 0xd0, 0x21, 0x9a, 0x02, + 0x5e, 0x9c, 0x3f, 0xf8, 0x15, 0xc2, 0x9a, 0x9b, 0x69, 0x7f, 0xed, 0x6e, 0xfe, 0x43, 0x08, 0x1a, + 0x0e, 0xec, 0x62, 0xfd, 0x1f, 0x1e, 0xe5, 0x42, 0xf5, 0x63, 0xf6, 0x9a, 0x16, 0xf2, 0x3c, 0x1a, + 0x9a, 0x2a, 0x90, 0x12, 0x62, 0xc9, 0xae, 0x99, 0xbd, 0xbd, 0xf1, 0x15, 0xc7, 0x5a, 0x8a, 0x22, + 0x04, 0x76, 0x6b, 0x7a, 0xd2, 0x5a, 0x67, 0xcc, 0xa4, 0x23, 0x64, 0x64, 0x40, 0xd0, 0x0d, 0x49, + 0x38, 0x21, 0x49, 0xa4, 0x0c, 0x4c, 0xd3, 0x64, 0xdb, 0xc1, 0x18, 0x23, 0x74, 0x3b, 0xe7, 0xe4, + 0x66, 0x67, 0x5c, 0x88, 0x90, 0x92, 0x12, 0x9b, 0x85, 0x4b, 0x0b, 0xbd, 0x7c, 0xbe, 0xbb, 0x93, + 0x92, 0x1c, 0x2b, 0x16, 0xb5, 0x6f, 0x51, 0xa3, 0xc8, 0x67, 0x61, 0x48, 0x41, 0xcf, 0xed, 0xdc, + 0x56, 0x1b, 0x67, 0xd1, 0xa7, 0x1d, 0x14, 0xf9, 0x6c, 0x1c, 0x6e, 0x4d, 0x62, 0xd3, 0x60, 0xde, + 0x54, 0x0f, 0xbe, 0x2c, 0x85, 0xf7, 0xb7, 0x44, 0x99, 0x7d, 0xc3, 0x69, 0xcc, 0x9f, 0x57, 0x8a, + 0x27, 0x4b, 0xe3, 0xd0, 0x91, 0x18, 0xcb, 0x3e, 0xa9, 0xe7, 0x83, 0x8d, 0xcd, 0xe6, 0xd6, 0x8a, + 0x00, 0x97, 0x36, 0x14, 0x28, 0xa3, 0x9f, 0x98, 0x84, 0xcb, 0xa9, 0xa1, 0x29, 0x02, 0xf3, 0xb0, + 0xb0, 0x98, 0xae, 0xef, 0x76, 0xc9, 0xf0, 0xf0, 0x39, 0x00, 0x00, 0x14, 0x24, 0x49, 0x44, 0x41, + 0x54, 0xe0, 0xf9, 0x87, 0x02, 0x7c, 0xd8, 0xed, 0x8b, 0x55, 0xaa, 0x71, 0xa9, 0x24, 0xda, 0xf8, + 0xfc, 0xd3, 0x77, 0x89, 0xc7, 0x93, 0x58, 0x47, 0x3f, 0x87, 0xb0, 0xf8, 0x7a, 0x84, 0xc9, 0x32, + 0xc4, 0x6d, 0x83, 0x7d, 0x9b, 0xbe, 0x64, 0xdf, 0xc2, 0x5f, 0x30, 0x3b, 0x67, 0x13, 0x4e, 0xab, + 0x64, 0x6f, 0xbb, 0x49, 0x2c, 0x09, 0x6e, 0x3b, 0x24, 0x92, 0x92, 0xe7, 0x3f, 0x6e, 0x63, 0xd3, + 0xbe, 0xf8, 0x37, 0xf4, 0x48, 0x82, 0xcf, 0xad, 0xf2, 0xf3, 0xeb, 0x0b, 0x29, 0xf2, 0x5a, 0xa8, + 0x3e, 0x9a, 0xe0, 0xd1, 0x37, 0x5b, 0x49, 0xa4, 0xba, 0xb8, 0xb8, 0x26, 0xc4, 0x53, 0x69, 0x05, + 0x25, 0x13, 0x49, 0xa9, 0x22, 0x78, 0x7e, 0x52, 0x39, 0x1e, 0x4d, 0xe9, 0xc3, 0x2d, 0xb2, 0x28, + 0x30, 0xab, 0xc0, 0xc3, 0x3b, 0x5b, 0x3a, 0xb8, 0x7f, 0x77, 0x0b, 0xbd, 0x39, 0x83, 0xaa, 0x02, + 0x0f, 0xcc, 0xf3, 0x30, 0xa4, 0xc0, 0x8b, 0x94, 0xb0, 0xa5, 0x26, 0xc6, 0x4b, 0xcb, 0xdb, 0xb9, + 0xe3, 0xa2, 0x5c, 0xc6, 0x0c, 0x4e, 0x0b, 0xb3, 0xd6, 0x34, 0x25, 0xf9, 0xd5, 0x92, 0x56, 0x4e, + 0x9b, 0x92, 0xcf, 0x7f, 0x3c, 0x31, 0x95, 0x91, 0x23, 0xb2, 0xa9, 0xad, 0x8d, 0xf0, 0xdf, 0xcf, + 0x1c, 0xe6, 0xbd, 0x65, 0x47, 0xd9, 0x3b, 0x42, 0xff, 0xab, 0x36, 0x36, 0xf7, 0x1e, 0xeb, 0x84, + 0xd4, 0xd8, 0x9a, 0x77, 0x42, 0x6f, 0xac, 0x5a, 0xdd, 0x6a, 0xd9, 0xba, 0x35, 0xca, 0x86, 0xaf, + 0x5a, 0x48, 0x8c, 0x90, 0x58, 0x06, 0x7a, 0x14, 0x0d, 0x10, 0xcb, 0x89, 0xbd, 0xb1, 0x77, 0x7c, + 0xea, 0xae, 0x89, 0xdb, 0xc5, 0xe4, 0x44, 0xa2, 0x03, 0xb5, 0xe4, 0xa7, 0x58, 0x07, 0x5f, 0xd8, + 0xcf, 0xbd, 0x4a, 0x40, 0x67, 0xf3, 0x8a, 0xf7, 0x88, 0x2c, 0xf9, 0x3f, 0x5c, 0x58, 0x7c, 0x04, + 0x8b, 0x9a, 0x76, 0x7f, 0x4e, 0xcd, 0x20, 0x14, 0x33, 0x70, 0xdb, 0x35, 0x54, 0x4d, 0xe0, 0xb0, + 0xa9, 0xec, 0x6e, 0x34, 0xd2, 0xca, 0x01, 0x27, 0xaa, 0x03, 0x03, 0xa5, 0x3e, 0x49, 0x34, 0x91, + 0x7e, 0x80, 0x1c, 0x56, 0x85, 0x44, 0x52, 0xd2, 0x1e, 0x95, 0x7d, 0x4d, 0xbe, 0xcb, 0x20, 0xcf, + 0xcd, 0x77, 0x73, 0xba, 0xd7, 0xdd, 0x5f, 0xfd, 0x10, 0x81, 0x60, 0xb8, 0xdb, 0xce, 0x8c, 0x82, + 0x2c, 0xaa, 0x8f, 0x04, 0x30, 0x7b, 0x7f, 0x5e, 0x53, 0x64, 0xf2, 0xce, 0xfb, 0xea, 0x93, 0x3c, + 0xb3, 0xb4, 0x9d, 0xbb, 0x2e, 0xce, 0xe1, 0xb4, 0x52, 0x1b, 0x1f, 0x6c, 0x0a, 0x73, 0xc1, 0x38, + 0x17, 0x1f, 0x6d, 0x09, 0x31, 0xf7, 0x86, 0x2a, 0xee, 0xb9, 0x73, 0x18, 0x12, 0xc1, 0xb3, 0x2f, + 0xd6, 0xf0, 0xc7, 0xff, 0xdd, 0x8f, 0x25, 0x96, 0xa2, 0x3a, 0x96, 0xc2, 0x7a, 0x23, 0xcd, 0xd6, + 0xb1, 0x0d, 0x35, 0xc4, 0x64, 0x71, 0x4d, 0x4c, 0xca, 0x83, 0x87, 0xe7, 0x72, 0xe3, 0x4d, 0x97, + 0x93, 0xe5, 0x79, 0x87, 0x0d, 0x75, 0xbf, 0x05, 0x52, 0x03, 0x1f, 0xe0, 0x75, 0xa3, 0x82, 0xb1, + 0xc4, 0x11, 0xe5, 0xd2, 0xce, 0x90, 0x67, 0x59, 0x7c, 0xa1, 0x73, 0xd2, 0xe9, 0x37, 0x9c, 0x45, + 0xa5, 0xc5, 0x9d, 0x61, 0x84, 0x20, 0x41, 0x4f, 0xc5, 0xf8, 0x7c, 0xf1, 0x42, 0x7c, 0xeb, 0x9e, + 0xe2, 0xcc, 0x92, 0x16, 0x84, 0x02, 0x75, 0x7e, 0x41, 0xa9, 0x17, 0x1c, 0x6a, 0x7a, 0x3e, 0x02, + 0x80, 0x2a, 0x24, 0x63, 0x07, 0xdb, 0xb9, 0x73, 0x76, 0x17, 0xfb, 0x0f, 0xb0, 0x68, 0x16, 0x54, + 0x15, 0xac, 0x9a, 0x82, 0x45, 0x03, 0xab, 0xaa, 0xe0, 0xb2, 0x99, 0xa8, 0x8a, 0x24, 0xcb, 0xae, + 0x20, 0x25, 0x0c, 0xce, 0xd7, 0x78, 0xf8, 0xba, 0x3c, 0x4c, 0xb3, 0xef, 0xfe, 0xa9, 0x69, 0x2a, + 0x36, 0x4d, 0xb0, 0x78, 0x8d, 0x9f, 0x0f, 0x9a, 0x02, 0x5c, 0x59, 0xec, 0xeb, 0x23, 0x87, 0x2f, + 0x25, 0xac, 0xf3, 0x87, 0x59, 0x1f, 0x0d, 0xf3, 0xb3, 0x2b, 0x7d, 0x14, 0x78, 0xb4, 0x4c, 0x42, + 0x05, 0xa0, 0x34, 0xd7, 0x42, 0x6b, 0xc0, 0xe0, 0xa5, 0xe5, 0xed, 0x5c, 0x73, 0x8e, 0x87, 0x49, + 0x55, 0x0e, 0x1a, 0x3b, 0x74, 0x1a, 0x3b, 0x52, 0x3c, 0xfd, 0x49, 0x80, 0x39, 0x37, 0x8d, 0xe4, + 0xca, 0xf9, 0x65, 0x7c, 0xbd, 0x2b, 0xc8, 0xef, 0x9e, 0xa8, 0xa6, 0x69, 0x77, 0x07, 0x3f, 0xbd, + 0x24, 0x97, 0x2c, 0x87, 0xc2, 0xbf, 0xbd, 0xda, 0x4c, 0x5d, 0xb2, 0xe8, 0x12, 0xb5, 0x28, 0x5a, + 0xc4, 0x91, 0x00, 0x6e, 0x4b, 0x0e, 0xc3, 0xc7, 0x9d, 0xc9, 0xb6, 0x46, 0x0b, 0xbb, 0x9b, 0x4c, + 0x8c, 0xcc, 0x99, 0x62, 0x80, 0x03, 0x0c, 0xb0, 0x79, 0xb0, 0xd9, 0x74, 0xf0, 0x79, 0xdf, 0xaf, + 0x63, 0x2d, 0xc1, 0x3f, 0x0f, 0xa9, 0x6f, 0xb2, 0x54, 0x4e, 0x94, 0x99, 0x88, 0x34, 0x1e, 0x0d, + 0xb0, 0xf2, 0xa5, 0x27, 0x19, 0x51, 0xf3, 0x02, 0x43, 0x0b, 0x63, 0xc4, 0x92, 0xb0, 0xa2, 0xda, + 0x24, 0x10, 0x91, 0xfc, 0xd3, 0x34, 0x8d, 0x2c, 0x3b, 0x74, 0x84, 0x0c, 0xaa, 0x8a, 0xd2, 0x8d, + 0x76, 0x67, 0x8f, 0x72, 0x72, 0xce, 0x68, 0x57, 0x1f, 0x25, 0xb9, 0x9e, 0x10, 0x56, 0xf4, 0xa8, + 0xe0, 0x64, 0xea, 0xfe, 0x02, 0xaf, 0x4b, 0xe5, 0xbc, 0xb1, 0xee, 0x3e, 0x35, 0xdb, 0xde, 0xb6, + 0x9f, 0x65, 0xcf, 0xe1, 0xb7, 0x8b, 0x9b, 0xf0, 0x59, 0x55, 0x2e, 0xc8, 0xcb, 0xce, 0x3c, 0x00, + 0x3b, 0x3a, 0x63, 0xfc, 0xd7, 0x81, 0x06, 0x16, 0x5c, 0xe2, 0xe1, 0xe2, 0xc9, 0x59, 0x5d, 0x7d, + 0x89, 0x3d, 0x52, 0x4a, 0xf1, 0xa4, 0xc9, 0xcb, 0x2b, 0xfc, 0x8c, 0x29, 0x77, 0x30, 0x73, 0x5c, + 0x16, 0x9a, 0x92, 0x7e, 0xd0, 0xd6, 0x1f, 0x88, 0xf1, 0xe8, 0x7f, 0x4d, 0x66, 0xf6, 0xec, 0x12, + 0x3e, 0x58, 0x5a, 0xc7, 0x63, 0xbf, 0xda, 0xc1, 0x50, 0xb7, 0x60, 0x48, 0xbe, 0x85, 0x61, 0xc5, + 0x16, 0x4c, 0x09, 0x05, 0x1e, 0x85, 0x06, 0x23, 0x62, 0x15, 0x46, 0x5c, 0x48, 0xa1, 0xd0, 0xac, + 0x07, 0xf8, 0x78, 0xfd, 0x7e, 0xae, 0x9e, 0x57, 0xc5, 0xa0, 0x3c, 0x27, 0x4a, 0xd3, 0x77, 0xbf, + 0xdf, 0x0a, 0x27, 0x61, 0x29, 0xe7, 0x1d, 0xda, 0x62, 0x58, 0xc2, 0x1d, 0xed, 0x4d, 0xf5, 0x48, + 0xa9, 0x83, 0x90, 0x04, 0x5a, 0xeb, 0xf8, 0xf0, 0xf1, 0x9f, 0x32, 0xe9, 0xe8, 0x53, 0x54, 0xe5, + 0xc7, 0xa8, 0xf7, 0xc3, 0xc2, 0x2f, 0x0c, 0x96, 0xee, 0x34, 0x69, 0x0a, 0xa6, 0xdb, 0x76, 0xed, + 0x56, 0x68, 0xeb, 0x4c, 0x65, 0xaa, 0x4f, 0xc7, 0xd4, 0x7c, 0xbb, 0x35, 0xb3, 0x64, 0x17, 0x7d, + 0xb5, 0xdf, 0xec, 0x89, 0xfe, 0x67, 0xd4, 0x3e, 0x0c, 0x87, 0xae, 0x24, 0xc5, 0xe8, 0xc1, 0x36, + 0xee, 0xb9, 0x3c, 0x97, 0x87, 0x0f, 0xd4, 0xb1, 0xb2, 0xb5, 0x13, 0x45, 0x40, 0x75, 0x38, 0xc1, + 0xc3, 0xfb, 0xea, 0xb8, 0xe4, 0x22, 0x37, 0xb3, 0x26, 0x66, 0xd1, 0xa7, 0xe2, 0x2c, 0xd3, 0x24, + 0xb6, 0x2f, 0xaa, 0xa3, 0x44, 0x12, 0x06, 0x57, 0x9f, 0xe5, 0xc1, 0xda, 0x65, 0x36, 0xb9, 0x59, + 0x0a, 0xd3, 0x86, 0xd9, 0xa8, 0x6b, 0x88, 0xf1, 0xbf, 0xaf, 0xd5, 0xf2, 0xfb, 0x5f, 0x6c, 0xe7, + 0x27, 0x33, 0x3d, 0xfc, 0xfb, 0xfc, 0x3c, 0x92, 0x86, 0x49, 0x20, 0x62, 0xe2, 0xb0, 0x29, 0x94, + 0xe7, 0x6b, 0xe8, 0x46, 0x07, 0x86, 0x1e, 0x15, 0x60, 0x92, 0xa3, 0xba, 0xb8, 0xf6, 0xdc, 0x2a, + 0xce, 0x3e, 0xcd, 0x4b, 0x8e, 0x8b, 0x74, 0xc2, 0x47, 0xa8, 0xdf, 0x0f, 0x0b, 0x4e, 0xb7, 0xb0, + 0x94, 0x58, 0x85, 0xdd, 0xa3, 0xb4, 0xd5, 0xd7, 0x61, 0xe8, 0x49, 0x3a, 0x9a, 0x6a, 0xf9, 0xe2, + 0x77, 0x0f, 0x32, 0xdb, 0xb9, 0x02, 0x67, 0xb6, 0xc9, 0xa6, 0x43, 0x92, 0xf7, 0xb7, 0x98, 0x34, + 0x46, 0xd2, 0xd2, 0xfb, 0xc3, 0x8b, 0x04, 0x56, 0x55, 0xa0, 0x2a, 0x70, 0x28, 0xa8, 0x63, 0x4a, + 0x89, 0x22, 0x8e, 0x65, 0xfc, 0xa7, 0x41, 0x3c, 0xfe, 0x7c, 0xe3, 0xde, 0x85, 0x8c, 0xe3, 0x25, + 0x23, 0x7a, 0x9a, 0x09, 0x04, 0x53, 0x87, 0x3b, 0x78, 0xe0, 0xfa, 0x5c, 0x1e, 0x5d, 0x5c, 0xc7, + 0x06, 0xbf, 0x8f, 0x4d, 0xc1, 0x10, 0x17, 0x5c, 0xe8, 0xe2, 0x92, 0x29, 0xd9, 0x64, 0x06, 0x87, + 0xcb, 0x1e, 0xb6, 0x43, 0x73, 0x40, 0x67, 0xf5, 0x8e, 0x30, 0x3f, 0x99, 0x97, 0x87, 0xc3, 0xd6, + 0x8b, 0x87, 0xa4, 0xc1, 0x8d, 0x33, 0x72, 0x78, 0xf2, 0x4f, 0xfb, 0xd8, 0x53, 0x9f, 0xe4, 0xe9, + 0xdb, 0x8a, 0x29, 0xcd, 0xd1, 0x68, 0x0d, 0x19, 0x84, 0xe3, 0x26, 0xba, 0x99, 0xbe, 0x8e, 0x7c, + 0x8f, 0x05, 0xe3, 0xab, 0xec, 0xce, 0xa4, 0xe2, 0x49, 0xd9, 0x27, 0x36, 0xe0, 0x90, 0x09, 0xdc, + 0x4b, 0x17, 0x13, 0x79, 0x6b, 0x21, 0xcd, 0xdb, 0x77, 0x61, 0x4e, 0x76, 0xa3, 0x29, 0x3a, 0x90, + 0x1e, 0x36, 0xe6, 0x5b, 0x5e, 0xac, 0x62, 0x91, 0xf7, 0xa7, 0xd6, 0x44, 0xcf, 0x97, 0x7a, 0x0c, + 0xcb, 0x48, 0xaf, 0x6e, 0x19, 0x63, 0xfc, 0xb4, 0x75, 0x62, 0xc7, 0xfe, 0x01, 0x01, 0xb0, 0x8c, + 0x35, 0x1f, 0xb1, 0xcd, 0x6d, 0x8e, 0xd4, 0x2d, 0xf2, 0xe5, 0x6f, 0xfb, 0xeb, 0x7b, 0x34, 0x2d, + 0x79, 0x86, 0x8b, 0x8b, 0x76, 0xa2, 0x9b, 0xf0, 0xe1, 0x36, 0xc9, 0x47, 0xd5, 0x26, 0xba, 0x09, + 0x59, 0x16, 0xb8, 0x7e, 0xaa, 0xca, 0xe4, 0x72, 0x91, 0x96, 0x2c, 0x32, 0x05, 0x1d, 0x81, 0x14, + 0xa9, 0x14, 0xd8, 0xad, 0x64, 0x5a, 0x7c, 0x7b, 0x33, 0x22, 0x14, 0x21, 0x8f, 0x49, 0x35, 0x64, + 0x24, 0x96, 0x7a, 0x75, 0x59, 0x88, 0x5e, 0x71, 0x99, 0x3c, 0x4e, 0x2a, 0x71, 0xda, 0x08, 0x27, + 0x0f, 0xfd, 0x50, 0xe5, 0xad, 0x75, 0x01, 0xae, 0x9d, 0x99, 0xcd, 0xf4, 0x51, 0x2e, 0x84, 0x22, + 0x32, 0xd2, 0x1b, 0x5d, 0x62, 0xb4, 0xe8, 0x86, 0xe4, 0x9d, 0x75, 0x41, 0x16, 0x9c, 0xed, 0x21, + 0xdf, 0xa3, 0x22, 0x65, 0xcf, 0x7c, 0x07, 0x29, 0xc1, 0xeb, 0x56, 0x78, 0xe8, 0x9a, 0x42, 0x76, + 0xd4, 0xc6, 0xd8, 0x79, 0x24, 0x81, 0xd7, 0xad, 0xb2, 0xf3, 0x50, 0x1c, 0x7f, 0xd8, 0xa4, 0x35, + 0x68, 0x90, 0xd2, 0x25, 0x09, 0xdd, 0xc4, 0x58, 0xed, 0xce, 0x8e, 0x7e, 0xe1, 0xd3, 0xac, 0x7f, + 0xac, 0x43, 0x4a, 0x89, 0x36, 0xe5, 0x4c, 0xac, 0x33, 0x66, 0x92, 0xfa, 0xdd, 0x63, 0x52, 0x1b, + 0xff, 0xe2, 0x76, 0xeb, 0x2c, 0x0c, 0x6e, 0x07, 0xf7, 0xcf, 0x84, 0x1a, 0x7d, 0xae, 0xed, 0x91, + 0xe4, 0x76, 0xcb, 0x43, 0xf2, 0x50, 0x5c, 0x01, 0x89, 0x70, 0x06, 0xb1, 0x5e, 0xe7, 0x9d, 0x9e, + 0xf3, 0x69, 0xf6, 0x15, 0x1d, 0xe7, 0x77, 0xae, 0x3d, 0xe9, 0x00, 0xab, 0x96, 0x1c, 0x61, 0x55, + 0x0a, 0x39, 0xbc, 0x6b, 0x3b, 0xe1, 0x45, 0x77, 0x71, 0x41, 0xa5, 0x49, 0x22, 0x05, 0x4b, 0xbe, + 0xd2, 0xf9, 0xb2, 0x36, 0xfd, 0x9e, 0xaa, 0x5c, 0xc1, 0x35, 0x53, 0x54, 0x2a, 0xf2, 0x7a, 0x3a, + 0x27, 0x54, 0x91, 0x96, 0xe3, 0x5d, 0xb1, 0x3d, 0x84, 0xdb, 0xae, 0x1e, 0x6b, 0xa9, 0x12, 0x92, + 0x86, 0x20, 0x9a, 0x10, 0x24, 0x75, 0x83, 0x64, 0x4a, 0xcf, 0x24, 0x57, 0xfa, 0xce, 0x2a, 0x4b, + 0x73, 0x9b, 0x22, 0x09, 0x41, 0x3c, 0x95, 0x1e, 0xd5, 0x67, 0x76, 0x0d, 0xb3, 0xee, 0x06, 0x5e, + 0x76, 0xb5, 0x04, 0x19, 0x86, 0xe4, 0xf3, 0xea, 0x30, 0x9f, 0x55, 0x87, 0xbb, 0x2b, 0xc4, 0x24, + 0x75, 0x81, 0x61, 0x9a, 0x18, 0x86, 0x49, 0x30, 0xaa, 0x73, 0xfa, 0x70, 0x17, 0xe3, 0x2a, 0x6c, + 0x7d, 0x82, 0xae, 0xde, 0x9f, 0xc9, 0xaa, 0xc1, 0xd4, 0xe1, 0x0e, 0x84, 0x10, 0xec, 0xa9, 0x4b, + 0xf0, 0xda, 0x1a, 0x3f, 0xd9, 0x8a, 0xc1, 0xd6, 0x9d, 0xad, 0xac, 0xd9, 0x6b, 0xb2, 0xdd, 0x54, + 0x71, 0x5d, 0x5a, 0xb4, 0x43, 0x0a, 0x7b, 0x27, 0x42, 0x22, 0x34, 0x1f, 0xea, 0xe8, 0xf1, 0x90, + 0x95, 0x0d, 0x56, 0x2b, 0x8a, 0x53, 0x3a, 0x14, 0xbb, 0x2e, 0x7c, 0x4b, 0x7c, 0x5a, 0x72, 0x6f, + 0xf2, 0xc5, 0xe4, 0xf6, 0xd8, 0x4d, 0x6a, 0x9d, 0x54, 0xe6, 0x2f, 0xb8, 0x12, 0xaf, 0xd7, 0xcb, + 0x9b, 0x6f, 0xbe, 0x49, 0x78, 0x59, 0x5b, 0x81, 0x65, 0xa4, 0xfa, 0x44, 0xde, 0x16, 0xed, 0xfc, + 0xb6, 0x49, 0x7a, 0xf4, 0xa4, 0x02, 0x8c, 0xa2, 0x24, 0x0c, 0x33, 0xb2, 0x4c, 0xf3, 0xc6, 0xef, + 0x2e, 0xf1, 0x22, 0x34, 0x25, 0xad, 0x74, 0xd3, 0x16, 0x4e, 0xb7, 0xbf, 0xfe, 0xa0, 0x52, 0x70, + 0xc9, 0x78, 0x0d, 0x9f, 0xa3, 0x67, 0xaf, 0x4d, 0x99, 0x82, 0x2f, 0xf6, 0x9b, 0x04, 0xe3, 0x10, + 0xef, 0x08, 0x92, 0x54, 0xfa, 0xee, 0xa5, 0x19, 0x61, 0x50, 0x29, 0x51, 0x14, 0x81, 0x53, 0x55, + 0xf0, 0x68, 0x60, 0xd3, 0xcc, 0x9e, 0xe6, 0x74, 0x93, 0x2e, 0x2a, 0x8e, 0x40, 0x88, 0xb4, 0x64, + 0xb1, 0xa2, 0xa6, 0x55, 0x63, 0x15, 0x41, 0x3f, 0xe9, 0x61, 0xc9, 0xf1, 0xf4, 0xa6, 0xbb, 0xbf, + 0xd7, 0xbd, 0xeb, 0xaf, 0x3b, 0xac, 0x72, 0xe5, 0x99, 0x9e, 0x74, 0x5b, 0xce, 0x09, 0x4e, 0x6b, + 0xaa, 0x00, 0x7f, 0x44, 0xf2, 0xe9, 0xd7, 0x21, 0xde, 0x58, 0xe3, 0x67, 0x78, 0x3e, 0x9c, 0x37, + 0x42, 0xe5, 0x6f, 0x35, 0x26, 0x07, 0x07, 0xdb, 0xc9, 0xfe, 0x61, 0xd1, 0x36, 0xeb, 0x84, 0x8e, + 0x79, 0x6d, 0xd3, 0xf7, 0x05, 0xed, 0x3f, 0x82, 0x2c, 0x6b, 0x16, 0x0e, 0x87, 0x03, 0x5d, 0xd7, + 0x09, 0x85, 0x42, 0x48, 0xc5, 0xa1, 0x48, 0x33, 0x82, 0x12, 0x91, 0xe3, 0xf4, 0xb5, 0x5c, 0x2f, + 0x0f, 0xa1, 0x5e, 0x7e, 0xd5, 0x7c, 0x9e, 0x7c, 0xf2, 0x49, 0x1a, 0x1b, 0x1b, 0x59, 0xbd, 0x7a, + 0x35, 0x07, 0x0e, 0xd4, 0x10, 0x5b, 0xce, 0x24, 0xd5, 0x6b, 0x9b, 0x09, 0xfa, 0x87, 0x27, 0x15, + 0xe0, 0xe6, 0x91, 0x8d, 0x66, 0xde, 0x6a, 0xcb, 0xea, 0xd8, 0x04, 0xe3, 0x8e, 0xf6, 0x0e, 0xa1, + 0x55, 0xe6, 0x2b, 0x38, 0xac, 0x50, 0x98, 0x2d, 0x98, 0x30, 0x58, 0xe1, 0x9c, 0x61, 0x0a, 0x76, + 0xad, 0xa7, 0x51, 0xae, 0x23, 0x0a, 0xcb, 0x77, 0x19, 0x0c, 0xcd, 0x57, 0x98, 0x31, 0x3c, 0x2d, + 0x59, 0x20, 0x45, 0x2f, 0xad, 0x57, 0x29, 0xa0, 0x57, 0xe8, 0xd5, 0xa3, 0xf4, 0x4c, 0xd7, 0x1b, + 0xe5, 0x71, 0xb2, 0xc4, 0xc7, 0x23, 0x12, 0x1d, 0x83, 0x32, 0x3d, 0x53, 0xad, 0xbb, 0x7f, 0xad, + 0x27, 0xf2, 0x8e, 0x1b, 0x2a, 0xb3, 0xa7, 0xe6, 0xe0, 0xb2, 0x2b, 0x99, 0xd6, 0xa3, 0xf4, 0x76, + 0x91, 0x1e, 0x4d, 0xa0, 0x1b, 0x70, 0xa8, 0x39, 0xc5, 0xda, 0xdd, 0x61, 0x56, 0x6c, 0x0b, 0x83, + 0x2e, 0x99, 0x33, 0x4a, 0xa1, 0xc8, 0x03, 0xcb, 0x77, 0x4a, 0xd6, 0x0c, 0xc9, 0x35, 0xec, 0xf3, + 0xf5, 0x47, 0x6c, 0xb3, 0xeb, 0x5f, 0x68, 0x29, 0x4f, 0x74, 0x14, 0x1c, 0xb1, 0x2b, 0xa9, 0x5d, + 0xb6, 0x39, 0xee, 0x50, 0x96, 0xc5, 0x6e, 0xb7, 0x13, 0x8b, 0xc7, 0x68, 0xd7, 0xda, 0x4d, 0xa5, + 0x38, 0xf6, 0x65, 0xf2, 0x3d, 0xbb, 0xa1, 0xfb, 0x93, 0xd7, 0x24, 0x77, 0x25, 0xec, 0xaa, 0xaa, + 0x50, 0x51, 0x51, 0xce, 0xae, 0x5d, 0xbb, 0x78, 0xe1, 0x85, 0x17, 0x39, 0x78, 0xb0, 0x16, 0x21, + 0xc0, 0xd8, 0x22, 0x2c, 0x89, 0xf1, 0x8e, 0xab, 0xb2, 0x9f, 0x75, 0x7c, 0xd4, 0x79, 0x4f, 0x9b, + 0x71, 0xf2, 0x2c, 0x18, 0x88, 0x6d, 0xd1, 0xbf, 0x30, 0x73, 0x48, 0x76, 0xd4, 0x29, 0x1a, 0x08, + 0x34, 0x45, 0x32, 0x7b, 0xb4, 0x4a, 0x5e, 0x56, 0x7a, 0xb4, 0x6c, 0xb7, 0xb7, 0xdb, 0xdf, 0x2c, + 0x59, 0x7b, 0x40, 0x32, 0x6b, 0xb4, 0x4a, 0x89, 0x87, 0x0c, 0x6f, 0x4a, 0xf4, 0x9f, 0x9f, 0xd0, + 0xeb, 0xd0, 0xd2, 0x07, 0x6c, 0xd1, 0x77, 0xc6, 0x42, 0xf7, 0x74, 0xb6, 0xfe, 0x96, 0xd8, 0x87, + 0xc2, 0xdf, 0x3f, 0xeb, 0x29, 0x32, 0xb2, 0x3a, 0x19, 0x32, 0x1e, 0x80, 0xc7, 0xa9, 0x50, 0x55, + 0x6c, 0xcd, 0xb0, 0x1b, 0x44, 0xd7, 0xcf, 0xe3, 0x49, 0x93, 0x2d, 0x07, 0xe3, 0xac, 0xdc, 0x16, + 0x62, 0x6b, 0x4d, 0x82, 0x0a, 0x1f, 0x5c, 0x36, 0x5a, 0x50, 0xe6, 0x53, 0x68, 0x0b, 0xc3, 0xe2, + 0xcd, 0x26, 0x7b, 0x66, 0x69, 0x2d, 0xce, 0x0b, 0xf5, 0x5b, 0xd4, 0x41, 0xd6, 0x4f, 0x5a, 0xca, + 0x3b, 0xd2, 0x2c, 0xd5, 0xb0, 0x21, 0x64, 0x38, 0x5e, 0x50, 0xee, 0xad, 0x10, 0xd9, 0x59, 0x1e, + 0x9a, 0x9b, 0x1b, 0x69, 0x8a, 0x35, 0xa3, 0x66, 0x09, 0xc1, 0x69, 0x49, 0x9b, 0xf9, 0xb9, 0x9c, + 0x21, 0xdb, 0x4d, 0x0c, 0x43, 0xf0, 0xfc, 0xf3, 0xcf, 0xf3, 0xe2, 0x8b, 0x2f, 0x02, 0x82, 0xca, + 0xca, 0x4a, 0x24, 0x70, 0xa8, 0xfd, 0x08, 0x84, 0x4c, 0x64, 0xe0, 0x24, 0xef, 0xc1, 0x00, 0x76, + 0x6b, 0xa1, 0x40, 0x31, 0x68, 0x08, 0x74, 0xa4, 0x25, 0x81, 0x14, 0x28, 0xc8, 0xee, 0x29, 0x13, + 0x18, 0x26, 0x6c, 0xac, 0x95, 0xb4, 0x86, 0x24, 0x57, 0x4c, 0x56, 0xf0, 0xd8, 0xe9, 0x91, 0x6d, + 0x90, 0xb2, 0xe7, 0x75, 0x3f, 0x48, 0x8e, 0xb1, 0xcf, 0xde, 0x2f, 0x7a, 0xe9, 0x6b, 0x48, 0x64, + 0x9f, 0xc1, 0xbf, 0x19, 0x61, 0xef, 0x5e, 0x72, 0x4d, 0x99, 0x13, 0xba, 0xcc, 0x30, 0xc0, 0xfb, + 0xb8, 0xe0, 0x44, 0x22, 0x45, 0x43, 0x73, 0x84, 0xb2, 0x62, 0x17, 0x8a, 0x92, 0xa6, 0xfb, 0xac, + 0xdd, 0x13, 0x63, 0xe9, 0xc6, 0x20, 0x8a, 0x9e, 0x62, 0x54, 0xb1, 0xe0, 0x9c, 0x73, 0x15, 0xdc, + 0xf6, 0x74, 0x00, 0xb7, 0xa7, 0xc1, 0x64, 0xc9, 0x76, 0x95, 0xb6, 0x4b, 0x4b, 0xea, 0x1d, 0x53, + 0xe2, 0xb3, 0xda, 0xaf, 0x69, 0xae, 0xee, 0x57, 0x11, 0x47, 0x08, 0xc9, 0x90, 0xf2, 0x0a, 0xac, + 0x36, 0x0b, 0x7e, 0xbf, 0x9f, 0x60, 0x45, 0x7b, 0x14, 0x45, 0xdd, 0x9c, 0xfc, 0x52, 0xaa, 0xa9, + 0x3d, 0xb2, 0x92, 0x68, 0x5a, 0x86, 0x2d, 0x95, 0xd2, 0x99, 0x3b, 0x6f, 0x1e, 0x53, 0xa7, 0x9e, + 0x89, 0xdb, 0xed, 0x22, 0x95, 0xd2, 0x79, 0xf5, 0xbd, 0x97, 0x8d, 0x83, 0x13, 0xab, 0x37, 0xda, + 0x67, 0x0a, 0x33, 0xf4, 0x9f, 0x27, 0x19, 0x60, 0xd3, 0x57, 0x80, 0x74, 0xeb, 0xc2, 0x1f, 0xf5, + 0x93, 0x32, 0x05, 0x36, 0xa5, 0xc7, 0xd2, 0x22, 0x09, 0xc1, 0xca, 0x6a, 0x83, 0x12, 0x1f, 0xcc, + 0x19, 0xa7, 0xa4, 0x5d, 0x72, 0xa6, 0xa1, 0x5d, 0x66, 0x5c, 0x20, 0xc7, 0xaf, 0x1f, 0x1d, 0x73, + 0x4e, 0xed, 0xb1, 0x3a, 0x71, 0x8c, 0x6e, 0x55, 0x4f, 0x5c, 0x24, 0x7a, 0x3f, 0x03, 0x7d, 0x9b, + 0x7b, 0x65, 0xcf, 0xdf, 0xec, 0xff, 0x5f, 0x9b, 0x9a, 0x02, 0xc4, 0x63, 0x29, 0xf2, 0xf2, 0x9c, + 0xac, 0xdb, 0x1d, 0x25, 0x1c, 0x88, 0x70, 0xe9, 0x48, 0xd2, 0xa2, 0xaa, 0xa2, 0x5b, 0xb2, 0x18, + 0x36, 0x1c, 0x34, 0xf9, 0xcb, 0x51, 0x64, 0xe2, 0x1e, 0x65, 0x95, 0xe3, 0xa2, 0xc4, 0xaf, 0x44, + 0xa9, 0xba, 0xfb, 0xd8, 0x72, 0xaa, 0x81, 0x4d, 0xe6, 0x52, 0x5a, 0x54, 0xca, 0xe7, 0x9f, 0x7d, + 0xce, 0xdb, 0x6f, 0xbf, 0xcd, 0x81, 0x8d, 0x47, 0xb3, 0xc4, 0x01, 0xf7, 0x72, 0xeb, 0x28, 0xf3, + 0x97, 0x52, 0xed, 0x48, 0xfb, 0x20, 0x45, 0xe1, 0xa2, 0x8b, 0xe7, 0x30, 0x73, 0xe6, 0x2c, 0x94, + 0xae, 0x73, 0x5b, 0x5b, 0x7b, 0x3b, 0x2d, 0x55, 0x2d, 0x86, 0x65, 0x0c, 0xd5, 0x2d, 0xc3, 0x62, + 0xf2, 0xa4, 0x5b, 0xb0, 0x71, 0xf4, 0x70, 0x9b, 0x0c, 0xa5, 0x16, 0x77, 0x98, 0xe6, 0x8f, 0xa2, + 0x09, 0xd1, 0x35, 0xba, 0x55, 0xd2, 0xd4, 0x29, 0x59, 0xbd, 0xd7, 0xe4, 0x9c, 0x4a, 0x41, 0x59, + 0x8e, 0xe8, 0xb3, 0x77, 0x8a, 0xae, 0xe4, 0x85, 0x00, 0x5a, 0x3a, 0xa1, 0x25, 0x0c, 0xa3, 0x8b, + 0x7b, 0x13, 0xc0, 0xe4, 0x31, 0x20, 0xc4, 0x52, 0xe0, 0x8f, 0x0a, 0x4a, 0xb2, 0xe5, 0x71, 0xf7, + 0x62, 0xd1, 0xab, 0xd4, 0xd7, 0x2d, 0xb0, 0x21, 0xfb, 0x47, 0xdd, 0xa2, 0xe7, 0xb5, 0xa0, 0x97, + 0xea, 0x4e, 0x97, 0xab, 0x0f, 0xf8, 0xa3, 0xf8, 0xfd, 0x11, 0x0a, 0x2c, 0x82, 0xc2, 0x7c, 0xfa, + 0x1c, 0x93, 0x92, 0x86, 0x60, 0xd5, 0x2e, 0x83, 0xa5, 0xc1, 0x3c, 0xe9, 0xb8, 0x2a, 0xfb, 0x35, + 0x6b, 0x9e, 0xff, 0xf6, 0xf6, 0x33, 0x9b, 0x8e, 0xdb, 0xe0, 0x6e, 0xc6, 0x54, 0xe2, 0xf1, 0x88, + 0xfc, 0xfd, 0x73, 0x4f, 0x50, 0xbf, 0xa7, 0x8e, 0x50, 0x28, 0x3d, 0x13, 0x92, 0xad, 0x91, 0xfc, + 0xe4, 0x48, 0xeb, 0x53, 0x66, 0x58, 0x13, 0x48, 0x9d, 0xaa, 0xaa, 0x2a, 0xce, 0x3e, 0xfb, 0x07, + 0x19, 0x70, 0xa5, 0x94, 0x7c, 0xbd, 0x6b, 0x3b, 0xb1, 0x71, 0x72, 0xab, 0xc5, 0x63, 0xdb, 0xd8, + 0x9b, 0x75, 0xa8, 0x9c, 0x2c, 0x80, 0x9d, 0x57, 0x25, 0x70, 0x5c, 0x61, 0x98, 0xb1, 0x42, 0x08, + 0x25, 0xd2, 0xc1, 0x49, 0x75, 0x03, 0x6c, 0xaa, 0x95, 0x5c, 0x32, 0x56, 0x49, 0x83, 0xdb, 0x9f, + 0xaf, 0xd4, 0xf5, 0x2d, 0x7f, 0x0c, 0x3e, 0xde, 0x69, 0x50, 0xe2, 0xe9, 0xd7, 0x22, 0x93, 0x51, + 0x49, 0xe9, 0x81, 0xb0, 0xb6, 0x95, 0x74, 0x21, 0xbf, 0xff, 0xc4, 0x36, 0xd9, 0x93, 0xac, 0xe8, + 0xd1, 0x55, 0x93, 0xfd, 0xea, 0xbb, 0x3d, 0xf4, 0x93, 0xcc, 0xf9, 0xb7, 0x3b, 0x21, 0xd2, 0x27, + 0xcb, 0x22, 0x33, 0x0f, 0x59, 0xf7, 0xd6, 0xa1, 0x08, 0x88, 0xa5, 0x04, 0xef, 0x6d, 0xd1, 0x79, + 0x5f, 0x58, 0x22, 0xb6, 0xf3, 0x6d, 0x37, 0xca, 0xb2, 0x9c, 0xdb, 0x03, 0xf7, 0xb5, 0x9d, 0x90, + 0xbd, 0x60, 0xd6, 0xda, 0xbc, 0xb1, 0xcd, 0xe2, 0xc2, 0x3d, 0x5b, 0xf6, 0x10, 0x0a, 0x45, 0xba, + 0xe0, 0x49, 0x27, 0x4e, 0x8c, 0xdd, 0x29, 0x45, 0x1e, 0x35, 0x84, 0xa6, 0x69, 0xcc, 0x98, 0x71, + 0x2e, 0x1e, 0xaf, 0x27, 0x73, 0xed, 0xf5, 0xf5, 0x75, 0x6c, 0xb0, 0x7d, 0x15, 0x52, 0xb3, 0x93, + 0x57, 0xb7, 0x8c, 0x0d, 0x46, 0x4e, 0xfa, 0x39, 0x38, 0x1d, 0xa1, 0x24, 0x20, 0x5b, 0x10, 0xd3, + 0xa0, 0x3e, 0x00, 0xb5, 0x6d, 0x26, 0x1e, 0x7b, 0x1a, 0xdc, 0xde, 0xd9, 0xa2, 0xbe, 0x99, 0x08, + 0xe8, 0x8c, 0xc3, 0x07, 0xdb, 0x0c, 0xc6, 0x95, 0x29, 0xe4, 0x38, 0x65, 0x9f, 0x6a, 0x4f, 0x6f, + 0x6e, 0xb3, 0x44, 0x92, 0x34, 0x04, 0xbb, 0x9b, 0x0c, 0x66, 0x8f, 0x52, 0xb0, 0x28, 0xbd, 0x03, + 0xae, 0x1e, 0x01, 0x97, 0x3e, 0xb0, 0xf6, 0x8a, 0xb8, 0xa5, 0x14, 0x98, 0x08, 0x0c, 0x03, 0x74, + 0xb3, 0x97, 0xc6, 0x75, 0xaf, 0xcf, 0xa4, 0x4b, 0x85, 0x84, 0x2e, 0x48, 0xa6, 0x4c, 0x4c, 0xba, + 0xf4, 0xbf, 0xba, 0x74, 0xc0, 0x12, 0x86, 0xe4, 0xaf, 0xd5, 0x92, 0xed, 0x65, 0x55, 0x09, 0x57, + 0x95, 0xbc, 0xb2, 0xf3, 0xd5, 0xfd, 0xcb, 0xe1, 0xc8, 0x09, 0x6f, 0x47, 0x61, 0x75, 0x91, 0x25, + 0xb1, 0xc1, 0xb3, 0x30, 0xf9, 0xfe, 0xc1, 0x92, 0x13, 0x8f, 0x53, 0x92, 0x8c, 0x1b, 0x37, 0x9e, + 0x31, 0x63, 0xc7, 0x65, 0x1e, 0xce, 0x48, 0x38, 0xcc, 0x8a, 0xa3, 0x9f, 0xe8, 0xd1, 0x69, 0xfe, + 0x3b, 0xb4, 0xfc, 0xac, 0xa3, 0xd0, 0xca, 0x80, 0x00, 0x58, 0x0a, 0xd5, 0x54, 0xda, 0x3d, 0x2b, + 0xc8, 0x8f, 0xfd, 0xf0, 0xfd, 0xb5, 0x71, 0x6d, 0xfe, 0x24, 0x85, 0x92, 0x1c, 0x95, 0x23, 0x7e, + 0x41, 0x4a, 0x37, 0x30, 0xe5, 0xb1, 0xf9, 0x09, 0x29, 0x61, 0xdb, 0x51, 0x89, 0xdb, 0x26, 0x18, + 0x5b, 0x2a, 0xfa, 0x64, 0x25, 0xa4, 0x90, 0x7d, 0xe4, 0x41, 0x01, 0x8e, 0xfa, 0x25, 0xbb, 0x1a, + 0x4c, 0xa2, 0xc9, 0x74, 0x92, 0x24, 0xe3, 0xbc, 0x45, 0x7a, 0x0c, 0x52, 0x2c, 0x95, 0x16, 0x35, + 0x49, 0xa4, 0xcc, 0xbe, 0xec, 0x0a, 0x09, 0x98, 0x0a, 0x09, 0x1d, 0x62, 0x09, 0x41, 0x2c, 0x69, + 0x62, 0xf6, 0xe7, 0xa6, 0xa0, 0x02, 0x56, 0x4c, 0x6c, 0xc4, 0x32, 0x4e, 0xbe, 0xfb, 0xc9, 0xb4, + 0xa0, 0xfa, 0x2c, 0x38, 0x7e, 0x1c, 0x89, 0x38, 0xc6, 0x2b, 0x37, 0xa9, 0x53, 0xcd, 0x95, 0x2c, + 0xfa, 0x86, 0x2d, 0x2b, 0x10, 0xd0, 0x8c, 0x76, 0x7d, 0x92, 0xac, 0x33, 0x4f, 0x20, 0x17, 0x20, + 0x29, 0x28, 0x28, 0xe0, 0xe2, 0x39, 0x97, 0x64, 0x24, 0xa7, 0xe2, 0xf1, 0x38, 0xab, 0xf6, 0xad, + 0x48, 0xec, 0x39, 0x7d, 0xe3, 0x9d, 0xda, 0x10, 0xe3, 0xcf, 0x4d, 0xb3, 0xdb, 0xe5, 0x80, 0x48, + 0x55, 0x02, 0x34, 0xe7, 0xeb, 0x32, 0x7f, 0x7b, 0x7b, 0xa3, 0x72, 0x9a, 0x90, 0x81, 0x0d, 0xb0, + 0x68, 0x87, 0x41, 0xc2, 0x30, 0x7b, 0x5c, 0x65, 0xff, 0xee, 0x8c, 0xa4, 0x02, 0xba, 0x64, 0x4a, + 0x19, 0x5c, 0x77, 0x86, 0x8a, 0xa6, 0x91, 0xd1, 0xca, 0x92, 0x82, 0x63, 0x4c, 0xdd, 0x30, 0x25, + 0x3b, 0x1b, 0x25, 0xfe, 0x2b, 0x7d, 0x44, 0xc7, 0x58, 0xb0, 0xaa, 0x56, 0x54, 0xc5, 0x4a, 0x20, + 0xca, 0xb1, 0x60, 0x49, 0x01, 0x42, 0xc5, 0xa2, 0xb8, 0xc9, 0x72, 0x78, 0xb0, 0xbb, 0x95, 0xb6, + 0xa6, 0xf6, 0x2f, 0x16, 0x49, 0x12, 0x26, 0xc7, 0xf0, 0x14, 0xb5, 0xae, 0x78, 0xcc, 0x49, 0x96, + 0xdd, 0x83, 0xcd, 0xe6, 0xa6, 0x23, 0x98, 0xfe, 0x9b, 0xa2, 0x6b, 0x20, 0xad, 0x2a, 0x1c, 0x38, + 0x8b, 0x6c, 0x09, 0xbd, 0xe4, 0xe0, 0xab, 0x2d, 0xe7, 0xee, 0xa9, 0xf9, 0x56, 0x31, 0x89, 0x8c, + 0x93, 0x92, 0x89, 0x13, 0x9e, 0xd1, 0x55, 0x55, 0x65, 0xea, 0x19, 0xd3, 0xc8, 0xcb, 0xcb, 0x07, + 0x24, 0x81, 0x40, 0x80, 0x4f, 0xf6, 0x7f, 0xa4, 0x6f, 0x19, 0xff, 0xf9, 0x6d, 0x66, 0x99, 0xf1, + 0x7a, 0xfb, 0xec, 0xe3, 0x17, 0xc4, 0x4f, 0x9e, 0x8b, 0x06, 0x84, 0x43, 0xac, 0x73, 0xdf, 0x2a, + 0xe7, 0xc9, 0x9b, 0xf0, 0x09, 0x20, 0xeb, 0x44, 0x9d, 0x19, 0xaa, 0x3a, 0x34, 0xf2, 0xb6, 0xe3, + 0xe7, 0x65, 0x2f, 0x44, 0xb5, 0x2b, 0x26, 0x6b, 0x78, 0x1c, 0x32, 0x13, 0xf9, 0xf6, 0xd2, 0xa0, + 0xcd, 0xb4, 0xf9, 0x48, 0x29, 0x69, 0x0b, 0x4b, 0x76, 0x58, 0xdd, 0x52, 0x9d, 0xa9, 0x3e, 0x64, + 0x1d, 0x1f, 0x7d, 0x4a, 0xd3, 0xd2, 0x7c, 0x22, 0x7b, 0x67, 0xff, 0xc8, 0xbb, 0x1b, 0x60, 0x05, + 0x55, 0x8d, 0xa2, 0xb9, 0x02, 0x68, 0x3e, 0xcd, 0x0c, 0xe5, 0xc5, 0xe3, 0xc7, 0xb3, 0xa2, 0x0c, + 0x6d, 0x8b, 0x24, 0x21, 0x02, 0x27, 0xbc, 0xb6, 0xc0, 0xdf, 0x5b, 0xf5, 0xd1, 0xec, 0x58, 0x14, + 0xbb, 0x1e, 0x17, 0x9d, 0xc7, 0xfc, 0xcf, 0x9c, 0x9c, 0x1c, 0x6e, 0xbe, 0xe5, 0xc7, 0x04, 0x03, + 0x41, 0x16, 0xff, 0xf9, 0x0d, 0x5c, 0x59, 0x6e, 0x9a, 0xa7, 0xb4, 0x76, 0xd6, 0x5d, 0x5a, 0x77, + 0x2f, 0x91, 0xa2, 0xd7, 0x43, 0x73, 0x8f, 0xc8, 0x01, 0x55, 0x4d, 0xea, 0x5e, 0x2d, 0xc3, 0xa5, + 0x0e, 0x7c, 0xfc, 0x4d, 0xef, 0xf3, 0xbd, 0x69, 0x1f, 0x66, 0xee, 0x35, 0xef, 0xcd, 0x75, 0x89, + 0x42, 0x8f, 0x43, 0xf6, 0x3d, 0x16, 0xf5, 0xc9, 0x32, 0xf5, 0xec, 0xaf, 0xfb, 0x9a, 0x21, 0x78, + 0x91, 0x92, 0xb0, 0x0d, 0x15, 0xef, 0x36, 0x8c, 0x0e, 0x45, 0x19, 0xe0, 0x4b, 0x94, 0xa9, 0x71, + 0x4b, 0x85, 0xf2, 0x8a, 0x3a, 0xce, 0xf6, 0x0b, 0xe3, 0xab, 0xb8, 0xe8, 0x7d, 0x8d, 0x76, 0x87, + 0x9d, 0x68, 0x34, 0xc6, 0xe8, 0xb1, 0x63, 0x19, 0x36, 0x7c, 0x38, 0xcf, 0xfe, 0xed, 0xd9, 0x44, + 0x74, 0x66, 0xfb, 0x75, 0x81, 0x0b, 0x82, 0x1f, 0x0d, 0xc8, 0x7a, 0xf0, 0xdf, 0x1d, 0x8f, 0x79, + 0x73, 0x6a, 0xb2, 0xce, 0x72, 0x2c, 0xda, 0x9a, 0x25, 0xcc, 0x15, 0xbb, 0x4c, 0xa2, 0xc9, 0x5e, + 0xf9, 0x2b, 0xd9, 0xbf, 0xba, 0x2b, 0x89, 0x26, 0x04, 0x9b, 0x3a, 0x04, 0x46, 0x96, 0x5c, 0x2c, + 0xcd, 0xc4, 0xfe, 0xef, 0xc3, 0x35, 0xb6, 0x94, 0x46, 0xa4, 0x3a, 0x3e, 0xf4, 0xb4, 0xfb, 0xdf, + 0x52, 0xab, 0xd4, 0x49, 0xe9, 0x0e, 0x2c, 0xa7, 0xd3, 0xc1, 0xb5, 0xd7, 0xdd, 0xc0, 0x3f, 0xff, + 0xcb, 0x03, 0xf8, 0x72, 0x7c, 0x6c, 0xf8, 0xdb, 0x7a, 0x96, 0x2d, 0xfb, 0x90, 0xce, 0xd1, 0x4d, + 0x21, 0xa3, 0x33, 0xb4, 0xe6, 0x5b, 0x15, 0x76, 0xbe, 0x0f, 0x17, 0x1f, 0xf8, 0x53, 0xa7, 0xb4, + 0xdd, 0x1c, 0x5b, 0xcd, 0x10, 0x35, 0x77, 0xd7, 0x4e, 0xe5, 0xf4, 0xba, 0xdd, 0xa6, 0xf0, 0x3a, + 0xc1, 0xeb, 0x50, 0x8e, 0xe9, 0x6e, 0x14, 0xc0, 0xee, 0x46, 0x58, 0x33, 0x4a, 0xa4, 0x2c, 0x17, + 0x1b, 0x0f, 0xb6, 0xcf, 0x88, 0x7c, 0x2f, 0x00, 0x06, 0x88, 0x3e, 0x6d, 0x26, 0xbc, 0x4f, 0x5a, + 0x57, 0x0a, 0x9f, 0xfd, 0x3c, 0x65, 0x9b, 0x5a, 0x72, 0xdd, 0xe5, 0xd7, 0x33, 0x7d, 0xfa, 0xd9, + 0x38, 0x1c, 0x0e, 0x72, 0x73, 0x72, 0x29, 0x2e, 0x29, 0xa1, 0x39, 0xd0, 0x24, 0x6b, 0x4b, 0x8e, + 0x3e, 0x26, 0x85, 0x58, 0x9d, 0xf8, 0xf0, 0x9b, 0xfb, 0xb4, 0xb4, 0x81, 0x72, 0x71, 0x45, 0x87, + 0xb3, 0xcb, 0x53, 0x2b, 0xbd, 0xb3, 0x13, 0xed, 0x81, 0x99, 0x7a, 0xad, 0x36, 0x4c, 0x78, 0xec, + 0x86, 0xfd, 0x6c, 0xe3, 0x41, 0xff, 0x65, 0xcd, 0xab, 0x00, 0xfc, 0xd7, 0xa0, 0xe7, 0xbc, 0x9f, + 0xf5, 0xaf, 0xca, 0x9d, 0xc2, 0xa8, 0xfe, 0x4b, 0xf0, 0xbe, 0x1d, 0xab, 0x74, 0x65, 0x42, 0xb1, + 0xc2, 0xe8, 0x12, 0x41, 0x79, 0xae, 0x42, 0xb6, 0x1d, 0x9c, 0xb6, 0xb4, 0x5d, 0x6f, 0x6e, 0x00, + 0x39, 0xc3, 0x57, 0xad, 0xe6, 0xc5, 0x36, 0x7e, 0x1b, 0xa9, 0xa1, 0x81, 0xb4, 0x9a, 0x07, 0xc7, + 0x9b, 0x5c, 0xf7, 0x26, 0x16, 0xe6, 0x66, 0x95, 0x4d, 0x2c, 0x2b, 0x1b, 0xac, 0x68, 0x9a, 0x46, + 0x24, 0x12, 0xe6, 0x60, 0x4d, 0x0d, 0x6b, 0xcd, 0x2f, 0xa9, 0x59, 0xb0, 0xef, 0x25, 0xbb, 0xee, + 0x79, 0xa2, 0x79, 0x41, 0xc7, 0xb7, 0xe2, 0x2b, 0x9d, 0x74, 0x80, 0xf3, 0xbf, 0xf2, 0x0a, 0x33, + 0x68, 0x5e, 0xd3, 0xf9, 0x8c, 0xf9, 0xcb, 0xc4, 0xf2, 0x8e, 0x2a, 0x63, 0x7f, 0x14, 0xe2, 0xa0, + 0x4c, 0x53, 0x74, 0xad, 0x54, 0xf6, 0x21, 0x0e, 0x8b, 0xbc, 0x90, 0x41, 0x93, 0x08, 0x0c, 0x8e, + 0x6b, 0xdc, 0xf7, 0xfb, 0xb1, 0xec, 0xde, 0x13, 0xe4, 0xbd, 0xf7, 0x8f, 0xd2, 0xb2, 0xc3, 0xc0, + 0xe6, 0x93, 0xe4, 0x58, 0x05, 0xc2, 0x6a, 0x23, 0x70, 0xae, 0xad, 0x5d, 0x2b, 0x10, 0x37, 0xb7, + 0x4d, 0xe8, 0x0c, 0xf0, 0x3d, 0x5c, 0xd6, 0x39, 0x1e, 0xa3, 0xa5, 0xcd, 0x48, 0xbd, 0xf0, 0xc6, + 0xab, 0xb6, 0xa2, 0x5c, 0x1f, 0x81, 0xec, 0xa0, 0xde, 0x79, 0x45, 0xac, 0xd1, 0x32, 0x2e, 0x76, + 0x93, 0x63, 0xb8, 0xfe, 0x45, 0x63, 0xde, 0x91, 0x6f, 0xcd, 0x70, 0x38, 0xe9, 0x00, 0x27, 0x57, + 0xdb, 0x5d, 0xda, 0x6e, 0xeb, 0x73, 0xa9, 0x57, 0x9b, 0x7c, 0x86, 0x4c, 0xf5, 0x04, 0x4f, 0xa6, + 0x55, 0xa8, 0x6e, 0xb5, 0xb0, 0xa8, 0x26, 0x22, 0x9a, 0x2a, 0xd3, 0x07, 0x1b, 0x85, 0xdc, 0x71, + 0xfa, 0x8e, 0xd8, 0x2d, 0x57, 0x9f, 0x55, 0xa4, 0xdc, 0x7a, 0xcb, 0x10, 0x0e, 0x1f, 0x8e, 0xb2, + 0xf3, 0x60, 0x98, 0xc4, 0x34, 0xf7, 0x72, 0x3d, 0x7a, 0xf4, 0x99, 0xa0, 0xd4, 0x0d, 0x25, 0xd7, + 0x89, 0xeb, 0xfa, 0xc4, 0x81, 0xd6, 0xca, 0xa6, 0x03, 0x7c, 0x4f, 0x97, 0x7f, 0x4e, 0xe0, 0xa5, + 0xfc, 0x75, 0x9e, 0x35, 0xb1, 0x0f, 0xec, 0x43, 0x0f, 0xd2, 0x89, 0x63, 0x41, 0xb0, 0x3e, 0x30, + 0xb9, 0xf5, 0xeb, 0xef, 0xe5, 0xc5, 0xe4, 0xde, 0x56, 0xe6, 0x1c, 0x7b, 0xf5, 0x19, 0x6d, 0xe5, + 0x15, 0x15, 0x5d, 0xc9, 0x62, 0x25, 0xfd, 0x35, 0x5b, 0x95, 0xae, 0x5f, 0xe6, 0xed, 0xca, 0xdb, + 0xec, 0x2b, 0x00, 0xc8, 0xaf, 0xb6, 0x5b, 0xb2, 0x5f, 0x2e, 0x5c, 0x7a, 0xce, 0x8c, 0x22, 0xb9, + 0xaf, 0x7a, 0x8e, 0x0c, 0xb5, 0xcd, 0x97, 0x3f, 0x7f, 0x68, 0xa4, 0xcc, 0xfe, 0xcf, 0xac, 0xa6, + 0x82, 0x65, 0x22, 0x97, 0x53, 0x6b, 0xe0, 0x44, 0xd1, 0x83, 0x12, 0x0e, 0x51, 0xb0, 0xc5, 0x3b, + 0xdc, 0xf7, 0x7a, 0xe1, 0x2b, 0x91, 0xec, 0xb6, 0xda, 0x9d, 0x5b, 0x36, 0xe6, 0x1e, 0x3e, 0x74, + 0x18, 0x90, 0xd8, 0x6c, 0x96, 0x74, 0x9e, 0x35, 0xa4, 0x60, 0x49, 0x65, 0x57, 0xaa, 0x8a, 0x25, + 0xa7, 0x54, 0x22, 0xe4, 0xda, 0x41, 0x17, 0x3a, 0xdf, 0x4e, 0x9d, 0x77, 0xdf, 0x5d, 0x43, 0x29, + 0x2f, 0x73, 0xb2, 0x71, 0xb3, 0x9f, 0xd7, 0xaa, 0xeb, 0x52, 0xca, 0x30, 0xe3, 0xfa, 0x96, 0x4b, + 0x64, 0xfb, 0x29, 0x28, 0x07, 0xc8, 0xca, 0xdb, 0xe3, 0x72, 0x7b, 0xff, 0xe2, 0x7a, 0xd8, 0xf9, + 0xcf, 0xb9, 0x49, 0x61, 0xb3, 0x77, 0x59, 0x6d, 0xda, 0x72, 0x67, 0xce, 0x9c, 0x29, 0xd7, 0xaf, + 0x5f, 0x2f, 0x97, 0x2e, 0x5b, 0x26, 0x2b, 0xcf, 0xae, 0x32, 0xdd, 0x4f, 0xfb, 0x16, 0xe5, 0x6c, + 0xf5, 0xb9, 0x8a, 0xf6, 0x59, 0x72, 0x7d, 0x8f, 0x79, 0x76, 0xde, 0x7f, 0x5f, 0xa5, 0x0c, 0xb6, + 0xcc, 0x97, 0x8d, 0x47, 0xe6, 0xca, 0x6b, 0x7f, 0x58, 0x26, 0x3d, 0x8b, 0xac, 0x6f, 0xe7, 0x6d, + 0x77, 0xd8, 0x4f, 0xdd, 0xd5, 0x01, 0xb2, 0x07, 0xe7, 0x6d, 0xc4, 0x99, 0x5c, 0x97, 0x78, 0x37, + 0xb2, 0x50, 0xbd, 0xc0, 0x58, 0xdb, 0xd1, 0x2f, 0x05, 0x08, 0x5e, 0xaf, 0x97, 0x11, 0x15, 0xe5, + 0xc4, 0x12, 0x21, 0x46, 0x8c, 0xf1, 0xa4, 0x22, 0x53, 0xda, 0x96, 0xc4, 0xf7, 0x64, 0xc7, 0x22, + 0x2d, 0xb6, 0xc7, 0xc6, 0xae, 0x4d, 0x8e, 0xbe, 0xf7, 0x77, 0xc3, 0xb1, 0xd9, 0x15, 0x5e, 0x7f, + 0xeb, 0x10, 0x7f, 0x1d, 0xdc, 0x5e, 0x6f, 0x19, 0x6f, 0x3c, 0xd8, 0x36, 0x3e, 0x19, 0x3f, 0x05, + 0xe3, 0x00, 0x70, 0xd1, 0xc5, 0x1b, 0x73, 0x35, 0xb9, 0x3f, 0xff, 0xf5, 0xc8, 0x1f, 0xc4, 0x05, + 0xc6, 0xda, 0x5e, 0xe7, 0x37, 0x45, 0xe0, 0xbc, 0x22, 0x2b, 0x91, 0xfd, 0x9b, 0xe2, 0x50, 0x43, + 0x6c, 0x2f, 0x6d, 0x8b, 0x9e, 0xc3, 0xd5, 0x58, 0xc7, 0x48, 0x31, 0xca, 0x22, 0xeb, 0x5d, 0xb3, + 0x85, 0x2d, 0x7a, 0x77, 0xd6, 0xfa, 0xd0, 0xdd, 0x0f, 0xde, 0x36, 0x9a, 0x21, 0x83, 0x9c, 0xec, + 0xaa, 0x0e, 0xf2, 0xca, 0xfa, 0xc3, 0x86, 0x9c, 0x6d, 0x3c, 0xa7, 0xe6, 0xaa, 0x07, 0x4e, 0x41, + 0x38, 0x40, 0x2c, 0x38, 0x11, 0x4e, 0x4c, 0x89, 0xac, 0xd2, 0x2e, 0x30, 0xb6, 0x19, 0x68, 0x9a, + 0xca, 0x75, 0xd7, 0x5d, 0x4b, 0x5b, 0x5b, 0x1b, 0x9f, 0x6c, 0x5e, 0x8e, 0x7a, 0x81, 0xbe, 0xd4, + 0x3e, 0xa7, 0xf3, 0xff, 0x76, 0x1e, 0xf2, 0xbe, 0xbb, 0xa3, 0x70, 0x7c, 0x7e, 0xb3, 0x6b, 0x1c, + 0x81, 0x9c, 0x98, 0x30, 0x0e, 0xaf, 0x3c, 0xdf, 0xa8, 0x4e, 0x5d, 0xfb, 0x93, 0x49, 0x95, 0xda, + 0xcc, 0x1f, 0xe4, 0x13, 0x0a, 0xeb, 0xbc, 0xf8, 0x6a, 0x2d, 0x07, 0x66, 0x18, 0x4b, 0xd5, 0xb0, + 0xe3, 0xb7, 0x6d, 0x65, 0x41, 0xf3, 0x14, 0x84, 0x03, 0xc4, 0x82, 0xcd, 0x70, 0xc4, 0x65, 0x84, + 0x3b, 0x6d, 0x98, 0x92, 0x29, 0x53, 0x26, 0xf3, 0xc8, 0x23, 0x8f, 0xf0, 0x4f, 0x37, 0xde, 0x88, + 0xdd, 0x6e, 0x97, 0x7a, 0x5d, 0x74, 0x83, 0xd9, 0x60, 0xdd, 0xd2, 0x38, 0x3c, 0xd0, 0xb9, 0xb1, + 0x29, 0xcc, 0xb4, 0x4a, 0x2b, 0x23, 0x73, 0x93, 0xa4, 0x9e, 0x8e, 0x8f, 0xbc, 0xd5, 0x53, 0x90, + 0x7b, 0xcb, 0x8d, 0x43, 0xd0, 0x54, 0xc1, 0x5b, 0xef, 0x1e, 0xe5, 0xed, 0xc2, 0x86, 0xcd, 0x6a, + 0xa1, 0xe5, 0x8e, 0x8e, 0x8b, 0x83, 0xfa, 0x29, 0xf8, 0x06, 0xd4, 0x1e, 0xdc, 0xd3, 0xb0, 0xe6, + 0xb0, 0xdb, 0xb1, 0x5a, 0xad, 0x04, 0xfc, 0x7e, 0xa4, 0xe9, 0xc5, 0xad, 0x0d, 0x45, 0x2d, 0xa9, + 0x41, 0x2d, 0x71, 0x2a, 0xc9, 0x8d, 0x3b, 0xf8, 0x60, 0xf1, 0x2a, 0x34, 0x6d, 0x07, 0xd7, 0x5d, + 0x9c, 0xcb, 0x03, 0xf7, 0x9f, 0x86, 0xc7, 0xa5, 0xb1, 0xe6, 0x6f, 0x1d, 0x3c, 0xf1, 0xf5, 0xa1, + 0x56, 0x73, 0x9e, 0x31, 0xdf, 0x7f, 0x51, 0x5b, 0xf3, 0x29, 0xe8, 0x06, 0x18, 0xc0, 0x8a, 0x70, + 0xa3, 0x08, 0x45, 0x40, 0x98, 0x0d, 0x1b, 0x37, 0xf1, 0xd8, 0x63, 0x8f, 0xb3, 0x65, 0xcb, 0x66, + 0xf4, 0x52, 0x33, 0x25, 0x2a, 0x2c, 0xdb, 0xd1, 0xac, 0xf1, 0x94, 0xb7, 0xf3, 0xf5, 0x7a, 0xff, + 0x92, 0x87, 0xfe, 0xe5, 0x9e, 0x89, 0x62, 0xcf, 0x9e, 0x1c, 0xee, 0xb8, 0x65, 0x28, 0xb9, 0x1e, + 0x8d, 0x03, 0x47, 0xe3, 0x3c, 0xfe, 0xd9, 0x8e, 0x64, 0xfb, 0xf5, 0xa1, 0x7b, 0xad, 0x65, 0xa2, + 0xee, 0x14, 0x6c, 0x03, 0x70, 0xe5, 0xd7, 0xd9, 0x4b, 0xb3, 0xff, 0x68, 0xf9, 0x4c, 0x8c, 0xcc, + 0x4c, 0x9b, 0x92, 0xc2, 0x6e, 0x93, 0xd9, 0x0f, 0x95, 0xae, 0xc8, 0x5b, 0xe1, 0xb3, 0x03, 0xe4, + 0x2f, 0x1f, 0x36, 0x7d, 0xfe, 0xcf, 0x46, 0x25, 0x1b, 0x6a, 0x2f, 0x93, 0x66, 0xf4, 0x2a, 0x69, + 0x86, 0xaf, 0x94, 0x87, 0xf6, 0x5f, 0x2a, 0x2f, 0xff, 0x71, 0x85, 0xee, 0x5d, 0x52, 0x78, 0x6b, + 0x51, 0xeb, 0x3f, 0x46, 0xb8, 0xed, 0xd4, 0xfa, 0x8e, 0xab, 0xe0, 0xa8, 0x28, 0xf5, 0xbe, 0xe6, + 0x7a, 0xcb, 0x79, 0x6f, 0x9e, 0x74, 0xdd, 0xe0, 0x93, 0x9e, 0x47, 0x8b, 0xbf, 0x28, 0x5c, 0x97, + 0x3f, 0x35, 0x73, 0x8c, 0xfa, 0xcc, 0x67, 0xad, 0x78, 0x21, 0xf7, 0xed, 0x25, 0x6f, 0x9d, 0x25, + 0x53, 0xe1, 0xab, 0xe4, 0xfe, 0xdd, 0x73, 0xe4, 0x0d, 0xb7, 0x0f, 0x95, 0x39, 0xef, 0x14, 0x7c, + 0x50, 0xd4, 0xac, 0x79, 0x4e, 0xdd, 0xc1, 0xbf, 0x7f, 0xfd, 0xc3, 0x2d, 0x62, 0x84, 0xac, 0x12, + 0x1d, 0xef, 0xc7, 0x9d, 0x34, 0x1a, 0x28, 0xd3, 0x12, 0xf1, 0xe6, 0x89, 0x1d, 0x7d, 0x5a, 0xcc, + 0x72, 0xd6, 0x6b, 0x43, 0x06, 0x6d, 0xb4, 0x7f, 0x32, 0x3f, 0x5c, 0x31, 0x7c, 0x7d, 0x6d, 0x80, + 0x8d, 0x17, 0xc7, 0x97, 0x5a, 0x27, 0x84, 0xaf, 0x69, 0xae, 0x8c, 0x47, 0x4f, 0xc1, 0xf5, 0x3d, + 0x00, 0xf8, 0x5b, 0x59, 0xfa, 0xce, 0xac, 0xf2, 0xf0, 0x57, 0xe2, 0x22, 0x47, 0x99, 0x52, 0xa7, + 0x4e, 0x0f, 0xac, 0x6c, 0x71, 0x66, 0xfa, 0x64, 0x4e, 0xad, 0x53, 0xeb, 0xd4, 0xea, 0xbd, 0xfe, + 0x1f, 0xce, 0xc8, 0x31, 0x59, 0x0a, 0xde, 0x14, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, + 0x44, 0xae, 0x42, 0x60, 0x82 +}; diff --git a/lib/TFT_eSPI/examples/PNG Images/Flash_transparent_PNG/png_support.ino b/lib/TFT_eSPI/examples/PNG Images/Flash_transparent_PNG/png_support.ino new file mode 100644 index 0000000..464e20b --- /dev/null +++ b/lib/TFT_eSPI/examples/PNG Images/Flash_transparent_PNG/png_support.ino @@ -0,0 +1,19 @@ + +// PNGdec support functions + +//=========================================v========================================== +// pngDraw: Callback function to draw pixels to the display +//==================================================================================== +// This function will be called during decoding of the png file to render each image +// line to the TFT. PNGdec generates the image line and a 1bpp mask. +void pngDraw(PNGDRAW *pDraw) { + uint16_t lineBuffer[MAX_IMAGE_WIDTH]; // Line buffer for rendering + uint8_t maskBuffer[1 + MAX_IMAGE_WIDTH / 8]; // Mask buffer + + png.getLineAsRGB565(pDraw, lineBuffer, PNG_RGB565_BIG_ENDIAN, 0xffffffff); + + if (png.getAlphaMask(pDraw, maskBuffer, 255)) { + // Note: pushMaskedImage is for pushing to the TFT and will not work pushing into a sprite + tft.pushMaskedImage(xpos, ypos + pDraw->y, pDraw->iWidth, 1, lineBuffer, maskBuffer); + } +} diff --git a/lib/TFT_eSPI/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino b/lib/TFT_eSPI/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino index 1ffb3ca..9af73b8 100644 --- a/lib/TFT_eSPI/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino +++ b/lib/TFT_eSPI/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino @@ -17,7 +17,7 @@ #include PNG png; -#define MAX_IMAGE_WDITH 240 // Adjust for your images +#define MAX_IMAGE_WIDTH 240 // Adjust for your images int16_t xpos = 0; int16_t ypos = 0; @@ -67,7 +67,7 @@ void loop() tft.startWrite(); Serial.printf("image specs: (%d x %d), %d bpp, pixel type: %d\n", png.getWidth(), png.getHeight(), png.getBpp(), png.getPixelType()); uint32_t dt = millis(); - if (png.getWidth() > MAX_IMAGE_WDITH) { + if (png.getWidth() > MAX_IMAGE_WIDTH) { Serial.println("Image too wide for allocated line buffer size!"); } else { @@ -93,7 +93,7 @@ void loop() // you will need to adapt this function to suit. // Callback function to draw pixels to the display void pngDraw(PNGDRAW *pDraw) { - uint16_t lineBuffer[MAX_IMAGE_WDITH]; + uint16_t lineBuffer[MAX_IMAGE_WIDTH]; png.getLineAsRGB565(pDraw, lineBuffer, PNG_RGB565_BIG_ENDIAN, 0xffffffff); tft.pushImage(xpos, ypos + pDraw->y, pDraw->iWidth, 1, lineBuffer); } diff --git a/lib/TFT_eSPI/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino b/lib/TFT_eSPI/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino index 1ad440d..5f751c1 100644 --- a/lib/TFT_eSPI/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino +++ b/lib/TFT_eSPI/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino @@ -22,7 +22,7 @@ #include PNG png; -#define MAX_IMAGE_WDITH 240 // Adjust for your images +#define MAX_IMAGE_WIDTH 240 // Adjust for your images int16_t xpos = 0; int16_t ypos = 0; @@ -73,7 +73,7 @@ void loop() tft.startWrite(); Serial.printf("image specs: (%d x %d), %d bpp, pixel type: %d\n", png.getWidth(), png.getHeight(), png.getBpp(), png.getPixelType()); uint32_t dt = millis(); - if (png.getWidth() > MAX_IMAGE_WDITH) { + if (png.getWidth() > MAX_IMAGE_WIDTH) { Serial.println("Image too wide for allocated lin buffer!"); } else { @@ -99,8 +99,8 @@ void loop() // you will need to adapt this function to suit. // Callback function to draw pixels to the display void pngDraw(PNGDRAW *pDraw) { - uint16_t lineBuffer[MAX_IMAGE_WDITH]; - static uint16_t dmaBuffer[MAX_IMAGE_WDITH]; // static so buffer persists after fn exit + uint16_t lineBuffer[MAX_IMAGE_WIDTH]; + static uint16_t dmaBuffer[MAX_IMAGE_WIDTH]; // static so buffer persists after fn exit png.getLineAsRGB565(pDraw, lineBuffer, PNG_RGB565_BIG_ENDIAN, 0xffffffff); tft.pushImageDMA(xpos, ypos + pDraw->y, pDraw->iWidth, 1, lineBuffer, dmaBuffer); diff --git a/lib/TFT_eSPI/examples/Smooth Graphics/Arc_meter_demo/Arc_meter_demo.ino b/lib/TFT_eSPI/examples/Smooth Graphics/Arc_meter_demo/Arc_meter_demo.ino index 7d28e96..69f04a6 100644 --- a/lib/TFT_eSPI/examples/Smooth Graphics/Arc_meter_demo/Arc_meter_demo.ino +++ b/lib/TFT_eSPI/examples/Smooth Graphics/Arc_meter_demo/Arc_meter_demo.ino @@ -1,5 +1,5 @@ // This is a test sketch being developed for a new arc based meter widget -// The meter grahic is fully anti-aliased to avoid jaggy pixelated edges +// The meter graphic is fully anti-aliased to avoid jaggy pixelated edges // For this demo randomly sized meters are drawn, cycled and redrawn a random size. // The meter is ramped up and down 0-100 and 100-0, then pauses before a new diff --git a/lib/TFT_eSPI/examples/Smooth Graphics/Colour_Wheel/Colour_Wheel.ino b/lib/TFT_eSPI/examples/Smooth Graphics/Colour_Wheel/Colour_Wheel.ino new file mode 100644 index 0000000..acc5bc0 --- /dev/null +++ b/lib/TFT_eSPI/examples/Smooth Graphics/Colour_Wheel/Colour_Wheel.ino @@ -0,0 +1,47 @@ +// Arc drawing example - draw a colour wheel + +#include // Include the graphics library +TFT_eSPI tft = TFT_eSPI(); // Create object "tft" + +uint16_t colors[12]; + +// ------------------------------------------------------------------------- +// Setup +// ------------------------------------------------------------------------- +void setup(void) { + Serial.begin(115200); + tft.init(); + tft.fillScreen(TFT_BLACK); + + // Create the outer ring colours + for (uint8_t c = 0; c < 2; c++) { + colors[c + 10] = tft.alphaBlend(128 + c * 127, TFT_RED, TFT_MAGENTA); + colors[c + 8] = tft.alphaBlend(128 + c * 127, TFT_MAGENTA, TFT_BLUE); + colors[c + 6] = tft.alphaBlend(128 + c * 127, TFT_BLUE, TFT_GREEN); + colors[c + 4] = tft.alphaBlend(128 + c * 127, TFT_GREEN, TFT_YELLOW); + colors[c + 2] = tft.alphaBlend(128 + c * 127, TFT_YELLOW, TFT_ORANGE); + colors[c + 0] = tft.alphaBlend(128 + c * 127, TFT_ORANGE, TFT_RED); + } +} + +// ------------------------------------------------------------------------- +// Main loop +// ------------------------------------------------------------------------- +void loop() { + uint16_t rDelta = (tft.width() - 1) / 10; + uint16_t x = tft.width() / 2; + uint16_t y = tft.height() / 2; + bool smooth = true; + + // Draw rings as a series of arcs, increasingly blend colour with white towards middle + for (uint16_t i = 5; i > 0; i--) { + for (uint16_t angle = 0; angle <= 330; angle += 30) { + uint16_t radius = i * rDelta; + uint16_t wheelColor = tft.alphaBlend((i * 255.0)/5.0, colors[angle / 30], TFT_WHITE); + tft.drawArc(x, y, radius, radius - rDelta, angle, angle + 30, wheelColor, TFT_BLACK, smooth); + } + smooth = false; // Only outer ring is smooth + } + + while (1) delay(100); +} diff --git a/lib/TFT_eSPI/examples/Smooth Graphics/Draw_Arc/Draw_Arc.ino b/lib/TFT_eSPI/examples/Smooth Graphics/Draw_Arc/Draw_Arc.ino index f6e9c74..ee5823e 100644 --- a/lib/TFT_eSPI/examples/Smooth Graphics/Draw_Arc/Draw_Arc.ino +++ b/lib/TFT_eSPI/examples/Smooth Graphics/Draw_Arc/Draw_Arc.ino @@ -7,8 +7,6 @@ // The sides of the arc can optionally be smooth or not. Smooth arcs have // a much better appearance, especially at small sizes. -// Start angle for drawArc must be smaller than end angle - #include // Include the graphics library TFT_eSPI tft = TFT_eSPI(); // Create object "tft" @@ -42,7 +40,7 @@ void loop() // 0 degrees is at 6 o'clock position // Arcs are drawn clockwise from start_angle to end_angle - // Start angle for drawArc must be smaller than end angle (function will swap them otherwise) + // Start angle can be greater than end angle, the arc will then be drawn through 0 degrees uint16_t start_angle = random(361); // Start angle must be in range 0 to 360 uint16_t end_angle = random(361); // End angle must be in range 0 to 360 @@ -50,35 +48,6 @@ void loop() tft.drawArc(x, y, radius, inner_radius, start_angle, end_angle, fg_color, bg_color, smooth); - //tft.drawArc(x, y, radius, inner_radius, start_angle, end_angle, fg_color, bg_color); // always smooth sides if parameter is missing - - // The following function allows arcs to be drawn through the 6 o'clock position by drawing in 2 segments if - // the start angle is greater than the end angle - //drawAnyArc(x, y, radius, inner_radius, start_angle, end_angle, fg_color, bg_color, smooth); // smooth sides if parameter is missing - count++; if (count < 30) delay(500); // After 15s draw as fast as possible! } - - -// The following function allows arcs to be drawn through the 0 degree position by drawing in 2 segments - -// Function prototype with default smooth setting -void drawAnyArc(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t startAngle, int32_t endAngle, - uint32_t fg_color, uint32_t bg_color, bool smooth = true); - -void drawAnyArc(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t startAngle, int32_t endAngle, - uint32_t fg_color, uint32_t bg_color, bool smooth) -{ - if (endAngle > startAngle) - { - // Draw arc in single sweep - tft.drawArc(x, y, r, ir, startAngle, endAngle, fg_color, bg_color); - } - else - { - // Arc sweeps through 6 o'clock so draw in two parts - tft.drawArc(x, y, r, ir, startAngle, 360, fg_color, bg_color); - tft.drawArc(x, y, r, ir, 0, endAngle, fg_color, bg_color); - } -} diff --git a/lib/TFT_eSPI/examples/Smooth Graphics/Draw_Smooth_Circles/Draw_Smooth_Circles.ino b/lib/TFT_eSPI/examples/Smooth Graphics/Draw_Smooth_Circles/Draw_Smooth_Circles.ino new file mode 100644 index 0000000..ea49d65 --- /dev/null +++ b/lib/TFT_eSPI/examples/Smooth Graphics/Draw_Smooth_Circles/Draw_Smooth_Circles.ino @@ -0,0 +1,98 @@ +// Example for drawSmoothCircle function. Which draws anti-aliased circles +// The circle periphery has a "thickness" of ~3 pixles to minimise the +// "braiding" effect present in narrow anti-aliased lines. + +// For thicker or thinner circle outlines use the drawArc function. + +#include // Include the graphics library +TFT_eSPI tft = TFT_eSPI(); // Create object "tft" + +// ------------------------------------------------------------------------- +// Setup +// ------------------------------------------------------------------------- +void setup(void) { + Serial.begin(115200); + tft.init(); + tft.fillScreen(TFT_BLACK); +} + +// ------------------------------------------------------------------------- +// Main loop +// ------------------------------------------------------------------------- +void loop() +{ + static uint32_t radius = 2; + static uint32_t index = 0; + + uint16_t fg_color = rainbow(index); + uint16_t bg_color = TFT_BLACK; // This is the background colour used for smoothing (anti-aliasing) + + uint16_t x = tft.width() / 2; // Position of centre of arc + uint16_t y = tft.height() / 2; + + tft.drawSmoothCircle(x, y, radius, fg_color, bg_color); + + radius += 11; + index += 5; + index = index%192; + + if (radius > tft.height()/2) { + delay (1000); + radius = 2; + } +} + + +// ------------------------------------------------------------------------- +// Return a 16 bit rainbow colour +// ------------------------------------------------------------------------- +unsigned int rainbow(byte value) +{ + // If 'value' is in the range 0-159 it is converted to a spectrum colour + // from 0 = red through to 127 = blue to 159 = violet + // Extending the range to 0-191 adds a further violet to red band + + value = value%192; + + byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte green = 0; // Green is the middle 6 bits, but only top 5 bits used here + byte blue = 0; // Blue is the bottom 5 bits + + byte sector = value >> 5; + byte amplit = value & 0x1F; + + switch (sector) + { + case 0: + red = 0x1F; + green = amplit; // Green ramps up + blue = 0; + break; + case 1: + red = 0x1F - amplit; // Red ramps down + green = 0x1F; + blue = 0; + break; + case 2: + red = 0; + green = 0x1F; + blue = amplit; // Blue ramps up + break; + case 3: + red = 0; + green = 0x1F - amplit; // Green ramps down + blue = 0x1F; + break; + case 4: + red = amplit; // Red ramps up + green = 0; + blue = 0x1F; + break; + case 5: + red = 0x1F; + green = 0; + blue = 0x1F - amplit; // Blue ramps down + break; + } + return red << 11 | green << 6 | blue; +} diff --git a/lib/TFT_eSPI/examples/Smooth Graphics/Smooth_Rounded_Rectangles/Smooth_Rounded_Rectangles.ino b/lib/TFT_eSPI/examples/Smooth Graphics/Smooth_Rounded_Rectangles/Smooth_Rounded_Rectangles.ino new file mode 100644 index 0000000..802282f --- /dev/null +++ b/lib/TFT_eSPI/examples/Smooth Graphics/Smooth_Rounded_Rectangles/Smooth_Rounded_Rectangles.ino @@ -0,0 +1,50 @@ +// Draw random coloured smooth (anti-aliased) rounded rectangles on the TFT + +#include + +TFT_eSPI tft = TFT_eSPI(); + +void setup(void) { + tft.init(); + tft.fillScreen(TFT_BLACK); // Background is black +} + +void loop() { + tft.fillScreen(TFT_BLACK); + tft.setCursor(0, 0); + + // Draw some random smooth rounded rectangles + for (int i = 0; i < 20; i++) + { + int radius = random(60); + int w = random(2 * radius, 160); + int h = random(2 * radius, 160); + int t = random(1, radius / 3); + int x = random(tft.width() - w); + int y = random(tft.height() - h); + + // Random colour is anti-aliased (blended) with background colour (black in this case) + tft.drawSmoothRoundRect(x, y, radius, radius - t, w, h, random(0x10000), TFT_BLACK); + } + tft.print("Variable thickness"); + delay(2000); + + tft.fillScreen(TFT_BLACK); + tft.setCursor(0, 0); + + // Draw some random minimum thickness smooth rounded rectangles + for (int i = 0; i < 20; i++) + { + int radius = random(60); + int w = random(2 * radius, 160); + int h = random(2 * radius, 160); + int t = 0; + int x = random(tft.width() - w); + int y = random(tft.height() - h); + + // Random colour is anti-aliased (blended) with background colour (black in this case) + tft.drawSmoothRoundRect(x, y, radius, radius - t, w, h, random(0x10000), TFT_BLACK); + } + tft.print("Minimum thickness"); + delay(2000); +} diff --git a/lib/TFT_eSPI/examples/Test and diagnostics/Colour_Test/Colour_Test.ino b/lib/TFT_eSPI/examples/Test and diagnostics/Colour_Test/Colour_Test.ino index 185df6d..bdae2c5 100644 --- a/lib/TFT_eSPI/examples/Test and diagnostics/Colour_Test/Colour_Test.ino +++ b/lib/TFT_eSPI/examples/Test and diagnostics/Colour_Test/Colour_Test.ino @@ -58,25 +58,26 @@ void setup(void) { tft.init(); tft.fillScreen(TFT_BLACK); - + tft.drawRect(0, 0, tft.width(), tft.height(), TFT_GREEN); + // Set "cursor" at top left corner of display (0,0) and select font 4 - tft.setCursor(0, 0, 4); + tft.setCursor(0, 4, 4); // Set the font colour to be white with a black background - tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.setTextColor(TFT_WHITE); // We can now plot text on screen using the "print" class - tft.println("Initialised default\n"); - tft.println("White text"); + tft.println(" Initialised default\n"); + tft.println(" White text"); - tft.setTextColor(TFT_RED, TFT_BLACK); - tft.println("Red text"); + tft.setTextColor(TFT_RED); + tft.println(" Red text"); - tft.setTextColor(TFT_GREEN, TFT_BLACK); - tft.println("Green text"); + tft.setTextColor(TFT_GREEN); + tft.println(" Green text"); - tft.setTextColor(TFT_BLUE, TFT_BLACK); - tft.println("Blue text"); + tft.setTextColor(TFT_BLUE); + tft.println(" Blue text"); delay(5000); @@ -87,22 +88,23 @@ void loop() { tft.invertDisplay( false ); // Where i is true or false tft.fillScreen(TFT_BLACK); - - tft.setCursor(0, 0, 4); + tft.drawRect(0, 0, tft.width(), tft.height(), TFT_GREEN); - tft.setTextColor(TFT_WHITE, TFT_BLACK); - tft.println("Invert OFF\n"); + tft.setCursor(0, 4, 4); - tft.println("White text"); + tft.setTextColor(TFT_WHITE); + tft.println(" Invert OFF\n"); + + tft.println(" White text"); - tft.setTextColor(TFT_RED, TFT_BLACK); - tft.println("Red text"); + tft.setTextColor(TFT_RED); + tft.println(" Red text"); - tft.setTextColor(TFT_GREEN, TFT_BLACK); - tft.println("Green text"); + tft.setTextColor(TFT_GREEN); + tft.println(" Green text"); - tft.setTextColor(TFT_BLUE, TFT_BLACK); - tft.println("Blue text"); + tft.setTextColor(TFT_BLUE); + tft.println(" Blue text"); delay(5000); @@ -111,22 +113,23 @@ void loop() { tft.invertDisplay( true ); // Where i is true or false tft.fillScreen(TFT_BLACK); - - tft.setCursor(0, 0, 4); + tft.drawRect(0, 0, tft.width(), tft.height(), TFT_GREEN); - tft.setTextColor(TFT_WHITE, TFT_BLACK); - tft.println("Invert ON\n"); + tft.setCursor(0, 4, 4); - tft.println("White text"); + tft.setTextColor(TFT_WHITE); + tft.println(" Invert ON\n"); + + tft.println(" White text"); - tft.setTextColor(TFT_RED, TFT_BLACK); - tft.println("Red text"); + tft.setTextColor(TFT_RED); + tft.println(" Red text"); - tft.setTextColor(TFT_GREEN, TFT_BLACK); - tft.println("Green text"); + tft.setTextColor(TFT_GREEN); + tft.println(" Green text"); - tft.setTextColor(TFT_BLUE, TFT_BLACK); - tft.println("Blue text"); + tft.setTextColor(TFT_BLUE); + tft.println(" Blue text"); delay(5000); } diff --git a/lib/TFT_eSPI/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino b/lib/TFT_eSPI/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino index 93479f6..8b5c9f5 100644 --- a/lib/TFT_eSPI/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino +++ b/lib/TFT_eSPI/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino @@ -184,5 +184,5 @@ int8_t getPinName(int8_t pin) if (user.esp == 0x32F) return pin; - return -1; // Invalid pin + return pin; // Invalid pin } diff --git a/lib/TFT_eSPI/library.json b/lib/TFT_eSPI/library.json index 5bfa71c..9fc3a83 100644 --- a/lib/TFT_eSPI/library.json +++ b/lib/TFT_eSPI/library.json @@ -1,6 +1,6 @@ { "name": "TFT_eSPI", - "version": "2.5.0", + "version": "2.5.23", "keywords": "Arduino, tft, display, ttgo, LilyPi, WT32-SC01, ePaper, display, Pico, RP2040 Nano Connect, RP2040, STM32, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9481, ILI9486, ILI9488, ST7789, ST7796, RM68140, SSD1351, SSD1963, ILI9225, HX8357D, GC9A01, R61581", "description": "A TFT and ePaper (SPI or parallel interface) graphics library with optimisation for Raspberry Pi Pico, RP2040, ESP8266, ESP32 and STM32 processors", "repository": diff --git a/lib/TFT_eSPI/library.properties b/lib/TFT_eSPI/library.properties index d1278e1..b5dff03 100644 --- a/lib/TFT_eSPI/library.properties +++ b/lib/TFT_eSPI/library.properties @@ -1,9 +1,9 @@ name=TFT_eSPI -version=2.5.0 +version=2.5.23 author=Bodmer maintainer=Bodmer sentence=TFT graphics library for Arduino processors with performance optimisation for RP2040, STM32, ESP8266 and ESP32 -paragraph=Supports TFT displays using drivers (ILI9341 etc) that operate with hardware SPI or 8 bit parallel. +paragraph=Supports TFT displays using drivers (ILI9341 etc) that operate with hardware SPI or 8/16 bit parallel. category=Display url=https://github.com/Bodmer/TFT_eSPI architectures=* diff --git a/lib/TFT_eSPI/license.txt b/lib/TFT_eSPI/license.txt index 87db4c9..61a62a5 100644 --- a/lib/TFT_eSPI/license.txt +++ b/lib/TFT_eSPI/license.txt @@ -105,7 +105,7 @@ and is compatible with the GNU GPL. vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvStartvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv Software License Agreement (FreeBSD License) -Copyright (c) 2022 Bodmer (https://github.com/Bodmer) +Copyright (c) 2023 Bodmer (https://github.com/Bodmer) All rights reserved. diff --git a/platformio.ini b/platformio.ini index cdd05b2..6ab9e0e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -151,8 +151,8 @@ monitor_speed = 115200 upload_speed = 115200 build_flags = - -DBOARD_HAS_PSRAM - -DNERMINER_T_QT=1 + -D BOARD_HAS_PSRAM + -D NERMINER_T_QT=1 lib_deps = https://github.com/takkaO/OpenFontRender