From 49e4ae54beb20f7de57a24274c851c13a382d0e4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 21 Feb 2026 23:22:59 -0600 Subject: [PATCH 001/147] [bme68x_bsec2] Fix compilation on ESP32 Arduino (#14194) --- esphome/components/bme68x_bsec2/__init__.py | 5 ++++- tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml diff --git a/esphome/components/bme68x_bsec2/__init__.py b/esphome/components/bme68x_bsec2/__init__.py index e421efb2d6..4200b2f0b8 100644 --- a/esphome/components/bme68x_bsec2/__init__.py +++ b/esphome/components/bme68x_bsec2/__init__.py @@ -178,8 +178,11 @@ async def to_code_base(config): bsec2_arr = cg.progmem_array(config[CONF_RAW_DATA_ID], rhs) cg.add(var.set_bsec2_configuration(bsec2_arr, len(rhs))) - # Although this component does not use SPI, the BSEC2 Arduino library requires the SPI library + # The BSEC2 and BME68x Arduino libraries unconditionally include Wire.h and + # SPI.h in their source files, so these libraries must be available even though + # ESPHome uses its own I2C/SPI abstractions instead of the Arduino ones. if core.CORE.using_arduino: + cg.add_library("Wire", None) cg.add_library("SPI", None) cg.add_library( "BME68x Sensor library", diff --git a/tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml b/tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml new file mode 100644 index 0000000000..7c503b0ccb --- /dev/null +++ b/tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml @@ -0,0 +1,4 @@ +packages: + i2c: !include ../../test_build_components/common/i2c/esp32-ard.yaml + +<<: !include common.yaml From e013b4867519c44b570fd6cf05872a7324845009 Mon Sep 17 00:00:00 2001 From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com> Date: Sun, 22 Feb 2026 06:44:06 +0100 Subject: [PATCH 002/147] [nextion] Add error log for failed HTTP status during TFT upload (#14190) --- esphome/components/nextion/nextion_upload_arduino.cpp | 1 + esphome/components/nextion/nextion_upload_esp32.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/esphome/components/nextion/nextion_upload_arduino.cpp b/esphome/components/nextion/nextion_upload_arduino.cpp index 220c75f9d3..a433eff883 100644 --- a/esphome/components/nextion/nextion_upload_arduino.cpp +++ b/esphome/components/nextion/nextion_upload_arduino.cpp @@ -220,6 +220,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { } if (code != 200 and code != 206) { + ESP_LOGE(TAG, "HTTP request failed with status %d", code); return this->upload_end_(false); } diff --git a/esphome/components/nextion/nextion_upload_esp32.cpp b/esphome/components/nextion/nextion_upload_esp32.cpp index c4e6ff7182..46352afd75 100644 --- a/esphome/components/nextion/nextion_upload_esp32.cpp +++ b/esphome/components/nextion/nextion_upload_esp32.cpp @@ -238,6 +238,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { esp_get_free_heap_size()); int status_code = esp_http_client_get_status_code(http_client); if (status_code != 200 && status_code != 206) { + ESP_LOGE(TAG, "HTTP request failed with status %d", status_code); return this->upload_end_(false); } From 1753074eef3ea117dff2cb02995330227b242379 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 15:01:07 -0600 Subject: [PATCH 003/147] [web_server_base] Remove unnecessary Component inheritance and modernize (#14204) --- esphome/components/web_server_base/__init__.py | 3 +-- .../web_server_base/web_server_base.cpp | 18 ++---------------- .../web_server_base/web_server_base.h | 18 +++++++----------- 3 files changed, 10 insertions(+), 29 deletions(-) diff --git a/esphome/components/web_server_base/__init__.py b/esphome/components/web_server_base/__init__.py index 7986ac964d..183b907ae6 100644 --- a/esphome/components/web_server_base/__init__.py +++ b/esphome/components/web_server_base/__init__.py @@ -20,7 +20,7 @@ def AUTO_LOAD(): web_server_base_ns = cg.esphome_ns.namespace("web_server_base") -WebServerBase = web_server_base_ns.class_("WebServerBase", cg.Component) +WebServerBase = web_server_base_ns.class_("WebServerBase") CONF_WEB_SERVER_BASE_ID = "web_server_base_id" CONFIG_SCHEMA = cv.Schema( @@ -33,7 +33,6 @@ CONFIG_SCHEMA = cv.Schema( @coroutine_with_priority(CoroPriority.WEB_SERVER_BASE) async def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) - await cg.register_component(var, config) cg.add(cg.RawExpression(f"{web_server_base_ns}::global_web_server_base = {var}")) if CORE.is_esp32: diff --git a/esphome/components/web_server_base/web_server_base.cpp b/esphome/components/web_server_base/web_server_base.cpp index 6e7097338c..dbbcd10d8d 100644 --- a/esphome/components/web_server_base/web_server_base.cpp +++ b/esphome/components/web_server_base/web_server_base.cpp @@ -1,19 +1,11 @@ #include "web_server_base.h" #ifdef USE_NETWORK -#include "esphome/core/application.h" -#include "esphome/core/helpers.h" -#include "esphome/core/log.h" -namespace esphome { -namespace web_server_base { - -static const char *const TAG = "web_server_base"; +namespace esphome::web_server_base { WebServerBase *global_web_server_base = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) void WebServerBase::add_handler(AsyncWebHandler *handler) { - // remove all handlers - #ifdef USE_WEBSERVER_AUTH if (!credentials_.username.empty()) { handler = new internal::AuthMiddlewareHandler(handler, &credentials_); @@ -25,11 +17,5 @@ void WebServerBase::add_handler(AsyncWebHandler *handler) { } } -float WebServerBase::get_setup_priority() const { - // Before WiFi (captive portal) - return setup_priority::WIFI + 2.0f; -} - -} // namespace web_server_base -} // namespace esphome +} // namespace esphome::web_server_base #endif diff --git a/esphome/components/web_server_base/web_server_base.h b/esphome/components/web_server_base/web_server_base.h index 0c25467f1b..54421c851e 100644 --- a/esphome/components/web_server_base/web_server_base.h +++ b/esphome/components/web_server_base/web_server_base.h @@ -1,11 +1,9 @@ #pragma once #include "esphome/core/defines.h" #ifdef USE_NETWORK -#include #include #include -#include "esphome/core/component.h" #include "esphome/core/progmem.h" #if USE_ESP32 @@ -21,8 +19,7 @@ using PlatformString = std::string; using PlatformString = String; #endif -namespace esphome { -namespace web_server_base { +namespace esphome::web_server_base { class WebServerBase; extern WebServerBase *global_web_server_base; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) @@ -91,14 +88,14 @@ class AuthMiddlewareHandler : public MiddlewareHandler { } // namespace internal -class WebServerBase : public Component { +class WebServerBase { public: void init() { if (this->initialized_) { this->initialized_++; return; } - this->server_ = std::make_unique(this->port_); + this->server_ = new AsyncWebServer(this->port_); // All content is controlled and created by user - so allowing all origins is fine here. // NOTE: Currently 1 header. If more are added, update in __init__.py: // cg.add_define("WEB_SERVER_DEFAULT_HEADERS_COUNT", 1) @@ -113,11 +110,11 @@ class WebServerBase : public Component { void deinit() { this->initialized_--; if (this->initialized_ == 0) { + delete this->server_; this->server_ = nullptr; } } - AsyncWebServer *get_server() const { return this->server_.get(); } - float get_setup_priority() const override; + AsyncWebServer *get_server() const { return this->server_; } #ifdef USE_WEBSERVER_AUTH void set_auth_username(std::string auth_username) { credentials_.username = std::move(auth_username); } @@ -132,13 +129,12 @@ class WebServerBase : public Component { protected: int initialized_{0}; uint16_t port_{80}; - std::unique_ptr server_{nullptr}; + AsyncWebServer *server_{nullptr}; std::vector handlers_; #ifdef USE_WEBSERVER_AUTH internal::Credentials credentials_; #endif }; -} // namespace web_server_base -} // namespace esphome +} // namespace esphome::web_server_base #endif From 509f06afac19fc54b3fae2a67802771312b91133 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 15:56:09 -0600 Subject: [PATCH 004/147] [network] Improve IPAddress::str() deprecation warning with usage example (#14195) --- esphome/components/network/ip_address.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/esphome/components/network/ip_address.h b/esphome/components/network/ip_address.h index d0ac8164af..b2a2c563e2 100644 --- a/esphome/components/network/ip_address.h +++ b/esphome/components/network/ip_address.h @@ -61,7 +61,9 @@ struct IPAddress { IPAddress(const std::string &in_address) { inet_aton(in_address.c_str(), &ip_addr_); } IPAddress(const ip_addr_t *other_ip) { ip_addr_ = *other_ip; } // Remove before 2026.8.0 - ESPDEPRECATED("Use str_to() instead. Removed in 2026.8.0", "2026.2.0") + ESPDEPRECATED( + "str() is deprecated: use 'char buf[IP_ADDRESS_BUFFER_SIZE]; ip.str_to(buf);' instead. Removed in 2026.8.0", + "2026.2.0") std::string str() const { char buf[IP_ADDRESS_BUFFER_SIZE]; this->str_to(buf); @@ -150,7 +152,9 @@ struct IPAddress { bool is_ip6() const { return IP_IS_V6(&ip_addr_); } bool is_multicast() const { return ip_addr_ismulticast(&ip_addr_); } // Remove before 2026.8.0 - ESPDEPRECATED("Use str_to() instead. Removed in 2026.8.0", "2026.2.0") + ESPDEPRECATED( + "str() is deprecated: use 'char buf[IP_ADDRESS_BUFFER_SIZE]; ip.str_to(buf);' instead. Removed in 2026.8.0", + "2026.2.0") std::string str() const { char buf[IP_ADDRESS_BUFFER_SIZE]; this->str_to(buf); From ede2da2fbc167814c5598adb6d866c239a0772c8 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 15:57:23 -0600 Subject: [PATCH 005/147] [core] Conditionally compile get_loop_priority with USE_LOOP_PRIORITY (#14210) --- esphome/components/ch422g/ch422g.cpp | 2 ++ esphome/components/ch422g/ch422g.h | 2 ++ esphome/components/ch423/ch423.cpp | 2 ++ esphome/components/ch423/ch423.h | 2 ++ esphome/components/deep_sleep/deep_sleep_component.cpp | 2 ++ esphome/components/deep_sleep/deep_sleep_component.h | 2 ++ esphome/components/pca9554/pca9554.cpp | 2 ++ esphome/components/pca9554/pca9554.h | 2 ++ esphome/components/pcf8574/pcf8574.cpp | 2 ++ esphome/components/pcf8574/pcf8574.h | 2 ++ esphome/components/status_led/light/status_led_light.h | 2 ++ esphome/components/status_led/status_led.cpp | 2 ++ esphome/components/status_led/status_led.h | 2 ++ esphome/components/wifi/__init__.py | 7 +++++++ esphome/components/wifi/wifi_component.cpp | 2 ++ esphome/components/wifi/wifi_component.h | 2 ++ esphome/core/application.cpp | 2 ++ esphome/core/component.cpp | 2 ++ esphome/core/component.h | 3 +++ esphome/core/defines.h | 1 + 20 files changed, 45 insertions(+) diff --git a/esphome/components/ch422g/ch422g.cpp b/esphome/components/ch422g/ch422g.cpp index eef95b9ba2..5f5e848c76 100644 --- a/esphome/components/ch422g/ch422g.cpp +++ b/esphome/components/ch422g/ch422g.cpp @@ -124,9 +124,11 @@ bool CH422GComponent::write_outputs_() { float CH422GComponent::get_setup_priority() const { return setup_priority::IO; } +#ifdef USE_LOOP_PRIORITY // Run our loop() method very early in the loop, so that we cache read values // before other components call our digital_read() method. float CH422GComponent::get_loop_priority() const { return 9.0f; } // Just after WIFI +#endif void CH422GGPIOPin::pin_mode(gpio::Flags flags) { this->parent_->pin_mode(this->pin_, flags); } bool CH422GGPIOPin::digital_read() { return this->parent_->digital_read(this->pin_) ^ this->inverted_; } diff --git a/esphome/components/ch422g/ch422g.h b/esphome/components/ch422g/ch422g.h index 8ed63db90a..1b96568209 100644 --- a/esphome/components/ch422g/ch422g.h +++ b/esphome/components/ch422g/ch422g.h @@ -23,7 +23,9 @@ class CH422GComponent : public Component, public i2c::I2CDevice { void pin_mode(uint8_t pin, gpio::Flags flags); float get_setup_priority() const override; +#ifdef USE_LOOP_PRIORITY float get_loop_priority() const override; +#endif void dump_config() override; protected: diff --git a/esphome/components/ch423/ch423.cpp b/esphome/components/ch423/ch423.cpp index 4abbbe7adf..805d8df877 100644 --- a/esphome/components/ch423/ch423.cpp +++ b/esphome/components/ch423/ch423.cpp @@ -129,9 +129,11 @@ bool CH423Component::write_outputs_() { float CH423Component::get_setup_priority() const { return setup_priority::IO; } +#ifdef USE_LOOP_PRIORITY // Run our loop() method very early in the loop, so that we cache read values // before other components call our digital_read() method. float CH423Component::get_loop_priority() const { return 9.0f; } // Just after WIFI +#endif void CH423GPIOPin::pin_mode(gpio::Flags flags) { this->parent_->pin_mode(this->pin_, flags); } bool CH423GPIOPin::digital_read() { return this->parent_->digital_read(this->pin_) ^ this->inverted_; } diff --git a/esphome/components/ch423/ch423.h b/esphome/components/ch423/ch423.h index 7adc7de6a1..d85648a8f9 100644 --- a/esphome/components/ch423/ch423.h +++ b/esphome/components/ch423/ch423.h @@ -22,7 +22,9 @@ class CH423Component : public Component, public i2c::I2CDevice { void pin_mode(uint8_t pin, gpio::Flags flags); float get_setup_priority() const override; +#ifdef USE_LOOP_PRIORITY float get_loop_priority() const override; +#endif void dump_config() override; protected: diff --git a/esphome/components/deep_sleep/deep_sleep_component.cpp b/esphome/components/deep_sleep/deep_sleep_component.cpp index 8066b411ff..0511518419 100644 --- a/esphome/components/deep_sleep/deep_sleep_component.cpp +++ b/esphome/components/deep_sleep/deep_sleep_component.cpp @@ -40,9 +40,11 @@ void DeepSleepComponent::loop() { this->begin_sleep(); } +#ifdef USE_LOOP_PRIORITY float DeepSleepComponent::get_loop_priority() const { return -100.0f; // run after everything else is ready } +#endif void DeepSleepComponent::set_sleep_duration(uint32_t time_ms) { this->sleep_duration_ = uint64_t(time_ms) * 1000; } diff --git a/esphome/components/deep_sleep/deep_sleep_component.h b/esphome/components/deep_sleep/deep_sleep_component.h index 3e6eda2257..1998b815f3 100644 --- a/esphome/components/deep_sleep/deep_sleep_component.h +++ b/esphome/components/deep_sleep/deep_sleep_component.h @@ -113,7 +113,9 @@ class DeepSleepComponent : public Component { void setup() override; void dump_config() override; void loop() override; +#ifdef USE_LOOP_PRIORITY float get_loop_priority() const override; +#endif float get_setup_priority() const override; /// Helper to enter deep sleep mode diff --git a/esphome/components/pca9554/pca9554.cpp b/esphome/components/pca9554/pca9554.cpp index c574ce6593..d94767ef07 100644 --- a/esphome/components/pca9554/pca9554.cpp +++ b/esphome/components/pca9554/pca9554.cpp @@ -122,8 +122,10 @@ bool PCA9554Component::write_register_(uint8_t reg, uint16_t value) { float PCA9554Component::get_setup_priority() const { return setup_priority::IO; } +#ifdef USE_LOOP_PRIORITY // Run our loop() method early to invalidate cache before any other components access the pins float PCA9554Component::get_loop_priority() const { return 9.0f; } // Just after WIFI +#endif void PCA9554GPIOPin::setup() { pin_mode(flags_); } void PCA9554GPIOPin::pin_mode(gpio::Flags flags) { this->parent_->pin_mode(this->pin_, flags); } diff --git a/esphome/components/pca9554/pca9554.h b/esphome/components/pca9554/pca9554.h index bf752e50c9..6dd15ccb4b 100644 --- a/esphome/components/pca9554/pca9554.h +++ b/esphome/components/pca9554/pca9554.h @@ -23,7 +23,9 @@ class PCA9554Component : public Component, float get_setup_priority() const override; +#ifdef USE_LOOP_PRIORITY float get_loop_priority() const override; +#endif void dump_config() override; diff --git a/esphome/components/pcf8574/pcf8574.cpp b/esphome/components/pcf8574/pcf8574.cpp index b7d3848f0e..fa9496e7e4 100644 --- a/esphome/components/pcf8574/pcf8574.cpp +++ b/esphome/components/pcf8574/pcf8574.cpp @@ -99,8 +99,10 @@ bool PCF8574Component::write_gpio_() { } float PCF8574Component::get_setup_priority() const { return setup_priority::IO; } +#ifdef USE_LOOP_PRIORITY // Run our loop() method early to invalidate cache before any other components access the pins float PCF8574Component::get_loop_priority() const { return 9.0f; } // Just after WIFI +#endif void PCF8574GPIOPin::setup() { pin_mode(flags_); } void PCF8574GPIOPin::pin_mode(gpio::Flags flags) { this->parent_->pin_mode(this->pin_, flags); } diff --git a/esphome/components/pcf8574/pcf8574.h b/esphome/components/pcf8574/pcf8574.h index 5203030142..23bccc26c9 100644 --- a/esphome/components/pcf8574/pcf8574.h +++ b/esphome/components/pcf8574/pcf8574.h @@ -26,7 +26,9 @@ class PCF8574Component : public Component, void pin_mode(uint8_t pin, gpio::Flags flags); float get_setup_priority() const override; +#ifdef USE_LOOP_PRIORITY float get_loop_priority() const override; +#endif void dump_config() override; diff --git a/esphome/components/status_led/light/status_led_light.h b/esphome/components/status_led/light/status_led_light.h index bfa144526a..a5c98d90d4 100644 --- a/esphome/components/status_led/light/status_led_light.h +++ b/esphome/components/status_led/light/status_led_light.h @@ -30,7 +30,9 @@ class StatusLEDLightOutput : public light::LightOutput, public Component { void dump_config() override; float get_setup_priority() const override { return setup_priority::HARDWARE; } +#ifdef USE_LOOP_PRIORITY float get_loop_priority() const override { return 50.0f; } +#endif protected: GPIOPin *pin_{nullptr}; diff --git a/esphome/components/status_led/status_led.cpp b/esphome/components/status_led/status_led.cpp index 344c1e3070..93a8d4b38e 100644 --- a/esphome/components/status_led/status_led.cpp +++ b/esphome/components/status_led/status_led.cpp @@ -28,7 +28,9 @@ void StatusLED::loop() { } } float StatusLED::get_setup_priority() const { return setup_priority::HARDWARE; } +#ifdef USE_LOOP_PRIORITY float StatusLED::get_loop_priority() const { return 50.0f; } +#endif } // namespace status_led } // namespace esphome diff --git a/esphome/components/status_led/status_led.h b/esphome/components/status_led/status_led.h index 490557f3e7..f262eb260c 100644 --- a/esphome/components/status_led/status_led.h +++ b/esphome/components/status_led/status_led.h @@ -14,7 +14,9 @@ class StatusLED : public Component { void dump_config() override; void loop() override; float get_setup_priority() const override; +#ifdef USE_LOOP_PRIORITY float get_loop_priority() const override; +#endif protected: GPIOPin *pin_; diff --git a/esphome/components/wifi/__init__.py b/esphome/components/wifi/__init__.py index 540d0a0ab1..8c1deb6217 100644 --- a/esphome/components/wifi/__init__.py +++ b/esphome/components/wifi/__init__.py @@ -536,6 +536,13 @@ async def to_code(config): cg.add_library("ESP8266WiFi", None) elif CORE.is_rp2040: cg.add_library("WiFi", None) + # RP2040's mDNS library (LEAmDNS) relies on LwipIntf::stateUpCB() to restart + # mDNS when the network interface reconnects. However, this callback is disabled + # in the arduino-pico framework. As a workaround, we block component setup until + # WiFi is connected via can_proceed(), ensuring mDNS.begin() is called with an + # active connection. This define enables the loop priority sorting infrastructure + # used during the setup blocking phase. + cg.add_define("USE_LOOP_PRIORITY") if CORE.is_esp32: if config[CONF_ENABLE_BTM] or config[CONF_ENABLE_RRM]: diff --git a/esphome/components/wifi/wifi_component.cpp b/esphome/components/wifi/wifi_component.cpp index 8b3060c7c3..d5d0419395 100644 --- a/esphome/components/wifi/wifi_component.cpp +++ b/esphome/components/wifi/wifi_component.cpp @@ -968,9 +968,11 @@ void WiFiComponent::set_ap(const WiFiAP &ap) { } #endif // USE_WIFI_AP +#ifdef USE_LOOP_PRIORITY float WiFiComponent::get_loop_priority() const { return 10.0f; // before other loop components } +#endif void WiFiComponent::init_sta(size_t count) { this->sta_.init(count); } void WiFiComponent::add_sta(const WiFiAP &ap) { this->sta_.push_back(ap); } diff --git a/esphome/components/wifi/wifi_component.h b/esphome/components/wifi/wifi_component.h index 5f903e092a..984930c80c 100644 --- a/esphome/components/wifi/wifi_component.h +++ b/esphome/components/wifi/wifi_component.h @@ -458,7 +458,9 @@ class WiFiComponent : public Component { void restart_adapter(); /// WIFI setup_priority. float get_setup_priority() const override; +#ifdef USE_LOOP_PRIORITY float get_loop_priority() const override; +#endif /// Reconnect WiFi if required. void loop() override; diff --git a/esphome/core/application.cpp b/esphome/core/application.cpp index b216233f9b..c6597897dc 100644 --- a/esphome/core/application.cpp +++ b/esphome/core/application.cpp @@ -109,9 +109,11 @@ void Application::setup() { if (component->can_proceed()) continue; +#ifdef USE_LOOP_PRIORITY // Sort components 0 through i by loop priority insertion_sort_by_prioritycomponents_.begin()), &Component::get_loop_priority>( this->components_.begin(), this->components_.begin() + i + 1); +#endif do { uint8_t new_app_state = STATUS_LED_WARNING; diff --git a/esphome/core/component.cpp b/esphome/core/component.cpp index b458ea2a84..b4a19a0776 100644 --- a/esphome/core/component.cpp +++ b/esphome/core/component.cpp @@ -85,7 +85,9 @@ void store_component_error_message(const Component *component, const char *messa static constexpr uint16_t WARN_IF_BLOCKING_INCREMENT_MS = 10U; ///< How long the blocking time must be larger to warn again +#ifdef USE_LOOP_PRIORITY float Component::get_loop_priority() const { return 0.0f; } +#endif float Component::get_setup_priority() const { return setup_priority::DATA; } diff --git a/esphome/core/component.h b/esphome/core/component.h index b99641a275..7ea9fdf3b3 100644 --- a/esphome/core/component.h +++ b/esphome/core/component.h @@ -5,6 +5,7 @@ #include #include +#include "esphome/core/defines.h" #include "esphome/core/helpers.h" #include "esphome/core/log.h" #include "esphome/core/optional.h" @@ -117,7 +118,9 @@ class Component { * * @return The loop priority of this component */ +#ifdef USE_LOOP_PRIORITY virtual float get_loop_priority() const; +#endif void call(); diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 5109dd36f4..02335e2745 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -312,6 +312,7 @@ #ifdef USE_RP2040 #define USE_ARDUINO_VERSION_CODE VERSION_CODE(3, 3, 0) +#define USE_LOOP_PRIORITY #define USE_HTTP_REQUEST_RESPONSE #define USE_I2C #define USE_LOGGER_USB_CDC From ee1f52132573ab5498eaa566d3289d1103a4a186 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 16:59:54 -0600 Subject: [PATCH 006/147] [http_request] Replace std::list
with std::vector in perform() chain (#14027) --- .../components/http_request/http_request.h | 89 +++++++++++++++---- .../http_request/http_request_arduino.cpp | 2 +- .../http_request/http_request_arduino.h | 2 +- .../http_request/http_request_host.cpp | 2 +- .../http_request/http_request_host.h | 2 +- .../http_request/http_request_idf.cpp | 2 +- .../http_request/http_request_idf.h | 2 +- .../components/online_image/online_image.cpp | 2 +- 8 files changed, 79 insertions(+), 24 deletions(-) diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index 2b2d05c63f..8bdea470b5 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -330,38 +330,72 @@ class HttpRequestComponent : public Component { void set_follow_redirects(bool follow_redirects) { this->follow_redirects_ = follow_redirects; } void set_redirect_limit(uint16_t limit) { this->redirect_limit_ = limit; } - std::shared_ptr get(const std::string &url) { return this->start(url, "GET", "", {}); } - std::shared_ptr get(const std::string &url, const std::list
&request_headers) { + std::shared_ptr get(const std::string &url) { + return this->start(url, "GET", "", std::vector
{}); + } + std::shared_ptr get(const std::string &url, const std::vector
&request_headers) { return this->start(url, "GET", "", request_headers); } - std::shared_ptr get(const std::string &url, const std::list
&request_headers, + std::shared_ptr get(const std::string &url, const std::vector
&request_headers, const std::vector &lower_case_collect_headers) { return this->start(url, "GET", "", request_headers, lower_case_collect_headers); } std::shared_ptr post(const std::string &url, const std::string &body) { - return this->start(url, "POST", body, {}); + return this->start(url, "POST", body, std::vector
{}); } std::shared_ptr post(const std::string &url, const std::string &body, - const std::list
&request_headers) { + const std::vector
&request_headers) { return this->start(url, "POST", body, request_headers); } std::shared_ptr post(const std::string &url, const std::string &body, - const std::list
&request_headers, + const std::vector
&request_headers, const std::vector &lower_case_collect_headers) { return this->start(url, "POST", body, request_headers, lower_case_collect_headers); } + // Remove before 2027.1.0 + ESPDEPRECATED("Pass request_headers as std::vector
instead of std::list. Removed in 2027.1.0.", "2026.7.0") + std::shared_ptr get(const std::string &url, const std::list
&request_headers) { + return this->get(url, std::vector
(request_headers.begin(), request_headers.end())); + } + // Remove before 2027.1.0 + ESPDEPRECATED("Pass request_headers as std::vector
instead of std::list. Removed in 2027.1.0.", "2026.7.0") + std::shared_ptr get(const std::string &url, const std::list
&request_headers, + const std::vector &collect_headers) { + return this->get(url, std::vector
(request_headers.begin(), request_headers.end()), collect_headers); + } + // Remove before 2027.1.0 + ESPDEPRECATED("Pass request_headers as std::vector
instead of std::list. Removed in 2027.1.0.", "2026.7.0") + std::shared_ptr post(const std::string &url, const std::string &body, + const std::list
&request_headers) { + return this->post(url, body, std::vector
(request_headers.begin(), request_headers.end())); + } + // Remove before 2027.1.0 + ESPDEPRECATED("Pass request_headers as std::vector
instead of std::list. Removed in 2027.1.0.", "2026.7.0") + std::shared_ptr post(const std::string &url, const std::string &body, + const std::list
&request_headers, + const std::vector &collect_headers) { + return this->post(url, body, std::vector
(request_headers.begin(), request_headers.end()), collect_headers); + } + + std::shared_ptr start(const std::string &url, const std::string &method, const std::string &body, + const std::vector
&request_headers) { + // Call perform() directly to avoid ambiguity with the deprecated overloads + return this->perform(url, method, body, request_headers, {}); + } + + // Remove before 2027.1.0 + ESPDEPRECATED("Pass request_headers as std::vector
instead of std::list. Removed in 2027.1.0.", "2026.7.0") std::shared_ptr start(const std::string &url, const std::string &method, const std::string &body, const std::list
&request_headers) { - // Call perform() directly to avoid ambiguity with the std::set overload - return this->perform(url, method, body, request_headers, {}); + return this->start(url, method, body, std::vector
(request_headers.begin(), request_headers.end())); } // Remove before 2027.1.0 ESPDEPRECATED("Pass collect_headers as std::vector instead of std::set. Removed in 2027.1.0.", "2026.7.0") std::shared_ptr start(const std::string &url, const std::string &method, const std::string &body, - const std::list
&request_headers, + const std::vector
&request_headers, const std::set &collect_headers) { std::vector lower; lower.reserve(collect_headers.size()); @@ -371,15 +405,39 @@ class HttpRequestComponent : public Component { return this->perform(url, method, body, request_headers, lower); } + // Remove before 2027.1.0 + ESPDEPRECATED("Pass request_headers as std::vector
instead of std::list, and collect_headers as " + "std::vector instead of std::set. Removed in 2027.1.0.", + "2026.7.0") std::shared_ptr start(const std::string &url, const std::string &method, const std::string &body, const std::list
&request_headers, + const std::set &collect_headers) { + std::vector lower; + lower.reserve(collect_headers.size()); + for (const auto &h : collect_headers) { + lower.push_back(str_lower_case(h)); + } + return this->perform(url, method, body, std::vector
(request_headers.begin(), request_headers.end()), lower); + } + + // Remove before 2027.1.0 + ESPDEPRECATED("Pass request_headers as std::vector
instead of std::list. Removed in 2027.1.0.", "2026.7.0") + std::shared_ptr start(const std::string &url, const std::string &method, const std::string &body, + const std::list
&request_headers, + const std::vector &lower_case_collect_headers) { + return this->perform(url, method, body, std::vector
(request_headers.begin(), request_headers.end()), + lower_case_collect_headers); + } + + std::shared_ptr start(const std::string &url, const std::string &method, const std::string &body, + const std::vector
&request_headers, const std::vector &lower_case_collect_headers) { return this->perform(url, method, body, request_headers, lower_case_collect_headers); } protected: virtual std::shared_ptr perform(const std::string &url, const std::string &method, - const std::string &body, const std::list
&request_headers, + const std::string &body, const std::vector
&request_headers, const std::vector &lower_case_collect_headers) = 0; const char *useragent_{nullptr}; bool follow_redirects_{}; @@ -436,13 +494,10 @@ template class HttpRequestSendAction : public Action { auto f = std::bind(&HttpRequestSendAction::encode_json_func_, this, x..., std::placeholders::_1); body = json::build_json(f); } - std::list
request_headers; - for (const auto &item : this->request_headers_) { - auto val = item.second; - Header header; - header.name = item.first; - header.value = val.value(x...); - request_headers.push_back(header); + std::vector
request_headers; + request_headers.reserve(this->request_headers_.size()); + for (const auto &[key, val] : this->request_headers_) { + request_headers.push_back({key, val.value(x...)}); } auto container = this->parent_->start(this->url_.value(x...), this->method_.value(x...), body, request_headers, diff --git a/esphome/components/http_request/http_request_arduino.cpp b/esphome/components/http_request/http_request_arduino.cpp index 3f60b76b58..56b51e8b5a 100644 --- a/esphome/components/http_request/http_request_arduino.cpp +++ b/esphome/components/http_request/http_request_arduino.cpp @@ -26,7 +26,7 @@ static constexpr int ESP8266_SSL_ERR_OOM = -1000; std::shared_ptr HttpRequestArduino::perform(const std::string &url, const std::string &method, const std::string &body, - const std::list
&request_headers, + const std::vector
&request_headers, const std::vector &lower_case_collect_headers) { if (!network::is_connected()) { this->status_momentary_error("failed", 1000); diff --git a/esphome/components/http_request/http_request_arduino.h b/esphome/components/http_request/http_request_arduino.h index dbd61de364..d5ce5c0ff3 100644 --- a/esphome/components/http_request/http_request_arduino.h +++ b/esphome/components/http_request/http_request_arduino.h @@ -49,7 +49,7 @@ class HttpContainerArduino : public HttpContainer { class HttpRequestArduino : public HttpRequestComponent { protected: std::shared_ptr perform(const std::string &url, const std::string &method, const std::string &body, - const std::list
&request_headers, + const std::vector
&request_headers, const std::vector &lower_case_collect_headers) override; }; diff --git a/esphome/components/http_request/http_request_host.cpp b/esphome/components/http_request/http_request_host.cpp index 714a73fc31..60ab4d68a0 100644 --- a/esphome/components/http_request/http_request_host.cpp +++ b/esphome/components/http_request/http_request_host.cpp @@ -18,7 +18,7 @@ static const char *const TAG = "http_request.host"; std::shared_ptr HttpRequestHost::perform(const std::string &url, const std::string &method, const std::string &body, - const std::list
&request_headers, + const std::vector
&request_headers, const std::vector &lower_case_collect_headers) { if (!network::is_connected()) { this->status_momentary_error("failed", 1000); diff --git a/esphome/components/http_request/http_request_host.h b/esphome/components/http_request/http_request_host.h index 79f5b7e817..52be0e8a16 100644 --- a/esphome/components/http_request/http_request_host.h +++ b/esphome/components/http_request/http_request_host.h @@ -19,7 +19,7 @@ class HttpContainerHost : public HttpContainer { class HttpRequestHost : public HttpRequestComponent { public: std::shared_ptr perform(const std::string &url, const std::string &method, const std::string &body, - const std::list
&request_headers, + const std::vector
&request_headers, const std::vector &lower_case_collect_headers) override; void set_ca_path(const char *ca_path) { this->ca_path_ = ca_path; } diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp index 0921c50b9f..dda61e2400 100644 --- a/esphome/components/http_request/http_request_idf.cpp +++ b/esphome/components/http_request/http_request_idf.cpp @@ -54,7 +54,7 @@ esp_err_t HttpRequestIDF::http_event_handler(esp_http_client_event_t *evt) { std::shared_ptr HttpRequestIDF::perform(const std::string &url, const std::string &method, const std::string &body, - const std::list
&request_headers, + const std::vector
&request_headers, const std::vector &lower_case_collect_headers) { if (!network::is_connected()) { this->status_momentary_error("failed", 1000); diff --git a/esphome/components/http_request/http_request_idf.h b/esphome/components/http_request/http_request_idf.h index 9206ba6f5d..9ed1a97b1a 100644 --- a/esphome/components/http_request/http_request_idf.h +++ b/esphome/components/http_request/http_request_idf.h @@ -37,7 +37,7 @@ class HttpRequestIDF : public HttpRequestComponent { protected: std::shared_ptr perform(const std::string &url, const std::string &method, const std::string &body, - const std::list
&request_headers, + const std::vector
&request_headers, const std::vector &lower_case_collect_headers) override; // if zero ESP-IDF will use DEFAULT_HTTP_BUF_SIZE uint16_t buffer_size_rx_{}; diff --git a/esphome/components/online_image/online_image.cpp b/esphome/components/online_image/online_image.cpp index 6f5b82116d..da866599c9 100644 --- a/esphome/components/online_image/online_image.cpp +++ b/esphome/components/online_image/online_image.cpp @@ -49,7 +49,7 @@ void OnlineImage::update() { ESP_LOGD(TAG, "Updating image from %s", this->url_.c_str()); - std::list headers; + std::vector headers; // Add caching headers if we have them if (!this->etag_.empty()) { From 5fddce6638f47c296e1267bbeeadaf677277d635 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 17:02:05 -0600 Subject: [PATCH 007/147] [logger] Make tx_buffer_ compile-time sized (#14205) --- esphome/components/logger/__init__.py | 3 ++- esphome/components/logger/logger.cpp | 7 ++----- esphome/components/logger/logger.h | 9 +++++---- esphome/components/logger/logger_esp32.cpp | 6 +++--- esphome/components/logger/logger_host.cpp | 4 ++-- esphome/core/defines.h | 1 + tests/dummy_main.cpp | 2 +- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/esphome/components/logger/__init__.py b/esphome/components/logger/__init__.py index c8f3c52911..264197c175 100644 --- a/esphome/components/logger/__init__.py +++ b/esphome/components/logger/__init__.py @@ -329,10 +329,11 @@ async def to_code(config): level = config[CONF_LEVEL] CORE.data.setdefault(CONF_LOGGER, {})[CONF_LEVEL] = level initial_level = LOG_LEVELS[config.get(CONF_INITIAL_LEVEL, level)] + tx_buffer_size = config[CONF_TX_BUFFER_SIZE] + cg.add_define("ESPHOME_LOGGER_TX_BUFFER_SIZE", tx_buffer_size) log = cg.new_Pvariable( config[CONF_ID], baud_rate, - config[CONF_TX_BUFFER_SIZE], ) if CORE.is_esp32: cg.add(log.create_pthread_key()) diff --git a/esphome/components/logger/logger.cpp b/esphome/components/logger/logger.cpp index 22a95e4835..497809cd2e 100644 --- a/esphome/components/logger/logger.cpp +++ b/esphome/components/logger/logger.cpp @@ -152,10 +152,7 @@ inline uint8_t Logger::level_for(const char *tag) { return this->current_level_; } -Logger::Logger(uint32_t baud_rate, size_t tx_buffer_size) : baud_rate_(baud_rate), tx_buffer_size_(tx_buffer_size) { - // add 1 to buffer size for null terminator - // NOLINTNEXTLINE(cppcoreguidelines-owning-memory) - allocated once, never freed - this->tx_buffer_ = new char[this->tx_buffer_size_ + 1]; +Logger::Logger(uint32_t baud_rate) : baud_rate_(baud_rate) { #if defined(USE_ESP32) || defined(USE_LIBRETINY) this->main_task_ = xTaskGetCurrentTaskHandle(); #elif defined(USE_ZEPHYR) @@ -196,7 +193,7 @@ void Logger::process_messages_() { uint16_t text_length; while (this->log_buffer_->borrow_message_main_loop(message, text_length)) { const char *thread_name = message->thread_name[0] != '\0' ? message->thread_name : nullptr; - LogBuffer buf{this->tx_buffer_, this->tx_buffer_size_}; + LogBuffer buf{this->tx_buffer_, ESPHOME_LOGGER_TX_BUFFER_SIZE}; this->format_buffered_message_and_notify_(message->level, message->tag, message->line, thread_name, message->text_data(), text_length, buf); // Release the message to allow other tasks to use it as soon as possible diff --git a/esphome/components/logger/logger.h b/esphome/components/logger/logger.h index 8bf1edebb8..90722ee79c 100644 --- a/esphome/components/logger/logger.h +++ b/esphome/components/logger/logger.h @@ -143,7 +143,7 @@ enum UARTSelection : uint8_t { */ class Logger : public Component { public: - explicit Logger(uint32_t baud_rate, size_t tx_buffer_size); + explicit Logger(uint32_t baud_rate); #ifdef USE_ESPHOME_TASK_LOG_BUFFER void init_log_buffer(size_t total_buffer_size); #endif @@ -281,7 +281,7 @@ class Logger : public Component { inline void HOT log_message_to_buffer_and_send_(bool &recursion_guard, uint8_t level, const char *tag, int line, FormatType format, va_list args, const char *thread_name) { RecursionGuard guard(recursion_guard); - LogBuffer buf{this->tx_buffer_, this->tx_buffer_size_}; + LogBuffer buf{this->tx_buffer_, ESPHOME_LOGGER_TX_BUFFER_SIZE}; #ifdef USE_STORE_LOG_STR_IN_FLASH if constexpr (std::is_same_v) { this->format_log_to_buffer_with_terminator_P_(level, tag, line, format, args, buf); @@ -312,7 +312,6 @@ class Logger : public Component { // Group 4-byte aligned members first uint32_t baud_rate_; - char *tx_buffer_{nullptr}; #if defined(USE_ARDUINO) && !defined(USE_ESP32) Stream *hw_serial_{nullptr}; #endif @@ -354,7 +353,6 @@ class Logger : public Component { #endif // Group smaller types together at the end - uint16_t tx_buffer_size_{0}; uint8_t current_level_{ESPHOME_LOG_LEVEL_VERY_VERBOSE}; #if defined(USE_ESP32) || defined(USE_ESP8266) || defined(USE_RP2040) || defined(USE_ZEPHYR) UARTSelection uart_{UART_SELECTION_UART0}; @@ -371,6 +369,9 @@ class Logger : public Component { bool global_recursion_guard_{false}; // Simple global recursion guard for single-task platforms #endif + // Large buffer placed last to keep frequently-accessed member offsets small + char tx_buffer_[ESPHOME_LOGGER_TX_BUFFER_SIZE + 1]; // +1 for null terminator + // --- get_thread_name_ overloads (per-platform) --- #if defined(USE_ESP32) || defined(USE_LIBRETINY) diff --git a/esphome/components/logger/logger_esp32.cpp b/esphome/components/logger/logger_esp32.cpp index 9d64771aec..d6ad77ff4f 100644 --- a/esphome/components/logger/logger_esp32.cpp +++ b/esphome/components/logger/logger_esp32.cpp @@ -89,16 +89,16 @@ void Logger::pre_setup() { switch (this->uart_) { case UART_SELECTION_UART0: this->uart_num_ = UART_NUM_0; - init_uart(this->uart_num_, baud_rate_, tx_buffer_size_); + init_uart(this->uart_num_, baud_rate_, ESPHOME_LOGGER_TX_BUFFER_SIZE); break; case UART_SELECTION_UART1: this->uart_num_ = UART_NUM_1; - init_uart(this->uart_num_, baud_rate_, tx_buffer_size_); + init_uart(this->uart_num_, baud_rate_, ESPHOME_LOGGER_TX_BUFFER_SIZE); break; #ifdef USE_ESP32_VARIANT_ESP32 case UART_SELECTION_UART2: this->uart_num_ = UART_NUM_2; - init_uart(this->uart_num_, baud_rate_, tx_buffer_size_); + init_uart(this->uart_num_, baud_rate_, ESPHOME_LOGGER_TX_BUFFER_SIZE); break; #endif #ifdef USE_LOGGER_USB_CDC diff --git a/esphome/components/logger/logger_host.cpp b/esphome/components/logger/logger_host.cpp index be12b6df6a..fe094f6e9e 100644 --- a/esphome/components/logger/logger_host.cpp +++ b/esphome/components/logger/logger_host.cpp @@ -5,8 +5,8 @@ namespace esphome::logger { void HOT Logger::write_msg_(const char *msg, uint16_t len) { static constexpr size_t TIMESTAMP_LEN = 10; // "[HH:MM:SS]" - // tx_buffer_size_ defaults to 512, so 768 covers default + headroom - char buffer[TIMESTAMP_LEN + 768]; + static constexpr size_t HEADROOM = 128; // Extra space for ANSI codes, newline, etc. + char buffer[TIMESTAMP_LEN + ESPHOME_LOGGER_TX_BUFFER_SIZE + HEADROOM]; time_t rawtime; time(&rawtime); diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 02335e2745..1128df94f0 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -21,6 +21,7 @@ // logger #define ESPHOME_LOG_LEVEL ESPHOME_LOG_LEVEL_VERY_VERBOSE +#define ESPHOME_LOGGER_TX_BUFFER_SIZE 512 #define USE_LOG_LISTENERS #define ESPHOME_LOG_MAX_LISTENERS 8 diff --git a/tests/dummy_main.cpp b/tests/dummy_main.cpp index e6fe733807..52f1fbd319 100644 --- a/tests/dummy_main.cpp +++ b/tests/dummy_main.cpp @@ -13,7 +13,7 @@ using namespace esphome; void setup() { App.pre_setup("livingroom", "LivingRoom", false); - auto *log = new logger::Logger(115200, 512); // NOLINT + auto *log = new logger::Logger(115200); // NOLINT log->pre_setup(); log->set_uart_selection(logger::UART_SELECTION_UART0); App.register_component(log); From b539a5aa51e08db837d30be5310b917fa61f631b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 17:07:56 -0600 Subject: [PATCH 008/147] [water_heater] Fix device_id missing from state responses (#14212) --- esphome/components/api/api_connection.cpp | 3 +- .../fixtures/device_id_in_state.yaml | 115 ++++++++++++ tests/integration/test_device_id_in_state.py | 173 ++++++++++++------ 3 files changed, 232 insertions(+), 59 deletions(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 9fc263abbd..7bc9c45c05 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -1346,9 +1346,8 @@ uint16_t APIConnection::try_send_water_heater_state(EntityBase *entity, APIConne resp.target_temperature_low = wh->get_target_temperature_low(); resp.target_temperature_high = wh->get_target_temperature_high(); resp.state = wh->get_state(); - resp.key = wh->get_object_id_hash(); - return encode_message_to_buffer(resp, WaterHeaterStateResponse::MESSAGE_TYPE, conn, remaining_size); + return fill_and_encode_entity_state(wh, resp, WaterHeaterStateResponse::MESSAGE_TYPE, conn, remaining_size); } uint16_t APIConnection::try_send_water_heater_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size) { auto *wh = static_cast(entity); diff --git a/tests/integration/fixtures/device_id_in_state.yaml b/tests/integration/fixtures/device_id_in_state.yaml index c8548617b8..a5dfb7ee45 100644 --- a/tests/integration/fixtures/device_id_in_state.yaml +++ b/tests/integration/fixtures/device_id_in_state.yaml @@ -46,6 +46,7 @@ sensor: binary_sensor: - platform: template + id: motion_detected name: Motion Detected device_id: motion_sensor lambda: return true; @@ -82,3 +83,117 @@ output: write_action: - lambda: |- ESP_LOGD("test", "Light output: %d", state); + +cover: + - platform: template + name: Garage Door + device_id: motion_sensor + optimistic: true + +fan: + - platform: template + name: Ceiling Fan + device_id: humidity_monitor + speed_count: 3 + has_oscillating: false + has_direction: false + +lock: + - platform: template + name: Front Door Lock + device_id: motion_sensor + optimistic: true + +number: + - platform: template + name: Target Temperature + device_id: temperature_monitor + optimistic: true + min_value: 0 + max_value: 100 + step: 1 + +select: + - platform: template + name: Mode Select + device_id: humidity_monitor + optimistic: true + options: + - "Auto" + - "Manual" + +text: + - platform: template + name: Device Label + device_id: temperature_monitor + optimistic: true + mode: text + +valve: + - platform: template + name: Water Valve + device_id: humidity_monitor + optimistic: true + +globals: + - id: global_away + type: bool + initial_value: "false" + - id: global_is_on + type: bool + initial_value: "true" + +water_heater: + - platform: template + name: Test Boiler + device_id: temperature_monitor + optimistic: true + current_temperature: !lambda "return 45.0f;" + target_temperature: !lambda "return 60.0f;" + away: !lambda "return id(global_away);" + is_on: !lambda "return id(global_is_on);" + supported_modes: + - "off" + - electric + visual: + min_temperature: 30.0 + max_temperature: 85.0 + target_temperature_step: 0.5 + set_action: + - lambda: |- + ESP_LOGD("test", "Water heater set"); + +alarm_control_panel: + - platform: template + name: House Alarm + device_id: motion_sensor + codes: + - "1234" + restore_mode: ALWAYS_DISARMED + binary_sensors: + - input: motion_detected + +datetime: + - platform: template + name: Schedule Date + device_id: temperature_monitor + type: date + optimistic: true + - platform: template + name: Schedule Time + device_id: humidity_monitor + type: time + optimistic: true + - platform: template + name: Schedule DateTime + device_id: motion_sensor + type: datetime + optimistic: true + +event: + - platform: template + name: Doorbell + device_id: motion_sensor + event_types: + - "press" + - "double_press" diff --git a/tests/integration/test_device_id_in_state.py b/tests/integration/test_device_id_in_state.py index 51088bcbf7..48de94a85a 100644 --- a/tests/integration/test_device_id_in_state.py +++ b/tests/integration/test_device_id_in_state.py @@ -4,11 +4,80 @@ from __future__ import annotations import asyncio -from aioesphomeapi import BinarySensorState, EntityState, SensorState, TextSensorState +from aioesphomeapi import ( + AlarmControlPanelEntityState, + BinarySensorState, + CoverState, + DateState, + DateTimeState, + EntityState, + FanState, + LightState, + LockEntityState, + NumberState, + SelectState, + SensorState, + SwitchState, + TextSensorState, + TextState, + TimeState, + ValveState, + WaterHeaterState, +) import pytest from .types import APIClientConnectedFactory, RunCompiledFunction +# Mapping of entity name to device name for all entities with device_id +ENTITY_TO_DEVICE = { + # Original entities + "Temperature": "Temperature Monitor", + "Humidity": "Humidity Monitor", + "Motion Detected": "Motion Sensor", + "Temperature Monitor Power": "Temperature Monitor", + "Temperature Status": "Temperature Monitor", + "Motion Light": "Motion Sensor", + # New entity types + "Garage Door": "Motion Sensor", + "Ceiling Fan": "Humidity Monitor", + "Front Door Lock": "Motion Sensor", + "Target Temperature": "Temperature Monitor", + "Mode Select": "Humidity Monitor", + "Device Label": "Temperature Monitor", + "Water Valve": "Humidity Monitor", + "Test Boiler": "Temperature Monitor", + "House Alarm": "Motion Sensor", + "Schedule Date": "Temperature Monitor", + "Schedule Time": "Humidity Monitor", + "Schedule DateTime": "Motion Sensor", + "Doorbell": "Motion Sensor", +} + +# Entities without device_id (should have device_id 0) +NO_DEVICE_ENTITIES = {"No Device Sensor"} + +# State types that should have non-zero device_id, mapped by their aioesphomeapi class +EXPECTED_STATE_TYPES = [ + (SensorState, "sensor"), + (BinarySensorState, "binary_sensor"), + (SwitchState, "switch"), + (TextSensorState, "text_sensor"), + (LightState, "light"), + (CoverState, "cover"), + (FanState, "fan"), + (LockEntityState, "lock"), + (NumberState, "number"), + (SelectState, "select"), + (TextState, "text"), + (ValveState, "valve"), + (WaterHeaterState, "water_heater"), + (AlarmControlPanelEntityState, "alarm_control_panel"), + (DateState, "date"), + (TimeState, "time"), + (DateTimeState, "datetime"), + # Event is stateless (no initial state sent on subscribe) +] + @pytest.mark.asyncio async def test_device_id_in_state( @@ -40,34 +109,35 @@ async def test_device_id_in_state( entity_device_mapping: dict[int, int] = {} for entity in all_entities: - # All entities have name and key attributes - if entity.name == "Temperature": - entity_device_mapping[entity.key] = device_ids["Temperature Monitor"] - elif entity.name == "Humidity": - entity_device_mapping[entity.key] = device_ids["Humidity Monitor"] - elif entity.name == "Motion Detected": - entity_device_mapping[entity.key] = device_ids["Motion Sensor"] - elif entity.name in {"Temperature Monitor Power", "Temperature Status"}: - entity_device_mapping[entity.key] = device_ids["Temperature Monitor"] - elif entity.name == "Motion Light": - entity_device_mapping[entity.key] = device_ids["Motion Sensor"] - elif entity.name == "No Device Sensor": - # Entity without device_id should have device_id 0 + if entity.name in ENTITY_TO_DEVICE: + expected_device = ENTITY_TO_DEVICE[entity.name] + entity_device_mapping[entity.key] = device_ids[expected_device] + elif entity.name in NO_DEVICE_ENTITIES: entity_device_mapping[entity.key] = 0 - assert len(entity_device_mapping) >= 6, ( - f"Expected at least 6 mapped entities, got {len(entity_device_mapping)}" + expected_count = len(ENTITY_TO_DEVICE) + len(NO_DEVICE_ENTITIES) + assert len(entity_device_mapping) >= expected_count, ( + f"Expected at least {expected_count} mapped entities, " + f"got {len(entity_device_mapping)}. " + f"Missing: {set(ENTITY_TO_DEVICE) | NO_DEVICE_ENTITIES - {e.name for e in all_entities}}" + ) + + # Subscribe to states and wait for all mapped entities + # Event entities are stateless (no initial state on subscribe), + # so exclude them from the expected count + stateless_keys = {e.key for e in all_entities if e.name == "Doorbell"} + stateful_count = len(entity_device_mapping) - len( + stateless_keys & entity_device_mapping.keys() ) - # Subscribe to states loop = asyncio.get_running_loop() states: dict[int, EntityState] = {} states_future: asyncio.Future[bool] = loop.create_future() def on_state(state: EntityState) -> None: - states[state.key] = state - # Check if we have states for all mapped entities - if len(states) >= len(entity_device_mapping) and not states_future.done(): + if state.key in entity_device_mapping: + states[state.key] = state + if len(states) >= stateful_count and not states_future.done(): states_future.set_result(True) client.subscribe_states(on_state) @@ -76,9 +146,16 @@ async def test_device_id_in_state( try: await asyncio.wait_for(states_future, timeout=10.0) except TimeoutError: + received_names = {e.name for e in all_entities if e.key in states} + missing_names = ( + (set(ENTITY_TO_DEVICE) | NO_DEVICE_ENTITIES) + - received_names + - {"Doorbell"} + ) pytest.fail( f"Did not receive all entity states within 10 seconds. " - f"Received {len(states)} states, expected {len(entity_device_mapping)}" + f"Received {len(states)} states. " + f"Missing: {missing_names}" ) # Verify each state has the correct device_id @@ -86,51 +163,33 @@ async def test_device_id_in_state( for key, expected_device_id in entity_device_mapping.items(): if key in states: state = states[key] + entity_name = next( + (e.name for e in all_entities if e.key == key), f"key={key}" + ) assert state.device_id == expected_device_id, ( - f"State for key {key} has device_id {state.device_id}, " - f"expected {expected_device_id}" + f"State for '{entity_name}' (type={type(state).__name__}) " + f"has device_id {state.device_id}, expected {expected_device_id}" ) verified_count += 1 - assert verified_count >= 6, ( - f"Only verified {verified_count} states, expected at least 6" + # All stateful entities should be verified (everything except Doorbell event) + expected_verified = expected_count - 1 # exclude Doorbell + assert verified_count >= expected_verified, ( + f"Only verified {verified_count} states, expected at least {expected_verified}" ) - # Test specific state types to ensure device_id is present - # Find a sensor state with device_id - sensor_state = next( - ( + # Verify each expected state type has at least one instance with non-zero device_id + for state_type, type_name in EXPECTED_STATE_TYPES: + matching = [ s for s in states.values() - if isinstance(s, SensorState) - and isinstance(s.state, float) - and s.device_id != 0 - ), - None, - ) - assert sensor_state is not None, "No sensor state with device_id found" - assert sensor_state.device_id > 0, "Sensor state should have non-zero device_id" - - # Find a binary sensor state - binary_sensor_state = next( - (s for s in states.values() if isinstance(s, BinarySensorState)), - None, - ) - assert binary_sensor_state is not None, "No binary sensor state found" - assert binary_sensor_state.device_id > 0, ( - "Binary sensor state should have non-zero device_id" - ) - - # Find a text sensor state - text_sensor_state = next( - (s for s in states.values() if isinstance(s, TextSensorState)), - None, - ) - assert text_sensor_state is not None, "No text sensor state found" - assert text_sensor_state.device_id > 0, ( - "Text sensor state should have non-zero device_id" - ) + if isinstance(s, state_type) and s.device_id != 0 + ] + assert matching, ( + f"No {type_name} state (type={state_type.__name__}) " + f"with non-zero device_id found" + ) # Verify the "No Device Sensor" has device_id = 0 no_device_key = next( From ded457c2c1a5b27aba9af05b7b29a38dd832e7fa Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 18:52:46 -0600 Subject: [PATCH 009/147] [libretiny] Tune oversized lwIP defaults for ESPHome (#14186) Co-authored-by: Claude Opus 4.6 Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- esphome/components/api/__init__.py | 4 +- esphome/components/captive_portal/__init__.py | 6 +- esphome/components/esp32/__init__.py | 59 +++---- .../esp32_camera_web_server/__init__.py | 6 +- esphome/components/esphome/ota/__init__.py | 5 +- esphome/components/libretiny/__init__.py | 153 +++++++++++++++++- esphome/components/mdns/__init__.py | 2 +- esphome/components/socket/__init__.py | 90 ++++++++++- esphome/components/udp/__init__.py | 2 +- esphome/components/web_server/__init__.py | 6 +- .../components/web_server_base/__init__.py | 25 ++- esphome/components/wifi/__init__.py | 20 +++ .../socket/test_wake_loop_threadsafe.py | 8 +- 13 files changed, 327 insertions(+), 59 deletions(-) diff --git a/esphome/components/api/__init__.py b/esphome/components/api/__init__.py index 9bff9f5635..3f7cafb485 100644 --- a/esphome/components/api/__init__.py +++ b/esphome/components/api/__init__.py @@ -233,8 +233,8 @@ def _consume_api_sockets(config: ConfigType) -> ConfigType: # API needs 1 listening socket + typically 3 concurrent client connections # (not max_connections, which is the upper limit rarely reached) - sockets_needed = 1 + 3 - socket.consume_sockets(sockets_needed, "api")(config) + socket.consume_sockets(3, "api")(config) + socket.consume_sockets(1, "api", socket.SocketType.TCP_LISTEN)(config) return config diff --git a/esphome/components/captive_portal/__init__.py b/esphome/components/captive_portal/__init__.py index 049618219e..6c190814c0 100644 --- a/esphome/components/captive_portal/__init__.py +++ b/esphome/components/captive_portal/__init__.py @@ -76,13 +76,15 @@ def _final_validate(config: ConfigType) -> ConfigType: # Register socket needs for DNS server and additional HTTP connections # - 1 UDP socket for DNS server - # - 3 additional TCP sockets for captive portal detection probes + configuration requests + # - 3 TCP sockets for captive portal detection probes + configuration requests # OS captive portal detection makes multiple probe requests that stay in TIME_WAIT. # Need headroom for actual user configuration requests. # LRU purging will reclaim idle sockets to prevent exhaustion from repeated attempts. + # The listening socket is registered by web_server_base (shared HTTP server). from esphome.components import socket - socket.consume_sockets(4, "captive_portal")(config) + socket.consume_sockets(3, "captive_portal")(config) + socket.consume_sockets(1, "captive_portal", socket.SocketType.UDP)(config) return config diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 06677006ea..4c211b2f2a 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -1258,21 +1258,15 @@ def _configure_lwip_max_sockets(conf: dict) -> None: This function runs in to_code() after all components have registered their socket needs. User-provided sdkconfig_options take precedence. """ - from esphome.components.socket import KEY_SOCKET_CONSUMERS + from esphome.components.socket import get_socket_counts # Check if user manually specified CONFIG_LWIP_MAX_SOCKETS user_max_sockets = conf[CONF_SDKCONFIG_OPTIONS].get("CONFIG_LWIP_MAX_SOCKETS") - socket_consumers: dict[str, int] = CORE.data.get(KEY_SOCKET_CONSUMERS, {}) - total_sockets = sum(socket_consumers.values()) - - # Early return if no sockets registered and no user override - if total_sockets == 0 and user_max_sockets is None: - return - - components_list = ", ".join( - f"{name}={count}" for name, count in sorted(socket_consumers.items()) - ) + # CONFIG_LWIP_MAX_SOCKETS is a single VFS socket pool shared by all socket + # types (TCP clients, TCP listeners, and UDP). Include all three counts. + sc = get_socket_counts() + total_sockets = sc.tcp + sc.udp + sc.tcp_listen # User specified their own value - respect it but warn if insufficient if user_max_sockets is not None: @@ -1281,22 +1275,23 @@ def _configure_lwip_max_sockets(conf: dict) -> None: user_max_sockets, ) - # Warn if user's value is less than what components need - if total_sockets > 0: - user_sockets_int = 0 - with contextlib.suppress(ValueError, TypeError): - user_sockets_int = int(user_max_sockets) + user_sockets_int = 0 + with contextlib.suppress(ValueError, TypeError): + user_sockets_int = int(user_max_sockets) - if user_sockets_int < total_sockets: - _LOGGER.warning( - "CONFIG_LWIP_MAX_SOCKETS is set to %d but your configuration " - "needs %d sockets (registered: %s). You may experience socket " - "exhaustion errors. Consider increasing to at least %d.", - user_sockets_int, - total_sockets, - components_list, - total_sockets, - ) + if user_sockets_int < total_sockets: + _LOGGER.warning( + "CONFIG_LWIP_MAX_SOCKETS is set to %d but your configuration " + "needs %d sockets (%d TCP + %d UDP + %d TCP_LISTEN). You may " + "experience socket exhaustion errors. Consider increasing to " + "at least %d.", + user_sockets_int, + total_sockets, + sc.tcp, + sc.udp, + sc.tcp_listen, + total_sockets, + ) # User's value already added via sdkconfig_options processing return @@ -1305,11 +1300,19 @@ def _configure_lwip_max_sockets(conf: dict) -> None: max_sockets = max(DEFAULT_MAX_SOCKETS, total_sockets) log_level = logging.INFO if max_sockets > DEFAULT_MAX_SOCKETS else logging.DEBUG + sock_min = " (min)" if max_sockets > total_sockets else "" _LOGGER.log( log_level, - "Setting CONFIG_LWIP_MAX_SOCKETS to %d (registered: %s)", + "Setting CONFIG_LWIP_MAX_SOCKETS to %d%s " + "(TCP=%d [%s], UDP=%d [%s], TCP_LISTEN=%d [%s])", max_sockets, - components_list, + sock_min, + sc.tcp, + sc.tcp_details, + sc.udp, + sc.udp_details, + sc.tcp_listen, + sc.tcp_listen_details, ) add_idf_sdkconfig_option("CONFIG_LWIP_MAX_SOCKETS", max_sockets) diff --git a/esphome/components/esp32_camera_web_server/__init__.py b/esphome/components/esp32_camera_web_server/__init__.py index ed1aaa2e07..da260ad7a1 100644 --- a/esphome/components/esp32_camera_web_server/__init__.py +++ b/esphome/components/esp32_camera_web_server/__init__.py @@ -20,8 +20,10 @@ def _consume_camera_web_server_sockets(config: ConfigType) -> ConfigType: from esphome.components import socket # Each camera web server instance needs 1 listening socket + 2 client connections - sockets_needed = 3 - socket.consume_sockets(sockets_needed, "esp32_camera_web_server")(config) + socket.consume_sockets(2, "esp32_camera_web_server")(config) + socket.consume_sockets(1, "esp32_camera_web_server", socket.SocketType.TCP_LISTEN)( + config + ) return config diff --git a/esphome/components/esphome/ota/__init__.py b/esphome/components/esphome/ota/__init__.py index 2f637d714d..337064dd27 100644 --- a/esphome/components/esphome/ota/__init__.py +++ b/esphome/components/esphome/ota/__init__.py @@ -97,8 +97,9 @@ def _consume_ota_sockets(config: ConfigType) -> ConfigType: """Register socket needs for OTA component.""" from esphome.components import socket - # OTA needs 1 listening socket (client connections are temporary during updates) - socket.consume_sockets(1, "ota")(config) + # OTA needs 1 listening socket. The active transfer connection during an update + # uses a TCP PCB from the general pool, covered by MIN_TCP_SOCKETS headroom. + socket.consume_sockets(1, "ota", socket.SocketType.TCP_LISTEN)(config) return config diff --git a/esphome/components/libretiny/__init__.py b/esphome/components/libretiny/__init__.py index 01445da7ee..2291114d9a 100644 --- a/esphome/components/libretiny/__init__.py +++ b/esphome/components/libretiny/__init__.py @@ -275,6 +275,146 @@ BASE_SCHEMA.add_extra(_detect_variant) BASE_SCHEMA.add_extra(_update_core_data) +def _configure_lwip(config: dict) -> None: + """Configure lwIP options for LibreTiny platforms. + + The BK/RTL/LN SDKs each ship different lwIP defaults. BK72XX defaults are + wildly oversized for ESPHome's IoT use case, causing OOM on BK7231N. + RTL87XX and LN882H have more conservative defaults but still need tuning + for ESPHome's socket usage patterns. + + See https://github.com/esphome/esphome/issues/14095 + + Comparison of SDK defaults vs ESPHome targets (TCP_MSS=1460 on all LT): + + Setting ESP8266 ESP32 BK SDK RTL SDK LN SDK New + ──────────────────────────────────────────────────────────────────────────── + TCP_SND_BUF 2×MSS 4×MSS 10×MSS 5×MSS 7×MSS 4×MSS + TCP_WND 4×MSS 4×MSS 3/10×MSS 2×MSS 3×MSS 4×MSS + MEM_LIBC_MALLOC 1 1 0 0 1 1 + MEMP_MEM_MALLOC 1 1 0 0 0 1 + MEM_SIZE N/A* N/A* 16/32KB 5KB N/A* N/A* BK + PBUF_POOL_SIZE 10 16 3/10 20 20 10 BK + MAX_SOCKETS_TCP 5 16 12 —** —** dynamic + MAX_SOCKETS_UDP 4 16 22 —** —** dynamic + TCP_SND_QUEUELEN ~8 17 20 20 35 17 + MEMP_NUM_TCP_SEG 10 16 40 20 =qlen 17 + MEMP_NUM_TCP_PCB 5 16 12 10 8 =TCP + MEMP_NUM_TCP_PCB_LISTEN 4 16 4 5 3 dynamic + MEMP_NUM_UDP_PCB 4 16 25*** 7**** 7**** =UDP + MEMP_NUM_NETCONN 0 10 38 4***** =sum =sum + MEMP_NUM_NETBUF 0 2 16 2***** 8 4 + MEMP_NUM_TCPIP_MSG_INPKT 4 8 16 8***** 12 8 + + * ESP8266/ESP32/LN882H use MEM_LIBC_MALLOC=1 (system heap, no dedicated pool). + ESP8266/ESP32 also use MEMP_MEM_MALLOC=1 (MEMP pools from heap, not static). + ** RTL/LN SDKs don't define MAX_SOCKETS_TCP/UDP (LibreTiny-specific). + *** BK LT overlay: MAX_SOCKETS_UDP+2+1 = 25. + **** RTL/LN LT overlay overrides to flat 7. + ***** Not defined in RTL SDK — lwIP opt.h defaults shown. + "dynamic" = auto-calculated from component socket registrations via + socket.get_socket_counts() with minimums of 8 TCP / 6 UDP. + """ + from esphome.components.socket import ( + MIN_TCP_LISTEN_SOCKETS, + MIN_TCP_SOCKETS, + MIN_UDP_SOCKETS, + get_socket_counts, + ) + + sc = get_socket_counts() + # Apply platform minimums — ensure headroom for ESPHome's needs + tcp_sockets = max(MIN_TCP_SOCKETS, sc.tcp) + udp_sockets = max(MIN_UDP_SOCKETS, sc.udp) + # Listening sockets — registered by components (api, ota, web_server_base, etc.) + # Not all components register yet, so ensure a minimum for baseline operation. + listening_tcp = max(MIN_TCP_LISTEN_SOCKETS, sc.tcp_listen) + + # TCP_SND_BUF: ESPAsyncWebServer allocates malloc(tcp_sndbuf()) per + # response chunk. At 10×MSS=14.6KB (BK default) this causes OOM (#14095). + # 4×MSS=5,840 matches ESP32. RTL(5×) and LN(7×) are close already. + tcp_snd_buf = "(4*TCP_MSS)" # BK: 10×MSS, RTL: 5×MSS, LN: 7×MSS + + # TCP_WND: receive window. 4×MSS matches ESP32. + # RTL SDK uses only 2×MSS; increasing to 4× is safe and improves throughput. + tcp_wnd = "(4*TCP_MSS)" # BK: 10×MSS, RTL: 2×MSS, LN: 3×MSS + + # TCP_SND_QUEUELEN: max pbufs queued for send buffer + # ESP-IDF formula: (4 * TCP_SND_BUF + (TCP_MSS - 1)) / TCP_MSS + # With 4×MSS: (4*5840 + 1459) / 1460 = 17 — match ESP32 + tcp_snd_queuelen = 17 # BK: 20, RTL: 20, LN: 35 + # MEMP_NUM_TCP_SEG: segment pool, must be >= TCP_SND_QUEUELEN (lwIP sanity check) + memp_num_tcp_seg = tcp_snd_queuelen # BK: 40, RTL: 20, LN: =qlen + + lwip_opts: list[str] = [ + # Disable statistics — not needed for production, saves RAM + "LWIP_STATS=0", # BK: 1, RTL: 0 already, LN: 0 already + "MEM_STATS=0", + "MEMP_STATS=0", + # TCP send buffer — 4×MSS matches ESP32 + f"TCP_SND_BUF={tcp_snd_buf}", + # TCP receive window — 4×MSS matches ESP32 + f"TCP_WND={tcp_wnd}", + # Socket counts — auto-calculated from component registrations + f"MAX_SOCKETS_TCP={tcp_sockets}", + f"MAX_SOCKETS_UDP={udp_sockets}", + # Listening sockets — BK SDK uses this to derive MEMP_NUM_TCP_PCB_LISTEN; + # RTL/LN don't use it, but we set MEMP_NUM_TCP_PCB_LISTEN explicitly below. + f"MAX_LISTENING_SOCKETS_TCP={listening_tcp}", + # Queued segment limits — derived from 4×MSS buffer size + f"TCP_SND_QUEUELEN={tcp_snd_queuelen}", + f"MEMP_NUM_TCP_SEG={memp_num_tcp_seg}", # must be >= queuelen + # PCB pools — active connections + listening sockets + f"MEMP_NUM_TCP_PCB={tcp_sockets}", # BK: 12, RTL: 10, LN: 8 + f"MEMP_NUM_TCP_PCB_LISTEN={listening_tcp}", # BK: =MAX_LISTENING, RTL: 5, LN: 3 + # UDP PCB pool — includes wifi.lwip_internal (DHCP + DNS) + f"MEMP_NUM_UDP_PCB={udp_sockets}", # BK: 25, RTL/LN: 7 via LT + # Netconn pool — each socket (active + listening) needs a netconn + f"MEMP_NUM_NETCONN={tcp_sockets + udp_sockets + listening_tcp}", + # Netbuf pool + "MEMP_NUM_NETBUF=4", # BK: 16, RTL: 2 (opt.h), LN: 8 + # Inbound message pool + "MEMP_NUM_TCPIP_MSG_INPKT=8", # BK: 16, RTL: 8 (opt.h), LN: 12 + ] + + # Use system heap for all lwIP allocations on all LibreTiny platforms. + # - MEM_LIBC_MALLOC=1: Use system heap instead of dedicated lwIP heap. + # LN882H already ships with this. BK SDK defaults to a 16/32KB dedicated + # pool that fragments during OTA. RTL SDK defaults to a 5KB pool. + # All three SDKs wire malloc → pvPortMalloc (FreeRTOS thread-safe heap). + # - MEMP_MEM_MALLOC=1: Allocate MEMP pools from heap on demand instead + # of static arrays. Saves ~20KB RAM on BK72XX. Safe because WiFi + # receive paths run in task context, not ISR context. ESP32 and ESP8266 + # both ship with MEMP_MEM_MALLOC=1. + lwip_opts.append("MEM_LIBC_MALLOC=1") + lwip_opts.append("MEMP_MEM_MALLOC=1") + + # BK72XX-specific: PBUF_POOL_SIZE override + # BK SDK "reduced plan" sets this to only 3 — too few for multiple + # concurrent connections (API + web_server + OTA). BK default plan + # uses 10; match that. RTL(20) and LN(20) need no override. + # With MEMP_MEM_MALLOC=1, this is a max count (allocated on demand). + if CORE.is_bk72xx: + lwip_opts.append("PBUF_POOL_SIZE=10") + + tcp_min = " (min)" if tcp_sockets > sc.tcp else "" + udp_min = " (min)" if udp_sockets > sc.udp else "" + listen_min = " (min)" if listening_tcp > sc.tcp_listen else "" + _LOGGER.info( + "Configuring lwIP: TCP=%d%s [%s], UDP=%d%s [%s], TCP_LISTEN=%d%s [%s]", + tcp_sockets, + tcp_min, + sc.tcp_details, + udp_sockets, + udp_min, + sc.udp_details, + listening_tcp, + listen_min, + sc.tcp_listen_details, + ) + cg.add_platformio_option("custom_options.lwip", lwip_opts) + + # pylint: disable=use-dict-literal async def component_to_code(config): var = cg.new_Pvariable(config[CONF_ID]) @@ -389,11 +529,12 @@ async def component_to_code(config): "custom_options.sys_config#h", _BK7231N_SYS_CONFIG_OPTIONS ) - # Disable LWIP statistics to save RAM - not needed in production - # Must explicitly disable all sub-stats to avoid redefinition warnings - cg.add_platformio_option( - "custom_options.lwip", - ["LWIP_STATS=0", "MEM_STATS=0", "MEMP_STATS=0"], - ) + # Tune lwIP for ESPHome's actual needs. + # The SDK defaults (TCP_SND_BUF=10*MSS, MAX_SOCKETS_TCP=12, MEM_SIZE=32KB) + # are wildly oversized for an IoT device. ESPAsyncWebServer allocates + # malloc(tcp_sndbuf()) per response chunk — at 14.6KB this causes silent + # OOM on memory-constrained chips like BK7231N. + # See https://github.com/esphome/esphome/issues/14095 + _configure_lwip(config) await cg.register_component(var, config) diff --git a/esphome/components/mdns/__init__.py b/esphome/components/mdns/__init__.py index f87f929615..420e6a60e3 100644 --- a/esphome/components/mdns/__init__.py +++ b/esphome/components/mdns/__init__.py @@ -56,7 +56,7 @@ def _consume_mdns_sockets(config: ConfigType) -> ConfigType: from esphome.components import socket # mDNS needs 2 sockets (IPv4 + IPv6 multicast) - socket.consume_sockets(2, "mdns")(config) + socket.consume_sockets(2, "mdns", socket.SocketType.UDP)(config) return config diff --git a/esphome/components/socket/__init__.py b/esphome/components/socket/__init__.py index e364da78f8..d82f0c7aba 100644 --- a/esphome/components/socket/__init__.py +++ b/esphome/components/socket/__init__.py @@ -1,9 +1,14 @@ from collections.abc import Callable, MutableMapping +from dataclasses import dataclass +from enum import StrEnum +import logging import esphome.codegen as cg import esphome.config_validation as cv from esphome.core import CORE +_LOGGER = logging.getLogger(__name__) + CODEOWNERS = ["@esphome/core"] CONF_IMPLEMENTATION = "implementation" @@ -13,33 +18,110 @@ IMPLEMENTATION_BSD_SOCKETS = "bsd_sockets" # Socket tracking infrastructure # Components register their socket needs and platforms read this to configure appropriately -KEY_SOCKET_CONSUMERS = "socket_consumers" +KEY_SOCKET_CONSUMERS_TCP = "socket_consumers_tcp" +KEY_SOCKET_CONSUMERS_UDP = "socket_consumers_udp" +KEY_SOCKET_CONSUMERS_TCP_LISTEN = "socket_consumers_tcp_listen" + +# Recommended minimum socket counts. +# Platforms should apply these (or their own) on top of get_socket_counts(). +# These cover minimal configs (e.g. api-only without web_server). +# When web_server is present, its 5 registered sockets push past the TCP minimum. +MIN_TCP_SOCKETS = 8 +MIN_UDP_SOCKETS = 6 +# Minimum listening sockets — at least api + ota baseline. +MIN_TCP_LISTEN_SOCKETS = 2 # Wake loop threadsafe support tracking KEY_WAKE_LOOP_THREADSAFE_REQUIRED = "wake_loop_threadsafe_required" +class SocketType(StrEnum): + TCP = "tcp" + UDP = "udp" + TCP_LISTEN = "tcp_listen" + + +_SOCKET_TYPE_KEYS = { + SocketType.TCP: KEY_SOCKET_CONSUMERS_TCP, + SocketType.UDP: KEY_SOCKET_CONSUMERS_UDP, + SocketType.TCP_LISTEN: KEY_SOCKET_CONSUMERS_TCP_LISTEN, +} + + def consume_sockets( - value: int, consumer: str + value: int, consumer: str, socket_type: SocketType = SocketType.TCP ) -> Callable[[MutableMapping], MutableMapping]: """Register socket usage for a component. Args: value: Number of sockets needed by the component consumer: Name of the component consuming the sockets + socket_type: Type of socket (SocketType.TCP, SocketType.UDP, or SocketType.TCP_LISTEN) Returns: A validator function that records the socket usage """ + typed_key = _SOCKET_TYPE_KEYS[socket_type] def _consume_sockets(config: MutableMapping) -> MutableMapping: - consumers: dict[str, int] = CORE.data.setdefault(KEY_SOCKET_CONSUMERS, {}) + consumers: dict[str, int] = CORE.data.setdefault(typed_key, {}) consumers[consumer] = consumers.get(consumer, 0) + value return config return _consume_sockets +def _format_consumers(consumers: dict[str, int]) -> str: + """Format consumer dict as 'name=count, ...' or 'none'.""" + if not consumers: + return "none" + return ", ".join(f"{name}={count}" for name, count in sorted(consumers.items())) + + +@dataclass(frozen=True) +class SocketCounts: + """Socket counts and component details for platform configuration.""" + + tcp: int + udp: int + tcp_listen: int + tcp_details: str + udp_details: str + tcp_listen_details: str + + +def get_socket_counts() -> SocketCounts: + """Return socket counts and component details for platform configuration. + + Platforms call this during code generation to configure lwIP socket limits. + All components will have registered their needs by then. + + Platforms should apply their own minimums on top of these values. + """ + tcp_consumers = CORE.data.get(KEY_SOCKET_CONSUMERS_TCP, {}) + udp_consumers = CORE.data.get(KEY_SOCKET_CONSUMERS_UDP, {}) + tcp_listen_consumers = CORE.data.get(KEY_SOCKET_CONSUMERS_TCP_LISTEN, {}) + tcp = sum(tcp_consumers.values()) + udp = sum(udp_consumers.values()) + tcp_listen = sum(tcp_listen_consumers.values()) + + tcp_details = _format_consumers(tcp_consumers) + udp_details = _format_consumers(udp_consumers) + tcp_listen_details = _format_consumers(tcp_listen_consumers) + _LOGGER.debug( + "Socket counts: TCP=%d (%s), UDP=%d (%s), TCP_LISTEN=%d (%s)", + tcp, + tcp_details, + udp, + udp_details, + tcp_listen, + tcp_listen_details, + ) + return SocketCounts( + tcp, udp, tcp_listen, tcp_details, udp_details, tcp_listen_details + ) + + def require_wake_loop_threadsafe() -> None: """Mark that wake_loop_threadsafe support is required by a component. @@ -66,7 +148,7 @@ def require_wake_loop_threadsafe() -> None: CORE.data[KEY_WAKE_LOOP_THREADSAFE_REQUIRED] = True cg.add_define("USE_WAKE_LOOP_THREADSAFE") # Consume 1 socket for the shared wake notification socket - consume_sockets(1, "socket.wake_loop_threadsafe")({}) + consume_sockets(1, "socket.wake_loop_threadsafe", SocketType.UDP)({}) CONFIG_SCHEMA = cv.Schema( diff --git a/esphome/components/udp/__init__.py b/esphome/components/udp/__init__.py index c9586d0b95..37dd871a6c 100644 --- a/esphome/components/udp/__init__.py +++ b/esphome/components/udp/__init__.py @@ -73,7 +73,7 @@ def _consume_udp_sockets(config: ConfigType) -> ConfigType: # UDP uses up to 2 sockets: 1 broadcast + 1 listen # Whether each is used depends on code generation, so register worst case - socket.consume_sockets(2, "udp")(config) + socket.consume_sockets(2, "udp", socket.SocketType.UDP)(config) return config diff --git a/esphome/components/web_server/__init__.py b/esphome/components/web_server/__init__.py index 9305a2de61..84910b6f90 100644 --- a/esphome/components/web_server/__init__.py +++ b/esphome/components/web_server/__init__.py @@ -144,11 +144,11 @@ def _consume_web_server_sockets(config: ConfigType) -> ConfigType: """Register socket needs for web_server component.""" from esphome.components import socket - # Web server needs 1 listening socket + typically 5 concurrent client connections + # Web server needs typically 5 concurrent client connections # (browser opens connections for page resources, SSE event stream, and POST # requests for entity control which may linger before closing) - sockets_needed = 6 - socket.consume_sockets(sockets_needed, "web_server")(config) + # The listening socket is registered by web_server_base (shared with captive_portal) + socket.consume_sockets(5, "web_server")(config) return config diff --git a/esphome/components/web_server_base/__init__.py b/esphome/components/web_server_base/__init__.py index 183b907ae6..b587841dfd 100644 --- a/esphome/components/web_server_base/__init__.py +++ b/esphome/components/web_server_base/__init__.py @@ -23,10 +23,27 @@ web_server_base_ns = cg.esphome_ns.namespace("web_server_base") WebServerBase = web_server_base_ns.class_("WebServerBase") CONF_WEB_SERVER_BASE_ID = "web_server_base_id" -CONFIG_SCHEMA = cv.Schema( - { - cv.GenerateID(): cv.declare_id(WebServerBase), - } + + +def _consume_web_server_base_sockets(config): + """Register the shared listening socket for the HTTP server. + + web_server_base is the shared HTTP server used by web_server and captive_portal. + The listening socket is registered here rather than in each consumer. + """ + from esphome.components import socket + + socket.consume_sockets(1, "web_server_base", socket.SocketType.TCP_LISTEN)(config) + return config + + +CONFIG_SCHEMA = cv.All( + cv.Schema( + { + cv.GenerateID(): cv.declare_id(WebServerBase), + } + ), + _consume_web_server_base_sockets, ) diff --git a/esphome/components/wifi/__init__.py b/esphome/components/wifi/__init__.py index 8c1deb6217..b89245b10e 100644 --- a/esphome/components/wifi/__init__.py +++ b/esphome/components/wifi/__init__.py @@ -58,6 +58,7 @@ from esphome.const import ( ) from esphome.core import CORE, CoroPriority, HexInt, coroutine_with_priority import esphome.final_validate as fv +from esphome.types import ConfigType from . import wpa2_eap @@ -269,9 +270,28 @@ def final_validate(config): ) +def _consume_wifi_sockets(config: ConfigType) -> ConfigType: + """Register UDP PCBs used internally by lwIP for DHCP and DNS. + + Only needed on LibreTiny where we directly set MEMP_NUM_UDP_PCB (the raw + PCB pool shared by both application sockets and lwIP internals like DHCP/DNS). + On ESP32, CONFIG_LWIP_MAX_SOCKETS only controls the POSIX socket layer — + DHCP/DNS use raw udp_new() which bypasses it entirely. + """ + if not (CORE.is_bk72xx or CORE.is_rtl87xx or CORE.is_ln882x): + return config + from esphome.components import socket + + # lwIP allocates UDP PCBs for DHCP client and DNS resolver internally. + # These are not application sockets but consume MEMP_NUM_UDP_PCB pool entries. + socket.consume_sockets(2, "wifi.lwip_internal", socket.SocketType.UDP)(config) + return config + + FINAL_VALIDATE_SCHEMA = cv.All( final_validate, validate_variant, + _consume_wifi_sockets, ) diff --git a/tests/components/socket/test_wake_loop_threadsafe.py b/tests/components/socket/test_wake_loop_threadsafe.py index b4bc95176d..a40b6068a8 100644 --- a/tests/components/socket/test_wake_loop_threadsafe.py +++ b/tests/components/socket/test_wake_loop_threadsafe.py @@ -66,12 +66,12 @@ def test_require_wake_loop_threadsafe__no_networking_does_not_consume_socket() - CORE.config = {"logger": {}} # Track initial socket consumer state - initial_consumers = CORE.data.get(socket.KEY_SOCKET_CONSUMERS, {}) + initial_udp = CORE.data.get(socket.KEY_SOCKET_CONSUMERS_UDP, {}) # Call require_wake_loop_threadsafe socket.require_wake_loop_threadsafe() # Verify no socket was consumed - consumers = CORE.data.get(socket.KEY_SOCKET_CONSUMERS, {}) - assert "socket.wake_loop_threadsafe" not in consumers - assert consumers == initial_consumers + udp_consumers = CORE.data.get(socket.KEY_SOCKET_CONSUMERS_UDP, {}) + assert "socket.wake_loop_threadsafe" not in udp_consumers + assert udp_consumers == initial_udp From 263fff0ba2fc5ea7b9c849da88600f17852a86aa Mon Sep 17 00:00:00 2001 From: schrob <83939986+schdro@users.noreply.github.com> Date: Mon, 23 Feb 2026 04:35:00 +0100 Subject: [PATCH 010/147] Move CONF_OUTPUT_POWER into const.py (#14201) --- esphome/components/cc1101/__init__.py | 2 +- esphome/components/wifi/__init__.py | 2 +- esphome/const.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/esphome/components/cc1101/__init__.py b/esphome/components/cc1101/__init__.py index 14b92a18a4..e2e5986daf 100644 --- a/esphome/components/cc1101/__init__.py +++ b/esphome/components/cc1101/__init__.py @@ -9,6 +9,7 @@ from esphome.const import ( CONF_DATA, CONF_FREQUENCY, CONF_ID, + CONF_OUTPUT_POWER, CONF_VALUE, CONF_WAIT_TIME, ) @@ -22,7 +23,6 @@ ns = cg.esphome_ns.namespace("cc1101") CC1101Component = ns.class_("CC1101Component", cg.Component, spi.SPIDevice) # Config keys -CONF_OUTPUT_POWER = "output_power" CONF_RX_ATTENUATION = "rx_attenuation" CONF_DC_BLOCKING_FILTER = "dc_blocking_filter" CONF_IF_FREQUENCY = "if_frequency" diff --git a/esphome/components/wifi/__init__.py b/esphome/components/wifi/__init__.py index b89245b10e..2aa63b87cc 100644 --- a/esphome/components/wifi/__init__.py +++ b/esphome/components/wifi/__init__.py @@ -42,6 +42,7 @@ from esphome.const import ( CONF_ON_CONNECT, CONF_ON_DISCONNECT, CONF_ON_ERROR, + CONF_OUTPUT_POWER, CONF_PASSWORD, CONF_POWER_SAVE_MODE, CONF_PRIORITY, @@ -344,7 +345,6 @@ def _validate(config): return config -CONF_OUTPUT_POWER = "output_power" CONF_PASSIVE_SCAN = "passive_scan" CONFIG_SCHEMA = cv.All( cv.Schema( diff --git a/esphome/const.py b/esphome/const.py index 0179aa129e..ccc9d56dbb 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -748,6 +748,7 @@ CONF_OTA = "ota" CONF_OUTDOOR_TEMPERATURE = "outdoor_temperature" CONF_OUTPUT = "output" CONF_OUTPUT_ID = "output_id" +CONF_OUTPUT_POWER = "output_power" CONF_OUTPUT_SPEAKER = "output_speaker" CONF_OUTPUTS = "outputs" CONF_OVERSAMPLING = "oversampling" From 6e70987451dfce381645e06ec61e87fab745b900 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 21:35:30 -0600 Subject: [PATCH 011/147] [binary_sensor] Conditionally compile filter infrastructure (#14215) --- esphome/components/binary_sensor/__init__.py | 1 + esphome/components/binary_sensor/binary_sensor.cpp | 6 ++++++ esphome/components/binary_sensor/binary_sensor.h | 6 ++++++ esphome/components/binary_sensor/filter.cpp | 5 +++++ esphome/components/binary_sensor/filter.h | 5 +++++ esphome/core/defines.h | 1 + 6 files changed, 24 insertions(+) diff --git a/esphome/components/binary_sensor/__init__.py b/esphome/components/binary_sensor/__init__.py index c38d6b78d3..4500168cb1 100644 --- a/esphome/components/binary_sensor/__init__.py +++ b/esphome/components/binary_sensor/__init__.py @@ -562,6 +562,7 @@ async def setup_binary_sensor_core_(var, config): if inverted := config.get(CONF_INVERTED): cg.add(var.set_inverted(inverted)) if filters_config := config.get(CONF_FILTERS): + cg.add_define("USE_BINARY_SENSOR_FILTER") filters = await cg.build_registry_list(FILTER_REGISTRY, filters_config) cg.add(var.add_filters(filters)) diff --git a/esphome/components/binary_sensor/binary_sensor.cpp b/esphome/components/binary_sensor/binary_sensor.cpp index 7c3b06970d..c4d3a29a1e 100644 --- a/esphome/components/binary_sensor/binary_sensor.cpp +++ b/esphome/components/binary_sensor/binary_sensor.cpp @@ -18,11 +18,15 @@ void log_binary_sensor(const char *tag, const char *prefix, const char *type, Bi } void BinarySensor::publish_state(bool new_state) { +#ifdef USE_BINARY_SENSOR_FILTER if (this->filter_list_ == nullptr) { +#endif this->send_state_internal(new_state); +#ifdef USE_BINARY_SENSOR_FILTER } else { this->filter_list_->input(new_state); } +#endif } void BinarySensor::publish_initial_state(bool new_state) { this->invalidate_state(); @@ -47,6 +51,7 @@ bool BinarySensor::set_new_state(const optional &new_state) { return false; } +#ifdef USE_BINARY_SENSOR_FILTER void BinarySensor::add_filter(Filter *filter) { filter->parent_ = this; if (this->filter_list_ == nullptr) { @@ -63,6 +68,7 @@ void BinarySensor::add_filters(std::initializer_list filters) { this->add_filter(filter); } } +#endif // USE_BINARY_SENSOR_FILTER bool BinarySensor::is_status_binary_sensor() const { return false; } } // namespace esphome::binary_sensor diff --git a/esphome/components/binary_sensor/binary_sensor.h b/esphome/components/binary_sensor/binary_sensor.h index 83c992bfed..4b655e1bd1 100644 --- a/esphome/components/binary_sensor/binary_sensor.h +++ b/esphome/components/binary_sensor/binary_sensor.h @@ -2,7 +2,9 @@ #include "esphome/core/entity_base.h" #include "esphome/core/helpers.h" +#ifdef USE_BINARY_SENSOR_FILTER #include "esphome/components/binary_sensor/filter.h" +#endif #include @@ -45,8 +47,10 @@ class BinarySensor : public StatefulEntityBase, public EntityBase_DeviceCl */ void publish_initial_state(bool new_state); +#ifdef USE_BINARY_SENSOR_FILTER void add_filter(Filter *filter); void add_filters(std::initializer_list filters); +#endif // ========== INTERNAL METHODS ========== // (In most use cases you won't need these) @@ -60,7 +64,9 @@ class BinarySensor : public StatefulEntityBase, public EntityBase_DeviceCl bool state{}; protected: +#ifdef USE_BINARY_SENSOR_FILTER Filter *filter_list_{nullptr}; +#endif bool set_new_state(const optional &new_state) override; }; diff --git a/esphome/components/binary_sensor/filter.cpp b/esphome/components/binary_sensor/filter.cpp index d69671c5bf..25a69c413a 100644 --- a/esphome/components/binary_sensor/filter.cpp +++ b/esphome/components/binary_sensor/filter.cpp @@ -1,3 +1,6 @@ +#include "esphome/core/defines.h" +#ifdef USE_BINARY_SENSOR_FILTER + #include "filter.h" #include "binary_sensor.h" @@ -142,3 +145,5 @@ optional SettleFilter::new_value(bool value) { float SettleFilter::get_setup_priority() const { return setup_priority::HARDWARE; } } // namespace esphome::binary_sensor + +#endif // USE_BINARY_SENSOR_FILTER diff --git a/esphome/components/binary_sensor/filter.h b/esphome/components/binary_sensor/filter.h index 59bc43eeba..2735a32ab0 100644 --- a/esphome/components/binary_sensor/filter.h +++ b/esphome/components/binary_sensor/filter.h @@ -1,5 +1,8 @@ #pragma once +#include "esphome/core/defines.h" +#ifdef USE_BINARY_SENSOR_FILTER + #include "esphome/core/automation.h" #include "esphome/core/component.h" #include "esphome/core/helpers.h" @@ -138,3 +141,5 @@ class SettleFilter : public Filter, public Component { }; } // namespace esphome::binary_sensor + +#endif // USE_BINARY_SENSOR_FILTER diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 1128df94f0..99e80785ec 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -29,6 +29,7 @@ #define USE_ALARM_CONTROL_PANEL #define USE_AREAS #define USE_BINARY_SENSOR +#define USE_BINARY_SENSOR_FILTER #define USE_BUTTON #define USE_CAMERA #define USE_CLIMATE From 93ce582ad30d1059cf59335882a6bd231a93127e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 21:35:51 -0600 Subject: [PATCH 012/147] [sensor] Conditionally compile filter infrastructure (#14214) Co-authored-by: Claude Opus 4.6 --- esphome/components/bme680_bsec/bme680_bsec.h | 1 + esphome/components/haier/hon_climate.h | 1 + esphome/components/kamstrup_kmp/kamstrup_kmp.h | 1 + esphome/components/sensor/__init__.py | 1 + esphome/components/sensor/filter.cpp | 5 +++++ esphome/components/sensor/filter.h | 6 +++++- esphome/components/sensor/sensor.cpp | 6 ++++++ esphome/components/sensor/sensor.h | 8 ++++++++ esphome/components/sound_level/sound_level.h | 1 + esphome/components/wireguard/wireguard.h | 1 + esphome/core/defines.h | 1 + 11 files changed, 31 insertions(+), 1 deletion(-) diff --git a/esphome/components/bme680_bsec/bme680_bsec.h b/esphome/components/bme680_bsec/bme680_bsec.h index ec919f31df..22aa2789e6 100644 --- a/esphome/components/bme680_bsec/bme680_bsec.h +++ b/esphome/components/bme680_bsec/bme680_bsec.h @@ -7,6 +7,7 @@ #include "esphome/core/preferences.h" #include "esphome/core/defines.h" #include +#include #ifdef USE_BSEC #include diff --git a/esphome/components/haier/hon_climate.h b/esphome/components/haier/hon_climate.h index 608d5e7f21..4565ed2981 100644 --- a/esphome/components/haier/hon_climate.h +++ b/esphome/components/haier/hon_climate.h @@ -1,6 +1,7 @@ #pragma once #include +#include #ifdef USE_SENSOR #include "esphome/components/sensor/sensor.h" #endif diff --git a/esphome/components/kamstrup_kmp/kamstrup_kmp.h b/esphome/components/kamstrup_kmp/kamstrup_kmp.h index f84e360132..725cf20abf 100644 --- a/esphome/components/kamstrup_kmp/kamstrup_kmp.h +++ b/esphome/components/kamstrup_kmp/kamstrup_kmp.h @@ -1,5 +1,6 @@ #pragma once +#include #include "esphome/components/sensor/sensor.h" #include "esphome/components/uart/uart.h" #include "esphome/core/component.h" diff --git a/esphome/components/sensor/__init__.py b/esphome/components/sensor/__init__.py index ebbe0fbccc..b0e0c28bda 100644 --- a/esphome/components/sensor/__init__.py +++ b/esphome/components/sensor/__init__.py @@ -903,6 +903,7 @@ async def setup_sensor_core_(var, config): if config[CONF_FORCE_UPDATE]: cg.add(var.set_force_update(True)) if config.get(CONF_FILTERS): # must exist and not be empty + cg.add_define("USE_SENSOR_FILTER") filters = await build_filters(config[CONF_FILTERS]) cg.add(var.set_filters(filters)) diff --git a/esphome/components/sensor/filter.cpp b/esphome/components/sensor/filter.cpp index ea0e2f0d7c..cd4db98457 100644 --- a/esphome/components/sensor/filter.cpp +++ b/esphome/components/sensor/filter.cpp @@ -1,3 +1,6 @@ +#include "esphome/core/defines.h" +#ifdef USE_SENSOR_FILTER + #include "filter.h" #include #include "esphome/core/application.h" @@ -580,3 +583,5 @@ void StreamingMovingAverageFilter::reset_batch() { } } // namespace esphome::sensor + +#endif // USE_SENSOR_FILTER diff --git a/esphome/components/sensor/filter.h b/esphome/components/sensor/filter.h index 573b916a5d..8bfcdb37cf 100644 --- a/esphome/components/sensor/filter.h +++ b/esphome/components/sensor/filter.h @@ -1,6 +1,8 @@ #pragma once -#include +#include "esphome/core/defines.h" +#ifdef USE_SENSOR_FILTER + #include #include #include "esphome/core/automation.h" @@ -638,3 +640,5 @@ class StreamingMovingAverageFilter : public StreamingFilter { }; } // namespace esphome::sensor + +#endif // USE_SENSOR_FILTER diff --git a/esphome/components/sensor/sensor.cpp b/esphome/components/sensor/sensor.cpp index ae2ee3e3d1..a7af6403ef 100644 --- a/esphome/components/sensor/sensor.cpp +++ b/esphome/components/sensor/sensor.cpp @@ -68,11 +68,15 @@ void Sensor::publish_state(float state) { ESP_LOGV(TAG, "'%s': Received new state %f", this->name_.c_str(), state); +#ifdef USE_SENSOR_FILTER if (this->filter_list_ == nullptr) { +#endif this->internal_send_state_to_frontend(state); +#ifdef USE_SENSOR_FILTER } else { this->filter_list_->input(state); } +#endif } void Sensor::add_on_state_callback(std::function &&callback) { this->callback_.add(std::move(callback)); } @@ -80,6 +84,7 @@ void Sensor::add_on_raw_state_callback(std::function &&callback) { this->raw_callback_.add(std::move(callback)); } +#ifdef USE_SENSOR_FILTER void Sensor::add_filter(Filter *filter) { // inefficient, but only happens once on every sensor setup and nobody's going to have massive amounts of // filters @@ -109,6 +114,7 @@ void Sensor::clear_filters() { } this->filter_list_ = nullptr; } +#endif // USE_SENSOR_FILTER float Sensor::get_state() const { return this->state; } float Sensor::get_raw_state() const { return this->raw_state; } diff --git a/esphome/components/sensor/sensor.h b/esphome/components/sensor/sensor.h index 80981b8e28..54e75ee2a1 100644 --- a/esphome/components/sensor/sensor.h +++ b/esphome/components/sensor/sensor.h @@ -4,13 +4,17 @@ #include "esphome/core/entity_base.h" #include "esphome/core/helpers.h" #include "esphome/core/log.h" +#ifdef USE_SENSOR_FILTER #include "esphome/components/sensor/filter.h" +#endif #include #include namespace esphome::sensor { +class Sensor; + void log_sensor(const char *tag, const char *prefix, const char *type, Sensor *obj); #define LOG_SENSOR(prefix, type, obj) log_sensor(TAG, prefix, LOG_STR_LITERAL(type), obj) @@ -67,6 +71,7 @@ class Sensor : public EntityBase, public EntityBase_DeviceClass, public EntityBa /// Set force update mode. void set_force_update(bool force_update) { sensor_flags_.force_update = force_update; } +#ifdef USE_SENSOR_FILTER /// Add a filter to the filter chain. Will be appended to the back. void add_filter(Filter *filter); @@ -87,6 +92,7 @@ class Sensor : public EntityBase, public EntityBase_DeviceClass, public EntityBa /// Clear the entire filter chain. void clear_filters(); +#endif /// Getter-syntax for .state. float get_state() const; @@ -130,7 +136,9 @@ class Sensor : public EntityBase, public EntityBase_DeviceClass, public EntityBa LazyCallbackManager raw_callback_; ///< Storage for raw state callbacks. LazyCallbackManager callback_; ///< Storage for filtered state callbacks. +#ifdef USE_SENSOR_FILTER Filter *filter_list_{nullptr}; ///< Store all active filters. +#endif // Group small members together to avoid padding int8_t accuracy_decimals_{-1}; ///< Accuracy in decimals (-1 = not set) diff --git a/esphome/components/sound_level/sound_level.h b/esphome/components/sound_level/sound_level.h index dc35f69fe2..a1021eb1e8 100644 --- a/esphome/components/sound_level/sound_level.h +++ b/esphome/components/sound_level/sound_level.h @@ -6,6 +6,7 @@ #include "esphome/components/microphone/microphone_source.h" #include "esphome/components/sensor/sensor.h" +#include "esphome/core/automation.h" #include "esphome/core/component.h" #include "esphome/core/ring_buffer.h" diff --git a/esphome/components/wireguard/wireguard.h b/esphome/components/wireguard/wireguard.h index e8470c75cd..c11d592cd1 100644 --- a/esphome/components/wireguard/wireguard.h +++ b/esphome/components/wireguard/wireguard.h @@ -4,6 +4,7 @@ #include #include +#include "esphome/core/automation.h" #include "esphome/core/component.h" #include "esphome/core/helpers.h" #include "esphome/components/time/real_time_clock.h" diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 99e80785ec..ff32edff16 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -112,6 +112,7 @@ #define USE_SAFE_MODE_CALLBACK #define USE_SELECT #define USE_SENSOR +#define USE_SENSOR_FILTER #define USE_SETUP_PRIORITY_OVERRIDE #define USE_STATUS_LED #define USE_STATUS_SENSOR From d239a2400dddfb9854ea5e6c7f476002b6bf22c4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 21:36:21 -0600 Subject: [PATCH 013/147] [text_sensor] Conditionally compile filter infrastructure (#14213) --- esphome/components/text_sensor/__init__.py | 1 + esphome/components/text_sensor/filter.cpp | 5 +++++ esphome/components/text_sensor/filter.h | 5 +++++ esphome/components/text_sensor/text_sensor.cpp | 18 +++++++++++++----- esphome/components/text_sensor/text_sensor.h | 8 ++++++++ esphome/core/defines.h | 1 + 6 files changed, 33 insertions(+), 5 deletions(-) diff --git a/esphome/components/text_sensor/__init__.py b/esphome/components/text_sensor/__init__.py index 0d22400a8e..2e8edb43c9 100644 --- a/esphome/components/text_sensor/__init__.py +++ b/esphome/components/text_sensor/__init__.py @@ -204,6 +204,7 @@ async def setup_text_sensor_core_(var, config): cg.add(var.set_device_class(device_class)) if config.get(CONF_FILTERS): # must exist and not be empty + cg.add_define("USE_TEXT_SENSOR_FILTER") filters = await build_filters(config[CONF_FILTERS]) cg.add(var.set_filters(filters)) diff --git a/esphome/components/text_sensor/filter.cpp b/esphome/components/text_sensor/filter.cpp index 4ee12e8602..f6552c7c66 100644 --- a/esphome/components/text_sensor/filter.cpp +++ b/esphome/components/text_sensor/filter.cpp @@ -1,3 +1,6 @@ +#include "esphome/core/defines.h" +#ifdef USE_TEXT_SENSOR_FILTER + #include "filter.h" #include "text_sensor.h" #include "esphome/core/log.h" @@ -106,3 +109,5 @@ bool MapFilter::new_value(std::string &value) { } // namespace text_sensor } // namespace esphome + +#endif // USE_TEXT_SENSOR_FILTER diff --git a/esphome/components/text_sensor/filter.h b/esphome/components/text_sensor/filter.h index 1922b503ca..f88e8645cc 100644 --- a/esphome/components/text_sensor/filter.h +++ b/esphome/components/text_sensor/filter.h @@ -1,5 +1,8 @@ #pragma once +#include "esphome/core/defines.h" +#ifdef USE_TEXT_SENSOR_FILTER + #include "esphome/core/component.h" #include "esphome/core/helpers.h" @@ -164,3 +167,5 @@ class MapFilter : public Filter { } // namespace text_sensor } // namespace esphome + +#endif // USE_TEXT_SENSOR_FILTER diff --git a/esphome/components/text_sensor/text_sensor.cpp b/esphome/components/text_sensor/text_sensor.cpp index c48bdf4b82..c66d08ec40 100644 --- a/esphome/components/text_sensor/text_sensor.cpp +++ b/esphome/components/text_sensor/text_sensor.cpp @@ -24,7 +24,9 @@ void TextSensor::publish_state(const std::string &state) { this->publish_state(s void TextSensor::publish_state(const char *state) { this->publish_state(state, strlen(state)); } void TextSensor::publish_state(const char *state, size_t len) { +#ifdef USE_TEXT_SENSOR_FILTER if (this->filter_list_ == nullptr) { +#endif // No filters: raw_state == state, store once and use for both callbacks // Only assign if changed to avoid heap allocation if (len != this->state.size() || memcmp(state, this->state.data(), len) != 0) { @@ -33,6 +35,7 @@ void TextSensor::publish_state(const char *state, size_t len) { this->raw_callback_.call(this->state); ESP_LOGV(TAG, "'%s': Received new state %s", this->name_.c_str(), this->state.c_str()); this->notify_frontend_(); +#ifdef USE_TEXT_SENSOR_FILTER } else { // Has filters: need separate raw storage #pragma GCC diagnostic push @@ -46,8 +49,10 @@ void TextSensor::publish_state(const char *state, size_t len) { this->filter_list_->input(this->raw_state); #pragma GCC diagnostic pop } +#endif } +#ifdef USE_TEXT_SENSOR_FILTER void TextSensor::add_filter(Filter *filter) { // inefficient, but only happens once on every sensor setup and nobody's going to have massive amounts of // filters @@ -77,6 +82,7 @@ void TextSensor::clear_filters() { } this->filter_list_ = nullptr; } +#endif // USE_TEXT_SENSOR_FILTER void TextSensor::add_on_state_callback(std::function callback) { this->callback_.add(std::move(callback)); @@ -87,14 +93,16 @@ void TextSensor::add_on_raw_state_callback(std::functionstate; } const std::string &TextSensor::get_raw_state() const { - if (this->filter_list_ == nullptr) { - return this->state; // No filters, raw == filtered - } -// Suppress deprecation warning - get_raw_state() is the replacement API +#ifdef USE_TEXT_SENSOR_FILTER + if (this->filter_list_ != nullptr) { + // Suppress deprecation warning - get_raw_state() is the replacement API #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" - return this->raw_state; + return this->raw_state; #pragma GCC diagnostic pop + } +#endif + return this->state; // No filters, raw == filtered } void TextSensor::internal_send_state_to_frontend(const std::string &state) { this->internal_send_state_to_frontend(state.data(), state.size()); diff --git a/esphome/components/text_sensor/text_sensor.h b/esphome/components/text_sensor/text_sensor.h index 1352a8c1e4..97373dc716 100644 --- a/esphome/components/text_sensor/text_sensor.h +++ b/esphome/components/text_sensor/text_sensor.h @@ -3,7 +3,9 @@ #include "esphome/core/component.h" #include "esphome/core/entity_base.h" #include "esphome/core/helpers.h" +#ifdef USE_TEXT_SENSOR_FILTER #include "esphome/components/text_sensor/filter.h" +#endif #include #include @@ -11,6 +13,8 @@ namespace esphome { namespace text_sensor { +class TextSensor; + void log_text_sensor(const char *tag, const char *prefix, const char *type, TextSensor *obj); #define LOG_TEXT_SENSOR(prefix, type, obj) log_text_sensor(TAG, prefix, LOG_STR_LITERAL(type), obj) @@ -45,6 +49,7 @@ class TextSensor : public EntityBase, public EntityBase_DeviceClass { void publish_state(const char *state); void publish_state(const char *state, size_t len); +#ifdef USE_TEXT_SENSOR_FILTER /// Add a filter to the filter chain. Will be appended to the back. void add_filter(Filter *filter); @@ -56,6 +61,7 @@ class TextSensor : public EntityBase, public EntityBase_DeviceClass { /// Clear the entire filter chain. void clear_filters(); +#endif void add_on_state_callback(std::function callback); /// Add a callback that will be called every time the sensor sends a raw value. @@ -73,7 +79,9 @@ class TextSensor : public EntityBase, public EntityBase_DeviceClass { LazyCallbackManager raw_callback_; ///< Storage for raw state callbacks. LazyCallbackManager callback_; ///< Storage for filtered state callbacks. +#ifdef USE_TEXT_SENSOR_FILTER Filter *filter_list_{nullptr}; ///< Store all active filters. +#endif }; } // namespace text_sensor diff --git a/esphome/core/defines.h b/esphome/core/defines.h index ff32edff16..a1e3d1707f 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -119,6 +119,7 @@ #define USE_SWITCH #define USE_TEXT #define USE_TEXT_SENSOR +#define USE_TEXT_SENSOR_FILTER #define USE_TIME #define USE_TOUCHSCREEN #define USE_UART_DEBUGGER From 5c388a5200b65a9e4470d4f4a681e41c49517915 Mon Sep 17 00:00:00 2001 From: schrob <83939986+schdro@users.noreply.github.com> Date: Mon, 23 Feb 2026 04:39:36 +0100 Subject: [PATCH 014/147] [openthread_info] Optimize: Devirtualize/unify (#14208) --- .../openthread_info_text_sensor.h | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/esphome/components/openthread_info/openthread_info_text_sensor.h b/esphome/components/openthread_info/openthread_info_text_sensor.h index ac5623e0c1..10e83281f0 100644 --- a/esphome/components/openthread_info/openthread_info_text_sensor.h +++ b/esphome/components/openthread_info/openthread_info_text_sensor.h @@ -25,7 +25,7 @@ class OpenThreadInstancePollingComponent : public PollingComponent { virtual void update_instance(otInstance *instance) = 0; }; -class IPAddressOpenThreadInfo : public PollingComponent, public text_sensor::TextSensor { +class IPAddressOpenThreadInfo final : public PollingComponent, public text_sensor::TextSensor { public: void update() override { std::optional address = openthread::global_openthread_component->get_omr_address(); @@ -48,7 +48,7 @@ class IPAddressOpenThreadInfo : public PollingComponent, public text_sensor::Tex std::string last_ip_; }; -class RoleOpenThreadInfo : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { +class RoleOpenThreadInfo final : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { public: void update_instance(otInstance *instance) override { otDeviceRole role = otThreadGetDeviceRole(instance); @@ -64,7 +64,7 @@ class RoleOpenThreadInfo : public OpenThreadInstancePollingComponent, public tex otDeviceRole last_role_; }; -class Rloc16OpenThreadInfo : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { +class Rloc16OpenThreadInfo final : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { public: void update_instance(otInstance *instance) override { uint16_t rloc16 = otThreadGetRloc16(instance); @@ -75,14 +75,13 @@ class Rloc16OpenThreadInfo : public OpenThreadInstancePollingComponent, public t this->publish_state(buf); } } - float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } void dump_config() override; protected: uint16_t last_rloc16_; }; -class ExtAddrOpenThreadInfo : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { +class ExtAddrOpenThreadInfo final : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { public: void update_instance(otInstance *instance) override { const auto *extaddr = otLinkGetExtendedAddress(instance); @@ -93,14 +92,13 @@ class ExtAddrOpenThreadInfo : public OpenThreadInstancePollingComponent, public this->publish_state(buf); } } - float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } void dump_config() override; protected: std::array last_extaddr_{}; }; -class Eui64OpenThreadInfo : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { +class Eui64OpenThreadInfo final : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { public: void update_instance(otInstance *instance) override { otExtAddress addr; @@ -113,14 +111,13 @@ class Eui64OpenThreadInfo : public OpenThreadInstancePollingComponent, public te this->publish_state(buf); } } - float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } void dump_config() override; protected: std::array last_eui64_{}; }; -class ChannelOpenThreadInfo : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { +class ChannelOpenThreadInfo final : public OpenThreadInstancePollingComponent, public text_sensor::TextSensor { public: void update_instance(otInstance *instance) override { uint8_t channel = otLinkGetChannel(instance); @@ -131,7 +128,6 @@ class ChannelOpenThreadInfo : public OpenThreadInstancePollingComponent, public this->publish_state(buf); } } - float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } void dump_config() override; protected: @@ -153,7 +149,7 @@ class DatasetOpenThreadInfo : public OpenThreadInstancePollingComponent { virtual void update_dataset(otOperationalDataset *dataset) = 0; }; -class NetworkNameOpenThreadInfo : public DatasetOpenThreadInfo, public text_sensor::TextSensor { +class NetworkNameOpenThreadInfo final : public DatasetOpenThreadInfo, public text_sensor::TextSensor { public: void update_dataset(otOperationalDataset *dataset) override { if (this->last_network_name_ != dataset->mNetworkName.m8) { @@ -161,14 +157,13 @@ class NetworkNameOpenThreadInfo : public DatasetOpenThreadInfo, public text_sens this->publish_state(this->last_network_name_); } } - float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } void dump_config() override; protected: std::string last_network_name_; }; -class NetworkKeyOpenThreadInfo : public DatasetOpenThreadInfo, public text_sensor::TextSensor { +class NetworkKeyOpenThreadInfo final : public DatasetOpenThreadInfo, public text_sensor::TextSensor { public: void update_dataset(otOperationalDataset *dataset) override { if (!std::equal(this->last_key_.begin(), this->last_key_.end(), dataset->mNetworkKey.m8)) { @@ -178,14 +173,13 @@ class NetworkKeyOpenThreadInfo : public DatasetOpenThreadInfo, public text_senso this->publish_state(buf); } } - float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } void dump_config() override; protected: std::array last_key_{}; }; -class PanIdOpenThreadInfo : public DatasetOpenThreadInfo, public text_sensor::TextSensor { +class PanIdOpenThreadInfo final : public DatasetOpenThreadInfo, public text_sensor::TextSensor { public: void update_dataset(otOperationalDataset *dataset) override { uint16_t panid = dataset->mPanId; @@ -196,14 +190,13 @@ class PanIdOpenThreadInfo : public DatasetOpenThreadInfo, public text_sensor::Te this->publish_state(buf); } } - float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } void dump_config() override; protected: uint16_t last_panid_; }; -class ExtPanIdOpenThreadInfo : public DatasetOpenThreadInfo, public text_sensor::TextSensor { +class ExtPanIdOpenThreadInfo final : public DatasetOpenThreadInfo, public text_sensor::TextSensor { public: void update_dataset(otOperationalDataset *dataset) override { if (!std::equal(this->last_extpanid_.begin(), this->last_extpanid_.end(), dataset->mExtendedPanId.m8)) { @@ -214,7 +207,6 @@ class ExtPanIdOpenThreadInfo : public DatasetOpenThreadInfo, public text_sensor: } } - float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } void dump_config() override; protected: From 680160453355210018b073e0036c256d45a143ce Mon Sep 17 00:00:00 2001 From: schrob <83939986+schdro@users.noreply.github.com> Date: Mon, 23 Feb 2026 04:40:40 +0100 Subject: [PATCH 015/147] [openthread] Add Thread version DEBUG trace (#14196) --- esphome/components/openthread/openthread_esp.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/openthread/openthread_esp.cpp b/esphome/components/openthread/openthread_esp.cpp index ec212d1f68..4f8db0634a 100644 --- a/esphome/components/openthread/openthread_esp.cpp +++ b/esphome/components/openthread/openthread_esp.cpp @@ -104,6 +104,8 @@ void OpenThreadComponent::ot_main() { esp_cli_custom_command_init(); #endif // CONFIG_OPENTHREAD_CLI_ESP_EXTENSION + ESP_LOGD(TAG, "Thread Version: %" PRIu16, otThreadGetVersion()); + otLinkModeConfig link_mode_config{}; #if CONFIG_OPENTHREAD_FTD link_mode_config.mRxOnWhenIdle = true; From ee94bc471541a460c989b51cf317530b7ffa4611 Mon Sep 17 00:00:00 2001 From: schrob <83939986+schdro@users.noreply.github.com> Date: Mon, 23 Feb 2026 04:43:42 +0100 Subject: [PATCH 016/147] [openthread] Refactor to optimize and match code rules (#14156) --- esphome/components/openthread/openthread.cpp | 4 +-- esphome/components/openthread/openthread.h | 10 +++---- .../components/openthread/openthread_esp.cpp | 29 ++++++++++--------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/esphome/components/openthread/openthread.cpp b/esphome/components/openthread/openthread.cpp index 90da17e2d3..d22a14aeae 100644 --- a/esphome/components/openthread/openthread.cpp +++ b/esphome/components/openthread/openthread.cpp @@ -35,9 +35,9 @@ void OpenThreadComponent::dump_config() { #elif CONFIG_OPENTHREAD_MTD ESP_LOGCONFIG(TAG, " Device Type: MTD"); // TBD: Synchronized Sleepy End Device - if (this->poll_period > 0) { + if (this->poll_period_ > 0) { ESP_LOGCONFIG(TAG, " Device is configured as Sleepy End Device (SED)"); - uint32_t duration = this->poll_period / 1000; + uint32_t duration = this->poll_period_ / 1000; ESP_LOGCONFIG(TAG, " Poll Period: %" PRIu32 "s", duration); } else { ESP_LOGCONFIG(TAG, " Device is configured as Minimal End Device (MED)"); diff --git a/esphome/components/openthread/openthread.h b/esphome/components/openthread/openthread.h index 3c60acaadd..9e429f289b 100644 --- a/esphome/components/openthread/openthread.h +++ b/esphome/components/openthread/openthread.h @@ -36,22 +36,22 @@ class OpenThreadComponent : public Component { const char *get_use_address() const; void set_use_address(const char *use_address); #if CONFIG_OPENTHREAD_MTD - void set_poll_period(uint32_t poll_period) { this->poll_period = poll_period; } + void set_poll_period(uint32_t poll_period) { this->poll_period_ = poll_period; } #endif protected: std::optional get_omr_address_(InstanceLock &lock); + std::function factory_reset_external_callback_; +#if CONFIG_OPENTHREAD_MTD + uint32_t poll_period_{0}; +#endif bool teardown_started_{false}; bool teardown_complete_{false}; - std::function factory_reset_external_callback_; private: // Stores a pointer to a string literal (static storage duration). // ONLY set from Python-generated code with string literals - never dynamic strings. const char *use_address_{""}; -#if CONFIG_OPENTHREAD_MTD - uint32_t poll_period{0}; -#endif }; extern OpenThreadComponent *global_openthread_component; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) diff --git a/esphome/components/openthread/openthread_esp.cpp b/esphome/components/openthread/openthread_esp.cpp index 4f8db0634a..bb70701471 100644 --- a/esphome/components/openthread/openthread_esp.cpp +++ b/esphome/components/openthread/openthread_esp.cpp @@ -81,9 +81,11 @@ void OpenThreadComponent::ot_main() { // Initialize the OpenThread stack // otLoggingSetLevel(OT_LOG_LEVEL_DEBG); ESP_ERROR_CHECK(esp_openthread_init(&config)); + // Fetch OT instance once to avoid repeated call into OT stack + otInstance *instance = esp_openthread_get_instance(); #if CONFIG_OPENTHREAD_STATE_INDICATOR_ENABLE - ESP_ERROR_CHECK(esp_openthread_state_indicator_init(esp_openthread_get_instance())); + ESP_ERROR_CHECK(esp_openthread_state_indicator_init(instance)); #endif #if CONFIG_OPENTHREAD_LOG_LEVEL_DYNAMIC @@ -112,28 +114,29 @@ void OpenThreadComponent::ot_main() { link_mode_config.mDeviceType = true; link_mode_config.mNetworkData = true; #elif CONFIG_OPENTHREAD_MTD - if (this->poll_period > 0) { - if (otLinkSetPollPeriod(esp_openthread_get_instance(), this->poll_period) != OT_ERROR_NONE) { - ESP_LOGE(TAG, "Failed to set OpenThread pollperiod."); + if (this->poll_period_ > 0) { + if (otLinkSetPollPeriod(instance, this->poll_period_) != OT_ERROR_NONE) { + ESP_LOGE(TAG, "Failed to set pollperiod"); } - uint32_t link_polling_period = otLinkGetPollPeriod(esp_openthread_get_instance()); - ESP_LOGD(TAG, "Link Polling Period: %" PRIu32, link_polling_period); + ESP_LOGD(TAG, "Link Polling Period: %" PRIu32, otLinkGetPollPeriod(instance)); } - link_mode_config.mRxOnWhenIdle = this->poll_period == 0; + link_mode_config.mRxOnWhenIdle = this->poll_period_ == 0; link_mode_config.mDeviceType = false; link_mode_config.mNetworkData = false; #endif - if (otThreadSetLinkMode(esp_openthread_get_instance(), link_mode_config) != OT_ERROR_NONE) { - ESP_LOGE(TAG, "Failed to set OpenThread linkmode."); + if (otThreadSetLinkMode(instance, link_mode_config) != OT_ERROR_NONE) { + ESP_LOGE(TAG, "Failed to set linkmode"); } - link_mode_config = otThreadGetLinkMode(esp_openthread_get_instance()); +#ifdef ESPHOME_LOG_HAS_DEBUG // Fetch link mode from OT only when DEBUG + link_mode_config = otThreadGetLinkMode(instance); ESP_LOGD(TAG, "Link Mode Device Type: %s\n" "Link Mode Network Data: %s\n" "Link Mode RX On When Idle: %s", - link_mode_config.mDeviceType ? "true" : "false", link_mode_config.mNetworkData ? "true" : "false", - link_mode_config.mRxOnWhenIdle ? "true" : "false"); + TRUEFALSE(link_mode_config.mDeviceType), TRUEFALSE(link_mode_config.mNetworkData), + TRUEFALSE(link_mode_config.mRxOnWhenIdle)); +#endif // Run the main loop #if CONFIG_OPENTHREAD_CLI @@ -144,7 +147,7 @@ void OpenThreadComponent::ot_main() { #ifndef USE_OPENTHREAD_FORCE_DATASET // Check if openthread has a valid dataset from a previous execution - otError error = otDatasetGetActiveTlvs(esp_openthread_get_instance(), &dataset); + otError error = otDatasetGetActiveTlvs(instance, &dataset); if (error != OT_ERROR_NONE) { // Make sure the length is 0 so we fallback to the configuration dataset.mLength = 0; From 417f4535af983e90d5ac2407847a29f15cb4905e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 22:25:20 -0600 Subject: [PATCH 017/147] [logger] Use subtraction-based line number formatting to avoid division (#14219) --- esphome/components/logger/log_buffer.h | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/esphome/components/logger/log_buffer.h b/esphome/components/logger/log_buffer.h index 3d87278248..a56276f732 100644 --- a/esphome/components/logger/log_buffer.h +++ b/esphome/components/logger/log_buffer.h @@ -75,18 +75,13 @@ struct LogBuffer { *p++ = ':'; - // Format line number without modulo operations + // Format line number using subtraction loops (no division - important for ESP8266 which lacks hardware divider) if (line > 999) [[unlikely]] { - int thousands = line / 1000; - *p++ = '0' + thousands; - line -= thousands * 1000; + write_digit(p, line, 1000); } - int hundreds = line / 100; - int remainder = line - hundreds * 100; - int tens = remainder / 10; - *p++ = '0' + hundreds; - *p++ = '0' + tens; - *p++ = '0' + (remainder - tens * 10); + write_digit(p, line, 100); + write_digit(p, line, 10); + *p++ = '0' + line; *p++ = ']'; #if defined(USE_ESP32) || defined(USE_LIBRETINY) || defined(USE_ZEPHYR) || defined(USE_HOST) @@ -162,6 +157,15 @@ struct LogBuffer { this->process_vsnprintf_result_(vsnprintf_P(this->current_(), this->remaining_(), format, args)); } #endif + // Extract one decimal digit via subtraction (no division - important for ESP8266) + static inline void ESPHOME_ALWAYS_INLINE write_digit(char *&p, int &value, int divisor) { + char d = '0'; + while (value >= divisor) { + d++; + value -= divisor; + } + *p++ = d; + } // Write ANSI color escape sequence to buffer, updates pointer in place // Caller is responsible for ensuring buffer has sufficient space void write_ansi_color_(char *&p, uint8_t level) { From fb6c7d81d5b3832c19eb1dd7b61c70a944742d8a Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Mon, 23 Feb 2026 00:08:40 -0500 Subject: [PATCH 018/147] [core] Fix multiline log continuations without leading whitespace (#14217) Co-authored-by: Claude Opus 4.6 --- .../absolute_humidity/absolute_humidity.cpp | 5 +- esphome/components/anova/anova.cpp | 6 +- esphome/components/as3935/as3935.cpp | 6 +- esphome/components/at581x/at581x.cpp | 16 ++--- .../components/binary_sensor/automation.cpp | 6 +- esphome/components/bl0940/bl0940.cpp | 5 +- .../current_based/current_based_cover.cpp | 8 +-- esphome/components/debug/debug_esp32.cpp | 60 ++++++++++--------- esphome/components/debug/debug_esp8266.cpp | 18 +++--- esphome/components/debug/debug_libretiny.cpp | 14 +++-- esphome/components/debug/debug_zephyr.cpp | 42 +++++++------ .../components/dfrobot_sen0395/commands.cpp | 16 ++--- esphome/components/emmeti/emmeti.cpp | 19 ++---- .../components/ens160_base/ens160_base.cpp | 13 ++-- esphome/components/es8388/es8388.cpp | 7 ++- .../esp32_ble_client/ble_client_base.cpp | 6 +- .../update/esp32_hosted_update.cpp | 11 ++-- .../packet_transport/espnow_transport.cpp | 8 +-- .../ethernet/ethernet_component.cpp | 5 +- esphome/components/ezo_pmp/ezo_pmp.cpp | 6 +- esphome/components/gcja5/gcja5.cpp | 8 +-- .../graphical_display_menu.cpp | 14 ++--- .../components/honeywellabp/honeywellabp.cpp | 5 +- .../http_request/ota/ota_http_request.cpp | 3 +- .../components/ina2xx_base/ina2xx_base.cpp | 6 +- esphome/components/ld2410/ld2410.cpp | 7 +-- esphome/components/ld2412/ld2412.cpp | 5 +- esphome/components/ledc/ledc_output.cpp | 6 +- esphome/components/max6956/max6956.cpp | 6 +- .../components/mqtt/mqtt_backend_esp32.cpp | 5 +- .../nextion/nextion_upload_arduino.cpp | 22 ++----- .../nextion/nextion_upload_esp32.cpp | 30 ++-------- .../components/openthread/openthread_esp.cpp | 8 +-- .../components/pi4ioe5v6408/pi4ioe5v6408.cpp | 7 ++- esphome/components/pipsolar/pipsolar.cpp | 3 +- esphome/components/pn532/pn532.cpp | 5 +- esphome/components/pn7150/pn7150.cpp | 15 +++-- esphome/components/pn7160/pn7160.cpp | 16 +++-- esphome/components/qmp6988/qmp6988.cpp | 26 ++++---- .../remote_base/pronto_protocol.cpp | 5 +- esphome/components/safe_mode/safe_mode.cpp | 10 ++-- esphome/components/sim800l/sim800l.cpp | 2 +- esphome/components/sonoff_d1/sonoff_d1.cpp | 10 +--- esphome/components/sun/sun.cpp | 29 ++++----- .../components/usb_host/usb_host_client.cpp | 44 +++++++------- esphome/components/usb_uart/cp210x.cpp | 6 +- .../voice_assistant/voice_assistant.cpp | 4 +- esphome/components/wl_134/wl_134.cpp | 13 ++-- esphome/components/xgzp68xx/xgzp68xx.cpp | 6 +- script/ci-custom.py | 33 ++++++++++ 50 files changed, 291 insertions(+), 345 deletions(-) diff --git a/esphome/components/absolute_humidity/absolute_humidity.cpp b/esphome/components/absolute_humidity/absolute_humidity.cpp index 9c66531d05..40676f8655 100644 --- a/esphome/components/absolute_humidity/absolute_humidity.cpp +++ b/esphome/components/absolute_humidity/absolute_humidity.cpp @@ -92,10 +92,7 @@ void AbsoluteHumidityComponent::loop() { // Calculate absolute humidity const float absolute_humidity = vapor_density(es, hr, temperature_k); - ESP_LOGD(TAG, - "Saturation vapor pressure %f kPa\n" - "Publishing absolute humidity %f g/m³", - es, absolute_humidity); + ESP_LOGD(TAG, "Saturation vapor pressure %f kPa, absolute humidity %f g/m³", es, absolute_humidity); // Publish absolute humidity this->status_clear_warning(); diff --git a/esphome/components/anova/anova.cpp b/esphome/components/anova/anova.cpp index 5054488089..2693224a97 100644 --- a/esphome/components/anova/anova.cpp +++ b/esphome/components/anova/anova.cpp @@ -67,10 +67,8 @@ void Anova::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_ case ESP_GATTC_SEARCH_CMPL_EVT: { auto *chr = this->parent_->get_characteristic(ANOVA_SERVICE_UUID, ANOVA_CHARACTERISTIC_UUID); if (chr == nullptr) { - ESP_LOGW(TAG, - "[%s] No control service found at device, not an Anova..?\n" - "[%s] Note, this component does not currently support Anova Nano.", - this->get_name().c_str(), this->get_name().c_str()); + ESP_LOGW(TAG, "[%s] No control service found at device, not an Anova..?", this->get_name().c_str()); + ESP_LOGW(TAG, "[%s] Note, this component does not currently support Anova Nano.", this->get_name().c_str()); break; } this->char_handle_ = chr->handle; diff --git a/esphome/components/as3935/as3935.cpp b/esphome/components/as3935/as3935.cpp index dd0ab714f7..c4dc0466a0 100644 --- a/esphome/components/as3935/as3935.cpp +++ b/esphome/components/as3935/as3935.cpp @@ -307,9 +307,9 @@ void AS3935Component::tune_antenna() { uint8_t tune_val = this->read_capacitance(); ESP_LOGI(TAG, "Starting antenna tuning\n" - "Division Ratio is set to: %d\n" - "Internal Capacitor is set to: %d\n" - "Displaying oscillator on INT pin. Measure its frequency - multiply value by Division Ratio", + " Division Ratio is set to: %d\n" + " Internal Capacitor is set to: %d\n" + " Displaying oscillator on INT pin. Measure its frequency - multiply value by Division Ratio", div_ratio, tune_val); this->display_oscillator(true, ANTFREQ); } diff --git a/esphome/components/at581x/at581x.cpp b/esphome/components/at581x/at581x.cpp index 6804a7f4b5..728fbe20c6 100644 --- a/esphome/components/at581x/at581x.cpp +++ b/esphome/components/at581x/at581x.cpp @@ -77,14 +77,14 @@ void AT581XComponent::dump_config() { LOG_I2C_DEVICE(this); } bool AT581XComponent::i2c_write_config() { ESP_LOGCONFIG(TAG, "Writing new config for AT581X\n" - "Frequency: %dMHz\n" - "Sensing distance: %d\n" - "Power: %dµA\n" - "Gain: %d\n" - "Trigger base time: %dms\n" - "Trigger keep time: %dms\n" - "Protect time: %dms\n" - "Self check time: %dms", + " Frequency: %dMHz\n" + " Sensing distance: %d\n" + " Power: %dµA\n" + " Gain: %d\n" + " Trigger base time: %dms\n" + " Trigger keep time: %dms\n" + " Protect time: %dms\n" + " Self check time: %dms", this->freq_, this->delta_, this->power_, this->gain_, this->trigger_base_time_ms_, this->trigger_keep_time_ms_, this->protect_time_ms_, this->self_check_time_ms_); diff --git a/esphome/components/binary_sensor/automation.cpp b/esphome/components/binary_sensor/automation.cpp index faebe7e88f..7e43d42357 100644 --- a/esphome/components/binary_sensor/automation.cpp +++ b/esphome/components/binary_sensor/automation.cpp @@ -29,10 +29,8 @@ void MultiClickTrigger::on_state_(bool state) { // Start matching MultiClickTriggerEvent evt = this->timing_[0]; if (evt.state == state) { - ESP_LOGV(TAG, - "START min=%" PRIu32 " max=%" PRIu32 "\n" - "Multi Click: Starting multi click action!", - evt.min_length, evt.max_length); + ESP_LOGV(TAG, "START min=%" PRIu32 " max=%" PRIu32, evt.min_length, evt.max_length); + ESP_LOGV(TAG, "Multi Click: Starting multi click action!"); this->at_index_ = 1; if (this->timing_.size() == 1 && evt.max_length == 4294967294UL) { this->set_timeout(MULTICLICK_TRIGGER_ID, evt.min_length, [this]() { this->trigger_(); }); diff --git a/esphome/components/bl0940/bl0940.cpp b/esphome/components/bl0940/bl0940.cpp index 42e20eb69b..31625ebf6d 100644 --- a/esphome/components/bl0940/bl0940.cpp +++ b/esphome/components/bl0940/bl0940.cpp @@ -182,7 +182,10 @@ void BL0940::recalibrate_() { ESP_LOGD(TAG, "Recalibrated reference values:\n" - "Voltage: %f\n, Current: %f\n, Power: %f\n, Energy: %f\n", + " Voltage: %f\n" + " Current: %f\n" + " Power: %f\n" + " Energy: %f", this->voltage_reference_cal_, this->current_reference_cal_, this->power_reference_cal_, this->energy_reference_cal_); } diff --git a/esphome/components/current_based/current_based_cover.cpp b/esphome/components/current_based/current_based_cover.cpp index 5dfaeeff39..58ae7cbc34 100644 --- a/esphome/components/current_based/current_based_cover.cpp +++ b/esphome/components/current_based/current_based_cover.cpp @@ -148,14 +148,14 @@ void CurrentBasedCover::dump_config() { } ESP_LOGCONFIG(TAG, " Close Duration: %.1fs\n" - "Obstacle Rollback: %.1f%%", + " Obstacle Rollback: %.1f%%", this->close_duration_ / 1e3f, this->obstacle_rollback_ * 100); if (this->max_duration_ != UINT32_MAX) { - ESP_LOGCONFIG(TAG, "Maximum duration: %.1fs", this->max_duration_ / 1e3f); + ESP_LOGCONFIG(TAG, " Maximum duration: %.1fs", this->max_duration_ / 1e3f); } ESP_LOGCONFIG(TAG, - "Start sensing delay: %.1fs\n" - "Malfunction detection: %s", + " Start sensing delay: %.1fs\n" + " Malfunction detection: %s", this->start_sensing_delay_ / 1e3f, YESNO(this->malfunction_detection_)); } diff --git a/esphome/components/debug/debug_esp32.cpp b/esphome/components/debug/debug_esp32.cpp index aad4c7426c..6898621dd0 100644 --- a/esphome/components/debug/debug_esp32.cpp +++ b/esphome/components/debug/debug_esp32.cpp @@ -79,7 +79,6 @@ const char *DebugComponent::get_reset_reason_(std::span } uint32_t flash_size = ESP.getFlashChipSize() / 1024; // NOLINT uint32_t flash_speed = ESP.getFlashChipSpeed() / 1000000; // NOLINT - ESP_LOGD(TAG, "Flash Chip: Size=%" PRIu32 "kB Speed=%" PRIu32 "MHz Mode=%s", flash_size, flash_speed, flash_mode); pos = buf_append_printf(buf, size, pos, "|Flash: %" PRIu32 "kB Speed:%" PRIu32 "MHz Mode:%s", flash_size, flash_speed, flash_mode); #endif @@ -194,39 +191,46 @@ size_t DebugComponent::get_device_info_(std::span if (info.features != 0) { pos = buf_append_printf(buf, size, pos, "%sOther:0x%" PRIx32, first_feature ? "" : ", ", info.features); } - ESP_LOGD(TAG, "Chip: Model=%s, Cores=%u, Revision=%u", model, info.cores, info.revision); pos = buf_append_printf(buf, size, pos, " Cores:%u Revision:%u", info.cores, info.revision); uint32_t cpu_freq_mhz = arch_get_cpu_freq_hz() / 1000000; - ESP_LOGD(TAG, "CPU Frequency: %" PRIu32 " MHz", cpu_freq_mhz); pos = buf_append_printf(buf, size, pos, "|CPU Frequency: %" PRIu32 " MHz", cpu_freq_mhz); - // Framework detection -#ifdef USE_ARDUINO - ESP_LOGD(TAG, "Framework: Arduino"); - pos = buf_append_printf(buf, size, pos, "|Framework: Arduino"); -#elif defined(USE_ESP32) - ESP_LOGD(TAG, "Framework: ESP-IDF"); - pos = buf_append_printf(buf, size, pos, "|Framework: ESP-IDF"); -#else - ESP_LOGW(TAG, "Framework: UNKNOWN"); - pos = buf_append_printf(buf, size, pos, "|Framework: UNKNOWN"); -#endif - - ESP_LOGD(TAG, "ESP-IDF Version: %s", esp_get_idf_version()); - pos = buf_append_printf(buf, size, pos, "|ESP-IDF: %s", esp_get_idf_version()); - - uint8_t mac[6]; - get_mac_address_raw(mac); - ESP_LOGD(TAG, "EFuse MAC: %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); - pos = buf_append_printf(buf, size, pos, "|EFuse MAC: %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], - mac[4], mac[5]); - char reason_buffer[RESET_REASON_BUFFER_SIZE]; const char *reset_reason = get_reset_reason_(std::span(reason_buffer)); - pos = buf_append_printf(buf, size, pos, "|Reset: %s", reset_reason); - const char *wakeup_cause = get_wakeup_cause_(std::span(reason_buffer)); + + uint8_t mac[6]; + get_mac_address_raw(mac); + + ESP_LOGD(TAG, + "ESP32 debug info:\n" + " Chip: %s\n" + " Cores: %u\n" + " Revision: %u\n" + " CPU Frequency: %" PRIu32 " MHz\n" + " ESP-IDF Version: %s\n" + " EFuse MAC: %02X:%02X:%02X:%02X:%02X:%02X\n" + " Reset Reason: %s\n" + " Wakeup Cause: %s", + model, info.cores, info.revision, cpu_freq_mhz, esp_get_idf_version(), mac[0], mac[1], mac[2], mac[3], + mac[4], mac[5], reset_reason, wakeup_cause); +#if defined(USE_ARDUINO) + ESP_LOGD(TAG, " Flash: Size=%" PRIu32 "kB Speed=%" PRIu32 "MHz Mode=%s", flash_size, flash_speed, flash_mode); +#endif + // Framework detection +#ifdef USE_ARDUINO + ESP_LOGD(TAG, " Framework: Arduino"); + pos = buf_append_printf(buf, size, pos, "|Framework: Arduino"); +#else + ESP_LOGD(TAG, " Framework: ESP-IDF"); + pos = buf_append_printf(buf, size, pos, "|Framework: ESP-IDF"); +#endif + + pos = buf_append_printf(buf, size, pos, "|ESP-IDF: %s", esp_get_idf_version()); + pos = buf_append_printf(buf, size, pos, "|EFuse MAC: %02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], + mac[4], mac[5]); + pos = buf_append_printf(buf, size, pos, "|Reset: %s", reset_reason); pos = buf_append_printf(buf, size, pos, "|Wakeup: %s", wakeup_cause); return pos; diff --git a/esphome/components/debug/debug_esp8266.cpp b/esphome/components/debug/debug_esp8266.cpp index 1a07ec4f3a..4df4aaa851 100644 --- a/esphome/components/debug/debug_esp8266.cpp +++ b/esphome/components/debug/debug_esp8266.cpp @@ -128,14 +128,16 @@ size_t DebugComponent::get_device_info_(std::span // NOLINTEND(readability-static-accessed-through-instance) ESP_LOGD(TAG, - "Chip ID: 0x%08" PRIX32 "\n" - "SDK Version: %s\n" - "Core Version: %s\n" - "Boot Version=%u Mode=%u\n" - "CPU Frequency: %u\n" - "Flash Chip ID=0x%08" PRIX32 "\n" - "Reset Reason: %s\n" - "Reset Info: %s", + "ESP8266 debug info:\n" + " Chip ID: 0x%08" PRIX32 "\n" + " SDK Version: %s\n" + " Core Version: %s\n" + " Boot Version: %u\n" + " Boot Mode: %u\n" + " CPU Frequency: %u\n" + " Flash Chip ID: 0x%08" PRIX32 "\n" + " Reset Reason: %s\n" + " Reset Info: %s", chip_id, sdk_version, get_core_version_str(core_version_buffer), boot_version, boot_mode, cpu_freq, flash_chip_id, reset_reason, get_reset_info_str(reset_info_buffer, resetInfo.reason)); diff --git a/esphome/components/debug/debug_libretiny.cpp b/esphome/components/debug/debug_libretiny.cpp index 14bbdb945a..39269d6f2f 100644 --- a/esphome/components/debug/debug_libretiny.cpp +++ b/esphome/components/debug/debug_libretiny.cpp @@ -27,12 +27,14 @@ size_t DebugComponent::get_device_info_(std::span uint32_t mac_id = lt_cpu_get_mac_id(); ESP_LOGD(TAG, - "LibreTiny Version: %s\n" - "Chip: %s (%04x) @ %u MHz\n" - "Chip ID: 0x%06" PRIX32 "\n" - "Board: %s\n" - "Flash: %" PRIu32 " KiB / RAM: %" PRIu32 " KiB\n" - "Reset Reason: %s", + "LibreTiny debug info:\n" + " Version: %s\n" + " Chip: %s (%04x) @ %u MHz\n" + " Chip ID: 0x%06" PRIX32 "\n" + " Board: %s\n" + " Flash: %" PRIu32 " KiB\n" + " RAM: %" PRIu32 " KiB\n" + " Reset Reason: %s", lt_get_version(), lt_cpu_get_model_name(), lt_cpu_get_model(), lt_cpu_get_freq_mhz(), mac_id, lt_get_board_code(), flash_kib, ram_kib, reset_reason); diff --git a/esphome/components/debug/debug_zephyr.cpp b/esphome/components/debug/debug_zephyr.cpp index ecca7150bd..bd6432e949 100644 --- a/esphome/components/debug/debug_zephyr.cpp +++ b/esphome/components/debug/debug_zephyr.cpp @@ -79,13 +79,13 @@ static void fa_cb(const struct flash_area *fa, void *user_data) { void DebugComponent::log_partition_info_() { #if CONFIG_FLASH_MAP_LABELS ESP_LOGCONFIG(TAG, "ID | Device | Device Name " - "| Label | Offset | Size\n" - "--------------------------------------------" + "| Label | Offset | Size"); + ESP_LOGCONFIG(TAG, "--------------------------------------------" "-----------------------------------------------"); #else ESP_LOGCONFIG(TAG, "ID | Device | Device Name " - "| Offset | Size\n" - "-----------------------------------------" + "| Offset | Size"); + ESP_LOGCONFIG(TAG, "-----------------------------------------" "------------------------------"); #endif flash_area_foreach(fa_cb, nullptr); @@ -284,11 +284,12 @@ size_t DebugComponent::get_device_info_(std::span char mac_pretty[MAC_ADDRESS_PRETTY_BUFFER_SIZE]; get_mac_address_pretty_into_buffer(mac_pretty); ESP_LOGD(TAG, - "Code page size: %u, code size: %u, device id: 0x%08x%08x\n" - "Encryption root: 0x%08x%08x%08x%08x, Identity Root: 0x%08x%08x%08x%08x\n" - "Device address type: %s, address: %s\n" - "Part code: nRF%x, version: %c%c%c%c, package: %s\n" - "RAM: %ukB, Flash: %ukB, production test: %sdone", + "nRF debug info:\n" + " Code page size: %u, code size: %u, device id: 0x%08x%08x\n" + " Encryption root: 0x%08x%08x%08x%08x, Identity Root: 0x%08x%08x%08x%08x\n" + " Device address type: %s, address: %s\n" + " Part code: nRF%x, version: %c%c%c%c, package: %s\n" + " RAM: %ukB, Flash: %ukB, production test: %sdone", NRF_FICR->CODEPAGESIZE, NRF_FICR->CODESIZE, NRF_FICR->DEVICEID[1], NRF_FICR->DEVICEID[0], NRF_FICR->ER[0], NRF_FICR->ER[1], NRF_FICR->ER[2], NRF_FICR->ER[3], NRF_FICR->IR[0], NRF_FICR->IR[1], NRF_FICR->IR[2], NRF_FICR->IR[3], (NRF_FICR->DEVICEADDRTYPE & 0x1 ? "Random" : "Public"), mac_pretty, NRF_FICR->INFO.PART, @@ -299,23 +300,22 @@ size_t DebugComponent::get_device_info_(std::span (NRF_UICR->PSELRESET[0] & UICR_PSELRESET_CONNECT_Msk) == UICR_PSELRESET_CONNECT_Connected << UICR_PSELRESET_CONNECT_Pos; ESP_LOGD( - TAG, "GPIO as NFC pins: %s, GPIO as nRESET pin: %s", + TAG, " GPIO as NFC pins: %s, GPIO as nRESET pin: %s", YESNO((NRF_UICR->NFCPINS & UICR_NFCPINS_PROTECT_Msk) == (UICR_NFCPINS_PROTECT_NFC << UICR_NFCPINS_PROTECT_Pos)), YESNO(n_reset_enabled)); if (n_reset_enabled) { uint8_t port = (NRF_UICR->PSELRESET[0] & UICR_PSELRESET_PORT_Msk) >> UICR_PSELRESET_PORT_Pos; uint8_t pin = (NRF_UICR->PSELRESET[0] & UICR_PSELRESET_PIN_Msk) >> UICR_PSELRESET_PIN_Pos; - ESP_LOGD(TAG, "nRESET port P%u.%02u", port, pin); + ESP_LOGD(TAG, " nRESET port P%u.%02u", port, pin); } #ifdef USE_BOOTLOADER_MCUBOOT - ESP_LOGD(TAG, "bootloader: mcuboot"); + ESP_LOGD(TAG, " Bootloader: mcuboot"); #else - ESP_LOGD(TAG, "bootloader: Adafruit, version %u.%u.%u", (BOOTLOADER_VERSION_REGISTER >> 16) & 0xFF, + ESP_LOGD(TAG, " Bootloader: Adafruit, version %u.%u.%u", (BOOTLOADER_VERSION_REGISTER >> 16) & 0xFF, (BOOTLOADER_VERSION_REGISTER >> 8) & 0xFF, BOOTLOADER_VERSION_REGISTER & 0xFF); - ESP_LOGD(TAG, - "MBR bootloader addr 0x%08x, UICR bootloader addr 0x%08x\n" - "MBR param page addr 0x%08x, UICR param page addr 0x%08x", - read_mem_u32(MBR_BOOTLOADER_ADDR), NRF_UICR->NRFFW[0], read_mem_u32(MBR_PARAM_PAGE_ADDR), + ESP_LOGD(TAG, " MBR bootloader addr 0x%08x, UICR bootloader addr 0x%08x", read_mem_u32(MBR_BOOTLOADER_ADDR), + NRF_UICR->NRFFW[0]); + ESP_LOGD(TAG, " MBR param page addr 0x%08x, UICR param page addr 0x%08x", read_mem_u32(MBR_PARAM_PAGE_ADDR), NRF_UICR->NRFFW[1]); if (is_sd_present()) { uint32_t const sd_id = sd_id_get(); @@ -326,7 +326,7 @@ size_t DebugComponent::get_device_info_(std::span ver[1] = (sd_version - ver[0] * 1000000) / 1000; ver[2] = (sd_version - ver[0] * 1000000 - ver[1] * 1000); - ESP_LOGD(TAG, "SoftDevice: S%u %u.%u.%u", sd_id, ver[0], ver[1], ver[2]); + ESP_LOGD(TAG, " SoftDevice: S%u %u.%u.%u", sd_id, ver[0], ver[1], ver[2]); #ifdef USE_SOFTDEVICE_ID #ifdef USE_SOFTDEVICE_VERSION if (USE_SOFTDEVICE_ID != sd_id || USE_SOFTDEVICE_VERSION != ver[0]) { @@ -352,10 +352,8 @@ size_t DebugComponent::get_device_info_(std::span } return res; }; - ESP_LOGD(TAG, - "NRFFW %s\n" - "NRFHW %s", - uicr(NRF_UICR->NRFFW, 13).c_str(), uicr(NRF_UICR->NRFHW, 12).c_str()); + ESP_LOGD(TAG, " NRFFW %s", uicr(NRF_UICR->NRFFW, 13).c_str()); + ESP_LOGD(TAG, " NRFHW %s", uicr(NRF_UICR->NRFHW, 12).c_str()); return pos; } diff --git a/esphome/components/dfrobot_sen0395/commands.cpp b/esphome/components/dfrobot_sen0395/commands.cpp index 2c44c6fba9..0f69c82f39 100644 --- a/esphome/components/dfrobot_sen0395/commands.cpp +++ b/esphome/components/dfrobot_sen0395/commands.cpp @@ -187,18 +187,18 @@ uint8_t DetRangeCfgCommand::on_message(std::string &message) { } else if (message == "Done") { ESP_LOGI(TAG, "Updated detection area config:\n" - "Detection area 1 from %.02fm to %.02fm.", + " Detection area 1 from %.02fm to %.02fm.", this->min1_, this->max1_); if (this->min2_ >= 0 && this->max2_ >= 0) { - ESP_LOGI(TAG, "Detection area 2 from %.02fm to %.02fm.", this->min2_, this->max2_); + ESP_LOGI(TAG, " Detection area 2 from %.02fm to %.02fm.", this->min2_, this->max2_); } if (this->min3_ >= 0 && this->max3_ >= 0) { - ESP_LOGI(TAG, "Detection area 3 from %.02fm to %.02fm.", this->min3_, this->max3_); + ESP_LOGI(TAG, " Detection area 3 from %.02fm to %.02fm.", this->min3_, this->max3_); } if (this->min4_ >= 0 && this->max4_ >= 0) { - ESP_LOGI(TAG, "Detection area 4 from %.02fm to %.02fm.", this->min4_, this->max4_); + ESP_LOGI(TAG, " Detection area 4 from %.02fm to %.02fm.", this->min4_, this->max4_); } - ESP_LOGD(TAG, "Used command: %s", this->cmd_.c_str()); + ESP_LOGD(TAG, " Used command: %s", this->cmd_.c_str()); return 1; // Command done } return 0; // Command not done yet. @@ -222,10 +222,10 @@ uint8_t SetLatencyCommand::on_message(std::string &message) { } else if (message == "Done") { ESP_LOGI(TAG, "Updated output latency config:\n" - "Signal that someone was detected is delayed by %.03f s.\n" - "Signal that nobody is detected anymore is delayed by %.03f s.", + " Signal that someone was detected is delayed by %.03f s.\n" + " Signal that nobody is detected anymore is delayed by %.03f s.", this->delay_after_detection_, this->delay_after_disappear_); - ESP_LOGD(TAG, "Used command: %s", this->cmd_.c_str()); + ESP_LOGD(TAG, " Used command: %s", this->cmd_.c_str()); return 1; // Command done } return 0; // Command not done yet diff --git a/esphome/components/emmeti/emmeti.cpp b/esphome/components/emmeti/emmeti.cpp index 5286f962b8..d3e923cbef 100644 --- a/esphome/components/emmeti/emmeti.cpp +++ b/esphome/components/emmeti/emmeti.cpp @@ -153,10 +153,7 @@ void EmmetiClimate::reverse_add_(T val, size_t len, esphome::remote_base::Remote bool EmmetiClimate::check_checksum_(uint8_t checksum) { uint8_t expected = this->gen_checksum_(); - ESP_LOGV(TAG, - "Expected checksum: %X\n" - "Checksum received: %X", - expected, checksum); + ESP_LOGV(TAG, "Expected checksum: %X, Checksum received: %X", expected, checksum); return checksum == expected; } @@ -266,10 +263,7 @@ bool EmmetiClimate::on_receive(remote_base::RemoteReceiveData data) { } } - ESP_LOGD(TAG, - "Swing: %d\n" - "Sleep: %d", - (curr_state.bitmap >> 1) & 0x01, (curr_state.bitmap >> 2) & 0x01); + ESP_LOGD(TAG, "Swing: %d, Sleep: %d", (curr_state.bitmap >> 1) & 0x01, (curr_state.bitmap >> 2) & 0x01); for (size_t pos = 0; pos < 4; pos++) { if (data.expect_item(EMMETI_BIT_MARK, EMMETI_ONE_SPACE)) { @@ -295,13 +289,8 @@ bool EmmetiClimate::on_receive(remote_base::RemoteReceiveData data) { } } - ESP_LOGD(TAG, - "Turbo: %d\n" - "Light: %d\n" - "Tree: %d\n" - "Blow: %d", - (curr_state.bitmap >> 3) & 0x01, (curr_state.bitmap >> 4) & 0x01, (curr_state.bitmap >> 5) & 0x01, - (curr_state.bitmap >> 6) & 0x01); + ESP_LOGD(TAG, "Turbo: %d, Light: %d, Tree: %d, Blow: %d", (curr_state.bitmap >> 3) & 0x01, + (curr_state.bitmap >> 4) & 0x01, (curr_state.bitmap >> 5) & 0x01, (curr_state.bitmap >> 6) & 0x01); uint16_t control_data = 0; for (size_t pos = 0; pos < 11; pos++) { diff --git a/esphome/components/ens160_base/ens160_base.cpp b/esphome/components/ens160_base/ens160_base.cpp index 785b053f04..e1cee5005c 100644 --- a/esphome/components/ens160_base/ens160_base.cpp +++ b/esphome/components/ens160_base/ens160_base.cpp @@ -152,12 +152,13 @@ void ENS160Component::update() { // verbose status logging ESP_LOGV(TAG, - "Status: ENS160 STATAS bit 0x%x\n" - "Status: ENS160 STATER bit 0x%x\n" - "Status: ENS160 VALIDITY FLAG 0x%02x\n" - "Status: ENS160 NEWDAT bit 0x%x\n" - "Status: ENS160 NEWGPR bit 0x%x", - (ENS160_DATA_STATUS_STATAS & (status_value)) == ENS160_DATA_STATUS_STATAS, + "ENS160 Status Register: 0x%02x\n" + " STATAS bit 0x%x\n" + " STATER bit 0x%x\n" + " VALIDITY FLAG 0x%02x\n" + " NEWDAT bit 0x%x\n" + " NEWGPR bit 0x%x", + status_value, (ENS160_DATA_STATUS_STATAS & (status_value)) == ENS160_DATA_STATUS_STATAS, (ENS160_DATA_STATUS_STATER & (status_value)) == ENS160_DATA_STATUS_STATER, (ENS160_DATA_STATUS_VALIDITY & status_value) >> 2, (ENS160_DATA_STATUS_NEWDAT & (status_value)) == ENS160_DATA_STATUS_NEWDAT, diff --git a/esphome/components/es8388/es8388.cpp b/esphome/components/es8388/es8388.cpp index 9deb29416f..72026a2a84 100644 --- a/esphome/components/es8388/es8388.cpp +++ b/esphome/components/es8388/es8388.cpp @@ -209,9 +209,10 @@ bool ES8388::set_dac_output(DacOutputLine line) { }; ESP_LOGV(TAG, - "Setting ES8388_DACPOWER to 0x%02X\n" - "Setting ES8388_DACCONTROL24 / ES8388_DACCONTROL25 to 0x%02X\n" - "Setting ES8388_DACCONTROL26 / ES8388_DACCONTROL27 to 0x%02X", + "DAC output config:\n" + " DACPOWER: 0x%02X\n" + " DACCONTROL24/25: 0x%02X\n" + " DACCONTROL26/27: 0x%02X", dac_power, reg_out1, reg_out2); ES8388_ERROR_CHECK(this->write_byte(ES8388_DACCONTROL24, reg_out1)); // LOUT1VOL diff --git a/esphome/components/esp32_ble_client/ble_client_base.cpp b/esphome/components/esp32_ble_client/ble_client_base.cpp index 3f0eeeab4a..e6a85c784a 100644 --- a/esphome/components/esp32_ble_client/ble_client_base.cpp +++ b/esphome/components/esp32_ble_client/ble_client_base.cpp @@ -423,10 +423,8 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_ for (auto &svc : this->services_) { char uuid_buf[espbt::UUID_STR_LEN]; svc->uuid.to_str(uuid_buf); - ESP_LOGV(TAG, - "[%d] [%s] Service UUID: %s\n" - "[%d] [%s] start_handle: 0x%x end_handle: 0x%x", - this->connection_index_, this->address_str_, uuid_buf, this->connection_index_, this->address_str_, + ESP_LOGV(TAG, "[%d] [%s] Service UUID: %s", this->connection_index_, this->address_str_, uuid_buf); + ESP_LOGV(TAG, "[%d] [%s] start_handle: 0x%x end_handle: 0x%x", this->connection_index_, this->address_str_, svc->start_handle, svc->end_handle); } #endif diff --git a/esphome/components/esp32_hosted/update/esp32_hosted_update.cpp b/esphome/components/esp32_hosted/update/esp32_hosted_update.cpp index c8e2e879d4..dcd6e643c2 100644 --- a/esphome/components/esp32_hosted/update/esp32_hosted_update.cpp +++ b/esphome/components/esp32_hosted/update/esp32_hosted_update.cpp @@ -106,11 +106,12 @@ void Esp32HostedUpdate::setup() { esp_app_desc_t *app_desc = (esp_app_desc_t *) (this->firmware_data_ + app_desc_offset); if (app_desc->magic_word == ESP_APP_DESC_MAGIC_WORD) { ESP_LOGD(TAG, - "Firmware version: %s\n" - "Project name: %s\n" - "Build date: %s\n" - "Build time: %s\n" - "IDF version: %s", + "ESP32 Hosted firmware:\n" + " Firmware version: %s\n" + " Project name: %s\n" + " Build date: %s\n" + " Build time: %s\n" + " IDF version: %s", app_desc->version, app_desc->project_name, app_desc->date, app_desc->time, app_desc->idf_ver); this->update_info_.latest_version = app_desc->version; if (this->update_info_.latest_version != this->update_info_.current_version) { diff --git a/esphome/components/espnow/packet_transport/espnow_transport.cpp b/esphome/components/espnow/packet_transport/espnow_transport.cpp index 3d16f28c7d..6e4f606466 100644 --- a/esphome/components/espnow/packet_transport/espnow_transport.cpp +++ b/esphome/components/espnow/packet_transport/espnow_transport.cpp @@ -21,11 +21,9 @@ void ESPNowTransport::setup() { return; } - ESP_LOGI(TAG, - "Registering ESP-NOW handlers\n" - "Peer address: %02X:%02X:%02X:%02X:%02X:%02X", - this->peer_address_[0], this->peer_address_[1], this->peer_address_[2], this->peer_address_[3], - this->peer_address_[4], this->peer_address_[5]); + ESP_LOGI(TAG, "Registering ESP-NOW handlers, peer: %02X:%02X:%02X:%02X:%02X:%02X", this->peer_address_[0], + this->peer_address_[1], this->peer_address_[2], this->peer_address_[3], this->peer_address_[4], + this->peer_address_[5]); // Register received handler this->parent_->register_received_handler(this); diff --git a/esphome/components/ethernet/ethernet_component.cpp b/esphome/components/ethernet/ethernet_component.cpp index f9d98ad51b..fcd32223e4 100644 --- a/esphome/components/ethernet/ethernet_component.cpp +++ b/esphome/components/ethernet/ethernet_component.cpp @@ -866,10 +866,7 @@ void EthernetComponent::write_phy_register_(esp_eth_mac_t *mac, PHYRegister regi } #endif - ESP_LOGD(TAG, - "Writing to PHY Register Address: 0x%02" PRIX32 "\n" - "Writing to PHY Register Value: 0x%04" PRIX32, - register_data.address, register_data.value); + ESP_LOGD(TAG, "Writing PHY reg 0x%02" PRIX32 " = 0x%04" PRIX32, register_data.address, register_data.value); err = mac->write_phy_reg(mac, this->phy_addr_, register_data.address, register_data.value); ESPHL_ERROR_CHECK(err, "Writing PHY Register failed"); diff --git a/esphome/components/ezo_pmp/ezo_pmp.cpp b/esphome/components/ezo_pmp/ezo_pmp.cpp index 9d2f4fc687..bf6e3926b8 100644 --- a/esphome/components/ezo_pmp/ezo_pmp.cpp +++ b/esphome/components/ezo_pmp/ezo_pmp.cpp @@ -150,9 +150,9 @@ void EzoPMP::read_command_result_() { if (current_char == '\0') { ESP_LOGV(TAG, "Read Response from device: %s\n" - "First Component: %s\n" - "Second Component: %s\n" - "Third Component: %s", + " First Component: %s\n" + " Second Component: %s\n" + " Third Component: %s", (char *) response_buffer, (char *) first_parameter_buffer, (char *) second_parameter_buffer, (char *) third_parameter_buffer); diff --git a/esphome/components/gcja5/gcja5.cpp b/esphome/components/gcja5/gcja5.cpp index f7f7f8d02c..43b2fa20d3 100644 --- a/esphome/components/gcja5/gcja5.cpp +++ b/esphome/components/gcja5/gcja5.cpp @@ -97,10 +97,10 @@ void GCJA5Component::parse_data_() { ESP_LOGI(TAG, "GCJA5 Status\n" - "Overall Status : %i\n" - "PD Status : %i\n" - "LD Status : %i\n" - "Fan Status : %i", + " Overall Status : %i\n" + " PD Status : %i\n" + " LD Status : %i\n" + " Fan Status : %i", (status >> 6) & 0x03, (status >> 4) & 0x03, (status >> 2) & 0x03, (status >> 0) & 0x03); } } diff --git a/esphome/components/graphical_display_menu/graphical_display_menu.cpp b/esphome/components/graphical_display_menu/graphical_display_menu.cpp index 2b120a746f..cf1672f217 100644 --- a/esphome/components/graphical_display_menu/graphical_display_menu.cpp +++ b/esphome/components/graphical_display_menu/graphical_display_menu.cpp @@ -38,13 +38,13 @@ void GraphicalDisplayMenu::setup() { void GraphicalDisplayMenu::dump_config() { ESP_LOGCONFIG(TAG, "Graphical Display Menu\n" - "Has Display: %s\n" - "Popup Mode: %s\n" - "Advanced Drawing Mode: %s\n" - "Has Font: %s\n" - "Mode: %s\n" - "Active: %s\n" - "Menu items:", + " Has Display: %s\n" + " Popup Mode: %s\n" + " Advanced Drawing Mode: %s\n" + " Has Font: %s\n" + " Mode: %s\n" + " Active: %s\n" + " Menu items:", YESNO(this->display_ != nullptr), YESNO(this->display_ != nullptr), YESNO(this->display_ == nullptr), YESNO(this->font_ != nullptr), this->mode_ == display_menu_base::MENU_MODE_ROTARY ? "Rotary" : "Joystick", YESNO(this->active_)); diff --git a/esphome/components/honeywellabp/honeywellabp.cpp b/esphome/components/honeywellabp/honeywellabp.cpp index c204325dfc..58c5df230f 100644 --- a/esphome/components/honeywellabp/honeywellabp.cpp +++ b/esphome/components/honeywellabp/honeywellabp.cpp @@ -35,10 +35,7 @@ uint8_t HONEYWELLABPSensor::readsensor_() { pressure_count_ = ((uint16_t) (buf_[0]) << 8 & 0x3F00) | ((uint16_t) (buf_[1]) & 0xFF); // 11 - bit temperature is all of byte 2 (lowest 8 bits) and the first three bits of byte 3 temperature_count_ = (((uint16_t) (buf_[2]) << 3) & 0x7F8) | (((uint16_t) (buf_[3]) >> 5) & 0x7); - ESP_LOGV(TAG, - "Sensor pressure_count_ %d\n" - "Sensor temperature_count_ %d", - pressure_count_, temperature_count_); + ESP_LOGV(TAG, "Sensor pressure_count_ %d, temperature_count_ %d", pressure_count_, temperature_count_); } return status_; } diff --git a/esphome/components/http_request/ota/ota_http_request.cpp b/esphome/components/http_request/ota/ota_http_request.cpp index 882def4d7f..d77a768211 100644 --- a/esphome/components/http_request/ota/ota_http_request.cpp +++ b/esphome/components/http_request/ota/ota_http_request.cpp @@ -105,8 +105,7 @@ uint8_t OtaHttpRequestComponent::do_ota_() { // we will compute MD5 on the fly for verification -- Arduino OTA seems to ignore it md5_receive.init(); - ESP_LOGV(TAG, "MD5Digest initialized\n" - "OTA backend begin"); + ESP_LOGV(TAG, "MD5Digest initialized, OTA backend begin"); auto backend = ota::make_ota_backend(); auto error_code = backend->begin(container->content_length); if (error_code != ota::OTA_RESPONSE_OK) { diff --git a/esphome/components/ina2xx_base/ina2xx_base.cpp b/esphome/components/ina2xx_base/ina2xx_base.cpp index de01c99a19..8a20192c1e 100644 --- a/esphome/components/ina2xx_base/ina2xx_base.cpp +++ b/esphome/components/ina2xx_base/ina2xx_base.cpp @@ -362,10 +362,8 @@ bool INA2XX::configure_shunt_() { ESP_LOGW(TAG, "Shunt value too high"); } this->shunt_cal_ &= 0x7FFF; - ESP_LOGV(TAG, - "Given Rshunt=%f Ohm and Max_current=%.3f\n" - "New CURRENT_LSB=%f, SHUNT_CAL=%u", - this->shunt_resistance_ohm_, this->max_current_a_, this->current_lsb_, this->shunt_cal_); + ESP_LOGV(TAG, "Rshunt=%f Ohm, max current=%.3f A, current LSB=%f, shunt cal=%u", this->shunt_resistance_ohm_, + this->max_current_a_, this->current_lsb_, this->shunt_cal_); return this->write_unsigned_16_(RegisterMap::REG_SHUNT_CAL, this->shunt_cal_); } diff --git a/esphome/components/ld2410/ld2410.cpp b/esphome/components/ld2410/ld2410.cpp index f8f782f804..dd1d53857d 100644 --- a/esphome/components/ld2410/ld2410.cpp +++ b/esphome/components/ld2410/ld2410.cpp @@ -489,11 +489,8 @@ bool LD2410Component::handle_ack_data_() { this->out_pin_level_ = this->buffer_data_[12]; const auto *light_function_str = find_str(LIGHT_FUNCTIONS_BY_UINT, this->light_function_); const auto *out_pin_level_str = find_str(OUT_PIN_LEVELS_BY_UINT, this->out_pin_level_); - ESP_LOGV(TAG, - "Light function: %s\n" - "Light threshold: %u\n" - "Out pin level: %s", - light_function_str, this->light_threshold_, out_pin_level_str); + ESP_LOGV(TAG, "Light function: %s, threshold: %u, out pin level: %s", light_function_str, this->light_threshold_, + out_pin_level_str); #ifdef USE_SELECT if (this->light_function_select_ != nullptr) { this->light_function_select_->publish_state(light_function_str); diff --git a/esphome/components/ld2412/ld2412.cpp b/esphome/components/ld2412/ld2412.cpp index 95e19e0d5f..484d5bd281 100644 --- a/esphome/components/ld2412/ld2412.cpp +++ b/esphome/components/ld2412/ld2412.cpp @@ -530,10 +530,7 @@ bool LD2412Component::handle_ack_data_() { this->light_function_ = this->buffer_data_[10]; this->light_threshold_ = this->buffer_data_[11]; const auto *light_function_str = find_str(LIGHT_FUNCTIONS_BY_UINT, this->light_function_); - ESP_LOGV(TAG, - "Light function: %s\n" - "Light threshold: %u", - light_function_str, this->light_threshold_); + ESP_LOGV(TAG, "Light function: %s, threshold: %u", light_function_str, this->light_threshold_); #ifdef USE_SELECT if (this->light_function_select_ != nullptr) { this->light_function_select_->publish_state(light_function_str); diff --git a/esphome/components/ledc/ledc_output.cpp b/esphome/components/ledc/ledc_output.cpp index a203dde115..a01d42ac8b 100644 --- a/esphome/components/ledc/ledc_output.cpp +++ b/esphome/components/ledc/ledc_output.cpp @@ -130,10 +130,8 @@ void LEDCOutput::setup() { } int hpoint = ledc_angle_to_htop(this->phase_angle_, this->bit_depth_); - ESP_LOGV(TAG, - "Configured frequency %f with a bit depth of %u bits\n" - "Angle of %.1f° results in hpoint %u", - this->frequency_, this->bit_depth_, this->phase_angle_, hpoint); + ESP_LOGV(TAG, "Configured frequency %f with bit depth %u, angle %.1f° hpoint %u", this->frequency_, this->bit_depth_, + this->phase_angle_, hpoint); ledc_channel_config_t chan_conf{}; chan_conf.gpio_num = this->pin_->get_pin(); diff --git a/esphome/components/max6956/max6956.cpp b/esphome/components/max6956/max6956.cpp index 6ba17f11d1..a350e66ee0 100644 --- a/esphome/components/max6956/max6956.cpp +++ b/esphome/components/max6956/max6956.cpp @@ -146,11 +146,11 @@ void MAX6956::dump_config() { if (brightness_mode_ == MAX6956CURRENTMODE::GLOBAL) { ESP_LOGCONFIG(TAG, - "current mode: global\n" - "global brightness: %u", + " Current mode: global\n" + " Brightness: %u", global_brightness_); } else { - ESP_LOGCONFIG(TAG, "current mode: segment"); + ESP_LOGCONFIG(TAG, " Current mode: segment"); } } diff --git a/esphome/components/mqtt/mqtt_backend_esp32.cpp b/esphome/components/mqtt/mqtt_backend_esp32.cpp index c12c79499f..8a7fb965e9 100644 --- a/esphome/components/mqtt/mqtt_backend_esp32.cpp +++ b/esphome/components/mqtt/mqtt_backend_esp32.cpp @@ -165,10 +165,7 @@ void MQTTBackendESP32::mqtt_event_handler_(const Event &event) { case MQTT_EVENT_ERROR: ESP_LOGE(TAG, "MQTT_EVENT_ERROR"); if (event.error_handle.error_type == MQTT_ERROR_TYPE_TCP_TRANSPORT) { - ESP_LOGE(TAG, - "Last error code reported from esp-tls: 0x%x\n" - "Last tls stack error number: 0x%x\n" - "Last captured errno : %d (%s)", + ESP_LOGE(TAG, "Last esp-tls error: 0x%x, tls stack error: 0x%x, socket errno: %d (%s)", event.error_handle.esp_tls_last_esp_err, event.error_handle.esp_tls_stack_err, event.error_handle.esp_transport_sock_errno, strerror(event.error_handle.esp_transport_sock_errno)); } else if (event.error_handle.error_type == MQTT_ERROR_TYPE_CONNECTION_REFUSED) { diff --git a/esphome/components/nextion/nextion_upload_arduino.cpp b/esphome/components/nextion/nextion_upload_arduino.cpp index a433eff883..46a04c1b2e 100644 --- a/esphome/components/nextion/nextion_upload_arduino.cpp +++ b/esphome/components/nextion/nextion_upload_arduino.cpp @@ -25,11 +25,7 @@ int Nextion::upload_by_chunks_(HTTPClient &http_client, uint32_t &range_start) { uint32_t range_end = ((upload_first_chunk_sent_ or this->tft_size_ < 4096) ? this->tft_size_ : 4096) - 1; ESP_LOGD(TAG, "Range start: %" PRIu32, range_start); if (range_size <= 0 or range_end <= range_start) { - ESP_LOGE(TAG, "Invalid range"); - ESP_LOGD(TAG, - "Range end: %" PRIu32 "\n" - "Range size: %" PRIu32, - range_end, range_size); + ESP_LOGE(TAG, "Invalid range end: %" PRIu32 ", size: %" PRIu32, range_end, range_size); return -1; } @@ -138,11 +134,7 @@ int Nextion::upload_by_chunks_(HTTPClient &http_client, uint32_t &range_start) { } bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { - ESP_LOGD(TAG, - "TFT upload requested\n" - "Exit reparse: %s\n" - "URL: %s", - YESNO(exit_reparse), this->tft_url_.c_str()); + ESP_LOGD(TAG, "TFT upload requested, exit reparse: %s, URL: %s", YESNO(exit_reparse), this->tft_url_.c_str()); if (this->connection_state_.is_updating_) { ESP_LOGW(TAG, "Upload in progress"); @@ -172,10 +164,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { ESP_LOGD(TAG, "Baud rate: %" PRIu32, baud_rate); // Define the configuration for the HTTP client - ESP_LOGV(TAG, - "Init HTTP client\n" - "Heap: %" PRIu32, - EspClass::getFreeHeap()); + ESP_LOGV(TAG, "Init HTTP client, heap: %" PRIu32, EspClass::getFreeHeap()); HTTPClient http_client; http_client.setTimeout(15000); // Yes 15 seconds.... Helps 8266s along @@ -262,10 +251,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { this->reset_(false); delay(250); // NOLINT - ESP_LOGV(TAG, - "Heap: %" PRIu32 "\n" - "Upload cmd: %s", - EspClass::getFreeHeap(), command); + ESP_LOGV(TAG, "Heap: %" PRIu32 ", upload cmd: %s", EspClass::getFreeHeap(), command); this->send_command_(command); if (baud_rate != this->original_baud_rate_) { diff --git a/esphome/components/nextion/nextion_upload_esp32.cpp b/esphome/components/nextion/nextion_upload_esp32.cpp index 46352afd75..43f59a8d4b 100644 --- a/esphome/components/nextion/nextion_upload_esp32.cpp +++ b/esphome/components/nextion/nextion_upload_esp32.cpp @@ -27,11 +27,7 @@ int Nextion::upload_by_chunks_(esp_http_client_handle_t http_client, uint32_t &r uint32_t range_end = ((upload_first_chunk_sent_ or this->tft_size_ < 4096) ? this->tft_size_ : 4096) - 1; ESP_LOGD(TAG, "Range start: %" PRIu32, range_start); if (range_size <= 0 or range_end <= range_start) { - ESP_LOGD(TAG, - "Range end: %" PRIu32 "\n" - "Range size: %" PRIu32, - range_end, range_size); - ESP_LOGE(TAG, "Invalid range"); + ESP_LOGE(TAG, "Invalid range end: %" PRIu32 ", size: %" PRIu32, range_end, range_size); return -1; } @@ -159,11 +155,7 @@ int Nextion::upload_by_chunks_(esp_http_client_handle_t http_client, uint32_t &r } bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { - ESP_LOGD(TAG, - "TFT upload requested\n" - "Exit reparse: %s\n" - "URL: %s", - YESNO(exit_reparse), this->tft_url_.c_str()); + ESP_LOGD(TAG, "TFT upload requested, exit reparse: %s, URL: %s", YESNO(exit_reparse), this->tft_url_.c_str()); if (this->connection_state_.is_updating_) { ESP_LOGW(TAG, "Upload in progress"); @@ -193,10 +185,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { ESP_LOGD(TAG, "Baud rate: %" PRIu32, baud_rate); // Define the configuration for the HTTP client - ESP_LOGV(TAG, - "Init HTTP client\n" - "Heap: %" PRIu32, - esp_get_free_heap_size()); + ESP_LOGV(TAG, "Init HTTP client, heap: %" PRIu32, esp_get_free_heap_size()); esp_http_client_config_t config = { .url = this->tft_url_.c_str(), .cert_pem = nullptr, @@ -220,10 +209,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { } // Perform the HTTP request - ESP_LOGV(TAG, - "Check connection\n" - "Heap: %" PRIu32, - esp_get_free_heap_size()); + ESP_LOGV(TAG, "Check connection, heap: %" PRIu32, esp_get_free_heap_size()); err = esp_http_client_perform(http_client); if (err != ESP_OK) { ESP_LOGE(TAG, "HTTP failed: %s", esp_err_to_name(err)); @@ -232,10 +218,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { } // Check the HTTP Status Code - ESP_LOGV(TAG, - "Check status\n" - "Heap: %" PRIu32, - esp_get_free_heap_size()); + ESP_LOGV(TAG, "Check status, heap: %" PRIu32, esp_get_free_heap_size()); int status_code = esp_http_client_get_status_code(http_client); if (status_code != 200 && status_code != 206) { ESP_LOGE(TAG, "HTTP request failed with status %d", status_code); @@ -344,8 +327,7 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) { ESP_LOGV(TAG, "Heap: %" PRIu32 " left: %" PRIu32, esp_get_free_heap_size(), this->content_length_); } - ESP_LOGD(TAG, "TFT upload complete\n" - "Close HTTP"); + ESP_LOGD(TAG, "TFT upload complete, closing HTTP"); esp_http_client_close(http_client); esp_http_client_cleanup(http_client); ESP_LOGV(TAG, "Connection closed"); diff --git a/esphome/components/openthread/openthread_esp.cpp b/esphome/components/openthread/openthread_esp.cpp index bb70701471..9dd68a1ccc 100644 --- a/esphome/components/openthread/openthread_esp.cpp +++ b/esphome/components/openthread/openthread_esp.cpp @@ -130,10 +130,7 @@ void OpenThreadComponent::ot_main() { } #ifdef ESPHOME_LOG_HAS_DEBUG // Fetch link mode from OT only when DEBUG link_mode_config = otThreadGetLinkMode(instance); - ESP_LOGD(TAG, - "Link Mode Device Type: %s\n" - "Link Mode Network Data: %s\n" - "Link Mode RX On When Idle: %s", + ESP_LOGD(TAG, "Link Mode Device Type: %s, Network Data: %s, RX On When Idle: %s", TRUEFALSE(link_mode_config.mDeviceType), TRUEFALSE(link_mode_config.mNetworkData), TRUEFALSE(link_mode_config.mRxOnWhenIdle)); #endif @@ -152,8 +149,7 @@ void OpenThreadComponent::ot_main() { // Make sure the length is 0 so we fallback to the configuration dataset.mLength = 0; } else { - ESP_LOGI(TAG, "Found OpenThread-managed dataset, ignoring esphome configuration\n" - "(set force_dataset: true to override)"); + ESP_LOGI(TAG, "Found existing dataset, ignoring config (force_dataset: true to override)"); } #endif diff --git a/esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp b/esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp index fdff11dedb..9247e114f0 100644 --- a/esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +++ b/esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp @@ -144,9 +144,10 @@ bool PI4IOE5V6408Component::write_gpio_modes_() { } #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE ESP_LOGV(TAG, - "Wrote GPIO modes: 0b" BYTE_TO_BINARY_PATTERN "\n" - "Wrote GPIO pullup/pulldown: 0b" BYTE_TO_BINARY_PATTERN "\n" - "Wrote GPIO pull enable: 0b" BYTE_TO_BINARY_PATTERN, + "Wrote GPIO config:\n" + " modes: 0b" BYTE_TO_BINARY_PATTERN "\n" + " pullup/pulldown: 0b" BYTE_TO_BINARY_PATTERN "\n" + " pull enable: 0b" BYTE_TO_BINARY_PATTERN, BYTE_TO_BINARY(this->mode_mask_), BYTE_TO_BINARY(this->pull_up_down_mask_), BYTE_TO_BINARY(this->pull_enable_mask_)); #endif diff --git a/esphome/components/pipsolar/pipsolar.cpp b/esphome/components/pipsolar/pipsolar.cpp index e6831ad19e..f95bf4aedb 100644 --- a/esphome/components/pipsolar/pipsolar.cpp +++ b/esphome/components/pipsolar/pipsolar.cpp @@ -748,8 +748,7 @@ esphome::optional Pipsolar::get_bit_(std::string bits, uint8_t bit_pos) { } void Pipsolar::dump_config() { - ESP_LOGCONFIG(TAG, "Pipsolar:\n" - "enabled polling commands:"); + ESP_LOGCONFIG(TAG, "Pipsolar enabled polling commands:"); for (auto &enabled_polling_command : this->enabled_polling_commands_) { if (enabled_polling_command.length != 0) { ESP_LOGCONFIG(TAG, "%s", enabled_polling_command.command); diff --git a/esphome/components/pn532/pn532.cpp b/esphome/components/pn532/pn532.cpp index 5366aab54e..1ab0da3df7 100644 --- a/esphome/components/pn532/pn532.cpp +++ b/esphome/components/pn532/pn532.cpp @@ -31,10 +31,7 @@ void PN532::setup() { this->mark_failed(); return; } - ESP_LOGD(TAG, - "Found chip PN5%02X\n" - "Firmware ver. %d.%d", - version_data[0], version_data[1], version_data[2]); + ESP_LOGD(TAG, "Found chip PN5%02X, Firmware v%d.%d", version_data[0], version_data[1], version_data[2]); if (!this->write_command_({ PN532_COMMAND_SAMCONFIGURATION, diff --git a/esphome/components/pn7150/pn7150.cpp b/esphome/components/pn7150/pn7150.cpp index 7bec1e08a9..8c76c8b88c 100644 --- a/esphome/components/pn7150/pn7150.cpp +++ b/esphome/components/pn7150/pn7150.cpp @@ -243,9 +243,7 @@ uint8_t PN7150::reset_core_(const bool reset_config, const bool power) { return nfc::STATUS_FAILED; } - ESP_LOGD(TAG, - "Configuration %s\n" - "NCI version: %s", + ESP_LOGD(TAG, "Configuration %s, NCI version: %s", rx.get_message()[nfc::NCI_PKT_PAYLOAD_OFFSET + 2] ? "reset" : "retained", rx.get_message()[nfc::NCI_PKT_PAYLOAD_OFFSET + 1] == 0x20 ? "2.0" : "1.0"); @@ -274,11 +272,12 @@ uint8_t PN7150::init_core_() { uint8_t flash_minor_version = rx.get_message()[19 + rx.get_message()[8]]; ESP_LOGD(TAG, - "Manufacturer ID: 0x%02X\n" - "Hardware version: 0x%02X\n" - "ROM code version: 0x%02X\n" - "FLASH major version: 0x%02X\n" - "FLASH minor version: 0x%02X", + "PN7150 chip info:\n" + " Manufacturer ID: 0x%02X\n" + " Hardware version: 0x%02X\n" + " ROM code version: 0x%02X\n" + " FLASH major version: 0x%02X\n" + " FLASH minor version: 0x%02X", manf_id, hw_version, rom_code_version, flash_major_version, flash_minor_version); return rx.get_simple_status_response(); diff --git a/esphome/components/pn7160/pn7160.cpp b/esphome/components/pn7160/pn7160.cpp index 28907b8e30..3fcd1221a7 100644 --- a/esphome/components/pn7160/pn7160.cpp +++ b/esphome/components/pn7160/pn7160.cpp @@ -265,10 +265,7 @@ uint8_t PN7160::reset_core_(const bool reset_config, const bool power) { return nfc::STATUS_FAILED; } - ESP_LOGD(TAG, - "Configuration %s\n" - "NCI version: %s\n" - "Manufacturer ID: 0x%02X", + ESP_LOGD(TAG, "Configuration %s, NCI version: %s, Manufacturer ID: 0x%02X", rx.get_message()[4] ? "reset" : "retained", rx.get_message()[5] == 0x20 ? "2.0" : "1.0", rx.get_message()[6]); rx.get_message().erase(rx.get_message().begin(), rx.get_message().begin() + 8); @@ -301,11 +298,12 @@ uint8_t PN7160::init_core_() { char feat_buf[nfc::FORMAT_BYTES_BUFFER_SIZE]; ESP_LOGD(TAG, - "Hardware version: %u\n" - "ROM code version: %u\n" - "FLASH major version: %u\n" - "FLASH minor version: %u\n" - "Features: %s", + "PN7160 chip info:\n" + " Hardware version: %u\n" + " ROM code version: %u\n" + " FLASH major version: %u\n" + " FLASH minor version: %u\n" + " Features: %s", hw_version, rom_code_version, flash_major_version, flash_minor_version, nfc::format_bytes_to(feat_buf, features)); diff --git a/esphome/components/qmp6988/qmp6988.cpp b/esphome/components/qmp6988/qmp6988.cpp index 4e1ef27d5e..24fe34e785 100644 --- a/esphome/components/qmp6988/qmp6988.cpp +++ b/esphome/components/qmp6988/qmp6988.cpp @@ -128,15 +128,14 @@ bool QMP6988Component::get_calibration_data_() { qmp6988_data_.qmp6988_cali.COE_bp3 = (int16_t) encode_uint16(a_data_uint8_tr[16], a_data_uint8_tr[17]); ESP_LOGV(TAG, - "<-----------calibration data-------------->\n" - "COE_a0[%d] COE_a1[%d] COE_a2[%d] COE_b00[%d]", + "Calibration data:\n" + " COE_a0[%d] COE_a1[%d] COE_a2[%d] COE_b00[%d]\n" + " COE_bt1[%d] COE_bt2[%d] COE_bp1[%d] COE_b11[%d]\n" + " COE_bp2[%d] COE_b12[%d] COE_b21[%d] COE_bp3[%d]", qmp6988_data_.qmp6988_cali.COE_a0, qmp6988_data_.qmp6988_cali.COE_a1, qmp6988_data_.qmp6988_cali.COE_a2, - qmp6988_data_.qmp6988_cali.COE_b00); - ESP_LOGV(TAG, "COE_bt1[%d] COE_bt2[%d] COE_bp1[%d] COE_b11[%d]\r\n", qmp6988_data_.qmp6988_cali.COE_bt1, - qmp6988_data_.qmp6988_cali.COE_bt2, qmp6988_data_.qmp6988_cali.COE_bp1, qmp6988_data_.qmp6988_cali.COE_b11); - ESP_LOGV(TAG, "COE_bp2[%d] COE_b12[%d] COE_b21[%d] COE_bp3[%d]\r\n", qmp6988_data_.qmp6988_cali.COE_bp2, + qmp6988_data_.qmp6988_cali.COE_b00, qmp6988_data_.qmp6988_cali.COE_bt1, qmp6988_data_.qmp6988_cali.COE_bt2, + qmp6988_data_.qmp6988_cali.COE_bp1, qmp6988_data_.qmp6988_cali.COE_b11, qmp6988_data_.qmp6988_cali.COE_bp2, qmp6988_data_.qmp6988_cali.COE_b12, qmp6988_data_.qmp6988_cali.COE_b21, qmp6988_data_.qmp6988_cali.COE_bp3); - ESP_LOGV(TAG, "<-----------calibration data-------------->\r\n"); qmp6988_data_.ik.a0 = qmp6988_data_.qmp6988_cali.COE_a0; // 20Q4 qmp6988_data_.ik.b00 = qmp6988_data_.qmp6988_cali.COE_b00; // 20Q4 @@ -153,14 +152,13 @@ bool QMP6988Component::get_calibration_data_() { qmp6988_data_.ik.b21 = 13836L * (int64_t) qmp6988_data_.qmp6988_cali.COE_b21 + 79333336L; // 29Q60 qmp6988_data_.ik.bp3 = 2915L * (int64_t) qmp6988_data_.qmp6988_cali.COE_bp3 + 157155561L; // 28Q65 ESP_LOGV(TAG, - "<----------- int calibration data -------------->\n" - "a0[%d] a1[%d] a2[%d] b00[%d]", - qmp6988_data_.ik.a0, qmp6988_data_.ik.a1, qmp6988_data_.ik.a2, qmp6988_data_.ik.b00); - ESP_LOGV(TAG, "bt1[%lld] bt2[%lld] bp1[%lld] b11[%lld]\r\n", qmp6988_data_.ik.bt1, qmp6988_data_.ik.bt2, - qmp6988_data_.ik.bp1, qmp6988_data_.ik.b11); - ESP_LOGV(TAG, "bp2[%lld] b12[%lld] b21[%lld] bp3[%lld]\r\n", qmp6988_data_.ik.bp2, qmp6988_data_.ik.b12, + "Int calibration data:\n" + " a0[%d] a1[%d] a2[%d] b00[%d]\n" + " bt1[%lld] bt2[%lld] bp1[%lld] b11[%lld]\n" + " bp2[%lld] b12[%lld] b21[%lld] bp3[%lld]", + qmp6988_data_.ik.a0, qmp6988_data_.ik.a1, qmp6988_data_.ik.a2, qmp6988_data_.ik.b00, qmp6988_data_.ik.bt1, + qmp6988_data_.ik.bt2, qmp6988_data_.ik.bp1, qmp6988_data_.ik.b11, qmp6988_data_.ik.bp2, qmp6988_data_.ik.b12, qmp6988_data_.ik.b21, qmp6988_data_.ik.bp3); - ESP_LOGV(TAG, "<----------- int calibration data -------------->\r\n"); return true; } diff --git a/esphome/components/remote_base/pronto_protocol.cpp b/esphome/components/remote_base/pronto_protocol.cpp index cff3145199..43029cbc2f 100644 --- a/esphome/components/remote_base/pronto_protocol.cpp +++ b/esphome/components/remote_base/pronto_protocol.cpp @@ -104,10 +104,7 @@ void ProntoProtocol::send_pronto_(RemoteTransmitData *dst, const std::vectorlabel); + ESP_LOGW(TAG, "OTA rollback detected! Rolled back from partition '%s'", last_invalid->label); + ESP_LOGW(TAG, "The device reset before the boot was marked successful"); if (esp_reset_reason() == ESP_RST_BROWNOUT) { - ESP_LOGW(TAG, "Last reset was due to brownout - check your power supply!\n" - "See https://esphome.io/guides/faq.html#brownout-detector-was-triggered"); + ESP_LOGW(TAG, "Last reset was due to brownout - check your power supply!"); + ESP_LOGW(TAG, "See https://esphome.io/guides/faq.html#brownout-detector-was-triggered"); } } #endif diff --git a/esphome/components/sim800l/sim800l.cpp b/esphome/components/sim800l/sim800l.cpp index 251e18648b..2115c72cef 100644 --- a/esphome/components/sim800l/sim800l.cpp +++ b/esphome/components/sim800l/sim800l.cpp @@ -326,7 +326,7 @@ void Sim800LComponent::parse_cmd_(std::string message) { if (ok || message.compare(0, 6, "+CMGL:") == 0) { ESP_LOGD(TAG, "Received SMS from: %s\n" - "%s", + " %s", this->sender_.c_str(), this->message_.c_str()); this->sms_received_callback_.call(this->message_, this->sender_); this->state_ = STATE_RECEIVED_SMS; diff --git a/esphome/components/sonoff_d1/sonoff_d1.cpp b/esphome/components/sonoff_d1/sonoff_d1.cpp index 7b99086546..03586b6398 100644 --- a/esphome/components/sonoff_d1/sonoff_d1.cpp +++ b/esphome/components/sonoff_d1/sonoff_d1.cpp @@ -93,10 +93,7 @@ bool SonoffD1Output::read_command_(uint8_t *cmd, size_t &len) { if (this->read_array(cmd, 6)) { #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE char hex_buf[format_hex_pretty_size(6)]; - ESP_LOGV(TAG, - "[%04d] Reading from dimmer:\n" - "[%04d] %s", - this->write_count_, this->write_count_, format_hex_pretty_to(hex_buf, cmd, 6)); + ESP_LOGV(TAG, "[%04d] Reading from dimmer: %s", this->write_count_, format_hex_pretty_to(hex_buf, cmd, 6)); #endif if (cmd[0] != 0xAA || cmd[1] != 0x55) { @@ -190,10 +187,7 @@ bool SonoffD1Output::write_command_(uint8_t *cmd, const size_t len, bool needs_a do { #if ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_VERBOSE char hex_buf[format_hex_pretty_size(SONOFF_D1_MAX_CMD_SIZE)]; - ESP_LOGV(TAG, - "[%04d] Writing to the dimmer:\n" - "[%04d] %s", - this->write_count_, this->write_count_, format_hex_pretty_to(hex_buf, cmd, len)); + ESP_LOGV(TAG, "[%04d] Writing to the dimmer: %s", this->write_count_, format_hex_pretty_to(hex_buf, cmd, len)); #endif this->write_array(cmd, len); this->write_count_++; diff --git a/esphome/components/sun/sun.cpp b/esphome/components/sun/sun.cpp index e8fc4e44d1..d55a14f192 100644 --- a/esphome/components/sun/sun.cpp +++ b/esphome/components/sun/sun.cpp @@ -174,20 +174,21 @@ struct SunAtTime { // debug output like in example 25.a, p. 165 auto eq = equatorial_coordinate(); ESP_LOGV(TAG, - "jde: %f\n" - "T: %f\n" - "L_0: %f\n" - "M: %f\n" - "e: %f\n" - "C: %f\n" - "Odot: %f\n" - "Omega: %f\n" - "lambda: %f\n" - "epsilon_0: %f\n" - "epsilon: %f\n" - "v: %f\n" - "right_ascension: %f\n" - "declination: %f", + "Sun position:\n" + " jde: %f\n" + " T: %f\n" + " L_0: %f\n" + " M: %f\n" + " e: %f\n" + " C: %f\n" + " Odot: %f\n" + " Omega: %f\n" + " lambda: %f\n" + " epsilon_0: %f\n" + " epsilon: %f\n" + " v: %f\n" + " right_ascension: %f\n" + " declination: %f", jde, t, mean_longitude(), mean_anomaly(), eccentricity(), equation_of_center(), true_longitude(), omega(), apparent_longitude(), mean_obliquity(), true_obliquity(), true_anomaly(), eq.right_ascension, eq.declination); diff --git a/esphome/components/usb_host/usb_host_client.cpp b/esphome/components/usb_host/usb_host_client.cpp index a9be38fb03..422d74095c 100644 --- a/esphome/components/usb_host/usb_host_client.cpp +++ b/esphome/components/usb_host/usb_host_client.cpp @@ -70,14 +70,14 @@ static void usbh_print_intf_desc(const usb_intf_desc_t *intf_desc) { static void usbh_print_cfg_desc(const usb_config_desc_t *cfg_desc) { ESP_LOGV(TAG, "*** Configuration descriptor ***\n" - "bLength %d\n" - "bDescriptorType %d\n" - "wTotalLength %d\n" - "bNumInterfaces %d\n" - "bConfigurationValue %d\n" - "iConfiguration %d\n" - "bmAttributes 0x%x\n" - "bMaxPower %dmA", + " bLength %d\n" + " bDescriptorType %d\n" + " wTotalLength %d\n" + " bNumInterfaces %d\n" + " bConfigurationValue %d\n" + " iConfiguration %d\n" + " bmAttributes 0x%x\n" + " bMaxPower %dmA", cfg_desc->bLength, cfg_desc->bDescriptorType, cfg_desc->wTotalLength, cfg_desc->bNumInterfaces, cfg_desc->bConfigurationValue, cfg_desc->iConfiguration, cfg_desc->bmAttributes, cfg_desc->bMaxPower * 2); } @@ -89,20 +89,20 @@ static void usb_client_print_device_descriptor(const usb_device_desc_t *devc_des ESP_LOGV(TAG, "*** Device descriptor ***\n" - "bLength %d\n" - "bDescriptorType %d\n" - "bcdUSB %d.%d0\n" - "bDeviceClass 0x%x\n" - "bDeviceSubClass 0x%x\n" - "bDeviceProtocol 0x%x\n" - "bMaxPacketSize0 %d\n" - "idVendor 0x%x\n" - "idProduct 0x%x\n" - "bcdDevice %d.%d0\n" - "iManufacturer %d\n" - "iProduct %d\n" - "iSerialNumber %d\n" - "bNumConfigurations %d", + " bLength %d\n" + " bDescriptorType %d\n" + " bcdUSB %d.%d0\n" + " bDeviceClass 0x%x\n" + " bDeviceSubClass 0x%x\n" + " bDeviceProtocol 0x%x\n" + " bMaxPacketSize0 %d\n" + " idVendor 0x%x\n" + " idProduct 0x%x\n" + " bcdDevice %d.%d0\n" + " iManufacturer %d\n" + " iProduct %d\n" + " iSerialNumber %d\n" + " bNumConfigurations %d", devc_desc->bLength, devc_desc->bDescriptorType, ((devc_desc->bcdUSB >> 8) & 0xF), ((devc_desc->bcdUSB >> 4) & 0xF), devc_desc->bDeviceClass, devc_desc->bDeviceSubClass, devc_desc->bDeviceProtocol, devc_desc->bMaxPacketSize0, devc_desc->idVendor, devc_desc->idProduct, diff --git a/esphome/components/usb_uart/cp210x.cpp b/esphome/components/usb_uart/cp210x.cpp index 483286560a..fa8c2331b2 100644 --- a/esphome/components/usb_uart/cp210x.cpp +++ b/esphome/components/usb_uart/cp210x.cpp @@ -58,10 +58,8 @@ std::vector USBUartTypeCP210X::parse_descriptors(usb_device_handle_t dev ESP_LOGE(TAG, "get_active_config_descriptor failed"); return {}; } - ESP_LOGD(TAG, - "bDeviceClass: %u, bDeviceSubClass: %u\n" - "bNumInterfaces: %u", - device_desc->bDeviceClass, device_desc->bDeviceSubClass, config_desc->bNumInterfaces); + ESP_LOGD(TAG, "bDeviceClass: %u, bDeviceSubClass: %u, bNumInterfaces: %u", device_desc->bDeviceClass, + device_desc->bDeviceSubClass, config_desc->bNumInterfaces); if (device_desc->bDeviceClass != 0) { ESP_LOGE(TAG, "bDeviceClass != 0"); return {}; diff --git a/esphome/components/voice_assistant/voice_assistant.cpp b/esphome/components/voice_assistant/voice_assistant.cpp index 641d4d6ff8..d6cbfd4b21 100644 --- a/esphome/components/voice_assistant/voice_assistant.cpp +++ b/esphome/components/voice_assistant/voice_assistant.cpp @@ -434,8 +434,8 @@ void VoiceAssistant::client_subscription(api::APIConnection *client, bool subscr char new_peername[socket::SOCKADDR_STR_LEN]; ESP_LOGE(TAG, "Multiple API Clients attempting to connect to Voice Assistant\n" - "Current client: %s (%s)\n" - "New client: %s (%s)", + " Current client: %s (%s)\n" + " New client: %s (%s)", this->api_client_->get_name(), this->api_client_->get_peername_to(current_peername), client->get_name(), client->get_peername_to(new_peername)); return; diff --git a/esphome/components/wl_134/wl_134.cpp b/esphome/components/wl_134/wl_134.cpp index a589f71c84..a902adfddd 100644 --- a/esphome/components/wl_134/wl_134.cpp +++ b/esphome/components/wl_134/wl_134.cpp @@ -70,12 +70,13 @@ Wl134Component::Rfid134Error Wl134Component::read_packet_() { RFID134_PACKET_CHECKSUM - RFID134_PACKET_RESERVED1); ESP_LOGV(TAG, - "Tag id: %012lld\n" - "Country: %03d\n" - "isData: %s\n" - "isAnimal: %s\n" - "Reserved0: %d\n" - "Reserved1: %" PRId32, + "RFID134 Tag:\n" + " Tag id: %012lld\n" + " Country: %03d\n" + " isData: %s\n" + " isAnimal: %s\n" + " Reserved0: %d\n" + " Reserved1: %" PRId32, reading.id, reading.country, reading.isData ? "true" : "false", reading.isAnimal ? "true" : "false", reading.reserved0, reading.reserved1); diff --git a/esphome/components/xgzp68xx/xgzp68xx.cpp b/esphome/components/xgzp68xx/xgzp68xx.cpp index b5b786c105..5e816469ac 100644 --- a/esphome/components/xgzp68xx/xgzp68xx.cpp +++ b/esphome/components/xgzp68xx/xgzp68xx.cpp @@ -72,10 +72,8 @@ void XGZP68XXComponent::update() { temperature_raw = encode_uint16(data[3], data[4]); // Convert the pressure data to hPa - ESP_LOGV(TAG, - "Got raw pressure=%" PRIu32 ", raw temperature=%u\n" - "K value is %u", - pressure_raw, temperature_raw, this->k_value_); + ESP_LOGV(TAG, "Got raw pressure=%" PRIu32 ", raw temperature=%u, K value=%u", pressure_raw, temperature_raw, + this->k_value_); // Sign extend the pressure float pressure_in_pa = (float) (((int32_t) pressure_raw << 8) >> 8); diff --git a/script/ci-custom.py b/script/ci-custom.py index df819e0f04..85a446ba0d 100755 --- a/script/ci-custom.py +++ b/script/ci-custom.py @@ -841,6 +841,39 @@ def lint_no_scanf(fname, match): ) +LOG_MULTILINE_RE = re.compile(r"ESP_LOG\w+\s*\(.*?;", re.DOTALL) +LOG_BAD_CONTINUATION_RE = re.compile(r'\\n(?:[^ \\"\r\n\t]|"\s*\n\s*"[^ \\])') +LOG_PERCENT_S_CONTINUATION_RE = re.compile(r'\\n(?:%s|"\s*\n\s*"%s)') + + +@lint_content_check(include=cpp_include) +def lint_log_multiline_continuation(fname, content): + errs = [] + for log_match in LOG_MULTILINE_RE.finditer(content): + log_text = log_match.group(0) + for bad_match in LOG_BAD_CONTINUATION_RE.finditer(log_text): + # %s may expand to a whitespace prefix at runtime, skip those + if LOG_PERCENT_S_CONTINUATION_RE.match(log_text, bad_match.start()): + continue + # Calculate line number from position in full content + abs_pos = log_match.start() + bad_match.start() + lineno = content.count("\n", 0, abs_pos) + 1 + col = abs_pos - content.rfind("\n", 0, abs_pos) + errs.append( + ( + lineno, + col, + "Multi-line log message has a continuation line that does " + "not start with a space. The log viewer uses leading " + "whitespace to detect continuation lines and re-add the " + f"log tag prefix (e.g. {highlight('[C][component:042]:')}).\n" + "Either start the continuation with a space/indent, or " + "split into separate ESP_LOG* calls.", + ) + ) + return errs + + @lint_content_find_check( "ESP_LOG", include=["*.h", "*.tcc"], From 1f945a334a472420d3f3e62c453f3ab3c5246c27 Mon Sep 17 00:00:00 2001 From: Joshua Sing Date: Tue, 24 Feb 2026 04:01:23 +1100 Subject: [PATCH 019/147] [hdc302x] Add new component (#10160) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> --- CODEOWNERS | 1 + esphome/components/hdc302x/__init__.py | 1 + esphome/components/hdc302x/hdc302x.cpp | 171 ++++++++++++++++++ esphome/components/hdc302x/hdc302x.h | 68 +++++++ esphome/components/hdc302x/sensor.py | 135 ++++++++++++++ tests/components/hdc302x/common.yaml | 19 ++ tests/components/hdc302x/test.esp32-idf.yaml | 4 + .../components/hdc302x/test.esp8266-ard.yaml | 4 + tests/components/hdc302x/test.rp2040-ard.yaml | 4 + 9 files changed, 407 insertions(+) create mode 100644 esphome/components/hdc302x/__init__.py create mode 100644 esphome/components/hdc302x/hdc302x.cpp create mode 100644 esphome/components/hdc302x/hdc302x.h create mode 100644 esphome/components/hdc302x/sensor.py create mode 100644 tests/components/hdc302x/common.yaml create mode 100644 tests/components/hdc302x/test.esp32-idf.yaml create mode 100644 tests/components/hdc302x/test.esp8266-ard.yaml create mode 100644 tests/components/hdc302x/test.rp2040-ard.yaml diff --git a/CODEOWNERS b/CODEOWNERS index 2aa0656343..6728e76bba 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -213,6 +213,7 @@ esphome/components/hbridge/light/* @DotNetDann esphome/components/hbridge/switch/* @dwmw2 esphome/components/hc8/* @omartijn esphome/components/hdc2010/* @optimusprimespace @ssieb +esphome/components/hdc302x/* @joshuasing esphome/components/he60r/* @clydebarrow esphome/components/heatpumpir/* @rob-deutsch esphome/components/hitachi_ac424/* @sourabhjaiswal diff --git a/esphome/components/hdc302x/__init__.py b/esphome/components/hdc302x/__init__.py new file mode 100644 index 0000000000..d8165281bf --- /dev/null +++ b/esphome/components/hdc302x/__init__.py @@ -0,0 +1 @@ +CODEOWNERS = ["@joshuasing"] diff --git a/esphome/components/hdc302x/hdc302x.cpp b/esphome/components/hdc302x/hdc302x.cpp new file mode 100644 index 0000000000..b50d34169a --- /dev/null +++ b/esphome/components/hdc302x/hdc302x.cpp @@ -0,0 +1,171 @@ +#include "hdc302x.h" + +#include "esphome/core/hal.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" + +namespace esphome::hdc302x { + +static const char *const TAG = "hdc302x.sensor"; + +// Commands (per datasheet Table 7-4) +static const uint8_t HDC302X_CMD_SOFT_RESET[2] = {0x30, 0xa2}; +static const uint8_t HDC302X_CMD_CLEAR_STATUS_REGISTER[2] = {0x30, 0x41}; + +static const uint8_t HDC302X_CMD_TRIGGER_MSB = 0x24; + +static const uint8_t HDC302X_CMD_HEATER_ENABLE[2] = {0x30, 0x6d}; +static const uint8_t HDC302X_CMD_HEATER_DISABLE[2] = {0x30, 0x66}; +static const uint8_t HDC302X_CMD_HEATER_CONFIGURE[2] = {0x30, 0x6e}; + +void HDC302XComponent::setup() { + // Soft reset the device + if (this->write(HDC302X_CMD_SOFT_RESET, 2) != i2c::ERROR_OK) { + this->mark_failed(LOG_STR("Soft reset failed")); + return; + } + // Delay SensorRR (reset ready), per datasheet, 6.5. + delay(3); + + // Clear status register + if (this->write(HDC302X_CMD_CLEAR_STATUS_REGISTER, 2) != i2c::ERROR_OK) { + this->mark_failed(LOG_STR("Clear status failed")); + return; + } +} + +void HDC302XComponent::dump_config() { + ESP_LOGCONFIG(TAG, + "HDC302x:\n" + " Heater: %s", + this->heater_active_ ? "active" : "inactive"); + LOG_I2C_DEVICE(this); + LOG_UPDATE_INTERVAL(this); + LOG_SENSOR(" ", "Temperature", this->temp_sensor_); + LOG_SENSOR(" ", "Humidity", this->humidity_sensor_); +} + +void HDC302XComponent::update() { + uint8_t cmd[] = { + HDC302X_CMD_TRIGGER_MSB, + this->power_mode_, + }; + if (this->write(cmd, 2) != i2c::ERROR_OK) { + this->status_set_warning(LOG_STR(ESP_LOG_MSG_COMM_FAIL)); + return; + } + + // Read data after ADC conversion has completed + this->set_timeout(this->conversion_delay_ms_(), [this]() { this->read_data_(); }); +} + +void HDC302XComponent::start_heater(uint16_t power, uint32_t duration_ms) { + if (!this->disable_heater_()) { + ESP_LOGD(TAG, "Heater disable before start failed"); + } + if (!this->configure_heater_(power) || !this->enable_heater_()) { + ESP_LOGW(TAG, "Heater start failed"); + return; + } + this->heater_active_ = true; + this->cancel_timeout("heater_off"); + if (duration_ms > 0) { + this->set_timeout("heater_off", duration_ms, [this]() { this->stop_heater(); }); + } +} + +void HDC302XComponent::stop_heater() { + this->cancel_timeout("heater_off"); + if (!this->disable_heater_()) { + ESP_LOGW(TAG, "Heater stop failed"); + } + this->heater_active_ = false; +} + +bool HDC302XComponent::enable_heater_() { + if (this->write(HDC302X_CMD_HEATER_ENABLE, 2) != i2c::ERROR_OK) { + ESP_LOGE(TAG, "Enable heater failed"); + return false; + } + return true; +} + +bool HDC302XComponent::configure_heater_(uint16_t power_level) { + if (power_level > 0x3fff) { + ESP_LOGW(TAG, "Heater power 0x%04x exceeds max 0x3fff", power_level); + return false; + } + + // Heater current level config. + uint8_t config[] = { + static_cast((power_level >> 8) & 0xff), // MSB + static_cast(power_level & 0xff) // LSB + }; + + // Configure level of heater current (per datasheet 7.5.7.8). + uint8_t cmd[] = { + HDC302X_CMD_HEATER_CONFIGURE[0], HDC302X_CMD_HEATER_CONFIGURE[1], config[0], config[1], + crc8(config, 2, 0xff, 0x31, true), + }; + if (this->write(cmd, sizeof(cmd)) != i2c::ERROR_OK) { + ESP_LOGE(TAG, "Configure heater failed"); + return false; + } + + return true; +} + +bool HDC302XComponent::disable_heater_() { + if (this->write(HDC302X_CMD_HEATER_DISABLE, 2) != i2c::ERROR_OK) { + ESP_LOGE(TAG, "Disable heater failed"); + return false; + } + return true; +} + +void HDC302XComponent::read_data_() { + uint8_t buf[6]; + if (this->read(buf, 6) != i2c::ERROR_OK) { + this->status_set_warning(LOG_STR(ESP_LOG_MSG_COMM_FAIL)); + return; + } + + // Check checksums + if (crc8(buf, 2, 0xff, 0x31, true) != buf[2] || crc8(buf + 3, 2, 0xff, 0x31, true) != buf[5]) { + this->status_set_warning(LOG_STR("Read data: invalid CRC")); + return; + } + + this->status_clear_warning(); + + if (this->temp_sensor_ != nullptr) { + uint16_t raw_t = encode_uint16(buf[0], buf[1]); + // Calculate temperature in Celsius per datasheet section 7.3.3. + float temp = -45 + 175 * (float(raw_t) / 65535.0f); + this->temp_sensor_->publish_state(temp); + } + + if (this->humidity_sensor_ != nullptr) { + uint16_t raw_rh = encode_uint16(buf[3], buf[4]); + // Calculate RH% per datasheet section 7.3.3. + float humidity = 100 * (float(raw_rh) / 65535.0f); + this->humidity_sensor_->publish_state(humidity); + } +} + +uint32_t HDC302XComponent::conversion_delay_ms_() { + // ADC conversion delay per datasheet, Table 7-5. - Trigger on Demand + switch (this->power_mode_) { + case HDC302XPowerMode::BALANCED: + return 8; + case HDC302XPowerMode::LOW_POWER: + return 5; + case HDC302XPowerMode::ULTRA_LOW_POWER: + return 4; + case HDC302XPowerMode::HIGH_ACCURACY: + default: + return 13; + } +} + +} // namespace esphome::hdc302x diff --git a/esphome/components/hdc302x/hdc302x.h b/esphome/components/hdc302x/hdc302x.h new file mode 100644 index 0000000000..6afea0a8c0 --- /dev/null +++ b/esphome/components/hdc302x/hdc302x.h @@ -0,0 +1,68 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/core/automation.h" +#include "esphome/components/sensor/sensor.h" +#include "esphome/components/i2c/i2c.h" + +namespace esphome::hdc302x { + +enum HDC302XPowerMode : uint8_t { + HIGH_ACCURACY = 0x00, + BALANCED = 0x0b, + LOW_POWER = 0x16, + ULTRA_LOW_POWER = 0xff, +}; + +/** + HDC302x Temperature and humidity sensor. + + Datasheet: + https://www.ti.com/lit/ds/symlink/hdc3020.pdf + */ +class HDC302XComponent : public PollingComponent, public i2c::I2CDevice { + public: + void setup() override; + void dump_config() override; + void update() override; + + void start_heater(uint16_t power, uint32_t duration_ms); + void stop_heater(); + + void set_temp_sensor(sensor::Sensor *temp_sensor) { this->temp_sensor_ = temp_sensor; } + void set_humidity_sensor(sensor::Sensor *humidity_sensor) { this->humidity_sensor_ = humidity_sensor; } + + void set_power_mode(HDC302XPowerMode power_mode) { this->power_mode_ = power_mode; } + + protected: + sensor::Sensor *temp_sensor_{nullptr}; + sensor::Sensor *humidity_sensor_{nullptr}; + + HDC302XPowerMode power_mode_{HDC302XPowerMode::HIGH_ACCURACY}; + bool heater_active_{false}; + + bool enable_heater_(); + bool configure_heater_(uint16_t power_level); + bool disable_heater_(); + void read_data_(); + uint32_t conversion_delay_ms_(); +}; + +template class HeaterOnAction : public Action, public Parented { + public: + TEMPLATABLE_VALUE(uint16_t, power) + TEMPLATABLE_VALUE(uint32_t, duration) + + void play(const Ts &...x) override { + auto power_val = this->power_.value(x...); + auto duration_val = this->duration_.value(x...); + this->parent_->start_heater(power_val, duration_val); + } +}; + +template class HeaterOffAction : public Action, public Parented { + public: + void play(const Ts &...x) override { this->parent_->stop_heater(); } +}; + +} // namespace esphome::hdc302x diff --git a/esphome/components/hdc302x/sensor.py b/esphome/components/hdc302x/sensor.py new file mode 100644 index 0000000000..7215a4cfb7 --- /dev/null +++ b/esphome/components/hdc302x/sensor.py @@ -0,0 +1,135 @@ +from esphome import automation +from esphome.automation import maybe_simple_id +import esphome.codegen as cg +from esphome.components import i2c, sensor +import esphome.config_validation as cv +from esphome.const import ( + CONF_DURATION, + CONF_HUMIDITY, + CONF_ID, + CONF_POWER, + CONF_POWER_MODE, + CONF_TEMPERATURE, + DEVICE_CLASS_HUMIDITY, + DEVICE_CLASS_TEMPERATURE, + STATE_CLASS_MEASUREMENT, + UNIT_CELSIUS, + UNIT_PERCENT, +) + +DEPENDENCIES = ["i2c"] + +hdc302x_ns = cg.esphome_ns.namespace("hdc302x") +HDC302XComponent = hdc302x_ns.class_( + "HDC302XComponent", cg.PollingComponent, i2c.I2CDevice +) + +HDC302XPowerMode = hdc302x_ns.enum("HDC302XPowerMode") +POWER_MODE_OPTIONS = { + "HIGH_ACCURACY": HDC302XPowerMode.HIGH_ACCURACY, + "BALANCED": HDC302XPowerMode.BALANCED, + "LOW_POWER": HDC302XPowerMode.LOW_POWER, + "ULTRA_LOW_POWER": HDC302XPowerMode.ULTRA_LOW_POWER, +} + +# Actions +HeaterOnAction = hdc302x_ns.class_("HeaterOnAction", automation.Action) +HeaterOffAction = hdc302x_ns.class_("HeaterOffAction", automation.Action) + +CONFIG_SCHEMA = ( + cv.Schema( + { + cv.GenerateID(): cv.declare_id(HDC302XComponent), + cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema( + unit_of_measurement=UNIT_CELSIUS, + accuracy_decimals=2, + device_class=DEVICE_CLASS_TEMPERATURE, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_HUMIDITY): sensor.sensor_schema( + unit_of_measurement=UNIT_PERCENT, + accuracy_decimals=2, + device_class=DEVICE_CLASS_HUMIDITY, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_POWER_MODE, default="HIGH_ACCURACY"): cv.enum( + POWER_MODE_OPTIONS, upper=True + ), + } + ) + .extend(cv.polling_component_schema("60s")) + .extend(i2c.i2c_device_schema(0x44)) # Default address per datasheet, Table 7-2. +) + + +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) + await i2c.register_i2c_device(var, config) + + if temp_config := config.get(CONF_TEMPERATURE): + sens = await sensor.new_sensor(temp_config) + cg.add(var.set_temp_sensor(sens)) + + if humidity_config := config.get(CONF_HUMIDITY): + sens = await sensor.new_sensor(humidity_config) + cg.add(var.set_humidity_sensor(sens)) + + cg.add(var.set_power_mode(config[CONF_POWER_MODE])) + + +# HDC302x heater power configs, per datasheet Table 7-15. +HDC302X_HEATER_POWER_MAP = { + "QUARTER": 0x009F, + "HALF": 0x03FF, + "FULL": 0x3FFF, +} + + +def heater_power_value(value): + """Accept enum names or raw uint16 values""" + if isinstance(value, cv.Lambda): + return value + if isinstance(value, str): + upper = value.upper() + if upper in HDC302X_HEATER_POWER_MAP: + return HDC302X_HEATER_POWER_MAP[upper] + raise cv.Invalid( + f"Unknown heater power preset: {value}. Use QUARTER, HALF, FULL, or a raw value 0-16383" + ) + return cv.int_range(min=0, max=0x3FFF)(value) + + +HDC302X_ACTION_SCHEMA = maybe_simple_id({cv.GenerateID(): cv.use_id(HDC302XComponent)}) + +HDC302X_HEATER_ON_ACTION_SCHEMA = maybe_simple_id( + { + cv.GenerateID(): cv.use_id(HDC302XComponent), + cv.Optional(CONF_POWER, default="QUARTER"): cv.templatable(heater_power_value), + cv.Optional(CONF_DURATION, default="5s"): cv.templatable( + cv.positive_time_period_milliseconds + ), + } +) + + +@automation.register_action( + "hdc302x.heater_on", HeaterOnAction, HDC302X_HEATER_ON_ACTION_SCHEMA +) +async def hdc302x_heater_on_to_code(config, action_id, template_arg, args): + var = cg.new_Pvariable(action_id, template_arg) + await cg.register_parented(var, config[CONF_ID]) + template_ = await cg.templatable(config[CONF_POWER], args, cg.uint16) + cg.add(var.set_power(template_)) + template_ = await cg.templatable(config[CONF_DURATION], args, cg.uint32) + cg.add(var.set_duration(template_)) + return var + + +@automation.register_action( + "hdc302x.heater_off", HeaterOffAction, HDC302X_ACTION_SCHEMA +) +async def hdc302x_heater_off_to_code(config, action_id, template_arg, args): + var = cg.new_Pvariable(action_id, template_arg) + await cg.register_parented(var, config[CONF_ID]) + return var diff --git a/tests/components/hdc302x/common.yaml b/tests/components/hdc302x/common.yaml new file mode 100644 index 0000000000..56bb31effe --- /dev/null +++ b/tests/components/hdc302x/common.yaml @@ -0,0 +1,19 @@ +esphome: + on_boot: + then: + - hdc302x.heater_on: + id: hdc302x_sensor + power: QUARTER + duration: 5s + - hdc302x.heater_off: + id: hdc302x_sensor + +sensor: + - platform: hdc302x + id: hdc302x_sensor + i2c_id: i2c_bus + temperature: + name: Temperature + humidity: + name: Humidity + update_interval: 15s diff --git a/tests/components/hdc302x/test.esp32-idf.yaml b/tests/components/hdc302x/test.esp32-idf.yaml new file mode 100644 index 0000000000..b47e39c389 --- /dev/null +++ b/tests/components/hdc302x/test.esp32-idf.yaml @@ -0,0 +1,4 @@ +packages: + i2c: !include ../../test_build_components/common/i2c/esp32-idf.yaml + +<<: !include common.yaml diff --git a/tests/components/hdc302x/test.esp8266-ard.yaml b/tests/components/hdc302x/test.esp8266-ard.yaml new file mode 100644 index 0000000000..4a98b9388a --- /dev/null +++ b/tests/components/hdc302x/test.esp8266-ard.yaml @@ -0,0 +1,4 @@ +packages: + i2c: !include ../../test_build_components/common/i2c/esp8266-ard.yaml + +<<: !include common.yaml diff --git a/tests/components/hdc302x/test.rp2040-ard.yaml b/tests/components/hdc302x/test.rp2040-ard.yaml new file mode 100644 index 0000000000..319a7c71a6 --- /dev/null +++ b/tests/components/hdc302x/test.rp2040-ard.yaml @@ -0,0 +1,4 @@ +packages: + i2c: !include ../../test_build_components/common/i2c/rp2040-ard.yaml + +<<: !include common.yaml From e199145f1c3b168e8584c4613f1d814c1694a4f8 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 12:20:55 -0600 Subject: [PATCH 020/147] [core] Avoid expensive modulo in LockFreeQueue for non-power-of-2 sizes (#14221) --- esphome/core/lock_free_queue.h | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/esphome/core/lock_free_queue.h b/esphome/core/lock_free_queue.h index e96b739b58..522fbd36e1 100644 --- a/esphome/core/lock_free_queue.h +++ b/esphome/core/lock_free_queue.h @@ -38,13 +38,27 @@ template class LockFreeQueue { } protected: + // Advance ring buffer index by one, wrapping at SIZE. + // Power-of-2 sizes use modulo (compiler emits single mask instruction). + // Non-power-of-2 sizes use comparison to avoid expensive multiply-shift sequences. + static constexpr uint8_t next_index(uint8_t index) { + if constexpr ((SIZE & (SIZE - 1)) == 0) { + return (index + 1) % SIZE; + } else { + uint8_t next = index + 1; + if (next >= SIZE) [[unlikely]] + next = 0; + return next; + } + } + // Internal push that reports queue state - for use by derived classes bool push_internal_(T *element, bool &was_empty, uint8_t &old_tail) { if (element == nullptr) return false; uint8_t current_tail = tail_.load(std::memory_order_relaxed); - uint8_t next_tail = (current_tail + 1) % SIZE; + uint8_t next_tail = next_index(current_tail); // Read head before incrementing tail uint8_t head_before = head_.load(std::memory_order_acquire); @@ -73,14 +87,21 @@ template class LockFreeQueue { } T *element = buffer_[current_head]; - head_.store((current_head + 1) % SIZE, std::memory_order_release); + head_.store(next_index(current_head), std::memory_order_release); return element; } size_t size() const { uint8_t tail = tail_.load(std::memory_order_acquire); uint8_t head = head_.load(std::memory_order_acquire); - return (tail - head + SIZE) % SIZE; + if constexpr ((SIZE & (SIZE - 1)) == 0) { + return (tail - head + SIZE) % SIZE; + } else { + int diff = static_cast(tail) - static_cast(head); + if (diff < 0) + diff += SIZE; + return static_cast(diff); + } } uint16_t get_and_reset_dropped_count() { return dropped_count_.exchange(0, std::memory_order_relaxed); } @@ -90,7 +111,7 @@ template class LockFreeQueue { bool empty() const { return head_.load(std::memory_order_acquire) == tail_.load(std::memory_order_acquire); } bool full() const { - uint8_t next_tail = (tail_.load(std::memory_order_relaxed) + 1) % SIZE; + uint8_t next_tail = next_index(tail_.load(std::memory_order_relaxed)); return next_tail == head_.load(std::memory_order_acquire); } From 0d32a5321ca20943eea2d5c9c9d3b3aeac44b568 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Mon, 23 Feb 2026 13:46:53 -0500 Subject: [PATCH 021/147] [remote_transmitter/remote_receiver] Rename _esp32.cpp to _rmt.cpp (#14226) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/remote_receiver/__init__.py | 2 +- .../{remote_receiver_esp32.cpp => remote_receiver_rmt.cpp} | 0 esphome/components/remote_transmitter/__init__.py | 2 +- ...{remote_transmitter_esp32.cpp => remote_transmitter_rmt.cpp} | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename esphome/components/remote_receiver/{remote_receiver_esp32.cpp => remote_receiver_rmt.cpp} (100%) rename esphome/components/remote_transmitter/{remote_transmitter_esp32.cpp => remote_transmitter_rmt.cpp} (100%) diff --git a/esphome/components/remote_receiver/__init__.py b/esphome/components/remote_receiver/__init__.py index 362f6e99db..53a0f8fb77 100644 --- a/esphome/components/remote_receiver/__init__.py +++ b/esphome/components/remote_receiver/__init__.py @@ -237,7 +237,7 @@ async def to_code(config): FILTER_SOURCE_FILES = filter_source_files_from_platform( { - "remote_receiver_esp32.cpp": { + "remote_receiver_rmt.cpp": { PlatformFramework.ESP32_ARDUINO, PlatformFramework.ESP32_IDF, }, diff --git a/esphome/components/remote_receiver/remote_receiver_esp32.cpp b/esphome/components/remote_receiver/remote_receiver_rmt.cpp similarity index 100% rename from esphome/components/remote_receiver/remote_receiver_esp32.cpp rename to esphome/components/remote_receiver/remote_receiver_rmt.cpp diff --git a/esphome/components/remote_transmitter/__init__.py b/esphome/components/remote_transmitter/__init__.py index fc772f88b2..371dbb685f 100644 --- a/esphome/components/remote_transmitter/__init__.py +++ b/esphome/components/remote_transmitter/__init__.py @@ -171,7 +171,7 @@ async def to_code(config): FILTER_SOURCE_FILES = filter_source_files_from_platform( { - "remote_transmitter_esp32.cpp": { + "remote_transmitter_rmt.cpp": { PlatformFramework.ESP32_ARDUINO, PlatformFramework.ESP32_IDF, }, diff --git a/esphome/components/remote_transmitter/remote_transmitter_esp32.cpp b/esphome/components/remote_transmitter/remote_transmitter_rmt.cpp similarity index 100% rename from esphome/components/remote_transmitter/remote_transmitter_esp32.cpp rename to esphome/components/remote_transmitter/remote_transmitter_rmt.cpp From daee71a2c17871b1f23e782059ae9e906abeb9f2 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Mon, 23 Feb 2026 14:21:29 -0500 Subject: [PATCH 022/147] [http_request] Retry update check on startup until network is ready (#14228) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../update/http_request_update.cpp | 24 ++++++++++++++++++- .../http_request/update/http_request_update.h | 1 + 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/esphome/components/http_request/update/http_request_update.cpp b/esphome/components/http_request/update/http_request_update.cpp index 85609bd31f..1900f69a69 100644 --- a/esphome/components/http_request/update/http_request_update.cpp +++ b/esphome/components/http_request/update/http_request_update.cpp @@ -24,8 +24,29 @@ namespace http_request { static const char *const TAG = "http_request.update"; static const size_t MAX_READ_SIZE = 256; +static constexpr uint32_t INITIAL_CHECK_INTERVAL_ID = 0; +static constexpr uint32_t INITIAL_CHECK_INTERVAL_MS = 10000; +static constexpr uint8_t INITIAL_CHECK_MAX_ATTEMPTS = 6; -void HttpRequestUpdate::setup() { this->ota_parent_->add_state_listener(this); } +void HttpRequestUpdate::setup() { + this->ota_parent_->add_state_listener(this); + + // Check periodically until network is ready + // Only if update interval is > total retry window to avoid redundant checks + if (this->get_update_interval() != SCHEDULER_DONT_RUN && + this->get_update_interval() > INITIAL_CHECK_INTERVAL_MS * INITIAL_CHECK_MAX_ATTEMPTS) { + this->initial_check_remaining_ = INITIAL_CHECK_MAX_ATTEMPTS; + this->set_interval(INITIAL_CHECK_INTERVAL_ID, INITIAL_CHECK_INTERVAL_MS, [this]() { + bool connected = network::is_connected(); + if (--this->initial_check_remaining_ == 0 || connected) { + this->cancel_interval(INITIAL_CHECK_INTERVAL_ID); + if (connected) { + this->update(); + } + } + }); + } +} void HttpRequestUpdate::on_ota_state(ota::OTAState state, float progress, uint8_t error) { if (state == ota::OTAState::OTA_IN_PROGRESS) { @@ -45,6 +66,7 @@ void HttpRequestUpdate::update() { ESP_LOGD(TAG, "Network not connected, skipping update check"); return; } + this->cancel_interval(INITIAL_CHECK_INTERVAL_ID); #ifdef USE_ESP32 xTaskCreate(HttpRequestUpdate::update_task, "update_task", 8192, (void *) this, 1, &this->update_task_handle_); #else diff --git a/esphome/components/http_request/update/http_request_update.h b/esphome/components/http_request/update/http_request_update.h index cf34ace18e..b8350346f9 100644 --- a/esphome/components/http_request/update/http_request_update.h +++ b/esphome/components/http_request/update/http_request_update.h @@ -40,6 +40,7 @@ class HttpRequestUpdate final : public update::UpdateEntity, public PollingCompo #ifdef USE_ESP32 TaskHandle_t update_task_handle_{nullptr}; #endif + uint8_t initial_check_remaining_{0}; }; } // namespace http_request From 063c6a9e45576eb5b22c94977cddac1f1eab1aef Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Mon, 23 Feb 2026 21:06:20 +0100 Subject: [PATCH 023/147] [esp32,core] Move CONF_ENABLE_OTA_ROLLBACK to core (#14231) --- esphome/components/esp32/__init__.py | 2 +- esphome/const.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 4c211b2f2a..62367443da 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -14,6 +14,7 @@ from esphome.const import ( CONF_BOARD, CONF_COMPONENTS, CONF_DISABLED, + CONF_ENABLE_OTA_ROLLBACK, CONF_ESPHOME, CONF_FRAMEWORK, CONF_IGNORE_EFUSE_CUSTOM_MAC, @@ -90,7 +91,6 @@ CONF_ENABLE_IDF_EXPERIMENTAL_FEATURES = "enable_idf_experimental_features" CONF_ENGINEERING_SAMPLE = "engineering_sample" CONF_INCLUDE_BUILTIN_IDF_COMPONENTS = "include_builtin_idf_components" CONF_ENABLE_LWIP_ASSERT = "enable_lwip_assert" -CONF_ENABLE_OTA_ROLLBACK = "enable_ota_rollback" CONF_EXECUTE_FROM_PSRAM = "execute_from_psram" CONF_MINIMUM_CHIP_REVISION = "minimum_chip_revision" CONF_RELEASE = "release" diff --git a/esphome/const.py b/esphome/const.py index ccc9d56dbb..0b1037d091 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -354,6 +354,7 @@ CONF_ELSE = "else" CONF_ENABLE_BTM = "enable_btm" CONF_ENABLE_IPV6 = "enable_ipv6" CONF_ENABLE_ON_BOOT = "enable_on_boot" +CONF_ENABLE_OTA_ROLLBACK = "enable_ota_rollback" CONF_ENABLE_PIN = "enable_pin" CONF_ENABLE_PRIVATE_NETWORK_ACCESS = "enable_private_network_access" CONF_ENABLE_RRM = "enable_rrm" From 918bbfb0d3c73be7616fc7e7ab57238f27bc35ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Feb 2026 20:22:32 +0000 Subject: [PATCH 024/147] Bump aioesphomeapi from 44.0.0 to 44.1.0 (#14232) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index be3445dceb..d22097b3ca 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ platformio==6.1.19 esptool==5.2.0 click==8.1.7 esphome-dashboard==20260210.0 -aioesphomeapi==44.0.0 +aioesphomeapi==44.1.0 zeroconf==0.148.0 puremagic==1.30 ruamel.yaml==0.19.1 # dashboard_import From 02c37bb6d63d9ccb457a13f35b6f2e3c80c35cc9 Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Mon, 23 Feb 2026 21:23:40 +0100 Subject: [PATCH 025/147] [nrf52,logger] generate crash magic in python (#14173) --- esphome/components/logger/logger_zephyr.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/esphome/components/logger/logger_zephyr.cpp b/esphome/components/logger/logger_zephyr.cpp index c2d24d6efc..6b46b93c61 100644 --- a/esphome/components/logger/logger_zephyr.cpp +++ b/esphome/components/logger/logger_zephyr.cpp @@ -20,8 +20,6 @@ __attribute__((weak)) void print_coredump() {} namespace esphome::logger { -static const uint32_t CRASH_MAGIC = 0xDEADBEEF; - __attribute__((section(".noinit"))) struct { uint32_t magic; uint32_t reason; @@ -152,7 +150,7 @@ static const char *reason_to_str(unsigned int reason, char *buf) { void Logger::dump_crash_() { ESP_LOGD(TAG, "Crash buffer address %p", &crash_buf); - if (crash_buf.magic == CRASH_MAGIC) { + if (crash_buf.magic == App.get_config_hash()) { char reason_buf[REASON_BUF_SIZE]; ESP_LOGE(TAG, "Last crash:"); ESP_LOGE(TAG, "Reason=%s PC=0x%08x LR=0x%08x", reason_to_str(crash_buf.reason, reason_buf), crash_buf.pc, @@ -164,7 +162,7 @@ void Logger::dump_crash_() { } void k_sys_fatal_error_handler(unsigned int reason, const z_arch_esf_t *esf) { - crash_buf.magic = CRASH_MAGIC; + crash_buf.magic = App.get_config_hash(); crash_buf.reason = reason; if (esf) { crash_buf.pc = esf->basic.pc; From 4a529003527b3d475742b29ae2fed82e55b0066c Mon Sep 17 00:00:00 2001 From: James Myatt Date: Mon, 23 Feb 2026 21:16:32 +0000 Subject: [PATCH 026/147] [nfc] Fix logging tag for nfc helpers (#14235) --- esphome/components/nfc/nfc_helpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/nfc/nfc_helpers.cpp b/esphome/components/nfc/nfc_helpers.cpp index bfaed6e486..fb0954a833 100644 --- a/esphome/components/nfc/nfc_helpers.cpp +++ b/esphome/components/nfc/nfc_helpers.cpp @@ -39,7 +39,7 @@ std::string get_random_ha_tag_ndef() { for (int i = 0; i < 12; i++) { uri += ALPHANUM[random_uint32() % (sizeof(ALPHANUM) - 1)]; } - ESP_LOGD("pn7160", "Payload to be written: %s", uri.c_str()); + ESP_LOGD(TAG, "Payload to be written: %s", uri.c_str()); return uri; } From 869678953dfbe22f2b784e8ec927bfa394676671 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 17:03:24 -0600 Subject: [PATCH 027/147] [core] Add pow10_int helper, replace powf in normalize_accuracy and sensor filters (#14114) Co-authored-by: Claude Opus 4.6 --- esphome/components/sensor/filter.cpp | 5 +++-- esphome/core/helpers.cpp | 11 +++++++++-- esphome/core/helpers.h | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/esphome/components/sensor/filter.cpp b/esphome/components/sensor/filter.cpp index cd4db98457..0fe1effe17 100644 --- a/esphome/components/sensor/filter.cpp +++ b/esphome/components/sensor/filter.cpp @@ -5,6 +5,7 @@ #include #include "esphome/core/application.h" #include "esphome/core/hal.h" +#include "esphome/core/helpers.h" #include "esphome/core/log.h" #include "sensor.h" @@ -240,7 +241,7 @@ ValueListFilter::ValueListFilter(std::initializer_list> bool ValueListFilter::value_matches_any_(float sensor_value) { int8_t accuracy = this->parent_->get_accuracy_decimals(); - float accuracy_mult = powf(10.0f, accuracy); + float accuracy_mult = pow10_int(accuracy); float rounded_sensor = roundf(accuracy_mult * sensor_value); for (auto &filter_value : this->values_) { @@ -472,7 +473,7 @@ optional ClampFilter::new_value(float value) { RoundFilter::RoundFilter(uint8_t precision) : precision_(precision) {} optional RoundFilter::new_value(float value) { if (std::isfinite(value)) { - float accuracy_mult = powf(10.0f, this->precision_); + float accuracy_mult = pow10_int(this->precision_); return roundf(accuracy_mult * value) / accuracy_mult; } return value; diff --git a/esphome/core/helpers.cpp b/esphome/core/helpers.cpp index 9f850b5df8..6d801e7ebc 100644 --- a/esphome/core/helpers.cpp +++ b/esphome/core/helpers.cpp @@ -468,8 +468,15 @@ ParseOnOffState parse_on_off(const char *str, const char *on, const char *off) { static inline void normalize_accuracy_decimals(float &value, int8_t &accuracy_decimals) { if (accuracy_decimals < 0) { - auto multiplier = powf(10.0f, accuracy_decimals); - value = roundf(value * multiplier) / multiplier; + float divisor; + if (accuracy_decimals == -1) { + divisor = 10.0f; + } else if (accuracy_decimals == -2) { + divisor = 100.0f; + } else { + divisor = pow10_int(-accuracy_decimals); + } + value = roundf(value / divisor) * divisor; accuracy_decimals = 0; } } diff --git a/esphome/core/helpers.h b/esphome/core/helpers.h index 298b93fbc4..b606e68df3 100644 --- a/esphome/core/helpers.h +++ b/esphome/core/helpers.h @@ -439,6 +439,21 @@ template class SmallBufferWithHeapFallb /// @name Mathematics ///@{ +/// Compute 10^exp using iterative multiplication/division. +/// Avoids pulling in powf/__ieee754_powf (~2.3KB flash) for small integer exponents. +/// Matches powf(10, exp) for the int8_t exponent range used by sensor accuracy_decimals. +inline float pow10_int(int8_t exp) { + float result = 1.0f; + if (exp >= 0) { + for (int8_t i = 0; i < exp; i++) + result *= 10.0f; + } else { + for (int8_t i = exp; i < 0; i++) + result /= 10.0f; + } + return result; +} + /// Remap \p value from the range (\p min, \p max) to (\p min_out, \p max_out). template T remap(U value, U min, U max, T min_out, T max_out) { return (value - min) * (max_out - min_out) / (max - min) + min_out; From ebf1047da79805e86ec7a7e1058a2c50c55e42b0 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:51:56 -0500 Subject: [PATCH 028/147] [core] Move build_info_data.h out of application.h to fix incremental rebuilds (#14230) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../components/version/version_text_sensor.cpp | 1 + esphome/components/web_server/web_server.cpp | 2 +- esphome/core/application.cpp | 11 +++++++++++ esphome/core/application.h | 18 ++++++++---------- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/esphome/components/version/version_text_sensor.cpp b/esphome/components/version/version_text_sensor.cpp index 2e5686008b..74bb4c76e8 100644 --- a/esphome/components/version/version_text_sensor.cpp +++ b/esphome/components/version/version_text_sensor.cpp @@ -1,5 +1,6 @@ #include "version_text_sensor.h" #include "esphome/core/application.h" +#include "esphome/core/build_info_data.h" #include "esphome/core/log.h" #include "esphome/core/version.h" #include "esphome/core/helpers.h" diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp index 4b572417c1..682008c40e 100644 --- a/esphome/components/web_server/web_server.cpp +++ b/esphome/components/web_server/web_server.cpp @@ -375,7 +375,7 @@ json::SerializationBuffer<> WebServer::get_config_json() { JsonObject root = builder.root(); root[ESPHOME_F("title")] = App.get_friendly_name().empty() ? App.get_name().c_str() : App.get_friendly_name().c_str(); - char comment_buffer[ESPHOME_COMMENT_SIZE]; + char comment_buffer[Application::ESPHOME_COMMENT_SIZE_MAX]; App.get_comment_string(comment_buffer); root[ESPHOME_F("comment")] = comment_buffer; #if defined(USE_WEBSERVER_OTA_DISABLED) || !defined(USE_WEBSERVER_OTA) diff --git a/esphome/core/application.cpp b/esphome/core/application.cpp index c6597897dc..1cb7dc0075 100644 --- a/esphome/core/application.cpp +++ b/esphome/core/application.cpp @@ -749,4 +749,15 @@ void Application::get_build_time_string(std::span buf buffer[buffer.size() - 1] = '\0'; } +void Application::get_comment_string(std::span buffer) { + ESPHOME_strncpy_P(buffer.data(), ESPHOME_COMMENT_STR, ESPHOME_COMMENT_SIZE); + buffer[ESPHOME_COMMENT_SIZE - 1] = '\0'; +} + +uint32_t Application::get_config_hash() { return ESPHOME_CONFIG_HASH; } + +uint32_t Application::get_config_version_hash() { return fnv1a_hash_extend(ESPHOME_CONFIG_HASH, ESPHOME_VERSION); } + +time_t Application::get_build_time() { return ESPHOME_BUILD_TIME; } + } // namespace esphome diff --git a/esphome/core/application.h b/esphome/core/application.h index 5b3e3dfed6..cd275bb97f 100644 --- a/esphome/core/application.h +++ b/esphome/core/application.h @@ -6,7 +6,6 @@ #include #include #include -#include "esphome/core/build_info_data.h" #include "esphome/core/component.h" #include "esphome/core/defines.h" #include "esphome/core/hal.h" @@ -274,16 +273,15 @@ class Application { return ""; } + /// Maximum size of the comment buffer (including null terminator) + static constexpr size_t ESPHOME_COMMENT_SIZE_MAX = 256; + /// Copy the comment string into the provided buffer - /// Buffer must be ESPHOME_COMMENT_SIZE bytes (compile-time enforced) - void get_comment_string(std::span buffer) { - ESPHOME_strncpy_P(buffer.data(), ESPHOME_COMMENT_STR, buffer.size()); - buffer[buffer.size() - 1] = '\0'; - } + void get_comment_string(std::span buffer); /// Get the comment of this Application as a string std::string get_comment() { - char buffer[ESPHOME_COMMENT_SIZE]; + char buffer[ESPHOME_COMMENT_SIZE_MAX]; this->get_comment_string(buffer); return std::string(buffer); } @@ -294,13 +292,13 @@ class Application { static constexpr size_t BUILD_TIME_STR_SIZE = 26; /// Get the config hash as a 32-bit integer - constexpr uint32_t get_config_hash() { return ESPHOME_CONFIG_HASH; } + uint32_t get_config_hash(); /// Get the config hash extended with ESPHome version - constexpr uint32_t get_config_version_hash() { return fnv1a_hash_extend(ESPHOME_CONFIG_HASH, ESPHOME_VERSION); } + uint32_t get_config_version_hash(); /// Get the build time as a Unix timestamp - constexpr time_t get_build_time() { return ESPHOME_BUILD_TIME; } + time_t get_build_time(); /// Copy the build time string into the provided buffer /// Buffer must be BUILD_TIME_STR_SIZE bytes (compile-time enforced) From 30cc51eac97948449aa87a4e741bab84bb79d6a2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 19:49:00 -0600 Subject: [PATCH 029/147] [version] Use C++17 nested namespace syntax (#14240) --- esphome/components/version/version_text_sensor.cpp | 6 ++---- esphome/components/version/version_text_sensor.h | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/esphome/components/version/version_text_sensor.cpp b/esphome/components/version/version_text_sensor.cpp index 74bb4c76e8..4a08001cc4 100644 --- a/esphome/components/version/version_text_sensor.cpp +++ b/esphome/components/version/version_text_sensor.cpp @@ -6,8 +6,7 @@ #include "esphome/core/helpers.h" #include "esphome/core/progmem.h" -namespace esphome { -namespace version { +namespace esphome::version { static const char *const TAG = "version.text_sensor"; @@ -36,5 +35,4 @@ void VersionTextSensor::setup() { void VersionTextSensor::set_hide_timestamp(bool hide_timestamp) { this->hide_timestamp_ = hide_timestamp; } void VersionTextSensor::dump_config() { LOG_TEXT_SENSOR("", "Version Text Sensor", this); } -} // namespace version -} // namespace esphome +} // namespace esphome::version diff --git a/esphome/components/version/version_text_sensor.h b/esphome/components/version/version_text_sensor.h index b7d8001120..6153c5dd7c 100644 --- a/esphome/components/version/version_text_sensor.h +++ b/esphome/components/version/version_text_sensor.h @@ -3,8 +3,7 @@ #include "esphome/core/component.h" #include "esphome/components/text_sensor/text_sensor.h" -namespace esphome { -namespace version { +namespace esphome::version { class VersionTextSensor : public text_sensor::TextSensor, public Component { public: @@ -16,5 +15,4 @@ class VersionTextSensor : public text_sensor::TextSensor, public Component { bool hide_timestamp_{false}; }; -} // namespace version -} // namespace esphome +} // namespace esphome::version From 843d06df3f5bf63e9447d1a10eaaa6987f0b5705 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 19:49:15 -0600 Subject: [PATCH 030/147] [switch] Use C++17 nested namespace syntax (#14241) --- esphome/components/switch/automation.cpp | 6 ++---- esphome/components/switch/automation.h | 6 ++---- .../switch/binary_sensor/switch_binary_sensor.cpp | 6 ++---- .../switch/binary_sensor/switch_binary_sensor.h | 6 ++---- esphome/components/switch/switch.cpp | 6 ++---- esphome/components/switch/switch.h | 14 ++++++-------- 6 files changed, 16 insertions(+), 28 deletions(-) diff --git a/esphome/components/switch/automation.cpp b/esphome/components/switch/automation.cpp index 5989ae9ce3..9a0221fe56 100644 --- a/esphome/components/switch/automation.cpp +++ b/esphome/components/switch/automation.cpp @@ -1,10 +1,8 @@ #include "automation.h" #include "esphome/core/log.h" -namespace esphome { -namespace switch_ { +namespace esphome::switch_ { static const char *const TAG = "switch.automation"; -} // namespace switch_ -} // namespace esphome +} // namespace esphome::switch_ diff --git a/esphome/components/switch/automation.h b/esphome/components/switch/automation.h index 27d3474c97..ed1f056c8b 100644 --- a/esphome/components/switch/automation.h +++ b/esphome/components/switch/automation.h @@ -4,8 +4,7 @@ #include "esphome/core/automation.h" #include "esphome/components/switch/switch.h" -namespace esphome { -namespace switch_ { +namespace esphome::switch_ { template class TurnOnAction : public Action { public: @@ -104,5 +103,4 @@ template class SwitchPublishAction : public Action { Switch *switch_; }; -} // namespace switch_ -} // namespace esphome +} // namespace esphome::switch_ diff --git a/esphome/components/switch/binary_sensor/switch_binary_sensor.cpp b/esphome/components/switch/binary_sensor/switch_binary_sensor.cpp index ba57154446..19995fb1ae 100644 --- a/esphome/components/switch/binary_sensor/switch_binary_sensor.cpp +++ b/esphome/components/switch/binary_sensor/switch_binary_sensor.cpp @@ -1,8 +1,7 @@ #include "switch_binary_sensor.h" #include "esphome/core/log.h" -namespace esphome { -namespace switch_ { +namespace esphome::switch_ { static const char *const TAG = "switch.binary_sensor"; @@ -13,5 +12,4 @@ void SwitchBinarySensor::setup() { void SwitchBinarySensor::dump_config() { LOG_BINARY_SENSOR("", "Switch Binary Sensor", this); } -} // namespace switch_ -} // namespace esphome +} // namespace esphome::switch_ diff --git a/esphome/components/switch/binary_sensor/switch_binary_sensor.h b/esphome/components/switch/binary_sensor/switch_binary_sensor.h index 53b07da903..0b77cdd920 100644 --- a/esphome/components/switch/binary_sensor/switch_binary_sensor.h +++ b/esphome/components/switch/binary_sensor/switch_binary_sensor.h @@ -4,8 +4,7 @@ #include "esphome/core/component.h" #include "esphome/components/binary_sensor/binary_sensor.h" -namespace esphome { -namespace switch_ { +namespace esphome::switch_ { class SwitchBinarySensor : public binary_sensor::BinarySensor, public Component { public: @@ -17,5 +16,4 @@ class SwitchBinarySensor : public binary_sensor::BinarySensor, public Component Switch *source_; }; -} // namespace switch_ -} // namespace esphome +} // namespace esphome::switch_ diff --git a/esphome/components/switch/switch.cpp b/esphome/components/switch/switch.cpp index 61a273d25c..9e9af21368 100644 --- a/esphome/components/switch/switch.cpp +++ b/esphome/components/switch/switch.cpp @@ -3,8 +3,7 @@ #include "esphome/core/controller_registry.h" #include "esphome/core/log.h" -namespace esphome { -namespace switch_ { +namespace esphome::switch_ { static const char *const TAG = "switch"; @@ -107,5 +106,4 @@ void log_switch(const char *tag, const char *prefix, const char *type, Switch *o } } -} // namespace switch_ -} // namespace esphome +} // namespace esphome::switch_ diff --git a/esphome/components/switch/switch.h b/esphome/components/switch/switch.h index 9319adf9ed..982c640cf9 100644 --- a/esphome/components/switch/switch.h +++ b/esphome/components/switch/switch.h @@ -5,8 +5,7 @@ #include "esphome/core/helpers.h" #include "esphome/core/preferences.h" -namespace esphome { -namespace switch_ { +namespace esphome::switch_ { #define SUB_SWITCH(name) \ protected: \ @@ -16,10 +15,10 @@ namespace switch_ { void set_##name##_switch(switch_::Switch *s) { this->name##_switch_ = s; } // bit0: on/off. bit1: persistent. bit2: inverted. bit3: disabled -const int RESTORE_MODE_ON_MASK = 0x01; -const int RESTORE_MODE_PERSISTENT_MASK = 0x02; -const int RESTORE_MODE_INVERTED_MASK = 0x04; -const int RESTORE_MODE_DISABLED_MASK = 0x08; +constexpr int RESTORE_MODE_ON_MASK = 0x01; +constexpr int RESTORE_MODE_PERSISTENT_MASK = 0x02; +constexpr int RESTORE_MODE_INVERTED_MASK = 0x04; +constexpr int RESTORE_MODE_DISABLED_MASK = 0x08; enum SwitchRestoreMode : uint8_t { SWITCH_ALWAYS_OFF = !RESTORE_MODE_ON_MASK, @@ -146,5 +145,4 @@ class Switch : public EntityBase, public EntityBase_DeviceClass { #define LOG_SWITCH(prefix, type, obj) log_switch((TAG), (prefix), LOG_STR_LITERAL(type), (obj)) void log_switch(const char *tag, const char *prefix, const char *type, Switch *obj); -} // namespace switch_ -} // namespace esphome +} // namespace esphome::switch_ From 63c1496115befafbdf8565f48b34ab7a6ea57753 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 19:49:25 -0600 Subject: [PATCH 031/147] [text] Use C++17 nested namespace syntax (#14242) --- esphome/components/text/automation.h | 6 ++---- esphome/components/text/text.cpp | 6 ++---- esphome/components/text/text.h | 6 ++---- esphome/components/text/text_call.cpp | 6 ++---- esphome/components/text/text_call.h | 6 ++---- esphome/components/text/text_traits.h | 6 ++---- 6 files changed, 12 insertions(+), 24 deletions(-) diff --git a/esphome/components/text/automation.h b/esphome/components/text/automation.h index e7667fe491..ac8166d0be 100644 --- a/esphome/components/text/automation.h +++ b/esphome/components/text/automation.h @@ -4,8 +4,7 @@ #include "esphome/core/component.h" #include "text.h" -namespace esphome { -namespace text { +namespace esphome::text { class TextStateTrigger : public Trigger { public: @@ -29,5 +28,4 @@ template class TextSetAction : public Action { Text *text_; }; -} // namespace text -} // namespace esphome +} // namespace esphome::text diff --git a/esphome/components/text/text.cpp b/esphome/components/text/text.cpp index e3f74b685b..d8ab6b1b92 100644 --- a/esphome/components/text/text.cpp +++ b/esphome/components/text/text.cpp @@ -4,8 +4,7 @@ #include "esphome/core/log.h" #include -namespace esphome { -namespace text { +namespace esphome::text { static const char *const TAG = "text"; @@ -34,5 +33,4 @@ void Text::add_on_state_callback(std::function &&call this->state_callback_.add(std::move(callback)); } -} // namespace text -} // namespace esphome +} // namespace esphome::text diff --git a/esphome/components/text/text.h b/esphome/components/text/text.h index 3a1bea56cb..7d255e5688 100644 --- a/esphome/components/text/text.h +++ b/esphome/components/text/text.h @@ -6,8 +6,7 @@ #include "text_call.h" #include "text_traits.h" -namespace esphome { -namespace text { +namespace esphome::text { #define LOG_TEXT(prefix, type, obj) \ if ((obj) != nullptr) { \ @@ -47,5 +46,4 @@ class Text : public EntityBase { LazyCallbackManager state_callback_; }; -} // namespace text -} // namespace esphome +} // namespace esphome::text diff --git a/esphome/components/text/text_call.cpp b/esphome/components/text/text_call.cpp index 0d0a1d228d..8a1630c5ca 100644 --- a/esphome/components/text/text_call.cpp +++ b/esphome/components/text/text_call.cpp @@ -2,8 +2,7 @@ #include "esphome/core/log.h" #include "text.h" -namespace esphome { -namespace text { +namespace esphome::text { static const char *const TAG = "text"; @@ -52,5 +51,4 @@ void TextCall::perform() { this->parent_->control(target_value); } -} // namespace text -} // namespace esphome +} // namespace esphome::text diff --git a/esphome/components/text/text_call.h b/esphome/components/text/text_call.h index 9f75a25c6b..532fae34b2 100644 --- a/esphome/components/text/text_call.h +++ b/esphome/components/text/text_call.h @@ -3,8 +3,7 @@ #include "esphome/core/helpers.h" #include "text_traits.h" -namespace esphome { -namespace text { +namespace esphome::text { class Text; @@ -21,5 +20,4 @@ class TextCall { void validate_(); }; -} // namespace text -} // namespace esphome +} // namespace esphome::text diff --git a/esphome/components/text/text_traits.h b/esphome/components/text/text_traits.h index 473daafb8e..72e65b83ce 100644 --- a/esphome/components/text/text_traits.h +++ b/esphome/components/text/text_traits.h @@ -4,8 +4,7 @@ #include "esphome/core/string_ref.h" -namespace esphome { -namespace text { +namespace esphome::text { enum TextMode : uint8_t { TEXT_MODE_TEXT = 0, @@ -37,5 +36,4 @@ class TextTraits { TextMode mode_{TEXT_MODE_TEXT}; }; -} // namespace text -} // namespace esphome +} // namespace esphome::text From 500aa7bf1d27378ea94141babdad6c83b0176f4f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 19:49:35 -0600 Subject: [PATCH 032/147] [text_sensor] Use C++17 nested namespace syntax (#14243) --- esphome/components/text_sensor/automation.h | 6 ++---- esphome/components/text_sensor/filter.cpp | 6 ++---- esphome/components/text_sensor/filter.h | 6 ++---- esphome/components/text_sensor/text_sensor.cpp | 6 ++---- esphome/components/text_sensor/text_sensor.h | 6 ++---- 5 files changed, 10 insertions(+), 20 deletions(-) diff --git a/esphome/components/text_sensor/automation.h b/esphome/components/text_sensor/automation.h index 709c54c140..ab30362774 100644 --- a/esphome/components/text_sensor/automation.h +++ b/esphome/components/text_sensor/automation.h @@ -6,8 +6,7 @@ #include "esphome/core/automation.h" #include "esphome/components/text_sensor/text_sensor.h" -namespace esphome { -namespace text_sensor { +namespace esphome::text_sensor { class TextSensorStateTrigger : public Trigger { public: @@ -46,5 +45,4 @@ template class TextSensorPublishAction : public Action { TextSensor *sensor_; }; -} // namespace text_sensor -} // namespace esphome +} // namespace esphome::text_sensor diff --git a/esphome/components/text_sensor/filter.cpp b/esphome/components/text_sensor/filter.cpp index f6552c7c66..f7c6a695fb 100644 --- a/esphome/components/text_sensor/filter.cpp +++ b/esphome/components/text_sensor/filter.cpp @@ -6,8 +6,7 @@ #include "esphome/core/log.h" #include "esphome/core/hal.h" -namespace esphome { -namespace text_sensor { +namespace esphome::text_sensor { static const char *const TAG = "text_sensor.filter"; @@ -107,7 +106,6 @@ bool MapFilter::new_value(std::string &value) { return true; // Pass through if no match } -} // namespace text_sensor -} // namespace esphome +} // namespace esphome::text_sensor #endif // USE_TEXT_SENSOR_FILTER diff --git a/esphome/components/text_sensor/filter.h b/esphome/components/text_sensor/filter.h index f88e8645cc..8a8bc55c8e 100644 --- a/esphome/components/text_sensor/filter.h +++ b/esphome/components/text_sensor/filter.h @@ -6,8 +6,7 @@ #include "esphome/core/component.h" #include "esphome/core/helpers.h" -namespace esphome { -namespace text_sensor { +namespace esphome::text_sensor { class TextSensor; @@ -165,7 +164,6 @@ class MapFilter : public Filter { FixedVector mappings_; }; -} // namespace text_sensor -} // namespace esphome +} // namespace esphome::text_sensor #endif // USE_TEXT_SENSOR_FILTER diff --git a/esphome/components/text_sensor/text_sensor.cpp b/esphome/components/text_sensor/text_sensor.cpp index c66d08ec40..91561c5f42 100644 --- a/esphome/components/text_sensor/text_sensor.cpp +++ b/esphome/components/text_sensor/text_sensor.cpp @@ -4,8 +4,7 @@ #include "esphome/core/log.h" #include -namespace esphome { -namespace text_sensor { +namespace esphome::text_sensor { static const char *const TAG = "text_sensor"; @@ -125,5 +124,4 @@ void TextSensor::notify_frontend_() { #endif } -} // namespace text_sensor -} // namespace esphome +} // namespace esphome::text_sensor diff --git a/esphome/components/text_sensor/text_sensor.h b/esphome/components/text_sensor/text_sensor.h index 97373dc716..9916aa63b2 100644 --- a/esphome/components/text_sensor/text_sensor.h +++ b/esphome/components/text_sensor/text_sensor.h @@ -10,8 +10,7 @@ #include #include -namespace esphome { -namespace text_sensor { +namespace esphome::text_sensor { class TextSensor; @@ -84,5 +83,4 @@ class TextSensor : public EntityBase, public EntityBase_DeviceClass { #endif }; -} // namespace text_sensor -} // namespace esphome +} // namespace esphome::text_sensor From a694003fe3f2aca98e930f9d1836d43ac2ee05d4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 19:49:48 -0600 Subject: [PATCH 033/147] [usb_host] Use C++17 nested namespace syntax (#14244) --- esphome/components/usb_host/usb_host.h | 26 +++++++++---------- .../components/usb_host/usb_host_client.cpp | 6 ++--- .../usb_host/usb_host_component.cpp | 6 ++--- 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/esphome/components/usb_host/usb_host.h b/esphome/components/usb_host/usb_host.h index a6a97d0bd7..2eec0c9699 100644 --- a/esphome/components/usb_host/usb_host.h +++ b/esphome/components/usb_host/usb_host.h @@ -12,8 +12,7 @@ #include "esphome/core/event_pool.h" #include -namespace esphome { -namespace usb_host { +namespace esphome::usb_host { // THREADING MODEL: // This component uses a dedicated USB task for event processing to prevent data loss. @@ -44,16 +43,16 @@ struct TransferRequest; class USBClient; // constants for setup packet type -static const uint8_t USB_RECIP_DEVICE = 0; -static const uint8_t USB_RECIP_INTERFACE = 1; -static const uint8_t USB_RECIP_ENDPOINT = 2; -static const uint8_t USB_TYPE_STANDARD = 0 << 5; -static const uint8_t USB_TYPE_CLASS = 1 << 5; -static const uint8_t USB_TYPE_VENDOR = 2 << 5; -static const uint8_t USB_DIR_MASK = 1 << 7; -static const uint8_t USB_DIR_IN = 1 << 7; -static const uint8_t USB_DIR_OUT = 0; -static const size_t SETUP_PACKET_SIZE = 8; +static constexpr uint8_t USB_RECIP_DEVICE = 0; +static constexpr uint8_t USB_RECIP_INTERFACE = 1; +static constexpr uint8_t USB_RECIP_ENDPOINT = 2; +static constexpr uint8_t USB_TYPE_STANDARD = 0 << 5; +static constexpr uint8_t USB_TYPE_CLASS = 1 << 5; +static constexpr uint8_t USB_TYPE_VENDOR = 2 << 5; +static constexpr uint8_t USB_DIR_MASK = 1 << 7; +static constexpr uint8_t USB_DIR_IN = 1 << 7; +static constexpr uint8_t USB_DIR_OUT = 0; +static constexpr size_t SETUP_PACKET_SIZE = 8; static constexpr size_t MAX_REQUESTS = USB_HOST_MAX_REQUESTS; // maximum number of outstanding requests possible. static_assert(MAX_REQUESTS >= 1 && MAX_REQUESTS <= 32, "MAX_REQUESTS must be between 1 and 32"); @@ -189,7 +188,6 @@ class USBHost : public Component { std::vector clients_{}; }; -} // namespace usb_host -} // namespace esphome +} // namespace esphome::usb_host #endif // USE_ESP32_VARIANT_ESP32P4 || USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 diff --git a/esphome/components/usb_host/usb_host_client.cpp b/esphome/components/usb_host/usb_host_client.cpp index 422d74095c..5b0aed4c59 100644 --- a/esphome/components/usb_host/usb_host_client.cpp +++ b/esphome/components/usb_host/usb_host_client.cpp @@ -10,8 +10,7 @@ #include #include #include -namespace esphome { -namespace usb_host { +namespace esphome::usb_host { #pragma GCC diagnostic ignored "-Wparentheses" @@ -568,6 +567,5 @@ void USBClient::release_trq(TransferRequest *trq) { this->trq_in_use_.fetch_and(mask, std::memory_order_release); } -} // namespace usb_host -} // namespace esphome +} // namespace esphome::usb_host #endif // USE_ESP32_VARIANT_ESP32P4 || USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 diff --git a/esphome/components/usb_host/usb_host_component.cpp b/esphome/components/usb_host/usb_host_component.cpp index 790fe6713b..8ce0a70dc9 100644 --- a/esphome/components/usb_host/usb_host_component.cpp +++ b/esphome/components/usb_host/usb_host_component.cpp @@ -4,8 +4,7 @@ #include #include "esphome/core/log.h" -namespace esphome { -namespace usb_host { +namespace esphome::usb_host { void USBHost::setup() { usb_host_config_t config{}; @@ -28,7 +27,6 @@ void USBHost::loop() { } } -} // namespace usb_host -} // namespace esphome +} // namespace esphome::usb_host #endif // USE_ESP32_VARIANT_ESP32P4 || USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 From 1614eb9c9cc3be784d22f262171b7978b21ebbb3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 19:50:00 -0600 Subject: [PATCH 034/147] [i2c] Use C++17 nested namespace syntax (#14245) --- esphome/components/i2c/i2c.cpp | 6 ++---- esphome/components/i2c/i2c.h | 6 ++---- esphome/components/i2c/i2c_bus.h | 6 ++---- esphome/components/i2c/i2c_bus_arduino.cpp | 6 ++---- esphome/components/i2c/i2c_bus_arduino.h | 6 ++---- esphome/components/i2c/i2c_bus_esp_idf.cpp | 6 ++---- esphome/components/i2c/i2c_bus_esp_idf.h | 6 ++---- 7 files changed, 14 insertions(+), 28 deletions(-) diff --git a/esphome/components/i2c/i2c.cpp b/esphome/components/i2c/i2c.cpp index b9b5d79428..76b3ec3b4d 100644 --- a/esphome/components/i2c/i2c.cpp +++ b/esphome/components/i2c/i2c.cpp @@ -5,8 +5,7 @@ #include "esphome/core/log.h" #include -namespace esphome { -namespace i2c { +namespace esphome::i2c { static const char *const TAG = "i2c"; @@ -109,5 +108,4 @@ uint8_t I2CRegister16::get() const { return value; } -} // namespace i2c -} // namespace esphome +} // namespace esphome::i2c diff --git a/esphome/components/i2c/i2c.h b/esphome/components/i2c/i2c.h index aab98d5f46..00929db620 100644 --- a/esphome/components/i2c/i2c.h +++ b/esphome/components/i2c/i2c.h @@ -6,8 +6,7 @@ #include "esphome/core/optional.h" #include "i2c_bus.h" -namespace esphome { -namespace i2c { +namespace esphome::i2c { #define LOG_I2C_DEVICE(this) ESP_LOGCONFIG(TAG, " Address: 0x%02X", this->address_); @@ -272,5 +271,4 @@ class I2CDevice { I2CBus *bus_{nullptr}; ///< pointer to I2CBus instance }; -} // namespace i2c -} // namespace esphome +} // namespace esphome::i2c diff --git a/esphome/components/i2c/i2c_bus.h b/esphome/components/i2c/i2c_bus.h index 2bc0dc1ef9..0c5e80bfe5 100644 --- a/esphome/components/i2c/i2c_bus.h +++ b/esphome/components/i2c/i2c_bus.h @@ -6,8 +6,7 @@ #include "esphome/core/helpers.h" -namespace esphome { -namespace i2c { +namespace esphome::i2c { /// @brief Error codes returned by I2CBus and I2CDevice methods enum ErrorCode { @@ -69,5 +68,4 @@ class InternalI2CBus : public I2CBus { virtual int get_port() const = 0; }; -} // namespace i2c -} // namespace esphome +} // namespace esphome::i2c diff --git a/esphome/components/i2c/i2c_bus_arduino.cpp b/esphome/components/i2c/i2c_bus_arduino.cpp index edd6b81588..5120eb4c00 100644 --- a/esphome/components/i2c/i2c_bus_arduino.cpp +++ b/esphome/components/i2c/i2c_bus_arduino.cpp @@ -7,8 +7,7 @@ #include "esphome/core/helpers.h" #include "esphome/core/log.h" -namespace esphome { -namespace i2c { +namespace esphome::i2c { static const char *const TAG = "i2c.arduino"; @@ -262,7 +261,6 @@ void ArduinoI2CBus::recover_() { recovery_result_ = RECOVERY_COMPLETED; } -} // namespace i2c -} // namespace esphome +} // namespace esphome::i2c #endif // defined(USE_ARDUINO) && !defined(USE_ESP32) diff --git a/esphome/components/i2c/i2c_bus_arduino.h b/esphome/components/i2c/i2c_bus_arduino.h index 2d69e7684c..edc14af7bc 100644 --- a/esphome/components/i2c/i2c_bus_arduino.h +++ b/esphome/components/i2c/i2c_bus_arduino.h @@ -6,8 +6,7 @@ #include "esphome/core/component.h" #include "i2c_bus.h" -namespace esphome { -namespace i2c { +namespace esphome::i2c { enum RecoveryCode { RECOVERY_FAILED_SCL_LOW, @@ -45,7 +44,6 @@ class ArduinoI2CBus : public InternalI2CBus, public Component { bool initialized_ = false; }; -} // namespace i2c -} // namespace esphome +} // namespace esphome::i2c #endif // defined(USE_ARDUINO) && !defined(USE_ESP32) diff --git a/esphome/components/i2c/i2c_bus_esp_idf.cpp b/esphome/components/i2c/i2c_bus_esp_idf.cpp index 7a965ce5ad..eaefabf75b 100644 --- a/esphome/components/i2c/i2c_bus_esp_idf.cpp +++ b/esphome/components/i2c/i2c_bus_esp_idf.cpp @@ -10,8 +10,7 @@ #include "esphome/core/helpers.h" #include "esphome/core/log.h" -namespace esphome { -namespace i2c { +namespace esphome::i2c { static const char *const TAG = "i2c.idf"; @@ -312,6 +311,5 @@ void IDFI2CBus::recover_() { recovery_result_ = RECOVERY_COMPLETED; } -} // namespace i2c -} // namespace esphome +} // namespace esphome::i2c #endif // USE_ESP32 diff --git a/esphome/components/i2c/i2c_bus_esp_idf.h b/esphome/components/i2c/i2c_bus_esp_idf.h index 84f4616967..c23f9f0c54 100644 --- a/esphome/components/i2c/i2c_bus_esp_idf.h +++ b/esphome/components/i2c/i2c_bus_esp_idf.h @@ -6,8 +6,7 @@ #include "i2c_bus.h" #include -namespace esphome { -namespace i2c { +namespace esphome::i2c { enum RecoveryCode { RECOVERY_FAILED_SCL_LOW, @@ -56,7 +55,6 @@ class IDFI2CBus : public InternalI2CBus, public Component { #endif }; -} // namespace i2c -} // namespace esphome +} // namespace esphome::i2c #endif // USE_ESP32 From 70e47f301d0dd936ce0d30241aa1427fbab02812 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 19:50:11 -0600 Subject: [PATCH 035/147] [ethernet] Use C++17 nested namespace syntax (#14246) --- esphome/components/ethernet/ethernet_component.cpp | 6 ++---- esphome/components/ethernet/ethernet_component.h | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/esphome/components/ethernet/ethernet_component.cpp b/esphome/components/ethernet/ethernet_component.cpp index fcd32223e4..f855bc89cc 100644 --- a/esphome/components/ethernet/ethernet_component.cpp +++ b/esphome/components/ethernet/ethernet_component.cpp @@ -19,8 +19,7 @@ #include #endif -namespace esphome { -namespace ethernet { +namespace esphome::ethernet { #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 4, 2) // work around IDF compile issue on P4 https://github.com/espressif/esp-idf/pull/15637 @@ -881,7 +880,6 @@ void EthernetComponent::write_phy_register_(esp_eth_mac_t *mac, PHYRegister regi #endif -} // namespace ethernet -} // namespace esphome +} // namespace esphome::ethernet #endif // USE_ESP32 diff --git a/esphome/components/ethernet/ethernet_component.h b/esphome/components/ethernet/ethernet_component.h index b4859c308d..1cd44d2b2c 100644 --- a/esphome/components/ethernet/ethernet_component.h +++ b/esphome/components/ethernet/ethernet_component.h @@ -15,8 +15,7 @@ #include "esp_mac.h" #include "esp_idf_version.h" -namespace esphome { -namespace ethernet { +namespace esphome::ethernet { #ifdef USE_ETHERNET_IP_STATE_LISTENERS /** Listener interface for Ethernet IP state changes. @@ -218,7 +217,6 @@ extern EthernetComponent *global_eth_component; extern "C" esp_eth_phy_t *esp_eth_phy_new_jl1101(const eth_phy_config_t *config); #endif -} // namespace ethernet -} // namespace esphome +} // namespace esphome::ethernet #endif // USE_ESP32 From 7d9d90d3f8c4b431b74ad197f9f354f9a4795f59 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 19:50:22 -0600 Subject: [PATCH 036/147] [cse7766] Use C++17 nested namespace syntax (#14247) --- esphome/components/cse7766/cse7766.cpp | 6 ++---- esphome/components/cse7766/cse7766.h | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/esphome/components/cse7766/cse7766.cpp b/esphome/components/cse7766/cse7766.cpp index 7ffdf757a0..806b79e19e 100644 --- a/esphome/components/cse7766/cse7766.cpp +++ b/esphome/components/cse7766/cse7766.cpp @@ -3,8 +3,7 @@ #include "esphome/core/helpers.h" #include "esphome/core/log.h" -namespace esphome { -namespace cse7766 { +namespace esphome::cse7766 { static const char *const TAG = "cse7766"; @@ -258,5 +257,4 @@ void CSE7766Component::dump_config() { this->check_uart_settings(4800, 1, uart::UART_CONFIG_PARITY_EVEN); } -} // namespace cse7766 -} // namespace esphome +} // namespace esphome::cse7766 diff --git a/esphome/components/cse7766/cse7766.h b/esphome/components/cse7766/cse7766.h index 66a4e04633..77b80dd824 100644 --- a/esphome/components/cse7766/cse7766.h +++ b/esphome/components/cse7766/cse7766.h @@ -5,8 +5,7 @@ #include "esphome/components/sensor/sensor.h" #include "esphome/components/uart/uart.h" -namespace esphome { -namespace cse7766 { +namespace esphome::cse7766 { static constexpr size_t CSE7766_RAW_DATA_SIZE = 24; @@ -49,5 +48,4 @@ class CSE7766Component : public Component, public uart::UARTDevice { uint16_t cf_pulses_last_{0}; }; -} // namespace cse7766 -} // namespace esphome +} // namespace esphome::cse7766 From ad2da0af52469c18b8741a60e6b4aa977415bf8c Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 23 Feb 2026 20:00:21 -0600 Subject: [PATCH 037/147] [network] Use C++17 nested namespace syntax (#14248) --- esphome/components/network/ip_address.h | 6 ++---- esphome/components/network/util.cpp | 6 ++---- esphome/components/network/util.h | 6 ++---- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/esphome/components/network/ip_address.h b/esphome/components/network/ip_address.h index b2a2c563e2..c0e7b2886c 100644 --- a/esphome/components/network/ip_address.h +++ b/esphome/components/network/ip_address.h @@ -37,8 +37,7 @@ using ip4_addr_t = in_addr; #include #endif -namespace esphome { -namespace network { +namespace esphome::network { /// Buffer size for IP address string (IPv6 max: 39 chars + null) static constexpr size_t IP_ADDRESS_BUFFER_SIZE = 40; @@ -187,6 +186,5 @@ struct IPAddress { using IPAddresses = std::array; -} // namespace network -} // namespace esphome +} // namespace esphome::network #endif diff --git a/esphome/components/network/util.cpp b/esphome/components/network/util.cpp index 5e741fd244..e397d77077 100644 --- a/esphome/components/network/util.cpp +++ b/esphome/components/network/util.cpp @@ -17,8 +17,7 @@ #include "esphome/components/modem/modem_component.h" #endif -namespace esphome { -namespace network { +namespace esphome::network { // The order of the components is important: WiFi should come after any possible main interfaces (it may be used as // an AP that use a previous interface for NAT). @@ -109,6 +108,5 @@ const char *get_use_address() { #endif } -} // namespace network -} // namespace esphome +} // namespace esphome::network #endif diff --git a/esphome/components/network/util.h b/esphome/components/network/util.h index 3dc12232aa..ae949ab0a8 100644 --- a/esphome/components/network/util.h +++ b/esphome/components/network/util.h @@ -4,8 +4,7 @@ #include #include "ip_address.h" -namespace esphome { -namespace network { +namespace esphome::network { /// Return whether the node is connected to the network (through wifi, eth, ...) bool is_connected(); @@ -15,6 +14,5 @@ bool is_disabled(); const char *get_use_address(); IPAddresses get_ip_addresses(); -} // namespace network -} // namespace esphome +} // namespace esphome::network #endif From abf7074518379503dec1a19dd46b8019c1d3a789 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 24 Feb 2026 08:27:48 -0500 Subject: [PATCH 038/147] [esp32] Improve ESP32-P4 engineering sample warning message (#14252) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/esp32/__init__.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 62367443da..a34747a183 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -790,8 +790,15 @@ def _detect_variant(value): engineering_sample = value.get(CONF_ENGINEERING_SAMPLE) if engineering_sample is None: _LOGGER.warning( - "No board specified for ESP32-P4. Defaulting to production silicon (rev3). " - "If you have an early engineering sample (pre-rev3), set 'engineering_sample: true'." + "No board specified for ESP32-P4. Defaulting to production silicon (rev3).\n" + "If you have an early engineering sample (pre-rev3), add this to your config:\n" + "\n" + " esp32:\n" + " engineering_sample: true\n" + "\n" + "To check your chip revision, look for 'chip revision: vX.Y' in the boot log.\n" + "Engineering samples will show a revision below v3.0.\n" + "The 'debug:' component also reports the revision (e.g. Revision: 100 = v1.0, 300 = v3.0)." ) elif engineering_sample: value[CONF_BOARD] = "esp32-p4-evboard" From 72263eda855c7ffee631a5281fe4c5c9549f4deb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Tue, 24 Feb 2026 14:31:58 +0100 Subject: [PATCH 039/147] [version] text sensor add option `hide_hash` to restore the pre-2026.1 behavior (#14251) Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- esphome/components/version/text_sensor.py | 11 +++++- .../version/version_text_sensor.cpp | 34 ++++++++++++++----- .../components/version/version_text_sensor.h | 2 ++ esphome/const.py | 1 + tests/components/version/common.yaml | 15 +++++++- 5 files changed, 52 insertions(+), 11 deletions(-) diff --git a/esphome/components/version/text_sensor.py b/esphome/components/version/text_sensor.py index ba8c493d4b..a55e18a5a7 100644 --- a/esphome/components/version/text_sensor.py +++ b/esphome/components/version/text_sensor.py @@ -1,7 +1,12 @@ import esphome.codegen as cg from esphome.components import text_sensor import esphome.config_validation as cv -from esphome.const import CONF_HIDE_TIMESTAMP, ENTITY_CATEGORY_DIAGNOSTIC, ICON_NEW_BOX +from esphome.const import ( + CONF_HIDE_HASH, + CONF_HIDE_TIMESTAMP, + ENTITY_CATEGORY_DIAGNOSTIC, + ICON_NEW_BOX, +) version_ns = cg.esphome_ns.namespace("version") VersionTextSensor = version_ns.class_( @@ -16,6 +21,9 @@ CONFIG_SCHEMA = ( .extend( { cv.GenerateID(): cv.declare_id(VersionTextSensor), + # Hide the config hash suffix and restore the pre-2026.1 + # version text format when set to true. + cv.Optional(CONF_HIDE_HASH, default=False): cv.boolean, cv.Optional(CONF_HIDE_TIMESTAMP, default=False): cv.boolean, } ) @@ -26,4 +34,5 @@ CONFIG_SCHEMA = ( async def to_code(config): var = await text_sensor.new_text_sensor(config) await cg.register_component(var, config) + cg.add(var.set_hide_hash(config[CONF_HIDE_HASH])) cg.add(var.set_hide_timestamp(config[CONF_HIDE_TIMESTAMP])) diff --git a/esphome/components/version/version_text_sensor.cpp b/esphome/components/version/version_text_sensor.cpp index 4a08001cc4..8aec98d2da 100644 --- a/esphome/components/version/version_text_sensor.cpp +++ b/esphome/components/version/version_text_sensor.cpp @@ -1,37 +1,53 @@ #include "version_text_sensor.h" #include "esphome/core/application.h" #include "esphome/core/build_info_data.h" -#include "esphome/core/log.h" -#include "esphome/core/version.h" #include "esphome/core/helpers.h" +#include "esphome/core/log.h" #include "esphome/core/progmem.h" +#include "esphome/core/version.h" namespace esphome::version { static const char *const TAG = "version.text_sensor"; void VersionTextSensor::setup() { - static const char PREFIX[] PROGMEM = ESPHOME_VERSION " (config hash 0x"; + static const char HASH_PREFIX[] PROGMEM = ESPHOME_VERSION " (config hash 0x"; + static const char VERSION_PREFIX[] PROGMEM = ESPHOME_VERSION; static const char BUILT_STR[] PROGMEM = ", built "; - // Buffer size: PREFIX + 8 hex chars + BUILT_STR + BUILD_TIME_STR_SIZE + ")" + null - constexpr size_t buf_size = sizeof(PREFIX) + 8 + sizeof(BUILT_STR) + esphome::Application::BUILD_TIME_STR_SIZE + 2; + + // Buffer size: HASH_PREFIX + 8 hex chars + BUILT_STR + BUILD_TIME_STR_SIZE + ")" + null + constexpr size_t buf_size = + sizeof(HASH_PREFIX) + 8 + sizeof(BUILT_STR) + esphome::Application::BUILD_TIME_STR_SIZE + 2; char version_str[buf_size]; - ESPHOME_strncpy_P(version_str, PREFIX, sizeof(version_str)); + // hide_hash restores the pre-2026.1 base format by omitting + // the " (config hash 0x...)" suffix entirely. + if (this->hide_hash_) { + ESPHOME_strncpy_P(version_str, VERSION_PREFIX, sizeof(version_str)); + } else { + ESPHOME_strncpy_P(version_str, HASH_PREFIX, sizeof(version_str)); - size_t len = strlen(version_str); - snprintf(version_str + len, sizeof(version_str) - len, "%08" PRIx32, App.get_config_hash()); + size_t len = strlen(version_str); + snprintf(version_str + len, sizeof(version_str) - len, "%08" PRIx32, App.get_config_hash()); + } + // Keep hide_timestamp behavior independent from hide_hash so all + // combinations remain available to users. if (!this->hide_timestamp_) { size_t len = strlen(version_str); ESPHOME_strncat_P(version_str, BUILT_STR, sizeof(version_str) - len - 1); ESPHOME_strncat_P(version_str, ESPHOME_BUILD_TIME_STR, sizeof(version_str) - strlen(version_str) - 1); } - strncat(version_str, ")", sizeof(version_str) - strlen(version_str) - 1); + // The closing parenthesis is part of the config-hash suffix and must + // only be appended when that suffix is present. + if (!this->hide_hash_) { + strncat(version_str, ")", sizeof(version_str) - strlen(version_str) - 1); + } version_str[sizeof(version_str) - 1] = '\0'; this->publish_state(version_str); } +void VersionTextSensor::set_hide_hash(bool hide_hash) { this->hide_hash_ = hide_hash; } void VersionTextSensor::set_hide_timestamp(bool hide_timestamp) { this->hide_timestamp_ = hide_timestamp; } void VersionTextSensor::dump_config() { LOG_TEXT_SENSOR("", "Version Text Sensor", this); } diff --git a/esphome/components/version/version_text_sensor.h b/esphome/components/version/version_text_sensor.h index 6153c5dd7c..fec898ae03 100644 --- a/esphome/components/version/version_text_sensor.h +++ b/esphome/components/version/version_text_sensor.h @@ -7,11 +7,13 @@ namespace esphome::version { class VersionTextSensor : public text_sensor::TextSensor, public Component { public: + void set_hide_hash(bool hide_hash); void set_hide_timestamp(bool hide_timestamp); void setup() override; void dump_config() override; protected: + bool hide_hash_{false}; bool hide_timestamp_{false}; }; diff --git a/esphome/const.py b/esphome/const.py index 0b1037d091..1611aeb101 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -463,6 +463,7 @@ CONF_HEAT_OVERRUN = "heat_overrun" CONF_HEATER = "heater" CONF_HEIGHT = "height" CONF_HIDDEN = "hidden" +CONF_HIDE_HASH = "hide_hash" CONF_HIDE_TIMESTAMP = "hide_timestamp" CONF_HIGH = "high" CONF_HIGH_VOLTAGE_REFERENCE = "high_voltage_reference" diff --git a/tests/components/version/common.yaml b/tests/components/version/common.yaml index 7713afc37c..f9ff778e14 100644 --- a/tests/components/version/common.yaml +++ b/tests/components/version/common.yaml @@ -1,3 +1,16 @@ text_sensor: - platform: version - name: "ESPHome Version" + name: "ESPHome Version Full" + + - platform: version + name: "ESPHome Version No Timestamp" + hide_timestamp: true + + - platform: version + name: "ESPHome Version No Hash" + hide_hash: true + + - platform: version + name: "ESPHome Version Shortest" + hide_timestamp: true + hide_hash: true From 4abbed0cd4ee94845cee7034a1d06d9a279167a3 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 25 Feb 2026 00:33:33 +1100 Subject: [PATCH 040/147] [mipi_dsi] Allow transform disable; fix warnings (#14216) --- esphome/components/mipi_dsi/display.py | 24 +++++++++++-------- esphome/components/mipi_dsi/mipi_dsi.cpp | 4 ++-- esphome/components/mipi_dsi/mipi_dsi.h | 10 ++++---- .../mipi_dsi/fixtures/mipi_dsi.yaml | 17 +++++++++++++ .../mipi_dsi/test_mipi_dsi_config.py | 3 ++- 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/esphome/components/mipi_dsi/display.py b/esphome/components/mipi_dsi/display.py index de3791b3a4..85bfad7f1a 100644 --- a/esphome/components/mipi_dsi/display.py +++ b/esphome/components/mipi_dsi/display.py @@ -39,6 +39,7 @@ import esphome.config_validation as cv from esphome.const import ( CONF_COLOR_ORDER, CONF_DIMENSIONS, + CONF_DISABLED, CONF_ENABLE_PIN, CONF_ID, CONF_INIT_SEQUENCE, @@ -88,14 +89,17 @@ COLOR_DEPTHS = { def model_schema(config): model = MODELS[config[CONF_MODEL].upper()] model.defaults[CONF_SWAP_XY] = cv.UNDEFINED - transform = cv.Schema( - { - cv.Required(CONF_MIRROR_X): cv.boolean, - cv.Required(CONF_MIRROR_Y): cv.boolean, - cv.Optional(CONF_SWAP_XY): cv.invalid( - "Axis swapping not supported by DSI displays" - ), - } + transform = cv.Any( + cv.Schema( + { + cv.Required(CONF_MIRROR_X): cv.boolean, + cv.Required(CONF_MIRROR_Y): cv.boolean, + cv.Optional(CONF_SWAP_XY): cv.invalid( + "Axis swapping not supported by DSI displays" + ), + } + ), + cv.one_of(CONF_DISABLED, lower=True), ) # CUSTOM model will need to provide a custom init sequence iseqconf = ( @@ -199,9 +203,9 @@ async def to_code(config): cg.add(var.set_vsync_pulse_width(config[CONF_VSYNC_PULSE_WIDTH])) cg.add(var.set_vsync_back_porch(config[CONF_VSYNC_BACK_PORCH])) cg.add(var.set_vsync_front_porch(config[CONF_VSYNC_FRONT_PORCH])) - cg.add(var.set_pclk_frequency(int(config[CONF_PCLK_FREQUENCY] / 1e6))) + cg.add(var.set_pclk_frequency(config[CONF_PCLK_FREQUENCY] / 1.0e6)) cg.add(var.set_lanes(int(config[CONF_LANES]))) - cg.add(var.set_lane_bit_rate(int(config[CONF_LANE_BIT_RATE] / 1e6))) + cg.add(var.set_lane_bit_rate(config[CONF_LANE_BIT_RATE] / 1.0e6)) if reset_pin := config.get(CONF_RESET_PIN): reset = await cg.gpio_pin_expression(reset_pin) cg.add(var.set_reset_pin(reset)) diff --git a/esphome/components/mipi_dsi/mipi_dsi.cpp b/esphome/components/mipi_dsi/mipi_dsi.cpp index 18cafab684..4d45cfb799 100644 --- a/esphome/components/mipi_dsi/mipi_dsi.cpp +++ b/esphome/components/mipi_dsi/mipi_dsi.cpp @@ -374,7 +374,7 @@ void MIPI_DSI::dump_config() { "\n Swap X/Y: %s" "\n Rotation: %d degrees" "\n DSI Lanes: %u" - "\n Lane Bit Rate: %uMbps" + "\n Lane Bit Rate: %.0fMbps" "\n HSync Pulse Width: %u" "\n HSync Back Porch: %u" "\n HSync Front Porch: %u" @@ -385,7 +385,7 @@ void MIPI_DSI::dump_config() { "\n Display Pixel Mode: %d bit" "\n Color Order: %s" "\n Invert Colors: %s" - "\n Pixel Clock: %dMHz", + "\n Pixel Clock: %.1fMHz", this->model_, this->width_, this->height_, YESNO(this->madctl_ & (MADCTL_XFLIP | MADCTL_MX)), YESNO(this->madctl_ & (MADCTL_YFLIP | MADCTL_MY)), YESNO(this->madctl_ & MADCTL_MV), this->rotation_, this->lanes_, this->lane_bit_rate_, this->hsync_pulse_width_, this->hsync_back_porch_, diff --git a/esphome/components/mipi_dsi/mipi_dsi.h b/esphome/components/mipi_dsi/mipi_dsi.h index 1cffe3b178..6e27912aa5 100644 --- a/esphome/components/mipi_dsi/mipi_dsi.h +++ b/esphome/components/mipi_dsi/mipi_dsi.h @@ -47,7 +47,7 @@ class MIPI_DSI : public display::Display { void set_reset_pin(GPIOPin *reset_pin) { this->reset_pin_ = reset_pin; } void set_enable_pins(std::vector enable_pins) { this->enable_pins_ = std::move(enable_pins); } - void set_pclk_frequency(uint32_t pclk_frequency) { this->pclk_frequency_ = pclk_frequency; } + void set_pclk_frequency(float pclk_frequency) { this->pclk_frequency_ = pclk_frequency; } int get_width_internal() override { return this->width_; } int get_height_internal() override { return this->height_; } void set_hsync_back_porch(uint16_t hsync_back_porch) { this->hsync_back_porch_ = hsync_back_porch; } @@ -58,7 +58,7 @@ class MIPI_DSI : public display::Display { void set_vsync_front_porch(uint16_t vsync_front_porch) { this->vsync_front_porch_ = vsync_front_porch; } void set_init_sequence(const std::vector &init_sequence) { this->init_sequence_ = init_sequence; } void set_model(const char *model) { this->model_ = model; } - void set_lane_bit_rate(uint16_t lane_bit_rate) { this->lane_bit_rate_ = lane_bit_rate; } + void set_lane_bit_rate(float lane_bit_rate) { this->lane_bit_rate_ = lane_bit_rate; } void set_lanes(uint8_t lanes) { this->lanes_ = lanes; } void set_madctl(uint8_t madctl) { this->madctl_ = madctl; } @@ -95,9 +95,9 @@ class MIPI_DSI : public display::Display { uint16_t vsync_front_porch_ = 10; const char *model_{"Unknown"}; std::vector init_sequence_{}; - uint16_t pclk_frequency_ = 16; // in MHz - uint16_t lane_bit_rate_{1500}; // in Mbps - uint8_t lanes_{2}; // 1, 2, 3 or 4 lanes + float pclk_frequency_ = 16; // in MHz + float lane_bit_rate_{1500}; // in Mbps + uint8_t lanes_{2}; // 1, 2, 3 or 4 lanes bool invert_colors_{}; display::ColorOrder color_mode_{display::COLOR_ORDER_BGR}; diff --git a/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml b/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml index 6de2bd5a77..6f76dcb1d1 100644 --- a/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml +++ b/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml @@ -22,6 +22,23 @@ display: id: p4_86 model: "WAVESHARE-P4-86-PANEL" rotation: 180 + - platform: mipi_dsi + model: custom + id: custom_id + dimensions: + width: 400 + height: 1280 + hsync_back_porch: 40 + hsync_pulse_width: 30 + hsync_front_porch: 40 + vsync_back_porch: 20 + vsync_pulse_width: 10 + vsync_front_porch: 20 + pclk_frequency: 48Mhz + lane_bit_rate: 1.2Gbps + rotation: 180 + transform: disabled + init_sequence: i2c: sda: GPIO7 scl: GPIO8 diff --git a/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py b/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py index d465a8c81b..92f56b5451 100644 --- a/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py +++ b/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py @@ -123,7 +123,8 @@ def test_code_generation( in main_cpp ) assert "set_init_sequence({224, 1, 0, 225, 1, 147, 226, 1," in main_cpp - assert "p4_nano->set_lane_bit_rate(1500);" in main_cpp + assert "p4_nano->set_lane_bit_rate(1500.0f);" in main_cpp assert "p4_nano->set_rotation(display::DISPLAY_ROTATION_90_DEGREES);" in main_cpp assert "p4_86->set_rotation(display::DISPLAY_ROTATION_0_DEGREES);" in main_cpp + assert "custom_id->set_rotation(display::DISPLAY_ROTATION_180_DEGREES);" in main_cpp # assert "backlight_id = new light::LightState(mipi_dsi_dsibacklight_id);" in main_cpp From 6554ad7c7ef933a094b31583bb2dd285831bc8b3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 24 Feb 2026 12:08:51 -0600 Subject: [PATCH 041/147] [core] Prevent inlining of mark_matching_items_removed_locked_ on Thumb-1 (#14256) --- esphome/core/scheduler.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esphome/core/scheduler.h b/esphome/core/scheduler.h index 16b0ded312..ed457b87f6 100644 --- a/esphome/core/scheduler.h +++ b/esphome/core/scheduler.h @@ -496,9 +496,9 @@ class Scheduler { // name_type determines matching: STATIC_STRING uses static_name, others use hash_or_id // Returns the number of items marked for removal // IMPORTANT: Must be called with scheduler lock held - size_t mark_matching_items_removed_locked_(std::vector> &container, - Component *component, NameType name_type, const char *static_name, - uint32_t hash_or_id, SchedulerItem::Type type, bool match_retry) { + __attribute__((noinline)) size_t mark_matching_items_removed_locked_( + std::vector> &container, Component *component, NameType name_type, + const char *static_name, uint32_t hash_or_id, SchedulerItem::Type type, bool match_retry) { size_t count = 0; for (auto &item : container) { // Skip nullptr items (can happen in defer_queue_ when items are being processed) From fe3c2ba5553f4d07328d1c5b1e927ca0cbea25e1 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:15:22 -0500 Subject: [PATCH 042/147] [http_request.ota] Percent-encode credentials in URL (#14257) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../http_request/ota/ota_http_request.cpp | 22 +++++++++++++++++++ .../http_request/ota/ota_http_request.h | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/esphome/components/http_request/ota/ota_http_request.cpp b/esphome/components/http_request/ota/ota_http_request.cpp index d77a768211..0db3a50b47 100644 --- a/esphome/components/http_request/ota/ota_http_request.cpp +++ b/esphome/components/http_request/ota/ota_http_request.cpp @@ -1,5 +1,7 @@ #include "ota_http_request.h" +#include + #include "esphome/core/application.h" #include "esphome/core/defines.h" #include "esphome/core/log.h" @@ -209,6 +211,26 @@ uint8_t OtaHttpRequestComponent::do_ota_() { return ota::OTA_RESPONSE_OK; } +// URL-encode characters that are not unreserved per RFC 3986 section 2.3. +// This is needed for embedding userinfo (username/password) in URLs safely. +static std::string url_encode(const std::string &str) { + std::string result; + result.reserve(str.size()); + for (char c : str) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || c == '.' || c == '~') { + result += c; + } else { + result += '%'; + result += format_hex_pretty_char((static_cast(c) >> 4) & 0x0F); + result += format_hex_pretty_char(static_cast(c) & 0x0F); + } + } + return result; +} + +void OtaHttpRequestComponent::set_password(const std::string &password) { this->password_ = url_encode(password); } +void OtaHttpRequestComponent::set_username(const std::string &username) { this->username_ = url_encode(username); } + std::string OtaHttpRequestComponent::get_url_with_auth_(const std::string &url) { if (this->username_.empty() || this->password_.empty()) { return url; diff --git a/esphome/components/http_request/ota/ota_http_request.h b/esphome/components/http_request/ota/ota_http_request.h index 8735189e99..e3f1a4aa90 100644 --- a/esphome/components/http_request/ota/ota_http_request.h +++ b/esphome/components/http_request/ota/ota_http_request.h @@ -29,9 +29,9 @@ class OtaHttpRequestComponent : public ota::OTAComponent, public Parentedmd5_expected_ = md5; } - void set_password(const std::string &password) { this->password_ = password; } + void set_password(const std::string &password); void set_url(const std::string &url); - void set_username(const std::string &username) { this->username_ = username; } + void set_username(const std::string &username); std::string md5_computed() { return this->md5_computed_; } std::string md5_expected() { return this->md5_expected_; } From af00d601be022c0ba3b5d9656c9906c95b4edb64 Mon Sep 17 00:00:00 2001 From: Andrew Rankin Date: Tue, 24 Feb 2026 16:19:13 -0500 Subject: [PATCH 043/147] [esp32_ble_server] add max_clients option for multi-client support (#14239) --- .../components/esp32_ble_server/__init__.py | 20 +++++++++++++++++++ .../esp32_ble_server/ble_server.cpp | 11 +++++++++- .../components/esp32_ble_server/ble_server.h | 4 ++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/esphome/components/esp32_ble_server/__init__.py b/esphome/components/esp32_ble_server/__init__.py index cb494ed1bc..b08e791e7e 100644 --- a/esphome/components/esp32_ble_server/__init__.py +++ b/esphome/components/esp32_ble_server/__init__.py @@ -24,6 +24,7 @@ from esphome.const import ( __version__ as ESPHOME_VERSION, ) from esphome.core import CORE +import esphome.final_validate as fv from esphome.schema_extractors import SCHEMA_EXTRACT AUTO_LOAD = ["esp32_ble", "bytebuffer"] @@ -42,6 +43,7 @@ CONF_FIRMWARE_VERSION = "firmware_version" CONF_INDICATE = "indicate" CONF_MANUFACTURER = "manufacturer" CONF_MANUFACTURER_DATA = "manufacturer_data" +CONF_MAX_CLIENTS = "max_clients" CONF_ON_WRITE = "on_write" CONF_READ = "read" CONF_STRING = "string" @@ -287,6 +289,22 @@ def create_device_information_service(config): def final_validate_config(config): + # Validate max_clients does not exceed esp32_ble max_connections + max_clients = config[CONF_MAX_CLIENTS] + if max_clients > 1: + full_config = fv.full_config.get() + ble_config = full_config.get("esp32_ble", {}) + max_connections = ble_config.get( + "max_connections", esp32_ble.DEFAULT_MAX_CONNECTIONS + ) + if max_clients > max_connections: + raise cv.Invalid( + f"'max_clients' ({max_clients}) cannot exceed esp32_ble " + f"'max_connections' ({max_connections}). " + f"Please set 'max_connections: {max_clients}' in the " + f"'esp32_ble' component." + ) + # Check if all characteristics that require notifications have the notify property set for char_id in CORE.data.get(DOMAIN, {}).get(KEY_NOTIFY_REQUIRED, set()): # Look for the characteristic in the configuration @@ -428,6 +446,7 @@ CONFIG_SCHEMA = cv.Schema( cv.Optional(CONF_MODEL): value_schema("string", templatable=False), cv.Optional(CONF_FIRMWARE_VERSION): value_schema("string", templatable=False), cv.Optional(CONF_MANUFACTURER_DATA): cv.Schema([cv.uint8_t]), + cv.Optional(CONF_MAX_CLIENTS, default=1): cv.int_range(min=1, max=9), cv.Optional(CONF_SERVICES, default=[]): cv.ensure_list(SERVICE_SCHEMA), cv.Optional(CONF_ON_CONNECT): automation.validate_automation(single=True), cv.Optional(CONF_ON_DISCONNECT): automation.validate_automation(single=True), @@ -552,6 +571,7 @@ async def to_code(config): esp32_ble.register_ble_status_event_handler(parent, var) cg.add(var.set_parent(parent)) cg.add(parent.advertising_set_appearance(config[CONF_APPEARANCE])) + cg.add(var.set_max_clients(config[CONF_MAX_CLIENTS])) if CONF_MANUFACTURER_DATA in config: cg.add(var.set_manufacturer_data(config[CONF_MANUFACTURER_DATA])) for service_config in config[CONF_SERVICES]: diff --git a/esphome/components/esp32_ble_server/ble_server.cpp b/esphome/components/esp32_ble_server/ble_server.cpp index 2c13a8ac36..f292cf8722 100644 --- a/esphome/components/esp32_ble_server/ble_server.cpp +++ b/esphome/components/esp32_ble_server/ble_server.cpp @@ -175,6 +175,10 @@ void BLEServer::gatts_event_handler(esp_gatts_cb_event_t event, esp_gatt_if_t ga case ESP_GATTS_CONNECT_EVT: { ESP_LOGD(TAG, "BLE Client connected"); this->add_client_(param->connect.conn_id); + // Resume advertising so additional clients can discover and connect + if (this->client_count_ < this->max_clients_) { + this->parent_->advertising_start(); + } this->dispatch_callbacks_(CallbackType::ON_CONNECT, param->connect.conn_id); break; } @@ -241,7 +245,12 @@ void BLEServer::ble_before_disabled_event_handler() { float BLEServer::get_setup_priority() const { return setup_priority::AFTER_BLUETOOTH + 10; } -void BLEServer::dump_config() { ESP_LOGCONFIG(TAG, "ESP32 BLE Server:"); } +void BLEServer::dump_config() { + ESP_LOGCONFIG(TAG, + "ESP32 BLE Server:\n" + " Max clients: %u", + this->max_clients_); +} BLEServer *global_ble_server = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) diff --git a/esphome/components/esp32_ble_server/ble_server.h b/esphome/components/esp32_ble_server/ble_server.h index 6fa86dd67f..ff7e0044e4 100644 --- a/esphome/components/esp32_ble_server/ble_server.h +++ b/esphome/components/esp32_ble_server/ble_server.h @@ -39,6 +39,9 @@ class BLEServer : public Component, public GATTsEventHandler, public BLEStatusEv this->restart_advertising_(); } + void set_max_clients(uint8_t max_clients) { this->max_clients_ = max_clients; } + uint8_t get_max_clients() const { return this->max_clients_; } + BLEService *create_service(ESPBTUUID uuid, bool advertise = false, uint16_t num_handles = 15); void remove_service(ESPBTUUID uuid, uint8_t inst_id = 0); BLEService *get_service(ESPBTUUID uuid, uint8_t inst_id = 0); @@ -95,6 +98,7 @@ class BLEServer : public Component, public GATTsEventHandler, public BLEStatusEv uint16_t clients_[USE_ESP32_BLE_MAX_CONNECTIONS]{}; uint8_t client_count_{0}; + uint8_t max_clients_{1}; std::vector services_{}; std::vector services_to_start_{}; BLEService *device_information_service_{}; From cca4777f6458c1bf41e2cdd79f91aafe699e9c08 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 24 Feb 2026 17:51:01 -0600 Subject: [PATCH 044/147] [web_server_idf] Pass std::function by rvalue reference (#14262) --- esphome/components/web_server_idf/multipart.h | 4 ++-- esphome/components/web_server_idf/web_server_idf.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/esphome/components/web_server_idf/multipart.h b/esphome/components/web_server_idf/multipart.h index cb1e0ecd1d..8b94b0491e 100644 --- a/esphome/components/web_server_idf/multipart.h +++ b/esphome/components/web_server_idf/multipart.h @@ -33,8 +33,8 @@ class MultipartReader { ~MultipartReader(); // Set callbacks for handling data - void set_data_callback(DataCallback callback) { data_callback_ = std::move(callback); } - void set_part_complete_callback(PartCompleteCallback callback) { part_complete_callback_ = std::move(callback); } + void set_data_callback(DataCallback &&callback) { data_callback_ = std::move(callback); } + void set_part_complete_callback(PartCompleteCallback &&callback) { part_complete_callback_ = std::move(callback); } // Parse incoming data size_t parse(const char *data, size_t len); diff --git a/esphome/components/web_server_idf/web_server_idf.h b/esphome/components/web_server_idf/web_server_idf.h index 76ddfa35fd..9d81d89ec7 100644 --- a/esphome/components/web_server_idf/web_server_idf.h +++ b/esphome/components/web_server_idf/web_server_idf.h @@ -204,7 +204,7 @@ class AsyncWebServer { ~AsyncWebServer() { this->end(); } // NOLINTNEXTLINE(readability-identifier-naming) - void onNotFound(std::function fn) { on_not_found_ = std::move(fn); } + void onNotFound(std::function &&fn) { on_not_found_ = std::move(fn); } void begin(); void end(); @@ -327,7 +327,7 @@ class AsyncEventSource : public AsyncWebHandler { // NOLINTNEXTLINE(readability-identifier-naming) void handleRequest(AsyncWebServerRequest *request) override; // NOLINTNEXTLINE(readability-identifier-naming) - void onConnect(connect_handler_t cb) { this->on_connect_ = std::move(cb); } + void onConnect(connect_handler_t &&cb) { this->on_connect_ = std::move(cb); } void try_send_nodefer(const char *message, const char *event = nullptr, uint32_t id = 0, uint32_t reconnect = 0); void deferrable_send_state(void *source, const char *event_type, message_generator_t *message_generator); From 4dc6b12ec51d9e8610ca5be0fc77ebf9c3f39da3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 24 Feb 2026 17:56:43 -0600 Subject: [PATCH 045/147] [api] Pass std::function by rvalue reference in state subscriptions (#14261) --- esphome/components/api/api_server.cpp | 20 ++++++++++---------- esphome/components/api/api_server.h | 20 ++++++++++---------- esphome/components/api/user_services.h | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/esphome/components/api/api_server.cpp b/esphome/components/api/api_server.cpp index 5b096788f5..0352d7347b 100644 --- a/esphome/components/api/api_server.cpp +++ b/esphome/components/api/api_server.cpp @@ -433,8 +433,8 @@ void APIServer::handle_action_response(uint32_t call_id, bool success, StringRef #ifdef USE_API_HOMEASSISTANT_STATES // Helper to add subscription (reduces duplication) -void APIServer::add_state_subscription_(const char *entity_id, const char *attribute, std::function f, - bool once) { +void APIServer::add_state_subscription_(const char *entity_id, const char *attribute, + std::function &&f, bool once) { this->state_subs_.push_back(HomeAssistantStateSubscription{ .entity_id = entity_id, .attribute = attribute, .callback = std::move(f), .once = once, // entity_id_dynamic_storage and attribute_dynamic_storage remain nullptr (no heap allocation) @@ -443,7 +443,7 @@ void APIServer::add_state_subscription_(const char *entity_id, const char *attri // Helper to add subscription with heap-allocated strings (reduces duplication) void APIServer::add_state_subscription_(std::string entity_id, optional attribute, - std::function f, bool once) { + std::function &&f, bool once) { HomeAssistantStateSubscription sub; // Allocate heap storage for the strings sub.entity_id_dynamic_storage = std::make_unique(std::move(entity_id)); @@ -463,29 +463,29 @@ void APIServer::add_state_subscription_(std::string entity_id, optional f) { + std::function &&f) { this->add_state_subscription_(entity_id, attribute, std::move(f), false); } void APIServer::get_home_assistant_state(const char *entity_id, const char *attribute, - std::function f) { + std::function &&f) { this->add_state_subscription_(entity_id, attribute, std::move(f), true); } // std::string overload with StringRef callback (zero-allocation callback) void APIServer::subscribe_home_assistant_state(std::string entity_id, optional attribute, - std::function f) { + std::function &&f) { this->add_state_subscription_(std::move(entity_id), std::move(attribute), std::move(f), false); } void APIServer::get_home_assistant_state(std::string entity_id, optional attribute, - std::function f) { + std::function &&f) { this->add_state_subscription_(std::move(entity_id), std::move(attribute), std::move(f), true); } // Legacy helper: wraps std::string callback and delegates to StringRef version void APIServer::add_state_subscription_(std::string entity_id, optional attribute, - std::function f, bool once) { + std::function &&f, bool once) { // Wrap callback to convert StringRef -> std::string, then delegate this->add_state_subscription_(std::move(entity_id), std::move(attribute), std::function([f = std::move(f)](StringRef state) { f(state.str()); }), @@ -494,12 +494,12 @@ void APIServer::add_state_subscription_(std::string entity_id, optional attribute, - std::function f) { + std::function &&f) { this->add_state_subscription_(std::move(entity_id), std::move(attribute), std::move(f), false); } void APIServer::get_home_assistant_state(std::string entity_id, optional attribute, - std::function f) { + std::function &&f) { this->add_state_subscription_(std::move(entity_id), std::move(attribute), std::move(f), true); } diff --git a/esphome/components/api/api_server.h b/esphome/components/api/api_server.h index fed29016b3..3abf68358c 100644 --- a/esphome/components/api/api_server.h +++ b/esphome/components/api/api_server.h @@ -201,20 +201,20 @@ class APIServer : public Component, }; // New const char* overload (for internal components - zero allocation) - void subscribe_home_assistant_state(const char *entity_id, const char *attribute, std::function f); - void get_home_assistant_state(const char *entity_id, const char *attribute, std::function f); + void subscribe_home_assistant_state(const char *entity_id, const char *attribute, std::function &&f); + void get_home_assistant_state(const char *entity_id, const char *attribute, std::function &&f); // std::string overload with StringRef callback (for custom_api_device.h with zero-allocation callback) void subscribe_home_assistant_state(std::string entity_id, optional attribute, - std::function f); + std::function &&f); void get_home_assistant_state(std::string entity_id, optional attribute, - std::function f); + std::function &&f); // Legacy std::string overload (for custom_api_device.h - converts StringRef to std::string for callback) void subscribe_home_assistant_state(std::string entity_id, optional attribute, - std::function f); + std::function &&f); void get_home_assistant_state(std::string entity_id, optional attribute, - std::function f); + std::function &&f); const std::vector &get_state_subs() const; #endif @@ -241,13 +241,13 @@ class APIServer : public Component, #endif // USE_API_NOISE #ifdef USE_API_HOMEASSISTANT_STATES // Helper methods to reduce code duplication - void add_state_subscription_(const char *entity_id, const char *attribute, std::function f, - bool once); - void add_state_subscription_(std::string entity_id, optional attribute, std::function f, + void add_state_subscription_(const char *entity_id, const char *attribute, std::function &&f, bool once); + void add_state_subscription_(std::string entity_id, optional attribute, + std::function &&f, bool once); // Legacy helper: wraps std::string callback and delegates to StringRef version void add_state_subscription_(std::string entity_id, optional attribute, - std::function f, bool once); + std::function &&f, bool once); #endif // USE_API_HOMEASSISTANT_STATES // No explicit close() needed — listen sockets have no active connections on // failure/shutdown. Destructor handles fd cleanup (close or abort per platform). diff --git a/esphome/components/api/user_services.h b/esphome/components/api/user_services.h index 0fc529108c..d1b8a6ef0d 100644 --- a/esphome/components/api/user_services.h +++ b/esphome/components/api/user_services.h @@ -230,7 +230,7 @@ template class APIRespondAction : public Action { void set_is_optional_mode(bool is_optional) { this->is_optional_mode_ = is_optional; } #ifdef USE_API_USER_DEFINED_ACTION_RESPONSES_JSON - void set_data(std::function func) { + void set_data(std::function &&func) { this->json_builder_ = std::move(func); this->has_data_ = true; } From 08dc487b5b668f1dbf4ec6573aceca2de0d1fdd8 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 24 Feb 2026 18:08:07 -0600 Subject: [PATCH 046/147] [core] Pass std::function by rvalue reference in scheduler (#14260) --- esphome/core/scheduler.cpp | 15 ++++++++------- esphome/core/scheduler.h | 18 +++++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/esphome/core/scheduler.cpp b/esphome/core/scheduler.cpp index e4e0751e10..674d70abcf 100644 --- a/esphome/core/scheduler.cpp +++ b/esphome/core/scheduler.cpp @@ -135,7 +135,7 @@ bool Scheduler::is_retry_cancelled_locked_(Component *component, NameType name_t // name_type determines storage type: STATIC_STRING uses static_name, others use hash_or_id void HOT Scheduler::set_timer_common_(Component *component, SchedulerItem::Type type, NameType name_type, const char *static_name, uint32_t hash_or_id, uint32_t delay, - std::function func, bool is_retry, bool skip_cancel) { + std::function &&func, bool is_retry, bool skip_cancel) { if (delay == SCHEDULER_DONT_RUN) { // Still need to cancel existing timer if we have a name/id if (!skip_cancel) { @@ -216,17 +216,18 @@ void HOT Scheduler::set_timer_common_(Component *component, SchedulerItem::Type target->push_back(std::move(item)); } -void HOT Scheduler::set_timeout(Component *component, const char *name, uint32_t timeout, std::function func) { +void HOT Scheduler::set_timeout(Component *component, const char *name, uint32_t timeout, + std::function &&func) { this->set_timer_common_(component, SchedulerItem::TIMEOUT, NameType::STATIC_STRING, name, 0, timeout, std::move(func)); } void HOT Scheduler::set_timeout(Component *component, const std::string &name, uint32_t timeout, - std::function func) { + std::function &&func) { this->set_timer_common_(component, SchedulerItem::TIMEOUT, NameType::HASHED_STRING, nullptr, fnv1a_hash(name), timeout, std::move(func)); } -void HOT Scheduler::set_timeout(Component *component, uint32_t id, uint32_t timeout, std::function func) { +void HOT Scheduler::set_timeout(Component *component, uint32_t id, uint32_t timeout, std::function &&func) { this->set_timer_common_(component, SchedulerItem::TIMEOUT, NameType::NUMERIC_ID, nullptr, id, timeout, std::move(func)); } @@ -240,17 +241,17 @@ bool HOT Scheduler::cancel_timeout(Component *component, uint32_t id) { return this->cancel_item_(component, NameType::NUMERIC_ID, nullptr, id, SchedulerItem::TIMEOUT); } void HOT Scheduler::set_interval(Component *component, const std::string &name, uint32_t interval, - std::function func) { + std::function &&func) { this->set_timer_common_(component, SchedulerItem::INTERVAL, NameType::HASHED_STRING, nullptr, fnv1a_hash(name), interval, std::move(func)); } void HOT Scheduler::set_interval(Component *component, const char *name, uint32_t interval, - std::function func) { + std::function &&func) { this->set_timer_common_(component, SchedulerItem::INTERVAL, NameType::STATIC_STRING, name, 0, interval, std::move(func)); } -void HOT Scheduler::set_interval(Component *component, uint32_t id, uint32_t interval, std::function func) { +void HOT Scheduler::set_interval(Component *component, uint32_t id, uint32_t interval, std::function &&func) { this->set_timer_common_(component, SchedulerItem::INTERVAL, NameType::NUMERIC_ID, nullptr, id, interval, std::move(func)); } diff --git a/esphome/core/scheduler.h b/esphome/core/scheduler.h index ed457b87f6..b6a8336606 100644 --- a/esphome/core/scheduler.h +++ b/esphome/core/scheduler.h @@ -33,7 +33,7 @@ class Scheduler { // std::string overload - deprecated, use const char* or uint32_t instead // Remove before 2026.7.0 ESPDEPRECATED("Use const char* or uint32_t overload instead. Removed in 2026.7.0", "2026.1.0") - void set_timeout(Component *component, const std::string &name, uint32_t timeout, std::function func); + void set_timeout(Component *component, const std::string &name, uint32_t timeout, std::function &&func); /** Set a timeout with a const char* name. * @@ -43,11 +43,11 @@ class Scheduler { * - A static const char* variable * - A pointer with lifetime >= the scheduled task */ - void set_timeout(Component *component, const char *name, uint32_t timeout, std::function func); + void set_timeout(Component *component, const char *name, uint32_t timeout, std::function &&func); /// Set a timeout with a numeric ID (zero heap allocation) - void set_timeout(Component *component, uint32_t id, uint32_t timeout, std::function func); + void set_timeout(Component *component, uint32_t id, uint32_t timeout, std::function &&func); /// Set a timeout with an internal scheduler ID (separate namespace from component NUMERIC_ID) - void set_timeout(Component *component, InternalSchedulerID id, uint32_t timeout, std::function func) { + void set_timeout(Component *component, InternalSchedulerID id, uint32_t timeout, std::function &&func) { this->set_timer_common_(component, SchedulerItem::TIMEOUT, NameType::NUMERIC_ID_INTERNAL, nullptr, static_cast(id), timeout, std::move(func)); } @@ -62,7 +62,7 @@ class Scheduler { } ESPDEPRECATED("Use const char* or uint32_t overload instead. Removed in 2026.7.0", "2026.1.0") - void set_interval(Component *component, const std::string &name, uint32_t interval, std::function func); + void set_interval(Component *component, const std::string &name, uint32_t interval, std::function &&func); /** Set an interval with a const char* name. * @@ -72,11 +72,11 @@ class Scheduler { * - A static const char* variable * - A pointer with lifetime >= the scheduled task */ - void set_interval(Component *component, const char *name, uint32_t interval, std::function func); + void set_interval(Component *component, const char *name, uint32_t interval, std::function &&func); /// Set an interval with a numeric ID (zero heap allocation) - void set_interval(Component *component, uint32_t id, uint32_t interval, std::function func); + void set_interval(Component *component, uint32_t id, uint32_t interval, std::function &&func); /// Set an interval with an internal scheduler ID (separate namespace from component NUMERIC_ID) - void set_interval(Component *component, InternalSchedulerID id, uint32_t interval, std::function func) { + void set_interval(Component *component, InternalSchedulerID id, uint32_t interval, std::function &&func) { this->set_timer_common_(component, SchedulerItem::INTERVAL, NameType::NUMERIC_ID_INTERNAL, nullptr, static_cast(id), interval, std::move(func)); } @@ -255,7 +255,7 @@ class Scheduler { // Common implementation for both timeout and interval // name_type determines storage type: STATIC_STRING uses static_name, others use hash_or_id void set_timer_common_(Component *component, SchedulerItem::Type type, NameType name_type, const char *static_name, - uint32_t hash_or_id, uint32_t delay, std::function func, bool is_retry = false, + uint32_t hash_or_id, uint32_t delay, std::function &&func, bool is_retry = false, bool skip_cancel = false); // Common implementation for retry - Remove before 2026.8.0 From 2ff876c629a3181e1907fc52594d1257f5165139 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 24 Feb 2026 18:18:44 -0600 Subject: [PATCH 047/147] [core] Use custom deleter for SchedulerItem unique_ptr to prevent destructor inlining (#14258) Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- esphome/core/scheduler.cpp | 22 ++++++++++------- esphome/core/scheduler.h | 48 ++++++++++++++++++++++++-------------- 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/esphome/core/scheduler.cpp b/esphome/core/scheduler.cpp index 674d70abcf..d9c66b2000 100644 --- a/esphome/core/scheduler.cpp +++ b/esphome/core/scheduler.cpp @@ -33,6 +33,11 @@ static constexpr uint32_t HALF_MAX_UINT32 = std::numeric_limits::max() // max delay to start an interval sequence static constexpr uint32_t MAX_INTERVAL_DELAY = 5000; +// Prevent inlining of SchedulerItem deletion. On BK7231N (Thumb-1), GCC inlines +// ~unique_ptr (~30 bytes each) at every destruction site. Defining +// the deleter in the .cpp file ensures a single copy of the destructor + operator delete. +void Scheduler::SchedulerItemDeleter::operator()(SchedulerItem *ptr) const noexcept { delete ptr; } + #if defined(ESPHOME_LOG_HAS_VERBOSE) || defined(ESPHOME_DEBUG_SCHEDULER) // Helper struct for formatting scheduler item names consistently in logs // Uses a stack buffer to avoid heap allocation @@ -468,7 +473,7 @@ void HOT Scheduler::call(uint32_t now) { if (now_64 - last_print > 2000) { last_print = now_64; - std::vector> old_items; + std::vector old_items; #ifdef ESPHOME_THREAD_MULTI_ATOMICS const auto last_dbg = this->last_millis_.load(std::memory_order_relaxed); const auto major_dbg = this->millis_major_.load(std::memory_order_relaxed); @@ -481,7 +486,7 @@ void HOT Scheduler::call(uint32_t now) { // Cleanup before debug output this->cleanup_(); while (!this->items_.empty()) { - std::unique_ptr item; + SchedulerItemPtr item; { LockGuard guard{this->lock_}; item = this->pop_raw_locked_(); @@ -642,7 +647,7 @@ size_t HOT Scheduler::cleanup_() { } return this->items_.size(); } -std::unique_ptr HOT Scheduler::pop_raw_locked_() { +Scheduler::SchedulerItemPtr HOT Scheduler::pop_raw_locked_() { std::pop_heap(this->items_.begin(), this->items_.end(), SchedulerItem::cmp); // Move the item out before popping - this is the item that was at the front of the heap @@ -865,8 +870,7 @@ uint64_t Scheduler::millis_64_(uint32_t now) { #endif } -bool HOT Scheduler::SchedulerItem::cmp(const std::unique_ptr &a, - const std::unique_ptr &b) { +bool HOT Scheduler::SchedulerItem::cmp(const SchedulerItemPtr &a, const SchedulerItemPtr &b) { // High bits are almost always equal (change only on 32-bit rollover ~49 days) // Optimize for common case: check low bits first when high bits are equal return (a->next_execution_high_ == b->next_execution_high_) ? (a->next_execution_low_ > b->next_execution_low_) @@ -877,7 +881,7 @@ bool HOT Scheduler::SchedulerItem::cmp(const std::unique_ptr &a, // IMPORTANT: Caller must hold the scheduler lock before calling this function. // This protects scheduler_item_pool_ from concurrent access by other threads // that may be acquiring items from the pool in set_timer_common_(). -void Scheduler::recycle_item_main_loop_(std::unique_ptr item) { +void Scheduler::recycle_item_main_loop_(SchedulerItemPtr item) { if (!item) return; @@ -920,8 +924,8 @@ void Scheduler::debug_log_timer_(const SchedulerItem *item, NameType name_type, // Helper to get or create a scheduler item from the pool // IMPORTANT: Caller must hold the scheduler lock before calling this function. -std::unique_ptr Scheduler::get_item_from_pool_locked_() { - std::unique_ptr item; +Scheduler::SchedulerItemPtr Scheduler::get_item_from_pool_locked_() { + SchedulerItemPtr item; if (!this->scheduler_item_pool_.empty()) { item = std::move(this->scheduler_item_pool_.back()); this->scheduler_item_pool_.pop_back(); @@ -929,7 +933,7 @@ std::unique_ptr Scheduler::get_item_from_pool_locked_( ESP_LOGD(TAG, "Reused item from pool (pool size now: %zu)", this->scheduler_item_pool_.size()); #endif } else { - item = make_unique(); + item = SchedulerItemPtr(new SchedulerItem()); #ifdef ESPHOME_DEBUG_SCHEDULER ESP_LOGD(TAG, "Allocated new item (pool empty)"); #endif diff --git a/esphome/core/scheduler.h b/esphome/core/scheduler.h index b6a8336606..840ee7159a 100644 --- a/esphome/core/scheduler.h +++ b/esphome/core/scheduler.h @@ -142,6 +142,19 @@ class Scheduler { }; protected: + struct SchedulerItem; + + // Custom deleter for SchedulerItem unique_ptr that prevents the compiler from + // inlining the destructor at every destruction site. On BK7231N (Thumb-1), GCC + // inlines ~unique_ptr (~30 bytes: null check + ~std::function + + // operator delete) at every destruction site, while ESP32/ESP8266/RTL8720CF outline + // it into a single helper. This noinline deleter ensures only one copy exists. + // operator() is defined in scheduler.cpp to prevent inlining. + struct SchedulerItemDeleter { + void operator()(SchedulerItem *ptr) const noexcept; + }; + using SchedulerItemPtr = std::unique_ptr; + struct SchedulerItem { // Ordered by size to minimize padding Component *component; @@ -233,7 +246,7 @@ class Scheduler { name_type_ = type; } - static bool cmp(const std::unique_ptr &a, const std::unique_ptr &b); + static bool cmp(const SchedulerItemPtr &a, const SchedulerItemPtr &b); // Note: We use 48 bits total (32 + 16), stored in a 64-bit value for API compatibility. // The upper 16 bits of the 64-bit value are always zero, which is fine since @@ -276,10 +289,10 @@ class Scheduler { size_t cleanup_(); // Remove and return the front item from the heap // IMPORTANT: Caller must hold the scheduler lock before calling this function. - std::unique_ptr pop_raw_locked_(); + SchedulerItemPtr pop_raw_locked_(); // Get or create a scheduler item from the pool // IMPORTANT: Caller must hold the scheduler lock before calling this function. - std::unique_ptr get_item_from_pool_locked_(); + SchedulerItemPtr get_item_from_pool_locked_(); private: // Helper to cancel items - must be called with lock held @@ -303,9 +316,9 @@ class Scheduler { // Helper function to check if item matches criteria for cancellation // name_type determines matching: STATIC_STRING uses static_name, others use hash_or_id // IMPORTANT: Must be called with scheduler lock held - inline bool HOT matches_item_locked_(const std::unique_ptr &item, Component *component, - NameType name_type, const char *static_name, uint32_t hash_or_id, - SchedulerItem::Type type, bool match_retry, bool skip_removed = true) const { + inline bool HOT matches_item_locked_(const SchedulerItemPtr &item, Component *component, NameType name_type, + const char *static_name, uint32_t hash_or_id, SchedulerItem::Type type, + bool match_retry, bool skip_removed = true) const { // THREAD SAFETY: Check for nullptr first to prevent LoadProhibited crashes. On multi-threaded // platforms, items can be moved out of defer_queue_ during processing, leaving nullptr entries. // PR #11305 added nullptr checks in callers (mark_matching_items_removed_locked_()), but this check @@ -340,7 +353,7 @@ class Scheduler { // IMPORTANT: Only call from main loop context! Recycling clears the callback, // so calling from another thread while the callback is executing causes use-after-free. // IMPORTANT: Caller must hold the scheduler lock before calling this function. - void recycle_item_main_loop_(std::unique_ptr item); + void recycle_item_main_loop_(SchedulerItemPtr item); // Helper to perform full cleanup when too many items are cancelled void full_cleanup_removed_items_(); @@ -396,7 +409,7 @@ class Scheduler { // Merge lock acquisitions: instead of separate locks for move-out and recycle (2N+1 total), // recycle each item after re-acquiring the lock for the next iteration (N+1 total). // The lock is held across: recycle → loop condition → move-out, then released for execution. - std::unique_ptr item; + SchedulerItemPtr item; this->lock_.lock(); while (this->defer_queue_front_ < defer_queue_end) { @@ -496,9 +509,10 @@ class Scheduler { // name_type determines matching: STATIC_STRING uses static_name, others use hash_or_id // Returns the number of items marked for removal // IMPORTANT: Must be called with scheduler lock held - __attribute__((noinline)) size_t mark_matching_items_removed_locked_( - std::vector> &container, Component *component, NameType name_type, - const char *static_name, uint32_t hash_or_id, SchedulerItem::Type type, bool match_retry) { + __attribute__((noinline)) size_t mark_matching_items_removed_locked_(std::vector &container, + Component *component, NameType name_type, + const char *static_name, uint32_t hash_or_id, + SchedulerItem::Type type, bool match_retry) { size_t count = 0; for (auto &item : container) { // Skip nullptr items (can happen in defer_queue_ when items are being processed) @@ -514,15 +528,15 @@ class Scheduler { } Mutex lock_; - std::vector> items_; - std::vector> to_add_; + std::vector items_; + std::vector to_add_; #ifndef ESPHOME_THREAD_SINGLE // Single-core platforms don't need the defer queue and save ~32 bytes of RAM // Using std::vector instead of std::deque avoids 512-byte chunked allocations // Index tracking avoids O(n) erase() calls when draining the queue each loop - std::vector> defer_queue_; // FIFO queue for defer() calls - size_t defer_queue_front_{0}; // Index of first valid item in defer_queue_ (tracks consumed items) -#endif /* ESPHOME_THREAD_SINGLE */ + std::vector defer_queue_; // FIFO queue for defer() calls + size_t defer_queue_front_{0}; // Index of first valid item in defer_queue_ (tracks consumed items) +#endif /* ESPHOME_THREAD_SINGLE */ uint32_t to_remove_{0}; // Memory pool for recycling SchedulerItem objects to reduce heap churn. @@ -533,7 +547,7 @@ class Scheduler { // - The pool significantly reduces heap fragmentation which is critical because heap allocation/deallocation // can stall the entire system, causing timing issues and dropped events for any components that need // to synchronize between tasks (see https://github.com/esphome/backlog/issues/52) - std::vector> scheduler_item_pool_; + std::vector scheduler_item_pool_; #ifdef ESPHOME_THREAD_MULTI_ATOMICS /* From 3460a8c9225f504fdfdd9166d603fe2c3fb41474 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 24 Feb 2026 18:44:50 -0600 Subject: [PATCH 048/147] [dlms_meter/kamstrup_kmp] Replace powf with pow10_int (#14125) Co-authored-by: Claude Opus 4.6 --- esphome/components/dlms_meter/dlms_meter.cpp | 4 +--- esphome/components/kamstrup_kmp/kamstrup_kmp.cpp | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/esphome/components/dlms_meter/dlms_meter.cpp b/esphome/components/dlms_meter/dlms_meter.cpp index 11d05b3a08..bd2150e8dd 100644 --- a/esphome/components/dlms_meter/dlms_meter.cpp +++ b/esphome/components/dlms_meter/dlms_meter.cpp @@ -1,7 +1,5 @@ #include "dlms_meter.h" -#include - #if defined(USE_ESP8266_FRAMEWORK_ARDUINO) #include #elif defined(USE_ESP32) @@ -410,7 +408,7 @@ void DlmsMeterComponent::decode_obis_(uint8_t *plaintext, uint16_t message_lengt if (current_position + 1 < message_length) { int8_t scaler = static_cast(plaintext[current_position + 1]); if (scaler != 0) { - value *= powf(10.0f, scaler); + value *= pow10_int(scaler); } } diff --git a/esphome/components/kamstrup_kmp/kamstrup_kmp.cpp b/esphome/components/kamstrup_kmp/kamstrup_kmp.cpp index 534939f9af..00c65a1937 100644 --- a/esphome/components/kamstrup_kmp/kamstrup_kmp.cpp +++ b/esphome/components/kamstrup_kmp/kamstrup_kmp.cpp @@ -222,11 +222,11 @@ void KamstrupKMPComponent::parse_command_message_(uint16_t command, const uint8_ } // Calculate exponent - float exponent = msg[6] & 0x3F; + int8_t exp_val = msg[6] & 0x3F; if (msg[6] & 0x40) { - exponent = -exponent; + exp_val = -exp_val; } - exponent = powf(10, exponent); + float exponent = pow10_int(exp_val); if (msg[6] & 0x80) { exponent = -exponent; } From 905e81330ee3af27a82f2f6cf3675497bd6fcc70 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:28:19 +1300 Subject: [PATCH 049/147] Don't get stuck forever on a failed component can_proceed (#14267) --- esphome/core/application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/core/application.cpp b/esphome/core/application.cpp index 1cb7dc0075..6a7683a987 100644 --- a/esphome/core/application.cpp +++ b/esphome/core/application.cpp @@ -134,7 +134,7 @@ void Application::setup() { this->after_loop_tasks_(); this->app_state_ = new_app_state; yield(); - } while (!component->can_proceed()); + } while (!component->can_proceed() && !component->is_failed()); } ESP_LOGI(TAG, "setup() finished successfully!"); From 1dac501b049ffea5a1767df5dfbd429d768c0af2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 24 Feb 2026 21:39:51 -0600 Subject: [PATCH 050/147] [light] Add additional light effect test cases (#14266) --- tests/components/light/common.yaml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/components/light/common.yaml b/tests/components/light/common.yaml index 55525fc67f..e5fab62a79 100644 --- a/tests/components/light/common.yaml +++ b/tests/components/light/common.yaml @@ -71,6 +71,32 @@ esphome: - light.control: id: test_monochromatic_light state: on + # Test static effect name resolution at codegen time + - light.turn_on: + id: test_monochromatic_light + effect: Strobe + - light.turn_on: + id: test_monochromatic_light + effect: none + # Test resolving a different effect on the same light + - light.control: + id: test_monochromatic_light + effect: My Flicker + # Test effect: None (capitalized) + - light.control: + id: test_monochromatic_light + effect: None + # Test effect lambda with no args (on_boot has empty Ts...) + - light.turn_on: + id: test_monochromatic_light + effect: !lambda 'return "Strobe";' + # Test effect lambda with non-empty args (repeat passes uint32_t iteration) + - repeat: + count: 3 + then: + - light.turn_on: + id: test_monochromatic_light + effect: !lambda 'return iteration > 1 ? "Strobe" : "none";' - light.dim_relative: id: test_monochromatic_light relative_brightness: 5% From 2e705a919fc8a4e9990e4fc5870e4677a05f6e46 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 24 Feb 2026 23:26:00 -0500 Subject: [PATCH 051/147] [pid] Fix deadband threshold conversion for Fahrenheit (#14268) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/pid/climate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/pid/climate.py b/esphome/components/pid/climate.py index 5919d2cac8..5fa3166f9d 100644 --- a/esphome/components/pid/climate.py +++ b/esphome/components/pid/climate.py @@ -50,8 +50,8 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_HEAT_OUTPUT): cv.use_id(output.FloatOutput), cv.Optional(CONF_DEADBAND_PARAMETERS): cv.Schema( { - cv.Required(CONF_THRESHOLD_HIGH): cv.temperature, - cv.Required(CONF_THRESHOLD_LOW): cv.temperature, + cv.Required(CONF_THRESHOLD_HIGH): cv.temperature_delta, + cv.Required(CONF_THRESHOLD_LOW): cv.temperature_delta, cv.Optional(CONF_KP_MULTIPLIER, default=0.1): cv.float_, cv.Optional(CONF_KI_MULTIPLIER, default=0.0): cv.float_, cv.Optional(CONF_KD_MULTIPLIER, default=0.0): cv.float_, From b134c4679ca5f609633a2b97681a41867e62c12d Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 24 Feb 2026 22:33:57 -0600 Subject: [PATCH 052/147] [light] Replace std::lerp with lightweight lerp_fast in LightColorValues::lerp (#14238) --- .../components/light/light_color_values.cpp | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/esphome/components/light/light_color_values.cpp b/esphome/components/light/light_color_values.cpp index 2f22bb3c68..e54cc0a12a 100644 --- a/esphome/components/light/light_color_values.cpp +++ b/esphome/components/light/light_color_values.cpp @@ -1,27 +1,30 @@ #include "light_color_values.h" -#include - namespace esphome::light { +// Lightweight lerp: a + t * (b - a). +// Avoids std::lerp's NaN/infinity handling which Clang doesn't optimize out, +// adding ~200 bytes per call. Safe because all values are finite floats. +static float __attribute__((noinline)) lerp_fast(float a, float b, float t) { return a + t * (b - a); } + LightColorValues LightColorValues::lerp(const LightColorValues &start, const LightColorValues &end, float completion) { // Directly interpolate the raw values to avoid getter/setter overhead. // This is safe because: - // - All LightColorValues have their values clamped when set via the setters - // - std::lerp guarantees output is in the same range as inputs + // - All LightColorValues except color_temperature_ have their values clamped when set via the setters + // - lerp_fast output stays in range when inputs are in range and 0 <= completion <= 1 // - Therefore the output doesn't need clamping, so we can skip the setters LightColorValues v; v.color_mode_ = end.color_mode_; - v.state_ = std::lerp(start.state_, end.state_, completion); - v.brightness_ = std::lerp(start.brightness_, end.brightness_, completion); - v.color_brightness_ = std::lerp(start.color_brightness_, end.color_brightness_, completion); - v.red_ = std::lerp(start.red_, end.red_, completion); - v.green_ = std::lerp(start.green_, end.green_, completion); - v.blue_ = std::lerp(start.blue_, end.blue_, completion); - v.white_ = std::lerp(start.white_, end.white_, completion); - v.color_temperature_ = std::lerp(start.color_temperature_, end.color_temperature_, completion); - v.cold_white_ = std::lerp(start.cold_white_, end.cold_white_, completion); - v.warm_white_ = std::lerp(start.warm_white_, end.warm_white_, completion); + v.state_ = lerp_fast(start.state_, end.state_, completion); + v.brightness_ = lerp_fast(start.brightness_, end.brightness_, completion); + v.color_brightness_ = lerp_fast(start.color_brightness_, end.color_brightness_, completion); + v.red_ = lerp_fast(start.red_, end.red_, completion); + v.green_ = lerp_fast(start.green_, end.green_, completion); + v.blue_ = lerp_fast(start.blue_, end.blue_, completion); + v.white_ = lerp_fast(start.white_, end.white_, completion); + v.color_temperature_ = lerp_fast(start.color_temperature_, end.color_temperature_, completion); + v.cold_white_ = lerp_fast(start.cold_white_, end.cold_white_, completion); + v.warm_white_ = lerp_fast(start.warm_white_, end.warm_white_, completion); return v; } From bb05cfb7119102b877ad583d9d9091ff57663a44 Mon Sep 17 00:00:00 2001 From: Big Mike Date: Wed, 25 Feb 2026 06:34:58 -0600 Subject: [PATCH 053/147] [sensirion_common] Move sen5x's sensirion_convert_to_string_in_place() function to sensirion_common (#14269) --- esphome/components/sen5x/sen5x.cpp | 9 --------- esphome/components/sensirion_common/i2c_sensirion.h | 11 +++++++++++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/esphome/components/sen5x/sen5x.cpp b/esphome/components/sen5x/sen5x.cpp index fc4932d867..09dda8bca4 100644 --- a/esphome/components/sen5x/sen5x.cpp +++ b/esphome/components/sen5x/sen5x.cpp @@ -56,15 +56,6 @@ static const LogString *rht_accel_mode_to_string(RhtAccelerationMode mode) { } } -// This function performs an in-place conversion of the provided buffer -// from uint16_t values to big endianness -static inline const char *sensirion_convert_to_string_in_place(uint16_t *array, size_t length) { - for (size_t i = 0; i < length; i++) { - array[i] = convert_big_endian(array[i]); - } - return reinterpret_cast(array); -} - void SEN5XComponent::setup() { // the sensor needs 1000 ms to enter the idle state this->set_timeout(1000, [this]() { diff --git a/esphome/components/sensirion_common/i2c_sensirion.h b/esphome/components/sensirion_common/i2c_sensirion.h index f3eb3761f6..3c2c14ccb8 100644 --- a/esphome/components/sensirion_common/i2c_sensirion.h +++ b/esphome/components/sensirion_common/i2c_sensirion.h @@ -21,6 +21,17 @@ class SensirionI2CDevice : public i2c::I2CDevice { public: enum CommandLen : uint8_t { ADDR_8_BIT = 1, ADDR_16_BIT = 2 }; + /** + * This function performs an in-place conversion of the provided buffer + * from uint16_t values to big endianness. Useful for Sensirion strings in SEN5X and SEN6X + */ + static inline const char *sensirion_convert_to_string_in_place(uint16_t *array, size_t length) { + for (size_t i = 0; i < length; i++) { + array[i] = convert_big_endian(array[i]); + } + return reinterpret_cast(array); + } + /** Read data words from I2C device. * handles CRC check used by Sensirion sensors * @param data pointer to raw result From 228874a52b268070199dc37f4622cca1361e729b Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 10:45:50 -0500 Subject: [PATCH 054/147] [config] Improve dimensions validation and fix online_image resize aspect ratio (#14274) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/runtime_image/runtime_image.cpp | 9 +++++++++ esphome/config_validation.py | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/esphome/components/runtime_image/runtime_image.cpp b/esphome/components/runtime_image/runtime_image.cpp index 603ea76f01..5a4a2ea7d6 100644 --- a/esphome/components/runtime_image/runtime_image.cpp +++ b/esphome/components/runtime_image/runtime_image.cpp @@ -2,6 +2,7 @@ #include "image_decoder.h" #include "esphome/core/log.h" #include "esphome/core/helpers.h" +#include #include #ifdef USE_RUNTIME_IMAGE_BMP @@ -43,6 +44,14 @@ int RuntimeImage::resize(int width, int height) { int target_width = this->fixed_width_ ? this->fixed_width_ : width; int target_height = this->fixed_height_ ? this->fixed_height_ : height; + // When both fixed dimensions are set, scale uniformly to preserve aspect ratio + if (this->fixed_width_ && this->fixed_height_ && width > 0 && height > 0) { + float scale = + std::min(static_cast(this->fixed_width_) / width, static_cast(this->fixed_height_) / height); + target_width = static_cast(width * scale); + target_height = static_cast(height * scale); + } + size_t result = this->resize_buffer_(target_width, target_height); if (result > 0 && this->progressive_display_) { // Update display dimensions for progressive display diff --git a/esphome/config_validation.py b/esphome/config_validation.py index ef1c66a20e..3b0e4da298 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -1640,7 +1640,10 @@ def dimensions(value): if width <= 0 or height <= 0: raise Invalid("Width and height must at least be 1") return [width, height] - value = string(value) + if not isinstance(value, str): + raise Invalid( + "Dimensions must be a string (WIDTHxHEIGHT). Got a number instead, try quoting the value." + ) match = re.match(r"\s*([0-9]+)\s*[xX]\s*([0-9]+)\s*", value) if not match: raise Invalid( From 1beeb9ab5c34b1b28ba3c8dc8e78cc12be511dc2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 25 Feb 2026 09:54:32 -0600 Subject: [PATCH 055/147] [web_server] Fix uptime display overflow after ~24.8 days (#13739) --- esphome/components/web_server/web_server.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp index 682008c40e..e2f9c21331 100644 --- a/esphome/components/web_server/web_server.cpp +++ b/esphome/components/web_server/web_server.cpp @@ -385,6 +385,7 @@ json::SerializationBuffer<> WebServer::get_config_json() { #endif root[ESPHOME_F("log")] = this->expose_log_; root[ESPHOME_F("lang")] = "en"; + root[ESPHOME_F("uptime")] = static_cast(App.scheduler.millis_64() / 1000); return builder.serialize(); } @@ -411,7 +412,12 @@ void WebServer::setup() { // doesn't need defer functionality - if the queue is full, the client JS knows it's alive because it's clearly // getting a lot of events - this->set_interval(10000, [this]() { this->events_.try_send_nodefer("", "ping", millis(), 30000); }); + this->set_interval(10000, [this]() { + char buf[32]; + auto uptime = static_cast(App.scheduler.millis_64() / 1000); + buf_append_printf(buf, sizeof(buf), 0, "{\"uptime\":%u}", uptime); + this->events_.try_send_nodefer(buf, "ping", millis(), 30000); + }); } void WebServer::loop() { this->events_.loop(); } From 78ab63581b48575d04448e49d1ecc298627bce1a Mon Sep 17 00:00:00 2001 From: esphomebot Date: Thu, 26 Feb 2026 05:09:45 +1300 Subject: [PATCH 056/147] Update webserver local assets to 20260225-155043 (#14275) Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- .../components/captive_portal/captive_index.h | 4 +- .../components/web_server/server_index_v2.h | 2286 ++--- .../components/web_server/server_index_v3.h | 8037 +++++++++-------- 3 files changed, 5166 insertions(+), 5161 deletions(-) diff --git a/esphome/components/captive_portal/captive_index.h b/esphome/components/captive_portal/captive_index.h index a81edc1900..645ebb7a2f 100644 --- a/esphome/components/captive_portal/captive_index.h +++ b/esphome/components/captive_portal/captive_index.h @@ -6,7 +6,7 @@ namespace esphome::captive_portal { #ifdef USE_CAPTIVE_PORTAL_GZIP -constexpr uint8_t INDEX_GZ[] PROGMEM = { +const uint8_t INDEX_GZ[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x95, 0x16, 0x6b, 0x8f, 0xdb, 0x36, 0xf2, 0x7b, 0x7e, 0x05, 0x8f, 0x49, 0xbb, 0x52, 0xb3, 0x7a, 0x7a, 0xed, 0x6c, 0x24, 0x51, 0x45, 0x9a, 0xbb, 0xa2, 0x05, 0x9a, 0x36, 0xc0, 0x6e, 0x73, 0x1f, 0x82, 0x00, 0x4b, 0x53, 0x23, 0x8b, 0x31, 0x45, 0xea, 0x48, 0xca, 0x8f, 0x18, 0xbe, 0xdf, @@ -86,7 +86,7 @@ constexpr uint8_t INDEX_GZ[] PROGMEM = { 0xfc, 0xda, 0xd1, 0xf8, 0xe9, 0xa3, 0xe1, 0xa6, 0xfb, 0x1f, 0x53, 0x58, 0x46, 0xb2, 0xf9, 0x0a, 0x00, 0x00}; #else // Brotli (default, smaller) -constexpr uint8_t INDEX_BR[] PROGMEM = { +const uint8_t INDEX_BR[] PROGMEM = { 0x1b, 0xf8, 0x0a, 0x00, 0x64, 0x5a, 0xd3, 0xfa, 0xe7, 0xf3, 0x62, 0xd8, 0x06, 0x1b, 0xe9, 0x6a, 0x8a, 0x81, 0x2b, 0xb5, 0x49, 0x14, 0x37, 0xdc, 0x9e, 0x1a, 0xcb, 0x56, 0x87, 0xfb, 0xff, 0xf7, 0x73, 0x75, 0x12, 0x0a, 0xd6, 0x48, 0x84, 0xc6, 0x21, 0xa4, 0x6d, 0xb5, 0x71, 0xef, 0x13, 0xbe, 0x4e, 0x54, 0xf1, 0x64, 0x8f, 0x3f, 0xcc, 0x9a, 0x78, diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h index b5dac9ae4c..ffa9c87b3a 100644 --- a/esphome/components/web_server/server_index_v2.h +++ b/esphome/components/web_server/server_index_v2.h @@ -9,7 +9,7 @@ namespace esphome::web_server { #ifdef USE_WEBSERVER_GZIP -constexpr uint8_t INDEX_GZ[] PROGMEM = { +const uint8_t INDEX_GZ[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xed, 0x7d, 0xd9, 0x72, 0xdb, 0x48, 0xb6, 0xe0, 0xf3, 0xd4, 0x57, 0x40, 0x28, 0xb5, 0x8c, 0x2c, 0x26, 0xc1, 0x45, 0x92, 0x2d, 0x83, 0x4a, 0xb2, 0x65, 0xd9, 0xd5, 0x76, 0x97, 0xb7, 0xb6, 0xec, 0xda, 0x58, 0x6c, 0x09, 0x02, 0x92, 0x44, 0x96, 0x41, 0x80, 0x05, 0x24, 0xb5, 0x14, 0x89, @@ -41,10 +41,10 @@ constexpr uint8_t INDEX_GZ[] PROGMEM = { 0x90, 0xe0, 0xbe, 0xe3, 0x24, 0x21, 0x7d, 0x18, 0xf1, 0x84, 0x3b, 0xb0, 0x8a, 0xe9, 0xd8, 0x4a, 0x08, 0xb1, 0x73, 0xd1, 0xd6, 0x1e, 0x24, 0x5e, 0xd2, 0xb0, 0x6d, 0x2c, 0xa1, 0xc4, 0x09, 0x47, 0xf8, 0x23, 0x71, 0x12, 0xec, 0xba, 0x2e, 0x47, 0xa4, 0xbf, 0xd0, 0x58, 0x49, 0x8c, 0x79, 0x0e, 0x92, 0x61, 0x7b, 0xe4, 0x71, 0x37, 0xa3, 0xe1, 0x3c, - 0xa0, 0x8e, 0xc3, 0x70, 0x8e, 0x53, 0x44, 0xfa, 0xac, 0xe1, 0x64, 0xa4, 0x0f, 0xcb, 0x9d, 0xd5, 0xd7, 0x9a, 0x90, - 0x9d, 0x36, 0x52, 0x30, 0x66, 0x1a, 0x40, 0xc0, 0xb0, 0x82, 0x27, 0x23, 0xc4, 0x4e, 0xe6, 0xd3, 0x4b, 0x9a, 0xd9, + 0xa0, 0x8e, 0xc3, 0x70, 0x8e, 0x33, 0x44, 0xfa, 0xac, 0xe1, 0xa4, 0xa4, 0x0f, 0xcb, 0x9d, 0xd6, 0xd7, 0x9a, 0x90, + 0x9d, 0x36, 0x52, 0x30, 0xa6, 0x1a, 0x40, 0xc0, 0xb0, 0x82, 0x27, 0x25, 0xc4, 0x4e, 0xe6, 0xd3, 0x4b, 0x9a, 0xd9, 0x65, 0xb5, 0x5e, 0x8d, 0x2c, 0xe6, 0x39, 0xb5, 0x82, 0x3c, 0xb7, 0xc6, 0xf3, 0x24, 0xe0, 0x2c, 0x4d, 0x2c, 0xbb, - 0x91, 0x35, 0x6c, 0x49, 0x0e, 0x25, 0x35, 0xd8, 0xa8, 0x40, 0x4e, 0x8e, 0x1a, 0xc9, 0x30, 0x6d, 0x74, 0x46, 0x18, + 0x91, 0x36, 0x6c, 0x49, 0x0e, 0x25, 0x35, 0xd8, 0xa8, 0x40, 0x4e, 0x8e, 0x1a, 0xc9, 0x30, 0x6b, 0x74, 0x46, 0x18, 0xa0, 0x44, 0x3d, 0xd5, 0x9f, 0x42, 0x00, 0xc5, 0x09, 0xcc, 0xb1, 0xc0, 0x4f, 0x38, 0xcc, 0x52, 0x4c, 0x31, 0xe7, 0x83, 0xc4, 0x5d, 0xdf, 0x28, 0x84, 0xbb, 0x53, 0x7f, 0xe6, 0x50, 0xd2, 0xa7, 0x82, 0xb8, 0xfc, 0x24, 0x00, 0x58, 0x6b, 0xeb, 0x36, 0xa0, 0x1e, 0x75, 0x2b, 0x92, 0x42, 0x1e, 0x77, 0xc7, 0x69, 0xf6, 0xcc, 0x0f, 0x22, 0x68, 0x57, @@ -85,8 +85,8 @@ constexpr uint8_t INDEX_GZ[] PROGMEM = { 0x12, 0x0d, 0x1c, 0x44, 0x95, 0xd0, 0x39, 0xec, 0x81, 0xd6, 0x3d, 0x3c, 0xfb, 0xfc, 0xdc, 0x6e, 0x70, 0xac, 0xd0, 0x30, 0xa1, 0x7a, 0xe8, 0xdb, 0xa7, 0x54, 0x6a, 0x57, 0x42, 0xf7, 0x58, 0xc3, 0x8c, 0xdc, 0x41, 0x6e, 0x48, 0xc7, 0x2c, 0x31, 0xa6, 0x5d, 0x03, 0x09, 0x73, 0x9c, 0xa3, 0xc2, 0x58, 0xd0, 0x8d, 0x5d, 0x0b, 0xb5, 0x46, 0xae, 0xdc, - 0x62, 0x22, 0x54, 0x09, 0x63, 0x19, 0x87, 0x74, 0x54, 0x60, 0x81, 0x7a, 0x3d, 0x9b, 0x54, 0x00, 0x3a, 0xe4, 0xa3, - 0x9e, 0x7a, 0x4f, 0x72, 0x89, 0xb9, 0x8c, 0xfe, 0x32, 0xa7, 0x39, 0x97, 0x74, 0xec, 0x70, 0x9c, 0x62, 0x06, 0xfc, + 0x62, 0x22, 0x54, 0x09, 0x63, 0x19, 0x87, 0x74, 0x54, 0x60, 0x81, 0x7a, 0x3d, 0x9b, 0x4c, 0x00, 0x3a, 0xe4, 0xa3, + 0x9e, 0x7a, 0x4f, 0x72, 0x89, 0xb9, 0x8c, 0xfe, 0x32, 0xa7, 0x39, 0x97, 0x74, 0xec, 0x70, 0x9c, 0x61, 0x06, 0xfc, 0x3a, 0x4d, 0xc6, 0x6c, 0x32, 0xcf, 0x40, 0xe3, 0x81, 0xcd, 0x48, 0x93, 0xf9, 0x94, 0xea, 0xa7, 0x4d, 0xb0, 0xbd, 0x99, 0x81, 0x4c, 0xcc, 0x81, 0xa6, 0xef, 0x26, 0x27, 0x80, 0x95, 0xa3, 0xe5, 0xf2, 0xaf, 0xba, 0x93, 0x6a, 0x29, 0x4b, 0x2d, 0x6d, 0x65, 0x4d, 0x28, 0x47, 0x4a, 0x26, 0xef, 0x74, 0x14, 0xf8, 0x7c, 0x44, 0x76, 0xda, 0x25, 0x0d, @@ -120,15 +120,15 @@ constexpr uint8_t INDEX_GZ[] PROGMEM = { 0x11, 0x53, 0x33, 0x73, 0x80, 0x0b, 0x7c, 0x92, 0xe2, 0x34, 0x3f, 0x50, 0x74, 0x07, 0x06, 0x47, 0xb1, 0x02, 0x08, 0x47, 0x8b, 0x22, 0x64, 0xf9, 0x76, 0x0c, 0xfc, 0x21, 0x50, 0x3e, 0x35, 0x46, 0xb8, 0x2f, 0xa0, 0x25, 0x8f, 0x53, 0x5a, 0x73, 0x09, 0x99, 0xd2, 0x27, 0x34, 0xa3, 0xf9, 0x06, 0x74, 0x17, 0x41, 0xef, 0x6f, 0xe4, 0x2b, 0xd0, 0xca, - 0x00, 0x8a, 0xbc, 0x67, 0xaa, 0x13, 0x35, 0x0a, 0x50, 0x3c, 0x95, 0x09, 0x91, 0x9b, 0xd6, 0x2c, 0x48, 0xa5, 0xb1, - 0x4b, 0x23, 0x5c, 0xb1, 0xdc, 0x8c, 0x38, 0x8e, 0x93, 0x83, 0x11, 0xa7, 0x75, 0xfb, 0x6a, 0x12, 0xf9, 0xda, 0x24, + 0x00, 0x8a, 0xbc, 0x67, 0xaa, 0x13, 0x35, 0x0a, 0x50, 0x3c, 0x95, 0x09, 0x91, 0x9b, 0xd5, 0x2c, 0x48, 0xa5, 0xb1, + 0x4b, 0x23, 0x5c, 0xb1, 0xdc, 0x94, 0x38, 0x8e, 0x93, 0x83, 0x11, 0xa7, 0x75, 0xfb, 0x6a, 0x12, 0xf9, 0xda, 0x24, 0x72, 0xd7, 0x30, 0xb4, 0x50, 0x45, 0xcb, 0x46, 0x73, 0x8f, 0x73, 0x64, 0xd6, 0x02, 0x7d, 0xd5, 0x05, 0x06, 0x8d, - 0x4a, 0x7e, 0x1b, 0x13, 0x8e, 0x33, 0x65, 0xe5, 0x28, 0x52, 0x03, 0x8e, 0x51, 0x35, 0x49, 0x91, 0xdc, 0x1b, 0x35, - 0x93, 0x37, 0xc5, 0x19, 0x5a, 0x51, 0xee, 0x8b, 0x42, 0x21, 0x89, 0x22, 0xb5, 0x38, 0x35, 0xad, 0xd8, 0x40, 0x0b, - 0x4e, 0x89, 0xd2, 0x84, 0xa5, 0xe2, 0xb3, 0x8a, 0x9c, 0xb2, 0xdf, 0x1d, 0x42, 0xd2, 0x0a, 0x37, 0x35, 0x95, 0x52, - 0xeb, 0x56, 0x29, 0xc2, 0x91, 0x56, 0x4a, 0xb3, 0x6a, 0xe2, 0x84, 0xd8, 0xda, 0x27, 0x61, 0x0f, 0x16, 0x35, 0xbb, - 0xd0, 0x33, 0xaa, 0x15, 0x1e, 0xf0, 0xd4, 0x6c, 0x13, 0xbe, 0x37, 0x11, 0x4d, 0xad, 0x1f, 0x03, 0xe3, 0x59, 0x0d, - 0xe3, 0x06, 0x6a, 0x53, 0xc9, 0xbb, 0xd2, 0x11, 0x89, 0xea, 0x8d, 0x1d, 0x8a, 0x33, 0xb9, 0x10, 0x6b, 0x58, 0x5c, + 0x4a, 0x7e, 0x1b, 0x13, 0x8e, 0x53, 0x65, 0xe5, 0x28, 0x52, 0x03, 0x8e, 0x51, 0x35, 0xc9, 0x90, 0xdc, 0x1b, 0x35, + 0x93, 0x37, 0xc3, 0x29, 0x5a, 0x51, 0xee, 0x8b, 0x42, 0x21, 0x89, 0x22, 0xb5, 0x38, 0x35, 0xad, 0xd8, 0x40, 0x0b, + 0xce, 0x88, 0xd2, 0x84, 0xa5, 0xe2, 0xb3, 0x8a, 0x9c, 0xb2, 0xdf, 0x1d, 0x42, 0xb2, 0x0a, 0x37, 0x35, 0x95, 0x52, + 0xeb, 0x56, 0x19, 0xc2, 0x91, 0x56, 0x4a, 0xd3, 0x6a, 0xe2, 0x84, 0xd8, 0xda, 0x27, 0x61, 0x0f, 0x16, 0x35, 0xbb, + 0xd0, 0x33, 0xaa, 0x15, 0x1e, 0xf0, 0xd4, 0x74, 0x13, 0xbe, 0x37, 0x11, 0x4d, 0xad, 0x1f, 0x03, 0xe3, 0x69, 0x0d, + 0xe3, 0x06, 0x6a, 0x33, 0xc9, 0xbb, 0xb2, 0x11, 0x89, 0xea, 0x8d, 0x1d, 0x8a, 0x53, 0xb9, 0x10, 0x6b, 0x58, 0x5c, 0x55, 0x3e, 0x05, 0x11, 0x82, 0x19, 0x9b, 0x83, 0x7a, 0x67, 0x4a, 0x08, 0x07, 0x80, 0x67, 0xcb, 0xe5, 0x1a, 0xd9, 0x6d, 0xd4, 0x41, 0x91, 0x5b, 0x59, 0x86, 0xcb, 0xe5, 0x33, 0x8e, 0x1c, 0xa5, 0xfd, 0x62, 0x8a, 0x06, 0x9a, 0xe7, 0x9e, 0xbc, 0x84, 0x5a, 0x42, 0x19, 0xad, 0x4a, 0x4a, 0xb3, 0xa1, 0x4e, 0xb5, 0xf5, 0x85, 0xe2, 0x06, 0xe3, 0x3e, @@ -141,7 +141,7 @@ constexpr uint8_t INDEX_GZ[] PROGMEM = { 0x65, 0x01, 0xf4, 0x56, 0x0c, 0xef, 0xca, 0x64, 0xaf, 0x09, 0xd3, 0x52, 0xfe, 0x4a, 0xb7, 0xa0, 0xa6, 0xcc, 0xdc, 0x34, 0xf1, 0x95, 0x4f, 0xb5, 0x27, 0xdd, 0x26, 0x3b, 0x9d, 0x5e, 0x69, 0xf7, 0x69, 0x6a, 0xe8, 0x49, 0xf7, 0x86, 0x12, 0xaa, 0xe9, 0x3c, 0x0e, 0x15, 0xb0, 0x0c, 0x61, 0xaa, 0xe8, 0xe8, 0x9a, 0xc5, 0x71, 0x55, 0xfa, 0x39, 0x9c, - 0x3d, 0x57, 0x9c, 0x3d, 0xd5, 0x9c, 0x1d, 0x58, 0x05, 0x70, 0x76, 0xd9, 0x5d, 0xd5, 0x3c, 0x5d, 0xdb, 0x9e, 0xa9, + 0x3d, 0x57, 0x9c, 0x3d, 0xd3, 0x9c, 0x1d, 0x58, 0x05, 0x70, 0x76, 0xd9, 0x5d, 0xd5, 0x3c, 0x5b, 0xdb, 0x9e, 0x99, 0xe4, 0xe9, 0xb9, 0xb0, 0xa5, 0x61, 0xbc, 0xb9, 0x86, 0x00, 0x95, 0xba, 0xd7, 0x47, 0x47, 0xb9, 0x62, 0xc0, 0x08, 0x94, 0x9e, 0x4c, 0x6a, 0xba, 0x29, 0x3e, 0x3a, 0x08, 0xe7, 0x05, 0x2d, 0x29, 0xfb, 0xe4, 0x19, 0xf8, 0xea, 0x8c, 0xe9, 0x80, 0x18, 0x13, 0xc5, 0x9f, 0xa5, 0x46, 0xe9, 0xd9, 0x31, 0x35, 0xbb, 0x5c, 0xcf, 0x0e, 0x78, 0x7d, 0x35, @@ -181,1135 +181,1137 @@ constexpr uint8_t INDEX_GZ[] PROGMEM = { 0x19, 0xb3, 0x7a, 0xcb, 0x65, 0xa8, 0x00, 0xa4, 0x6c, 0xdd, 0x1d, 0x03, 0x2b, 0xbe, 0x93, 0xac, 0xf9, 0xac, 0x32, 0xff, 0xda, 0x46, 0xf5, 0xf8, 0x28, 0x4b, 0xae, 0xfc, 0x98, 0x85, 0x16, 0xa7, 0xd3, 0x59, 0xec, 0x73, 0x6a, 0xa9, 0xf9, 0x5a, 0x3e, 0x74, 0x64, 0x97, 0x3a, 0xc3, 0xcc, 0xb0, 0x39, 0x67, 0x3a, 0xf0, 0x04, 0x7b, 0xc5, 0x81, 0x28, - 0x95, 0xd2, 0x3b, 0x9e, 0x56, 0x41, 0xb0, 0xd5, 0x38, 0x5f, 0xb3, 0x03, 0xbe, 0xb0, 0x91, 0x90, 0xcf, 0x39, 0x86, - 0xa0, 0x25, 0x21, 0xdd, 0x81, 0x7d, 0x9c, 0x5f, 0x4d, 0xfa, 0x36, 0xc4, 0x68, 0x32, 0xf2, 0x41, 0xb8, 0x86, 0xa0, - 0x42, 0x44, 0xda, 0xbd, 0xe8, 0x98, 0xf6, 0xa2, 0x46, 0x43, 0x6b, 0xd1, 0x3e, 0x49, 0x86, 0x91, 0x6c, 0x1e, 0xe0, - 0x10, 0xcf, 0x49, 0xb3, 0x83, 0x67, 0xa4, 0x2d, 0x9a, 0xf4, 0x66, 0xc7, 0xbe, 0x1a, 0x66, 0x6f, 0xcf, 0xc9, 0xdc, - 0xd8, 0xcf, 0xf9, 0x0b, 0xb0, 0xf7, 0xc9, 0x0c, 0x87, 0x24, 0x73, 0xe9, 0x0d, 0x0d, 0x1c, 0x1f, 0xe1, 0x50, 0x71, - 0x1a, 0xd4, 0x43, 0x33, 0x62, 0x54, 0x03, 0x33, 0x82, 0x7c, 0x18, 0x84, 0xc3, 0xce, 0x88, 0x10, 0x62, 0xef, 0x34, - 0x9b, 0xf6, 0x20, 0x23, 0x13, 0xee, 0x41, 0x89, 0xa1, 0x2c, 0x93, 0x29, 0x14, 0x75, 0x8d, 0x22, 0xe7, 0x0d, 0x77, - 0x39, 0xcd, 0xb9, 0x03, 0xc5, 0xe0, 0x01, 0xc8, 0x35, 0x61, 0xdb, 0xc7, 0x2d, 0xbb, 0x01, 0xa5, 0x82, 0x38, 0x11, - 0xce, 0xc8, 0x35, 0xf2, 0xc2, 0xe1, 0xfe, 0xc8, 0x14, 0x00, 0xa2, 0x10, 0x06, 0xbf, 0x1e, 0x84, 0xc3, 0xb6, 0x18, - 0xbc, 0x6f, 0x0f, 0x9c, 0x8c, 0xe4, 0x52, 0x43, 0x1b, 0xe4, 0xde, 0x07, 0x31, 0x55, 0xe4, 0x29, 0xe0, 0xd4, 0xb8, - 0x73, 0xd2, 0xec, 0x7a, 0xce, 0xdc, 0x9c, 0x44, 0x13, 0x06, 0x53, 0x58, 0xc0, 0x01, 0x81, 0xfa, 0x38, 0x23, 0x30, - 0x62, 0xd5, 0xec, 0xda, 0x53, 0xcf, 0x0f, 0xec, 0x07, 0x83, 0x73, 0xee, 0x8d, 0xb9, 0x1c, 0xfe, 0x9c, 0x2f, 0x97, - 0xf0, 0xef, 0x98, 0x0f, 0x32, 0x72, 0x2d, 0x8a, 0x26, 0xaa, 0x68, 0x0a, 0x45, 0x1f, 0x3c, 0x00, 0x15, 0xe7, 0xa5, - 0x96, 0x25, 0xd7, 0x64, 0x4a, 0x04, 0xec, 0x7b, 0x7b, 0xc9, 0x30, 0x6a, 0x74, 0x46, 0xe0, 0xe4, 0xcf, 0x78, 0xfe, - 0x1d, 0xe3, 0x91, 0x63, 0xb7, 0xfa, 0x36, 0x1a, 0xd8, 0x16, 0x2c, 0x6d, 0x2f, 0x6d, 0x10, 0x89, 0x61, 0xbf, 0xf1, - 0x8a, 0x7b, 0xf3, 0x3e, 0x69, 0x0f, 0x1c, 0xa6, 0x5c, 0x7a, 0x08, 0xfb, 0x8a, 0x71, 0xb6, 0xf1, 0x1c, 0x35, 0x18, - 0x6f, 0xe8, 0xe7, 0x39, 0x6a, 0xdc, 0x36, 0xa6, 0xc8, 0xf3, 0x1b, 0xb7, 0x0d, 0x67, 0x4e, 0x08, 0x69, 0x76, 0xcb, - 0x66, 0x5a, 0xfc, 0x45, 0xc8, 0x9b, 0x6a, 0x7f, 0xe7, 0x50, 0x6c, 0x87, 0xb4, 0xe1, 0x24, 0x43, 0x3a, 0x5a, 0x2e, - 0xed, 0xe3, 0x41, 0xdf, 0x46, 0x0d, 0x47, 0x13, 0x5a, 0x4b, 0x53, 0x1a, 0x42, 0x98, 0x8d, 0x0a, 0x15, 0x4f, 0x7a, - 0x52, 0x8b, 0x1d, 0x2d, 0xaa, 0xcd, 0x6e, 0xf0, 0x00, 0x5a, 0x94, 0x86, 0x8c, 0x54, 0x58, 0x67, 0x30, 0x4d, 0x4d, - 0xcc, 0x29, 0x69, 0xe3, 0x8c, 0x68, 0xf7, 0x75, 0x44, 0x78, 0x45, 0xf0, 0x3e, 0xa9, 0xaa, 0xe3, 0x61, 0x80, 0xc3, - 0x11, 0x79, 0x2a, 0x0d, 0x92, 0x9e, 0x76, 0x8e, 0xd3, 0x98, 0x3c, 0x59, 0x89, 0xe2, 0x06, 0x10, 0x60, 0xb9, 0x71, - 0x83, 0x79, 0x96, 0xd1, 0x84, 0xbf, 0x4e, 0x43, 0xa5, 0xa7, 0xd1, 0x18, 0x4c, 0x25, 0x08, 0xcf, 0x62, 0x50, 0xd2, - 0xba, 0x7a, 0x67, 0xcc, 0xd7, 0x5e, 0xcf, 0xc8, 0x5c, 0xea, 0x4f, 0x22, 0x68, 0xdb, 0x9b, 0x29, 0xcb, 0xd8, 0x41, - 0x78, 0xae, 0xa2, 0xb9, 0x8e, 0xeb, 0xba, 0x33, 0x37, 0x80, 0xd7, 0x30, 0x40, 0x8e, 0x0a, 0xb1, 0x8f, 0x9c, 0x9c, - 0xdc, 0xb8, 0x09, 0xbd, 0x11, 0xa3, 0x3a, 0xa8, 0x92, 0xcc, 0x7a, 0x7b, 0x1d, 0x47, 0x3d, 0xc1, 0x6e, 0x72, 0x37, - 0x49, 0x43, 0x0a, 0xe8, 0x81, 0xf8, 0xbd, 0x2a, 0x8a, 0xfc, 0xdc, 0x0c, 0x52, 0x55, 0xf0, 0x0d, 0x4d, 0xff, 0xf5, - 0x0c, 0x9c, 0xbe, 0x42, 0xd9, 0x2a, 0x2b, 0x4b, 0x4f, 0x38, 0x42, 0x6c, 0xec, 0xcc, 0x5c, 0x08, 0xee, 0x09, 0x12, - 0x62, 0x60, 0xcb, 0xcd, 0x4c, 0xa2, 0xba, 0x2d, 0xfb, 0x9c, 0x92, 0x70, 0x98, 0x35, 0x1a, 0xc2, 0x11, 0x3d, 0x97, - 0x24, 0x31, 0x43, 0x78, 0x5a, 0xee, 0x2d, 0x5d, 0xef, 0x2d, 0xa9, 0x8f, 0xe4, 0x4c, 0xeb, 0x0e, 0xdd, 0x06, 0xe3, - 0x48, 0xf8, 0x0a, 0xb9, 0x73, 0x8b, 0xf0, 0x98, 0xb4, 0x9c, 0xa1, 0x3b, 0xf8, 0xf3, 0x08, 0x0d, 0x1c, 0xf7, 0x2b, - 0xd4, 0x92, 0x8c, 0x63, 0x8a, 0x7a, 0xbe, 0x1c, 0x62, 0x21, 0xa2, 0x98, 0x1d, 0x2c, 0x7c, 0x89, 0x5e, 0x8a, 0x13, - 0x7f, 0x4a, 0xbd, 0x31, 0xec, 0x71, 0x4d, 0x37, 0x6f, 0x31, 0xd0, 0x91, 0x37, 0x56, 0x9c, 0xc4, 0xb5, 0x07, 0xbf, - 0xf0, 0xf2, 0x69, 0x60, 0x0f, 0xbe, 0xae, 0x9e, 0xfe, 0x6c, 0x0f, 0xbe, 0xe5, 0xde, 0xb7, 0x85, 0x72, 0x77, 0xd7, - 0x86, 0x78, 0xa8, 0x87, 0x28, 0xe4, 0xc2, 0x18, 0x98, 0x9b, 0xa3, 0x75, 0x47, 0xc7, 0x0c, 0x15, 0x6c, 0x5c, 0xb2, - 0xa2, 0xdc, 0xe5, 0xfe, 0x04, 0x50, 0x6a, 0xac, 0x40, 0x6e, 0x46, 0xf7, 0xab, 0x09, 0x03, 0xa1, 0x68, 0x6a, 0x05, - 0x54, 0xce, 0xfa, 0x6d, 0xb4, 0xa8, 0xd5, 0x15, 0x1a, 0x53, 0x3d, 0x9a, 0x5e, 0x72, 0xe9, 0x29, 0x69, 0xf7, 0xa6, - 0xc7, 0xb3, 0xde, 0xb4, 0xd1, 0x40, 0xb9, 0x26, 0xac, 0xf9, 0x70, 0x3a, 0xc2, 0xaf, 0xc1, 0xab, 0x67, 0x52, 0x12, - 0xae, 0x4d, 0xaf, 0xab, 0xa6, 0xd7, 0x68, 0xa4, 0x05, 0xea, 0x19, 0x4d, 0x67, 0xb2, 0x69, 0x51, 0x48, 0x9c, 0xac, - 0x12, 0xda, 0x11, 0x12, 0x25, 0x90, 0x12, 0x45, 0x08, 0x39, 0xe3, 0x68, 0x63, 0xaf, 0xd0, 0x27, 0x34, 0x17, 0x3b, - 0x16, 0x98, 0xa7, 0x94, 0x11, 0x0e, 0x60, 0x01, 0x9a, 0x96, 0xae, 0xe0, 0x5b, 0x3c, 0x6f, 0x74, 0x04, 0x91, 0x37, - 0x3b, 0xbd, 0x7a, 0x5f, 0x8f, 0xaa, 0xbe, 0xf0, 0xbc, 0x41, 0x6e, 0x4b, 0x2c, 0x15, 0x69, 0xa3, 0x51, 0xd4, 0xe3, - 0x9d, 0x7a, 0xdf, 0xd6, 0x22, 0x10, 0x27, 0xab, 0xa9, 0x19, 0x5a, 0xbe, 0x56, 0x12, 0x95, 0xb9, 0x2c, 0x49, 0x68, - 0x06, 0x32, 0x94, 0x70, 0xcc, 0x8a, 0xa2, 0x94, 0xeb, 0x6f, 0x40, 0x88, 0x62, 0x4a, 0x12, 0xe0, 0x3b, 0xc2, 0xec, - 0xc2, 0x29, 0xce, 0x70, 0x24, 0xb8, 0x06, 0x21, 0xe4, 0x54, 0x27, 0xb5, 0x70, 0xc1, 0x81, 0x7c, 0xc2, 0x0c, 0x89, - 0x94, 0x13, 0xea, 0x9e, 0xef, 0x9e, 0xa6, 0x77, 0x9a, 0x64, 0x43, 0x36, 0xf2, 0x44, 0xb5, 0x58, 0xf1, 0xad, 0x80, - 0xbc, 0x73, 0x38, 0x2a, 0xc3, 0x23, 0xae, 0x60, 0x7f, 0x4f, 0x59, 0x46, 0x85, 0x06, 0xbe, 0xab, 0xcd, 0x3e, 0xbf, - 0xae, 0x3e, 0xfa, 0xa6, 0xf3, 0x06, 0x10, 0x19, 0x80, 0x6f, 0x27, 0x25, 0x6b, 0xd5, 0xce, 0x77, 0x4f, 0xde, 0x6c, - 0x32, 0x81, 0x97, 0x4b, 0x65, 0xfc, 0xfa, 0xa0, 0xd9, 0xe0, 0xa0, 0x82, 0xd4, 0x57, 0x3f, 0x3c, 0xc7, 0x17, 0x0a, - 0x52, 0xe0, 0x24, 0x40, 0x45, 0xe7, 0xbb, 0x27, 0xef, 0x9d, 0x44, 0xb8, 0x96, 0x10, 0x36, 0xa7, 0xed, 0x64, 0xc4, - 0x89, 0x08, 0x45, 0x72, 0xee, 0x25, 0xe3, 0xca, 0x0c, 0xf1, 0xed, 0x45, 0xe2, 0x25, 0xd8, 0x0f, 0x43, 0x36, 0x22, - 0xbe, 0xc2, 0x00, 0xf1, 0x11, 0xf6, 0x6b, 0x66, 0x19, 0x81, 0x05, 0x10, 0x63, 0x9d, 0xc1, 0x4a, 0xb8, 0x52, 0xf1, - 0x43, 0xd8, 0x17, 0xa3, 0xf2, 0x42, 0x8a, 0x8e, 0x9f, 0xd7, 0x72, 0xd3, 0x2a, 0x6b, 0xf4, 0x5b, 0xb0, 0x9c, 0xf4, - 0xc3, 0x6b, 0xd5, 0x75, 0x59, 0xf0, 0x54, 0x27, 0x91, 0x9d, 0xef, 0x9e, 0xbc, 0x52, 0x79, 0x64, 0x33, 0x5f, 0x73, - 0xfb, 0x35, 0x0b, 0xf3, 0xe4, 0x95, 0x5b, 0xbd, 0x15, 0x95, 0xcf, 0x77, 0x4f, 0x3e, 0x6c, 0xaa, 0x06, 0xe5, 0xc5, - 0xbc, 0x32, 0xf1, 0x05, 0x7c, 0x0b, 0x1a, 0x7b, 0x0b, 0x25, 0x1a, 0x3c, 0x56, 0x60, 0x21, 0x8e, 0xbc, 0xbc, 0x28, - 0x3d, 0x23, 0x4f, 0x71, 0x4a, 0x44, 0x1c, 0xa8, 0xbe, 0x6a, 0x4a, 0xc9, 0x63, 0x69, 0x72, 0x16, 0xa4, 0x33, 0xba, - 0x25, 0x38, 0x74, 0x82, 0x5c, 0x36, 0x85, 0x04, 0x1a, 0x01, 0x3a, 0xc3, 0x3b, 0x6d, 0xd4, 0xab, 0x0b, 0xaf, 0x54, - 0x10, 0x69, 0x56, 0x93, 0x2c, 0x38, 0x22, 0x6d, 0xec, 0x93, 0x36, 0x0e, 0x48, 0x3e, 0x6c, 0x4b, 0xf1, 0xd0, 0x0b, - 0xca, 0x7e, 0xa5, 0x90, 0x81, 0xdc, 0xb0, 0x40, 0xee, 0x56, 0x29, 0x7e, 0xc3, 0x5e, 0x20, 0x5c, 0x8f, 0x42, 0xa2, - 0x87, 0xd2, 0x68, 0x75, 0x32, 0x9c, 0x89, 0x8e, 0xcf, 0xd8, 0x65, 0x0c, 0xd9, 0x25, 0x30, 0x2b, 0xcc, 0x91, 0x57, - 0x56, 0xed, 0xa8, 0xaa, 0x81, 0x2b, 0xd6, 0x29, 0xc3, 0x81, 0x0b, 0x8c, 0x1b, 0x07, 0x2a, 0x19, 0x27, 0x5f, 0x6f, - 0xf2, 0x70, 0x6f, 0xcf, 0x91, 0x8d, 0xbe, 0xe3, 0x4e, 0xa6, 0xdf, 0x57, 0xa1, 0xbb, 0x6f, 0x25, 0xaf, 0x08, 0x91, - 0x80, 0xbf, 0xd1, 0xf0, 0x47, 0x05, 0xc4, 0xa1, 0x9d, 0xa0, 0x8e, 0x41, 0x0d, 0xbc, 0xd0, 0xf4, 0xea, 0xd3, 0x6f, - 0x34, 0xca, 0x30, 0x6d, 0x1d, 0x5b, 0x27, 0x38, 0x2d, 0xae, 0x9c, 0x32, 0xff, 0xa7, 0xbd, 0x96, 0x35, 0xa5, 0x41, - 0x40, 0xcc, 0xa4, 0x59, 0xa6, 0x27, 0x63, 0x6c, 0x09, 0x06, 0xf5, 0x5e, 0xa8, 0xc4, 0x05, 0x2c, 0x72, 0xac, 0x54, - 0x25, 0xcd, 0xce, 0xba, 0xc8, 0xd3, 0x95, 0x20, 0x2c, 0x05, 0x95, 0x1a, 0x85, 0x22, 0xef, 0x57, 0xeb, 0x99, 0x97, - 0x38, 0x47, 0xca, 0xc7, 0x25, 0xa0, 0x10, 0xc8, 0xea, 0x96, 0x48, 0x79, 0x4e, 0x26, 0xdb, 0x49, 0xfe, 0xc4, 0x20, - 0xf9, 0x27, 0x84, 0x1a, 0xe4, 0x2f, 0x3d, 0x1c, 0x6e, 0xaa, 0x5c, 0x0b, 0xb9, 0x7e, 0x75, 0x3a, 0x23, 0xe0, 0x43, - 0xab, 0x63, 0xb4, 0x16, 0x57, 0xdc, 0xc2, 0x50, 0xcc, 0x1d, 0x22, 0xbc, 0x90, 0x58, 0x07, 0x81, 0x9d, 0x2a, 0xaa, - 0x06, 0x43, 0x6f, 0x72, 0xe9, 0x99, 0x1c, 0xf0, 0xe4, 0xc3, 0xdd, 0x01, 0xd1, 0xd3, 0xd9, 0xfa, 0xce, 0x35, 0x32, - 0x40, 0x61, 0xd6, 0xc6, 0xc6, 0xad, 0xe7, 0x83, 0xc2, 0xf8, 0x65, 0x20, 0xbb, 0xce, 0x7c, 0x56, 0x36, 0xa1, 0x96, - 0x7f, 0x00, 0x6d, 0xa7, 0x23, 0x6a, 0x50, 0xa3, 0x5b, 0xe0, 0x47, 0x32, 0x0f, 0xd5, 0xcf, 0xb6, 0xb0, 0x8f, 0x13, - 0x51, 0x81, 0x26, 0xe1, 0xe6, 0xd7, 0x4f, 0x0a, 0x45, 0x26, 0x12, 0x34, 0xb4, 0x00, 0xfe, 0x27, 0x49, 0x1e, 0xe8, - 0x46, 0xc8, 0x05, 0x40, 0xd0, 0x44, 0xe0, 0xa9, 0x42, 0x98, 0x6d, 0x57, 0xce, 0xf7, 0xe7, 0x3b, 0x84, 0x4c, 0x2a, - 0xe7, 0xe3, 0xbb, 0x2a, 0xfb, 0x0a, 0xc8, 0x02, 0x79, 0x60, 0x3c, 0x96, 0x05, 0x32, 0x7e, 0x79, 0xaa, 0xab, 0x0b, - 0x03, 0xd2, 0xad, 0xf4, 0x6d, 0x23, 0xb6, 0x29, 0xbc, 0x72, 0xf2, 0xbd, 0x46, 0xc3, 0xca, 0xdb, 0x5d, 0x78, 0xfb, - 0x92, 0x0b, 0x18, 0xe1, 0xf9, 0xbd, 0xa8, 0xad, 0xfb, 0x2d, 0x3e, 0xae, 0xa6, 0xb0, 0xac, 0x2c, 0x8a, 0xcb, 0x92, - 0x9c, 0x66, 0xfc, 0x09, 0x1d, 0xa7, 0x19, 0x84, 0x2c, 0x4a, 0x9c, 0xa0, 0x62, 0xd7, 0x70, 0xdb, 0x89, 0xf9, 0x19, - 0x71, 0x82, 0x95, 0x09, 0x8a, 0x5f, 0x1f, 0x45, 0xd4, 0xfa, 0x7c, 0xb5, 0xd5, 0x64, 0x6f, 0xef, 0x5d, 0x85, 0x26, - 0x05, 0xa5, 0x80, 0xc2, 0x60, 0x5a, 0x52, 0xa5, 0x51, 0xa1, 0xdc, 0x5d, 0xa7, 0x74, 0x01, 0x68, 0x86, 0x61, 0xf2, - 0x9e, 0xe7, 0x84, 0x17, 0x93, 0x55, 0x16, 0xaf, 0x5c, 0x13, 0xcc, 0x34, 0x5b, 0x80, 0xc3, 0x83, 0xa1, 0x2d, 0x7d, - 0x45, 0x79, 0x95, 0x12, 0x5b, 0xc2, 0x70, 0x0a, 0xc8, 0x72, 0x84, 0x11, 0x62, 0x50, 0xe0, 0x46, 0xa3, 0xe4, 0x2d, - 0xe8, 0x95, 0x11, 0xce, 0xdd, 0x08, 0x92, 0x60, 0x6b, 0x5b, 0x16, 0x21, 0x2c, 0x33, 0x73, 0x8c, 0x5c, 0x82, 0x93, - 0xe7, 0x9b, 0x3c, 0xca, 0x9a, 0xa8, 0xa9, 0x90, 0x3a, 0x50, 0x23, 0x45, 0x65, 0x03, 0xf7, 0xca, 0x61, 0x4a, 0x71, - 0xd3, 0x71, 0x33, 0x60, 0xc0, 0x3f, 0x73, 0x47, 0xc6, 0xa2, 0x40, 0x66, 0x64, 0xee, 0xdc, 0xa9, 0x0d, 0xdd, 0xcb, - 0x44, 0x33, 0xac, 0x10, 0x17, 0x99, 0x68, 0xca, 0x44, 0x5c, 0xef, 0xb4, 0xe2, 0xa5, 0x57, 0x32, 0x8f, 0x9a, 0x6b, - 0x2e, 0x58, 0x65, 0x92, 0x18, 0xd3, 0xbf, 0x92, 0xa9, 0xd1, 0x65, 0x25, 0x50, 0xc3, 0xe8, 0xb5, 0xf5, 0x44, 0xac, - 0x01, 0x2d, 0x80, 0xbe, 0x16, 0xa7, 0xdc, 0x58, 0x51, 0xed, 0xc3, 0x16, 0x63, 0x1a, 0x52, 0xff, 0x1d, 0xe4, 0xba, - 0xac, 0xee, 0xf9, 0xe7, 0x42, 0x16, 0x32, 0x9c, 0xd7, 0x18, 0x7b, 0x2a, 0x18, 0x3b, 0x02, 0x3d, 0x4d, 0xa7, 0x7f, - 0x0f, 0x54, 0xca, 0x8b, 0xca, 0x5d, 0x74, 0x14, 0x89, 0xbd, 0x2e, 0xc3, 0xe5, 0xc6, 0xef, 0x95, 0xd5, 0xf0, 0x18, - 0x81, 0x34, 0x20, 0xac, 0x38, 0x7b, 0x8a, 0x70, 0xde, 0x68, 0xf4, 0xf2, 0x63, 0x5a, 0xb9, 0x48, 0x2a, 0x18, 0x19, - 0x44, 0x74, 0x81, 0xe0, 0x6b, 0x32, 0x14, 0x62, 0xfe, 0x3a, 0x3f, 0x3b, 0x07, 0x57, 0xfb, 0xc9, 0x3b, 0xc7, 0xe4, - 0x6a, 0x66, 0xdd, 0x32, 0x68, 0x0a, 0xf3, 0x71, 0xaa, 0x78, 0xcb, 0xdb, 0xbb, 0x33, 0x3c, 0x00, 0xee, 0x9d, 0x0e, - 0x86, 0x6c, 0x34, 0xd4, 0xe3, 0x92, 0x25, 0x94, 0xbb, 0xaf, 0x87, 0xaa, 0xc4, 0x44, 0x73, 0xb0, 0x1e, 0xaf, 0x4c, - 0x59, 0x4e, 0xf2, 0xa2, 0xc8, 0x69, 0x15, 0xdf, 0x5f, 0xc9, 0xc0, 0x14, 0xc2, 0x65, 0xdd, 0xd9, 0x7e, 0x3a, 0x23, - 0x1c, 0x1b, 0x84, 0xfa, 0x76, 0x5b, 0xe8, 0xa3, 0x02, 0x13, 0xf6, 0xb5, 0x12, 0x8a, 0xdf, 0x6e, 0x12, 0x8a, 0x38, - 0x55, 0x5b, 0x5e, 0x08, 0xc4, 0xce, 0x3d, 0x04, 0xa2, 0x72, 0xb2, 0x6b, 0x99, 0x08, 0xea, 0x48, 0x4d, 0x26, 0xd6, - 0x97, 0x94, 0xa4, 0x98, 0xa9, 0xd5, 0xe8, 0x77, 0x97, 0x4b, 0x36, 0x6c, 0x83, 0x13, 0xc9, 0xb6, 0xe1, 0x67, 0x47, - 0xfe, 0x34, 0x38, 0xb1, 0x74, 0x02, 0x3b, 0xac, 0x34, 0x59, 0x90, 0x0b, 0x69, 0xce, 0x8e, 0xc8, 0xca, 0x12, 0x34, - 0xad, 0x28, 0x48, 0x11, 0x38, 0x61, 0x65, 0x94, 0x09, 0x20, 0x16, 0xb2, 0x42, 0x19, 0x90, 0xce, 0xc6, 0xf4, 0x3f, - 0x6d, 0x5e, 0x7e, 0x5a, 0x13, 0xad, 0xc9, 0x15, 0xa9, 0x3e, 0xd4, 0x12, 0x0e, 0x14, 0x04, 0x4a, 0x3f, 0xdc, 0x11, - 0x26, 0x68, 0x25, 0xca, 0x91, 0x29, 0x87, 0x70, 0x1b, 0x5c, 0x68, 0x3b, 0xef, 0x64, 0x80, 0x77, 0x83, 0x34, 0xc1, - 0x99, 0x41, 0xd7, 0xcf, 0x09, 0xaf, 0xb1, 0x92, 0x88, 0x28, 0x4b, 0x09, 0x07, 0x82, 0x4c, 0x39, 0x49, 0x87, 0xed, - 0x11, 0x28, 0xa0, 0x3d, 0xff, 0x38, 0xad, 0x4c, 0x60, 0xbf, 0xd1, 0x40, 0x81, 0x1e, 0x35, 0x1a, 0xb2, 0x86, 0x3f, - 0xc2, 0x14, 0xfb, 0xd2, 0x30, 0x39, 0xdd, 0xdb, 0x73, 0x82, 0x6a, 0xdc, 0xa1, 0x3f, 0x42, 0x38, 0x5b, 0x2e, 0x1d, - 0x01, 0x56, 0x80, 0x96, 0xcb, 0xc0, 0x04, 0x4b, 0xbc, 0x86, 0x66, 0x93, 0x01, 0x27, 0x13, 0x21, 0x00, 0x27, 0x00, - 0x61, 0x83, 0x38, 0x81, 0x72, 0xee, 0x05, 0xe0, 0x8c, 0x6a, 0xa4, 0x43, 0xbf, 0xd1, 0x19, 0x19, 0x8c, 0x6b, 0xe8, - 0x8f, 0x48, 0x50, 0x40, 0x72, 0x6b, 0xae, 0x44, 0xe4, 0xcf, 0x20, 0xca, 0x7e, 0x16, 0x92, 0x45, 0x76, 0x68, 0xae, - 0xc6, 0xaa, 0x33, 0xa0, 0xa4, 0x28, 0xb5, 0xac, 0xba, 0x5e, 0x2d, 0x0b, 0xa2, 0xac, 0x84, 0x55, 0x2c, 0x78, 0x00, - 0x96, 0x7d, 0x49, 0xe6, 0xbf, 0xf0, 0x32, 0xcd, 0xfa, 0xdb, 0x8d, 0xc9, 0xd5, 0xae, 0xeb, 0xfa, 0xd9, 0x44, 0x44, - 0x32, 0x74, 0x14, 0x56, 0x10, 0xff, 0xbe, 0x02, 0xd3, 0x18, 0x78, 0x58, 0x8e, 0x35, 0x22, 0x12, 0x7c, 0xad, 0xda, - 0xe8, 0x13, 0x25, 0xbf, 0x6e, 0xf4, 0x32, 0x48, 0x48, 0xbe, 0xfe, 0xad, 0x90, 0x1c, 0x28, 0x48, 0x24, 0x79, 0xac, - 0xe0, 0x6c, 0x0b, 0x2e, 0x7e, 0xe5, 0x2b, 0x38, 0xdb, 0x8e, 0xdb, 0x92, 0x21, 0x6c, 0x83, 0xcf, 0xe0, 0x0d, 0x12, - 0xd0, 0xaa, 0xc0, 0x80, 0xf2, 0x70, 0x55, 0xf7, 0x92, 0xac, 0x14, 0x84, 0x29, 0x27, 0x0e, 0xab, 0x6f, 0x80, 0x4a, - 0x1b, 0x35, 0x0c, 0x5f, 0xe6, 0x4d, 0x90, 0xe1, 0x12, 0xa8, 0xa7, 0xae, 0x00, 0x39, 0x29, 0x5f, 0x3b, 0xa4, 0x22, - 0xec, 0x48, 0x25, 0xce, 0x0d, 0xfc, 0x19, 0x9f, 0x67, 0xa0, 0x4a, 0xe5, 0xfa, 0x37, 0x14, 0xc3, 0x59, 0x10, 0x51, - 0x06, 0x3f, 0xa0, 0x60, 0xe6, 0xe7, 0x39, 0xbb, 0x92, 0x65, 0xea, 0x37, 0xce, 0x88, 0x26, 0xe5, 0x5c, 0xea, 0x84, - 0x29, 0xea, 0xa5, 0x8a, 0x4e, 0xeb, 0x68, 0x7b, 0x76, 0x45, 0x13, 0xfe, 0x92, 0xe5, 0x9c, 0x26, 0x30, 0xfd, 0x8a, - 0xe2, 0x60, 0x46, 0x39, 0x82, 0x0d, 0x5b, 0x6b, 0xe5, 0x87, 0xe1, 0x9d, 0x4d, 0x78, 0x5d, 0x07, 0x8a, 0xfc, 0x24, - 0x8c, 0xe5, 0x20, 0x66, 0x42, 0xa3, 0x4e, 0xe2, 0x2c, 0x6b, 0x9a, 0xf9, 0x34, 0x95, 0xb2, 0x21, 0xb8, 0xbb, 0xc3, - 0x88, 0x96, 0x04, 0x5a, 0x7a, 0xde, 0xa9, 0xb5, 0x40, 0xc0, 0x7b, 0xcb, 0x22, 0x98, 0x33, 0xc1, 0xdc, 0xe0, 0xa8, - 0x6e, 0x1d, 0x4e, 0x4d, 0x37, 0xdf, 0x6d, 0x3c, 0xd8, 0xb6, 0x49, 0x38, 0x08, 0x3a, 0x79, 0xb8, 0xdd, 0xb2, 0x7a, - 0xa5, 0x25, 0x87, 0x96, 0x16, 0xec, 0xbe, 0x8c, 0x19, 0x2d, 0x34, 0x79, 0x21, 0xbd, 0x15, 0x77, 0x39, 0xf9, 0x05, - 0x4e, 0x0e, 0x3d, 0xe7, 0xd3, 0x78, 0xe5, 0x80, 0x4c, 0x6f, 0xb7, 0xd4, 0xfe, 0x77, 0xb9, 0xf3, 0x04, 0xbf, 0x82, - 0xb0, 0xee, 0x37, 0x55, 0xf5, 0xf5, 0x70, 0xee, 0x37, 0x15, 0x82, 0xbe, 0xf1, 0xd6, 0xea, 0x19, 0x61, 0xdc, 0xae, - 0x7b, 0xe4, 0xb6, 0x6d, 0xad, 0x2d, 0xfd, 0x28, 0x83, 0x48, 0x32, 0xd5, 0x52, 0xec, 0x07, 0x5c, 0x25, 0xaa, 0x41, - 0xc2, 0x5c, 0xdd, 0x42, 0xa2, 0x2a, 0xc5, 0x50, 0xea, 0xf0, 0xdb, 0x96, 0x47, 0xc9, 0x98, 0x54, 0xda, 0x19, 0x6f, - 0xfd, 0x8c, 0xef, 0xc2, 0x2e, 0xcb, 0xd6, 0x4e, 0xe3, 0x45, 0x04, 0x3c, 0x68, 0xf7, 0x1b, 0xc2, 0x30, 0xb6, 0x73, - 0x79, 0x18, 0xc8, 0xec, 0x9f, 0x64, 0x5a, 0x77, 0xab, 0x5b, 0x19, 0xaf, 0xc1, 0xfe, 0x47, 0x38, 0xd2, 0x47, 0xe4, - 0xa8, 0xe2, 0xc0, 0xd4, 0x5b, 0x14, 0xa5, 0x53, 0x20, 0x93, 0xca, 0x5b, 0x82, 0x70, 0x56, 0x88, 0xf0, 0xf6, 0xf7, - 0xf8, 0x07, 0xc5, 0x12, 0xcf, 0x4b, 0x8e, 0xf3, 0xec, 0xbe, 0x1c, 0x51, 0x82, 0x5f, 0x46, 0xef, 0x81, 0x8e, 0x05, - 0x85, 0x16, 0x9a, 0x8a, 0x9e, 0xa6, 0x6a, 0x22, 0x5b, 0xf3, 0x52, 0x31, 0x2d, 0x33, 0x6a, 0xc4, 0x30, 0x1b, 0x12, - 0x39, 0xb5, 0x95, 0xcd, 0xcb, 0x5d, 0x55, 0x1b, 0x17, 0x6d, 0xc1, 0x62, 0x15, 0x58, 0x5c, 0x2e, 0x9d, 0x3a, 0xaa, - 0x09, 0x33, 0xe2, 0x18, 0x08, 0x33, 0x23, 0xa1, 0xa2, 0xa6, 0x59, 0xcb, 0x36, 0x0e, 0x5a, 0xcd, 0x27, 0xd2, 0xba, - 0x79, 0x0d, 0x0e, 0xd3, 0x85, 0x20, 0x9b, 0x9b, 0x3e, 0x05, 0x2c, 0x67, 0x57, 0x0e, 0x64, 0x60, 0xe8, 0xc7, 0x32, - 0x57, 0xb6, 0x4a, 0x6a, 0xdd, 0x80, 0x5f, 0x74, 0x47, 0xb6, 0xac, 0x42, 0xdd, 0xfa, 0x7b, 0x23, 0xd7, 0xe8, 0x69, - 0xba, 0x2d, 0xd7, 0xa8, 0xa6, 0xed, 0xee, 0xb4, 0xd1, 0xdd, 0x79, 0xa9, 0x72, 0xac, 0xcd, 0x55, 0x7e, 0xc3, 0x70, - 0x1d, 0xa0, 0x4d, 0x89, 0x66, 0xcd, 0x55, 0x4e, 0x8b, 0xe2, 0xbc, 0x3c, 0x4d, 0x20, 0x52, 0x77, 0xce, 0x25, 0xfd, - 0x2b, 0xab, 0x51, 0x1c, 0xca, 0x75, 0xbe, 0x27, 0x93, 0x38, 0xbd, 0xf4, 0xe3, 0xf7, 0x30, 0x5e, 0xf5, 0xf2, 0xf9, - 0x6d, 0x98, 0xf9, 0x9c, 0x2a, 0xee, 0x52, 0xc1, 0xf0, 0xbd, 0x01, 0xc3, 0xf7, 0x92, 0x4f, 0x57, 0xed, 0xf1, 0xe2, - 0x65, 0xd9, 0x81, 0x77, 0x5e, 0x68, 0x96, 0x71, 0xcb, 0x37, 0x8f, 0xb1, 0xca, 0xc2, 0x6e, 0x4b, 0x16, 0x76, 0xcb, - 0x9d, 0xd5, 0xae, 0x1c, 0xe7, 0x87, 0xcd, 0xbd, 0xac, 0x73, 0xb6, 0x1f, 0xaa, 0x8d, 0xff, 0x83, 0x77, 0x67, 0x1b, - 0x83, 0xcb, 0xed, 0xbb, 0xfb, 0x22, 0x59, 0x45, 0x82, 0xfc, 0x12, 0x92, 0x0e, 0x38, 0xe9, 0x1b, 0x87, 0x0e, 0x2a, - 0x39, 0xa5, 0xf3, 0x80, 0x9c, 0x60, 0x9e, 0xf3, 0x74, 0xaa, 0xfa, 0xcc, 0xd5, 0x49, 0x23, 0xf1, 0x12, 0x5c, 0xd1, - 0x22, 0xd6, 0xee, 0xd5, 0xcf, 0x72, 0x2d, 0x3e, 0xb2, 0x24, 0xf4, 0x72, 0xac, 0xa4, 0x48, 0xee, 0xa5, 0x05, 0xd1, - 0xd9, 0xc6, 0xeb, 0xef, 0xf0, 0x98, 0x25, 0x2c, 0x8f, 0x68, 0xe6, 0x64, 0x68, 0xb1, 0x6d, 0xb0, 0x0c, 0x02, 0x32, - 0x72, 0x30, 0xfc, 0xd7, 0xea, 0xd4, 0x9f, 0x0b, 0xbd, 0x81, 0x1f, 0x68, 0x4a, 0x79, 0x94, 0x86, 0x90, 0x96, 0xe2, - 0x86, 0xe5, 0xa1, 0xa6, 0xbd, 0xbd, 0x1d, 0xc7, 0x16, 0x6e, 0x09, 0x38, 0x00, 0x6e, 0xbe, 0x41, 0x83, 0x05, 0x9c, - 0xcf, 0xa9, 0x86, 0xa6, 0x68, 0x41, 0x57, 0x8f, 0xb2, 0x70, 0xf7, 0x23, 0xbd, 0xc5, 0x09, 0x2a, 0x0a, 0x4f, 0x42, - 0x6d, 0x8f, 0x19, 0x8d, 0x43, 0x1b, 0x7f, 0xa4, 0xb7, 0x5e, 0x79, 0x66, 0x5c, 0x1c, 0x71, 0x16, 0x0b, 0x68, 0xa7, - 0xd7, 0x89, 0x8d, 0xab, 0x41, 0xbc, 0x45, 0x81, 0xd3, 0x8c, 0x4d, 0x80, 0x38, 0xbf, 0xa1, 0xb7, 0x9e, 0xec, 0x8f, - 0x19, 0xe7, 0xf5, 0xd0, 0x42, 0xa3, 0xde, 0x35, 0x8a, 0xcd, 0x65, 0x50, 0x06, 0xc5, 0x50, 0xb4, 0x1d, 0x91, 0x5a, - 0xbd, 0xca, 0x3c, 0x44, 0xa8, 0xb8, 0xef, 0x54, 0xf0, 0x37, 0xa6, 0x68, 0xe3, 0xb5, 0xcc, 0xd7, 0x95, 0x46, 0x14, - 0x1a, 0x54, 0x99, 0x1e, 0xbb, 0x4e, 0xa2, 0x77, 0x9d, 0x3a, 0x84, 0x60, 0x38, 0xc2, 0xbe, 0xe1, 0xaa, 0x53, 0xef, - 0xaf, 0x32, 0x21, 0xa4, 0x8a, 0x24, 0xbd, 0xa8, 0xda, 0x59, 0xbb, 0x0e, 0xe0, 0x1d, 0x12, 0x5a, 0x7c, 0x71, 0x26, - 0xb3, 0xd0, 0xd9, 0xa2, 0x7f, 0xe3, 0xc4, 0x59, 0xe8, 0x29, 0x78, 0x89, 0x89, 0x45, 0x5e, 0x00, 0x15, 0x2a, 0xfa, - 0x92, 0x09, 0x80, 0x6c, 0xec, 0xb0, 0x35, 0xa9, 0x99, 0x0a, 0xa9, 0xe9, 0x1a, 0x18, 0xdf, 0x22, 0x25, 0xa9, 0x40, - 0x86, 0x50, 0x22, 0x85, 0xd0, 0x53, 0x8b, 0xab, 0x48, 0xc8, 0x5c, 0xd0, 0xf2, 0x04, 0x9d, 0x5c, 0xf3, 0xb4, 0x06, - 0x96, 0x23, 0xfa, 0x41, 0x85, 0x07, 0x53, 0xa2, 0xb2, 0x42, 0x51, 0x1e, 0xcd, 0xd6, 0xe9, 0xad, 0x4e, 0xe6, 0xea, - 0x69, 0x11, 0x8d, 0x12, 0x27, 0x42, 0x8b, 0xc4, 0x89, 0x70, 0x0a, 0xe9, 0x88, 0x59, 0x51, 0xc2, 0x4f, 0xcd, 0xd5, - 0xa8, 0x25, 0x2b, 0x6f, 0x3e, 0xe5, 0x07, 0xca, 0x3c, 0x87, 0x14, 0x4d, 0x9c, 0x68, 0x9e, 0x92, 0x38, 0xe2, 0xb8, - 0x9d, 0xb1, 0x6c, 0xdf, 0xab, 0x04, 0x1d, 0x05, 0xd8, 0xdf, 0xb8, 0xb3, 0x30, 0x66, 0x61, 0x9e, 0xe8, 0x56, 0xa7, - 0xfe, 0x54, 0xb0, 0xaf, 0xca, 0x21, 0x75, 0x72, 0xb2, 0x22, 0x71, 0xee, 0x4e, 0xb5, 0xfc, 0x65, 0x4e, 0xb3, 0xdb, - 0x33, 0x0a, 0xa9, 0xce, 0x29, 0x1c, 0xf8, 0xad, 0x96, 0xa1, 0xca, 0x53, 0x1f, 0xa4, 0x42, 0x59, 0x29, 0xea, 0xe7, - 0x00, 0x57, 0x4f, 0x09, 0x16, 0x22, 0xda, 0x68, 0x38, 0x62, 0xe4, 0x6e, 0xa1, 0x5b, 0xcf, 0x4f, 0xd2, 0x1e, 0x03, - 0xff, 0x5a, 0x85, 0x69, 0x15, 0x2c, 0xc0, 0x99, 0x79, 0x26, 0x75, 0x98, 0x8f, 0x56, 0xbd, 0x32, 0x50, 0x04, 0xe1, - 0xbb, 0x74, 0xfb, 0x54, 0x37, 0x25, 0xcd, 0x6e, 0x9f, 0x6a, 0x2d, 0xe8, 0x27, 0x12, 0x7e, 0xb0, 0x1a, 0xa7, 0x3c, - 0xc1, 0xcc, 0x8a, 0x02, 0x15, 0x00, 0xde, 0x5f, 0x7a, 0x8e, 0xf3, 0x17, 0x95, 0x32, 0xe8, 0x42, 0x2c, 0xf6, 0x2c, - 0x4e, 0x35, 0x13, 0xaf, 0xc6, 0xff, 0xcb, 0xda, 0xf8, 0x7f, 0x31, 0x4e, 0x9d, 0x82, 0x69, 0x34, 0x49, 0x68, 0xa8, - 0x59, 0x27, 0x92, 0x04, 0x28, 0xf4, 0xb6, 0x8c, 0x93, 0x8f, 0x17, 0x1e, 0x68, 0x5c, 0x8b, 0x71, 0x9a, 0xf0, 0xe6, - 0xd8, 0x9f, 0xb2, 0xf8, 0xd6, 0x9b, 0xb3, 0xe6, 0x34, 0x4d, 0xd2, 0x7c, 0xe6, 0x07, 0x14, 0xe7, 0xb7, 0x39, 0xa7, - 0xd3, 0xe6, 0x9c, 0xe1, 0xe7, 0x34, 0xbe, 0xa2, 0x9c, 0x05, 0x3e, 0xb6, 0x4f, 0x32, 0xe6, 0xc7, 0xd6, 0x6b, 0x3f, - 0xcb, 0xd2, 0x6b, 0x1b, 0xbf, 0x4b, 0x2f, 0x53, 0x9e, 0xe2, 0x37, 0x37, 0xb7, 0x13, 0x9a, 0xe0, 0x0f, 0x97, 0xf3, - 0x84, 0xcf, 0x71, 0xee, 0x27, 0x79, 0x33, 0xa7, 0x19, 0x1b, 0xf7, 0x82, 0x34, 0x4e, 0xb3, 0x26, 0x64, 0x6c, 0x4f, - 0xa9, 0x17, 0xb3, 0x49, 0xc4, 0xad, 0xd0, 0xcf, 0x3e, 0xf6, 0x9a, 0xcd, 0x59, 0xc6, 0xa6, 0x7e, 0x76, 0xdb, 0x14, - 0x35, 0xbc, 0x2f, 0xdb, 0xfb, 0xfe, 0xe3, 0xf1, 0x41, 0x8f, 0x67, 0x7e, 0x92, 0x33, 0x58, 0x26, 0xcf, 0x8f, 0x63, - 0x6b, 0xff, 0xb0, 0x3d, 0xcd, 0x77, 0x64, 0x20, 0xcf, 0x4f, 0x78, 0x71, 0x81, 0xdf, 0x03, 0xdc, 0xee, 0x25, 0x4f, - 0xf0, 0xe5, 0x9c, 0xf3, 0x34, 0x59, 0x04, 0xf3, 0x2c, 0x4f, 0x33, 0x6f, 0x96, 0xb2, 0x84, 0xd3, 0xac, 0x77, 0x99, - 0x66, 0x21, 0xcd, 0x9a, 0x99, 0x1f, 0xb2, 0x79, 0xee, 0x1d, 0xcc, 0x6e, 0x7a, 0xa0, 0x59, 0x4c, 0xb2, 0x74, 0x9e, - 0x84, 0x6a, 0x2c, 0x96, 0x44, 0x34, 0x63, 0xdc, 0x7c, 0x21, 0x2e, 0x32, 0xf1, 0x62, 0x96, 0x50, 0x3f, 0x6b, 0x4e, - 0xa0, 0x31, 0x98, 0x45, 0xed, 0x90, 0x4e, 0x70, 0x36, 0xb9, 0xf4, 0x9d, 0x4e, 0xf7, 0x11, 0xd6, 0xff, 0xbb, 0x87, - 0xc8, 0x6a, 0x6f, 0x2e, 0xee, 0xb4, 0xdb, 0x7f, 0x42, 0xbd, 0x95, 0x51, 0x04, 0x40, 0x5e, 0x67, 0x76, 0x63, 0xe5, - 0x29, 0x64, 0xb4, 0x6d, 0x6a, 0xd9, 0x9b, 0xf9, 0x21, 0xe4, 0x03, 0x7b, 0xdd, 0xd9, 0x4d, 0x01, 0xb3, 0xf3, 0x64, - 0x8a, 0xa9, 0x9a, 0xa4, 0x7a, 0x5a, 0xfc, 0x56, 0x88, 0x8f, 0x36, 0x43, 0xdc, 0xd5, 0x10, 0x57, 0x58, 0x6f, 0x86, - 0xf3, 0x4c, 0xc4, 0x56, 0xbd, 0x4e, 0x2e, 0x01, 0x89, 0xd2, 0x2b, 0x9a, 0x69, 0x38, 0xc4, 0xc3, 0x6f, 0x06, 0xa3, - 0xbb, 0x19, 0x8c, 0xa3, 0x4f, 0x81, 0x91, 0x25, 0xe1, 0xa2, 0xbe, 0xae, 0x9d, 0x8c, 0x4e, 0x7b, 0x11, 0x05, 0x7a, - 0xf2, 0xba, 0xf0, 0xfb, 0x9a, 0x85, 0x3c, 0x92, 0x3f, 0x05, 0x39, 0x5f, 0xcb, 0x77, 0x87, 0xed, 0xb6, 0x7c, 0xce, - 0xd9, 0xaf, 0xd4, 0xeb, 0xb8, 0x50, 0xa1, 0xb8, 0xc0, 0x3f, 0x94, 0xa7, 0x79, 0xeb, 0xdc, 0x13, 0xff, 0xc5, 0x3c, - 0xe6, 0x6b, 0xa4, 0x28, 0x56, 0x87, 0xa2, 0x71, 0xaa, 0x65, 0xa5, 0x14, 0x3e, 0xe0, 0xb6, 0x13, 0xdc, 0x91, 0xb0, - 0x7e, 0x79, 0x8c, 0x93, 0x0d, 0xfe, 0x22, 0xf3, 0x2e, 0x3c, 0x88, 0x74, 0x18, 0xa9, 0x86, 0x59, 0x2f, 0xed, 0x93, - 0x76, 0x2f, 0x6d, 0x36, 0x91, 0x93, 0x91, 0x64, 0x98, 0xaa, 0xe4, 0x3c, 0x87, 0x0d, 0xa4, 0xb1, 0x9d, 0x23, 0x2f, - 0x83, 0xb3, 0xa6, 0xcb, 0x65, 0x15, 0x06, 0x60, 0xe2, 0xb4, 0xc6, 0x0f, 0x5c, 0x55, 0xc0, 0xb9, 0xc1, 0xc9, 0x7d, - 0x7d, 0xbd, 0x4b, 0xa2, 0x79, 0x45, 0x9c, 0x06, 0x02, 0x73, 0xee, 0xcc, 0xe7, 0x11, 0x78, 0x29, 0x4a, 0xf1, 0x53, - 0xa5, 0x30, 0xd9, 0x2d, 0x1b, 0x0d, 0x92, 0x32, 0xbf, 0x0d, 0xf2, 0xf8, 0x92, 0x02, 0x7a, 0xb9, 0xe4, 0x04, 0x7a, - 0xac, 0xfa, 0xff, 0xc0, 0x0d, 0x49, 0x9d, 0xb8, 0x2c, 0x09, 0xe2, 0x79, 0x48, 0x73, 0xd1, 0x43, 0x25, 0xce, 0xe1, - 0x6e, 0x88, 0xb2, 0x96, 0x68, 0x02, 0xbd, 0x8b, 0x6c, 0x1e, 0xa8, 0x08, 0xb7, 0xa8, 0x94, 0xcf, 0x4d, 0xf1, 0x5c, - 0xb5, 0x7d, 0x5d, 0x25, 0x8b, 0x42, 0x4b, 0x77, 0x9e, 0xb0, 0x5f, 0xe6, 0xf4, 0x9c, 0x85, 0xc6, 0xc9, 0x5d, 0x9a, - 0x04, 0x69, 0x48, 0x3f, 0xbc, 0x7b, 0x01, 0xd9, 0xee, 0x69, 0x02, 0x24, 0x96, 0x48, 0x7f, 0x17, 0xce, 0x49, 0xe2, - 0x86, 0xf4, 0x8a, 0x05, 0x74, 0x70, 0xb1, 0xbb, 0xd8, 0x58, 0x51, 0xbe, 0x46, 0x45, 0xeb, 0x02, 0xfc, 0x77, 0x12, - 0xca, 0x8b, 0xdd, 0xc5, 0x25, 0x2f, 0x5a, 0xbb, 0x8b, 0xc4, 0x0d, 0xd3, 0xa9, 0xcf, 0x12, 0xf8, 0x9d, 0x17, 0xbb, - 0x0b, 0x06, 0x3f, 0x78, 0x71, 0x51, 0x54, 0x89, 0xa2, 0x25, 0x44, 0xc6, 0x14, 0x14, 0xee, 0x3a, 0xc8, 0xfd, 0x39, - 0x65, 0x89, 0x28, 0xba, 0xab, 0x67, 0xaa, 0x7b, 0x05, 0x24, 0xff, 0x4a, 0xa4, 0xc1, 0xac, 0xcd, 0xe5, 0xf3, 0xfb, - 0x9a, 0xcb, 0x34, 0xe1, 0x4c, 0xa4, 0xc5, 0xeb, 0x70, 0x4e, 0xe4, 0xe7, 0xe7, 0x81, 0x3c, 0x89, 0x9a, 0x57, 0xa7, - 0x2e, 0x7c, 0x81, 0x58, 0x69, 0x01, 0x53, 0x69, 0xec, 0xd3, 0xed, 0x47, 0x25, 0x93, 0xbb, 0x8c, 0xbf, 0x92, 0xaa, - 0xf2, 0x74, 0x9e, 0x05, 0x10, 0xeb, 0x55, 0x2a, 0xc5, 0xba, 0x57, 0xcc, 0x16, 0xfa, 0x9b, 0x8d, 0xb9, 0x91, 0x64, - 0xcb, 0xe1, 0x4c, 0x5f, 0x75, 0x6d, 0x07, 0x15, 0xf1, 0x44, 0x58, 0x33, 0x26, 0x56, 0xef, 0x9c, 0x85, 0x10, 0x78, - 0x61, 0xa1, 0x4a, 0x58, 0xac, 0x4d, 0x12, 0x54, 0xa4, 0x50, 0x64, 0x90, 0xc2, 0x65, 0x3b, 0x59, 0xb5, 0x0a, 0x84, - 0x10, 0x19, 0xd7, 0x03, 0xe1, 0xdb, 0xec, 0xec, 0xed, 0xe5, 0xd5, 0x89, 0x36, 0xa6, 0x70, 0xbe, 0x5c, 0x72, 0xea, - 0xe4, 0xf2, 0xd4, 0x4d, 0x44, 0x40, 0x19, 0x63, 0x58, 0xbe, 0xf1, 0x32, 0x5c, 0xf6, 0xe4, 0xe5, 0x45, 0x2f, 0x12, - 0x48, 0x94, 0x28, 0x23, 0x1a, 0xa9, 0x27, 0x5a, 0x25, 0xc3, 0xe6, 0xeb, 0xf2, 0x20, 0x7f, 0x0d, 0xeb, 0xed, 0x95, - 0xc5, 0x91, 0x56, 0x55, 0xb4, 0x5a, 0x9a, 0xa7, 0x19, 0x77, 0x1c, 0x1f, 0x07, 0x88, 0xf4, 0x7d, 0x31, 0xfb, 0x63, - 0x99, 0xef, 0x31, 0x68, 0x76, 0xbc, 0x4e, 0xe9, 0x0f, 0xa9, 0x9d, 0xaf, 0x96, 0xd9, 0x66, 0xea, 0x8c, 0x2e, 0xe0, - 0x09, 0x97, 0xbf, 0x15, 0xfa, 0xaa, 0x02, 0x39, 0xbb, 0xea, 0xb9, 0x9c, 0x24, 0x56, 0x0c, 0x4d, 0x2a, 0x03, 0x4e, - 0x0d, 0xaa, 0x61, 0x3a, 0xc2, 0x6c, 0xcb, 0xd8, 0xa8, 0xa8, 0x10, 0x51, 0x6e, 0xee, 0x0b, 0xa9, 0x04, 0x9d, 0x1b, - 0xd4, 0x7d, 0xc1, 0xb4, 0x1b, 0xaf, 0x4e, 0x77, 0x85, 0x42, 0x91, 0xc1, 0x19, 0x36, 0x55, 0x93, 0xb0, 0xdc, 0x92, - 0x64, 0x23, 0xf1, 0xba, 0xf2, 0x91, 0x66, 0xa4, 0x0a, 0x28, 0xae, 0x75, 0x00, 0xc9, 0x90, 0x9b, 0x00, 0x03, 0xc7, - 0x40, 0xce, 0xf5, 0x14, 0x80, 0xc7, 0x8c, 0x29, 0x9c, 0x54, 0x52, 0x1c, 0x07, 0x2f, 0xa4, 0x76, 0xef, 0xd9, 0x6f, - 0xdf, 0x9c, 0xbd, 0xb7, 0x31, 0x5c, 0x75, 0x46, 0xb3, 0xdc, 0x5b, 0xd8, 0x2a, 0xc7, 0xb0, 0x09, 0xf1, 0x6a, 0xdb, - 0xb3, 0xfd, 0x19, 0x1c, 0xda, 0x16, 0x4c, 0xb5, 0x75, 0xd3, 0xbc, 0xbe, 0xbe, 0x6e, 0xc2, 0x89, 0xb2, 0xe6, 0x3c, - 0x8b, 0x25, 0xbb, 0x09, 0xed, 0xa2, 0x40, 0x2e, 0x8f, 0x68, 0x52, 0x5e, 0x86, 0x94, 0xc6, 0xd4, 0x8d, 0xd3, 0x89, - 0x3c, 0x0f, 0xbb, 0xea, 0x9e, 0x88, 0x2f, 0x8e, 0xc5, 0x25, 0x5f, 0xfd, 0x63, 0x2e, 0xaf, 0x57, 0xe3, 0x19, 0xfc, - 0xec, 0x43, 0xf0, 0xea, 0xb8, 0xc5, 0x23, 0xf1, 0x70, 0x06, 0xbb, 0x49, 0x3c, 0xed, 0x2e, 0xd6, 0xa8, 0x6e, 0x00, - 0x5d, 0x44, 0x7d, 0x39, 0xb5, 0x5c, 0xd4, 0xba, 0xf0, 0xe2, 0x8b, 0x8b, 0xe2, 0xb8, 0x05, 0x7d, 0xb5, 0x74, 0xbf, - 0x97, 0x69, 0x78, 0xab, 0xdb, 0x97, 0x94, 0x08, 0x97, 0x3d, 0x25, 0xa4, 0x0f, 0x5d, 0xc0, 0xb8, 0x61, 0x5f, 0xe0, - 0x4c, 0xb1, 0xd0, 0x61, 0xf5, 0x50, 0x8c, 0x2c, 0x60, 0x98, 0x05, 0x94, 0x00, 0xb9, 0x41, 0xe7, 0x61, 0xd9, 0x40, - 0xec, 0x76, 0x59, 0xb4, 0x0d, 0x40, 0x59, 0xb1, 0xda, 0x3f, 0xd2, 0xcd, 0x5d, 0x91, 0x85, 0x86, 0x38, 0x34, 0x81, - 0xbf, 0x40, 0xf0, 0xaf, 0x00, 0xfc, 0xb8, 0x25, 0xd1, 0x74, 0x61, 0x5e, 0x3b, 0x23, 0x2f, 0x84, 0x28, 0x91, 0x39, - 0xcc, 0x38, 0x7e, 0xcf, 0xf1, 0xc7, 0x0b, 0x51, 0x55, 0x6b, 0x09, 0xa0, 0xbe, 0x82, 0x36, 0xd5, 0xd6, 0xea, 0x60, - 0x90, 0xc6, 0xb1, 0x3f, 0xcb, 0xa9, 0xa7, 0x7f, 0x28, 0x85, 0x01, 0xf4, 0x8e, 0x75, 0x0d, 0x4d, 0xe5, 0x3d, 0x9d, - 0x82, 0x1e, 0xb7, 0xae, 0x3e, 0x5e, 0xf9, 0x99, 0xd3, 0x6c, 0x06, 0xcd, 0xcb, 0x09, 0x2a, 0x78, 0xb4, 0x30, 0xd5, - 0x8d, 0x87, 0xed, 0x76, 0x0f, 0x92, 0x54, 0x9b, 0x7e, 0xcc, 0x26, 0x89, 0x17, 0xd3, 0x31, 0x2f, 0x38, 0x9c, 0x1e, - 0x5c, 0x68, 0xfd, 0xce, 0xed, 0x1e, 0x66, 0x74, 0x6a, 0xb9, 0xf0, 0xf7, 0xee, 0x81, 0x0b, 0x1e, 0x7a, 0x09, 0x8f, - 0x9a, 0x22, 0x19, 0x1a, 0x8e, 0x72, 0xf0, 0xa8, 0xf6, 0xbc, 0x30, 0x06, 0x0a, 0x28, 0xe8, 0xbe, 0x05, 0xcf, 0x2c, - 0x1e, 0x61, 0x9e, 0x99, 0xf5, 0x12, 0xb4, 0x58, 0x9b, 0xc1, 0xba, 0x0a, 0xb6, 0x8f, 0x8a, 0x5c, 0x58, 0x2c, 0x8b, - 0x35, 0xbc, 0x18, 0xaa, 0x74, 0xc1, 0x92, 0xd9, 0x9c, 0x0f, 0x85, 0xe7, 0x3f, 0x83, 0x33, 0x24, 0x23, 0x6c, 0x94, - 0x00, 0x3c, 0x23, 0xd5, 0x3e, 0xf0, 0xe3, 0xc0, 0x81, 0x4e, 0xac, 0xa6, 0x75, 0x94, 0xd1, 0x29, 0xea, 0x4d, 0x59, - 0xd2, 0x94, 0xef, 0x0e, 0x0d, 0xdd, 0xcd, 0x7d, 0x04, 0x4f, 0x85, 0x2b, 0x7a, 0xc3, 0x22, 0xc1, 0x77, 0xc3, 0xbc, - 0x2e, 0x46, 0x45, 0xd1, 0x4b, 0xb9, 0x33, 0x7c, 0xe1, 0xa0, 0x11, 0xfe, 0xd5, 0xb8, 0xc4, 0xc6, 0xd6, 0x54, 0x6d, - 0xe3, 0x2e, 0xda, 0x52, 0xc5, 0xa4, 0x4b, 0x51, 0xed, 0x57, 0x02, 0x15, 0x5f, 0x3a, 0x36, 0xcd, 0x67, 0x4d, 0xc9, - 0x7e, 0x9a, 0x82, 0x7c, 0x6c, 0x68, 0x8a, 0x94, 0x3b, 0x9b, 0xd2, 0x85, 0xe0, 0x2c, 0xea, 0x1c, 0x8b, 0xf4, 0xb8, - 0x8c, 0xca, 0x73, 0x4f, 0xea, 0xd9, 0x3c, 0xe9, 0x84, 0x6a, 0x5b, 0xff, 0xe2, 0xa4, 0xce, 0xa6, 0x40, 0xfe, 0x97, - 0x77, 0xfd, 0xf9, 0x71, 0x0c, 0x03, 0x5e, 0x68, 0xa5, 0xc1, 0xbc, 0x1a, 0x65, 0xc8, 0x47, 0x0e, 0x2a, 0xd4, 0x9e, - 0x79, 0x22, 0xf4, 0x6e, 0xe3, 0x82, 0xc1, 0x1d, 0xae, 0x23, 0x6a, 0xf2, 0x04, 0x33, 0x83, 0x9c, 0x80, 0x5a, 0xee, - 0x78, 0xaf, 0x62, 0x33, 0x52, 0x6b, 0xb7, 0xc4, 0x84, 0x88, 0x9d, 0x25, 0xa1, 0x6d, 0xfd, 0x39, 0x88, 0x59, 0xf0, - 0x91, 0xd8, 0xbb, 0x0b, 0x07, 0xad, 0x1f, 0x0d, 0x15, 0x3b, 0x54, 0xf3, 0x5c, 0x54, 0x8f, 0x36, 0xa4, 0xae, 0xc1, - 0x4e, 0xe5, 0xed, 0x41, 0x76, 0x1f, 0x54, 0x9b, 0xe3, 0x96, 0x1c, 0xa7, 0x7f, 0x51, 0x9c, 0x57, 0xb7, 0x82, 0x55, - 0x50, 0x00, 0x9a, 0x65, 0xb9, 0x25, 0xe8, 0x8f, 0xd8, 0x72, 0x0b, 0xd5, 0x2c, 0x40, 0x6c, 0xd2, 0x3e, 0xb2, 0x2d, - 0xc9, 0x60, 0x00, 0x4e, 0xae, 0x78, 0x8d, 0x6d, 0xfd, 0xb9, 0x2c, 0xa3, 0xa5, 0xdb, 0x47, 0xe4, 0xad, 0x10, 0x1b, - 0xc6, 0x02, 0x5b, 0xdf, 0x0d, 0x29, 0xf7, 0x59, 0x2c, 0x9b, 0xf4, 0xb4, 0x97, 0x62, 0x65, 0x46, 0xcb, 0x65, 0x5e, - 0x9f, 0x0b, 0xab, 0x63, 0x50, 0xcc, 0xec, 0xb8, 0x55, 0xc1, 0x2d, 0x66, 0x26, 0xf6, 0x87, 0x19, 0x3f, 0xad, 0x66, - 0x28, 0xdf, 0x59, 0x7f, 0x0e, 0xc4, 0xc9, 0x2a, 0x00, 0x30, 0x53, 0x00, 0x42, 0x64, 0x5f, 0x2a, 0x21, 0x8e, 0x4f, - 0x32, 0x97, 0xfb, 0xd9, 0x84, 0xf2, 0x15, 0xc4, 0xfa, 0x32, 0x91, 0xb7, 0xa7, 0xa3, 0xf8, 0x6b, 0xd0, 0x06, 0x75, - 0x68, 0x41, 0xcf, 0x2d, 0x06, 0xa0, 0xaa, 0x92, 0x8d, 0x1a, 0x6f, 0x84, 0x40, 0xf6, 0x89, 0xc5, 0x91, 0xdc, 0x3e, - 0x13, 0xdc, 0x5e, 0xc6, 0xe1, 0x2c, 0x31, 0x96, 0x00, 0xb1, 0xb0, 0xad, 0x81, 0x84, 0x9c, 0x86, 0x12, 0x66, 0x92, - 0x8a, 0x56, 0x59, 0x71, 0xdc, 0x92, 0xb5, 0x25, 0x3b, 0x96, 0x95, 0x00, 0x09, 0x62, 0x9f, 0x56, 0x38, 0x80, 0xe4, - 0x6f, 0x13, 0x0f, 0x21, 0xbb, 0x2a, 0x89, 0x4d, 0x9c, 0x31, 0xeb, 0x1f, 0xc7, 0xfe, 0x25, 0x8d, 0xfb, 0xbb, 0x8b, - 0x74, 0xb9, 0x6c, 0x17, 0xc7, 0x2d, 0xf9, 0x68, 0x1d, 0x0b, 0xbe, 0x21, 0xef, 0x06, 0x15, 0x4b, 0x0c, 0x07, 0x37, - 0x21, 0x25, 0x56, 0xe7, 0x82, 0x79, 0xaa, 0x83, 0xc2, 0xb6, 0x44, 0x16, 0x8a, 0xa8, 0x54, 0xea, 0x34, 0x85, 0x6d, - 0xb1, 0x70, 0xbd, 0x2c, 0xe7, 0x74, 0x06, 0xa5, 0xd1, 0x72, 0xd9, 0x29, 0x6c, 0x6b, 0xca, 0x12, 0x78, 0x4a, 0x97, - 0x4b, 0x71, 0x26, 0x72, 0xca, 0x12, 0xa7, 0x0d, 0x64, 0x6b, 0x5b, 0x53, 0xff, 0x46, 0x4c, 0x58, 0xbf, 0xf1, 0x6f, - 0x9c, 0x8e, 0x7a, 0xe5, 0x96, 0xf8, 0xc9, 0x81, 0xe2, 0xaa, 0x15, 0xf5, 0xd5, 0x8a, 0x86, 0x78, 0x2e, 0x4f, 0x7b, - 0x11, 0x27, 0x24, 0xfe, 0xe6, 0x15, 0x0d, 0xf5, 0x8a, 0xce, 0xb7, 0xac, 0xe8, 0xfc, 0x8e, 0x15, 0x0d, 0xd4, 0xea, - 0x59, 0x25, 0xee, 0xb2, 0xe5, 0xb2, 0xd3, 0xae, 0xb0, 0x77, 0xdc, 0x0a, 0xd9, 0x15, 0xac, 0x06, 0x68, 0x6a, 0x9c, - 0x4d, 0xe9, 0x66, 0xa2, 0xac, 0xa3, 0x98, 0x7e, 0x16, 0x26, 0x2b, 0x2c, 0xa4, 0x75, 0x2c, 0x98, 0x74, 0x5d, 0x06, - 0x26, 0xff, 0x48, 0xca, 0x66, 0x80, 0x87, 0x1c, 0xf0, 0x10, 0xe9, 0xbb, 0x42, 0x1d, 0xfb, 0xbd, 0x8d, 0x6d, 0xcb, - 0xd6, 0x64, 0x7d, 0x51, 0x9c, 0x83, 0x8c, 0x10, 0xf3, 0xbb, 0x17, 0x2d, 0x42, 0x6d, 0xbb, 0xbf, 0x9d, 0xe6, 0x20, - 0x87, 0xe0, 0x3a, 0xcd, 0x42, 0xdb, 0x93, 0x55, 0x3f, 0x0b, 0x55, 0x53, 0x96, 0xa8, 0x8c, 0xb4, 0xad, 0xb4, 0x56, - 0xbd, 0x37, 0x29, 0xae, 0x7b, 0x78, 0x28, 0x6b, 0xcc, 0x7c, 0xce, 0x69, 0x96, 0x28, 0xca, 0xb5, 0xed, 0xff, 0x10, - 0x54, 0xb8, 0x81, 0xaf, 0x04, 0x7a, 0x01, 0x34, 0x01, 0x2a, 0x9d, 0x5b, 0xf1, 0x7c, 0x29, 0x9e, 0x76, 0x2a, 0x65, - 0xf3, 0x16, 0x99, 0x7a, 0xbf, 0x2c, 0x02, 0x33, 0x64, 0x3e, 0xa5, 0xe1, 0xb9, 0x60, 0xd0, 0x83, 0xf8, 0x42, 0x29, - 0x8f, 0x2b, 0xe2, 0xae, 0x6a, 0x80, 0xed, 0x9f, 0xe6, 0xdd, 0x47, 0x07, 0xa7, 0x36, 0x96, 0x3c, 0x3e, 0x1d, 0x8f, - 0x6d, 0x54, 0x58, 0xf7, 0x6b, 0xd6, 0x39, 0xf8, 0x69, 0xfe, 0xf5, 0xb3, 0xf6, 0xd7, 0x65, 0xe3, 0x04, 0x88, 0x48, - 0x25, 0x41, 0x68, 0x51, 0x65, 0xc0, 0xab, 0x67, 0x34, 0xf6, 0x93, 0xed, 0xd3, 0x19, 0x9a, 0xd3, 0xc9, 0x67, 0x94, - 0x86, 0x40, 0x9c, 0x78, 0xad, 0xf4, 0x3c, 0xa6, 0x57, 0x54, 0xdf, 0xd0, 0xb8, 0x61, 0xb0, 0x0d, 0x2d, 0x82, 0x74, - 0x9e, 0x70, 0x95, 0x0d, 0xa2, 0x58, 0xad, 0x31, 0xa5, 0x0b, 0x31, 0x07, 0x53, 0x9d, 0xbf, 0x95, 0x72, 0xae, 0x2e, - 0xbd, 0x8a, 0x0b, 0x6c, 0x1b, 0x00, 0x6c, 0x85, 0x6c, 0xb0, 0xa5, 0xdc, 0x6b, 0xe3, 0xf6, 0x36, 0xd8, 0x70, 0x07, - 0x79, 0xb6, 0x3d, 0xd2, 0x78, 0x12, 0x0e, 0xdd, 0xda, 0xa5, 0x1a, 0x5b, 0xf1, 0xf5, 0x49, 0x0c, 0x5c, 0x66, 0xd0, - 0x59, 0x42, 0xf3, 0x7c, 0x2b, 0x02, 0xca, 0x45, 0xc4, 0x76, 0x55, 0xdb, 0xde, 0xd2, 0x0b, 0x6e, 0x63, 0xd8, 0x61, - 0x02, 0xe0, 0x32, 0xac, 0xac, 0x6a, 0xd1, 0xf1, 0x98, 0x06, 0xa5, 0x3f, 0x1c, 0x02, 0x84, 0x63, 0x16, 0x73, 0x88, - 0x93, 0x89, 0x00, 0x96, 0xfd, 0x3a, 0x4d, 0xa8, 0x8d, 0x74, 0xca, 0xab, 0x82, 0x5f, 0xc9, 0xff, 0xcd, 0xf0, 0xc8, - 0x1e, 0xeb, 0xb0, 0xa8, 0x51, 0x96, 0x4b, 0xed, 0xae, 0xa9, 0x95, 0xd7, 0x11, 0x99, 0x0a, 0x7f, 0xcc, 0xb6, 0x0d, - 0x74, 0xbf, 0x6d, 0xb2, 0xe8, 0x7c, 0x7d, 0xd8, 0x69, 0x17, 0x36, 0xb6, 0xa1, 0xbb, 0xfb, 0xee, 0x12, 0xd1, 0x6a, - 0x1f, 0x5a, 0xcd, 0x93, 0xcf, 0x69, 0xd7, 0xed, 0x3c, 0xee, 0xd8, 0x58, 0xde, 0xb5, 0x80, 0x8a, 0x92, 0x19, 0x04, - 0xe0, 0x21, 0xfe, 0xdd, 0x53, 0xa9, 0x77, 0x7e, 0x3f, 0x78, 0x1e, 0x76, 0xda, 0x36, 0xb6, 0x73, 0x9e, 0xce, 0x3e, - 0x63, 0x0a, 0xfb, 0x36, 0xb6, 0x83, 0x38, 0xcd, 0xa9, 0x39, 0x07, 0xa9, 0xce, 0xfe, 0xfe, 0x49, 0x48, 0x88, 0x66, - 0x19, 0xcd, 0x73, 0xcb, 0xec, 0x5f, 0x91, 0xd2, 0x27, 0x18, 0xe6, 0x46, 0x8a, 0xcb, 0x29, 0x17, 0x78, 0x91, 0xd7, - 0x20, 0x98, 0x54, 0x25, 0xcb, 0xd6, 0x88, 0x4d, 0x88, 0x80, 0x92, 0xb1, 0x49, 0xed, 0xea, 0x93, 0x23, 0x6f, 0xd8, - 0x7a, 0x72, 0x60, 0x19, 0x38, 0x5f, 0x1f, 0xa0, 0x56, 0x32, 0x65, 0xc9, 0xf9, 0x86, 0x52, 0xff, 0x66, 0x43, 0x29, - 0xa8, 0x6c, 0x25, 0x74, 0xea, 0x8a, 0x9e, 0x4f, 0x63, 0xbd, 0x52, 0x7c, 0x4c, 0x10, 0x43, 0xe1, 0x7f, 0xfc, 0x04, - 0xa4, 0xc6, 0x32, 0x88, 0x1e, 0x7e, 0xfb, 0x70, 0x50, 0xf2, 0x39, 0xc3, 0x95, 0xbd, 0xfc, 0xbe, 0x19, 0x42, 0x69, - 0x13, 0x9c, 0xfc, 0xf1, 0x67, 0xcd, 0x95, 0xde, 0x7c, 0x9a, 0xe0, 0x0c, 0xad, 0xea, 0x77, 0x2c, 0xbd, 0x3a, 0xea, - 0xbf, 0xba, 0xf6, 0x1b, 0x8a, 0x95, 0xe2, 0x53, 0xae, 0x7f, 0x10, 0xb3, 0x69, 0x45, 0x02, 0xeb, 0x60, 0x0a, 0x8d, - 0x07, 0x32, 0xbe, 0xcc, 0x4e, 0xa4, 0xea, 0x73, 0x0e, 0xe7, 0x58, 0xe1, 0xaa, 0x90, 0x79, 0x46, 0xcf, 0xe3, 0xf4, - 0x7a, 0xf5, 0xf2, 0xb3, 0xed, 0x95, 0x23, 0x36, 0x89, 0x8c, 0xc3, 0x69, 0x94, 0x94, 0x8b, 0x70, 0xe7, 0x00, 0xc5, - 0xbf, 0xfc, 0xb3, 0xeb, 0xfe, 0xcb, 0x3f, 0x7f, 0xb2, 0x2a, 0x74, 0x5f, 0x5c, 0x60, 0x5e, 0x75, 0xbb, 0x7d, 0x77, - 0x6d, 0x1e, 0xa9, 0x8e, 0xf3, 0xcd, 0x75, 0xd6, 0x16, 0x01, 0xde, 0xaf, 0x2d, 0xc1, 0x5a, 0xa1, 0xdc, 0x7d, 0xd6, - 0x6f, 0x01, 0x0c, 0xe6, 0xf5, 0x49, 0xc8, 0xa0, 0xd2, 0xef, 0x02, 0xed, 0x02, 0x79, 0xf7, 0x5a, 0x91, 0xdf, 0x8e, - 0xe1, 0x4f, 0xcd, 0xe1, 0x77, 0x82, 0xaf, 0xfc, 0x13, 0xf1, 0xc5, 0x45, 0x99, 0x85, 0x68, 0x36, 0x85, 0x3b, 0x0e, - 0x06, 0x6b, 0x25, 0x4a, 0xf1, 0xf0, 0xda, 0xa8, 0x2f, 0xce, 0x50, 0x92, 0xf8, 0xe2, 0x15, 0x5c, 0x6c, 0x74, 0x7c, - 0x99, 0x69, 0x67, 0xeb, 0x1d, 0xc2, 0x01, 0xba, 0xa8, 0xcf, 0x4a, 0x74, 0xba, 0x26, 0x19, 0xa0, 0x14, 0xcc, 0x0d, - 0x00, 0x13, 0xc7, 0x17, 0xca, 0xda, 0x3c, 0x95, 0x6e, 0x18, 0x6f, 0x95, 0xb4, 0x95, 0x7b, 0xa6, 0x86, 0x74, 0x6c, - 0xbd, 0x17, 0xf8, 0x12, 0x95, 0x69, 0x65, 0xdd, 0x0b, 0x57, 0x17, 0xd8, 0x11, 0x25, 0xfb, 0xb9, 0xf2, 0xe3, 0xab, - 0xfb, 0x31, 0xbe, 0xed, 0x02, 0x75, 0x69, 0x2d, 0xff, 0xd1, 0x2a, 0xc1, 0xb2, 0xb9, 0xdc, 0xa4, 0x0f, 0x5c, 0xfb, - 0x9c, 0x66, 0xe7, 0x11, 0x24, 0x42, 0x65, 0x9f, 0x60, 0x4e, 0xb0, 0xd2, 0x98, 0x8a, 0xbf, 0x8c, 0xa8, 0x8b, 0xa4, - 0xff, 0x41, 0x9c, 0x8a, 0x41, 0x16, 0x23, 0x0c, 0x65, 0x2c, 0xc2, 0xff, 0xe7, 0x5b, 0xff, 0x61, 0xf8, 0xd6, 0xdd, - 0x43, 0xd4, 0xce, 0x48, 0x7f, 0xf6, 0x42, 0xfe, 0xc7, 0x66, 0x77, 0xb9, 0x60, 0x77, 0xbf, 0x81, 0xd1, 0xe5, 0xff, - 0x18, 0x46, 0x27, 0x6c, 0x64, 0xcd, 0xe9, 0xd6, 0x42, 0xcd, 0xb7, 0xae, 0x7f, 0xed, 0xdf, 0x56, 0xfb, 0x2a, 0xbe, - 0x38, 0xb9, 0xf6, 0x6f, 0xab, 0x45, 0xd8, 0xce, 0x2e, 0x56, 0xfb, 0x18, 0xd8, 0x6f, 0x5e, 0xdb, 0x9e, 0xfd, 0xe6, - 0xeb, 0xaf, 0x6d, 0x7c, 0x91, 0x53, 0x3e, 0x80, 0x42, 0xb2, 0xbb, 0xd8, 0x59, 0xad, 0x08, 0x6e, 0x14, 0x98, 0xa2, - 0x08, 0x7b, 0xe1, 0xac, 0x06, 0x0c, 0xcb, 0xcf, 0xd3, 0xc4, 0x84, 0xe6, 0x2d, 0x58, 0xf6, 0x9f, 0x0b, 0x8e, 0xe8, - 0x65, 0x0d, 0x1e, 0x51, 0xba, 0x0a, 0x90, 0x28, 0xac, 0x41, 0x54, 0x5d, 0x19, 0x74, 0x37, 0xff, 0xaf, 0xae, 0x45, - 0x90, 0xb7, 0x7d, 0x44, 0x83, 0xf8, 0xe2, 0x73, 0xc4, 0x87, 0x1c, 0xac, 0xf2, 0xd8, 0x69, 0x77, 0xa7, 0x5f, 0xec, - 0x2e, 0xa2, 0xbd, 0x3d, 0x36, 0xb0, 0xb1, 0xb8, 0xa7, 0xa9, 0xd8, 0x24, 0x5c, 0x72, 0xf8, 0x93, 0xc2, 0x9f, 0xac, - 0x62, 0xd4, 0x2c, 0x19, 0x67, 0x7e, 0x46, 0xc3, 0xed, 0x4c, 0xba, 0xbc, 0xdf, 0x48, 0x91, 0x86, 0x4c, 0xc0, 0xce, - 0xcf, 0x45, 0xea, 0xd1, 0x94, 0x81, 0x3e, 0xba, 0x63, 0x7e, 0xc5, 0x47, 0x5d, 0x88, 0x56, 0x7e, 0x04, 0xc0, 0x44, - 0x38, 0x25, 0x79, 0x99, 0xeb, 0x00, 0xb7, 0x6a, 0xaa, 0xec, 0x10, 0x6c, 0x23, 0xe1, 0x75, 0x0f, 0x49, 0x5f, 0xa4, - 0x3d, 0xbc, 0x48, 0xb8, 0x13, 0xba, 0x3c, 0x63, 0x53, 0x07, 0xe1, 0x4e, 0x1b, 0x21, 0xed, 0x6c, 0x08, 0x49, 0x7f, - 0x87, 0xe5, 0xaf, 0xfd, 0xd7, 0x4e, 0x28, 0x2e, 0xe2, 0x12, 0x9f, 0xee, 0x81, 0x43, 0x92, 0x4f, 0xe6, 0xe3, 0x31, - 0xcd, 0x1c, 0x7d, 0x00, 0xf0, 0xab, 0x03, 0x38, 0x63, 0x0c, 0x6f, 0x9f, 0xfa, 0xdc, 0xff, 0x96, 0xd1, 0x6b, 0x27, - 0x43, 0xbd, 0xb4, 0xba, 0x9c, 0x31, 0xc4, 0x73, 0x44, 0xfa, 0x11, 0x24, 0xc6, 0xbf, 0x48, 0xf8, 0x7e, 0xd7, 0x99, - 0x7f, 0x75, 0x80, 0x43, 0xb8, 0xf2, 0x42, 0x67, 0x75, 0xcb, 0xbb, 0x4a, 0x3e, 0xb0, 0x84, 0x1f, 0xc9, 0x63, 0x98, - 0x19, 0x52, 0xee, 0xc3, 0x32, 0x23, 0xc6, 0xf2, 0xcb, 0x0e, 0x43, 0xd2, 0x0f, 0x1a, 0x44, 0x1e, 0xca, 0x14, 0xb7, - 0xec, 0x9e, 0x46, 0x7e, 0x76, 0x0a, 0x07, 0xbe, 0x01, 0xd0, 0x4b, 0x9e, 0xfa, 0x4e, 0x50, 0x7e, 0xc9, 0xc9, 0x69, - 0xfd, 0xd4, 0x68, 0x4d, 0xb0, 0x48, 0x8a, 0xa9, 0x8a, 0x5a, 0x50, 0x74, 0x6e, 0x16, 0x91, 0xc6, 0x6e, 0x0b, 0xc3, - 0x1e, 0xec, 0x6d, 0xf4, 0xd1, 0xea, 0xa5, 0x6b, 0x5e, 0x67, 0xfe, 0xac, 0x8c, 0x1b, 0x9c, 0xfa, 0x59, 0xc6, 0x68, - 0x66, 0x39, 0xcf, 0x7f, 0x45, 0xde, 0xbf, 0xfc, 0xf3, 0xe6, 0xf8, 0x81, 0x0a, 0x19, 0x58, 0x90, 0x5c, 0xd2, 0x14, - 0xe9, 0xd8, 0xc4, 0x0e, 0x64, 0x43, 0x5b, 0x87, 0x3b, 0xf6, 0x8f, 0xda, 0xed, 0xb6, 0x0a, 0x09, 0x74, 0xe4, 0x4f, - 0x88, 0x01, 0xc0, 0x4f, 0x78, 0x10, 0x51, 0x65, 0x62, 0xcb, 0x00, 0xe5, 0x51, 0x7b, 0x76, 0x63, 0xf7, 0x61, 0x3b, - 0x28, 0x28, 0xde, 0xd1, 0x19, 0xf5, 0xf9, 0x67, 0x8d, 0x9f, 0x89, 0x26, 0xe5, 0xf0, 0x1d, 0x3d, 0x74, 0x35, 0xee, - 0xca, 0xa0, 0x87, 0xab, 0x83, 0xbe, 0x67, 0x53, 0x71, 0x75, 0xd3, 0xb6, 0x51, 0x85, 0xa7, 0xba, 0x36, 0x26, 0x97, - 0x2d, 0x6c, 0x4b, 0x60, 0x3c, 0x4a, 0xe3, 0x90, 0x66, 0xc4, 0xa6, 0xee, 0xc4, 0xb5, 0x1e, 0xb7, 0xdb, 0x6d, 0xdc, - 0x3c, 0x38, 0x6c, 0xb7, 0xf1, 0xe1, 0xc3, 0x36, 0x6e, 0xc2, 0x1f, 0xd7, 0x75, 0x57, 0x60, 0xb8, 0x2b, 0x6a, 0xdb, - 0x69, 0x67, 0x74, 0xaa, 0x00, 0xbc, 0x33, 0xac, 0x58, 0xed, 0x09, 0xb8, 0x60, 0x5a, 0xed, 0x7b, 0x29, 0xd9, 0xd4, - 0x05, 0x07, 0x2a, 0x1d, 0x55, 0xf8, 0x0b, 0xb3, 0x2a, 0x68, 0x4a, 0xe5, 0xc5, 0x7f, 0x2f, 0x14, 0x21, 0x78, 0xd6, - 0x29, 0xdc, 0x5e, 0x2a, 0xe2, 0xa5, 0x90, 0x0a, 0x04, 0x1f, 0x48, 0xe3, 0x3e, 0x4b, 0xe0, 0xdb, 0x59, 0x3a, 0x6a, - 0xaa, 0x19, 0x55, 0xb6, 0x92, 0x74, 0xfb, 0x40, 0x86, 0xa5, 0x37, 0x11, 0xc4, 0xe8, 0x01, 0xc2, 0xfe, 0x7d, 0x1a, - 0xa8, 0x15, 0x84, 0xfa, 0xc1, 0x7d, 0xea, 0x6b, 0xec, 0x8f, 0x1e, 0x88, 0xe4, 0xa4, 0x9d, 0x68, 0xb9, 0xdc, 0xf1, - 0x97, 0xcb, 0x9d, 0xe0, 0xfe, 0x33, 0x94, 0xcb, 0xab, 0x4f, 0x41, 0xc0, 0xcd, 0x9f, 0x12, 0xe8, 0x17, 0x50, 0xee, - 0x45, 0x58, 0x82, 0x24, 0x9f, 0x7c, 0xac, 0x06, 0x94, 0x8f, 0x41, 0xb1, 0x82, 0x94, 0x90, 0x44, 0xd2, 0x3e, 0x5f, - 0x2e, 0x15, 0xf1, 0xe3, 0x39, 0xf1, 0xcb, 0xa2, 0x8e, 0x8d, 0x67, 0x24, 0x28, 0x1f, 0x6d, 0x01, 0xf2, 0x4c, 0x71, - 0xa9, 0x0a, 0xe2, 0x6b, 0x3f, 0x4b, 0x4c, 0x80, 0x5f, 0xa7, 0x96, 0x1a, 0xd6, 0x9a, 0x65, 0xe9, 0x15, 0x83, 0xe4, - 0x97, 0x95, 0x81, 0xa7, 0x04, 0x2e, 0xfe, 0xea, 0x99, 0xa1, 0x70, 0xa3, 0x83, 0xf7, 0x9a, 0xcf, 0xc2, 0x2d, 0x93, - 0xe5, 0x04, 0xbd, 0x50, 0xcd, 0xcd, 0x9b, 0xeb, 0x69, 0xbd, 0xf3, 0xaf, 0xbd, 0x99, 0x7e, 0x78, 0x26, 0xf3, 0x6c, - 0xbc, 0x69, 0x79, 0xb2, 0xe6, 0x2d, 0x79, 0x0d, 0xb1, 0x1f, 0x5b, 0xf3, 0x6d, 0xb8, 0x67, 0x53, 0xf2, 0xb8, 0x77, - 0x2f, 0xcf, 0xa8, 0x9f, 0x05, 0xd1, 0x5b, 0x3f, 0xf3, 0xa7, 0x79, 0x6f, 0xac, 0x6f, 0xf1, 0xd2, 0x14, 0x70, 0x3e, - 0x16, 0x99, 0x4e, 0x49, 0x70, 0x6b, 0xe3, 0x10, 0xe1, 0xea, 0xbd, 0x84, 0x40, 0xfa, 0xb9, 0x6d, 0x3c, 0x37, 0x5f, - 0xc1, 0x3a, 0xdb, 0x78, 0x8a, 0xb0, 0x4c, 0x20, 0x7a, 0xfb, 0x47, 0xa6, 0x0e, 0x61, 0xc8, 0x75, 0xf1, 0xc6, 0x6e, - 0xf5, 0x95, 0x3b, 0x9d, 0x4c, 0xf4, 0x7e, 0x25, 0x99, 0x68, 0x03, 0x1a, 0xad, 0x8c, 0xe6, 0xb3, 0x34, 0xc9, 0xa9, - 0x8d, 0xdf, 0x43, 0x3b, 0x79, 0x15, 0xb3, 0xd9, 0x70, 0x8d, 0xe6, 0xca, 0xa6, 0xe2, 0x8d, 0x6c, 0x07, 0x41, 0x9d, - 0xf7, 0xdf, 0x97, 0x71, 0x7c, 0x1d, 0xdf, 0x11, 0x89, 0xe8, 0x8c, 0x6e, 0xc9, 0x95, 0xcd, 0xe9, 0x27, 0x73, 0x65, - 0xe3, 0x7b, 0xe5, 0xca, 0xe6, 0xf4, 0x8f, 0xce, 0x95, 0x65, 0xd4, 0xc8, 0x95, 0x05, 0x39, 0xf7, 0xf5, 0xbd, 0x52, - 0x2e, 0x75, 0x26, 0x5c, 0x7a, 0x9d, 0x93, 0x8e, 0x8a, 0x81, 0xc4, 0xe9, 0x04, 0xf2, 0x2d, 0xff, 0xf1, 0xe9, 0x93, - 0x71, 0x3a, 0x31, 0x93, 0x27, 0xe1, 0xc3, 0x24, 0x40, 0x76, 0x38, 0x25, 0x0b, 0xfb, 0xa7, 0x9b, 0xce, 0x93, 0x61, - 0xa7, 0xb7, 0xdf, 0x99, 0xda, 0x9e, 0x0d, 0x4e, 0x47, 0x51, 0xd0, 0xee, 0xed, 0xef, 0x43, 0xc1, 0xb5, 0x51, 0xd0, - 0x85, 0x02, 0x66, 0x14, 0x1c, 0x42, 0x41, 0x60, 0x14, 0x3c, 0x84, 0x82, 0xd0, 0x28, 0x78, 0x04, 0x05, 0x57, 0x76, - 0x31, 0x64, 0x65, 0x42, 0xf0, 0x23, 0x24, 0x6e, 0x30, 0xdc, 0x49, 0xeb, 0xa7, 0xb7, 0x23, 0xa2, 0xab, 0x3c, 0x2a, - 0x6f, 0x7e, 0x68, 0x1e, 0xe8, 0x8b, 0x0a, 0x2f, 0xbe, 0xb8, 0x00, 0xd6, 0x0a, 0x17, 0xb1, 0x60, 0x88, 0x49, 0xca, - 0x9a, 0xfb, 0xfa, 0xb5, 0xed, 0x95, 0x59, 0xb3, 0x6d, 0xdc, 0xd5, 0x79, 0xb3, 0x9e, 0x8d, 0x04, 0x5f, 0x92, 0x2f, - 0x0e, 0x1b, 0xa1, 0xea, 0x16, 0xee, 0x00, 0xac, 0x2e, 0xe0, 0xdc, 0x47, 0x78, 0xaa, 0x15, 0x20, 0xea, 0xc0, 0x07, - 0x18, 0xde, 0xb3, 0x29, 0xd5, 0xfb, 0x45, 0x0f, 0x60, 0x89, 0xcc, 0xe2, 0x5e, 0x54, 0x29, 0x46, 0x6f, 0xf1, 0xb8, - 0xba, 0xf3, 0xf5, 0x3d, 0x91, 0x77, 0xe8, 0xa5, 0x58, 0x86, 0xb9, 0x66, 0x98, 0xfb, 0x13, 0x0f, 0x52, 0x28, 0x21, - 0x63, 0xc4, 0x1b, 0x13, 0x42, 0xda, 0x83, 0xb9, 0xf7, 0x16, 0x5f, 0x47, 0x34, 0xf1, 0xa6, 0x45, 0xaf, 0x5c, 0x7f, - 0x99, 0xd2, 0xf9, 0xbe, 0xbc, 0x28, 0x5c, 0xd0, 0x44, 0xf5, 0x56, 0x42, 0xd9, 0x2c, 0x69, 0x67, 0x4b, 0xce, 0x9f, - 0xa1, 0xec, 0x8c, 0xe3, 0xf4, 0xba, 0x09, 0xe2, 0x7e, 0x63, 0x1e, 0x20, 0xcc, 0xad, 0xcc, 0x03, 0x7c, 0x09, 0xb0, - 0x96, 0x4f, 0xef, 0xfd, 0x49, 0xf9, 0xfb, 0x15, 0xcd, 0x73, 0x7f, 0xa2, 0x6a, 0x6e, 0xcf, 0xfb, 0x13, 0x20, 0x9a, - 0x39, 0x7f, 0x1a, 0x08, 0x48, 0xce, 0x03, 0x84, 0x40, 0x40, 0x57, 0xe5, 0xea, 0xc1, 0xcc, 0xeb, 0x69, 0x7e, 0x02, - 0x55, 0xf5, 0x22, 0xee, 0x4f, 0xaa, 0x82, 0xe3, 0x59, 0x46, 0x55, 0x02, 0x21, 0x60, 0xb1, 0x38, 0x6e, 0x41, 0x81, - 0x7c, 0xbd, 0x25, 0x9d, 0x4f, 0x73, 0x97, 0xed, 0x49, 0x7d, 0x96, 0x4e, 0xe7, 0x33, 0x4f, 0xa6, 0x94, 0xc7, 0x52, - 0xd6, 0x33, 0xf2, 0xbe, 0xec, 0x04, 0xf0, 0x9f, 0x3a, 0x78, 0xf1, 0xe5, 0x78, 0x3c, 0xbe, 0x33, 0xbd, 0xef, 0xcb, - 0x70, 0x4c, 0xbb, 0xf4, 0xb0, 0x07, 0xa7, 0x16, 0x9a, 0x2a, 0x11, 0xad, 0x53, 0x08, 0xdc, 0x2d, 0xee, 0x57, 0x19, - 0x72, 0xd6, 0x78, 0xb4, 0xb8, 0x7f, 0xaa, 0x5f, 0x31, 0xcb, 0xe8, 0x62, 0xea, 0x67, 0x13, 0x96, 0x78, 0xed, 0xc2, - 0xbd, 0x5a, 0x28, 0x50, 0x8f, 0x8e, 0x8e, 0x0a, 0x37, 0xd4, 0x4f, 0xed, 0x30, 0x2c, 0xdc, 0x60, 0x51, 0x4e, 0xa3, - 0xdd, 0x1e, 0x8f, 0x0b, 0x97, 0xe9, 0x82, 0xfd, 0x6e, 0x10, 0xee, 0x77, 0x0b, 0xf7, 0xda, 0xa8, 0x51, 0xb8, 0x54, - 0x3d, 0x65, 0x34, 0xac, 0x1d, 0x7d, 0x78, 0xd4, 0x6e, 0x17, 0xae, 0x24, 0xb4, 0x05, 0xc4, 0xe4, 0xe4, 0x4f, 0xcf, - 0x9f, 0xf3, 0xb4, 0xb8, 0x28, 0x8a, 0x5e, 0xcc, 0x9d, 0xe1, 0xae, 0xba, 0x56, 0x52, 0x7e, 0x87, 0xb1, 0x40, 0x23, - 0xfc, 0xb5, 0x99, 0x39, 0x07, 0xc4, 0x2c, 0x32, 0xe6, 0x62, 0x9d, 0x58, 0x57, 0x7b, 0x0d, 0x94, 0x25, 0x5e, 0x7f, - 0x4d, 0xe2, 0x2a, 0xa1, 0x0e, 0xf8, 0x18, 0xd4, 0x94, 0xb7, 0x9f, 0x27, 0xdb, 0xa4, 0x47, 0xf6, 0x69, 0xe9, 0x71, - 0x79, 0x1f, 0xe1, 0x91, 0xfd, 0xe1, 0xc2, 0x23, 0x31, 0x85, 0x87, 0x64, 0x1d, 0xd7, 0x9c, 0xd8, 0x41, 0x44, 0x83, - 0x8f, 0x97, 0xe9, 0x4d, 0x13, 0xb6, 0x44, 0x66, 0x0b, 0xb1, 0x72, 0xf5, 0x5b, 0x33, 0xf9, 0x75, 0x67, 0xc6, 0x47, - 0x1c, 0x85, 0x8e, 0xff, 0x26, 0x21, 0xf6, 0x1b, 0x1d, 0xd8, 0x93, 0x25, 0xe3, 0x31, 0xb1, 0xdf, 0x8c, 0xc7, 0xb6, - 0xbe, 0x1c, 0xc7, 0xe7, 0x54, 0xd4, 0x7a, 0x5d, 0x2b, 0x11, 0xb5, 0xc0, 0xd0, 0xaf, 0xca, 0xcc, 0x02, 0x95, 0x77, - 0x67, 0xe6, 0xd8, 0xa9, 0x37, 0x21, 0xcb, 0x61, 0xab, 0xc1, 0xb7, 0x25, 0xeb, 0x97, 0xf3, 0x27, 0xb5, 0x2f, 0x29, - 0x95, 0x00, 0x6f, 0xf8, 0xfc, 0xd3, 0xea, 0xcd, 0x70, 0x13, 0xaa, 0x55, 0xfc, 0x27, 0xb7, 0x2f, 0x42, 0xe7, 0x9a, - 0xa3, 0x82, 0xe5, 0x6f, 0x92, 0x95, 0x5b, 0x1f, 0x24, 0x8c, 0x84, 0x98, 0xd3, 0x2a, 0x78, 0x3a, 0x99, 0xc4, 0xe2, - 0x30, 0x49, 0xcd, 0xe0, 0x96, 0xcd, 0x07, 0xb5, 0xf9, 0x7a, 0x66, 0x43, 0xf5, 0x79, 0x0d, 0xf1, 0xbd, 0x61, 0x79, - 0x5a, 0xf8, 0x4a, 0x7d, 0x78, 0x56, 0xc4, 0x04, 0x17, 0x8a, 0xc7, 0x2f, 0xe4, 0x19, 0x53, 0x8e, 0x59, 0x28, 0x9b, - 0xb3, 0xb0, 0x28, 0xd4, 0xe9, 0xfc, 0x90, 0xe5, 0x33, 0xd0, 0x9e, 0x64, 0x4b, 0xfa, 0x29, 0x16, 0x9e, 0x5f, 0x1b, - 0xc9, 0x6d, 0xb5, 0xe5, 0x2a, 0xb4, 0x9d, 0x26, 0xb3, 0x85, 0xae, 0x79, 0x61, 0x2b, 0x93, 0x4d, 0x23, 0xd1, 0xb6, - 0x24, 0x3e, 0x65, 0xda, 0x9d, 0x31, 0x43, 0xc8, 0xfc, 0x29, 0x17, 0x44, 0xbf, 0xd2, 0x05, 0x85, 0x69, 0x65, 0x89, - 0x37, 0x12, 0x5b, 0x22, 0x55, 0x2c, 0x9f, 0xf9, 0x89, 0x36, 0xe6, 0x24, 0x3f, 0xd8, 0x5d, 0x54, 0x2b, 0x5f, 0xd8, - 0x1a, 0x6c, 0x49, 0xbc, 0xfd, 0xe3, 0x16, 0x34, 0xe8, 0x5b, 0x35, 0xd0, 0x93, 0xb5, 0x0c, 0xb3, 0xbb, 0xf3, 0xae, - 0x3f, 0x5e, 0xb8, 0xf9, 0x35, 0x76, 0xf3, 0x6b, 0xeb, 0xab, 0x45, 0xf3, 0x9a, 0x5e, 0x7e, 0x64, 0xbc, 0xc9, 0xfd, - 0x59, 0x13, 0xbc, 0xa7, 0x22, 0x33, 0x44, 0xb1, 0x67, 0xa1, 0xa3, 0x4b, 0xd3, 0xaf, 0x37, 0xcf, 0x21, 0x3d, 0x5b, - 0x98, 0x51, 0x5e, 0x92, 0x26, 0xb4, 0x57, 0x3f, 0xbe, 0x67, 0x66, 0x18, 0x6b, 0x6c, 0x8d, 0x16, 0x29, 0xa4, 0x73, - 0xf3, 0x5b, 0xaf, 0xad, 0xd8, 0x7a, 0x5b, 0xa7, 0x0f, 0xb7, 0x37, 0xd6, 0xf7, 0x14, 0x72, 0x1b, 0x42, 0x7a, 0x65, - 0xeb, 0xf9, 0xcf, 0xdb, 0xf2, 0xbb, 0x3f, 0x75, 0x98, 0x0d, 0xf2, 0x49, 0xf4, 0xff, 0xc6, 0x29, 0xc0, 0xd5, 0x62, - 0x71, 0x98, 0xed, 0x3e, 0x90, 0x79, 0xfe, 0x98, 0xd3, 0x0c, 0xdf, 0xa7, 0xe6, 0xa5, 0xb8, 0x77, 0x62, 0x01, 0x62, - 0xc6, 0xeb, 0x1c, 0xd5, 0x53, 0xb1, 0xef, 0xee, 0xfe, 0xee, 0xe9, 0x17, 0x0a, 0x47, 0xfa, 0x1e, 0x56, 0xdb, 0xee, - 0xc1, 0x46, 0x88, 0xfd, 0x5b, 0x8f, 0x25, 0x42, 0xe6, 0x5d, 0x42, 0x52, 0x48, 0x6f, 0x96, 0xaa, 0x53, 0x99, 0x19, - 0x8d, 0xc5, 0xa7, 0xd7, 0xd5, 0x52, 0xec, 0x3f, 0x9c, 0xdd, 0xe8, 0xd5, 0xe8, 0xac, 0x9c, 0xb6, 0xfc, 0x43, 0x0f, - 0x55, 0x6e, 0x3f, 0xc5, 0x59, 0x3f, 0x18, 0x78, 0x38, 0xbb, 0xe9, 0x49, 0x41, 0xdb, 0xcc, 0x24, 0x54, 0xed, 0xd9, - 0x8d, 0x79, 0xac, 0xb4, 0xea, 0xc8, 0x72, 0xf7, 0x73, 0x8b, 0xfa, 0x39, 0xed, 0xc1, 0x97, 0xa6, 0x58, 0xe0, 0xc7, - 0x4a, 0x98, 0x4f, 0x59, 0x18, 0xc6, 0xb4, 0xa7, 0xe5, 0xb5, 0xd5, 0x79, 0x08, 0xa7, 0x32, 0xcd, 0x25, 0xab, 0xaf, - 0x8a, 0x81, 0xbc, 0x12, 0x4f, 0xfe, 0x65, 0x9e, 0xc6, 0xf0, 0x9d, 0xc7, 0x8d, 0xe8, 0x54, 0xc7, 0x15, 0xdb, 0x15, - 0xf2, 0xc4, 0xef, 0xfa, 0x5c, 0x0e, 0xdb, 0x7f, 0xea, 0x89, 0x05, 0x6f, 0xf7, 0x78, 0x3a, 0xf3, 0x9a, 0xfb, 0xf5, - 0x89, 0xc0, 0xab, 0x72, 0x0a, 0x78, 0xc3, 0xb4, 0x30, 0x48, 0x2b, 0xc9, 0xa7, 0x2d, 0xb7, 0xa3, 0xca, 0x44, 0x07, - 0x60, 0x84, 0x96, 0x45, 0x45, 0x7d, 0x32, 0xff, 0x98, 0xdd, 0xf2, 0x78, 0xf3, 0x6e, 0x79, 0xac, 0x77, 0xcb, 0xdd, - 0x14, 0xfb, 0xe5, 0xb8, 0x03, 0xff, 0xf5, 0xaa, 0x09, 0x79, 0x6d, 0x6b, 0x7f, 0x76, 0x63, 0x81, 0x9e, 0xd6, 0xec, - 0xce, 0x6e, 0xe4, 0xa1, 0x5a, 0x48, 0x5c, 0x6b, 0xc3, 0x31, 0x53, 0xdc, 0xb6, 0xa0, 0x10, 0xfe, 0x6f, 0xd7, 0x5e, - 0x75, 0x0e, 0xe0, 0x1d, 0xb4, 0x3a, 0x5c, 0x7f, 0xd7, 0xbd, 0x7b, 0xd3, 0x7a, 0x49, 0xca, 0x1d, 0x4f, 0x73, 0x63, - 0xe4, 0x72, 0xff, 0xf2, 0x92, 0x86, 0xde, 0x38, 0x0d, 0xe6, 0xf9, 0x3f, 0x29, 0xf8, 0x15, 0x12, 0xef, 0xdc, 0xd2, - 0x2b, 0xfd, 0xe8, 0xa6, 0xf2, 0x88, 0xaf, 0xee, 0x61, 0x51, 0xae, 0x93, 0x97, 0x07, 0x7e, 0x4c, 0x9d, 0xae, 0x7b, - 0xb0, 0x61, 0x13, 0xfc, 0x9b, 0xac, 0xcd, 0xc6, 0xc9, 0xfc, 0x5e, 0x64, 0xdc, 0x89, 0x84, 0xcf, 0xc2, 0x81, 0xb9, - 0x86, 0xed, 0xa3, 0xcd, 0xe0, 0x0e, 0xf5, 0x48, 0x23, 0x2d, 0x14, 0x94, 0xdc, 0x09, 0xe9, 0xd8, 0x9f, 0xc7, 0xfc, - 0xee, 0x5e, 0xb7, 0x51, 0xc6, 0x5a, 0xaf, 0x77, 0x30, 0xf4, 0xaa, 0xee, 0x3d, 0xb9, 0xf4, 0x97, 0x8f, 0x0f, 0xe0, - 0x3f, 0x79, 0xf8, 0xe5, 0xb2, 0xd2, 0xd5, 0xa5, 0xd5, 0x0b, 0xba, 0xfa, 0x55, 0x4d, 0x19, 0x97, 0x22, 0x5c, 0xe8, - 0xe3, 0xf7, 0xad, 0x0d, 0x5a, 0xe5, 0xbd, 0xaa, 0x2b, 0x2d, 0xeb, 0xb3, 0x6a, 0x7f, 0x5e, 0xe7, 0xf7, 0xac, 0x1b, - 0x48, 0xcd, 0xb5, 0x5e, 0x57, 0x7d, 0x7a, 0x7e, 0xad, 0xb2, 0xc6, 0xb8, 0xa8, 0x7f, 0x45, 0x2e, 0x4b, 0x13, 0x45, - 0xa6, 0xa2, 0x82, 0x95, 0x72, 0x25, 0xad, 0x94, 0x94, 0x92, 0x8b, 0xe3, 0xc1, 0xcd, 0x34, 0xb6, 0xae, 0xe4, 0xfd, - 0x38, 0xc4, 0xee, 0xb8, 0x6d, 0xdb, 0x12, 0x4e, 0x3a, 0xf8, 0x4c, 0x97, 0xfd, 0xe1, 0xfd, 0xd7, 0xcd, 0x23, 0x7b, - 0x00, 0x9a, 0xd6, 0xd5, 0x44, 0x68, 0x76, 0x2f, 0xfd, 0x5b, 0x9a, 0x9d, 0x77, 0x95, 0x0b, 0x5e, 0xe6, 0x8b, 0x8b, - 0x32, 0xab, 0x6b, 0x5b, 0x37, 0xd3, 0x38, 0xc9, 0x89, 0x1d, 0x71, 0x3e, 0xf3, 0x5a, 0xad, 0xeb, 0xeb, 0x6b, 0xf7, - 0x7a, 0xdf, 0x4d, 0xb3, 0x49, 0xab, 0xdb, 0x6e, 0xb7, 0xe1, 0x8b, 0x1f, 0xb6, 0x75, 0xc5, 0xe8, 0xf5, 0x93, 0xf4, - 0x86, 0xd8, 0x6d, 0xab, 0x6d, 0x75, 0xba, 0x47, 0x56, 0xa7, 0x7b, 0xe0, 0x3e, 0x3c, 0xb2, 0xfb, 0x5f, 0x58, 0xd6, - 0x71, 0x48, 0xc7, 0x39, 0xfc, 0xb0, 0xac, 0x63, 0xa1, 0x78, 0xc9, 0xdf, 0x96, 0xe5, 0x06, 0x71, 0xde, 0xec, 0x58, - 0x0b, 0xf5, 0x68, 0x59, 0x70, 0x8b, 0x90, 0x67, 0x7d, 0x39, 0xee, 0x8e, 0x0f, 0xc6, 0x8f, 0x7b, 0xaa, 0xb8, 0xf8, - 0xa2, 0x56, 0x1d, 0xcb, 0x7f, 0xbb, 0x46, 0xb3, 0x9c, 0x67, 0xe9, 0x47, 0xaa, 0x5c, 0xfb, 0x16, 0x88, 0x9e, 0x8d, - 0x4d, 0xbb, 0xeb, 0x23, 0x75, 0x8e, 0x2e, 0x83, 0x71, 0xb7, 0xaa, 0x2e, 0x60, 0x6c, 0x95, 0x40, 0x1e, 0xb7, 0x34, - 0xe8, 0xc7, 0x26, 0x9a, 0x3a, 0xcd, 0x4d, 0x88, 0xea, 0xd8, 0x6a, 0x8e, 0x13, 0x3d, 0xbf, 0x63, 0x38, 0xb4, 0xae, - 0x75, 0x55, 0x01, 0x81, 0x6d, 0x85, 0xc4, 0x7e, 0xd5, 0xe9, 0x1e, 0xe1, 0x4e, 0xe7, 0xa1, 0xfb, 0xf0, 0x28, 0x68, - 0xe3, 0x03, 0xf7, 0xa0, 0xb9, 0xef, 0x3e, 0xc4, 0x47, 0xcd, 0x23, 0x7c, 0xf4, 0xfc, 0x28, 0x68, 0x1e, 0xb8, 0x07, - 0xb8, 0xdd, 0x3c, 0x82, 0xc2, 0xe6, 0x51, 0xf3, 0xe8, 0xaa, 0x79, 0x70, 0x14, 0xb4, 0x45, 0x69, 0xd7, 0x3d, 0x3c, - 0x6c, 0x76, 0xda, 0xee, 0xe1, 0x21, 0x3e, 0x74, 0x1f, 0x3e, 0x6c, 0x76, 0xf6, 0xdd, 0x87, 0x0f, 0x5f, 0x1e, 0x1e, - 0xb9, 0xfb, 0xf0, 0x6e, 0x7f, 0x3f, 0xd8, 0x77, 0x3b, 0x9d, 0x26, 0xfc, 0xc1, 0x47, 0x6e, 0x57, 0xfe, 0xe8, 0x74, - 0xdc, 0xfd, 0x0e, 0x6e, 0xc7, 0x87, 0x5d, 0xf7, 0xe1, 0x63, 0x2c, 0xfe, 0x8a, 0x6a, 0x58, 0xfc, 0x81, 0x6e, 0xf0, - 0x63, 0xb7, 0xfb, 0x50, 0xfe, 0x12, 0x1d, 0x5e, 0x1d, 0x1c, 0xfd, 0x68, 0xb7, 0xb6, 0xce, 0xa1, 0x23, 0xe7, 0x70, - 0x74, 0xe8, 0xee, 0xef, 0xe3, 0x83, 0x8e, 0x7b, 0xb4, 0x1f, 0x35, 0x0f, 0xba, 0xee, 0xc3, 0x47, 0x41, 0xb3, 0xe3, - 0x3e, 0x7a, 0x84, 0xdb, 0xcd, 0x7d, 0xb7, 0x8b, 0x3b, 0xee, 0xc1, 0xbe, 0xf8, 0xb1, 0xef, 0x76, 0xaf, 0x1e, 0x3d, - 0x76, 0x1f, 0x1e, 0x46, 0x0f, 0xdd, 0x83, 0x6f, 0x0f, 0x8e, 0xdc, 0xee, 0x7e, 0xb4, 0xff, 0xd0, 0xed, 0x3e, 0xba, - 0x7a, 0xe8, 0x1e, 0x44, 0xcd, 0xee, 0xc3, 0x3b, 0x5b, 0x76, 0xba, 0x2e, 0xe0, 0x48, 0xbc, 0x86, 0x17, 0x58, 0xbd, - 0x80, 0xff, 0x23, 0xd1, 0xf6, 0xdf, 0xb0, 0x9b, 0x7c, 0xbd, 0xe9, 0x63, 0xf7, 0xe8, 0x51, 0x20, 0xab, 0x43, 0x41, - 0x53, 0xd7, 0x80, 0x26, 0x57, 0x4d, 0x39, 0xac, 0xe8, 0xae, 0xa9, 0x3b, 0xd2, 0xff, 0xab, 0xc1, 0xae, 0x9a, 0x30, - 0xb0, 0x1c, 0xf7, 0xdf, 0xb5, 0x9f, 0x72, 0xc9, 0x8f, 0x5b, 0x13, 0x49, 0xfa, 0x93, 0xfe, 0x17, 0xf2, 0x73, 0x3e, - 0x5f, 0x5c, 0x60, 0x7f, 0x9b, 0xe3, 0x23, 0xfe, 0xb4, 0xe3, 0x23, 0xa2, 0xf7, 0xf1, 0x7c, 0xc4, 0x7f, 0xb8, 0xe7, - 0xc3, 0x5f, 0x75, 0x9b, 0xdf, 0xf0, 0x35, 0x07, 0xc7, 0xaa, 0x55, 0xfc, 0x82, 0x3b, 0xc3, 0x14, 0x3e, 0x1d, 0x5d, - 0xf4, 0x6e, 0x38, 0x89, 0xa8, 0xe9, 0x07, 0x4a, 0x81, 0xc5, 0xde, 0x70, 0xc9, 0x63, 0x83, 0x6d, 0x08, 0x09, 0x3f, - 0x8d, 0x90, 0xef, 0xee, 0x83, 0x8f, 0xf0, 0x0f, 0xc7, 0x47, 0x60, 0xe2, 0xa3, 0xe6, 0xc9, 0x17, 0x9e, 0x06, 0xe1, - 0x29, 0x38, 0x13, 0xcf, 0x0e, 0xdc, 0x9a, 0xd1, 0xb0, 0x5b, 0xf4, 0x4a, 0x44, 0xee, 0x64, 0x70, 0xfd, 0xf9, 0xe7, - 0x04, 0x1d, 0xe4, 0x15, 0x39, 0xc4, 0x56, 0x6e, 0x99, 0x99, 0x90, 0x3a, 0xea, 0xa1, 0x14, 0x4a, 0x5d, 0xb7, 0xed, - 0xb6, 0x4b, 0x97, 0x0e, 0x5c, 0x8b, 0x44, 0x16, 0x29, 0xf7, 0xbd, 0x9d, 0x0e, 0x8e, 0xd3, 0x09, 0x5c, 0x96, 0x24, - 0x3e, 0x1f, 0x07, 0x27, 0x1e, 0x02, 0xf9, 0xe5, 0x3e, 0x48, 0x9f, 0x50, 0x8e, 0x1e, 0x3f, 0xfb, 0xf8, 0x37, 0x08, - 0x62, 0xea, 0x98, 0xc4, 0x14, 0xbc, 0x1d, 0xaf, 0x68, 0xc8, 0x7c, 0xc7, 0x76, 0x66, 0x19, 0x1d, 0xd3, 0x2c, 0x6f, - 0xd6, 0xee, 0xeb, 0x11, 0x57, 0xf5, 0x20, 0x5b, 0x41, 0x38, 0xce, 0xe0, 0x73, 0x48, 0x64, 0xa8, 0xfc, 0x8d, 0xb6, - 0x32, 0xc0, 0xec, 0x02, 0xeb, 0x92, 0x0c, 0x64, 0x6d, 0xa5, 0xb4, 0xd9, 0x52, 0x6b, 0xeb, 0xb8, 0xdd, 0x43, 0x64, - 0x89, 0x62, 0xf8, 0xd0, 0xcc, 0x0f, 0x4e, 0x73, 0xbf, 0xfd, 0x27, 0x64, 0x34, 0x2b, 0x3b, 0x1a, 0x29, 0x77, 0x5b, - 0x52, 0x7e, 0x8e, 0x70, 0x25, 0xec, 0x6a, 0x4b, 0x8a, 0xf8, 0x52, 0xce, 0xdd, 0x46, 0xbd, 0x44, 0x25, 0xcd, 0xc9, - 0x2b, 0x01, 0xc7, 0x6c, 0xe2, 0x18, 0xd7, 0x4d, 0x24, 0xf2, 0x43, 0x36, 0x70, 0x5b, 0x3d, 0x42, 0x45, 0x55, 0x25, - 0x41, 0x0b, 0x11, 0x6d, 0x61, 0x89, 0x95, 0x2c, 0x97, 0x4e, 0x02, 0x2e, 0x72, 0x62, 0xe0, 0x14, 0x9e, 0x51, 0x0d, - 0xc9, 0x09, 0x2e, 0x01, 0x12, 0x08, 0x26, 0x89, 0xfc, 0xb7, 0x2a, 0xd6, 0x3f, 0x94, 0xe3, 0xcb, 0x8d, 0xfd, 0x64, - 0x02, 0x54, 0xe8, 0x27, 0x93, 0x35, 0xb7, 0x9a, 0x0c, 0x18, 0xad, 0x94, 0x56, 0x5d, 0x55, 0xee, 0xb3, 0xfc, 0xc9, - 0xed, 0x7b, 0x75, 0xe3, 0xb5, 0x0d, 0xde, 0x69, 0x11, 0xdf, 0xa8, 0xbe, 0xce, 0xd3, 0x20, 0x0f, 0x8e, 0xa7, 0x94, - 0xfb, 0xf2, 0xb0, 0x1a, 0xe8, 0x13, 0x90, 0xcb, 0x62, 0x29, 0x6b, 0x54, 0x05, 0xf5, 0x89, 0x3c, 0xcc, 0x2f, 0x45, - 0x3d, 0xb6, 0xd4, 0x55, 0x71, 0x4d, 0xb1, 0x34, 0xa4, 0x83, 0xa5, 0x3f, 0x26, 0xf0, 0xc5, 0x71, 0x64, 0x92, 0xa4, - 0x76, 0xff, 0x41, 0x99, 0xeb, 0xb2, 0x6d, 0x11, 0x62, 0x96, 0x7c, 0x1c, 0x66, 0x34, 0xfe, 0x27, 0xf2, 0x80, 0x05, - 0x69, 0xf2, 0x60, 0x64, 0xa3, 0x1e, 0x77, 0xa3, 0x8c, 0x8e, 0xc9, 0x03, 0x90, 0xf1, 0x9e, 0xb0, 0x3e, 0x80, 0x11, - 0x36, 0x6e, 0xa6, 0x31, 0x16, 0x1a, 0xd3, 0x3d, 0x14, 0x22, 0x09, 0xae, 0xdd, 0x3d, 0xb4, 0x2d, 0x69, 0x13, 0x8b, - 0xdf, 0x7d, 0x29, 0x4e, 0x85, 0x12, 0x60, 0x75, 0xba, 0xee, 0x61, 0xd4, 0x75, 0x1f, 0x5f, 0x3d, 0x72, 0x8f, 0xa2, - 0xce, 0xa3, 0xab, 0x26, 0xfc, 0xdb, 0x75, 0x1f, 0xc7, 0xcd, 0xae, 0xfb, 0x18, 0xfe, 0xff, 0xf6, 0xc0, 0x3d, 0x8c, - 0x9a, 0x1d, 0xf7, 0xe8, 0x6a, 0xdf, 0xdd, 0x7f, 0xd9, 0xe9, 0xba, 0xfb, 0x56, 0xc7, 0x92, 0xed, 0x80, 0x5d, 0x4b, - 0xee, 0xfc, 0x60, 0x65, 0x43, 0x6c, 0x08, 0xc6, 0xc9, 0x03, 0x77, 0x36, 0x16, 0x67, 0xa4, 0xcd, 0xfd, 0xa9, 0x9c, - 0x75, 0x4f, 0xfd, 0x0c, 0xbe, 0x6c, 0x5a, 0xdf, 0xbb, 0xb5, 0x77, 0xb8, 0xc6, 0x2f, 0x36, 0x0c, 0x31, 0x13, 0x11, - 0x70, 0xf3, 0xae, 0x35, 0xb8, 0xa8, 0x4c, 0x7c, 0x08, 0x4a, 0xdf, 0x87, 0xbf, 0x9d, 0xb4, 0x65, 0x45, 0x7d, 0xe7, - 0xbe, 0x60, 0x16, 0x4c, 0x7c, 0x72, 0x4f, 0x0c, 0xf2, 0x22, 0x2c, 0x56, 0xc7, 0x87, 0x73, 0x7f, 0x59, 0x6a, 0x5c, - 0x37, 0x47, 0xab, 0x20, 0x7f, 0xc8, 0xe0, 0x82, 0xc0, 0xa2, 0xd0, 0xa0, 0xd7, 0xdc, 0xb4, 0x15, 0x96, 0x04, 0xbf, - 0xa0, 0xf9, 0xc0, 0x86, 0x22, 0xdb, 0xb3, 0x85, 0x8b, 0xcf, 0x2e, 0xbf, 0xee, 0x5a, 0x12, 0x76, 0x55, 0x80, 0xc5, - 0xed, 0x0f, 0xb0, 0x6b, 0x01, 0x3f, 0x36, 0xda, 0xdb, 0xdb, 0xba, 0x5f, 0x84, 0x02, 0x09, 0x73, 0xad, 0x3e, 0x0a, - 0x69, 0xb2, 0x22, 0xdb, 0x44, 0x74, 0xd9, 0xaf, 0x40, 0x21, 0x52, 0x78, 0xba, 0xa4, 0x3e, 0x77, 0xfd, 0x44, 0x9e, - 0x20, 0x30, 0x18, 0x16, 0xee, 0xd0, 0x7d, 0x54, 0xa4, 0xdc, 0x97, 0x49, 0x61, 0xe6, 0x3e, 0x4f, 0xb9, 0xaf, 0x2f, - 0x4f, 0xf2, 0x79, 0xed, 0xe0, 0x7c, 0xd4, 0xed, 0xbf, 0x79, 0x7f, 0x62, 0xc9, 0xed, 0x79, 0xdc, 0x8a, 0xba, 0xfd, - 0x63, 0xe1, 0x33, 0x91, 0x61, 0x7f, 0x22, 0xc3, 0xfe, 0x96, 0xba, 0x35, 0x06, 0x22, 0x69, 0x45, 0x4b, 0x4e, 0x5b, - 0xd8, 0x0c, 0xd2, 0xdb, 0x3b, 0x9d, 0xc7, 0x9c, 0xc1, 0x47, 0x8d, 0x5a, 0x22, 0xe6, 0x2f, 0x72, 0x08, 0xf4, 0x21, - 0x54, 0xa5, 0x1d, 0x5e, 0xf2, 0x44, 0xfb, 0x86, 0xc7, 0x2c, 0xa6, 0xfa, 0xd8, 0xa9, 0xea, 0xaa, 0x4c, 0xf8, 0x59, - 0xaf, 0x9d, 0xcf, 0x2f, 0x21, 0xe9, 0x41, 0xa7, 0x17, 0x7d, 0x50, 0x0d, 0x8e, 0xc5, 0x50, 0x10, 0xb9, 0x97, 0x62, - 0x5a, 0x7f, 0xbe, 0xb5, 0xbe, 0xa4, 0x6a, 0xf6, 0x4a, 0x42, 0xc0, 0x55, 0x1d, 0xd1, 0x7e, 0xbf, 0x74, 0x17, 0x9b, - 0xef, 0x8a, 0xe3, 0x56, 0xb4, 0xdf, 0xbf, 0xf0, 0x26, 0xaa, 0xbf, 0x97, 0xe9, 0x64, 0x73, 0x5f, 0x71, 0x3a, 0x19, - 0x88, 0x73, 0xf0, 0xf2, 0x4e, 0x27, 0xad, 0xfc, 0xa6, 0xb1, 0xdd, 0x3f, 0x56, 0xca, 0x80, 0x25, 0xc2, 0xea, 0xf6, - 0x61, 0x5b, 0x1f, 0xad, 0x8f, 0xd3, 0x09, 0x6c, 0x48, 0xd9, 0xc4, 0x18, 0xa4, 0xe6, 0x71, 0x8f, 0x3a, 0xfd, 0x63, - 0xdf, 0x12, 0xbc, 0x45, 0x30, 0x8f, 0xdc, 0x6b, 0x41, 0xe3, 0x28, 0x9d, 0x52, 0x97, 0xa5, 0xad, 0x6b, 0x7a, 0xd9, - 0xf4, 0x67, 0xac, 0x72, 0x6f, 0x83, 0xd2, 0x51, 0x0e, 0x99, 0xae, 0xa4, 0x58, 0x75, 0x2b, 0x77, 0xdb, 0x01, 0xd8, - 0x3c, 0xda, 0x35, 0x27, 0x7c, 0x72, 0x06, 0x58, 0x69, 0xff, 0xb8, 0xe5, 0xaf, 0x60, 0x44, 0xf0, 0xfb, 0x42, 0x39, - 0xda, 0xc1, 0xb0, 0xb9, 0x14, 0xf9, 0x5d, 0x52, 0x1c, 0x68, 0x87, 0xbc, 0x12, 0xd4, 0x85, 0xdd, 0xff, 0xd7, 0xff, - 0xf1, 0xbf, 0x94, 0x8f, 0xfd, 0xb8, 0x15, 0x75, 0x74, 0x5f, 0x2b, 0xab, 0x52, 0x1c, 0xc3, 0x45, 0x35, 0x55, 0x50, - 0x98, 0xde, 0x34, 0x27, 0x19, 0x0b, 0x9b, 0x91, 0x1f, 0x8f, 0xed, 0xfe, 0x76, 0x6c, 0xca, 0xfc, 0xc3, 0xa6, 0x0e, - 0xa7, 0xae, 0x17, 0x01, 0xbd, 0xfe, 0xa6, 0x5b, 0x17, 0x74, 0x4a, 0x97, 0xd8, 0xda, 0xe6, 0x1d, 0x0c, 0xd5, 0xee, - 0xab, 0xdd, 0xc3, 0x90, 0xa8, 0x6f, 0x42, 0x2b, 0x0e, 0x98, 0xd4, 0xae, 0x5f, 0x28, 0x6c, 0xab, 0x0c, 0x6a, 0xfd, - 0xdf, 0xff, 0xf9, 0x5f, 0xfe, 0x9b, 0x7e, 0x84, 0x58, 0xd5, 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, - 0x85, 0xfc, 0x33, 0x15, 0xcf, 0x12, 0x4c, 0xc5, 0xaa, 0x82, 0x59, 0x92, 0xbb, 0x58, 0x70, 0xaa, 0x6d, 0xca, 0x72, - 0xce, 0x82, 0xfa, 0x85, 0x0c, 0x67, 0x62, 0x40, 0xb1, 0x33, 0x15, 0x74, 0x62, 0x87, 0x17, 0x15, 0x41, 0xd5, 0x50, - 0x2e, 0x08, 0xb7, 0x38, 0x6e, 0x01, 0xbe, 0xef, 0x77, 0x9f, 0x8c, 0x5b, 0x2e, 0xc7, 0x42, 0x93, 0x09, 0x94, 0x14, - 0x55, 0xb9, 0x05, 0xb1, 0x95, 0x05, 0x3c, 0x7a, 0x5d, 0xa3, 0x58, 0xac, 0x5e, 0xad, 0x4d, 0xef, 0xe7, 0x79, 0xce, - 0xd9, 0x18, 0x50, 0x2e, 0xfd, 0xc4, 0x22, 0x8c, 0xdd, 0x04, 0x5d, 0x31, 0xbe, 0x2d, 0x44, 0x2f, 0x92, 0x40, 0x0f, - 0x8e, 0xfe, 0x54, 0xfc, 0x79, 0x0a, 0x1a, 0x99, 0xe5, 0x4c, 0xfd, 0x1b, 0x65, 0x9e, 0x3f, 0x6c, 0xb7, 0x67, 0x37, - 0x68, 0x51, 0x8d, 0x80, 0xb7, 0x0d, 0x26, 0xe8, 0xd8, 0xec, 0x50, 0xc4, 0xbf, 0x4b, 0x37, 0x76, 0xdb, 0x02, 0x5f, - 0xb8, 0xd5, 0x2e, 0x8a, 0xaf, 0x16, 0xc2, 0x93, 0xca, 0x7e, 0x85, 0x38, 0xb5, 0x72, 0x3a, 0x5f, 0xa6, 0xe6, 0xe4, - 0x16, 0x46, 0xab, 0xae, 0x6c, 0x15, 0x75, 0xd6, 0xaf, 0x66, 0x31, 0xe3, 0xec, 0x66, 0x84, 0xfc, 0x00, 0x62, 0xde, - 0x51, 0x07, 0x47, 0xdd, 0x45, 0xd9, 0x3d, 0xe7, 0xe9, 0xd4, 0x0c, 0xac, 0x53, 0x9f, 0x06, 0x74, 0xac, 0x9d, 0xf5, - 0xea, 0xbd, 0x0c, 0x9a, 0x17, 0xd1, 0xfe, 0x86, 0xb1, 0x14, 0x48, 0x22, 0xa0, 0x6e, 0xb5, 0x8b, 0x2f, 0x61, 0x07, - 0x2e, 0xc6, 0x71, 0xea, 0x73, 0x4f, 0x10, 0x6c, 0xcf, 0x0c, 0xcf, 0xfb, 0xc0, 0x93, 0xd2, 0x85, 0x01, 0x4f, 0x4f, - 0x56, 0x05, 0xb7, 0x79, 0xfd, 0x8a, 0xc6, 0xc2, 0x15, 0xcd, 0xcd, 0xae, 0xa4, 0xd7, 0xed, 0x3b, 0x15, 0xf5, 0x7e, - 0x5e, 0x73, 0x57, 0x29, 0x81, 0xd4, 0x45, 0x9b, 0xdf, 0x4b, 0xb9, 0x2e, 0xdf, 0x7e, 0xcf, 0x1d, 0x5b, 0x80, 0x69, - 0xaf, 0xd6, 0x12, 0x85, 0x50, 0xeb, 0x39, 0xf9, 0xae, 0x34, 0x99, 0xfc, 0xd9, 0x4c, 0x54, 0x44, 0xbd, 0xe3, 0x96, - 0xd4, 0x74, 0x81, 0x7b, 0x88, 0x94, 0x0e, 0x99, 0x41, 0xa1, 0x2a, 0xa9, 0xad, 0x20, 0x7f, 0xa9, 0xdc, 0x0a, 0xf8, - 0x56, 0x78, 0xff, 0xff, 0x01, 0xa2, 0x89, 0x8c, 0x0d, 0xc4, 0x97, 0x00, 0x00}; + 0x95, 0xd2, 0x3b, 0x9e, 0x56, 0x41, 0xb0, 0xd5, 0x38, 0x5f, 0xb3, 0x03, 0xbe, 0xb0, 0x91, 0x90, 0xcf, 0x39, 0xce, + 0x08, 0x48, 0xd1, 0xee, 0xc0, 0x3e, 0xce, 0xaf, 0x26, 0x7d, 0x1b, 0x62, 0x34, 0x29, 0xf9, 0x20, 0x5c, 0x43, 0x50, + 0x21, 0x22, 0xed, 0x5e, 0x74, 0x4c, 0x7b, 0x51, 0xa3, 0xa1, 0xb5, 0x68, 0x9f, 0x24, 0xc3, 0x48, 0x36, 0x0f, 0x70, + 0x88, 0xe7, 0xa4, 0xd9, 0xc1, 0x33, 0xd2, 0x16, 0x4d, 0x7a, 0xb3, 0x63, 0x5f, 0x0d, 0xb3, 0xb7, 0xe7, 0xa4, 0x6e, + 0xec, 0xe7, 0xfc, 0x05, 0xd8, 0xfb, 0x64, 0x86, 0x43, 0x92, 0xba, 0xf4, 0x86, 0x06, 0x8e, 0x8f, 0x70, 0xa8, 0x38, + 0x0d, 0xea, 0xa1, 0x19, 0x31, 0xaa, 0x81, 0x19, 0x41, 0x3e, 0x0c, 0xc2, 0x61, 0x67, 0x44, 0x08, 0xb1, 0x77, 0x9a, + 0x4d, 0x7b, 0x90, 0x92, 0x09, 0xf7, 0xa0, 0xc4, 0x50, 0x96, 0xc9, 0x14, 0x8a, 0xba, 0x46, 0x91, 0xf3, 0x86, 0xbb, + 0x9c, 0xe6, 0xdc, 0x81, 0x62, 0xf0, 0x00, 0xe4, 0x9a, 0xb0, 0xed, 0xe3, 0x96, 0xdd, 0x80, 0x52, 0x41, 0x9c, 0x08, + 0xa7, 0xe4, 0x1a, 0x79, 0xe1, 0x70, 0x7f, 0x64, 0x0a, 0x00, 0x51, 0x08, 0x83, 0x5f, 0x0f, 0xc2, 0x61, 0x5b, 0x0c, + 0xde, 0xb7, 0x07, 0x4e, 0x4a, 0x72, 0xa9, 0xa1, 0x0d, 0x72, 0xef, 0x83, 0x98, 0x2a, 0xf2, 0x14, 0x70, 0x6a, 0xdc, + 0x39, 0x69, 0x76, 0x3d, 0x67, 0x6e, 0x4e, 0xa2, 0x09, 0x83, 0x29, 0x2c, 0xe0, 0x80, 0x40, 0x7d, 0x9c, 0x12, 0x18, + 0xb1, 0x6a, 0x76, 0xed, 0xa9, 0xe7, 0x07, 0xf6, 0x83, 0xc1, 0x39, 0xf7, 0xc6, 0x5c, 0x0e, 0x7f, 0xce, 0x97, 0x4b, + 0xf8, 0x77, 0xcc, 0x07, 0x29, 0xb9, 0x16, 0x45, 0x13, 0x55, 0x34, 0x85, 0xa2, 0x0f, 0x1e, 0x80, 0x8a, 0xf3, 0x52, + 0xcb, 0x92, 0x6b, 0x32, 0x25, 0x02, 0xf6, 0xbd, 0xbd, 0x64, 0x18, 0x35, 0x3a, 0x23, 0x70, 0xf2, 0x67, 0x3c, 0xff, + 0x8e, 0xf1, 0xc8, 0xb1, 0x5b, 0x7d, 0x1b, 0x0d, 0x6c, 0x0b, 0x96, 0xb6, 0x97, 0x35, 0x88, 0xc4, 0xb0, 0xdf, 0x78, + 0xc5, 0xbd, 0x79, 0x9f, 0xb4, 0x07, 0x0e, 0x53, 0x2e, 0x3d, 0x84, 0x7d, 0xc5, 0x38, 0xdb, 0x78, 0x8e, 0x1a, 0x8c, + 0x37, 0xf4, 0xf3, 0x1c, 0x35, 0x6e, 0x1b, 0x53, 0xe4, 0xf9, 0x8d, 0xdb, 0x86, 0x33, 0x27, 0x84, 0x34, 0xbb, 0x65, + 0x33, 0x2d, 0xfe, 0x22, 0xe4, 0x4d, 0xb5, 0xbf, 0x73, 0x28, 0xb6, 0x43, 0xd6, 0x70, 0x92, 0x21, 0x1d, 0x2d, 0x97, + 0xf6, 0xf1, 0xa0, 0x6f, 0xa3, 0x86, 0xa3, 0x09, 0xad, 0xa5, 0x29, 0x0d, 0x21, 0xcc, 0x46, 0x85, 0x8a, 0x27, 0x3d, + 0xa9, 0xc5, 0x8e, 0x16, 0xd5, 0x66, 0x37, 0x78, 0x00, 0x2d, 0x4a, 0x43, 0x46, 0x2a, 0xac, 0x33, 0x98, 0xa6, 0x26, + 0xe6, 0x8c, 0xb4, 0x71, 0x4a, 0xb4, 0xfb, 0x3a, 0x22, 0xbc, 0x22, 0x78, 0x9f, 0x54, 0xd5, 0xf1, 0x30, 0xc0, 0xe1, + 0x88, 0x3c, 0x95, 0x06, 0x49, 0x4f, 0x3b, 0xc7, 0x69, 0x4c, 0x9e, 0xac, 0x44, 0x71, 0x03, 0x08, 0xb0, 0xdc, 0xb8, + 0xc1, 0x3c, 0xcb, 0x68, 0xc2, 0x5f, 0xa7, 0xa1, 0xd2, 0xd3, 0x68, 0x0c, 0xa6, 0x12, 0x84, 0x67, 0x31, 0x28, 0x69, + 0x5d, 0xbd, 0x33, 0xe6, 0x6b, 0xaf, 0x67, 0x64, 0x2e, 0xf5, 0x27, 0x11, 0xb4, 0xed, 0xcd, 0x94, 0x65, 0xec, 0x20, + 0x3c, 0x57, 0xd1, 0x5c, 0xc7, 0x75, 0xdd, 0x99, 0x1b, 0xc0, 0x6b, 0x18, 0x20, 0x47, 0x85, 0xd8, 0x47, 0x4e, 0x4e, + 0x6e, 0xdc, 0x84, 0xde, 0x88, 0x51, 0x1d, 0x54, 0x49, 0x66, 0xbd, 0xbd, 0x8e, 0xa3, 0x9e, 0x60, 0x37, 0xb9, 0x9b, + 0xa4, 0x21, 0x05, 0xf4, 0x40, 0xfc, 0x5e, 0x15, 0x45, 0x7e, 0x6e, 0x06, 0xa9, 0x2a, 0xf8, 0x86, 0xa6, 0xff, 0x7a, + 0x06, 0x4e, 0x5f, 0xa1, 0x6c, 0x95, 0x95, 0xa5, 0x27, 0x1c, 0x21, 0x36, 0x76, 0x66, 0x2e, 0x04, 0xf7, 0x04, 0x09, + 0x31, 0xb0, 0xe5, 0x66, 0x26, 0x51, 0xdd, 0x96, 0x7d, 0x4e, 0x49, 0x38, 0x4c, 0x1b, 0x0d, 0xe1, 0x88, 0x9e, 0x4b, + 0x92, 0x98, 0x21, 0x3c, 0x2d, 0xf7, 0x96, 0xae, 0xf7, 0x96, 0xd4, 0x47, 0x72, 0xa6, 0x75, 0x87, 0x6e, 0x83, 0x71, + 0x24, 0x7c, 0x85, 0xdc, 0xb9, 0x45, 0x78, 0x4c, 0x5a, 0xce, 0xd0, 0x1d, 0xfc, 0x79, 0x84, 0x06, 0x8e, 0xfb, 0x15, + 0x6a, 0x49, 0xc6, 0x31, 0x45, 0x3d, 0x5f, 0x0e, 0xb1, 0x10, 0x51, 0xcc, 0x0e, 0x16, 0xbe, 0x44, 0x2f, 0xc3, 0x89, + 0x3f, 0xa5, 0xde, 0x18, 0xf6, 0xb8, 0xa6, 0x9b, 0xb7, 0x18, 0xe8, 0xc8, 0x1b, 0x2b, 0x4e, 0xe2, 0xda, 0x83, 0x5f, + 0x78, 0xf9, 0x34, 0xb0, 0x07, 0x5f, 0x57, 0x4f, 0x7f, 0xb6, 0x07, 0xdf, 0x72, 0xef, 0xdb, 0x42, 0xb9, 0xbb, 0x6b, + 0x43, 0x3c, 0xd4, 0x43, 0x14, 0x72, 0x61, 0x0c, 0xcc, 0xcd, 0xd1, 0xba, 0xa3, 0x63, 0x86, 0x0a, 0x36, 0x2e, 0x59, + 0x51, 0xee, 0x72, 0x7f, 0x02, 0x28, 0x35, 0x56, 0x20, 0x37, 0xa3, 0xfb, 0xd5, 0x84, 0x81, 0x50, 0x34, 0xb5, 0x02, + 0x2a, 0x67, 0xfd, 0x36, 0x5a, 0xd4, 0xea, 0x0a, 0x8d, 0xa9, 0x1e, 0x4d, 0x2f, 0xb9, 0xf4, 0x94, 0xb4, 0x7b, 0xd3, + 0xe3, 0x59, 0x6f, 0xda, 0x68, 0xa0, 0x5c, 0x13, 0xd6, 0x7c, 0x38, 0x1d, 0xe1, 0xd7, 0xe0, 0xd5, 0x33, 0x29, 0x09, + 0xd7, 0xa6, 0xd7, 0x55, 0xd3, 0x6b, 0x34, 0xb2, 0x02, 0xf5, 0x8c, 0xa6, 0x33, 0xd9, 0xb4, 0x28, 0x24, 0x4e, 0x56, + 0x09, 0xed, 0x08, 0x89, 0x12, 0x48, 0x89, 0x22, 0x84, 0x9c, 0x71, 0xb4, 0xb1, 0x57, 0xe8, 0x13, 0x9a, 0x8b, 0x1d, + 0x0b, 0xcc, 0x53, 0xca, 0x08, 0x07, 0xb0, 0x00, 0x4d, 0x4b, 0x57, 0xf0, 0x2d, 0x9e, 0x37, 0x3a, 0x82, 0xc8, 0x9b, + 0x9d, 0x5e, 0xbd, 0xaf, 0x47, 0x55, 0x5f, 0x78, 0xde, 0x20, 0xb7, 0x25, 0x96, 0x8a, 0xac, 0xd1, 0x28, 0xea, 0xf1, + 0x4e, 0xbd, 0x6f, 0x6b, 0x11, 0x88, 0x93, 0xd5, 0xd4, 0x0c, 0x2d, 0x5f, 0x2b, 0x89, 0xca, 0x5c, 0x96, 0x24, 0x34, + 0x03, 0x19, 0x4a, 0x38, 0x66, 0x45, 0x51, 0xca, 0xf5, 0x37, 0x20, 0x44, 0x31, 0x25, 0x09, 0xf0, 0x1d, 0x61, 0x76, + 0xe1, 0x0c, 0xa7, 0x38, 0x12, 0x5c, 0x83, 0x10, 0x72, 0xaa, 0x93, 0x5a, 0xb8, 0xe0, 0x40, 0x3e, 0x61, 0x86, 0x44, + 0xca, 0x09, 0x75, 0xcf, 0x77, 0x4f, 0xd3, 0x3b, 0x4d, 0xb2, 0x21, 0x1b, 0x79, 0xa2, 0x5a, 0xac, 0xf8, 0x56, 0x40, + 0xde, 0x39, 0x1c, 0x95, 0xe1, 0x11, 0x57, 0xb0, 0xbf, 0xa7, 0x2c, 0xa3, 0x42, 0x03, 0xdf, 0xd5, 0x66, 0x9f, 0x5f, + 0x57, 0x1f, 0x7d, 0xd3, 0x79, 0x03, 0x88, 0x0c, 0xc0, 0xb7, 0x93, 0x91, 0xb5, 0x6a, 0xe7, 0xbb, 0x27, 0x6f, 0x36, + 0x99, 0xc0, 0xcb, 0xa5, 0x32, 0x7e, 0x7d, 0xd0, 0x6c, 0x70, 0x50, 0x41, 0xea, 0xab, 0x1f, 0x9e, 0xe3, 0x0b, 0x05, + 0x29, 0x70, 0x12, 0xa0, 0xa2, 0xf3, 0xdd, 0x93, 0xf7, 0x4e, 0x22, 0x5c, 0x4b, 0x08, 0x9b, 0xd3, 0x76, 0x52, 0xe2, + 0x44, 0x84, 0x22, 0x39, 0xf7, 0x92, 0x71, 0xa5, 0x86, 0xf8, 0xf6, 0x22, 0xf1, 0x12, 0xec, 0x87, 0x21, 0x1b, 0x11, + 0x5f, 0x61, 0x80, 0xf8, 0x08, 0xfb, 0x35, 0xb3, 0x8c, 0xc0, 0x02, 0x88, 0xb1, 0xce, 0x60, 0x25, 0x5c, 0xa9, 0xf8, + 0x21, 0xec, 0x8b, 0x51, 0x79, 0x21, 0x45, 0xc7, 0xcf, 0x6b, 0xb9, 0x69, 0x95, 0x35, 0xfa, 0x2d, 0x58, 0x4e, 0xfa, + 0xe1, 0xb5, 0xea, 0xba, 0x2c, 0x78, 0xaa, 0x93, 0xc8, 0xce, 0x77, 0x4f, 0x5e, 0xa9, 0x3c, 0xb2, 0x99, 0xaf, 0xb9, + 0xfd, 0x9a, 0x85, 0x79, 0xf2, 0xca, 0xad, 0xde, 0x8a, 0xca, 0xe7, 0xbb, 0x27, 0x1f, 0x36, 0x55, 0x83, 0xf2, 0x62, + 0x5e, 0x99, 0xf8, 0x02, 0xbe, 0x05, 0x8d, 0xbd, 0x85, 0x12, 0x0d, 0x1e, 0x2b, 0xb0, 0x10, 0x47, 0x5e, 0x5e, 0x94, + 0x9e, 0x91, 0xa7, 0x38, 0x23, 0x22, 0x0e, 0x54, 0x5f, 0x35, 0xa5, 0xe4, 0xb1, 0x34, 0x39, 0x0b, 0xd2, 0x19, 0xdd, + 0x12, 0x1c, 0x3a, 0x41, 0x2e, 0x9b, 0x42, 0x02, 0x8d, 0x00, 0x9d, 0xe1, 0x9d, 0x36, 0xea, 0xd5, 0x85, 0x57, 0x26, + 0x88, 0x34, 0xad, 0x49, 0x16, 0x1c, 0x91, 0x36, 0xf6, 0x49, 0x1b, 0x07, 0x24, 0x1f, 0xb6, 0xa5, 0x78, 0xe8, 0x05, + 0x65, 0xbf, 0x52, 0xc8, 0x40, 0x6e, 0x58, 0x20, 0x77, 0xab, 0x14, 0xbf, 0x61, 0x2f, 0x10, 0xae, 0x47, 0x21, 0xd1, + 0x43, 0x69, 0xb4, 0x3a, 0x29, 0x4e, 0x45, 0xc7, 0x67, 0xec, 0x32, 0x86, 0xec, 0x12, 0x98, 0x15, 0xe6, 0xc8, 0x2b, + 0xab, 0x76, 0x54, 0xd5, 0xc0, 0x15, 0xeb, 0x94, 0xe2, 0xc0, 0x05, 0xc6, 0x8d, 0x03, 0x95, 0x8c, 0x93, 0xaf, 0x37, + 0x79, 0xb8, 0xb7, 0xe7, 0xc8, 0x46, 0xdf, 0x71, 0x27, 0xd5, 0xef, 0xab, 0xd0, 0xdd, 0xb7, 0x92, 0x57, 0x84, 0x48, + 0xc0, 0xdf, 0x68, 0xf8, 0xa3, 0x02, 0xe2, 0xd0, 0x4e, 0x50, 0xc7, 0xa0, 0x06, 0x5e, 0x68, 0x7a, 0xf5, 0xe9, 0x37, + 0x1a, 0x65, 0x98, 0xb6, 0x8e, 0xad, 0x13, 0x9c, 0x15, 0x57, 0x4e, 0x99, 0xff, 0xd3, 0x5e, 0xcb, 0x9a, 0xd2, 0x20, + 0x20, 0x66, 0xd2, 0x2c, 0xd3, 0x93, 0x31, 0xb6, 0x04, 0x83, 0x7a, 0x2f, 0x54, 0xe2, 0x02, 0x16, 0x39, 0x56, 0xaa, + 0x92, 0x66, 0x67, 0x5d, 0xe4, 0xe9, 0x4a, 0x10, 0x96, 0x82, 0x4a, 0x8d, 0x42, 0x91, 0xf7, 0xab, 0xf5, 0xcc, 0x4b, + 0x9c, 0x23, 0xe5, 0xe3, 0x12, 0x50, 0x08, 0x64, 0x75, 0x4b, 0xa4, 0x3c, 0x27, 0x93, 0xed, 0x24, 0x7f, 0x62, 0x90, + 0xfc, 0x13, 0x42, 0x0d, 0xf2, 0x97, 0x1e, 0x0e, 0x37, 0x55, 0xae, 0x85, 0x5c, 0xbf, 0x3a, 0x9d, 0x11, 0xf0, 0xa1, + 0xd5, 0x31, 0x5a, 0x8b, 0x2b, 0x6e, 0x61, 0x28, 0xe6, 0x0e, 0x11, 0x5e, 0x48, 0xac, 0x83, 0xc0, 0x4e, 0x15, 0x55, + 0x83, 0xa1, 0x37, 0xb9, 0xf4, 0x4c, 0x0e, 0x78, 0xf2, 0xe1, 0xee, 0x80, 0xe8, 0xe9, 0x6c, 0x7d, 0xe7, 0x1a, 0x19, + 0xa0, 0x30, 0x6b, 0x63, 0xe3, 0xd6, 0xf3, 0x41, 0x61, 0xfc, 0x32, 0x90, 0x5d, 0x67, 0x3e, 0x2b, 0x9b, 0x50, 0xcb, + 0x3f, 0x80, 0xb6, 0xd3, 0x11, 0x35, 0xa8, 0xd1, 0x2d, 0xf0, 0x23, 0x99, 0x87, 0xea, 0x67, 0x5b, 0xd8, 0xc7, 0x89, + 0xa8, 0x40, 0x93, 0x70, 0xf3, 0xeb, 0x27, 0x85, 0x22, 0x13, 0x09, 0x1a, 0x5a, 0x00, 0xff, 0x93, 0x24, 0x0f, 0x74, + 0x23, 0xe4, 0x02, 0x20, 0x68, 0x22, 0xf0, 0x54, 0x21, 0xcc, 0xb6, 0x2b, 0xe7, 0xfb, 0xf3, 0x1d, 0x42, 0x26, 0x95, + 0xf3, 0xf1, 0x5d, 0x95, 0x7d, 0x05, 0x64, 0x81, 0x3c, 0x30, 0x1e, 0xcb, 0x02, 0x19, 0xbf, 0x3c, 0xd5, 0xd5, 0x85, + 0x01, 0xe9, 0x56, 0xfa, 0xb6, 0x11, 0xdb, 0x14, 0x5e, 0x39, 0xf9, 0x5e, 0xa3, 0x61, 0xe5, 0xed, 0x2e, 0xbc, 0x7d, + 0xc9, 0x05, 0x8c, 0xf0, 0xfc, 0x5e, 0xd4, 0xd6, 0xfd, 0x16, 0x1f, 0x57, 0x53, 0x58, 0x56, 0x16, 0xc5, 0x65, 0x49, + 0x4e, 0x33, 0xfe, 0x84, 0x8e, 0xd3, 0x0c, 0x42, 0x16, 0x25, 0x4e, 0x50, 0xb1, 0x6b, 0xb8, 0xed, 0xc4, 0xfc, 0x8c, + 0x38, 0xc1, 0xca, 0x04, 0xc5, 0xaf, 0x8f, 0x22, 0x6a, 0x7d, 0xbe, 0xda, 0x6a, 0xb2, 0xb7, 0xf7, 0xae, 0x42, 0x93, + 0x82, 0x52, 0x40, 0x61, 0x30, 0x2d, 0xa9, 0xd2, 0xa8, 0x50, 0xee, 0xae, 0x53, 0xba, 0x00, 0x34, 0xc3, 0x30, 0x79, + 0xcf, 0x73, 0xc2, 0x8b, 0xc9, 0x2a, 0x8b, 0x57, 0xae, 0x09, 0x66, 0x9a, 0x2d, 0xc0, 0xe1, 0xc1, 0xd0, 0x96, 0xbe, + 0xa2, 0xbc, 0x4a, 0x89, 0x2d, 0x61, 0x38, 0x05, 0x64, 0x39, 0xc2, 0x08, 0x31, 0x28, 0x70, 0xa3, 0x51, 0xf2, 0x16, + 0xf4, 0xca, 0x08, 0xe7, 0x6e, 0x04, 0x49, 0xb0, 0xb5, 0x2d, 0x8b, 0x10, 0x96, 0x99, 0x39, 0x46, 0x2e, 0xc1, 0xc9, + 0xf3, 0x4d, 0x1e, 0x65, 0x4d, 0xd4, 0x54, 0x48, 0x1d, 0xa8, 0x91, 0xa1, 0xb2, 0x81, 0x7b, 0xe5, 0x30, 0xa5, 0xb8, + 0xe9, 0xb8, 0x19, 0x30, 0xe0, 0x9f, 0xb9, 0x23, 0x63, 0x51, 0x20, 0x33, 0x52, 0x77, 0xee, 0xd4, 0x86, 0xee, 0xa5, + 0xa2, 0x19, 0x56, 0x88, 0x8b, 0x4c, 0x34, 0xa5, 0x22, 0xae, 0x77, 0x5a, 0xf1, 0xd2, 0x2b, 0x99, 0x47, 0xcd, 0x35, + 0x17, 0xac, 0x32, 0x49, 0x8c, 0xe9, 0x5f, 0xc9, 0xd4, 0xe8, 0xb2, 0x12, 0xa8, 0x61, 0xf4, 0xda, 0x7a, 0x22, 0xd6, + 0x80, 0x16, 0x40, 0x5f, 0x8b, 0x53, 0x6e, 0xac, 0xa8, 0xf6, 0x61, 0x8b, 0x31, 0x0d, 0xa9, 0xff, 0x0e, 0x72, 0x5d, + 0x56, 0xf7, 0xfc, 0x73, 0x21, 0x0b, 0x19, 0xce, 0x6b, 0x8c, 0x3d, 0x13, 0x8c, 0x1d, 0x81, 0x9e, 0xa6, 0xd3, 0xbf, + 0x07, 0x2a, 0xe5, 0x45, 0xe5, 0x2e, 0x3a, 0x8a, 0xc4, 0x5e, 0x97, 0xe1, 0x72, 0xe3, 0xf7, 0xca, 0x6a, 0x78, 0x8c, + 0x40, 0x1a, 0x10, 0x56, 0x9c, 0x3d, 0x43, 0x38, 0x6f, 0x34, 0x7a, 0xf9, 0x31, 0xad, 0x5c, 0x24, 0x15, 0x8c, 0x0c, + 0x22, 0xba, 0x40, 0xf0, 0x35, 0x19, 0x0a, 0x31, 0x7f, 0x9d, 0x9f, 0x9d, 0x83, 0xab, 0xfd, 0xe4, 0x9d, 0x63, 0x72, + 0x35, 0xb3, 0x6e, 0x19, 0x34, 0x85, 0xf9, 0x38, 0x55, 0xbc, 0xe5, 0xed, 0xdd, 0x19, 0x1e, 0x00, 0xf7, 0x4e, 0x07, + 0x43, 0x36, 0x1a, 0xea, 0x71, 0xc9, 0x12, 0xca, 0xdd, 0xd7, 0x43, 0x55, 0x62, 0xa2, 0x39, 0x58, 0x8f, 0x57, 0xa6, + 0x2c, 0x27, 0x79, 0x51, 0xe4, 0xb4, 0x8a, 0xef, 0xaf, 0x64, 0x60, 0x0a, 0xe1, 0xb2, 0xee, 0x6c, 0x3f, 0x9d, 0x11, + 0x8e, 0x0d, 0x42, 0x7d, 0xbb, 0x2d, 0xf4, 0x51, 0x81, 0x09, 0xfb, 0x5a, 0x09, 0xc5, 0x6f, 0x37, 0x09, 0x45, 0x9c, + 0xa9, 0x2d, 0x2f, 0x04, 0x62, 0xe7, 0x1e, 0x02, 0x51, 0x39, 0xd9, 0xb5, 0x4c, 0x04, 0x75, 0xa4, 0x26, 0x13, 0xeb, + 0x4b, 0x4a, 0x32, 0xcc, 0xd4, 0x6a, 0xf4, 0xbb, 0xcb, 0x25, 0x1b, 0xb6, 0xc1, 0x89, 0x64, 0xdb, 0xf0, 0xb3, 0x23, + 0x7f, 0x1a, 0x9c, 0x58, 0x3a, 0x81, 0x1d, 0x56, 0x9a, 0x2c, 0xc8, 0x85, 0x34, 0x67, 0x47, 0x64, 0x65, 0x09, 0x9a, + 0x56, 0x14, 0xa4, 0x08, 0x9c, 0xb0, 0x32, 0xca, 0x04, 0x10, 0x0b, 0x59, 0xa1, 0x0c, 0x48, 0x67, 0x63, 0xfa, 0x9f, + 0x36, 0x2f, 0x3f, 0xad, 0x89, 0xd6, 0xe4, 0x8a, 0x54, 0x1f, 0x6a, 0x09, 0x07, 0x0a, 0x02, 0xa5, 0x1f, 0xee, 0x08, + 0x13, 0xb4, 0x12, 0xe5, 0xc8, 0x94, 0x43, 0xb8, 0x0d, 0x2e, 0xb4, 0x9d, 0x77, 0x32, 0xc0, 0xbb, 0x41, 0x9a, 0xe0, + 0xd4, 0xa0, 0xeb, 0xe7, 0x84, 0xd7, 0x58, 0x49, 0x44, 0x94, 0xa5, 0x84, 0x03, 0x41, 0xa6, 0x9c, 0x64, 0xc3, 0xf6, + 0x08, 0x14, 0xd0, 0x9e, 0x7f, 0x9c, 0x55, 0x26, 0xb0, 0xdf, 0x68, 0xa0, 0x40, 0x8f, 0x1a, 0x0d, 0x59, 0xc3, 0x1f, + 0x61, 0x8a, 0x7d, 0x69, 0x98, 0x9c, 0xee, 0xed, 0x39, 0x41, 0x35, 0xee, 0xd0, 0x1f, 0x21, 0x9c, 0x2e, 0x97, 0x8e, + 0x00, 0x2b, 0x40, 0xcb, 0x65, 0x60, 0x82, 0x25, 0x5e, 0x43, 0xb3, 0xc9, 0x80, 0x93, 0x89, 0x10, 0x80, 0x13, 0x80, + 0xb0, 0x41, 0x9c, 0x40, 0x39, 0xf7, 0x02, 0x70, 0x46, 0x35, 0xb2, 0xa1, 0xdf, 0xe8, 0x8c, 0x0c, 0xc6, 0x35, 0xf4, + 0x47, 0x24, 0x28, 0xd2, 0xbd, 0xbd, 0x9d, 0x5c, 0x89, 0xc8, 0x9f, 0x41, 0x94, 0xfd, 0x2c, 0x24, 0x8b, 0xec, 0xd0, + 0x5c, 0x8d, 0x55, 0x67, 0x40, 0x49, 0x51, 0x6a, 0x59, 0x75, 0xbd, 0x5a, 0x16, 0x44, 0x59, 0x09, 0xab, 0x58, 0xf0, + 0x00, 0x2c, 0xfb, 0x92, 0xcc, 0x7f, 0xe1, 0x65, 0x9a, 0xf5, 0xb7, 0x1b, 0x93, 0xab, 0x5d, 0xd7, 0xf5, 0xb3, 0x89, + 0x88, 0x64, 0xe8, 0x28, 0xac, 0x20, 0xfe, 0x7d, 0x05, 0xa6, 0x31, 0xf0, 0xb0, 0x1c, 0x6b, 0x44, 0x24, 0xf8, 0x5a, + 0xb5, 0xd1, 0x27, 0x4a, 0x7e, 0xdd, 0xe8, 0x65, 0x90, 0x90, 0x7c, 0xfd, 0x5b, 0x21, 0x39, 0x50, 0x90, 0x48, 0xf2, + 0x58, 0xc1, 0xd9, 0x16, 0x5c, 0xfc, 0xca, 0x57, 0x70, 0xb6, 0x1d, 0xb7, 0x25, 0x43, 0xd8, 0x06, 0x9f, 0xc1, 0x1b, + 0x24, 0xa0, 0x55, 0x81, 0x01, 0xe5, 0xe1, 0xaa, 0xee, 0x25, 0x59, 0x29, 0x08, 0x53, 0x4e, 0x1c, 0x56, 0xdf, 0x00, + 0x95, 0x36, 0x6a, 0x18, 0xbe, 0xcc, 0x9b, 0x20, 0xc3, 0x25, 0x50, 0x4f, 0x5d, 0x01, 0x72, 0x52, 0xbe, 0x76, 0x48, + 0x45, 0xd8, 0x91, 0x4a, 0x9c, 0x1b, 0xf8, 0x33, 0x3e, 0xcf, 0x40, 0x95, 0xca, 0xf5, 0x6f, 0x28, 0x86, 0xb3, 0x20, + 0xa2, 0x0c, 0x7e, 0x40, 0xc1, 0xcc, 0xcf, 0x73, 0x76, 0x25, 0xcb, 0xd4, 0x6f, 0x9c, 0x12, 0x4d, 0xca, 0xb9, 0xd4, + 0x09, 0x33, 0xd4, 0xcb, 0x14, 0x9d, 0xd6, 0xd1, 0xf6, 0xec, 0x8a, 0x26, 0xfc, 0x25, 0xcb, 0x39, 0x4d, 0x60, 0xfa, + 0x15, 0xc5, 0xc1, 0x8c, 0x72, 0x04, 0x1b, 0xb6, 0xd6, 0xca, 0x0f, 0xc3, 0x3b, 0x9b, 0xf0, 0xba, 0x0e, 0x14, 0xf9, + 0x49, 0x18, 0xcb, 0x41, 0xcc, 0x84, 0x46, 0x9d, 0xc4, 0x59, 0xd6, 0x34, 0xf3, 0x69, 0x2a, 0x65, 0x43, 0x70, 0x77, + 0x87, 0x11, 0x2d, 0x09, 0xb4, 0xf4, 0xbc, 0x53, 0x6b, 0x81, 0x80, 0xf7, 0x96, 0x45, 0x30, 0x67, 0x82, 0xb9, 0xc1, + 0x51, 0xdd, 0x3a, 0x9c, 0x9a, 0x6e, 0xbe, 0xdb, 0x78, 0xb0, 0x6d, 0x93, 0x70, 0x10, 0x74, 0xf2, 0x70, 0xbb, 0x65, + 0xf5, 0x4a, 0x4b, 0x0e, 0x2d, 0x2d, 0xd8, 0x7d, 0x19, 0x33, 0x5a, 0x68, 0xf2, 0x42, 0x7a, 0x2b, 0xee, 0x72, 0xf2, + 0x0b, 0x9c, 0x1c, 0x7a, 0xce, 0xa7, 0xf1, 0xca, 0x01, 0x99, 0xde, 0x6e, 0xa9, 0xfd, 0xef, 0x72, 0xe7, 0x09, 0x7e, + 0x05, 0x61, 0xdd, 0x6f, 0xaa, 0xea, 0xeb, 0xe1, 0xdc, 0x6f, 0x2a, 0x04, 0x7d, 0xe3, 0xad, 0xd5, 0x33, 0xc2, 0xb8, + 0x5d, 0xf7, 0xc8, 0x6d, 0xdb, 0x5a, 0x5b, 0xfa, 0x51, 0x06, 0x91, 0x64, 0xaa, 0xa5, 0xd8, 0x0f, 0xb8, 0x4a, 0x54, + 0x83, 0x84, 0xb9, 0xba, 0x85, 0x44, 0x55, 0x8a, 0xa1, 0xd4, 0xe1, 0xb7, 0x2d, 0x8f, 0x92, 0x31, 0x99, 0xb4, 0x33, + 0xde, 0xfa, 0x19, 0xdf, 0x85, 0x5d, 0x96, 0xae, 0x9d, 0xc6, 0x8b, 0x08, 0x78, 0xd0, 0xee, 0x37, 0x84, 0x61, 0x6c, + 0xe7, 0xf2, 0x30, 0x90, 0xd9, 0x3f, 0x49, 0xb5, 0xee, 0x56, 0xb7, 0x32, 0x5e, 0x83, 0xfd, 0x8f, 0x70, 0xa4, 0x8f, + 0xc8, 0x51, 0xc5, 0x81, 0xa9, 0xb7, 0x28, 0x4a, 0xa7, 0x40, 0x2a, 0x95, 0xb7, 0x04, 0xe1, 0xb4, 0x10, 0xe1, 0xed, + 0xef, 0xf1, 0x0f, 0x8a, 0x25, 0x9e, 0x97, 0x1c, 0xe7, 0xd9, 0x7d, 0x39, 0xa2, 0x04, 0xbf, 0x8c, 0xde, 0x03, 0x1d, + 0x0b, 0x0a, 0x2d, 0x34, 0x15, 0x3d, 0x4d, 0xd5, 0x44, 0xb6, 0xe6, 0xa5, 0x62, 0x5a, 0x66, 0xd4, 0x88, 0x61, 0x36, + 0x24, 0x72, 0x6a, 0x2b, 0x9b, 0x97, 0xbb, 0xaa, 0x36, 0x2e, 0xda, 0x82, 0xc5, 0x2a, 0xb0, 0xb8, 0x5c, 0x3a, 0x75, + 0x54, 0x13, 0x66, 0xc4, 0x31, 0x10, 0x66, 0x46, 0x42, 0x45, 0x4d, 0xb3, 0x96, 0x6d, 0x1c, 0xb4, 0x9a, 0x4f, 0xa4, + 0x75, 0xf3, 0x1a, 0x1c, 0xa6, 0x0b, 0x41, 0x36, 0x37, 0x7d, 0x0a, 0x58, 0xce, 0xae, 0x1c, 0xc8, 0xc0, 0xd0, 0x8f, + 0x65, 0xae, 0x6c, 0x95, 0xd4, 0xba, 0x01, 0xbf, 0xe8, 0x8e, 0x6c, 0x59, 0x85, 0xba, 0xf5, 0xf7, 0x46, 0xae, 0xd1, + 0xd3, 0x74, 0x5b, 0xae, 0x51, 0x4d, 0xdb, 0xdd, 0x69, 0xa3, 0xbb, 0xf3, 0x52, 0xe5, 0x58, 0x9b, 0xab, 0xfc, 0x86, + 0xe1, 0x3a, 0x40, 0x9b, 0x12, 0xcd, 0x9a, 0xab, 0x9c, 0x16, 0xc5, 0x79, 0x79, 0x9a, 0x40, 0xa4, 0xee, 0x9c, 0x4b, + 0xfa, 0x57, 0x56, 0xa3, 0x38, 0x94, 0xeb, 0x7c, 0x4f, 0x26, 0x71, 0x7a, 0xe9, 0xc7, 0xef, 0x61, 0xbc, 0xea, 0xe5, + 0xf3, 0xdb, 0x30, 0xf3, 0x39, 0x55, 0xdc, 0xa5, 0x82, 0xe1, 0x7b, 0x03, 0x86, 0xef, 0x25, 0x9f, 0xae, 0xda, 0xe3, + 0xc5, 0xcb, 0xb2, 0x03, 0xef, 0xbc, 0xd0, 0x2c, 0xe3, 0x96, 0x6f, 0x1e, 0x63, 0x95, 0x85, 0xdd, 0x96, 0x2c, 0xec, + 0x96, 0x3b, 0xab, 0x5d, 0x39, 0xce, 0x0f, 0x9b, 0x7b, 0x59, 0xe7, 0x6c, 0x3f, 0x54, 0x1b, 0xff, 0x07, 0xef, 0xce, + 0x36, 0x06, 0x97, 0xdb, 0x77, 0xf7, 0x45, 0xb2, 0x8a, 0x04, 0xf9, 0x25, 0x24, 0x1d, 0x70, 0xd2, 0x37, 0x0e, 0x1d, + 0x54, 0x72, 0x4a, 0xe7, 0x01, 0x39, 0xc1, 0x3c, 0xe7, 0xe9, 0x54, 0xf5, 0x99, 0xab, 0x93, 0x46, 0xe2, 0x25, 0xb8, + 0xa2, 0x45, 0xac, 0xdd, 0xab, 0x9f, 0xe5, 0x5a, 0x7c, 0x64, 0x49, 0xe8, 0xe5, 0x58, 0x49, 0x91, 0xdc, 0xcb, 0x0a, + 0xa2, 0xb3, 0x8d, 0xd7, 0xdf, 0xe1, 0x31, 0x4b, 0x58, 0x1e, 0xd1, 0xcc, 0x49, 0xd1, 0x62, 0xdb, 0x60, 0x29, 0x04, + 0x64, 0xe4, 0x60, 0xf8, 0xaf, 0xd5, 0xa9, 0x3f, 0x17, 0x7a, 0x03, 0x3f, 0xd0, 0x94, 0xf2, 0x28, 0x0d, 0x21, 0x2d, + 0xc5, 0x0d, 0xcb, 0x43, 0x4d, 0x7b, 0x7b, 0x3b, 0x8e, 0x2d, 0xdc, 0x12, 0x70, 0x00, 0xdc, 0x7c, 0x83, 0x06, 0x0b, + 0x38, 0x9f, 0x53, 0x0d, 0x4d, 0xd1, 0x82, 0xae, 0x1e, 0x65, 0xe1, 0xee, 0x47, 0x7a, 0x8b, 0x13, 0x54, 0x14, 0x9e, + 0x84, 0xda, 0x1e, 0x33, 0x1a, 0x87, 0x36, 0xfe, 0x48, 0x6f, 0xbd, 0xf2, 0xcc, 0xb8, 0x38, 0xe2, 0x2c, 0x16, 0xd0, + 0x4e, 0xaf, 0x13, 0x1b, 0x57, 0x83, 0x78, 0x8b, 0x02, 0xa7, 0x19, 0x9b, 0x00, 0x71, 0x7e, 0x43, 0x6f, 0x3d, 0xd9, + 0x1f, 0x33, 0xce, 0xeb, 0xa1, 0x85, 0x46, 0xbd, 0x6b, 0x14, 0x9b, 0xcb, 0xa0, 0x0c, 0x8a, 0xa1, 0x68, 0x3b, 0x22, + 0xb5, 0x7a, 0x95, 0x79, 0x88, 0x50, 0x71, 0xdf, 0xa9, 0xe0, 0x6f, 0x4c, 0xd1, 0xc6, 0x6b, 0x99, 0xaf, 0x2b, 0x8d, + 0x28, 0x34, 0xa8, 0x32, 0x3d, 0x76, 0x9d, 0x44, 0xef, 0x3a, 0x75, 0x08, 0xc1, 0x70, 0x84, 0x7d, 0xc3, 0x55, 0xa7, + 0xde, 0x5f, 0x65, 0x42, 0x48, 0x15, 0x49, 0x7a, 0x51, 0xb5, 0xb3, 0x76, 0x1d, 0xc0, 0x3b, 0x24, 0xb4, 0xf8, 0xe2, + 0x4c, 0x66, 0xa1, 0xb3, 0x45, 0xff, 0xc6, 0x89, 0xb3, 0xd0, 0x53, 0xf0, 0x12, 0x13, 0x8b, 0xbc, 0x00, 0x2a, 0x54, + 0xf4, 0x25, 0x13, 0x00, 0xd9, 0xd8, 0x61, 0x6b, 0x52, 0x33, 0x13, 0x52, 0xd3, 0x35, 0x30, 0xbe, 0x45, 0x4a, 0x52, + 0x81, 0x0c, 0xa1, 0x44, 0x0a, 0xa1, 0xa7, 0x16, 0x57, 0x91, 0x90, 0xb9, 0xa0, 0xe5, 0x09, 0x3a, 0xb9, 0xe6, 0x59, + 0x0d, 0x2c, 0x47, 0xf4, 0x83, 0x0a, 0x0f, 0xa6, 0x44, 0x65, 0x85, 0xa2, 0x3c, 0x9a, 0xad, 0xd3, 0x5b, 0x9d, 0xd4, + 0xd5, 0xd3, 0x22, 0x1a, 0x25, 0x4e, 0x84, 0x16, 0x89, 0x13, 0xe1, 0x0c, 0xd2, 0x11, 0xd3, 0xa2, 0x84, 0x9f, 0x9a, + 0xab, 0x51, 0x4b, 0x56, 0xde, 0x7c, 0xca, 0x0f, 0x94, 0x79, 0x0e, 0x29, 0x9a, 0x38, 0xd1, 0x3c, 0x25, 0x71, 0xc4, + 0x71, 0x3b, 0x63, 0xd9, 0xbe, 0x57, 0x09, 0x3a, 0x0a, 0xb0, 0xbf, 0x71, 0x67, 0x61, 0xcc, 0xc2, 0x3c, 0xd1, 0xad, + 0x4e, 0xfd, 0xa9, 0x60, 0x5f, 0x95, 0x43, 0xea, 0xe4, 0x64, 0x45, 0xe2, 0xdc, 0x9d, 0x6a, 0xf9, 0xcb, 0x9c, 0x66, + 0xb7, 0x67, 0x14, 0x52, 0x9d, 0x53, 0x38, 0xf0, 0x5b, 0x2d, 0x43, 0x95, 0xa7, 0x3e, 0xc8, 0x84, 0xb2, 0x52, 0xd4, + 0xcf, 0x01, 0xae, 0x9e, 0x12, 0x2c, 0x44, 0xb4, 0xd1, 0x70, 0xc4, 0xc8, 0xdd, 0x42, 0xb7, 0x9e, 0x9f, 0xa4, 0x3d, + 0x06, 0xfe, 0xb5, 0x0a, 0xd3, 0x2a, 0x58, 0x80, 0x53, 0xf3, 0x4c, 0xea, 0x30, 0x1f, 0xad, 0x7a, 0x65, 0xa0, 0x08, + 0xc2, 0x77, 0xd9, 0xf6, 0xa9, 0x6e, 0x4a, 0x9a, 0xdd, 0x3e, 0xd5, 0x5a, 0xd0, 0x4f, 0x24, 0xfc, 0x60, 0x35, 0x4e, + 0x79, 0x82, 0x99, 0x15, 0x05, 0x2a, 0x00, 0xbc, 0xbf, 0xf4, 0x1c, 0xe7, 0x2f, 0x2a, 0x65, 0xd0, 0x85, 0x58, 0xec, + 0x59, 0x9c, 0x6a, 0x26, 0x5e, 0x8d, 0xff, 0x97, 0xb5, 0xf1, 0xff, 0x62, 0x9c, 0x3a, 0x05, 0xd3, 0x68, 0x92, 0xd0, + 0x50, 0xb3, 0x4e, 0x24, 0x09, 0x50, 0xe8, 0x6d, 0x19, 0x27, 0x1f, 0x2f, 0x3c, 0xd0, 0xb8, 0x16, 0xe3, 0x34, 0xe1, + 0xcd, 0xb1, 0x3f, 0x65, 0xf1, 0xad, 0x37, 0x67, 0xcd, 0x69, 0x9a, 0xa4, 0xf9, 0xcc, 0x0f, 0x28, 0xce, 0x6f, 0x73, + 0x4e, 0xa7, 0xcd, 0x39, 0xc3, 0xcf, 0x69, 0x7c, 0x45, 0x39, 0x0b, 0x7c, 0x6c, 0x9f, 0x64, 0xcc, 0x8f, 0xad, 0xd7, + 0x7e, 0x96, 0xa5, 0xd7, 0x36, 0x7e, 0x97, 0x5e, 0xa6, 0x3c, 0xc5, 0x6f, 0x6e, 0x6e, 0x27, 0x34, 0xc1, 0x1f, 0x2e, + 0xe7, 0x09, 0x9f, 0xe3, 0xdc, 0x4f, 0xf2, 0x66, 0x4e, 0x33, 0x36, 0xee, 0x05, 0x69, 0x9c, 0x66, 0x4d, 0xc8, 0xd8, + 0x9e, 0x52, 0x2f, 0x66, 0x93, 0x88, 0x5b, 0xa1, 0x9f, 0x7d, 0xec, 0x35, 0x9b, 0xb3, 0x8c, 0x4d, 0xfd, 0xec, 0xb6, + 0x29, 0x6a, 0x78, 0x5f, 0xb6, 0xf7, 0xfd, 0xc7, 0xe3, 0x83, 0x1e, 0xcf, 0xfc, 0x24, 0x67, 0xb0, 0x4c, 0x9e, 0x1f, + 0xc7, 0xd6, 0xfe, 0x61, 0x7b, 0x9a, 0xef, 0xc8, 0x40, 0x9e, 0x9f, 0xf0, 0xe2, 0x02, 0xbf, 0x07, 0xb8, 0xdd, 0x4b, + 0x9e, 0xe0, 0xcb, 0x39, 0xe7, 0x69, 0xb2, 0x08, 0xe6, 0x59, 0x9e, 0x66, 0xde, 0x2c, 0x65, 0x09, 0xa7, 0x59, 0xef, + 0x32, 0xcd, 0x42, 0x9a, 0x35, 0x33, 0x3f, 0x64, 0xf3, 0xdc, 0x3b, 0x98, 0xdd, 0xf4, 0x40, 0xb3, 0x98, 0x64, 0xe9, + 0x3c, 0x09, 0xd5, 0x58, 0x2c, 0x89, 0x68, 0xc6, 0xb8, 0xf9, 0x42, 0x5c, 0x64, 0xe2, 0xc5, 0x2c, 0xa1, 0x7e, 0xd6, + 0x9c, 0x40, 0x63, 0x30, 0x8b, 0xda, 0x21, 0x9d, 0xe0, 0x6c, 0x72, 0xe9, 0x3b, 0x9d, 0xee, 0x23, 0xac, 0xff, 0x77, + 0x0f, 0x91, 0xd5, 0xde, 0x5c, 0xdc, 0x69, 0xb7, 0xff, 0x84, 0x7a, 0x2b, 0xa3, 0x08, 0x80, 0xbc, 0xce, 0xec, 0xc6, + 0xca, 0x53, 0xc8, 0x68, 0xdb, 0xd4, 0xb2, 0x37, 0xf3, 0x43, 0xc8, 0x07, 0xf6, 0xba, 0xb3, 0x9b, 0x02, 0x66, 0xe7, + 0xc9, 0x14, 0x53, 0x35, 0x49, 0xf5, 0xb4, 0xf8, 0xad, 0x10, 0x1f, 0x6d, 0x86, 0xb8, 0xab, 0x21, 0xae, 0xb0, 0xde, + 0x0c, 0xe7, 0x99, 0x88, 0xad, 0x7a, 0x9d, 0x5c, 0x02, 0x12, 0xa5, 0x57, 0x34, 0xd3, 0x70, 0x88, 0x87, 0xdf, 0x0c, + 0x46, 0x77, 0x33, 0x18, 0x47, 0x9f, 0x02, 0x23, 0x4b, 0xc2, 0x45, 0x7d, 0x5d, 0x3b, 0x19, 0x9d, 0xf6, 0x22, 0x0a, + 0xf4, 0xe4, 0x75, 0xe1, 0xf7, 0x35, 0x0b, 0x79, 0x24, 0x7f, 0x0a, 0x72, 0xbe, 0x96, 0xef, 0x0e, 0xdb, 0x6d, 0xf9, + 0x9c, 0xb3, 0x5f, 0xa9, 0xd7, 0x71, 0xa1, 0x42, 0x71, 0x81, 0x7f, 0x28, 0x4f, 0xf3, 0xd6, 0xb9, 0x27, 0xfe, 0x8b, + 0x79, 0xcc, 0xd7, 0x48, 0x51, 0xac, 0x0e, 0x45, 0xe3, 0x54, 0xcb, 0x4a, 0x29, 0x7c, 0xc0, 0x6d, 0x27, 0xb8, 0x23, + 0x61, 0xfd, 0xf2, 0x18, 0x27, 0x1b, 0xfc, 0x45, 0xe6, 0x5d, 0x78, 0x10, 0xe9, 0x30, 0x52, 0x0d, 0xd3, 0x5e, 0xd6, + 0x27, 0xed, 0x5e, 0xd6, 0x6c, 0x22, 0x27, 0x25, 0xc9, 0x30, 0x53, 0xc9, 0x79, 0x0e, 0x1b, 0xa4, 0xc2, 0xd8, 0xce, + 0x91, 0x97, 0xc2, 0x59, 0xd3, 0xe5, 0xb2, 0x0a, 0x03, 0x30, 0x71, 0x5a, 0xe3, 0x07, 0xae, 0x2a, 0xe0, 0xdc, 0xe0, + 0xe4, 0xbe, 0xbe, 0xde, 0x25, 0xd1, 0xbc, 0x22, 0x4e, 0x03, 0x81, 0x39, 0x77, 0xe6, 0xf3, 0x08, 0xbc, 0x14, 0xa5, + 0xf8, 0xa9, 0x52, 0x98, 0xec, 0x96, 0x8d, 0x06, 0x49, 0x99, 0xdf, 0x06, 0x79, 0x7c, 0x49, 0x01, 0xbd, 0x5c, 0x72, + 0x02, 0x3d, 0x56, 0xfd, 0x7f, 0xe0, 0x86, 0xa4, 0x4e, 0x5c, 0x96, 0x04, 0xf1, 0x3c, 0xa4, 0xb9, 0xe8, 0xa1, 0x12, + 0xe7, 0x70, 0x37, 0x44, 0x59, 0x4b, 0x34, 0x81, 0xde, 0x45, 0x36, 0x0f, 0x54, 0x84, 0x5b, 0x54, 0xca, 0xe7, 0xa6, + 0x78, 0xae, 0xda, 0xbe, 0xae, 0x92, 0x45, 0xa1, 0xa5, 0x3b, 0x4f, 0xd8, 0x2f, 0x73, 0x7a, 0xce, 0x42, 0xe3, 0xe4, + 0x2e, 0x4d, 0x82, 0x34, 0xa4, 0x1f, 0xde, 0xbd, 0x80, 0x6c, 0xf7, 0x34, 0x01, 0x12, 0x4b, 0xa4, 0xbf, 0x0b, 0xe7, + 0x24, 0x71, 0x43, 0x7a, 0xc5, 0x02, 0x3a, 0xb8, 0xd8, 0x5d, 0x6c, 0xac, 0x28, 0x5f, 0xa3, 0xa2, 0x75, 0x21, 0x92, + 0xfe, 0x04, 0x94, 0x17, 0xbb, 0x8b, 0x4b, 0x5e, 0xb4, 0x76, 0x17, 0x89, 0x1b, 0xa6, 0x53, 0x9f, 0x25, 0xf0, 0x3b, + 0x2f, 0x76, 0x17, 0x0c, 0x7e, 0xf0, 0xe2, 0xa2, 0xa8, 0x12, 0x45, 0x4b, 0x88, 0x8c, 0x29, 0x28, 0xdc, 0x75, 0x90, + 0xfb, 0x73, 0xca, 0x12, 0x51, 0x74, 0x57, 0xcf, 0x54, 0xf7, 0x0a, 0x48, 0xfe, 0x95, 0x48, 0x83, 0x59, 0x9b, 0xcb, + 0xe7, 0xf7, 0x35, 0x97, 0x69, 0xc2, 0x99, 0x48, 0x8b, 0xd7, 0xe1, 0x9c, 0xc8, 0xcf, 0xcf, 0x03, 0x79, 0x12, 0x35, + 0xaf, 0x4e, 0x5d, 0xf8, 0x02, 0xb1, 0xd2, 0x02, 0xa6, 0x99, 0x30, 0xf6, 0xe9, 0xf6, 0xa3, 0x92, 0xc9, 0x5d, 0xc6, + 0x5f, 0x49, 0x55, 0x79, 0x3a, 0xcf, 0x02, 0x88, 0xf5, 0x2a, 0x95, 0x62, 0xdd, 0x2b, 0x66, 0x0b, 0xfd, 0xcd, 0xc6, + 0xdc, 0x48, 0xb2, 0xe5, 0x70, 0xa6, 0xaf, 0xba, 0xb6, 0x83, 0x8a, 0x78, 0x22, 0xac, 0x19, 0x13, 0xab, 0x77, 0xce, + 0x42, 0x08, 0xbc, 0xb0, 0x50, 0x25, 0x2c, 0xd6, 0x26, 0x09, 0x2a, 0x52, 0x28, 0x32, 0x48, 0xe1, 0xb2, 0x9d, 0xb4, + 0x5a, 0x05, 0x42, 0x88, 0x8c, 0xeb, 0x81, 0xf0, 0x6d, 0x76, 0xf6, 0xf6, 0xf2, 0xea, 0x44, 0x1b, 0x53, 0x38, 0x5f, + 0x2e, 0x39, 0x75, 0x72, 0x79, 0xea, 0x26, 0x22, 0xa0, 0x8c, 0x31, 0x2c, 0xdf, 0x78, 0x29, 0x2e, 0x7b, 0xf2, 0xf2, + 0xa2, 0x17, 0x09, 0x24, 0x4a, 0x94, 0x11, 0x8d, 0xd4, 0x13, 0xad, 0x92, 0x61, 0xf3, 0x75, 0x79, 0x90, 0xbf, 0x86, + 0xf5, 0xf6, 0xca, 0xe2, 0x48, 0xab, 0x2a, 0x5a, 0x2d, 0xcd, 0xd3, 0x8c, 0x3b, 0x8e, 0x8f, 0x03, 0x44, 0xfa, 0xbe, + 0x98, 0xfd, 0xb1, 0xcc, 0xf7, 0x18, 0x34, 0x3b, 0x5e, 0xa7, 0xf4, 0x87, 0xd4, 0xce, 0x57, 0xcb, 0x6c, 0x33, 0x75, + 0x46, 0x17, 0xf0, 0x84, 0xcb, 0xdf, 0x0a, 0x7d, 0x55, 0x81, 0x9c, 0x5d, 0xf5, 0x5c, 0x4e, 0x12, 0x2b, 0x86, 0x26, + 0x95, 0x01, 0xa7, 0x06, 0xd5, 0x30, 0x1b, 0x61, 0xb6, 0x65, 0x6c, 0x54, 0x54, 0x88, 0x28, 0x37, 0xf7, 0x85, 0x54, + 0x82, 0xce, 0x0d, 0xea, 0xbe, 0x60, 0xda, 0x8d, 0x57, 0xa7, 0xbb, 0x42, 0xa1, 0xc8, 0xe0, 0x0c, 0x9b, 0xaa, 0x49, + 0x58, 0x6e, 0x49, 0xb2, 0x91, 0x78, 0x5d, 0xf9, 0x48, 0x25, 0x6d, 0x6c, 0xae, 0x22, 0x92, 0x21, 0x37, 0x01, 0x06, + 0x8e, 0x81, 0x9c, 0xeb, 0x29, 0x00, 0x8f, 0x19, 0x53, 0x38, 0xa9, 0xa4, 0x38, 0x0e, 0x5e, 0x48, 0xed, 0xde, 0xb3, + 0xdf, 0xbe, 0x39, 0x7b, 0x6f, 0x63, 0xb8, 0xea, 0x8c, 0x66, 0xb9, 0xb7, 0xb0, 0x55, 0x8e, 0x61, 0x13, 0xe2, 0xd5, + 0xb6, 0x67, 0xfb, 0x33, 0x38, 0xb4, 0x2d, 0x98, 0x6a, 0xeb, 0xa6, 0x79, 0x7d, 0x7d, 0xdd, 0x84, 0x13, 0x65, 0xcd, + 0x79, 0x16, 0x4b, 0x76, 0x13, 0xda, 0x45, 0x81, 0x5c, 0x1e, 0xd1, 0xa4, 0xbc, 0x0c, 0x29, 0x8d, 0xa9, 0x1b, 0xa7, + 0x13, 0x79, 0x1e, 0x76, 0xd5, 0x3d, 0x11, 0x5f, 0x1c, 0x8b, 0x4b, 0xbe, 0xfa, 0xc7, 0x5c, 0x5e, 0xaf, 0xc6, 0x33, + 0xf8, 0xd9, 0x87, 0xe0, 0xd5, 0x71, 0x8b, 0x47, 0xe2, 0xe1, 0x0c, 0x76, 0x93, 0x78, 0xda, 0x5d, 0xac, 0x51, 0xdd, + 0x00, 0xba, 0x88, 0xfa, 0x72, 0x6a, 0xb9, 0xa8, 0x75, 0xe1, 0xc5, 0x17, 0x17, 0xc5, 0x71, 0x0b, 0xfa, 0x6a, 0xe9, + 0x7e, 0x2f, 0xd3, 0xf0, 0x56, 0xb7, 0x2f, 0x29, 0x11, 0x2e, 0x7b, 0x4a, 0x48, 0x1f, 0xba, 0x80, 0x71, 0xc3, 0xbe, + 0xc0, 0x99, 0x62, 0xa1, 0xc3, 0xea, 0xa1, 0x18, 0x59, 0xc0, 0x30, 0x0b, 0x28, 0x01, 0x72, 0x83, 0xce, 0xc3, 0xb2, + 0x81, 0xd8, 0xed, 0xb2, 0x68, 0x1b, 0x80, 0xb2, 0x62, 0xb5, 0x7f, 0xa4, 0x9b, 0xbb, 0x22, 0x0b, 0x0d, 0x71, 0x68, + 0x02, 0x7f, 0x81, 0xe0, 0x5f, 0x01, 0xf8, 0x71, 0x4b, 0xa2, 0xe9, 0xc2, 0xbc, 0x76, 0x46, 0x5e, 0x08, 0x51, 0x22, + 0x73, 0x98, 0x71, 0xfc, 0x9e, 0xe3, 0x8f, 0x17, 0xa2, 0xaa, 0xd6, 0x12, 0x40, 0x7d, 0x05, 0x6d, 0xaa, 0xad, 0xd5, + 0xc1, 0x20, 0x8d, 0x63, 0x7f, 0x96, 0x53, 0x4f, 0xff, 0x50, 0x0a, 0x03, 0xe8, 0x1d, 0xeb, 0x1a, 0x9a, 0xca, 0x7b, + 0x3a, 0x05, 0x3d, 0x6e, 0x5d, 0x7d, 0xbc, 0xf2, 0x33, 0xa7, 0xd9, 0x0c, 0x9a, 0x97, 0x13, 0x54, 0xf0, 0x68, 0x61, + 0xaa, 0x1b, 0x0f, 0xdb, 0xed, 0x1e, 0x24, 0xa9, 0x36, 0xfd, 0x98, 0x4d, 0x12, 0x2f, 0xa6, 0x63, 0x5e, 0x70, 0x38, + 0x3d, 0xb8, 0xd0, 0xfa, 0x9d, 0xdb, 0x3d, 0xcc, 0xe8, 0xd4, 0x72, 0xe1, 0xef, 0xdd, 0x03, 0x17, 0x3c, 0xf4, 0x12, + 0x1e, 0x35, 0x45, 0x32, 0x34, 0x1c, 0xe5, 0xe0, 0x51, 0xed, 0x79, 0x61, 0x0c, 0x14, 0x50, 0xd0, 0x7d, 0x0b, 0x9e, + 0x59, 0x3c, 0xc2, 0x3c, 0x33, 0xeb, 0x25, 0x68, 0xb1, 0x36, 0x83, 0x75, 0x15, 0x6c, 0x1f, 0x15, 0xb9, 0xb0, 0x58, + 0x16, 0x6b, 0x78, 0x31, 0x54, 0xe9, 0x82, 0x25, 0xb3, 0x39, 0x1f, 0x0a, 0xcf, 0x7f, 0x06, 0x67, 0x48, 0x46, 0xd8, + 0x28, 0x01, 0x78, 0x46, 0xaa, 0x7d, 0xe0, 0xc7, 0x81, 0x03, 0x9d, 0x58, 0x4d, 0xeb, 0x28, 0xa3, 0x53, 0xd4, 0x9b, + 0xb2, 0xa4, 0x29, 0xdf, 0x1d, 0x1a, 0xba, 0x9b, 0xfb, 0x08, 0x9e, 0x0a, 0x57, 0xf4, 0x86, 0x45, 0x82, 0xef, 0x86, + 0x79, 0x5d, 0x8c, 0x8a, 0xa2, 0x97, 0x72, 0x67, 0xf8, 0xc2, 0x41, 0x23, 0xfc, 0xab, 0x71, 0x89, 0x8d, 0xad, 0xa9, + 0xda, 0xc6, 0x5d, 0xb4, 0xa5, 0x8a, 0x49, 0x97, 0xa2, 0xda, 0xaf, 0x04, 0x2a, 0xbe, 0x74, 0x6c, 0x9a, 0xcf, 0x9a, + 0x92, 0xfd, 0x34, 0x05, 0xf9, 0xd8, 0xd0, 0x14, 0x29, 0x77, 0x36, 0xa5, 0x0b, 0xc1, 0x59, 0xd4, 0x39, 0x16, 0xe9, + 0x71, 0x19, 0x95, 0xe7, 0x9e, 0xd4, 0xb3, 0x79, 0xd2, 0x09, 0xd5, 0xb6, 0xfe, 0xc5, 0x49, 0x9d, 0x4d, 0x81, 0xfc, + 0x2f, 0xef, 0xfa, 0xf3, 0xe3, 0x18, 0x06, 0xbc, 0xd0, 0x4a, 0x83, 0x79, 0x35, 0xca, 0x90, 0x8f, 0x1c, 0x54, 0xa8, + 0x3d, 0xf3, 0x44, 0xe8, 0xdd, 0xc6, 0x05, 0x83, 0x3b, 0x5c, 0x47, 0xd4, 0xe4, 0x09, 0x66, 0x06, 0x39, 0x01, 0xb5, + 0xdc, 0xf1, 0x5e, 0xc5, 0x66, 0xa4, 0xd6, 0x6e, 0x89, 0x09, 0x11, 0x3b, 0x4b, 0x42, 0xdb, 0xfa, 0x73, 0x10, 0xb3, + 0xe0, 0x23, 0xb1, 0x77, 0x17, 0x0e, 0x5a, 0x3f, 0x1a, 0x2a, 0x76, 0xa8, 0xe6, 0xb9, 0xa8, 0x1e, 0x6d, 0xc8, 0x5c, + 0x83, 0x9d, 0xca, 0xdb, 0x83, 0xec, 0x3e, 0xa8, 0x36, 0xc7, 0x2d, 0x39, 0x4e, 0xff, 0xa2, 0x38, 0xaf, 0x6e, 0x05, + 0xab, 0xa0, 0x00, 0x34, 0xcb, 0x72, 0x4b, 0xd0, 0x1f, 0xb1, 0xe5, 0x16, 0xaa, 0x59, 0x80, 0xd8, 0xa4, 0x7d, 0x64, + 0x5b, 0x92, 0xc1, 0x00, 0x9c, 0x5c, 0xf1, 0x1a, 0xdb, 0xfa, 0x73, 0x59, 0x46, 0x4b, 0xb7, 0x8f, 0xc8, 0x5b, 0x21, + 0x36, 0x8c, 0x05, 0xb6, 0xbe, 0x1b, 0x52, 0xee, 0xb3, 0x58, 0x36, 0xe9, 0x69, 0x2f, 0xc5, 0xca, 0x8c, 0x96, 0xcb, + 0xbc, 0x3e, 0x17, 0x56, 0xc7, 0xa0, 0x98, 0xd9, 0x71, 0xab, 0x82, 0x5b, 0xcc, 0x4c, 0xec, 0x0f, 0x33, 0x7e, 0x5a, + 0xcd, 0x50, 0xbe, 0xb3, 0xfe, 0x1c, 0x88, 0x93, 0x55, 0x00, 0x60, 0xaa, 0x00, 0x84, 0xc8, 0xbe, 0x54, 0x42, 0x1c, + 0x9f, 0xa4, 0x2e, 0xf7, 0xb3, 0x09, 0xe5, 0x2b, 0x88, 0xf5, 0x65, 0x22, 0x6f, 0x4f, 0x47, 0xf1, 0xd7, 0xa0, 0x0d, + 0xea, 0xd0, 0x82, 0x9e, 0x5b, 0x0c, 0x40, 0x55, 0x25, 0x1b, 0x35, 0xde, 0x08, 0x81, 0xec, 0x13, 0x8b, 0x23, 0xb9, + 0x7d, 0x2a, 0xb8, 0xbd, 0x8c, 0xc3, 0x59, 0x62, 0x2c, 0x01, 0x62, 0x61, 0x5b, 0x03, 0x09, 0x39, 0x0d, 0x25, 0xcc, + 0x24, 0x13, 0xad, 0xd2, 0xe2, 0xb8, 0x25, 0x6b, 0x4b, 0x76, 0x2c, 0x2b, 0x01, 0x12, 0xc4, 0x3e, 0xad, 0x70, 0x00, + 0xc9, 0xdf, 0x26, 0x1e, 0x42, 0x76, 0x55, 0x12, 0x9b, 0x38, 0x63, 0xd6, 0x3f, 0x8e, 0xfd, 0x4b, 0x1a, 0xf7, 0x77, + 0x17, 0xd9, 0x72, 0xd9, 0x2e, 0x8e, 0x5b, 0xf2, 0xd1, 0x3a, 0x16, 0x7c, 0x43, 0xde, 0x0d, 0x2a, 0x96, 0x18, 0x0e, + 0x6e, 0x42, 0x4a, 0xac, 0xce, 0x05, 0xf3, 0x54, 0x07, 0x85, 0x6d, 0x89, 0x2c, 0x14, 0x51, 0xa9, 0xd4, 0x69, 0x0a, + 0xdb, 0x62, 0xe1, 0x7a, 0x59, 0xce, 0xe9, 0x0c, 0x4a, 0xa3, 0xe5, 0xb2, 0x53, 0xd8, 0xd6, 0x94, 0x25, 0xf0, 0x94, + 0x2d, 0x97, 0xe2, 0x4c, 0xe4, 0x94, 0x25, 0x4e, 0x1b, 0xc8, 0xd6, 0xb6, 0xa6, 0xfe, 0x8d, 0x98, 0xb0, 0x7e, 0xe3, + 0xdf, 0x38, 0x1d, 0xf5, 0xca, 0x2d, 0xf1, 0x93, 0x03, 0xc5, 0x55, 0x2b, 0xea, 0xab, 0x15, 0x0d, 0xf1, 0x5c, 0x9e, + 0xf6, 0x22, 0x4e, 0x48, 0xfc, 0xcd, 0x2b, 0x1a, 0xea, 0x15, 0x9d, 0x6f, 0x59, 0xd1, 0xf9, 0x1d, 0x2b, 0x1a, 0xa8, + 0xd5, 0xb3, 0x4a, 0xdc, 0xa5, 0xcb, 0x65, 0xa7, 0x5d, 0x61, 0xef, 0xb8, 0x15, 0xb2, 0x2b, 0x58, 0x0d, 0xd0, 0xd4, + 0x38, 0x9b, 0xd2, 0xcd, 0x44, 0x59, 0x47, 0x31, 0xfd, 0x2c, 0x4c, 0x56, 0x58, 0xc8, 0xea, 0x58, 0x30, 0xe9, 0xba, + 0x0c, 0x4c, 0xfe, 0x91, 0x94, 0xcd, 0x00, 0x0f, 0x39, 0xe0, 0x21, 0xd2, 0x77, 0x85, 0x3a, 0xf6, 0x7b, 0x1b, 0xdb, + 0x96, 0xad, 0xc9, 0xfa, 0xa2, 0x38, 0x07, 0x19, 0x21, 0xe6, 0x77, 0x2f, 0x5a, 0x84, 0xda, 0x76, 0x7f, 0x3b, 0xcd, + 0x41, 0x0e, 0xc1, 0x75, 0x9a, 0x85, 0xb6, 0x27, 0xab, 0x7e, 0x16, 0xaa, 0xa6, 0x2c, 0x51, 0x19, 0x69, 0x5b, 0x69, + 0xad, 0x7a, 0x6f, 0x52, 0x5c, 0xf7, 0xf0, 0x50, 0xd6, 0x98, 0xf9, 0x9c, 0xd3, 0x2c, 0x51, 0x94, 0x6b, 0xdb, 0xff, + 0x21, 0xa8, 0x70, 0x03, 0x5f, 0x09, 0xf4, 0x02, 0x68, 0x02, 0x54, 0x3a, 0xb7, 0xe2, 0xf9, 0x52, 0x3c, 0xed, 0x54, + 0xca, 0xe6, 0x2d, 0x32, 0xf5, 0x7e, 0x59, 0x04, 0x66, 0xc8, 0x7c, 0x4a, 0xc3, 0x73, 0xc1, 0xa0, 0x07, 0xf1, 0x85, + 0x52, 0x1e, 0x57, 0xc4, 0x5d, 0xd5, 0x00, 0xdb, 0x3f, 0xcd, 0xbb, 0x8f, 0x0e, 0x4e, 0x6d, 0x2c, 0x79, 0x7c, 0x3a, + 0x1e, 0xdb, 0xa8, 0xb0, 0xee, 0xd7, 0xac, 0x73, 0xf0, 0xd3, 0xfc, 0xeb, 0x67, 0xed, 0xaf, 0xcb, 0xc6, 0x09, 0x10, + 0x91, 0x4a, 0x82, 0xd0, 0xa2, 0xca, 0x80, 0x57, 0xcf, 0x68, 0xec, 0x27, 0xdb, 0xa7, 0x33, 0x34, 0xa7, 0x93, 0xcf, + 0x28, 0x0d, 0x81, 0x38, 0xf1, 0x5a, 0xe9, 0x79, 0x4c, 0xaf, 0xa8, 0xbe, 0xa1, 0x71, 0xc3, 0x60, 0x1b, 0x5a, 0x04, + 0xe9, 0x3c, 0xe1, 0x2a, 0x1b, 0x44, 0xb1, 0x5a, 0x63, 0x4a, 0x17, 0x62, 0x0e, 0xa6, 0x3a, 0x7f, 0x2b, 0xe5, 0x5c, + 0x5d, 0x7a, 0x15, 0x17, 0xd8, 0x36, 0x00, 0xd8, 0x0a, 0xd9, 0x60, 0x4b, 0xb9, 0xd7, 0xc6, 0xed, 0x6d, 0xb0, 0xe1, + 0x0e, 0xf2, 0x6c, 0x7b, 0xa4, 0xf1, 0x24, 0x1c, 0xba, 0xb5, 0x4b, 0x35, 0xb6, 0xe2, 0xeb, 0x93, 0x18, 0xb8, 0xcc, + 0xa0, 0xb3, 0x84, 0xe6, 0xf9, 0x56, 0x04, 0x94, 0x8b, 0x88, 0xed, 0xaa, 0xb6, 0xbd, 0xa5, 0x17, 0xdc, 0xc6, 0xb0, + 0xc3, 0x04, 0xc0, 0x65, 0x58, 0x59, 0xd5, 0xa2, 0xe3, 0x31, 0x0d, 0x4a, 0x7f, 0x38, 0x04, 0x08, 0xc7, 0x2c, 0xe6, + 0x10, 0x27, 0x13, 0x01, 0x2c, 0xfb, 0x75, 0x9a, 0x50, 0x1b, 0xe9, 0x94, 0x57, 0x05, 0xbf, 0x92, 0xff, 0x9b, 0xe1, + 0x91, 0x3d, 0xd6, 0x61, 0x51, 0xa3, 0x2c, 0x97, 0xda, 0x5d, 0x53, 0x2b, 0xaf, 0x23, 0x32, 0x15, 0xfe, 0x98, 0x6d, + 0x1b, 0xe8, 0x7e, 0xdb, 0x64, 0xd1, 0xf9, 0xfa, 0xb0, 0xd3, 0x2e, 0x6c, 0x6c, 0x43, 0x77, 0xf7, 0xdd, 0x25, 0xa2, + 0xd5, 0x3e, 0xb4, 0x9a, 0x27, 0x9f, 0xd3, 0xae, 0xdb, 0x79, 0xdc, 0xb1, 0xb1, 0xbc, 0x6b, 0x01, 0x15, 0x25, 0x33, + 0x08, 0xc0, 0x43, 0xfc, 0xbb, 0xa7, 0x52, 0xef, 0xfc, 0x7e, 0xf0, 0x3c, 0xec, 0xb4, 0x6d, 0x6c, 0xe7, 0x3c, 0x9d, + 0x7d, 0xc6, 0x14, 0xf6, 0x6d, 0x6c, 0x07, 0x71, 0x9a, 0x53, 0x73, 0x0e, 0x52, 0x9d, 0xfd, 0xfd, 0x93, 0x90, 0x10, + 0xcd, 0x32, 0x9a, 0xe7, 0x96, 0xd9, 0xbf, 0x22, 0xa5, 0x4f, 0x30, 0xcc, 0x8d, 0x14, 0x97, 0x53, 0x2e, 0xf0, 0x22, + 0xaf, 0x41, 0x30, 0xa9, 0x4a, 0x96, 0xad, 0x11, 0x9b, 0x10, 0x01, 0x25, 0x63, 0x93, 0xda, 0xd5, 0x27, 0x47, 0xde, + 0xb0, 0xf5, 0xe4, 0xc0, 0x32, 0x70, 0xbe, 0x3e, 0x40, 0xad, 0x64, 0xca, 0x92, 0xf3, 0x0d, 0xa5, 0xfe, 0xcd, 0x86, + 0x52, 0x50, 0xd9, 0x4a, 0xe8, 0xd4, 0x15, 0x3d, 0x9f, 0xc6, 0x7a, 0xa5, 0xf8, 0x98, 0x20, 0x86, 0xc2, 0xff, 0xf8, + 0x09, 0x48, 0x8d, 0x65, 0x10, 0x3d, 0xfc, 0xf6, 0xe1, 0xa0, 0xe4, 0x73, 0x86, 0x2b, 0x7b, 0xf9, 0x7d, 0x33, 0x84, + 0xd2, 0x26, 0x38, 0xf9, 0xe3, 0xcf, 0x9a, 0x2b, 0xbd, 0xf9, 0x34, 0xc1, 0x19, 0x5a, 0xd5, 0xef, 0x58, 0x7a, 0x75, + 0xd4, 0x7f, 0x75, 0xed, 0x37, 0x14, 0x2b, 0xc5, 0xa7, 0x5c, 0xff, 0x20, 0x66, 0xd3, 0x8a, 0x04, 0xd6, 0xc1, 0x14, + 0x1a, 0x0f, 0x64, 0x7c, 0x99, 0x9d, 0x48, 0xd5, 0xe7, 0x1c, 0xce, 0xb1, 0xc2, 0x55, 0x21, 0xf3, 0x8c, 0x9e, 0xc7, + 0xe9, 0xf5, 0xea, 0xe5, 0x67, 0xdb, 0x2b, 0x47, 0x6c, 0x12, 0x19, 0x87, 0xd3, 0x28, 0x29, 0x17, 0xe1, 0xce, 0x01, + 0x8a, 0x7f, 0xf9, 0x67, 0xd7, 0xfd, 0x97, 0x7f, 0xfe, 0x64, 0x55, 0xe8, 0xbe, 0xb8, 0xc0, 0xbc, 0xea, 0x76, 0xfb, + 0xee, 0xda, 0x3c, 0x52, 0x1d, 0xe7, 0x9b, 0xeb, 0xac, 0x2d, 0x02, 0xbc, 0x5f, 0x5b, 0x82, 0xb5, 0x42, 0xb9, 0xfb, + 0xac, 0xdf, 0x02, 0x18, 0xcc, 0xeb, 0x93, 0x90, 0x41, 0xa5, 0xdf, 0x05, 0xda, 0x05, 0xf2, 0xee, 0xb5, 0x22, 0xbf, + 0x1d, 0xc3, 0x9f, 0x9a, 0xc3, 0xef, 0x04, 0x5f, 0xf9, 0x27, 0xe2, 0x8b, 0x8b, 0x32, 0x0b, 0xd1, 0x6c, 0x0a, 0x77, + 0x1c, 0x0c, 0xd6, 0x4a, 0x94, 0xe2, 0xe1, 0xb5, 0x51, 0x5f, 0x9c, 0xa1, 0x24, 0xf1, 0xc5, 0x2b, 0xb8, 0xd8, 0xe8, + 0xf8, 0x32, 0xd3, 0xce, 0xd6, 0x3b, 0x84, 0x03, 0x74, 0x51, 0x9f, 0x95, 0xe8, 0x74, 0x4d, 0x32, 0x40, 0x29, 0x98, + 0x1b, 0x00, 0x26, 0x8e, 0x2f, 0x94, 0xb5, 0x79, 0x2a, 0xdd, 0x30, 0xde, 0x2a, 0x69, 0x2b, 0xf7, 0x4c, 0x0d, 0xe9, + 0xd8, 0x7a, 0x2f, 0xf0, 0x25, 0x2a, 0xd3, 0xca, 0xba, 0x17, 0xae, 0x2e, 0xb0, 0x23, 0x4a, 0xf6, 0x73, 0xe5, 0xc7, + 0x57, 0xf7, 0x63, 0x7c, 0xdb, 0x05, 0xea, 0xd2, 0x5a, 0xfe, 0xa3, 0x55, 0x82, 0x65, 0x73, 0xb9, 0x49, 0x1f, 0xb8, + 0xf6, 0x39, 0xcd, 0xce, 0x23, 0x48, 0x84, 0xca, 0x3e, 0xc1, 0x9c, 0x60, 0xa5, 0x31, 0x15, 0x7f, 0x19, 0x51, 0x17, + 0x49, 0xff, 0x83, 0x38, 0x15, 0x83, 0x2c, 0x46, 0x18, 0xca, 0x58, 0x84, 0xff, 0xcf, 0xb7, 0xfe, 0xc3, 0xf0, 0xad, + 0xbb, 0x87, 0xa8, 0x9d, 0x91, 0xfe, 0xec, 0x85, 0xfc, 0x8f, 0xcd, 0xee, 0x72, 0xc1, 0xee, 0x7e, 0x03, 0xa3, 0xcb, + 0xff, 0x31, 0x8c, 0x4e, 0xd8, 0xc8, 0x9a, 0xd3, 0xad, 0x85, 0x9a, 0x6f, 0x5d, 0xff, 0xda, 0xbf, 0xad, 0xf6, 0x55, + 0x7c, 0x71, 0x72, 0xed, 0xdf, 0x56, 0x8b, 0xb0, 0x9d, 0x5d, 0xac, 0xf6, 0x31, 0xb0, 0xdf, 0xbc, 0xb6, 0x3d, 0xfb, + 0xcd, 0xd7, 0x5f, 0xdb, 0xf8, 0x22, 0xa7, 0x7c, 0x00, 0x85, 0x64, 0x77, 0xb1, 0xb3, 0x5a, 0x11, 0xdc, 0x28, 0x30, + 0x45, 0x11, 0xf6, 0x82, 0xa4, 0x43, 0xe3, 0x3d, 0xcb, 0xcf, 0xd3, 0xc4, 0x84, 0xe6, 0x2d, 0x58, 0xf6, 0x9f, 0x0b, + 0x8e, 0xe8, 0x65, 0x0d, 0x1e, 0x51, 0xba, 0x0a, 0x90, 0x28, 0xac, 0x41, 0x54, 0x5d, 0x19, 0x74, 0x37, 0xff, 0xaf, + 0xae, 0x45, 0x90, 0xb7, 0x7d, 0x44, 0x83, 0xf8, 0xe2, 0x73, 0xc4, 0x87, 0x1c, 0xac, 0xf2, 0xd8, 0x69, 0x77, 0xa7, + 0x5f, 0xec, 0x2e, 0xa2, 0xbd, 0x3d, 0x36, 0xb0, 0xb1, 0xb8, 0xa7, 0xa9, 0xd8, 0x24, 0x5c, 0x72, 0xf8, 0x93, 0xc1, + 0x9f, 0xb4, 0x62, 0xd4, 0x2c, 0x19, 0x67, 0x7e, 0x46, 0xc3, 0xed, 0x4c, 0xba, 0xbc, 0xdf, 0x48, 0x91, 0x86, 0x4c, + 0xc0, 0xce, 0xcf, 0x45, 0xea, 0xd1, 0x94, 0x81, 0x3e, 0xba, 0x63, 0x7e, 0xc5, 0x47, 0x5d, 0x88, 0x56, 0x7e, 0x04, + 0xc0, 0x44, 0x38, 0x25, 0x79, 0x99, 0xeb, 0x00, 0xb7, 0x6a, 0xaa, 0xec, 0x10, 0x6c, 0x23, 0xe1, 0x75, 0x0f, 0x49, + 0x5f, 0xa4, 0x3d, 0xbc, 0x48, 0xb8, 0x13, 0xba, 0x3c, 0x63, 0x53, 0x07, 0xe1, 0x4e, 0x1b, 0x21, 0xed, 0x6c, 0x08, + 0x49, 0x7f, 0x87, 0xe5, 0xaf, 0xfd, 0xd7, 0x4e, 0x28, 0x2e, 0xe2, 0x12, 0x9f, 0xee, 0x81, 0x43, 0x92, 0x4f, 0xe6, + 0xe3, 0x31, 0xcd, 0x1c, 0x7d, 0x00, 0xf0, 0xab, 0x03, 0x38, 0x63, 0x0c, 0x6f, 0x9f, 0xfa, 0xdc, 0xff, 0x96, 0xd1, + 0x6b, 0x27, 0x45, 0xbd, 0xac, 0xba, 0x9c, 0x31, 0xc4, 0x73, 0x44, 0xfa, 0x11, 0x24, 0xc6, 0xbf, 0x48, 0xf8, 0x7e, + 0xd7, 0x99, 0x7f, 0x75, 0x80, 0x43, 0xb8, 0xf2, 0x42, 0x67, 0x75, 0xcb, 0xbb, 0x4a, 0x3e, 0xb0, 0x84, 0x1f, 0xc9, + 0x63, 0x98, 0x29, 0x52, 0xee, 0xc3, 0x32, 0x23, 0xc6, 0xf2, 0xcb, 0x0e, 0x43, 0xd2, 0x0f, 0x1a, 0x44, 0x1e, 0xca, + 0x14, 0xb7, 0xec, 0x9e, 0x46, 0x7e, 0x76, 0x0a, 0x07, 0xbe, 0x01, 0xd0, 0x4b, 0x9e, 0xfa, 0x4e, 0x50, 0x7e, 0xc9, + 0xc9, 0x69, 0xfd, 0xd4, 0x68, 0x4d, 0xb0, 0x48, 0x8a, 0xa9, 0x8a, 0x5a, 0x50, 0x74, 0x6e, 0x16, 0x91, 0xc6, 0x6e, + 0x0b, 0xc3, 0x1e, 0xec, 0x6d, 0xf4, 0xd1, 0xea, 0xa5, 0x6b, 0x5e, 0x67, 0xfe, 0xac, 0x8c, 0x1b, 0x9c, 0xfa, 0x59, + 0xc6, 0x68, 0x66, 0x39, 0xcf, 0x7f, 0x45, 0xde, 0xbf, 0xfc, 0xf3, 0xe6, 0xf8, 0x81, 0x0a, 0x19, 0x58, 0x90, 0x5c, + 0xd2, 0x14, 0xe9, 0xd8, 0xc4, 0x0e, 0x64, 0x43, 0x5b, 0x87, 0x3b, 0xf6, 0x8f, 0xda, 0xed, 0xb6, 0x0a, 0x09, 0x74, + 0xe4, 0x4f, 0x88, 0x01, 0xc0, 0x4f, 0x78, 0x10, 0x51, 0x65, 0x62, 0xcb, 0x00, 0xe5, 0x51, 0x7b, 0x76, 0x63, 0xf7, + 0x61, 0x3b, 0x28, 0x28, 0xde, 0xd1, 0x19, 0xf5, 0xf9, 0x67, 0x8d, 0x9f, 0x89, 0x26, 0xe5, 0xf0, 0x1d, 0x3d, 0x74, + 0x35, 0xee, 0xca, 0xa0, 0x87, 0xab, 0x83, 0xbe, 0x67, 0x53, 0x71, 0x75, 0xd3, 0xb6, 0x51, 0x85, 0xa7, 0xba, 0x36, + 0x26, 0x97, 0x2d, 0x6c, 0x4b, 0x60, 0x3c, 0x4a, 0xe3, 0x90, 0x66, 0xc4, 0xa6, 0xee, 0xc4, 0xb5, 0x1e, 0xb7, 0xdb, + 0x6d, 0xdc, 0x3c, 0x38, 0x6c, 0xb7, 0xf1, 0xe1, 0xc3, 0x36, 0x6e, 0xc2, 0x1f, 0xd7, 0x75, 0x57, 0x60, 0xb8, 0x2b, + 0x6a, 0xdb, 0x69, 0x67, 0x74, 0xaa, 0x00, 0xbc, 0x33, 0xac, 0x58, 0xed, 0x09, 0xb8, 0x60, 0x5a, 0xed, 0x7b, 0x29, + 0xd9, 0xd4, 0x05, 0x07, 0x2a, 0x1d, 0x55, 0xf8, 0x0b, 0xd3, 0x2a, 0x68, 0x4a, 0xe5, 0xc5, 0x7f, 0x2f, 0x14, 0x21, + 0x78, 0xd6, 0x29, 0xdc, 0x5e, 0x2a, 0xe2, 0xa5, 0x90, 0x0a, 0x04, 0x1f, 0x48, 0xe3, 0x3e, 0x4b, 0xe0, 0xdb, 0x59, + 0x3a, 0x6a, 0xaa, 0x19, 0x55, 0xba, 0x92, 0x74, 0xfb, 0x40, 0x86, 0xa5, 0x37, 0x11, 0xc4, 0xe8, 0x01, 0xc2, 0xfe, + 0x7d, 0x1a, 0xa8, 0x15, 0x84, 0xfa, 0xc1, 0x7d, 0xea, 0x6b, 0xec, 0x8f, 0x1e, 0x88, 0xe4, 0xa4, 0x9d, 0x68, 0xb9, + 0xdc, 0xf1, 0x97, 0xcb, 0x9d, 0xe0, 0xfe, 0x33, 0x94, 0xcb, 0xab, 0x4f, 0x41, 0xc0, 0xcd, 0x9f, 0x12, 0xe8, 0x17, + 0x50, 0xee, 0x45, 0x58, 0x82, 0x24, 0x9f, 0x7c, 0xac, 0x06, 0x94, 0x8f, 0x41, 0xb1, 0x82, 0x94, 0x90, 0x44, 0xd2, + 0x3e, 0x5f, 0x2e, 0x15, 0xf1, 0xe3, 0x39, 0xf1, 0xcb, 0xa2, 0x8e, 0x8d, 0x67, 0x24, 0x28, 0x1f, 0x6d, 0x01, 0xf2, + 0x4c, 0x71, 0xa9, 0x0a, 0xe2, 0x6b, 0x3f, 0x4b, 0x4c, 0x80, 0x5f, 0xa7, 0x96, 0x1a, 0xd6, 0x9a, 0x65, 0xe9, 0x15, + 0x83, 0xe4, 0x97, 0x95, 0x81, 0xa7, 0x04, 0x2e, 0xfe, 0xea, 0x99, 0xa1, 0x70, 0xa3, 0x83, 0xf7, 0x9a, 0xcf, 0xc2, + 0x2d, 0x93, 0xe5, 0x04, 0xbd, 0x50, 0xcd, 0xcd, 0x9b, 0xeb, 0x69, 0xbd, 0xf3, 0xaf, 0xbd, 0x99, 0x7e, 0x78, 0x26, + 0xf3, 0x6c, 0xbc, 0x69, 0x79, 0xb2, 0xe6, 0x2d, 0x79, 0x0d, 0xb1, 0x1f, 0x5b, 0xf3, 0x6d, 0xb8, 0x67, 0x53, 0xf2, + 0xb8, 0x77, 0x2f, 0xcf, 0xa8, 0x9f, 0x05, 0xd1, 0x5b, 0x3f, 0xf3, 0xa7, 0x79, 0x6f, 0xac, 0x6f, 0xf1, 0xd2, 0x14, + 0x70, 0x3e, 0x16, 0x99, 0x4e, 0x49, 0x70, 0x6b, 0xe3, 0x10, 0xe1, 0xea, 0xbd, 0x84, 0x40, 0xfa, 0xb9, 0x6d, 0x3c, + 0x37, 0x5f, 0xc1, 0x3a, 0xdb, 0x78, 0x8a, 0xb0, 0x4c, 0x20, 0x7a, 0xfb, 0x47, 0xa6, 0x0e, 0x61, 0xc8, 0x75, 0xf1, + 0xc6, 0x6e, 0xf5, 0x95, 0x3b, 0x9d, 0x4c, 0xf4, 0x7e, 0x25, 0x99, 0x68, 0x03, 0x1a, 0xad, 0x8c, 0xe6, 0xb3, 0x34, + 0xc9, 0xa9, 0x8d, 0xdf, 0x43, 0x3b, 0x79, 0x15, 0xb3, 0xd9, 0x70, 0x8d, 0xe6, 0xca, 0xa6, 0xe2, 0x8d, 0x6c, 0x07, + 0x41, 0x9d, 0xf7, 0xdf, 0x97, 0x71, 0x7c, 0x1d, 0xdf, 0x11, 0x89, 0xe8, 0x8c, 0x6e, 0xc9, 0x95, 0xcd, 0xe9, 0x27, + 0x73, 0x65, 0xe3, 0x7b, 0xe5, 0xca, 0xe6, 0xf4, 0x8f, 0xce, 0x95, 0x65, 0xd4, 0xc8, 0x95, 0x05, 0x39, 0xf7, 0xf5, + 0xbd, 0x52, 0x2e, 0x75, 0x26, 0x5c, 0x7a, 0x9d, 0x93, 0x8e, 0x8a, 0x81, 0xc4, 0xe9, 0x04, 0xf2, 0x2d, 0xff, 0xf1, + 0xe9, 0x93, 0x71, 0x3a, 0x31, 0x93, 0x27, 0xe1, 0xc3, 0x24, 0x40, 0x76, 0x38, 0x23, 0x0b, 0xfb, 0xa7, 0x9b, 0xce, + 0x93, 0x61, 0xa7, 0xb7, 0xdf, 0x99, 0xda, 0x9e, 0x0d, 0x4e, 0x47, 0x51, 0xd0, 0xee, 0xed, 0xef, 0x43, 0xc1, 0xb5, + 0x51, 0xd0, 0x85, 0x02, 0x66, 0x14, 0x1c, 0x42, 0x41, 0x60, 0x14, 0x3c, 0x84, 0x82, 0xd0, 0x28, 0x78, 0x04, 0x05, + 0x57, 0x76, 0x31, 0x64, 0x65, 0x42, 0xf0, 0x23, 0x24, 0x6e, 0x30, 0xdc, 0xc9, 0xea, 0xa7, 0xb7, 0x23, 0xa2, 0xab, + 0x3c, 0x2a, 0x6f, 0x7e, 0x68, 0x1e, 0xe8, 0x8b, 0x0a, 0x2f, 0xbe, 0xb8, 0x00, 0xd6, 0x0a, 0x17, 0xb1, 0x60, 0x88, + 0x49, 0xca, 0x9a, 0xfb, 0xfa, 0xb5, 0xed, 0x95, 0x59, 0xb3, 0x6d, 0xdc, 0xd5, 0x79, 0xb3, 0x9e, 0x8d, 0x04, 0x5f, + 0x92, 0x2f, 0x0e, 0x1b, 0xa1, 0xea, 0x16, 0xee, 0x00, 0xac, 0x2e, 0xe0, 0xdc, 0x47, 0x78, 0xaa, 0x15, 0x20, 0xea, + 0xc0, 0x07, 0x18, 0xde, 0xb3, 0x29, 0xd5, 0xfb, 0x45, 0x0f, 0x60, 0x89, 0xcc, 0xe2, 0x5e, 0x54, 0x29, 0x46, 0x6f, + 0xf1, 0xb8, 0xba, 0xf3, 0xf5, 0x3d, 0x91, 0x77, 0xe8, 0x65, 0x58, 0x86, 0xb9, 0x66, 0x98, 0xfb, 0x13, 0x0f, 0x52, + 0x28, 0x21, 0x63, 0xc4, 0x1b, 0x13, 0x42, 0xda, 0x83, 0xb9, 0xf7, 0x16, 0x5f, 0x47, 0x34, 0xf1, 0xa6, 0x45, 0xaf, + 0x5c, 0x7f, 0x99, 0xd2, 0xf9, 0xbe, 0xbc, 0x28, 0x5c, 0xd0, 0x44, 0xf5, 0x56, 0x42, 0xd9, 0x2c, 0x69, 0x67, 0x4b, + 0xce, 0x9f, 0xa1, 0xec, 0x8c, 0xe3, 0xf4, 0xba, 0x09, 0xe2, 0x7e, 0x63, 0x1e, 0x20, 0xcc, 0xad, 0xcc, 0x03, 0x7c, + 0x09, 0xb0, 0x96, 0x4f, 0xef, 0xfd, 0x49, 0xf9, 0xfb, 0x15, 0xcd, 0x73, 0x7f, 0xa2, 0x6a, 0x6e, 0xcf, 0xfb, 0x13, + 0x20, 0x9a, 0x39, 0x7f, 0x1a, 0x08, 0x48, 0xce, 0x03, 0x84, 0x40, 0x40, 0x57, 0xe5, 0xea, 0xc1, 0xcc, 0xeb, 0x69, + 0x7e, 0x02, 0x55, 0xf5, 0x22, 0xee, 0x4f, 0xaa, 0x82, 0xe3, 0x59, 0x46, 0x55, 0x02, 0x21, 0x60, 0xb1, 0x38, 0x6e, + 0x41, 0x81, 0x7c, 0xbd, 0x25, 0x9d, 0x4f, 0x73, 0x97, 0xed, 0x49, 0x7d, 0x96, 0x4e, 0xe7, 0x33, 0x4f, 0xa6, 0x94, + 0xc7, 0x52, 0xd6, 0x33, 0xf2, 0xbe, 0xec, 0x04, 0xf0, 0x9f, 0x3a, 0x78, 0xf1, 0xe5, 0x78, 0x3c, 0xbe, 0x33, 0xbd, + 0xef, 0xcb, 0x70, 0x4c, 0xbb, 0xf4, 0xb0, 0x07, 0xa7, 0x16, 0x9a, 0x2a, 0x11, 0xad, 0x53, 0x08, 0xdc, 0x2d, 0xee, + 0x57, 0x19, 0x72, 0xd6, 0x78, 0xb4, 0xb8, 0x7f, 0xaa, 0x5f, 0x31, 0xcb, 0xe8, 0x62, 0xea, 0x67, 0x13, 0x96, 0x78, + 0xed, 0xc2, 0xbd, 0x5a, 0x28, 0x50, 0x8f, 0x8e, 0x8e, 0x0a, 0x37, 0xd4, 0x4f, 0xed, 0x30, 0x2c, 0xdc, 0x60, 0x51, + 0x4e, 0xa3, 0xdd, 0x1e, 0x8f, 0x0b, 0x97, 0xe9, 0x82, 0xfd, 0x6e, 0x10, 0xee, 0x77, 0x0b, 0xf7, 0xda, 0xa8, 0x51, + 0xb8, 0x54, 0x3d, 0x65, 0x34, 0xac, 0x1d, 0x7d, 0x78, 0xd4, 0x6e, 0x17, 0xae, 0x24, 0xb4, 0x05, 0xc4, 0xe4, 0xe4, + 0x4f, 0xcf, 0x9f, 0x73, 0x30, 0x98, 0x8a, 0x5e, 0xcc, 0x9d, 0xe1, 0xae, 0xba, 0x56, 0x52, 0x7e, 0x87, 0xb1, 0x40, + 0x23, 0xfc, 0xb5, 0x99, 0x39, 0x07, 0xc4, 0x2c, 0x32, 0xe6, 0x62, 0x9d, 0x58, 0x57, 0x7b, 0x0d, 0x94, 0x25, 0x5e, + 0x7f, 0x4d, 0xe2, 0x2a, 0xa1, 0x0e, 0xf8, 0x18, 0xd4, 0x94, 0xb7, 0x9f, 0x27, 0xdb, 0xa4, 0x47, 0xf6, 0x69, 0xe9, + 0x71, 0x79, 0x1f, 0xe1, 0x91, 0xfd, 0xe1, 0xc2, 0x23, 0x31, 0x85, 0x87, 0x64, 0x1d, 0xd7, 0x9c, 0xd8, 0x41, 0x44, + 0x83, 0x8f, 0x97, 0xe9, 0x4d, 0x13, 0xb6, 0x44, 0x66, 0x0b, 0xb1, 0x72, 0xf5, 0x5b, 0x33, 0xf9, 0x75, 0x67, 0xc6, + 0x47, 0x1c, 0x85, 0x8e, 0xff, 0x26, 0x21, 0xf6, 0x1b, 0x1d, 0xd8, 0x93, 0x25, 0xe3, 0x31, 0xb1, 0xdf, 0x8c, 0xc7, + 0xb6, 0xbe, 0x1c, 0xc7, 0xe7, 0x54, 0xd4, 0x7a, 0x5d, 0x2b, 0x11, 0xb5, 0xc0, 0xd0, 0xaf, 0xca, 0xcc, 0x02, 0x95, + 0x77, 0x67, 0xe6, 0xd8, 0xa9, 0x37, 0x21, 0xcb, 0x61, 0xab, 0xc1, 0xb7, 0x25, 0xeb, 0x97, 0xf3, 0x27, 0xb5, 0x2f, + 0x29, 0x95, 0x00, 0x6f, 0xf8, 0xfc, 0xd3, 0xea, 0xcd, 0x70, 0x13, 0xaa, 0x55, 0xfc, 0x27, 0xb7, 0x2f, 0x42, 0xe7, + 0x9a, 0xa3, 0x82, 0xe5, 0x6f, 0x92, 0x95, 0x5b, 0x1f, 0x24, 0x8c, 0x84, 0x98, 0xd3, 0x2a, 0x78, 0x3a, 0x99, 0xc4, + 0xe2, 0x30, 0x49, 0xcd, 0xe0, 0x96, 0xcd, 0x07, 0xb5, 0xf9, 0x7a, 0x66, 0x43, 0xf5, 0x79, 0x0d, 0xf1, 0xbd, 0x61, + 0x79, 0x5a, 0xf8, 0x4a, 0x7d, 0x78, 0x56, 0xc4, 0x04, 0x17, 0x8a, 0xc7, 0x2f, 0xe4, 0x19, 0x53, 0x8e, 0x59, 0x28, + 0x9b, 0xb3, 0xb0, 0x28, 0xd4, 0xe9, 0xfc, 0x90, 0xe5, 0x33, 0xd0, 0x9e, 0x64, 0x4b, 0xfa, 0x29, 0x16, 0x9e, 0x5f, + 0x1b, 0xc9, 0x6d, 0xb5, 0xe5, 0x2a, 0xb4, 0x9d, 0x26, 0xb3, 0x85, 0xae, 0x79, 0x61, 0x2b, 0x93, 0x4d, 0x23, 0xd1, + 0xb6, 0x24, 0x3e, 0x65, 0xda, 0x9d, 0x31, 0x43, 0xc8, 0xfc, 0x29, 0x17, 0x44, 0xbf, 0xd2, 0x05, 0x85, 0x69, 0x65, + 0x89, 0x37, 0x12, 0x5b, 0x22, 0x55, 0x2c, 0x9f, 0xf9, 0x89, 0x36, 0xe6, 0x24, 0x3f, 0xd8, 0x5d, 0x54, 0x2b, 0x5f, + 0xd8, 0x1a, 0x6c, 0x49, 0xbc, 0xfd, 0xe3, 0x16, 0x34, 0xe8, 0x5b, 0x35, 0xd0, 0x93, 0xb5, 0x0c, 0xb3, 0xbb, 0xf3, + 0xae, 0x3f, 0x5e, 0xb8, 0xf9, 0x35, 0x76, 0xf3, 0x6b, 0xeb, 0xab, 0x45, 0xf3, 0x9a, 0x5e, 0x7e, 0x64, 0xbc, 0xc9, + 0xfd, 0x59, 0x13, 0xbc, 0xa7, 0x22, 0x33, 0x44, 0xb1, 0x67, 0xa1, 0xa3, 0x4b, 0xd3, 0xaf, 0x37, 0xcf, 0x21, 0x3d, + 0x5b, 0x98, 0x51, 0x5e, 0x92, 0x26, 0xb4, 0x57, 0x3f, 0xbe, 0x67, 0x66, 0x18, 0x6b, 0x6c, 0x8d, 0x16, 0x29, 0xa4, + 0x73, 0xf3, 0x5b, 0xaf, 0xad, 0xd8, 0x7a, 0x5b, 0xa7, 0x0f, 0xb7, 0x37, 0xd6, 0xf7, 0x14, 0x72, 0x1b, 0x42, 0x7a, + 0x65, 0xeb, 0xf9, 0xcf, 0xdb, 0xf2, 0xbb, 0x3f, 0x75, 0x98, 0x0d, 0xf2, 0x49, 0xf4, 0xff, 0xc6, 0x29, 0xc0, 0xd5, + 0x62, 0x71, 0x98, 0xed, 0x3e, 0x90, 0x79, 0xfe, 0x98, 0xd3, 0x0c, 0xdf, 0xa7, 0xe6, 0xa5, 0xb8, 0x77, 0x62, 0x01, + 0x62, 0xc6, 0xeb, 0x1c, 0xd5, 0x53, 0xb1, 0xef, 0xee, 0xfe, 0xee, 0xe9, 0x17, 0x0a, 0x47, 0xfa, 0x1e, 0x56, 0xdb, + 0xee, 0xc1, 0x46, 0x88, 0xfd, 0x5b, 0x8f, 0x25, 0x42, 0xe6, 0x5d, 0x42, 0x52, 0x48, 0x6f, 0x96, 0xaa, 0x53, 0x99, + 0x19, 0x8d, 0xc5, 0xa7, 0xd7, 0xd5, 0x52, 0xec, 0x3f, 0x9c, 0xdd, 0xe8, 0xd5, 0xe8, 0xac, 0x9c, 0xb6, 0xfc, 0x43, + 0x0f, 0x55, 0x6e, 0x3f, 0xc5, 0x59, 0x3f, 0x18, 0x78, 0x38, 0xbb, 0xe9, 0x49, 0x41, 0xdb, 0xcc, 0x24, 0x54, 0xed, + 0xd9, 0x8d, 0x79, 0xac, 0xb4, 0xea, 0xc8, 0x72, 0xf7, 0x73, 0x8b, 0xfa, 0x39, 0xed, 0xc1, 0x97, 0xa6, 0x58, 0xe0, + 0xc7, 0x4a, 0x98, 0x4f, 0x59, 0x18, 0xc6, 0xb4, 0xa7, 0xe5, 0xb5, 0xd5, 0x79, 0x08, 0xa7, 0x32, 0xcd, 0x25, 0xab, + 0xaf, 0x8a, 0x81, 0xbc, 0x12, 0x4f, 0xfe, 0x65, 0x9e, 0xc6, 0xf0, 0x9d, 0xc7, 0x8d, 0xe8, 0x54, 0xc7, 0x15, 0xdb, + 0x15, 0xf2, 0xc4, 0xef, 0xfa, 0x5c, 0x0e, 0xdb, 0x7f, 0xea, 0x89, 0x05, 0x6f, 0xf7, 0x78, 0x3a, 0xf3, 0x9a, 0xfb, + 0xf5, 0x89, 0xc0, 0xab, 0x72, 0x0a, 0x78, 0xc3, 0xb4, 0x30, 0x48, 0x2b, 0xc9, 0xa7, 0x2d, 0xb7, 0xa3, 0xca, 0x44, + 0x07, 0x60, 0x84, 0x96, 0x45, 0x45, 0x7d, 0x32, 0xff, 0x98, 0xdd, 0xf2, 0x78, 0xf3, 0x6e, 0x79, 0xac, 0x77, 0xcb, + 0xdd, 0x14, 0xfb, 0xe5, 0xb8, 0x03, 0xff, 0xf5, 0xaa, 0x09, 0x79, 0x6d, 0x6b, 0x7f, 0x76, 0x63, 0x81, 0x9e, 0xd6, + 0xec, 0xce, 0x6e, 0xe4, 0xa1, 0x5a, 0x48, 0x5c, 0x6b, 0xc3, 0x31, 0x53, 0xdc, 0xb6, 0xa0, 0x10, 0xfe, 0x6f, 0xd7, + 0x5e, 0x75, 0x0e, 0xe0, 0x1d, 0xb4, 0x3a, 0x5c, 0x7f, 0xd7, 0xbd, 0x7b, 0xd3, 0x7a, 0x49, 0xca, 0x1d, 0x4f, 0x73, + 0x63, 0xe4, 0x72, 0xff, 0xf2, 0x92, 0x86, 0xde, 0x38, 0x0d, 0xe6, 0xf9, 0x3f, 0x29, 0xf8, 0x15, 0x12, 0xef, 0xdc, + 0xd2, 0x2b, 0xfd, 0xe8, 0xa6, 0xf2, 0x88, 0xaf, 0xee, 0x61, 0x51, 0xae, 0x93, 0x97, 0x07, 0x7e, 0x4c, 0x9d, 0xae, + 0x7b, 0xb0, 0x61, 0x13, 0xfc, 0x9b, 0xac, 0xcd, 0xc6, 0xc9, 0xfc, 0x5e, 0x64, 0xdc, 0x89, 0x84, 0xcf, 0xc2, 0x81, + 0xb9, 0x86, 0xed, 0xa3, 0xcd, 0xe0, 0x0e, 0xf5, 0x48, 0x23, 0x2d, 0x14, 0x94, 0xdc, 0x09, 0xe9, 0xd8, 0x9f, 0xc7, + 0xfc, 0xee, 0x5e, 0xb7, 0x51, 0xc6, 0x5a, 0xaf, 0x77, 0x30, 0xf4, 0xaa, 0xee, 0x3d, 0xb9, 0xf4, 0x97, 0x8f, 0x0f, + 0xe0, 0x3f, 0x79, 0xf8, 0xe5, 0xb2, 0xd2, 0xd5, 0xa5, 0xd5, 0x0b, 0xba, 0xfa, 0x55, 0x4d, 0x19, 0x97, 0x22, 0x5c, + 0xe8, 0xe3, 0xf7, 0xad, 0x0d, 0x5a, 0xe5, 0xbd, 0xaa, 0x2b, 0x2d, 0xeb, 0xb3, 0x6a, 0x7f, 0x5e, 0xe7, 0xf7, 0xac, + 0x1b, 0x48, 0xcd, 0xb5, 0x5e, 0x57, 0x7d, 0x7a, 0x7e, 0xad, 0xb2, 0xc6, 0xb8, 0xa8, 0x7f, 0x45, 0x2e, 0x4b, 0x13, + 0x45, 0xa6, 0xa2, 0x82, 0x95, 0x72, 0x25, 0xad, 0x94, 0x94, 0x92, 0x8b, 0xe3, 0xc1, 0xcd, 0x34, 0xb6, 0xae, 0xe4, + 0xfd, 0x38, 0xc4, 0xee, 0xb8, 0x6d, 0xdb, 0x12, 0x4e, 0x3a, 0xf8, 0x4c, 0x97, 0xfd, 0xe1, 0xfd, 0xd7, 0xcd, 0x23, + 0x7b, 0x00, 0x9a, 0xd6, 0xd5, 0x44, 0x68, 0x76, 0x2f, 0xfd, 0x5b, 0x9a, 0x9d, 0x77, 0x95, 0x0b, 0x5e, 0xe6, 0x8b, + 0x8b, 0x32, 0xab, 0x6b, 0x5b, 0x37, 0xd3, 0x38, 0xc9, 0x89, 0x1d, 0x71, 0x3e, 0xf3, 0x5a, 0xad, 0xeb, 0xeb, 0x6b, + 0xf7, 0x7a, 0xdf, 0x4d, 0xb3, 0x49, 0xab, 0xdb, 0x6e, 0xb7, 0xe1, 0x8b, 0x1f, 0xb6, 0x75, 0xc5, 0xe8, 0xf5, 0x93, + 0xf4, 0x86, 0xd8, 0x6d, 0xab, 0x6d, 0x75, 0xba, 0x47, 0x56, 0xa7, 0x7b, 0xe0, 0x3e, 0x3c, 0xb2, 0xfb, 0x5f, 0x58, + 0xd6, 0x71, 0x48, 0xc7, 0x39, 0xfc, 0xb0, 0xac, 0x63, 0xa1, 0x78, 0xc9, 0xdf, 0x96, 0xe5, 0x06, 0x71, 0xde, 0xec, + 0x58, 0x0b, 0xf5, 0x68, 0x59, 0x70, 0x8b, 0x90, 0x67, 0x7d, 0x39, 0xee, 0x8e, 0x0f, 0xc6, 0x8f, 0x7b, 0xaa, 0xb8, + 0xf8, 0xa2, 0x56, 0x1d, 0xcb, 0x7f, 0xbb, 0x46, 0xb3, 0x9c, 0x67, 0xe9, 0x47, 0xaa, 0x5c, 0xfb, 0x16, 0x88, 0x9e, + 0x8d, 0x4d, 0xbb, 0xeb, 0x23, 0x75, 0x8e, 0x2e, 0x83, 0x71, 0xb7, 0xaa, 0x2e, 0x60, 0x6c, 0x95, 0x40, 0x1e, 0xb7, + 0x34, 0xe8, 0xc7, 0x26, 0x9a, 0x3a, 0xcd, 0x4d, 0x88, 0xea, 0xd8, 0x6a, 0x8e, 0x13, 0x3d, 0xbf, 0x63, 0x38, 0xb4, + 0xae, 0x75, 0x55, 0x01, 0x81, 0x6d, 0x85, 0xc4, 0x7e, 0xd5, 0xe9, 0x1e, 0xe1, 0x4e, 0xe7, 0xa1, 0xfb, 0xf0, 0x28, + 0x68, 0xe3, 0x03, 0xf7, 0xa0, 0xb9, 0xef, 0x3e, 0xc4, 0x47, 0xcd, 0x23, 0x7c, 0xf4, 0xfc, 0x28, 0x68, 0x1e, 0xb8, + 0x07, 0xb8, 0xdd, 0x3c, 0x82, 0xc2, 0xe6, 0x51, 0xf3, 0xe8, 0xaa, 0x79, 0x70, 0x14, 0xb4, 0x45, 0x69, 0xd7, 0x3d, + 0x3c, 0x6c, 0x76, 0xda, 0xee, 0xe1, 0x21, 0x3e, 0x74, 0x1f, 0x3e, 0x6c, 0x76, 0xf6, 0xdd, 0x87, 0x0f, 0x5f, 0x1e, + 0x1e, 0xb9, 0xfb, 0xf0, 0x6e, 0x7f, 0x3f, 0xd8, 0x77, 0x3b, 0x9d, 0x26, 0xfc, 0xc1, 0x47, 0x6e, 0x57, 0xfe, 0xe8, + 0x74, 0xdc, 0xfd, 0x0e, 0x6e, 0xc7, 0x87, 0x5d, 0xf7, 0xe1, 0x63, 0x2c, 0xfe, 0x8a, 0x6a, 0x58, 0xfc, 0x81, 0x6e, + 0xf0, 0x63, 0xb7, 0xfb, 0x50, 0xfe, 0x12, 0x1d, 0x5e, 0x1d, 0x1c, 0xfd, 0x68, 0xb7, 0xb6, 0xce, 0xa1, 0x23, 0xe7, + 0x70, 0x74, 0xe8, 0xee, 0xef, 0xe3, 0x83, 0x8e, 0x7b, 0xb4, 0x1f, 0x35, 0x0f, 0xba, 0xee, 0xc3, 0x47, 0x41, 0xb3, + 0xe3, 0x3e, 0x7a, 0x84, 0xdb, 0xcd, 0x7d, 0xb7, 0x8b, 0x3b, 0xee, 0xc1, 0xbe, 0xf8, 0xb1, 0xef, 0x76, 0xaf, 0x1e, + 0x3d, 0x76, 0x1f, 0x1e, 0x46, 0x0f, 0xdd, 0x83, 0x6f, 0x0f, 0x8e, 0xdc, 0xee, 0x7e, 0xb4, 0xff, 0xd0, 0xed, 0x3e, + 0xba, 0x7a, 0xe8, 0x1e, 0x44, 0xcd, 0xee, 0xc3, 0x3b, 0x5b, 0x76, 0xba, 0x2e, 0xe0, 0x48, 0xbc, 0x86, 0x17, 0x58, + 0xbd, 0x80, 0xff, 0x23, 0xd1, 0xf6, 0xdf, 0xb0, 0x9b, 0x7c, 0xbd, 0xe9, 0x63, 0xf7, 0xe8, 0x51, 0x20, 0xab, 0x43, + 0x41, 0x53, 0xd7, 0x80, 0x26, 0x57, 0x4d, 0x39, 0xac, 0xe8, 0xae, 0xa9, 0x3b, 0xd2, 0xff, 0xab, 0xc1, 0xae, 0x9a, + 0x30, 0xb0, 0x1c, 0xf7, 0xdf, 0xb5, 0x9f, 0x72, 0xc9, 0x8f, 0x5b, 0x13, 0x49, 0xfa, 0x93, 0xfe, 0x17, 0xf2, 0x73, + 0x3e, 0x5f, 0x5c, 0x60, 0x7f, 0x9b, 0xe3, 0x23, 0xfe, 0xb4, 0xe3, 0x23, 0xa2, 0xf7, 0xf1, 0x7c, 0xc4, 0x7f, 0xb8, + 0xe7, 0xc3, 0x5f, 0x75, 0x9b, 0xdf, 0xf0, 0x35, 0x07, 0xc7, 0xaa, 0x55, 0xfc, 0x82, 0x3b, 0xc3, 0x14, 0x3e, 0x1d, + 0x5d, 0xf4, 0x6e, 0x38, 0x89, 0xa8, 0xe9, 0x07, 0x4a, 0x81, 0xc5, 0xde, 0x70, 0xc9, 0x63, 0x83, 0x6d, 0x08, 0x09, + 0x3f, 0x8d, 0x90, 0xef, 0xee, 0x83, 0x8f, 0xf0, 0x0f, 0xc7, 0x47, 0x60, 0xe2, 0xa3, 0xe6, 0xc9, 0x17, 0x9e, 0x06, + 0xe1, 0x29, 0x38, 0x13, 0xcf, 0x0e, 0xdc, 0x9a, 0xd1, 0xb0, 0x5b, 0xf4, 0x4a, 0x44, 0xee, 0x64, 0x70, 0xfd, 0xf9, + 0xe7, 0x04, 0x1d, 0xe4, 0x15, 0x39, 0xc4, 0x56, 0x6e, 0x99, 0x99, 0x90, 0x3a, 0xea, 0xa1, 0x14, 0x4a, 0x5d, 0xb7, + 0xed, 0xb6, 0x4b, 0x97, 0x0e, 0x5c, 0x8b, 0x44, 0x16, 0x29, 0xf7, 0xbd, 0x9d, 0x0e, 0x8e, 0xd3, 0x09, 0x5c, 0x96, + 0x24, 0x3e, 0x1f, 0x07, 0x27, 0x1e, 0x02, 0xf9, 0xe5, 0x3e, 0x48, 0x9f, 0x50, 0x8e, 0x1e, 0x3f, 0xfb, 0xf8, 0x37, + 0x08, 0x62, 0xea, 0x98, 0xc4, 0x14, 0xbc, 0x1d, 0xaf, 0x68, 0xc8, 0x7c, 0xc7, 0x76, 0x66, 0x19, 0x1d, 0xd3, 0x2c, + 0x6f, 0xd6, 0xee, 0xeb, 0x11, 0x57, 0xf5, 0x20, 0x5b, 0x41, 0x38, 0xce, 0xe0, 0x73, 0x48, 0x64, 0xa8, 0xfc, 0x8d, + 0xb6, 0x32, 0xc0, 0xec, 0x02, 0xeb, 0x92, 0x0c, 0x64, 0x6d, 0xa5, 0xb4, 0xd9, 0x52, 0x6b, 0xeb, 0xb8, 0xdd, 0x43, + 0x64, 0x89, 0x62, 0xf8, 0xd0, 0xcc, 0x0f, 0x4e, 0x73, 0xbf, 0xfd, 0x27, 0x64, 0x34, 0x2b, 0x3b, 0x1a, 0x29, 0x77, + 0x5b, 0x52, 0x7e, 0x8e, 0x70, 0x25, 0xec, 0x6a, 0x4b, 0x8a, 0xf8, 0x52, 0xce, 0xdd, 0x46, 0xbd, 0x44, 0x25, 0xcd, + 0xc9, 0x2b, 0x01, 0xc7, 0x6c, 0xe2, 0x18, 0xd7, 0x4d, 0x24, 0xf2, 0x43, 0x36, 0x70, 0x5b, 0x3d, 0x42, 0x45, 0x55, + 0x25, 0x41, 0x0b, 0x11, 0x6d, 0x61, 0x89, 0x95, 0x2c, 0x97, 0x4e, 0x02, 0x2e, 0x72, 0x62, 0xe0, 0x14, 0x9e, 0x51, + 0x0d, 0xc9, 0x09, 0x2e, 0x01, 0x12, 0x08, 0x26, 0x89, 0xfc, 0xb7, 0x2a, 0xd6, 0x3f, 0x94, 0xe3, 0xcb, 0x8d, 0xfd, + 0x64, 0x02, 0x54, 0xe8, 0x27, 0x93, 0x35, 0xb7, 0x9a, 0x0c, 0x18, 0xad, 0x94, 0x56, 0x5d, 0x55, 0xee, 0xb3, 0xfc, + 0xc9, 0xed, 0x7b, 0x75, 0xe3, 0xb5, 0x0d, 0xde, 0x69, 0x11, 0xdf, 0xa8, 0xbe, 0xce, 0xd3, 0x20, 0x0f, 0x8e, 0xa7, + 0x94, 0xfb, 0xf2, 0xb0, 0x1a, 0xe8, 0x13, 0x90, 0xcb, 0x62, 0x29, 0x6b, 0x54, 0x05, 0xf5, 0x89, 0x3c, 0xcc, 0x2f, + 0x45, 0x3d, 0xb6, 0xd4, 0x55, 0x71, 0x4d, 0xb1, 0x34, 0xa4, 0x83, 0xa5, 0x3f, 0x26, 0xf0, 0xc5, 0x71, 0x64, 0x92, + 0xa4, 0x76, 0xff, 0x41, 0x99, 0xeb, 0xb2, 0x6d, 0x11, 0x62, 0x96, 0x7c, 0x1c, 0x66, 0x34, 0xfe, 0x27, 0xf2, 0x80, + 0x05, 0x69, 0xf2, 0x60, 0x64, 0xa3, 0x1e, 0x77, 0xa3, 0x8c, 0x8e, 0xc9, 0x03, 0x90, 0xf1, 0x9e, 0xb0, 0x3e, 0x80, + 0x11, 0x36, 0x6e, 0xa6, 0x31, 0x16, 0x1a, 0xd3, 0x3d, 0x14, 0x22, 0x09, 0xae, 0xdd, 0x3d, 0xb4, 0x2d, 0x69, 0x13, + 0x8b, 0xdf, 0x7d, 0x29, 0x4e, 0x85, 0x12, 0x60, 0x75, 0xba, 0xee, 0x61, 0xd4, 0x75, 0x1f, 0x5f, 0x3d, 0x72, 0x8f, + 0xa2, 0xce, 0xa3, 0xab, 0x26, 0xfc, 0xdb, 0x75, 0x1f, 0xc7, 0xcd, 0xae, 0xfb, 0x18, 0xfe, 0xff, 0xf6, 0xc0, 0x3d, + 0x8c, 0x9a, 0x1d, 0xf7, 0xe8, 0x6a, 0xdf, 0xdd, 0x7f, 0xd9, 0xe9, 0xba, 0xfb, 0x56, 0xc7, 0x92, 0xed, 0x80, 0x5d, + 0x4b, 0xee, 0xfc, 0x60, 0x65, 0x43, 0x6c, 0x08, 0xc6, 0xc9, 0x03, 0x77, 0x36, 0x16, 0x67, 0xa4, 0xcd, 0xfd, 0xa9, + 0x9c, 0x75, 0x4f, 0xfd, 0x0c, 0xbe, 0x6c, 0x5a, 0xdf, 0xbb, 0xb5, 0x77, 0xb8, 0xc6, 0x2f, 0x36, 0x0c, 0x31, 0x13, + 0x11, 0x70, 0xf3, 0xae, 0x35, 0x2a, 0xee, 0xb0, 0x93, 0xdf, 0x82, 0x52, 0x51, 0xb0, 0x32, 0xbb, 0xc8, 0x20, 0x6b, + 0x59, 0x03, 0x12, 0x80, 0x04, 0x0d, 0xae, 0xe6, 0x8f, 0x56, 0x74, 0x9e, 0xc1, 0xfd, 0x04, 0x9a, 0x97, 0x30, 0xf1, + 0x45, 0x3e, 0x01, 0xc3, 0x8b, 0xb0, 0x58, 0x05, 0x0f, 0x8e, 0x05, 0x66, 0xa9, 0x71, 0x1b, 0x1d, 0xad, 0x72, 0x00, + 0x42, 0x06, 0xf7, 0x07, 0x16, 0x85, 0x9e, 0x59, 0xcd, 0x8b, 0x5b, 0x21, 0x51, 0xb0, 0x13, 0x9a, 0x0f, 0x6c, 0x28, + 0xb2, 0x3d, 0x5b, 0x78, 0x00, 0xed, 0xf2, 0xe3, 0xaf, 0x25, 0xdd, 0x57, 0x05, 0x58, 0x5c, 0x0e, 0x01, 0x9b, 0x1a, + 0xd0, 0x67, 0xa3, 0xbd, 0xbd, 0xad, 0xdb, 0x49, 0xe8, 0x97, 0x30, 0xb5, 0xea, 0x9b, 0x91, 0x26, 0xa7, 0xb2, 0xcd, + 0x75, 0x28, 0xfb, 0x15, 0x18, 0x46, 0x0a, 0x2d, 0x97, 0xd4, 0xe7, 0xae, 0x9f, 0xc8, 0x03, 0x06, 0x06, 0x3f, 0xc3, + 0x1d, 0xba, 0x8f, 0x8a, 0x94, 0xfb, 0x32, 0x67, 0xcc, 0x64, 0x03, 0x29, 0xf7, 0xf5, 0xdd, 0x4a, 0x3e, 0xaf, 0x9d, + 0xab, 0x8f, 0xba, 0xfd, 0x37, 0xef, 0x4f, 0x2c, 0xb9, 0x7b, 0x8f, 0x5b, 0x51, 0xb7, 0x7f, 0x2c, 0x5c, 0x2a, 0x32, + 0x2b, 0x80, 0xc8, 0xac, 0x00, 0x4b, 0x5d, 0x2a, 0x03, 0x81, 0xb6, 0xa2, 0x25, 0xa7, 0x2d, 0x4c, 0x0a, 0xe9, 0x0c, + 0x9e, 0xce, 0x63, 0xce, 0xe0, 0x9b, 0x47, 0x2d, 0x91, 0x12, 0x20, 0x52, 0x0c, 0xf4, 0x19, 0x55, 0xa5, 0x3c, 0x5e, + 0xf2, 0x44, 0xbb, 0x8e, 0xc7, 0x2c, 0xa6, 0xfa, 0x54, 0xaa, 0xea, 0xaa, 0xcc, 0x07, 0x5a, 0xaf, 0x9d, 0xcf, 0x2f, + 0x21, 0x27, 0x42, 0x67, 0x1f, 0x7d, 0x50, 0x0d, 0x8e, 0xc5, 0x50, 0x10, 0xd8, 0x97, 0x52, 0x5c, 0x7f, 0xdd, 0xb5, + 0xbe, 0xa4, 0x6a, 0xf6, 0x4a, 0x80, 0xc0, 0x4d, 0x1e, 0xd1, 0x7e, 0xbf, 0xf4, 0x26, 0x9b, 0xef, 0x8a, 0xe3, 0x56, + 0xb4, 0xdf, 0xbf, 0xf0, 0x26, 0xaa, 0xbf, 0x97, 0xe9, 0x64, 0x73, 0x5f, 0x71, 0x3a, 0x19, 0x88, 0x63, 0xf2, 0xf2, + 0xca, 0x27, 0xad, 0x1b, 0xa7, 0xb1, 0xdd, 0x3f, 0x56, 0xba, 0x82, 0x25, 0xa2, 0xee, 0xf6, 0x61, 0x5b, 0x9f, 0xbc, + 0x8f, 0xd3, 0x09, 0xec, 0x57, 0xd9, 0xc4, 0x18, 0xa4, 0xe6, 0x90, 0x8f, 0x3a, 0xfd, 0x63, 0xdf, 0x12, 0xac, 0x47, + 0xf0, 0x96, 0xdc, 0x6b, 0x41, 0xe3, 0x28, 0x9d, 0x52, 0x97, 0xa5, 0xad, 0x6b, 0x7a, 0xd9, 0xf4, 0x67, 0xac, 0xf2, + 0x7e, 0x83, 0x4e, 0x52, 0x0e, 0x99, 0xae, 0x64, 0x60, 0x75, 0x2b, 0x6f, 0xdc, 0x01, 0x98, 0x44, 0xda, 0x73, 0x27, + 0x5c, 0x76, 0x06, 0x58, 0x69, 0xff, 0xb8, 0xe5, 0xaf, 0x60, 0x44, 0x6c, 0xc5, 0x42, 0xf9, 0xe1, 0xc1, 0xee, 0xb9, + 0x14, 0xe9, 0x5f, 0x52, 0x5a, 0x68, 0x7f, 0xbd, 0x92, 0xe3, 0x85, 0xdd, 0xff, 0xd7, 0xff, 0xf1, 0xbf, 0x94, 0x0b, + 0xfe, 0xb8, 0x15, 0x75, 0x74, 0x5f, 0x2b, 0xab, 0x52, 0x1c, 0xc3, 0x3d, 0x36, 0x55, 0xcc, 0x98, 0xde, 0x34, 0x27, + 0x19, 0x0b, 0x9b, 0x91, 0x1f, 0x8f, 0xed, 0xfe, 0x76, 0x6c, 0xca, 0xf4, 0xc4, 0xa6, 0x8e, 0xb6, 0xae, 0x17, 0x01, + 0xbd, 0xfe, 0xa6, 0x4b, 0x19, 0x74, 0xc6, 0x97, 0xd8, 0xda, 0xe6, 0x15, 0x0d, 0xd5, 0xee, 0xab, 0x5d, 0xd3, 0x90, + 0xa8, 0x4f, 0x46, 0x2b, 0x06, 0x99, 0xd4, 0x6e, 0x67, 0x28, 0x6c, 0xab, 0x8c, 0x79, 0xfd, 0xdf, 0xff, 0xf9, 0x5f, + 0xfe, 0x9b, 0x7e, 0x84, 0x50, 0xd6, 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, 0x85, 0xf4, 0x34, 0x15, + 0xee, 0x12, 0x4c, 0xc5, 0xaa, 0x62, 0x5d, 0x92, 0xbb, 0x58, 0x70, 0xe8, 0x6d, 0xca, 0x72, 0xce, 0x82, 0xfa, 0x7d, + 0x0d, 0x67, 0x62, 0x40, 0xb1, 0x33, 0x15, 0x74, 0x62, 0x87, 0x17, 0x15, 0x41, 0xd5, 0x50, 0x2e, 0x08, 0xb7, 0x38, + 0x6e, 0x01, 0xbe, 0xef, 0x77, 0xdd, 0x8c, 0x5b, 0x2e, 0xc7, 0x42, 0x93, 0x09, 0x94, 0x14, 0x55, 0xb9, 0x05, 0xa1, + 0x97, 0x05, 0x3c, 0x7a, 0x5d, 0xa3, 0x58, 0xac, 0x5e, 0xad, 0x4d, 0xef, 0xe7, 0x79, 0xce, 0xd9, 0x18, 0x50, 0x2e, + 0xdd, 0xc8, 0x22, 0xca, 0xdd, 0x04, 0x55, 0x32, 0xbe, 0x2d, 0x44, 0x2f, 0x92, 0x40, 0x0f, 0x8e, 0xfe, 0x54, 0xfc, + 0x79, 0x0a, 0x0a, 0x9b, 0xe5, 0x4c, 0xfd, 0x1b, 0x65, 0xbd, 0x3f, 0x6c, 0xb7, 0x67, 0x37, 0x68, 0x51, 0x8d, 0x80, + 0xb7, 0x0d, 0x26, 0xe8, 0xd8, 0xec, 0x50, 0x84, 0xc7, 0x4b, 0x2f, 0x77, 0xdb, 0x02, 0x57, 0xb9, 0xd5, 0x2e, 0x8a, + 0xaf, 0x16, 0xc2, 0xd1, 0xca, 0x7e, 0x85, 0x30, 0xb6, 0xf2, 0x49, 0x5f, 0xa6, 0xe6, 0xe4, 0x16, 0x46, 0xab, 0xae, + 0x6c, 0x15, 0x75, 0xd6, 0x6f, 0x6e, 0x31, 0xc3, 0xf0, 0x66, 0x00, 0xfd, 0x00, 0x42, 0xe2, 0x51, 0x07, 0x47, 0xdd, + 0x45, 0xd9, 0x3d, 0xe7, 0xe9, 0xd4, 0x8c, 0xbb, 0x53, 0x9f, 0x06, 0x74, 0xac, 0x7d, 0xf9, 0xea, 0xbd, 0x8c, 0xa9, + 0x17, 0xd1, 0xfe, 0x86, 0xb1, 0x14, 0x48, 0x22, 0xde, 0x6e, 0xb5, 0x8b, 0x2f, 0x61, 0x07, 0x2e, 0xc6, 0x71, 0xea, + 0x73, 0x4f, 0x10, 0x6c, 0xcf, 0x8c, 0xde, 0xfb, 0xc0, 0x93, 0xd2, 0x85, 0x01, 0x4f, 0x4f, 0x56, 0x05, 0xaf, 0x7a, + 0xfd, 0x06, 0xc7, 0xc2, 0x15, 0xcd, 0xcd, 0xae, 0xa4, 0x53, 0xee, 0x3b, 0x15, 0x14, 0x7f, 0x5e, 0xf3, 0x66, 0x29, + 0x81, 0xd4, 0x45, 0x9b, 0xdf, 0x4b, 0xb1, 0x2f, 0xdf, 0x7e, 0xcf, 0x1d, 0x5b, 0x80, 0x69, 0xaf, 0xd6, 0x12, 0x85, + 0x50, 0xeb, 0x39, 0xf9, 0xae, 0xb4, 0xa8, 0xfc, 0xd9, 0x4c, 0x54, 0x44, 0xbd, 0xe3, 0x96, 0x54, 0x84, 0x81, 0x7b, + 0x88, 0x8c, 0x0f, 0x99, 0x60, 0xa1, 0x2a, 0xa9, 0xad, 0x20, 0x7f, 0xa9, 0xd4, 0x0b, 0xf8, 0x94, 0x78, 0xff, 0xff, + 0x01, 0x65, 0x21, 0x07, 0x4b, 0xe3, 0x97, 0x00, 0x00}; #else // Brotli (default, smaller) -constexpr uint8_t INDEX_BR[] PROGMEM = { - 0x1b, 0xc3, 0x97, 0x11, 0x55, 0xb5, 0x65, 0x2c, 0x8a, 0x8a, 0x55, 0x0b, 0xd0, 0xba, 0x80, 0x1b, 0x32, 0xb0, 0x81, - 0x4f, 0x27, 0x63, 0xf1, 0x7e, 0x88, 0xe3, 0xd8, 0x52, 0x84, 0x55, 0xe8, 0x35, 0x5b, 0x2b, 0x82, 0xe1, 0xed, 0x1f, - 0xfd, 0xde, 0x63, 0x38, 0x3a, 0x71, 0x78, 0xb0, 0x42, 0x17, 0x15, 0x54, 0x23, 0xe1, 0xaa, 0x28, 0x11, 0x94, 0x23, - 0xb4, 0xf4, 0x91, 0x3c, 0xfc, 0xff, 0xab, 0x5a, 0x56, 0x2d, 0x07, 0xcb, 0x09, 0x6f, 0x79, 0x15, 0x1c, 0xd2, 0x87, - 0x40, 0x38, 0x97, 0xce, 0x9d, 0x87, 0x67, 0xe0, 0xa0, 0x4d, 0x49, 0x1a, 0x27, 0xf0, 0xf5, 0x8d, 0x9d, 0x72, 0x02, - 0x12, 0x45, 0x49, 0x2b, 0x48, 0xe0, 0x6a, 0xff, 0x5f, 0x6d, 0x55, 0xf1, 0x54, 0x12, 0xc1, 0x2f, 0x1e, 0xc8, 0x83, - 0x0c, 0x92, 0x0d, 0x75, 0xd8, 0xf5, 0xdd, 0xc7, 0x75, 0x50, 0x6c, 0xa1, 0xb2, 0x85, 0xad, 0x6d, 0x63, 0xd1, 0x96, - 0x38, 0xaa, 0x65, 0x4d, 0x1e, 0x6c, 0x14, 0x4e, 0x10, 0xed, 0xbe, 0xaf, 0xf3, 0xff, 0xeb, 0xf7, 0xc6, 0x6f, 0xd9, - 0x77, 0x24, 0x81, 0xbb, 0x26, 0xd0, 0x31, 0x81, 0xae, 0x49, 0x8d, 0x23, 0xb0, 0x5a, 0x62, 0xe5, 0x49, 0x4a, 0x17, - 0xa7, 0x66, 0xda, 0xb2, 0x6a, 0x9d, 0xf0, 0x4d, 0xa4, 0x1d, 0x59, 0xe6, 0x00, 0x55, 0x58, 0x63, 0xf9, 0x0c, 0xfe, - 0xa0, 0xbd, 0xa5, 0xfa, 0x75, 0x9f, 0xcb, 0x49, 0x22, 0x0c, 0xe1, 0xd5, 0xb0, 0xd8, 0x13, 0x72, 0xd3, 0x25, 0x4e, - 0x48, 0x1b, 0xa2, 0x76, 0x4f, 0x5c, 0x42, 0xe2, 0x98, 0x6d, 0x9b, 0x80, 0x3e, 0x69, 0x90, 0xcf, 0x69, 0xa5, 0x2e, - 0xc0, 0x47, 0x4f, 0x5c, 0xac, 0x83, 0x99, 0xe7, 0xfc, 0xff, 0xdf, 0x96, 0x7e, 0xa5, 0xd5, 0x2d, 0x98, 0x45, 0x4a, - 0x81, 0x52, 0x20, 0x67, 0x6d, 0x8d, 0xbd, 0xc4, 0x49, 0xb0, 0x41, 0xa8, 0xba, 0xf7, 0xbe, 0x77, 0x47, 0x45, 0x3d, - 0xea, 0xaa, 0x52, 0xcf, 0x6f, 0xb2, 0x2d, 0xea, 0x11, 0x1f, 0x0b, 0x6d, 0x7e, 0xef, 0x55, 0x75, 0xab, 0xaa, 0x5b, - 0xf6, 0x74, 0x4b, 0xf6, 0x18, 0xe7, 0x1c, 0x59, 0xf6, 0xfe, 0x01, 0xd2, 0xff, 0x8b, 0xe4, 0xf9, 0xe7, 0x2c, 0x52, - 0x84, 0x51, 0x02, 0x9c, 0xed, 0xc9, 0x31, 0x0a, 0x01, 0xd3, 0xcd, 0x36, 0xdc, 0x74, 0x55, 0x87, 0x2a, 0x51, 0x4e, - 0xcf, 0x28, 0xc5, 0x71, 0xec, 0x2d, 0x23, 0x97, 0xcb, 0x55, 0x7d, 0xfd, 0xd6, 0x83, 0x1d, 0xc6, 0x0a, 0x21, 0x9e, - 0x5d, 0x46, 0xd3, 0xfc, 0xcd, 0xca, 0x21, 0x21, 0x24, 0xce, 0x75, 0x5d, 0x7f, 0xa6, 0x0d, 0xf7, 0x70, 0x16, 0xd1, - 0xc4, 0x38, 0xe2, 0x00, 0xf9, 0x14, 0x84, 0xa1, 0x23, 0x9d, 0x6e, 0xcc, 0x71, 0xee, 0xa1, 0xc8, 0x1a, 0xc1, 0xb4, - 0xda, 0x43, 0x30, 0xcf, 0xe1, 0xc0, 0x01, 0x34, 0xb2, 0x3c, 0xb7, 0x7f, 0xf5, 0x81, 0xad, 0xdb, 0xf5, 0x23, 0x32, - 0xe8, 0xf1, 0x66, 0xa5, 0x04, 0xdc, 0x46, 0x71, 0x3d, 0x0e, 0x94, 0x8d, 0x00, 0x35, 0xab, 0xb1, 0x1b, 0x92, 0xef, - 0xcd, 0xef, 0x3f, 0x1d, 0x1c, 0x84, 0x98, 0xe9, 0x3f, 0x54, 0xae, 0x9d, 0x84, 0x17, 0xa2, 0x2e, 0x69, 0x5b, 0xc0, - 0xd5, 0x10, 0x62, 0x1e, 0x06, 0x1e, 0xa2, 0xe0, 0xb5, 0xd7, 0xe2, 0xe9, 0xb4, 0xc6, 0x33, 0x43, 0xc6, 0x96, 0x8b, - 0x5c, 0x0f, 0xd4, 0x5c, 0x18, 0x1c, 0x0e, 0xba, 0x54, 0x85, 0xf3, 0x4c, 0x2e, 0xa2, 0x4d, 0xd7, 0x9a, 0x23, 0xba, - 0x9a, 0xf4, 0xba, 0xa4, 0xf4, 0xdc, 0xdf, 0x7c, 0x53, 0x67, 0xdc, 0x17, 0x7a, 0x7e, 0x49, 0x87, 0x3f, 0xe3, 0xbc, - 0x98, 0x12, 0x88, 0xe8, 0x78, 0x4f, 0x91, 0x72, 0x75, 0x32, 0xc8, 0xd7, 0x95, 0xca, 0xd2, 0xcf, 0x7f, 0x83, 0x7d, - 0x06, 0x6e, 0x11, 0x1b, 0xc7, 0xf9, 0x71, 0x99, 0x5f, 0x17, 0x63, 0x5e, 0x35, 0xf3, 0xd5, 0xe1, 0x70, 0xd9, 0xbb, - 0xc1, 0x75, 0x93, 0x66, 0x1f, 0xd6, 0x83, 0xa5, 0xdb, 0x37, 0x7f, 0x59, 0xd3, 0xe6, 0x66, 0x37, 0x45, 0x5b, 0x5b, - 0x7e, 0xf1, 0xd4, 0xd3, 0x0b, 0xb5, 0x90, 0xaf, 0xeb, 0x69, 0xc2, 0xcd, 0x5c, 0x30, 0xca, 0x16, 0xda, 0x1d, 0xf0, - 0xb9, 0xea, 0xb2, 0xfc, 0xba, 0x5d, 0x25, 0xf3, 0xe3, 0xe4, 0x1b, 0xf1, 0xdb, 0x25, 0x73, 0x7d, 0x31, 0x43, 0x95, - 0x9a, 0x88, 0x6a, 0xf8, 0x47, 0x20, 0x2d, 0xb7, 0xd7, 0x78, 0x6f, 0xe2, 0xbb, 0xa1, 0x85, 0x75, 0xa4, 0xae, 0x6a, - 0x11, 0x25, 0xb7, 0xdf, 0xcd, 0xab, 0xa1, 0x2c, 0x20, 0xff, 0xd6, 0x84, 0xc8, 0x33, 0xee, 0x86, 0x44, 0x55, 0x79, - 0x98, 0x27, 0x37, 0x80, 0x50, 0xa9, 0x8e, 0x88, 0xb5, 0xcc, 0x13, 0xf0, 0x74, 0x38, 0xc7, 0xd8, 0x86, 0xc0, 0x7b, - 0x1d, 0x9e, 0xa6, 0x3b, 0xf3, 0xc3, 0xb5, 0x00, 0x77, 0xc3, 0xca, 0x83, 0x98, 0xba, 0x41, 0x85, 0x3c, 0xd9, 0x29, - 0xc8, 0x79, 0x52, 0x60, 0x25, 0xbb, 0xa6, 0x39, 0xca, 0x76, 0xf2, 0xa6, 0x7d, 0x57, 0xa3, 0xcc, 0xd6, 0xb8, 0xe7, - 0xcd, 0xdf, 0xf9, 0x24, 0x84, 0x14, 0x7f, 0x63, 0x51, 0x9b, 0x98, 0x4a, 0x48, 0xb8, 0x74, 0x9a, 0x74, 0xbf, 0xf1, - 0x9d, 0x48, 0x62, 0x9e, 0xe7, 0x8a, 0x92, 0x75, 0xc8, 0x64, 0x1b, 0xbf, 0xde, 0x54, 0x9b, 0xb6, 0x5c, 0x42, 0xc3, - 0x1a, 0x1e, 0x3f, 0xa7, 0x59, 0xa4, 0x90, 0x50, 0xb2, 0xa7, 0x25, 0x61, 0x65, 0x41, 0xde, 0x83, 0x2f, 0x53, 0x38, - 0x7c, 0xb9, 0xd3, 0xe7, 0x0b, 0x42, 0x59, 0xb8, 0xa9, 0xc0, 0xc4, 0x7b, 0x1b, 0x2b, 0xcd, 0xd7, 0x51, 0x43, 0x30, - 0x93, 0x3f, 0x13, 0xd6, 0x31, 0xfe, 0x55, 0x33, 0xb5, 0x25, 0x44, 0x09, 0x3e, 0xfc, 0x5c, 0x85, 0xac, 0x1b, 0xc1, - 0xd4, 0xb4, 0x54, 0xf2, 0x05, 0x97, 0x72, 0x0e, 0x24, 0x80, 0x50, 0x03, 0x26, 0x7f, 0xce, 0x9a, 0xbe, 0x9f, 0xf1, - 0xf2, 0x7e, 0xc4, 0x9b, 0x26, 0x24, 0x96, 0x37, 0x92, 0x0d, 0x75, 0xff, 0x64, 0xa0, 0xec, 0x38, 0xa6, 0x7a, 0xc8, - 0x7c, 0x1f, 0x76, 0x7b, 0x1a, 0x19, 0x21, 0xc8, 0x7d, 0x33, 0x42, 0xc3, 0x6c, 0x5e, 0xf0, 0x0b, 0x41, 0xaf, 0x8c, - 0x34, 0xa9, 0x8a, 0x2a, 0xbc, 0xff, 0xf5, 0x0b, 0x21, 0x7a, 0x1c, 0xea, 0xd1, 0xff, 0x4e, 0xe9, 0x2e, 0xd5, 0x12, - 0xc3, 0x7a, 0x28, 0xbc, 0x54, 0xe7, 0x95, 0xaa, 0xcd, 0x05, 0x02, 0x30, 0xe4, 0x56, 0x22, 0xfb, 0x9b, 0x91, 0x04, - 0xec, 0x30, 0x53, 0xfe, 0x75, 0x2d, 0xc2, 0x32, 0xc1, 0xe5, 0xcf, 0x59, 0x65, 0xaf, 0xe2, 0x93, 0x94, 0x3e, 0x9a, - 0x23, 0xaa, 0x2c, 0x61, 0x7c, 0x59, 0x10, 0xa4, 0x3c, 0x9b, 0x17, 0x9b, 0xc6, 0x8d, 0xdc, 0x51, 0x7b, 0x10, 0xaf, - 0x72, 0x1d, 0xc7, 0x12, 0x95, 0xad, 0x72, 0x02, 0x90, 0x3c, 0xbb, 0xef, 0x06, 0x61, 0xb0, 0x9c, 0x10, 0xa9, 0x2e, - 0x23, 0xfc, 0x73, 0xae, 0x0a, 0x6e, 0x25, 0x9a, 0x55, 0xcd, 0xfd, 0x37, 0xe8, 0x62, 0xb7, 0xe0, 0x8e, 0xcf, 0xeb, - 0xb9, 0xe1, 0x2a, 0xbc, 0x29, 0xfc, 0xb6, 0x64, 0x90, 0x5e, 0x59, 0x8e, 0x26, 0xd1, 0xaa, 0x8e, 0x38, 0x89, 0x68, - 0x81, 0xb1, 0xd9, 0x7f, 0xd2, 0xe2, 0xbd, 0xa0, 0x13, 0x2a, 0x6d, 0x2f, 0xd5, 0xe5, 0x74, 0xc6, 0x0f, 0x2e, 0xa8, - 0xd7, 0xc5, 0xf9, 0x94, 0x45, 0x50, 0xe1, 0xdb, 0xd4, 0x9f, 0xe9, 0x9c, 0x7a, 0x9f, 0x2f, 0x37, 0xcd, 0x73, 0x8f, - 0x65, 0xb7, 0x5b, 0x6b, 0x14, 0xb7, 0xae, 0x42, 0x6a, 0xc3, 0x8d, 0x97, 0x71, 0x5b, 0x2b, 0x28, 0xae, 0x08, 0x4f, - 0xb5, 0xa6, 0x89, 0x34, 0x76, 0x89, 0x53, 0x36, 0xc6, 0xfb, 0x77, 0x4b, 0xdc, 0x57, 0x4b, 0x99, 0x32, 0xc4, 0x34, - 0x3c, 0xa1, 0xee, 0x5e, 0x9a, 0x1a, 0x0c, 0x0b, 0x1e, 0xbb, 0x45, 0x7c, 0x21, 0x55, 0x09, 0x0a, 0x46, 0xe5, 0x34, - 0x4f, 0xbc, 0x78, 0xe8, 0x5d, 0xb0, 0x04, 0x88, 0xb7, 0xe8, 0xf2, 0x7e, 0x01, 0xc1, 0x8a, 0xd6, 0x0a, 0xb8, 0x13, - 0x4d, 0x90, 0xf0, 0x02, 0x1d, 0x06, 0x19, 0xea, 0x0d, 0xc8, 0x66, 0x95, 0xe8, 0x9d, 0xb3, 0x63, 0x50, 0x5a, 0xcd, - 0xa2, 0xbd, 0x76, 0x9e, 0xde, 0x05, 0xb6, 0xe4, 0xfc, 0x9c, 0x66, 0x63, 0xc6, 0x48, 0x9c, 0x5e, 0x14, 0x31, 0x65, - 0x9e, 0xa8, 0xb9, 0xb6, 0x44, 0x75, 0x9a, 0xbb, 0x3b, 0x63, 0xc6, 0x89, 0xfd, 0x7a, 0x15, 0x7d, 0xd7, 0xc7, 0x55, - 0xcd, 0x80, 0x0b, 0xcc, 0x86, 0xb5, 0xf1, 0xff, 0x69, 0x28, 0x94, 0x82, 0xbf, 0x9a, 0x75, 0x83, 0xe2, 0x5e, 0x2c, - 0xa7, 0xae, 0x27, 0x42, 0xd7, 0xdf, 0x19, 0xd8, 0x8f, 0x77, 0x84, 0x4f, 0x50, 0x46, 0x36, 0x76, 0xfb, 0xa6, 0x34, - 0xc2, 0xf5, 0x2a, 0xf9, 0xbc, 0x7f, 0x6a, 0xfb, 0x86, 0xfa, 0xfc, 0x58, 0x1c, 0xfb, 0x57, 0x6f, 0x28, 0xa6, 0x0e, - 0xdc, 0xc5, 0xec, 0xb9, 0x68, 0xbe, 0xb5, 0xce, 0xd1, 0x83, 0x87, 0xfc, 0x30, 0xec, 0x9d, 0x6e, 0x2c, 0xa6, 0xa6, - 0x8d, 0x07, 0x1a, 0x43, 0x02, 0xbf, 0x66, 0x0e, 0x6b, 0xf5, 0x40, 0x1c, 0xb1, 0x6a, 0x93, 0x53, 0x91, 0xfa, 0x8d, - 0x2a, 0x63, 0x85, 0x79, 0x2d, 0xae, 0x64, 0x21, 0x95, 0x75, 0x18, 0x28, 0x64, 0xa4, 0x3d, 0xa3, 0xdc, 0xb3, 0x82, - 0x87, 0xb9, 0xfe, 0x5d, 0x70, 0x87, 0xaf, 0xef, 0xed, 0x87, 0x26, 0xbe, 0x85, 0xf1, 0xa2, 0xec, 0x54, 0x66, 0x89, - 0x72, 0xcc, 0x02, 0x51, 0x24, 0xcf, 0x88, 0xe6, 0xf8, 0x9a, 0x8d, 0x21, 0x01, 0x72, 0x23, 0x20, 0xc7, 0xdd, 0x7b, - 0xc5, 0xb1, 0x4d, 0x88, 0x40, 0xa1, 0xdd, 0x2d, 0x90, 0x85, 0x82, 0x4c, 0x12, 0x49, 0xee, 0x8e, 0x86, 0x12, 0xfb, - 0x63, 0xf5, 0xd2, 0x85, 0x5b, 0x44, 0xb2, 0xb1, 0x1b, 0x12, 0x08, 0xa4, 0xf1, 0x3e, 0xd5, 0xe7, 0x02, 0x61, 0x29, - 0x40, 0xc7, 0xc1, 0x3f, 0x49, 0x09, 0xab, 0x99, 0x0c, 0x69, 0x36, 0x70, 0x57, 0xe6, 0x65, 0x37, 0xec, 0x7f, 0x67, - 0xa3, 0x02, 0xc2, 0xf1, 0xa1, 0x7f, 0xec, 0x26, 0x28, 0x32, 0x50, 0xb4, 0x42, 0x3d, 0x14, 0x94, 0x6e, 0x28, 0x62, - 0x50, 0xed, 0x8f, 0x9b, 0xc2, 0xdc, 0xdd, 0xc0, 0x64, 0x89, 0x8a, 0xd6, 0x3c, 0x79, 0x2f, 0xea, 0xdb, 0x88, 0xc1, - 0x27, 0x33, 0x76, 0xe8, 0x66, 0xa2, 0x92, 0x5d, 0xaa, 0x0c, 0xac, 0x83, 0x75, 0x2a, 0x95, 0x02, 0x2f, 0x6a, 0x72, - 0xf7, 0x2d, 0x20, 0x2a, 0xde, 0xa9, 0x8b, 0xce, 0xa0, 0x85, 0x57, 0x5a, 0xe8, 0x0c, 0xfa, 0xe5, 0x8c, 0x42, 0xd2, - 0xb1, 0xa6, 0x76, 0xb9, 0x4e, 0x54, 0x0c, 0xf6, 0x84, 0x0d, 0x4a, 0xb4, 0xfc, 0x43, 0x9b, 0x92, 0x88, 0x30, 0xd7, - 0x3d, 0x1f, 0xfe, 0x71, 0x66, 0x48, 0x1f, 0xde, 0xea, 0x21, 0x95, 0x24, 0xc2, 0x27, 0x7c, 0x39, 0x88, 0xd7, 0x1d, - 0x90, 0x14, 0xb8, 0x77, 0x5d, 0xb1, 0x76, 0x2f, 0x3b, 0xe2, 0xe5, 0x64, 0x4b, 0xcd, 0xb8, 0x2e, 0x53, 0xd0, 0xa8, - 0xe3, 0x78, 0xcb, 0xa7, 0xb0, 0xe1, 0x5d, 0xe9, 0x33, 0x3a, 0x16, 0x98, 0x25, 0x90, 0x08, 0x91, 0xde, 0x3f, 0xba, - 0x73, 0xa1, 0xe6, 0x75, 0x92, 0x19, 0x0a, 0x91, 0x5a, 0x25, 0x37, 0x41, 0x85, 0xe3, 0xa9, 0x42, 0xec, 0x48, 0x4a, - 0xca, 0x84, 0x23, 0x4c, 0x8f, 0x2b, 0xa2, 0xa3, 0xe4, 0x3e, 0x69, 0x2a, 0x19, 0x73, 0xf5, 0xbf, 0x4c, 0x69, 0x82, - 0xd9, 0x95, 0xc3, 0x21, 0x11, 0x20, 0x65, 0x5a, 0x6a, 0x37, 0x78, 0x3f, 0x22, 0x3e, 0x15, 0x80, 0x4a, 0x44, 0xa2, - 0x70, 0xcf, 0x2e, 0xfa, 0xb3, 0x28, 0x21, 0x62, 0x30, 0x13, 0xd3, 0x59, 0xf2, 0xfe, 0x5a, 0xe9, 0xe4, 0x75, 0xa3, - 0xab, 0x51, 0xcd, 0xeb, 0x07, 0x95, 0x8f, 0x98, 0x2b, 0x97, 0x4f, 0x02, 0x19, 0x5b, 0x4d, 0xae, 0xa9, 0xcc, 0xb3, - 0xb2, 0xb8, 0x0a, 0x0b, 0x54, 0x1b, 0xb5, 0x80, 0xeb, 0x73, 0x9d, 0xdb, 0x10, 0x75, 0xce, 0x41, 0xe4, 0x80, 0x1d, - 0x56, 0xb3, 0xd0, 0xd9, 0x31, 0x7d, 0x70, 0x99, 0x1c, 0xe1, 0x34, 0x9d, 0xb9, 0x63, 0x68, 0xa7, 0xf7, 0x22, 0x39, - 0x0c, 0x2e, 0x56, 0xa0, 0x0b, 0x28, 0xa7, 0x86, 0x31, 0x8a, 0x1c, 0x50, 0x62, 0xa9, 0x94, 0x72, 0x01, 0x40, 0x8b, - 0xa2, 0xab, 0xa0, 0x0c, 0x85, 0x2a, 0x69, 0x64, 0x0b, 0x07, 0x2b, 0x8e, 0x11, 0xaf, 0xbd, 0xfa, 0x21, 0x10, 0xb2, - 0x68, 0xbb, 0x06, 0xea, 0x40, 0xa9, 0xe6, 0xad, 0x7f, 0x17, 0xb9, 0xe8, 0xc2, 0xb3, 0x32, 0x40, 0x99, 0x3f, 0xaa, - 0x36, 0xeb, 0x4e, 0x26, 0x2f, 0xae, 0x8c, 0x17, 0xaa, 0x6c, 0x78, 0x90, 0x3c, 0x4b, 0x64, 0x4a, 0x28, 0x70, 0xca, - 0x92, 0xc6, 0x3e, 0xf1, 0xc1, 0x8e, 0xfc, 0xf6, 0x84, 0xb9, 0x39, 0x56, 0x46, 0x35, 0xe2, 0xe9, 0x8b, 0xaa, 0xeb, - 0x9a, 0x21, 0x42, 0xcd, 0x3f, 0x7c, 0xed, 0xac, 0xff, 0xa6, 0x1b, 0x8d, 0xde, 0x91, 0x75, 0xd6, 0xe4, 0xdf, 0x86, - 0xc1, 0x9d, 0xce, 0x9e, 0xd5, 0x55, 0x83, 0x58, 0x2b, 0x28, 0x02, 0xe1, 0x80, 0x07, 0xbf, 0xa9, 0x8e, 0xf6, 0x9b, - 0x80, 0x25, 0xef, 0x18, 0xda, 0x93, 0xea, 0x8a, 0x09, 0x4d, 0xcb, 0xe7, 0x1f, 0x41, 0x73, 0xa5, 0x86, 0xb2, 0x2c, - 0xf8, 0xf0, 0x01, 0x65, 0x06, 0xa5, 0xca, 0x51, 0x3b, 0xdd, 0x86, 0x5c, 0x13, 0x68, 0xa2, 0x27, 0x41, 0x9e, 0xaf, - 0xbf, 0x70, 0x57, 0xa5, 0x32, 0x90, 0x6f, 0x98, 0xec, 0xc2, 0x5d, 0xb2, 0xba, 0xca, 0x39, 0xfb, 0x2f, 0x51, 0xcc, - 0xf3, 0xbc, 0xa7, 0x23, 0x23, 0xbd, 0x67, 0x47, 0x6e, 0x6a, 0xc5, 0xf9, 0x29, 0x4a, 0x48, 0x16, 0x6d, 0x59, 0x68, - 0xcb, 0x11, 0x8c, 0x81, 0x12, 0x3a, 0x12, 0xb9, 0x0c, 0x59, 0xd6, 0xb0, 0xcc, 0xbe, 0xe5, 0x7f, 0xe3, 0x90, 0x49, - 0x4a, 0x72, 0x9a, 0x5c, 0xf7, 0xb2, 0xb8, 0xec, 0xca, 0x12, 0x95, 0xd8, 0x51, 0x6b, 0xba, 0x12, 0x43, 0xf2, 0xd5, - 0x7b, 0xda, 0xb4, 0xd4, 0x7e, 0x84, 0x74, 0x67, 0x46, 0x0a, 0xfa, 0xa0, 0xea, 0x6d, 0x74, 0xc1, 0xd1, 0x06, 0x90, - 0x63, 0x49, 0xf2, 0x3c, 0x29, 0x06, 0xd9, 0x44, 0x0a, 0x25, 0xea, 0x49, 0x0e, 0x63, 0x59, 0xc2, 0xdc, 0x8f, 0x12, - 0xcc, 0xd2, 0xb2, 0x8c, 0x91, 0x3e, 0x2d, 0x62, 0xa7, 0x14, 0x8f, 0x50, 0xf9, 0x38, 0xbb, 0xef, 0xa6, 0xa1, 0x24, - 0xd5, 0x49, 0x99, 0x20, 0x68, 0xcf, 0x81, 0xd0, 0x31, 0x01, 0xf3, 0xbd, 0xa9, 0xe8, 0x2f, 0x7f, 0x8e, 0x2b, 0x16, - 0xf6, 0x1f, 0x52, 0x3c, 0x33, 0xb3, 0x9b, 0x5f, 0x59, 0xce, 0x91, 0xe5, 0xcc, 0xd0, 0x49, 0x9b, 0x42, 0x0a, 0x1b, - 0x67, 0xbb, 0xfe, 0x82, 0x34, 0xef, 0x8d, 0x0e, 0x47, 0x7a, 0x09, 0xbf, 0x2f, 0x04, 0xd7, 0x87, 0x24, 0x8c, 0x90, - 0xab, 0x2e, 0xaa, 0xdd, 0x3c, 0x79, 0x91, 0xc2, 0x6a, 0x47, 0x47, 0x5c, 0x8a, 0xdd, 0xdb, 0x59, 0xc4, 0x5a, 0x91, - 0x0a, 0xf6, 0xbd, 0x32, 0x91, 0x89, 0xcd, 0xa0, 0x04, 0x67, 0x2b, 0x03, 0x7a, 0x56, 0xbb, 0x78, 0x26, 0xaa, 0xa3, - 0x26, 0xd4, 0x59, 0x81, 0x67, 0xa8, 0x01, 0x64, 0xeb, 0xbc, 0x69, 0xc9, 0x9e, 0x0e, 0x96, 0x93, 0xd4, 0x50, 0x9a, - 0x45, 0x04, 0xfe, 0xd0, 0xdd, 0xde, 0x93, 0x88, 0x0c, 0x03, 0x3f, 0xce, 0x46, 0x94, 0x07, 0xa8, 0x19, 0xc3, 0x89, - 0xa5, 0x49, 0x92, 0x35, 0x5c, 0x98, 0xf7, 0x56, 0x04, 0x71, 0xdf, 0xc7, 0xb6, 0x88, 0xfa, 0xdb, 0x51, 0x26, 0xd8, - 0x57, 0xeb, 0x04, 0xa2, 0x62, 0x16, 0xca, 0xe4, 0x5b, 0x42, 0x78, 0xcb, 0x03, 0xc3, 0xd5, 0xf9, 0x86, 0xd9, 0x58, - 0xb5, 0x92, 0x23, 0x5f, 0x55, 0x0b, 0x3b, 0x20, 0x1c, 0xb5, 0x2f, 0x1d, 0xeb, 0x67, 0xb7, 0x2a, 0x7a, 0x3d, 0x2d, - 0xbf, 0xda, 0xd4, 0x95, 0xaa, 0x03, 0xb9, 0x18, 0xa3, 0x6c, 0xc6, 0xa4, 0xd1, 0x00, 0xb5, 0x80, 0x5c, 0x59, 0x47, - 0xaa, 0x78, 0x9a, 0x96, 0x70, 0x88, 0x07, 0x1e, 0xaf, 0xae, 0x1d, 0xe9, 0x25, 0xdb, 0xa1, 0x03, 0xda, 0x7a, 0x87, - 0x6f, 0xbd, 0x76, 0x2d, 0xc6, 0x8d, 0x05, 0xbc, 0x01, 0xa0, 0x12, 0x95, 0x0a, 0x2a, 0xd1, 0x20, 0xe5, 0x52, 0xc5, - 0x75, 0xd0, 0x29, 0xd7, 0xb4, 0x58, 0x59, 0x2b, 0xbc, 0xcb, 0x03, 0xfc, 0x69, 0x07, 0xa4, 0xb2, 0xae, 0x82, 0x62, - 0xd1, 0xfd, 0x16, 0x84, 0x14, 0xe2, 0xcd, 0xf4, 0xcd, 0x1c, 0xcc, 0xc9, 0x92, 0x35, 0x5f, 0xcb, 0x13, 0x61, 0xb1, - 0x72, 0x6b, 0x4e, 0xce, 0x91, 0x51, 0x49, 0xdf, 0xde, 0x03, 0xa2, 0x6e, 0x76, 0x79, 0xbf, 0xf8, 0xd1, 0x33, 0xee, - 0x29, 0xf0, 0xf1, 0x76, 0xbf, 0x1b, 0x1c, 0x7e, 0x78, 0xcb, 0xe1, 0x90, 0x33, 0x48, 0x43, 0x1a, 0x1b, 0xc8, 0x10, - 0xbc, 0x58, 0x15, 0x16, 0xfc, 0xb1, 0x6e, 0x75, 0x89, 0xe8, 0x3c, 0x05, 0xfc, 0x3d, 0x73, 0x17, 0xba, 0x3f, 0x20, - 0x72, 0x17, 0xf2, 0x78, 0xde, 0x65, 0x52, 0x3e, 0x42, 0x1a, 0x49, 0xee, 0xdf, 0x47, 0x9a, 0xca, 0xe4, 0x7c, 0xf3, - 0x97, 0x3c, 0x2a, 0x54, 0xd6, 0xc1, 0x14, 0x1a, 0x94, 0xd4, 0x39, 0x60, 0xd0, 0x46, 0xc6, 0x55, 0xbd, 0x1c, 0x3a, - 0x69, 0xf5, 0x79, 0xb6, 0x07, 0x99, 0x22, 0x10, 0x9d, 0x1e, 0x94, 0x51, 0x06, 0x42, 0x00, 0xbc, 0x80, 0x00, 0x68, - 0x09, 0x06, 0x03, 0xf8, 0x48, 0xf7, 0x74, 0xd0, 0x98, 0x8c, 0xd3, 0xa7, 0x92, 0x0c, 0x75, 0xa9, 0xfc, 0x9a, 0x58, - 0x8f, 0x92, 0x25, 0x62, 0x52, 0x41, 0x0b, 0xc5, 0x8c, 0xe2, 0x53, 0xf3, 0xce, 0xdc, 0xd2, 0xfb, 0x92, 0x19, 0xc6, - 0x99, 0x66, 0xa9, 0xd3, 0x46, 0xf2, 0x91, 0xba, 0x4f, 0x79, 0xb0, 0x4a, 0x10, 0x9e, 0x12, 0xaa, 0x32, 0x3c, 0xd4, - 0x35, 0x53, 0x8a, 0x67, 0x38, 0x86, 0xe3, 0xf2, 0xad, 0x45, 0xea, 0xe0, 0x83, 0xc4, 0xa7, 0xef, 0x63, 0xa8, 0xad, - 0xf9, 0xe3, 0xaf, 0x1d, 0x09, 0xbf, 0x8c, 0x32, 0xcc, 0x95, 0x88, 0x03, 0x2d, 0x53, 0x60, 0x87, 0x0b, 0x3d, 0x4f, - 0xbc, 0xdc, 0x97, 0xb8, 0xa3, 0x40, 0x0f, 0x46, 0xec, 0xa9, 0x0f, 0x99, 0xdb, 0x33, 0x91, 0xb5, 0x2d, 0xea, 0xf5, - 0xdf, 0x17, 0xdf, 0xe5, 0xc9, 0xed, 0x98, 0x27, 0x75, 0x8a, 0x0a, 0xb4, 0x52, 0x7b, 0xcb, 0x7c, 0x5f, 0xcc, 0xc2, - 0xa3, 0xef, 0x56, 0xc8, 0x18, 0x43, 0x33, 0xf2, 0x60, 0x63, 0x44, 0x50, 0x16, 0x3b, 0x98, 0xdf, 0x29, 0x24, 0x3f, - 0x3e, 0xc8, 0x41, 0x23, 0x0a, 0x82, 0xaa, 0xfd, 0x05, 0x85, 0xb2, 0x30, 0xf6, 0x37, 0xbe, 0xf6, 0x3d, 0xb2, 0xea, - 0x14, 0xcb, 0xe3, 0xec, 0x33, 0x3e, 0x67, 0x71, 0xc5, 0xaa, 0x05, 0x59, 0x91, 0x7b, 0x25, 0x9e, 0x8e, 0x59, 0xda, - 0x66, 0xd1, 0xb4, 0x4e, 0x00, 0xef, 0x63, 0xe7, 0xb6, 0xdc, 0x0f, 0xb5, 0xfe, 0x08, 0xe2, 0xea, 0x8b, 0xb0, 0xf6, - 0x3c, 0x08, 0x2b, 0xaf, 0xa2, 0x40, 0x31, 0x6d, 0x4b, 0x7e, 0xde, 0xdb, 0xcf, 0xd8, 0x46, 0xf1, 0x44, 0xb6, 0x9b, - 0xf7, 0xb6, 0x67, 0xdb, 0x38, 0x65, 0x4a, 0xfd, 0x6d, 0xae, 0x0f, 0xfe, 0x0f, 0x11, 0x3f, 0xe6, 0x40, 0xbf, 0x5f, - 0xac, 0xa6, 0xf9, 0xa9, 0xf9, 0x64, 0x85, 0xd2, 0x07, 0xf0, 0xe2, 0xb2, 0x79, 0x31, 0x7a, 0xb5, 0xf6, 0x52, 0xc4, - 0xf2, 0x20, 0xf4, 0x2d, 0x62, 0x68, 0x3b, 0xc8, 0x2e, 0xdf, 0xcf, 0x05, 0xba, 0x60, 0xac, 0x47, 0xbf, 0x01, 0x9e, - 0xb4, 0xda, 0x38, 0x64, 0xe0, 0x32, 0x99, 0x73, 0x13, 0x24, 0xdd, 0x07, 0x55, 0xbf, 0xb7, 0xaf, 0xf2, 0xb8, 0xa2, - 0x07, 0x2e, 0xa8, 0x30, 0xdd, 0x71, 0xd7, 0xb5, 0xba, 0xfa, 0xdb, 0x1d, 0x78, 0x9e, 0x1b, 0xed, 0x45, 0xef, 0x6f, - 0xe2, 0x50, 0xc4, 0x95, 0xec, 0x0b, 0x88, 0x44, 0x26, 0x7e, 0xb3, 0x99, 0x24, 0xf6, 0xe5, 0x02, 0x66, 0x2a, 0x99, - 0x66, 0xb1, 0xb6, 0x74, 0x3b, 0xa7, 0x07, 0xaf, 0x86, 0xe5, 0x6c, 0x30, 0x3c, 0xcb, 0xc0, 0xe5, 0x97, 0xd7, 0xb8, - 0xe3, 0xa6, 0xad, 0x7f, 0xe5, 0x96, 0xf0, 0x25, 0xb2, 0xd4, 0xb5, 0xe4, 0xcf, 0x28, 0xb5, 0x1f, 0x34, 0x95, 0x7f, - 0x12, 0xf4, 0xb4, 0xf4, 0x3e, 0x2f, 0x9d, 0xca, 0xaf, 0xdf, 0xb7, 0x3d, 0xad, 0x16, 0xaf, 0xfe, 0x3a, 0xb9, 0x5e, - 0xff, 0xaf, 0xed, 0x1a, 0x3d, 0xfa, 0x39, 0xbd, 0xb2, 0xbf, 0x13, 0x9b, 0x85, 0x61, 0x77, 0x3d, 0x5d, 0x5c, 0x8b, - 0xea, 0xcf, 0x0f, 0xfc, 0xb3, 0xd3, 0x4a, 0x98, 0x8f, 0xbf, 0xb7, 0x98, 0x4c, 0xad, 0x66, 0xb7, 0xa6, 0x7b, 0xf8, - 0xe9, 0xa7, 0x1e, 0x04, 0xda, 0x95, 0x9c, 0xbb, 0xa6, 0x61, 0x98, 0x45, 0x85, 0x1a, 0x4e, 0xd1, 0x83, 0x3e, 0xda, - 0x1e, 0x37, 0xdf, 0x64, 0xeb, 0xc0, 0xed, 0x65, 0x93, 0x27, 0xcd, 0xd6, 0xf5, 0xb5, 0xc5, 0xf5, 0x5c, 0xa6, 0xcb, - 0x29, 0xb8, 0x91, 0x09, 0x1f, 0xe2, 0xbf, 0x6c, 0xc1, 0x64, 0x15, 0x90, 0xfc, 0x81, 0x14, 0xd7, 0xb7, 0xab, 0xab, - 0x5f, 0x65, 0xb9, 0x12, 0xb3, 0x8e, 0xb4, 0x06, 0x5a, 0x07, 0x41, 0xa3, 0xe6, 0x71, 0x21, 0x66, 0xae, 0xe9, 0x68, - 0x57, 0x72, 0x82, 0x0b, 0x50, 0x18, 0x4d, 0xfd, 0xc7, 0x4f, 0xa1, 0x36, 0xf7, 0x1a, 0xe5, 0x08, 0xae, 0x89, 0x62, - 0xf7, 0x9a, 0xb0, 0xdd, 0x82, 0x71, 0xaa, 0x78, 0x87, 0xaa, 0xca, 0x8d, 0xf6, 0xc5, 0x4c, 0x03, 0xa2, 0xca, 0x72, - 0x12, 0xe0, 0x10, 0x6f, 0x16, 0x6e, 0x92, 0xc4, 0xff, 0x1e, 0xbb, 0x48, 0x99, 0x14, 0xfe, 0xb9, 0x22, 0x64, 0xb1, - 0xd0, 0x2f, 0xb7, 0x8e, 0xd8, 0xd4, 0x0d, 0xab, 0xeb, 0x0f, 0x92, 0x99, 0x90, 0x9a, 0x89, 0xb0, 0xa2, 0x66, 0xbe, - 0x05, 0xdc, 0x93, 0x82, 0x89, 0xe7, 0x22, 0x6f, 0x6d, 0xd7, 0xfc, 0x7d, 0xea, 0xb3, 0xc5, 0x47, 0x91, 0x05, 0xd0, - 0x0d, 0x01, 0x02, 0x1a, 0xd7, 0xa7, 0xc5, 0x7a, 0x6f, 0x3b, 0xef, 0x5f, 0xd2, 0x58, 0x74, 0x3b, 0xe3, 0xca, 0x79, - 0xab, 0x68, 0xec, 0xe9, 0x02, 0x28, 0x69, 0xf5, 0xe5, 0xc7, 0x55, 0x3f, 0xbc, 0xdf, 0xc4, 0xad, 0xde, 0xc7, 0xbb, - 0xfe, 0xb5, 0x50, 0x8e, 0x34, 0x7c, 0x3a, 0xa5, 0xe1, 0xe5, 0x4e, 0x35, 0x31, 0x67, 0x3c, 0x2d, 0xaf, 0x5c, 0xd8, - 0x0d, 0xd9, 0xc6, 0xef, 0x7c, 0x68, 0xeb, 0x81, 0x5f, 0x76, 0x98, 0x22, 0x34, 0x27, 0x9b, 0x29, 0x2f, 0x90, 0x98, - 0xeb, 0x9b, 0xad, 0x38, 0xd8, 0x7b, 0x84, 0x36, 0xe1, 0xaf, 0x97, 0x24, 0x2b, 0xc4, 0xa8, 0xc2, 0x41, 0x5e, 0x1e, - 0xf6, 0x29, 0x4c, 0x82, 0xf5, 0x25, 0x3c, 0x04, 0x8a, 0x3e, 0x62, 0x14, 0xcb, 0xf1, 0x16, 0xea, 0x58, 0x8e, 0x83, - 0xde, 0x2c, 0x1f, 0xb5, 0xb1, 0x8b, 0x9f, 0x31, 0xb0, 0x62, 0xab, 0x90, 0xd3, 0x88, 0x35, 0x5b, 0xf8, 0xde, 0xdc, - 0xfa, 0xa1, 0xde, 0x73, 0x37, 0x24, 0x1c, 0x6e, 0x2b, 0xcf, 0x2f, 0xaa, 0x2d, 0x2b, 0xb5, 0x01, 0xde, 0xd2, 0x9d, - 0x79, 0x50, 0x49, 0x9b, 0xf7, 0x44, 0x76, 0x6f, 0x54, 0xf5, 0xd7, 0x4e, 0x16, 0xe2, 0x97, 0xdf, 0x45, 0xdb, 0x59, - 0x0a, 0x22, 0x5c, 0x84, 0x21, 0xd4, 0x56, 0xa5, 0x47, 0x51, 0x9e, 0xba, 0xfd, 0x14, 0x37, 0xa5, 0xdd, 0x06, 0x19, - 0xe9, 0xfe, 0x0d, 0x90, 0x82, 0x5e, 0x80, 0x40, 0x88, 0x7b, 0xd9, 0x1c, 0x0a, 0x98, 0x64, 0x90, 0x40, 0x2f, 0x13, - 0xac, 0x03, 0xfe, 0xa0, 0xe4, 0xbd, 0xed, 0xc0, 0x03, 0xe0, 0x80, 0xc2, 0x61, 0xa4, 0x7c, 0x65, 0x4e, 0x75, 0x46, - 0x66, 0xcb, 0xaa, 0x75, 0x13, 0x8f, 0xa6, 0xeb, 0x0a, 0x9c, 0x37, 0x15, 0x9b, 0x7f, 0x26, 0x0a, 0xdb, 0x4e, 0xc4, - 0xa9, 0x2c, 0x14, 0x98, 0xa8, 0x31, 0x48, 0x4f, 0x0d, 0x96, 0xad, 0x4a, 0xd3, 0xf8, 0x10, 0xcb, 0x6e, 0x1c, 0xa5, - 0xeb, 0x7a, 0x63, 0xe3, 0xcc, 0x41, 0x98, 0xbd, 0xb1, 0xd7, 0xee, 0xf9, 0x96, 0xb5, 0x37, 0xad, 0x0e, 0xc5, 0x63, - 0x65, 0x71, 0x53, 0xf9, 0xf2, 0xcd, 0xb9, 0x31, 0xe5, 0x59, 0xe6, 0x1c, 0xc2, 0x5a, 0xf0, 0xdf, 0xb0, 0x1b, 0x36, - 0x6d, 0x2c, 0xf9, 0x72, 0x5f, 0x10, 0xc1, 0xee, 0x92, 0xbd, 0xc6, 0xec, 0xb2, 0xa4, 0x0a, 0x43, 0xf0, 0xce, 0x67, - 0x2a, 0x11, 0xcb, 0x1f, 0x51, 0x94, 0x6f, 0x3c, 0xb6, 0xfb, 0xc2, 0x2a, 0xc1, 0xb0, 0x5e, 0x13, 0x78, 0xe1, 0x79, - 0x4b, 0x49, 0x8b, 0x49, 0x79, 0x59, 0x66, 0xf7, 0xcb, 0xee, 0xca, 0x0d, 0xc2, 0xc3, 0xbd, 0xa4, 0x15, 0x62, 0x18, - 0x35, 0x95, 0x2a, 0x70, 0x31, 0x22, 0xea, 0x98, 0xa7, 0xdb, 0xb2, 0xc4, 0x2f, 0x4d, 0x25, 0x49, 0x2d, 0x74, 0x6b, - 0x07, 0x87, 0xdf, 0x59, 0xd2, 0x44, 0x88, 0x2d, 0x28, 0x5e, 0x77, 0x48, 0x60, 0xe7, 0x9c, 0x52, 0xbe, 0x9f, 0x3f, - 0xca, 0x2c, 0x19, 0x5e, 0x95, 0x03, 0x55, 0xc8, 0xce, 0x0c, 0x19, 0xad, 0xb8, 0xeb, 0x44, 0x12, 0xf4, 0x2e, 0x12, - 0x83, 0x15, 0xc2, 0x7e, 0x28, 0xca, 0x12, 0xfd, 0x80, 0x57, 0x93, 0x1b, 0x78, 0x11, 0x58, 0x75, 0xe5, 0xb1, 0x53, - 0x12, 0xe4, 0x00, 0xf9, 0x49, 0x70, 0xd6, 0xc3, 0x4c, 0xee, 0x8e, 0x40, 0x04, 0x8f, 0x77, 0x32, 0x11, 0xd0, 0x06, - 0xf2, 0x55, 0x5d, 0xdc, 0x89, 0x44, 0x15, 0x82, 0xbf, 0x24, 0x77, 0xf4, 0x6e, 0xab, 0x34, 0x1a, 0xed, 0x6c, 0x28, - 0x4c, 0xdc, 0xc6, 0x75, 0xe3, 0x1d, 0x2f, 0x98, 0xa3, 0xcd, 0xe8, 0xae, 0x58, 0x9e, 0xe7, 0xcd, 0x4d, 0x69, 0x04, - 0x4b, 0xea, 0x2b, 0xcc, 0x4b, 0xb3, 0x56, 0x74, 0x64, 0x6c, 0x11, 0x24, 0x06, 0xcc, 0x69, 0x67, 0xc9, 0x62, 0xf5, - 0xdb, 0x58, 0x8b, 0x1c, 0x47, 0x58, 0x96, 0x04, 0x10, 0xcd, 0x0b, 0x91, 0x17, 0x43, 0x8e, 0xa3, 0x25, 0xaa, 0x14, - 0x18, 0x73, 0x8b, 0x18, 0x76, 0xb1, 0xc9, 0xc9, 0x6d, 0x69, 0xa4, 0x68, 0xf8, 0x26, 0xa7, 0xa7, 0xf7, 0xd6, 0xf0, - 0xda, 0x88, 0x64, 0xe4, 0x60, 0x7b, 0x2e, 0xb7, 0x25, 0xac, 0xf2, 0x53, 0xbf, 0x5b, 0x6b, 0x15, 0x2d, 0x97, 0xe3, - 0x60, 0xb4, 0xd7, 0x92, 0x45, 0xbb, 0x01, 0x35, 0x7f, 0xc9, 0xba, 0x87, 0x8c, 0x35, 0xda, 0xb0, 0xd5, 0x41, 0x5d, - 0x88, 0x73, 0x3e, 0xf6, 0x15, 0xfe, 0x46, 0x9e, 0xc0, 0x4c, 0x53, 0x72, 0x91, 0xff, 0xbe, 0xbf, 0x54, 0x25, 0xf9, - 0xeb, 0x60, 0x27, 0x3c, 0x16, 0x6a, 0x64, 0xbf, 0x57, 0x13, 0x33, 0x99, 0x61, 0x87, 0xf7, 0x09, 0xb8, 0x42, 0x7c, - 0x31, 0xc0, 0xce, 0x2c, 0x9d, 0x4b, 0xda, 0xa9, 0x8c, 0x19, 0x97, 0xe2, 0x38, 0x93, 0x26, 0x1b, 0x5b, 0x53, 0x7f, - 0x7b, 0x89, 0x55, 0x4b, 0x9e, 0x5a, 0x9f, 0x5b, 0x5f, 0xe3, 0xe3, 0x1c, 0xf2, 0xd6, 0x87, 0x19, 0xff, 0x64, 0x2b, - 0x4c, 0xd8, 0x3b, 0xa2, 0x45, 0xb0, 0x63, 0xa3, 0x81, 0x9f, 0xde, 0x8b, 0xa3, 0x65, 0x09, 0xda, 0x3f, 0x80, 0x55, - 0x5d, 0x85, 0x9c, 0xc9, 0xf0, 0xf3, 0xa4, 0x91, 0x58, 0x24, 0xc5, 0x02, 0x38, 0xdf, 0xab, 0xd9, 0xef, 0xd5, 0xeb, - 0x93, 0xd5, 0x64, 0xc8, 0xa8, 0xb3, 0xa4, 0x2e, 0xd4, 0x9f, 0x5d, 0xdf, 0x36, 0x75, 0x1d, 0x9c, 0x88, 0xeb, 0x4f, - 0xd0, 0xb6, 0x75, 0xc7, 0xd0, 0x9c, 0xa0, 0xa6, 0x3c, 0x53, 0x1c, 0xeb, 0x4e, 0xbf, 0x19, 0x8f, 0x6c, 0x6e, 0x3e, - 0xda, 0x44, 0x36, 0x5e, 0x8c, 0xc4, 0x16, 0x5e, 0xe8, 0x05, 0xd0, 0xa2, 0xbe, 0xc7, 0x42, 0xfc, 0xe4, 0xe8, 0x19, - 0x4e, 0x60, 0x04, 0x72, 0x2d, 0x64, 0xa0, 0xa4, 0x27, 0x1a, 0xb6, 0x55, 0x73, 0x0e, 0x07, 0x2f, 0x3f, 0xb1, 0x2d, - 0x79, 0x44, 0x07, 0x75, 0x86, 0xfe, 0x4a, 0x3e, 0xdb, 0x4f, 0x15, 0xef, 0x30, 0xd5, 0xf6, 0xeb, 0x72, 0x9c, 0x35, - 0xd3, 0x79, 0xd7, 0x90, 0x85, 0xe8, 0xf9, 0x60, 0x7b, 0x86, 0xd4, 0xb1, 0x8a, 0x56, 0xcd, 0xe2, 0xf5, 0xf0, 0xee, - 0x91, 0x25, 0x66, 0xeb, 0x76, 0x67, 0x74, 0xd8, 0x41, 0x50, 0x43, 0x0c, 0xd6, 0x6d, 0x21, 0x91, 0x19, 0x25, 0xc7, - 0xba, 0x10, 0x1f, 0xc1, 0x0d, 0x41, 0x29, 0xf4, 0xb0, 0x97, 0xd2, 0x4a, 0x3f, 0xea, 0x22, 0x19, 0x26, 0x83, 0x47, - 0xb3, 0x5b, 0x36, 0xd7, 0x62, 0x17, 0x55, 0xfd, 0xb3, 0xec, 0xda, 0x15, 0xf4, 0xd1, 0x14, 0x75, 0x42, 0x0d, 0x22, - 0x90, 0xde, 0xca, 0xdf, 0xe2, 0xf8, 0x92, 0x6e, 0x5c, 0xbf, 0x1e, 0xde, 0x84, 0xcc, 0xf9, 0x00, 0x0e, 0x00, 0xd3, - 0xc9, 0xfb, 0x77, 0x0e, 0x25, 0x55, 0x85, 0x46, 0x5a, 0xdf, 0x91, 0x1b, 0x6c, 0xc7, 0xe4, 0x21, 0x3a, 0xbe, 0x76, - 0x33, 0x40, 0x80, 0x36, 0x16, 0xfa, 0x1c, 0x5a, 0x6f, 0x24, 0xad, 0x04, 0x4b, 0xa0, 0xb3, 0xfa, 0xa1, 0xa5, 0xf0, - 0xd2, 0x90, 0x98, 0xfa, 0x0d, 0x96, 0x45, 0xa2, 0x24, 0xe6, 0xcf, 0xc2, 0x2b, 0xdb, 0xaa, 0xf0, 0x30, 0xc6, 0x0a, - 0xd0, 0x86, 0x58, 0xfb, 0x15, 0xbb, 0x22, 0xb0, 0xf0, 0xde, 0x12, 0xc0, 0xbb, 0x66, 0x8e, 0x02, 0x01, 0xc7, 0x2b, - 0x1c, 0x44, 0x1a, 0x8c, 0x3f, 0x5b, 0x89, 0x23, 0x47, 0x9a, 0xd5, 0x47, 0xef, 0xdb, 0xfd, 0x69, 0x8a, 0x47, 0xea, - 0x1c, 0xb7, 0x9e, 0x64, 0x81, 0x3f, 0xec, 0x9e, 0x0b, 0x2f, 0xac, 0xc8, 0x5e, 0xf6, 0x77, 0xf7, 0x92, 0xc5, 0x4d, - 0x2f, 0xf1, 0x55, 0x2f, 0x93, 0xeb, 0x95, 0x43, 0x0d, 0x6a, 0x60, 0xf3, 0x7d, 0x8f, 0xaa, 0x82, 0xdc, 0x80, 0xbf, - 0x77, 0xf3, 0x11, 0xc6, 0xb5, 0x0b, 0x9c, 0xe3, 0x52, 0x3d, 0xcc, 0x45, 0xcc, 0xa8, 0xa4, 0x76, 0x94, 0x5c, 0x40, - 0xaa, 0x93, 0x94, 0x0b, 0x32, 0xac, 0x5c, 0xa0, 0xb7, 0xfa, 0x14, 0xaf, 0x9c, 0x2d, 0x4d, 0x82, 0x28, 0xea, 0xb9, - 0x7b, 0x85, 0x0a, 0xc1, 0x7f, 0x1d, 0xc8, 0x8c, 0x29, 0x2b, 0x30, 0x57, 0x13, 0xea, 0x30, 0x4b, 0x26, 0xbc, 0x3c, - 0x8a, 0xe1, 0xc5, 0x08, 0x32, 0x6d, 0xa9, 0x22, 0xaa, 0xdf, 0x43, 0xdf, 0xa4, 0x68, 0x56, 0xa3, 0x10, 0x73, 0x8e, - 0x25, 0x15, 0x5c, 0xaf, 0xea, 0x10, 0x7e, 0x44, 0xad, 0xee, 0x15, 0x8e, 0xeb, 0x9c, 0x31, 0xb9, 0xf3, 0xad, 0x07, - 0x9c, 0x9e, 0xc7, 0xe9, 0x01, 0xb9, 0x6d, 0x2a, 0xa2, 0xfa, 0x18, 0x0f, 0x43, 0x58, 0xab, 0x59, 0x66, 0x08, 0x99, - 0xb7, 0x0d, 0xc5, 0xaf, 0x84, 0x66, 0xf3, 0x67, 0x57, 0x43, 0xf2, 0x79, 0xf1, 0xc4, 0x8d, 0xeb, 0x54, 0xc5, 0x12, - 0x93, 0xbc, 0x08, 0x2b, 0xcc, 0xe1, 0xb2, 0x37, 0x63, 0xd1, 0xf9, 0xc9, 0x79, 0x08, 0x09, 0x58, 0x94, 0x8f, 0x68, - 0xed, 0x19, 0x50, 0x50, 0x2d, 0xc7, 0xa9, 0x5a, 0x03, 0xc6, 0xf6, 0x3c, 0x78, 0x4b, 0xf9, 0x2f, 0xdb, 0x03, 0xd4, - 0x93, 0xed, 0x9c, 0x62, 0x30, 0x86, 0xf0, 0x94, 0x6e, 0x03, 0x9c, 0x90, 0xca, 0x16, 0x0e, 0xaa, 0xf5, 0x37, 0x37, - 0x2f, 0xb4, 0x81, 0x12, 0x7f, 0x49, 0x91, 0xd6, 0x8a, 0x14, 0x8f, 0x30, 0x34, 0x05, 0x9f, 0xf1, 0xd8, 0x93, 0x78, - 0xcf, 0xdd, 0x97, 0x35, 0x22, 0x05, 0x71, 0x2e, 0xfc, 0x85, 0x08, 0x2b, 0x47, 0x88, 0x79, 0xca, 0x0d, 0x95, 0x64, - 0x5f, 0xda, 0xb3, 0xfa, 0x2a, 0x0b, 0x78, 0xea, 0xb2, 0x4f, 0xe1, 0x85, 0xc0, 0x1c, 0xae, 0x3d, 0x7a, 0x52, 0x3f, - 0x9a, 0x01, 0xab, 0x7a, 0x6e, 0x31, 0x8d, 0x50, 0x51, 0xb8, 0x84, 0x20, 0x6e, 0x29, 0x41, 0x84, 0x61, 0x66, 0x8d, - 0x87, 0x4f, 0x0c, 0xeb, 0x29, 0x0c, 0x00, 0xa6, 0xa4, 0xa1, 0x7b, 0x86, 0x32, 0x81, 0x7b, 0x69, 0x17, 0x28, 0xcf, - 0x5c, 0x65, 0x5e, 0x4e, 0xee, 0x31, 0x0c, 0x9c, 0xcc, 0xd6, 0x16, 0xd3, 0xc8, 0x88, 0xac, 0x03, 0x2d, 0xd4, 0x91, - 0xbf, 0x57, 0x2b, 0x2b, 0xbb, 0x6e, 0x02, 0xdd, 0x8b, 0x7a, 0x2f, 0xfd, 0x22, 0x42, 0xdc, 0x5e, 0xa5, 0xa7, 0x80, - 0x69, 0xf8, 0x14, 0xf7, 0x33, 0xa9, 0x10, 0x78, 0x15, 0xf4, 0x3c, 0x90, 0xc8, 0x1e, 0xe2, 0x0e, 0xea, 0x06, 0x00, - 0x92, 0x5b, 0xe2, 0x4a, 0x41, 0x5a, 0x1b, 0x52, 0x25, 0xeb, 0x3f, 0xb5, 0xd5, 0x28, 0x01, 0xc8, 0x47, 0xf6, 0xcd, - 0x91, 0xc6, 0x2b, 0x08, 0x2d, 0x5c, 0x48, 0x39, 0xcc, 0xe0, 0x51, 0x13, 0x74, 0x22, 0x33, 0xc1, 0xe6, 0x56, 0xb0, - 0x8d, 0x9f, 0xbc, 0x79, 0x1d, 0x89, 0x0a, 0xd3, 0x8f, 0xe2, 0xdf, 0xab, 0x3b, 0x6e, 0x8a, 0xb2, 0xe2, 0x21, 0xf7, - 0xfd, 0x1c, 0x3f, 0x37, 0x45, 0x49, 0x9a, 0x13, 0xbe, 0x54, 0x32, 0x9d, 0xb4, 0x17, 0x47, 0x6d, 0x8e, 0x96, 0x3d, - 0x00, 0x79, 0xc5, 0x4b, 0x60, 0xdd, 0x63, 0xe5, 0xbb, 0x96, 0x56, 0x99, 0xf9, 0x88, 0xaa, 0x2a, 0x2a, 0x24, 0x9a, - 0xe0, 0x22, 0xb3, 0x26, 0xb6, 0x71, 0x5a, 0x1c, 0x06, 0x90, 0x42, 0x63, 0x58, 0x31, 0xe4, 0xa1, 0xf9, 0xb1, 0x98, - 0x17, 0xe1, 0x89, 0x2c, 0xba, 0x2e, 0x28, 0xe5, 0x67, 0x48, 0x69, 0xa6, 0x8c, 0x6c, 0x8b, 0x65, 0x38, 0x9c, 0x01, - 0xc0, 0x5c, 0xeb, 0x88, 0xa8, 0x54, 0x98, 0xec, 0x98, 0x54, 0xc6, 0x5e, 0xc9, 0x9f, 0xa5, 0x84, 0x88, 0x08, 0xab, - 0xb3, 0x6d, 0x03, 0x62, 0x77, 0x0e, 0xea, 0x11, 0x9e, 0x2d, 0x33, 0xd8, 0xc4, 0xb2, 0x08, 0xce, 0x8a, 0xaa, 0xaa, - 0x46, 0xa3, 0xf9, 0xb0, 0x37, 0x34, 0xde, 0x64, 0xee, 0x0c, 0x85, 0xb0, 0x75, 0x3b, 0x42, 0x50, 0x6e, 0x3c, 0xdb, - 0x86, 0xd6, 0x86, 0x0f, 0x33, 0x37, 0xf5, 0x41, 0x5e, 0x2e, 0xa2, 0xaa, 0xd1, 0x66, 0xcf, 0x53, 0xca, 0xd3, 0x68, - 0xef, 0xa9, 0x3b, 0x29, 0x09, 0x95, 0xdd, 0x24, 0x2a, 0x0a, 0x6c, 0xe1, 0x59, 0x12, 0x12, 0x40, 0x71, 0xfb, 0xeb, - 0x50, 0x83, 0xfc, 0x8b, 0x91, 0x83, 0x03, 0x5f, 0xd5, 0x81, 0xb5, 0x2b, 0x20, 0xcd, 0xcf, 0x64, 0xd2, 0x5b, 0x7c, - 0xef, 0x6e, 0xe8, 0xc3, 0x47, 0x91, 0x22, 0xdc, 0x47, 0x68, 0x1d, 0x27, 0x21, 0x6e, 0x01, 0xf7, 0x9b, 0x6d, 0x2f, - 0x3e, 0x6a, 0x3a, 0x41, 0x66, 0x68, 0x5c, 0x1b, 0x2f, 0x9b, 0x56, 0xa4, 0x16, 0x28, 0x54, 0x20, 0x1f, 0xe9, 0x7e, - 0x2b, 0x01, 0x29, 0xc7, 0xa9, 0xdc, 0x76, 0xaf, 0x93, 0xf2, 0x1c, 0xee, 0x86, 0x8a, 0xe8, 0x75, 0x3d, 0xda, 0x12, - 0xd0, 0x62, 0x4e, 0x06, 0x7e, 0x3a, 0x5a, 0x45, 0xbe, 0x9c, 0x38, 0xc5, 0x39, 0x55, 0x2d, 0xd6, 0x3c, 0xf8, 0x78, - 0x97, 0x07, 0xc2, 0xfe, 0x92, 0x8c, 0x93, 0x31, 0x00, 0x59, 0xc5, 0x02, 0x73, 0xe0, 0x40, 0xed, 0x36, 0x27, 0x6a, - 0x03, 0x0e, 0xd4, 0xea, 0xce, 0x9e, 0xa6, 0x32, 0xd9, 0xa7, 0x94, 0xe3, 0x57, 0xf8, 0x82, 0xa5, 0xac, 0x46, 0xda, - 0x8a, 0x6a, 0x79, 0xae, 0xa5, 0x05, 0x50, 0x4b, 0x65, 0xa9, 0x6c, 0x29, 0xa4, 0x18, 0xdf, 0xec, 0xf1, 0x31, 0x12, - 0xba, 0x52, 0x3c, 0x4f, 0x2e, 0x03, 0xed, 0xf2, 0x37, 0x9e, 0xc2, 0x74, 0xc6, 0x04, 0xa6, 0xa9, 0x89, 0x2b, 0xb2, - 0x79, 0xff, 0xfe, 0xda, 0xa9, 0xb6, 0xec, 0x48, 0xaa, 0x40, 0xda, 0x2c, 0x76, 0x74, 0x69, 0x4c, 0x81, 0xe0, 0xaa, - 0xa1, 0xdb, 0xe2, 0x68, 0x77, 0xfe, 0xe1, 0xce, 0x2c, 0xa4, 0x6b, 0xa2, 0x1c, 0x49, 0xe4, 0xc7, 0xa5, 0x10, 0x50, - 0xa3, 0xbe, 0x10, 0x4e, 0xa4, 0xfe, 0xc8, 0x90, 0x4b, 0x17, 0xb3, 0x43, 0x6b, 0x54, 0xd7, 0x2d, 0x00, 0x2d, 0x7d, - 0x0f, 0x23, 0x43, 0x21, 0x6c, 0xc4, 0xb0, 0xcf, 0x53, 0xea, 0xe3, 0xca, 0x49, 0x17, 0x5d, 0x62, 0x29, 0x64, 0xde, - 0xc7, 0x24, 0x6f, 0x92, 0x46, 0x89, 0xc8, 0xeb, 0x2c, 0xe5, 0xa4, 0x2e, 0x4e, 0xe2, 0x28, 0x6f, 0x29, 0x64, 0x20, - 0xd5, 0x4d, 0x2a, 0xdd, 0x96, 0x4b, 0x25, 0xf4, 0x58, 0xf6, 0xb7, 0xe4, 0x06, 0xaf, 0xfb, 0x72, 0x1c, 0xfc, 0x31, - 0xf2, 0xcf, 0x13, 0x5b, 0x2c, 0x45, 0x07, 0xd0, 0x83, 0x20, 0xa5, 0x35, 0x40, 0xc2, 0xcf, 0xeb, 0x5b, 0xdf, 0x09, - 0xbe, 0x76, 0x04, 0xb4, 0x42, 0xb0, 0x72, 0xbd, 0x0a, 0x35, 0xdd, 0x5e, 0x36, 0x56, 0x65, 0x54, 0x75, 0xb0, 0x83, - 0x68, 0x89, 0x24, 0x04, 0xf8, 0x9c, 0xbc, 0x43, 0xea, 0x87, 0x9a, 0x74, 0xeb, 0x4b, 0xbe, 0x88, 0xd6, 0xb5, 0x92, - 0x67, 0x04, 0x57, 0xdf, 0xa8, 0xc9, 0xc2, 0xad, 0xe3, 0x27, 0x51, 0xd7, 0x4e, 0xd5, 0x15, 0x31, 0x07, 0x04, 0x98, - 0xaa, 0x86, 0x11, 0x75, 0x9f, 0x24, 0xc9, 0xbf, 0xc4, 0x54, 0x80, 0x0a, 0x96, 0x49, 0xbd, 0xfa, 0xbf, 0x6f, 0xb5, - 0xee, 0x7f, 0xbc, 0xc1, 0xba, 0x9a, 0xe7, 0xb7, 0x77, 0x7a, 0x00, 0x30, 0x80, 0x1f, 0x83, 0xaa, 0x0e, 0x5e, 0x6e, - 0xc7, 0x0b, 0xbb, 0x32, 0x05, 0xa9, 0x09, 0xf8, 0xac, 0x92, 0xfe, 0xcf, 0x91, 0x06, 0x82, 0xe6, 0x6b, 0x64, 0x6d, - 0x6c, 0x46, 0x24, 0x72, 0xdf, 0x65, 0x83, 0x8f, 0x57, 0xe1, 0xd9, 0x11, 0xf8, 0x65, 0x6c, 0x9d, 0xd3, 0x31, 0xcb, - 0x07, 0x09, 0x2c, 0x17, 0x6a, 0xbf, 0x7a, 0xcc, 0xf9, 0x44, 0x88, 0x53, 0x54, 0xa8, 0x27, 0xa8, 0x08, 0x32, 0x81, - 0x62, 0x91, 0x96, 0xa8, 0xe3, 0x2a, 0xce, 0x11, 0x16, 0x10, 0x5a, 0xa7, 0x44, 0x44, 0xbc, 0x1d, 0xd0, 0x11, 0xbc, - 0xad, 0x21, 0x27, 0xee, 0x38, 0x37, 0x6b, 0x1b, 0x98, 0xcb, 0x20, 0xd5, 0xa0, 0xe9, 0xee, 0x0b, 0x6c, 0xc0, 0x43, - 0x9c, 0x37, 0x8e, 0x4f, 0xe2, 0x72, 0x8b, 0x2c, 0x72, 0x0e, 0x45, 0x5d, 0x5e, 0xd4, 0xc8, 0xc4, 0x24, 0xa1, 0x0e, - 0x4f, 0x21, 0xa4, 0xdb, 0x17, 0x30, 0x98, 0x16, 0x4c, 0xe3, 0xac, 0x4e, 0x12, 0xc0, 0x2d, 0x9f, 0xde, 0x0f, 0xc3, - 0x97, 0x1e, 0x6a, 0x07, 0xd1, 0xb9, 0x88, 0xf8, 0x4d, 0xdb, 0xd4, 0x28, 0x4c, 0x1e, 0xae, 0xad, 0xef, 0xa9, 0xe1, - 0x23, 0x24, 0xe1, 0x5f, 0xc3, 0xa2, 0x08, 0x48, 0xdc, 0xa6, 0xb7, 0x5c, 0x30, 0xe9, 0x9d, 0x66, 0x21, 0xb4, 0xd9, - 0x0c, 0x52, 0xa5, 0x6a, 0x3e, 0xc0, 0xca, 0xb4, 0xd3, 0xff, 0xe4, 0xe4, 0xb6, 0x24, 0x05, 0x41, 0xb4, 0xd2, 0xef, - 0x4c, 0x99, 0xb0, 0xc6, 0x98, 0x40, 0xde, 0x15, 0x25, 0x9c, 0x67, 0xd0, 0x49, 0x2c, 0x00, 0x3b, 0x5a, 0x7f, 0x2f, - 0xff, 0x0e, 0x8b, 0xd1, 0xa9, 0xd1, 0x9b, 0x4e, 0x92, 0xa9, 0xd6, 0x7f, 0x7b, 0x00, 0x7f, 0x9c, 0x81, 0xb5, 0x3e, - 0x77, 0x81, 0xb5, 0xdb, 0x4d, 0x12, 0x52, 0xba, 0x25, 0xaf, 0xaa, 0xaf, 0x62, 0xdd, 0xa4, 0x54, 0xee, 0x67, 0xbf, - 0xbf, 0xbd, 0xd8, 0x32, 0x82, 0xc3, 0x3a, 0xa7, 0x18, 0x58, 0x80, 0x0d, 0x73, 0x19, 0x6e, 0x56, 0x3b, 0x81, 0xa0, - 0xa4, 0x97, 0xe4, 0xc3, 0x36, 0x43, 0xb2, 0xe3, 0x53, 0x2d, 0x91, 0xd0, 0x33, 0x9e, 0xf6, 0x35, 0x80, 0xc0, 0xbb, - 0x73, 0x93, 0xd2, 0x7a, 0xf3, 0x19, 0x79, 0xaf, 0x4a, 0x14, 0x91, 0x61, 0x4a, 0x8c, 0x67, 0x4e, 0x08, 0xd2, 0x7e, - 0xcd, 0x60, 0x6b, 0xbf, 0x19, 0x3c, 0x8d, 0x9b, 0x87, 0xe6, 0x88, 0x20, 0x72, 0x31, 0x7d, 0x90, 0xc2, 0x9f, 0x25, - 0xe3, 0xf2, 0x85, 0xcf, 0x6c, 0xc3, 0x75, 0x5a, 0x49, 0x80, 0x73, 0x8a, 0xbb, 0x79, 0xca, 0x33, 0xb1, 0x58, 0x9e, - 0xbc, 0x7c, 0xb5, 0xac, 0xd2, 0x14, 0x38, 0x83, 0x0f, 0x71, 0x19, 0xa9, 0x34, 0xc8, 0x94, 0x14, 0x3f, 0x9e, 0x27, - 0x93, 0x6e, 0x6f, 0x6a, 0x95, 0xb0, 0xab, 0x06, 0x87, 0xea, 0x13, 0x2a, 0x4b, 0x4f, 0xdb, 0x52, 0x0b, 0xcc, 0x63, - 0x1f, 0x04, 0x98, 0x7c, 0x93, 0x7d, 0xcc, 0xda, 0x11, 0x74, 0x0f, 0x4a, 0xe5, 0x32, 0x1e, 0x06, 0xb8, 0xa9, 0x82, - 0x00, 0xd2, 0xc7, 0x7a, 0x0a, 0x73, 0x79, 0x8f, 0x89, 0x0e, 0x8b, 0x1e, 0x46, 0xa0, 0x2e, 0xd4, 0xc2, 0x08, 0xcc, - 0x90, 0x07, 0x53, 0xb1, 0x74, 0xe2, 0x4f, 0x37, 0xd8, 0xfa, 0xdc, 0x8f, 0x73, 0x4d, 0xbb, 0x63, 0x96, 0x06, 0x48, - 0xaa, 0xa3, 0xee, 0x37, 0xfa, 0x46, 0x3d, 0x9e, 0x75, 0x8b, 0xf7, 0x69, 0x33, 0xa6, 0xbd, 0xa9, 0x3c, 0x1e, 0x55, - 0xdb, 0xef, 0xdf, 0x16, 0x97, 0xa8, 0x96, 0x92, 0xa5, 0x3d, 0xc8, 0xbe, 0x3b, 0xa3, 0x00, 0xb7, 0xef, 0x78, 0x13, - 0x1e, 0x20, 0xcf, 0x91, 0x4e, 0xcc, 0x6d, 0xd8, 0x53, 0x9d, 0x03, 0xed, 0xfc, 0xe7, 0x47, 0xa9, 0xb0, 0xf3, 0xf7, - 0xa7, 0x61, 0xe9, 0x3d, 0x49, 0x18, 0x05, 0x8e, 0xd2, 0xef, 0xde, 0x77, 0x59, 0xad, 0xf4, 0x71, 0x81, 0xcb, 0x9d, - 0xd7, 0x56, 0x9c, 0x78, 0xb1, 0x61, 0x3d, 0x25, 0x8f, 0x63, 0x14, 0x63, 0x6f, 0x7a, 0xb2, 0xee, 0x8c, 0xdd, 0x3d, - 0x85, 0xb5, 0x67, 0x3d, 0x25, 0x48, 0xb7, 0x92, 0x1f, 0xf7, 0xfe, 0x23, 0xb6, 0x53, 0x25, 0xdd, 0xf4, 0x07, 0xdb, - 0x2f, 0x3f, 0x3a, 0x3b, 0x88, 0x07, 0xad, 0xb3, 0x32, 0x9d, 0xa5, 0xeb, 0x2a, 0xe9, 0x72, 0xb8, 0x40, 0xde, 0xcd, - 0xc4, 0x73, 0x61, 0xae, 0xbf, 0xce, 0x36, 0x42, 0x05, 0xf6, 0xe5, 0x6a, 0xbc, 0xbd, 0x47, 0xcc, 0xe7, 0x72, 0x2e, - 0xfb, 0xde, 0xa2, 0x29, 0x04, 0x7d, 0x8b, 0x91, 0x72, 0xc1, 0x38, 0x4e, 0x90, 0x0f, 0xb8, 0x34, 0xde, 0x07, 0xb4, - 0x18, 0xa3, 0x5b, 0xf8, 0x79, 0x0c, 0xdb, 0x03, 0x6c, 0xcd, 0xfc, 0x73, 0xc2, 0x63, 0x5e, 0x88, 0x30, 0x4d, 0x1e, - 0x50, 0x53, 0xb2, 0x81, 0x0f, 0x36, 0x9c, 0x9f, 0x15, 0x12, 0xc3, 0x00, 0xcb, 0x23, 0x4f, 0xa7, 0x8d, 0xec, 0x69, - 0xa8, 0x2e, 0xcf, 0x73, 0xb5, 0xde, 0x82, 0x9e, 0x30, 0x9d, 0xe5, 0x65, 0x1a, 0xee, 0xd2, 0x3b, 0x13, 0xec, 0x70, - 0xb9, 0x6b, 0x38, 0x69, 0x99, 0x22, 0x55, 0x8e, 0xf3, 0xc6, 0x71, 0x9a, 0x33, 0x06, 0xe2, 0x29, 0xe6, 0xf5, 0xeb, - 0x54, 0x60, 0xd1, 0x62, 0x5c, 0xbe, 0x40, 0x69, 0x60, 0xea, 0x2f, 0x36, 0x32, 0x53, 0xa1, 0x75, 0x00, 0x31, 0x59, - 0x82, 0x3f, 0x1b, 0xa4, 0xb4, 0xa0, 0x10, 0x8d, 0x0a, 0xb7, 0xd5, 0x3f, 0xdc, 0x15, 0xb5, 0x4a, 0x13, 0xd1, 0xee, - 0x5d, 0xf1, 0xce, 0x10, 0xdb, 0xc5, 0x5b, 0x4e, 0x07, 0x50, 0x8c, 0x1a, 0x1d, 0xd0, 0xa4, 0x60, 0x7b, 0xb4, 0xfe, - 0x26, 0x29, 0xe5, 0x79, 0x66, 0x44, 0xf6, 0x58, 0xc0, 0xfa, 0x6e, 0x70, 0x18, 0x5b, 0x5b, 0x55, 0x58, 0xef, 0x9b, - 0x36, 0xc1, 0x1c, 0x80, 0xfd, 0x96, 0x44, 0xf1, 0xde, 0x27, 0x7f, 0x49, 0x8c, 0xd1, 0xf5, 0x3d, 0x17, 0x59, 0x7a, - 0x63, 0x28, 0x26, 0x48, 0xae, 0x69, 0x56, 0xc9, 0xe2, 0x18, 0x8d, 0x46, 0x41, 0xc9, 0x39, 0x31, 0x8e, 0x50, 0x36, - 0x40, 0x3d, 0x4d, 0x49, 0xe9, 0x02, 0x40, 0x66, 0x58, 0x4d, 0x0f, 0x0a, 0x60, 0x19, 0x8d, 0xb4, 0x40, 0xe5, 0x59, - 0x74, 0x14, 0xee, 0x79, 0x72, 0x9a, 0x6b, 0x66, 0xd5, 0xe0, 0xf0, 0x96, 0x07, 0x8a, 0xca, 0x79, 0x7a, 0x36, 0x99, - 0x8f, 0xe8, 0x20, 0xd2, 0x6b, 0x1a, 0xff, 0xb6, 0xaf, 0x44, 0x74, 0x70, 0x1b, 0x09, 0x16, 0x9c, 0xfd, 0x90, 0x93, - 0x21, 0x72, 0x7f, 0xb5, 0xce, 0xf4, 0x83, 0x0a, 0xfd, 0x6e, 0x35, 0x84, 0x48, 0xf9, 0x4a, 0xd8, 0xd8, 0x94, 0x3b, - 0x35, 0xe8, 0xbc, 0xd3, 0x30, 0x91, 0xa1, 0x70, 0x7c, 0xcf, 0x6d, 0xe9, 0x13, 0x6d, 0x56, 0x37, 0xce, 0xfc, 0xe3, - 0x01, 0x3f, 0x59, 0x9a, 0x22, 0x68, 0x4d, 0xa5, 0x4e, 0x07, 0xe8, 0x96, 0x48, 0x83, 0xa3, 0x7c, 0x60, 0x5e, 0x78, - 0xd0, 0x52, 0xbb, 0xa1, 0x44, 0x57, 0x74, 0x14, 0xee, 0x91, 0xe7, 0x02, 0x1a, 0x67, 0x0a, 0xba, 0x1e, 0x71, 0x54, - 0x3b, 0x63, 0x28, 0xc5, 0x1c, 0x0c, 0xe6, 0x50, 0xd6, 0x64, 0x8d, 0x7d, 0x6c, 0xbd, 0x44, 0x77, 0xe3, 0x19, 0x22, - 0xd7, 0x13, 0x1a, 0x87, 0xa4, 0xeb, 0x99, 0x91, 0xc2, 0x30, 0x84, 0x77, 0x40, 0xf2, 0xee, 0xc4, 0xfa, 0x5c, 0xa9, - 0xa4, 0x1d, 0x69, 0x63, 0x60, 0x17, 0xcf, 0x62, 0xb6, 0xb0, 0x22, 0x3b, 0x71, 0x6d, 0xbd, 0xb6, 0x76, 0xfd, 0x15, - 0xa2, 0xc2, 0x78, 0x6c, 0xeb, 0x70, 0x9e, 0x33, 0x72, 0xc5, 0x0d, 0x13, 0x3f, 0xcb, 0xae, 0xcf, 0x3c, 0x95, 0xf4, - 0x5f, 0x84, 0xd6, 0x4f, 0x5d, 0x71, 0x81, 0x75, 0xb7, 0x4d, 0xec, 0xfa, 0x75, 0x4a, 0x6a, 0x5d, 0xb9, 0x0b, 0xfd, - 0x8f, 0xad, 0xed, 0x58, 0x6d, 0xe6, 0x69, 0xde, 0x7f, 0xe8, 0x44, 0x1d, 0xe4, 0x9f, 0x7e, 0xb5, 0x1b, 0xb9, 0x91, - 0x16, 0x2f, 0xc9, 0xc7, 0xbb, 0x9e, 0xe6, 0x0b, 0x1e, 0xfb, 0xf3, 0x66, 0xd8, 0xf3, 0x32, 0xbf, 0x16, 0xec, 0xcf, - 0xd3, 0xd9, 0x67, 0x8e, 0x1e, 0xdf, 0x1f, 0xd2, 0xc4, 0xa3, 0xe9, 0xf3, 0xe4, 0xcf, 0xe4, 0x5c, 0x24, 0x8f, 0xc9, - 0x5e, 0xf5, 0xb6, 0xed, 0x22, 0xa5, 0x11, 0xa0, 0x8e, 0xde, 0xac, 0xdf, 0x85, 0x74, 0x4d, 0x32, 0x15, 0x0f, 0xca, - 0xa7, 0x7c, 0x20, 0xbe, 0xae, 0xbf, 0x4c, 0xf7, 0x50, 0x88, 0x78, 0x11, 0xf8, 0xef, 0xf9, 0xfe, 0x23, 0xb6, 0x59, - 0x57, 0x5a, 0x9d, 0xcd, 0x8d, 0x1e, 0xba, 0x7d, 0x75, 0x32, 0xf5, 0x89, 0x94, 0x51, 0x7a, 0x5d, 0x88, 0x97, 0x18, - 0x17, 0x37, 0xf9, 0x21, 0xdb, 0x7e, 0x18, 0x9f, 0xd7, 0xf8, 0x81, 0x08, 0x8a, 0xb0, 0x8f, 0x19, 0x32, 0x3e, 0x40, - 0x4d, 0xe5, 0x54, 0xb0, 0x62, 0x5a, 0xa9, 0x4a, 0x03, 0xa0, 0x69, 0xf4, 0x4b, 0x94, 0x7f, 0xa6, 0x07, 0xf2, 0xc3, - 0x1f, 0xbd, 0x75, 0xde, 0x3f, 0xa7, 0xff, 0xbe, 0xff, 0xfc, 0xa3, 0x06, 0x26, 0x05, 0x64, 0xdd, 0x87, 0x95, 0x6d, - 0x12, 0x8e, 0xca, 0xc6, 0x55, 0x56, 0x13, 0x75, 0x07, 0x99, 0x5e, 0xcd, 0x6c, 0xf7, 0xcd, 0x5b, 0xf6, 0xa1, 0x17, - 0xd1, 0x4c, 0xc9, 0xa3, 0x52, 0xe4, 0x1d, 0x72, 0x71, 0xf5, 0x39, 0x7c, 0x19, 0xeb, 0xaa, 0x90, 0x5f, 0xa9, 0x8a, - 0xe7, 0xa5, 0x0f, 0x82, 0xa8, 0x73, 0x72, 0x0c, 0x12, 0xc7, 0x91, 0x07, 0x14, 0xd8, 0x9f, 0xeb, 0x39, 0x74, 0xcf, - 0xeb, 0xcb, 0x09, 0x3c, 0x0d, 0x97, 0xb0, 0x5d, 0xef, 0xbc, 0x4b, 0x1f, 0x6a, 0x32, 0x4a, 0xb0, 0x8d, 0x74, 0x73, - 0xe8, 0xa0, 0x51, 0x3b, 0x7a, 0xe4, 0xe3, 0x9e, 0xf1, 0xd1, 0x05, 0x8a, 0xbe, 0xc7, 0xb9, 0xd1, 0x33, 0x57, 0x0e, - 0xfa, 0x5c, 0xae, 0xbb, 0xa6, 0xbd, 0xaa, 0x13, 0xa3, 0x63, 0x52, 0x79, 0x29, 0x0a, 0x20, 0x49, 0xaa, 0xa7, 0x2d, - 0x52, 0xfb, 0xa9, 0x9c, 0x0d, 0x6c, 0x9e, 0xe1, 0x5e, 0x3c, 0x13, 0x4a, 0x42, 0x37, 0xfc, 0xc5, 0xb9, 0xa6, 0x7d, - 0x61, 0x99, 0xaa, 0x30, 0xb8, 0x61, 0x35, 0x2d, 0x21, 0xe8, 0x35, 0x08, 0x36, 0x0d, 0xee, 0x3f, 0x8e, 0x20, 0xd8, - 0x04, 0x5a, 0x3b, 0x83, 0x94, 0x81, 0x33, 0x36, 0xe2, 0x1f, 0xae, 0x68, 0x10, 0xc9, 0xcd, 0x03, 0x4f, 0xe2, 0xe5, - 0xb0, 0x24, 0x52, 0xde, 0x40, 0x28, 0x08, 0x7a, 0x2a, 0xb8, 0x08, 0x52, 0xd0, 0x98, 0xf6, 0x98, 0x1d, 0xa8, 0x36, - 0x38, 0x6e, 0x80, 0xcb, 0x57, 0x49, 0xd9, 0xa4, 0xda, 0xd4, 0x65, 0xaa, 0x62, 0xc7, 0xe0, 0x91, 0x97, 0xd6, 0x41, - 0x7a, 0x81, 0x22, 0x68, 0x8a, 0x52, 0xa4, 0x57, 0x35, 0x1d, 0x85, 0xb6, 0xa8, 0x36, 0x18, 0x3d, 0xa8, 0x18, 0x28, - 0xa9, 0xb0, 0xd8, 0xc8, 0x46, 0xd1, 0x9f, 0x19, 0x22, 0x8c, 0xc2, 0x0f, 0xed, 0xca, 0xc8, 0x87, 0x8f, 0x6a, 0x98, - 0xbd, 0x9b, 0x44, 0xb1, 0xc8, 0x4b, 0x7d, 0x5e, 0xf3, 0x88, 0x9a, 0x9d, 0x26, 0xf9, 0xfc, 0x66, 0x35, 0x70, 0x8a, - 0x49, 0xc9, 0x4e, 0x78, 0xb7, 0x4a, 0x4c, 0x82, 0x88, 0xad, 0xdf, 0x3e, 0xf5, 0xbc, 0x1b, 0xb8, 0xb4, 0xf7, 0x23, - 0x61, 0x7b, 0x59, 0xf2, 0xe8, 0xf0, 0xb2, 0xa8, 0xb9, 0xf9, 0xc6, 0x9c, 0xea, 0x2a, 0xd5, 0x1b, 0x02, 0x7e, 0x95, - 0x8e, 0x5e, 0x94, 0x09, 0x0a, 0xa7, 0x36, 0xdd, 0x07, 0x93, 0x11, 0xd0, 0xd1, 0xb3, 0x1a, 0xcd, 0xf2, 0xf4, 0xd5, - 0x32, 0xb1, 0xc3, 0xc6, 0xe8, 0x23, 0x0a, 0xbc, 0x6c, 0x55, 0x06, 0x47, 0x1a, 0x55, 0xca, 0xcc, 0x0b, 0xa2, 0xea, - 0x44, 0xad, 0x60, 0x2f, 0x35, 0xf8, 0x0f, 0x08, 0xd3, 0x25, 0x0f, 0x9c, 0x1a, 0x80, 0x1c, 0xb3, 0x88, 0x74, 0x54, - 0x80, 0xdf, 0x3e, 0x4d, 0xcf, 0x98, 0x6b, 0xb8, 0xcb, 0x1a, 0x44, 0x11, 0x6d, 0x1f, 0xb1, 0x44, 0xd2, 0x1d, 0x2e, - 0x8c, 0x29, 0x42, 0xb8, 0x39, 0x2a, 0x04, 0x01, 0xac, 0x30, 0xf8, 0x12, 0xe3, 0x80, 0xb4, 0xa8, 0x7b, 0x14, 0x5e, - 0xb6, 0x0a, 0xbe, 0xcb, 0x05, 0xc7, 0x58, 0xd9, 0xbb, 0x90, 0x58, 0x17, 0xa2, 0x41, 0xb7, 0xfc, 0x7b, 0x84, 0xfc, - 0x6a, 0x68, 0x66, 0xb5, 0xf9, 0x0a, 0xee, 0x5b, 0xaf, 0x9d, 0x4d, 0x26, 0x30, 0xbb, 0x12, 0x55, 0x21, 0x8b, 0x90, - 0xb2, 0x17, 0x22, 0xd3, 0xb4, 0x95, 0x28, 0x39, 0x47, 0x40, 0x12, 0xd8, 0x02, 0x01, 0x36, 0xf8, 0xa1, 0x5a, 0x96, - 0x43, 0x09, 0x55, 0x0d, 0x8c, 0x90, 0xef, 0xc5, 0x02, 0x88, 0x5a, 0x56, 0xbd, 0xa2, 0x0c, 0xec, 0x68, 0xd9, 0xeb, - 0xac, 0x67, 0x40, 0xc9, 0x7e, 0x83, 0x40, 0x78, 0x1b, 0x9e, 0xbe, 0xff, 0x26, 0xe4, 0xd1, 0x99, 0x63, 0x4d, 0x58, - 0x78, 0x44, 0x6e, 0x1c, 0x60, 0xe5, 0x73, 0x5b, 0x82, 0x90, 0x05, 0xa5, 0xdf, 0x95, 0x2b, 0x7b, 0xd4, 0x67, 0xa6, - 0x46, 0x15, 0x82, 0xbc, 0xb9, 0xec, 0x03, 0x69, 0xa9, 0x03, 0xed, 0x1f, 0x90, 0x81, 0xc1, 0x09, 0xdc, 0x3b, 0x55, - 0x84, 0xb2, 0xc7, 0x18, 0xfe, 0xdc, 0xa6, 0xa6, 0x4d, 0xdc, 0xf3, 0x33, 0x98, 0x14, 0x03, 0x92, 0x95, 0x92, 0x7b, - 0x9e, 0xff, 0xae, 0x86, 0x2a, 0x48, 0x28, 0x4c, 0x4b, 0xf0, 0x24, 0x2b, 0x23, 0x84, 0xc8, 0x44, 0xc7, 0x41, 0xe7, - 0x40, 0xbc, 0xba, 0x37, 0x30, 0x9f, 0xd9, 0x31, 0x4b, 0x7e, 0xf7, 0x68, 0xb9, 0x4e, 0xc4, 0xb2, 0x86, 0x1f, 0x46, - 0xb3, 0x1b, 0xfb, 0x89, 0x70, 0xdd, 0xc2, 0x1a, 0x97, 0x06, 0xcf, 0xd0, 0xad, 0xf6, 0xf8, 0x4d, 0xce, 0x50, 0x4c, - 0xdb, 0x74, 0xac, 0x0e, 0xaf, 0xaf, 0xd5, 0xac, 0xb2, 0x85, 0x6a, 0xb7, 0x9c, 0x5f, 0xab, 0x6a, 0xcd, 0xd6, 0x6e, - 0xa1, 0x95, 0xd5, 0xe7, 0x3f, 0x8b, 0xf9, 0x9c, 0xc2, 0x62, 0x7e, 0x30, 0x80, 0xbb, 0x28, 0xe2, 0xc5, 0x89, 0xbb, - 0xe6, 0xda, 0xfe, 0xa0, 0xf6, 0xca, 0xe5, 0xe3, 0x6b, 0x8f, 0xfb, 0xef, 0x22, 0x46, 0xbd, 0xb0, 0x8f, 0x02, 0xb8, - 0x56, 0x23, 0x1e, 0x0f, 0x1f, 0x5d, 0xcc, 0xab, 0x35, 0xf5, 0x49, 0x1d, 0x79, 0xcf, 0x5d, 0xef, 0x5b, 0x5a, 0xb2, - 0x38, 0xad, 0x3c, 0xcd, 0x3e, 0x10, 0x23, 0xb3, 0x81, 0xd6, 0x9b, 0x34, 0x43, 0x86, 0x3b, 0x12, 0x7c, 0xb2, 0x52, - 0xf4, 0xe2, 0x64, 0xf7, 0xd4, 0x20, 0x52, 0xb2, 0xd1, 0xcc, 0x42, 0xa0, 0x96, 0x97, 0x21, 0xd3, 0x74, 0x2c, 0x0a, - 0x51, 0x0e, 0x2c, 0x28, 0x0f, 0x9a, 0x30, 0xc5, 0x93, 0x70, 0x1a, 0x47, 0x92, 0x62, 0x35, 0x0d, 0xb9, 0xcd, 0x49, - 0x89, 0x1a, 0xd2, 0xd5, 0xb9, 0xc1, 0x03, 0xad, 0x16, 0x98, 0xc0, 0xa1, 0x24, 0x05, 0x98, 0x6b, 0xa4, 0x67, 0x88, - 0x28, 0x04, 0x03, 0xf4, 0xfa, 0x96, 0x9d, 0x87, 0xce, 0xbb, 0x93, 0x72, 0x59, 0x53, 0x10, 0x6f, 0x3e, 0xf6, 0xa1, - 0x65, 0xa6, 0x75, 0x27, 0x37, 0x54, 0xf2, 0x7c, 0x09, 0xb5, 0x34, 0x81, 0xfb, 0x84, 0x8b, 0x6a, 0x26, 0x54, 0x21, - 0xff, 0x26, 0xf7, 0xfd, 0x62, 0xef, 0xc2, 0xbc, 0xba, 0x7d, 0x80, 0xcf, 0x8f, 0x97, 0x2a, 0x47, 0xe1, 0x93, 0x91, - 0xdc, 0x6a, 0x25, 0x9f, 0x67, 0x10, 0x32, 0xf3, 0x85, 0x9b, 0xbb, 0x1f, 0xb5, 0xe9, 0xc3, 0x26, 0x7f, 0xd6, 0x81, - 0xe5, 0xb6, 0x79, 0x25, 0x26, 0x7f, 0xac, 0x76, 0x2c, 0xda, 0x7b, 0x77, 0x85, 0x3e, 0x8a, 0xf5, 0xe9, 0x84, 0xbb, - 0x7f, 0xa8, 0x7c, 0x5e, 0x36, 0xfa, 0x48, 0x5d, 0xae, 0x8f, 0x7f, 0x85, 0xee, 0x8b, 0x84, 0x6a, 0x58, 0xe3, 0xbd, - 0x4c, 0xb9, 0x30, 0x7b, 0x81, 0x8d, 0xb9, 0x3a, 0xed, 0x66, 0x52, 0x82, 0x6e, 0xdb, 0xfb, 0x8f, 0xfc, 0x08, 0x67, - 0x11, 0x05, 0x37, 0xf9, 0x9d, 0x19, 0xcb, 0xa1, 0x3f, 0xdf, 0x99, 0x41, 0x2f, 0x1f, 0xc2, 0xde, 0xc5, 0xbb, 0xf4, - 0x01, 0xb9, 0x1e, 0xa7, 0x4a, 0x3e, 0xfb, 0xb1, 0xfe, 0x56, 0xc9, 0x3f, 0x8b, 0x84, 0x79, 0x6b, 0x62, 0x85, 0xb9, - 0x31, 0x49, 0x7e, 0xfb, 0xeb, 0xb6, 0xa5, 0x9d, 0xc9, 0xed, 0x62, 0xd3, 0xba, 0x85, 0x67, 0x42, 0x36, 0x81, 0x89, - 0xd9, 0x2f, 0x52, 0xd0, 0x95, 0x32, 0x35, 0x6e, 0x92, 0xd2, 0xca, 0xb3, 0xce, 0xdb, 0x77, 0xcc, 0x1c, 0xd7, 0xa7, - 0x2a, 0x0b, 0x72, 0xab, 0x28, 0xe4, 0x14, 0xda, 0x63, 0xe4, 0x12, 0x3a, 0x4c, 0x97, 0xdc, 0x45, 0xcc, 0x65, 0x11, - 0xd3, 0x7b, 0x79, 0xee, 0x93, 0x10, 0xd3, 0x66, 0x3b, 0xe5, 0x95, 0xfc, 0x0f, 0xb9, 0x79, 0x90, 0x55, 0x41, 0x1d, - 0x80, 0xe9, 0xfd, 0xd5, 0xfa, 0xf3, 0xd9, 0xd2, 0xe0, 0x54, 0x71, 0xf0, 0xf2, 0x53, 0x69, 0x72, 0xf3, 0xc6, 0x39, - 0xdd, 0x10, 0x95, 0x4a, 0x39, 0x16, 0x83, 0x8e, 0x91, 0xa3, 0x6a, 0x34, 0x8b, 0xf9, 0x04, 0x75, 0xed, 0x24, 0xfe, - 0x78, 0x26, 0x67, 0x35, 0x54, 0x73, 0x17, 0x7c, 0x72, 0x6c, 0x79, 0x37, 0x0d, 0xc5, 0x70, 0x7f, 0xb7, 0x55, 0x3f, - 0x67, 0x74, 0xd6, 0x4d, 0x0f, 0x05, 0x37, 0x70, 0xbe, 0xeb, 0xe1, 0x4b, 0x69, 0xdd, 0xaa, 0x59, 0x2a, 0x51, 0x10, - 0xaa, 0xa4, 0xb9, 0x7a, 0xc3, 0xd4, 0x40, 0x1f, 0x6a, 0xfe, 0x8e, 0x32, 0x98, 0xe2, 0x12, 0x00, 0x35, 0xc9, 0xe1, - 0xdb, 0xd4, 0x42, 0xc9, 0x48, 0x6f, 0x05, 0xe6, 0x18, 0xff, 0x1b, 0x48, 0x43, 0x26, 0x03, 0x6e, 0xf5, 0x35, 0xbf, - 0x99, 0xe4, 0xdf, 0x74, 0xdf, 0x07, 0xe7, 0xd3, 0x38, 0x7d, 0x0d, 0x05, 0xf6, 0x41, 0x7b, 0x9f, 0xf6, 0x9c, 0x29, - 0x69, 0x7b, 0x5c, 0x6d, 0xc5, 0x57, 0xdc, 0x4d, 0x61, 0xf0, 0x4f, 0x0f, 0x84, 0x22, 0xfa, 0x6e, 0xe0, 0x50, 0xb8, - 0x1d, 0x3f, 0x31, 0x8d, 0xa8, 0x43, 0xa6, 0xaa, 0x2f, 0x49, 0x3e, 0xda, 0xfc, 0x21, 0xac, 0x09, 0x8e, 0x1c, 0xe3, - 0xa6, 0x67, 0xa8, 0x88, 0xcc, 0x13, 0xaf, 0x76, 0x0f, 0x9c, 0x9a, 0x80, 0xeb, 0x79, 0x64, 0xde, 0xa7, 0xa9, 0x6d, - 0x70, 0xf1, 0x04, 0xb9, 0x73, 0x03, 0x78, 0xa7, 0x56, 0x57, 0xfb, 0x97, 0x5a, 0xef, 0x42, 0x84, 0x5b, 0x00, 0x51, - 0x8e, 0x5f, 0x64, 0x13, 0xb9, 0x7f, 0x70, 0xe6, 0x62, 0x4e, 0xc3, 0x3d, 0xd2, 0xa1, 0xe4, 0xee, 0x10, 0xb5, 0xce, - 0x2a, 0x67, 0x72, 0xa3, 0x98, 0x25, 0x93, 0x42, 0x00, 0x04, 0xa6, 0x55, 0xbe, 0x22, 0x02, 0xb8, 0x0a, 0x0b, 0x8d, - 0xa6, 0x28, 0xf2, 0x2b, 0xaa, 0xed, 0x67, 0xb4, 0x5b, 0xf6, 0xa3, 0xa3, 0x6b, 0xc7, 0x4c, 0x6a, 0x35, 0x71, 0xe9, - 0x48, 0x0a, 0x66, 0x98, 0xbc, 0xb9, 0x28, 0xe4, 0x15, 0x1f, 0xcc, 0x0f, 0x43, 0x02, 0x53, 0x69, 0x05, 0x85, 0x5c, - 0xaf, 0xb1, 0x33, 0x47, 0xa8, 0xe1, 0x34, 0x6b, 0x3c, 0x3d, 0x7d, 0x5e, 0x8a, 0xd7, 0x8e, 0x53, 0xb5, 0xcd, 0x38, - 0x1d, 0x2c, 0xc2, 0x79, 0x91, 0x76, 0x59, 0xb6, 0x12, 0x81, 0xec, 0xc7, 0xf4, 0x6f, 0xe3, 0xbc, 0xd0, 0xbf, 0x59, - 0xe7, 0x58, 0x9e, 0xc0, 0xc8, 0x12, 0x2d, 0x54, 0xc7, 0xfc, 0xa7, 0x56, 0x6c, 0xad, 0xf0, 0x9d, 0xa8, 0x24, 0xc6, - 0xab, 0x73, 0x69, 0xcf, 0x75, 0xe7, 0x87, 0x10, 0x2c, 0x0f, 0xf0, 0xb3, 0xb8, 0xca, 0xf7, 0x67, 0x85, 0x5b, 0xe9, - 0x3f, 0xeb, 0xe6, 0xef, 0x8a, 0xde, 0x93, 0x8f, 0x1f, 0x52, 0xc4, 0x34, 0x81, 0xf9, 0xae, 0x01, 0x34, 0x55, 0x48, - 0x58, 0x94, 0x2a, 0x6e, 0x43, 0x8e, 0xf7, 0xcf, 0xeb, 0x5e, 0xc4, 0xa2, 0x94, 0x23, 0xbb, 0x8e, 0x3b, 0x7e, 0x29, - 0x30, 0x03, 0x5c, 0xc0, 0xf7, 0x50, 0x4e, 0xa0, 0x1f, 0x3b, 0x8f, 0x8f, 0x44, 0x51, 0x38, 0x65, 0xbc, 0x53, 0x58, - 0xeb, 0xf0, 0x42, 0x79, 0x97, 0x6e, 0x14, 0xd3, 0xa8, 0x89, 0x9f, 0x32, 0xbe, 0xb1, 0x1a, 0x3d, 0xd6, 0x35, 0xba, - 0x1f, 0xcd, 0x8f, 0x82, 0x36, 0xb0, 0x88, 0xbd, 0xff, 0xd3, 0x21, 0xc5, 0xc4, 0xe4, 0xbc, 0x65, 0x2c, 0x70, 0x24, - 0xa4, 0xca, 0xad, 0xcc, 0xf7, 0xa9, 0x88, 0xca, 0xf4, 0x2b, 0x9c, 0xf1, 0x3b, 0x42, 0x44, 0x15, 0x16, 0xfb, 0xa7, - 0xd6, 0x3d, 0x66, 0xd2, 0xcd, 0xa6, 0x3e, 0x55, 0x20, 0x0d, 0x45, 0x9e, 0xaa, 0xe9, 0x25, 0x34, 0xb7, 0xbb, 0xcf, - 0xcf, 0x67, 0x8f, 0x0a, 0xf2, 0xf9, 0xef, 0x0f, 0xfa, 0xfe, 0xbe, 0x90, 0x07, 0xad, 0x6f, 0xe5, 0x33, 0xd4, 0xfe, - 0x75, 0x95, 0x3d, 0x35, 0xc0, 0x99, 0x22, 0x92, 0x97, 0xfc, 0x08, 0xa7, 0x6b, 0x6e, 0x96, 0xbe, 0x7a, 0xca, 0x75, - 0x3f, 0x5d, 0xce, 0x6a, 0x91, 0x1c, 0x33, 0x44, 0xd0, 0xde, 0xc8, 0xb8, 0xc7, 0xf7, 0x59, 0x22, 0x9d, 0x85, 0x09, - 0xba, 0x88, 0xea, 0xf6, 0x68, 0x43, 0xd9, 0xad, 0xe6, 0x2d, 0xf7, 0xc6, 0x1f, 0xe8, 0x7b, 0xd6, 0x8b, 0xa0, 0x34, - 0x94, 0x60, 0xc7, 0xdd, 0xa8, 0x71, 0x44, 0x3a, 0xd7, 0x1d, 0xa4, 0x91, 0x7b, 0xa1, 0x58, 0x52, 0xde, 0x77, 0xb3, - 0xa3, 0x30, 0x69, 0x81, 0x15, 0x76, 0xea, 0xf2, 0xe0, 0x6e, 0x5a, 0x98, 0x75, 0x0a, 0x85, 0xca, 0x74, 0x31, 0xf0, - 0xc5, 0xa6, 0xb4, 0xae, 0x57, 0x0e, 0xc8, 0x01, 0x8c, 0x8e, 0x83, 0x14, 0x26, 0xd5, 0x58, 0x92, 0xca, 0xd0, 0xd1, - 0x72, 0x68, 0x59, 0xaa, 0x14, 0x14, 0xbd, 0x03, 0x0c, 0xca, 0x78, 0xf6, 0xff, 0xc3, 0x9c, 0x0b, 0x83, 0x58, 0x0e, - 0xec, 0x57, 0x64, 0x5f, 0x5d, 0x77, 0xc2, 0x49, 0x54, 0x10, 0xa6, 0xba, 0x91, 0xa9, 0x47, 0x15, 0xd8, 0x84, 0x1c, - 0xd2, 0x24, 0xc9, 0xe9, 0xc0, 0x04, 0x72, 0xe4, 0x69, 0x13, 0x51, 0x17, 0x92, 0xca, 0xe5, 0x97, 0xce, 0xb7, 0x5f, - 0x71, 0xe6, 0x2f, 0x30, 0x92, 0x53, 0x4a, 0xc7, 0x3a, 0x8b, 0xf1, 0x3b, 0xed, 0x7e, 0x3a, 0x6f, 0xfb, 0x9c, 0x5f, - 0x72, 0x80, 0xde, 0x42, 0x55, 0xce, 0x10, 0x90, 0x1e, 0xfa, 0xfe, 0x7a, 0x47, 0xb5, 0xa0, 0x3b, 0x6e, 0xfa, 0xe4, - 0x33, 0xce, 0x5e, 0xad, 0x93, 0xcf, 0x4f, 0xde, 0x28, 0xc4, 0x48, 0x04, 0x5d, 0x3b, 0x52, 0x95, 0x76, 0x9f, 0x6f, - 0xe4, 0x2a, 0x5c, 0xae, 0x41, 0xb3, 0x83, 0xa2, 0x53, 0xda, 0xcf, 0x94, 0xb1, 0xae, 0x7e, 0x4a, 0x0e, 0x1b, 0xb0, - 0xd9, 0x10, 0xe3, 0x48, 0xdc, 0x78, 0xa5, 0x62, 0x80, 0x33, 0x37, 0xaa, 0x61, 0xa5, 0xb7, 0x9d, 0x93, 0x5f, 0xe2, - 0x95, 0x06, 0xcf, 0x13, 0x2c, 0xd1, 0x45, 0x9f, 0x57, 0x8f, 0xd3, 0x51, 0xe6, 0x1b, 0xea, 0xdf, 0xa0, 0xda, 0x26, - 0x5d, 0x88, 0x75, 0x9a, 0xce, 0x21, 0xcf, 0x95, 0x1f, 0xdd, 0x99, 0x20, 0x73, 0x47, 0x85, 0x6b, 0xd5, 0xa0, 0x40, - 0x53, 0xf6, 0xc9, 0x4a, 0x78, 0x74, 0xeb, 0x93, 0x4c, 0xda, 0x47, 0x6b, 0xe5, 0xc3, 0xad, 0x28, 0xfb, 0x77, 0xcf, - 0xbf, 0xf7, 0x99, 0xde, 0x22, 0x1d, 0xd7, 0xac, 0xf6, 0x2f, 0xf8, 0x29, 0xe7, 0x34, 0xde, 0x12, 0xa5, 0x44, 0xe5, - 0x87, 0xe3, 0x80, 0x58, 0xbc, 0x41, 0xfc, 0xd1, 0x0f, 0xdc, 0xec, 0x45, 0xac, 0x2f, 0x55, 0x5a, 0x54, 0x7f, 0xb2, - 0xc7, 0x55, 0x0d, 0x8e, 0x1f, 0xeb, 0xf9, 0x75, 0xac, 0xbc, 0x13, 0x0d, 0xb0, 0x56, 0x02, 0x1f, 0xdb, 0x95, 0x80, - 0x02, 0x22, 0xbd, 0x25, 0x6f, 0xcf, 0xff, 0x77, 0x8b, 0xfd, 0x7e, 0x47, 0xf7, 0xd3, 0xce, 0x8d, 0xaa, 0xd1, 0x69, - 0x53, 0x58, 0x0a, 0xdb, 0xee, 0xb3, 0xc0, 0x45, 0xc6, 0x80, 0x40, 0x35, 0xe6, 0x1f, 0x92, 0x30, 0xa7, 0xc0, 0xbb, - 0x3c, 0x38, 0x8e, 0xfc, 0x96, 0xfa, 0xc6, 0x0a, 0xf7, 0xef, 0xf6, 0xae, 0xb7, 0x20, 0x42, 0x65, 0x9f, 0xa0, 0xdc, - 0x91, 0x3f, 0xf6, 0xd3, 0x0b, 0xd4, 0x47, 0x61, 0xaf, 0x60, 0xd5, 0xd1, 0xa2, 0x6b, 0x07, 0x3a, 0x07, 0xbd, 0x1b, - 0x51, 0x51, 0xf9, 0x98, 0x8d, 0xa5, 0x66, 0x7c, 0x04, 0x30, 0x02, 0x58, 0x0c, 0x71, 0xe2, 0xda, 0x2b, 0xf7, 0x35, - 0xba, 0x02, 0x02, 0x8c, 0xe1, 0x1f, 0x36, 0x38, 0xb7, 0x5e, 0x59, 0x06, 0x9a, 0x1c, 0xe0, 0xd4, 0x26, 0x8b, 0x53, - 0x8b, 0x53, 0xbc, 0xdf, 0xf9, 0xc6, 0xe8, 0xed, 0x05, 0x39, 0x1d, 0xf0, 0x1e, 0x7b, 0x14, 0x15, 0x35, 0x64, 0xa0, - 0x85, 0x6f, 0xbb, 0x21, 0x62, 0x65, 0x30, 0x0b, 0xfa, 0x70, 0xee, 0xfb, 0xf3, 0x4b, 0x2a, 0x54, 0xff, 0x57, 0xaf, - 0xbd, 0xae, 0x5a, 0xf0, 0xc4, 0x35, 0xec, 0x2e, 0xb8, 0x72, 0x4a, 0xed, 0x58, 0xa5, 0xa7, 0x9d, 0x64, 0x50, 0x10, - 0xda, 0x21, 0x85, 0x67, 0xff, 0x67, 0x51, 0x7d, 0x9e, 0x5b, 0xcd, 0xa1, 0xfa, 0xcc, 0x3a, 0x0e, 0x88, 0x7f, 0x3f, - 0xca, 0xbb, 0x3a, 0x08, 0x50, 0x35, 0xe4, 0x93, 0x02, 0xf3, 0x5f, 0xf1, 0x2c, 0x6f, 0x44, 0xba, 0x9d, 0xd9, 0x7d, - 0x8d, 0xcb, 0x99, 0xdc, 0x4e, 0xe6, 0x9b, 0x79, 0xb8, 0xd9, 0x79, 0x7f, 0xbd, 0xa5, 0x4a, 0xda, 0x7a, 0xa5, 0x3e, - 0x3d, 0xe0, 0x38, 0x20, 0xd2, 0x66, 0x19, 0x46, 0x73, 0x7e, 0xee, 0x06, 0xbe, 0x1f, 0x16, 0x61, 0xbe, 0x5f, 0xfb, - 0xb5, 0xe0, 0xc6, 0x24, 0x6f, 0x24, 0x4e, 0xd4, 0xc0, 0x65, 0x8a, 0xa1, 0x2b, 0x05, 0xbc, 0x89, 0x43, 0x5f, 0xc3, - 0x94, 0x1d, 0xf4, 0x5e, 0xb8, 0x1e, 0xf5, 0x74, 0xc4, 0x05, 0xae, 0xba, 0x79, 0x24, 0x93, 0xcc, 0x37, 0x94, 0x31, - 0xde, 0xf0, 0xaa, 0xdf, 0xb8, 0x73, 0xaf, 0x93, 0x32, 0x80, 0x5d, 0x2a, 0x28, 0x7e, 0xbc, 0x6a, 0x55, 0x53, 0x9f, - 0x8a, 0x10, 0xb2, 0x90, 0x4b, 0x01, 0xee, 0xf2, 0xfc, 0x99, 0x7c, 0x1e, 0x5d, 0xdc, 0x0d, 0x55, 0x03, 0xd0, 0x6a, - 0xea, 0xeb, 0x02, 0xc6, 0x91, 0x27, 0x45, 0xca, 0x70, 0x66, 0x6d, 0x78, 0x51, 0xab, 0x4f, 0xb9, 0xa4, 0x21, 0xa3, - 0xb6, 0x53, 0xea, 0x41, 0xbe, 0xd6, 0xd9, 0xec, 0x91, 0x37, 0xb8, 0xa1, 0x65, 0xbb, 0x92, 0x8f, 0x20, 0x8a, 0x26, - 0xc0, 0x72, 0x96, 0xb6, 0x09, 0x32, 0xf8, 0x0e, 0x2d, 0x92, 0xc1, 0x10, 0xb1, 0xc0, 0x9e, 0x77, 0xab, 0xe2, 0xb5, - 0xbd, 0x9c, 0x6a, 0x27, 0xd3, 0xef, 0x72, 0x74, 0xf6, 0x81, 0x3a, 0x1c, 0xac, 0xea, 0x65, 0x17, 0x6a, 0xfd, 0xbb, - 0x1f, 0xda, 0x0a, 0x02, 0x59, 0x03, 0x27, 0x4a, 0x8a, 0xbd, 0x52, 0x65, 0x6b, 0xe4, 0x24, 0xc0, 0x5d, 0x1f, 0xcf, - 0x44, 0x14, 0xb3, 0x74, 0x4e, 0xbf, 0x0b, 0x42, 0x8f, 0x31, 0xac, 0x90, 0x6a, 0x02, 0x8d, 0x9f, 0x5c, 0xd1, 0xdd, - 0x60, 0x35, 0xd9, 0x33, 0xd2, 0x17, 0x63, 0x3d, 0xdd, 0xd9, 0x36, 0xa8, 0x43, 0xfb, 0x6c, 0xb6, 0xaf, 0x2b, 0x8c, - 0x58, 0xf9, 0xa2, 0x1a, 0x7b, 0x61, 0x0b, 0xdc, 0xa9, 0x0b, 0x91, 0xb1, 0x62, 0x66, 0x7a, 0xc2, 0x50, 0x70, 0x5c, - 0x23, 0x1f, 0xe3, 0xc4, 0x4c, 0xa4, 0xb4, 0x2b, 0x76, 0x9a, 0x12, 0x70, 0x0a, 0x84, 0x8e, 0x3d, 0xed, 0xd6, 0x6a, - 0x41, 0xf2, 0x60, 0xe9, 0xb2, 0x1f, 0xe2, 0x7a, 0x3c, 0x2d, 0x29, 0x84, 0x20, 0x5c, 0x9c, 0x9e, 0x75, 0xb3, 0x8c, - 0xe3, 0xc1, 0x94, 0xa6, 0xc3, 0xfe, 0x69, 0x3f, 0xad, 0x0c, 0x3e, 0xde, 0x57, 0x2b, 0x3c, 0x76, 0x20, 0xf8, 0x3c, - 0xfa, 0xde, 0x20, 0xcf, 0xff, 0x34, 0xc9, 0xff, 0x3a, 0x86, 0x40, 0x0d, 0x5b, 0xb1, 0xa0, 0x1b, 0xbe, 0xb1, 0x09, - 0x5e, 0xae, 0x99, 0x57, 0x3a, 0x5b, 0x8b, 0xb3, 0x88, 0x0c, 0x0b, 0x78, 0x7c, 0xf3, 0xe3, 0xfa, 0x23, 0x9c, 0x8d, - 0xcb, 0x18, 0xc3, 0x4b, 0x6e, 0x80, 0x24, 0x21, 0x5c, 0x42, 0xcc, 0x58, 0x77, 0xcf, 0x0d, 0x6e, 0xab, 0x8d, 0xaf, - 0x01, 0xb7, 0x9e, 0x2f, 0xc6, 0xcb, 0x84, 0xf3, 0xe9, 0xcf, 0xca, 0x75, 0x4f, 0xa5, 0xb9, 0x51, 0x6f, 0xb5, 0xfe, - 0xe3, 0xd9, 0xef, 0x1e, 0xb0, 0x24, 0xdc, 0x4f, 0x2d, 0xc3, 0x7c, 0xf2, 0xea, 0x92, 0x89, 0x10, 0xcf, 0x02, 0x5a, - 0x0e, 0x51, 0x88, 0x0f, 0x17, 0x90, 0xe7, 0xee, 0xe8, 0x70, 0xe4, 0x76, 0x9a, 0x4b, 0x23, 0x47, 0x76, 0x30, 0xb4, - 0xa8, 0xa4, 0x0b, 0xab, 0x95, 0x69, 0x9f, 0x4a, 0x37, 0x22, 0x72, 0x20, 0x31, 0x59, 0xb1, 0xcf, 0x30, 0xd3, 0x0e, - 0x9c, 0x7a, 0x40, 0xfc, 0xcf, 0x7f, 0x11, 0x19, 0xca, 0x09, 0x2f, 0xb5, 0xb0, 0x84, 0xa5, 0xca, 0x6c, 0x1f, 0x8f, - 0x9c, 0xca, 0xcc, 0xaa, 0x57, 0x8b, 0x78, 0xeb, 0x8d, 0x86, 0xa6, 0x13, 0x23, 0xc5, 0x07, 0xbe, 0x8c, 0x02, 0x2a, - 0x34, 0xe9, 0xa1, 0x88, 0xd7, 0xf3, 0xcc, 0x39, 0x04, 0xe0, 0x1b, 0x7d, 0xb7, 0x54, 0x75, 0x5d, 0x5f, 0xec, 0x77, - 0x29, 0xf7, 0x25, 0x05, 0xb1, 0xe4, 0xdc, 0x3d, 0xc6, 0x39, 0x1c, 0x39, 0x78, 0x6a, 0x24, 0x15, 0x75, 0x16, 0x89, - 0xc4, 0x82, 0x96, 0xd2, 0xed, 0xb0, 0xdc, 0x03, 0xa6, 0x51, 0xa8, 0x6a, 0xa3, 0xc7, 0x5d, 0x97, 0x00, 0xda, 0xec, - 0x24, 0x84, 0xf7, 0xf0, 0x7d, 0xb6, 0x98, 0x0b, 0xb9, 0xe0, 0x6c, 0x7f, 0x9b, 0x53, 0x29, 0x57, 0xb1, 0x67, 0xa3, - 0xb4, 0x43, 0xf3, 0xed, 0xdc, 0xb3, 0x5a, 0x32, 0x2b, 0x62, 0x0c, 0x91, 0xd3, 0x37, 0x92, 0xb6, 0x0d, 0xd2, 0xe1, - 0x70, 0xcd, 0x90, 0xe0, 0x73, 0x5e, 0x6b, 0x2f, 0xc5, 0x93, 0x71, 0x52, 0xf8, 0x6f, 0x26, 0xd9, 0x79, 0x6d, 0xfd, - 0xa3, 0x3f, 0x24, 0x5b, 0x01, 0xc1, 0x13, 0x7e, 0x35, 0xd9, 0xcc, 0xae, 0xb9, 0xf9, 0xbd, 0x86, 0xf6, 0xd4, 0x52, - 0xb0, 0x66, 0x02, 0xad, 0x4d, 0xca, 0xe7, 0xa2, 0x8f, 0xaf, 0x57, 0x77, 0x24, 0xee, 0xd3, 0x67, 0xd2, 0x35, 0x25, - 0x2f, 0x19, 0x0b, 0xca, 0x37, 0xbc, 0xd9, 0x1f, 0xa3, 0x08, 0xa8, 0x1a, 0x72, 0x05, 0xf5, 0x75, 0x4f, 0xa6, 0xcf, - 0xda, 0x41, 0x58, 0xaf, 0x02, 0x9b, 0x80, 0x22, 0x11, 0xfd, 0xb7, 0x79, 0x8f, 0x3e, 0xe4, 0xd0, 0x1d, 0xb2, 0x37, - 0xb0, 0x9e, 0xac, 0x74, 0x27, 0x11, 0x8a, 0x0a, 0x9f, 0x3b, 0x01, 0xa5, 0x64, 0x07, 0xa5, 0x06, 0x7c, 0xd6, 0x4b, - 0xe4, 0x98, 0xf9, 0xc6, 0xf1, 0x2e, 0xf1, 0x8e, 0xb2, 0xf8, 0xc0, 0x81, 0x9d, 0xea, 0xe7, 0xef, 0x63, 0xf9, 0x72, - 0x8c, 0x07, 0x91, 0xd1, 0xef, 0x45, 0x01, 0xbe, 0xec, 0x37, 0xcd, 0xc8, 0xf3, 0xaf, 0xbf, 0xa5, 0x8d, 0x3c, 0xf3, - 0x6b, 0xa9, 0x84, 0x65, 0xdd, 0x9d, 0x3f, 0x45, 0xbb, 0x94, 0xd8, 0x70, 0x5b, 0xf4, 0xc1, 0x20, 0x97, 0x1b, 0x00, - 0x1f, 0x70, 0x2e, 0xff, 0x99, 0xa3, 0x50, 0x3e, 0x52, 0xeb, 0xf2, 0x64, 0x29, 0xc4, 0x98, 0xfc, 0x8d, 0x51, 0x2d, - 0x67, 0xae, 0x8f, 0xfc, 0x7e, 0xc1, 0x2f, 0x9c, 0x9d, 0xee, 0x07, 0xc8, 0x02, 0x41, 0x8b, 0x15, 0x5d, 0xe9, 0xa1, - 0xa8, 0xa5, 0xaa, 0x18, 0x4a, 0xf3, 0x62, 0x2c, 0x2d, 0x8a, 0x69, 0x63, 0x0f, 0x5e, 0x20, 0x52, 0x70, 0x3d, 0x35, - 0x4b, 0xa6, 0xd0, 0x43, 0xcf, 0xe0, 0x9e, 0xa9, 0xa4, 0xac, 0x75, 0x4e, 0xc3, 0xc0, 0x0a, 0x66, 0xc4, 0x0a, 0x6b, - 0xab, 0x93, 0x96, 0xbd, 0x02, 0x31, 0x96, 0x05, 0x0a, 0x14, 0xaa, 0x83, 0x58, 0x49, 0x15, 0x12, 0xcc, 0xd9, 0x16, - 0x23, 0x3d, 0x5b, 0x49, 0x95, 0xee, 0x34, 0x34, 0xe7, 0x67, 0x85, 0xd1, 0x1b, 0x01, 0xdd, 0xa2, 0xb8, 0xbf, 0x5f, - 0xd7, 0xb0, 0x41, 0x66, 0xa5, 0x2a, 0xaa, 0x17, 0x51, 0x95, 0x69, 0x46, 0x5a, 0x82, 0xec, 0xf9, 0x0c, 0xe4, 0xaa, - 0x72, 0xd4, 0x1e, 0xd3, 0x5e, 0x00, 0xd5, 0xe8, 0xb3, 0xe8, 0xe8, 0x45, 0x9a, 0x43, 0x5d, 0x37, 0x6c, 0xa9, 0x15, - 0x65, 0x52, 0x50, 0xac, 0x91, 0xdf, 0x4e, 0xb2, 0x46, 0x44, 0x76, 0xb3, 0x8b, 0xef, 0xe9, 0xae, 0x92, 0x4d, 0xb2, - 0xf1, 0x69, 0x1c, 0x20, 0xb4, 0x4e, 0x48, 0x2c, 0x6a, 0xbc, 0xe0, 0x2d, 0xe1, 0xd2, 0x72, 0x18, 0x7f, 0x74, 0xbc, - 0xbf, 0xe4, 0x0a, 0x0f, 0xac, 0x48, 0xeb, 0x84, 0x45, 0x7e, 0x32, 0x2e, 0xe0, 0xd7, 0xfe, 0xac, 0x90, 0x59, 0x33, - 0x16, 0xb9, 0xf0, 0x59, 0x94, 0x27, 0xb1, 0xae, 0x2d, 0xdd, 0x93, 0x71, 0xff, 0xd8, 0x99, 0x3a, 0xde, 0x9f, 0x74, - 0x08, 0xfc, 0x02, 0x50, 0xaa, 0x1e, 0x10, 0xfb, 0xc0, 0xf7, 0x78, 0x65, 0x51, 0x04, 0x97, 0xe1, 0xf6, 0x90, 0x8a, - 0xf2, 0x34, 0x77, 0xd5, 0xb4, 0xf2, 0x17, 0x21, 0x09, 0xaa, 0xe1, 0x9b, 0x94, 0xa4, 0x40, 0xe9, 0xa3, 0x1c, 0x26, - 0x3d, 0x62, 0x9f, 0xdf, 0xfb, 0xd2, 0x67, 0xa7, 0xf0, 0xa5, 0x4f, 0xba, 0x66, 0x6d, 0x85, 0xb7, 0xff, 0x36, 0xb0, - 0x83, 0x99, 0x1e, 0xc5, 0xef, 0x87, 0x38, 0x2d, 0xd6, 0x32, 0xea, 0xce, 0x2f, 0x96, 0xbd, 0x0d, 0xf9, 0x3f, 0xfc, - 0xee, 0x82, 0xd3, 0xf0, 0xfd, 0x69, 0xd5, 0xdd, 0x78, 0x5b, 0x39, 0x74, 0xbf, 0x75, 0xbf, 0x6d, 0xa5, 0x5b, 0x3a, - 0x79, 0xe1, 0x7f, 0x7b, 0xef, 0x9c, 0xfb, 0x96, 0x8b, 0xcf, 0x24, 0x33, 0x5e, 0x7d, 0x12, 0xeb, 0x74, 0xac, 0x20, - 0xbd, 0x72, 0x91, 0x49, 0xaf, 0xb7, 0xc6, 0xf1, 0x8b, 0xc4, 0xda, 0xee, 0xc4, 0x9a, 0x7d, 0x50, 0x35, 0x79, 0x8c, - 0xc1, 0xa3, 0xad, 0x2c, 0xa6, 0x3f, 0x58, 0xe7, 0xd1, 0xff, 0x36, 0xb2, 0x39, 0x6e, 0x5c, 0x8e, 0x36, 0x7f, 0xb1, - 0x44, 0x3c, 0x5b, 0xed, 0x57, 0xde, 0xa7, 0xb5, 0x25, 0x8b, 0xbf, 0x49, 0x4b, 0xd2, 0x5a, 0x8c, 0xef, 0xe5, 0x83, - 0x25, 0x7d, 0x8a, 0x3d, 0x07, 0x11, 0x1a, 0xb1, 0xe6, 0x82, 0x1a, 0xb9, 0x4e, 0x57, 0x02, 0xb1, 0x0b, 0x3f, 0x1f, - 0x7a, 0x8a, 0x0b, 0xa4, 0x3a, 0xc8, 0xcb, 0x40, 0x35, 0x51, 0x40, 0x3f, 0x50, 0x53, 0x82, 0x9c, 0x67, 0x7b, 0xc7, - 0xb7, 0x87, 0xaf, 0xf1, 0xf6, 0xcc, 0xd2, 0x46, 0x64, 0x7e, 0x8b, 0x07, 0x47, 0x58, 0x9a, 0xdb, 0x09, 0x93, 0x45, - 0xd8, 0x42, 0xd1, 0xf2, 0x0e, 0xd9, 0x63, 0xf3, 0x4b, 0x03, 0xd5, 0x85, 0x1c, 0xb1, 0x9e, 0xff, 0x5a, 0xef, 0xd2, - 0x15, 0xbc, 0x4b, 0xfb, 0xa2, 0x97, 0x66, 0x3d, 0x04, 0x40, 0x77, 0xea, 0xcf, 0x40, 0x95, 0xb9, 0xa1, 0x28, 0x7d, - 0x7e, 0x9d, 0xb5, 0xa7, 0xda, 0x55, 0xe0, 0xde, 0x69, 0x78, 0x76, 0x42, 0x56, 0x2e, 0x11, 0xfd, 0x18, 0xec, 0x73, - 0x02, 0xfd, 0x41, 0x33, 0xb4, 0xaf, 0x3b, 0x3a, 0x71, 0x09, 0x28, 0x13, 0x75, 0xb8, 0x24, 0x46, 0x30, 0x7e, 0x90, - 0x83, 0x0d, 0xbc, 0x5a, 0xdf, 0xa5, 0x24, 0xae, 0xba, 0x73, 0x08, 0xd1, 0x6b, 0xde, 0xff, 0xea, 0xd7, 0x60, 0xbf, - 0xde, 0xe8, 0x26, 0x23, 0xf2, 0xf7, 0xfc, 0x9c, 0x4b, 0x34, 0x63, 0x88, 0x10, 0x55, 0x2c, 0x5a, 0xf3, 0x1c, 0x0b, - 0x58, 0x9e, 0x97, 0xe0, 0xbb, 0x7c, 0xde, 0x75, 0x62, 0xab, 0x89, 0xa5, 0x6a, 0x30, 0x62, 0x17, 0x0e, 0xde, 0x07, - 0x29, 0x30, 0x70, 0x59, 0x76, 0xd2, 0x7d, 0x47, 0x32, 0x1b, 0x1f, 0x34, 0x07, 0x04, 0x37, 0x3d, 0xc8, 0x02, 0x7f, - 0x23, 0x8c, 0xa1, 0x85, 0x07, 0xeb, 0xa1, 0xd9, 0xa6, 0xbc, 0x06, 0x17, 0xdc, 0x74, 0xa5, 0x22, 0xd5, 0x97, 0xb6, - 0x5a, 0x06, 0x0a, 0x4b, 0xb3, 0x60, 0xe0, 0x5b, 0x5a, 0x2c, 0x8b, 0x10, 0x83, 0x3c, 0x5c, 0xe7, 0x24, 0x84, 0xf2, - 0x04, 0xa1, 0x0e, 0x05, 0x66, 0x3c, 0x38, 0x9d, 0x22, 0x70, 0x30, 0xaf, 0x39, 0xaf, 0x3b, 0xbf, 0x67, 0xc2, 0x32, - 0x4b, 0x8f, 0x7b, 0x0d, 0x97, 0x4b, 0x13, 0x39, 0xd0, 0xbd, 0xd9, 0xfb, 0xdb, 0x2d, 0xf2, 0xbe, 0x11, 0x5a, 0xb1, - 0x0d, 0x17, 0x15, 0x17, 0x59, 0xb4, 0xba, 0xc4, 0xb8, 0x93, 0xae, 0x57, 0xee, 0x85, 0xdd, 0x7a, 0xea, 0x9e, 0xac, - 0x37, 0x4c, 0xe1, 0xd3, 0xb0, 0x8c, 0x25, 0xc4, 0x1a, 0x4b, 0x47, 0xff, 0xbb, 0x2c, 0x7c, 0x96, 0xb5, 0x07, 0x0c, - 0x85, 0xb8, 0x3f, 0xd3, 0xe3, 0x27, 0x00, 0x0e, 0xc7, 0x13, 0x1f, 0x27, 0xe0, 0x40, 0x6b, 0x49, 0xa1, 0x5b, 0x33, - 0x01, 0x11, 0x6b, 0x4b, 0xfe, 0x4b, 0x5f, 0x89, 0x52, 0xf4, 0xd9, 0xb1, 0xeb, 0xdc, 0xe4, 0xfd, 0xdb, 0xea, 0x58, - 0x35, 0x2d, 0x21, 0xef, 0xba, 0x05, 0xea, 0x61, 0xf9, 0xfb, 0xae, 0x58, 0xd1, 0x11, 0x08, 0x3c, 0x7f, 0x63, 0x5a, - 0xac, 0x4f, 0x06, 0x48, 0xd7, 0x83, 0x4f, 0x58, 0x24, 0x9e, 0x82, 0x63, 0x20, 0x8e, 0xab, 0xe1, 0x23, 0xf3, 0xc3, - 0xff, 0x2c, 0x27, 0x56, 0xa6, 0x9d, 0xc9, 0xa9, 0x63, 0xaa, 0x23, 0x83, 0x00, 0xfa, 0x22, 0xf7, 0xb8, 0xee, 0xbf, - 0x3a, 0xb5, 0x54, 0x31, 0x6c, 0xb6, 0x37, 0x71, 0x6b, 0xee, 0xc4, 0x7a, 0xa5, 0xcb, 0xe0, 0xd3, 0xca, 0xfd, 0xe2, - 0xf4, 0x43, 0x26, 0xcc, 0xe0, 0x6c, 0xf1, 0xe5, 0x83, 0x4d, 0x0f, 0x19, 0x0d, 0x80, 0x09, 0x4b, 0xe9, 0x27, 0x83, - 0x94, 0x3e, 0x3f, 0x31, 0x12, 0xda, 0x36, 0xf8, 0x67, 0x6e, 0x2e, 0x47, 0x39, 0xd0, 0x7f, 0x18, 0xec, 0x62, 0xa3, - 0xb7, 0x49, 0x18, 0x3f, 0x40, 0x9a, 0xbd, 0xd1, 0x8f, 0x7a, 0xcd, 0xa1, 0x25, 0x16, 0xe5, 0xd5, 0x93, 0xfc, 0x98, - 0x65, 0x46, 0x01, 0xf8, 0x90, 0xf7, 0x1e, 0xfa, 0xe7, 0x98, 0x62, 0xce, 0xe1, 0xeb, 0xf8, 0xd7, 0x0e, 0x62, 0x6d, - 0xed, 0x74, 0xcd, 0xff, 0xce, 0x5c, 0x78, 0x6a, 0x73, 0xc2, 0x8c, 0xb6, 0x5f, 0xbd, 0xba, 0xda, 0x74, 0x18, 0x01, - 0x34, 0xbe, 0xc2, 0xe8, 0xb1, 0x09, 0xdd, 0x06, 0x66, 0x24, 0xe0, 0x9e, 0x67, 0xd2, 0x95, 0x8e, 0x3f, 0x16, 0xf0, - 0x66, 0xe6, 0x77, 0xa0, 0x09, 0x77, 0x57, 0xd2, 0x68, 0x4b, 0x92, 0x1c, 0xf9, 0x6d, 0xc1, 0x44, 0xb1, 0x75, 0xeb, - 0x26, 0xbc, 0x16, 0xf8, 0xff, 0xf8, 0x41, 0x00, 0xf2, 0x6e, 0x51, 0xb3, 0xa4, 0x76, 0x9a, 0xe6, 0x2b, 0x4d, 0x29, - 0xbb, 0xb0, 0x72, 0x93, 0x5d, 0xce, 0xfc, 0xff, 0x30, 0x82, 0x9b, 0x1c, 0x3e, 0x89, 0x1e, 0xda, 0x57, 0x80, 0xa4, - 0x07, 0x44, 0x17, 0x0f, 0x5a, 0x38, 0x7e, 0x23, 0xca, 0x1c, 0x2c, 0x6c, 0x0b, 0x96, 0x05, 0x83, 0x28, 0x7b, 0x04, - 0xf3, 0x0b, 0x1d, 0x98, 0xfc, 0x4d, 0xef, 0x28, 0xe7, 0x10, 0xe9, 0xd5, 0x77, 0x25, 0xa7, 0xae, 0x9d, 0x5e, 0xfa, - 0xbf, 0x69, 0x02, 0x4c, 0xe6, 0xb6, 0xbe, 0x4e, 0x2d, 0x5f, 0xf8, 0x3c, 0x6b, 0x2f, 0x8a, 0x71, 0xfc, 0xed, 0x8a, - 0x8e, 0x77, 0xc6, 0xac, 0x77, 0x14, 0x35, 0xad, 0xae, 0x7d, 0x75, 0xd3, 0x82, 0x6e, 0x9c, 0x10, 0x3c, 0xc6, 0x87, - 0x58, 0x7e, 0xde, 0x7c, 0x93, 0x50, 0xc7, 0xdf, 0xc6, 0x1e, 0x6f, 0x9b, 0x29, 0x3c, 0xb1, 0x03, 0x7e, 0x47, 0xf7, - 0x96, 0x8e, 0x57, 0x57, 0x4c, 0x7c, 0x08, 0x4e, 0x45, 0x80, 0xd7, 0x93, 0x24, 0xbe, 0x29, 0x89, 0x83, 0x0d, 0xa7, - 0xd6, 0xb6, 0xc2, 0x7d, 0x59, 0xbb, 0x43, 0x16, 0x4e, 0xe3, 0x9b, 0xa8, 0x1b, 0x1e, 0x71, 0xc6, 0x49, 0xdc, 0xea, - 0xa9, 0xef, 0xb6, 0x41, 0x8c, 0xc0, 0xe1, 0x0a, 0x30, 0x3e, 0x11, 0x3e, 0xc4, 0x6c, 0x6a, 0x00, 0xa7, 0x22, 0xb0, - 0xea, 0x87, 0x03, 0x4c, 0xd9, 0xfd, 0x94, 0x0f, 0xe9, 0x88, 0xc0, 0xcc, 0xf4, 0x10, 0xe5, 0xfd, 0xe7, 0xf0, 0x48, - 0xde, 0x9f, 0x4f, 0x86, 0xe1, 0x50, 0xc8, 0xb5, 0xd9, 0xb0, 0x07, 0x56, 0xbe, 0xe0, 0x06, 0xe7, 0x6b, 0xb6, 0xed, - 0xda, 0x84, 0xdc, 0xfc, 0x23, 0x9e, 0x61, 0x97, 0x98, 0xde, 0xdc, 0x3b, 0x5d, 0x47, 0x3d, 0xdf, 0x2b, 0x17, 0x52, - 0xc3, 0x3e, 0xd1, 0xe2, 0xd1, 0xf3, 0x6c, 0xa4, 0x75, 0xc7, 0xc9, 0x5b, 0xfd, 0x4b, 0x72, 0x24, 0x04, 0xc5, 0x4f, - 0xb2, 0xf6, 0x3e, 0x91, 0x6d, 0xdf, 0x05, 0xcf, 0xad, 0xf6, 0x3a, 0x42, 0x77, 0xfa, 0xd3, 0x23, 0x6c, 0x4a, 0xe7, - 0xe7, 0x0e, 0xa0, 0x3a, 0x92, 0xf3, 0xd9, 0xe5, 0x1e, 0x06, 0xe5, 0x70, 0xc5, 0x33, 0x70, 0xb7, 0x62, 0xe6, 0x21, - 0xd2, 0x35, 0x5a, 0x7f, 0xf7, 0x82, 0x37, 0x5c, 0x33, 0x59, 0x1b, 0x91, 0xdc, 0x16, 0xf2, 0x30, 0xc7, 0x08, 0x65, - 0xbe, 0xa0, 0xfc, 0x70, 0xd1, 0x66, 0x72, 0x96, 0x84, 0x2f, 0x24, 0x0a, 0xfc, 0x49, 0x95, 0x67, 0xae, 0x1c, 0x2f, - 0x57, 0x6c, 0x60, 0x2e, 0xe8, 0x8b, 0x51, 0x40, 0x22, 0x73, 0xb7, 0xfc, 0x32, 0xcf, 0x90, 0xfc, 0x35, 0x72, 0x6d, - 0x07, 0x58, 0xbe, 0xce, 0x53, 0x06, 0x37, 0x2e, 0x5a, 0x0b, 0x1d, 0x5f, 0x4a, 0x26, 0x41, 0x91, 0x42, 0xa8, 0xb4, - 0x48, 0x68, 0xd4, 0x2a, 0x15, 0x30, 0x6e, 0xa1, 0xa1, 0xdf, 0x6b, 0xd5, 0xe7, 0x4f, 0xd8, 0xf9, 0x63, 0x94, 0xff, - 0x51, 0x5c, 0x04, 0xc8, 0x91, 0xb7, 0xa8, 0x1b, 0xf0, 0x4c, 0x91, 0xd4, 0x66, 0x8e, 0x4b, 0x24, 0x1c, 0x83, 0x64, - 0x61, 0xb7, 0x61, 0xef, 0x7f, 0xc7, 0xd7, 0x54, 0x90, 0x30, 0x88, 0xf0, 0xeb, 0x2c, 0x83, 0x6e, 0xe0, 0x22, 0x98, - 0x6a, 0x84, 0x07, 0x1c, 0x45, 0xdd, 0x35, 0xab, 0x80, 0x13, 0x28, 0x41, 0xc9, 0x22, 0x89, 0x1f, 0x77, 0xa0, 0xff, - 0x5f, 0x8a, 0x51, 0x7d, 0xd6, 0xd7, 0xb7, 0x15, 0xd4, 0x43, 0x87, 0x02, 0x15, 0x19, 0x37, 0xc0, 0x66, 0x8f, 0x8f, - 0x45, 0x0e, 0xd8, 0x30, 0xf9, 0xaf, 0xb0, 0xb0, 0x52, 0xd9, 0x72, 0x3a, 0xfc, 0xcb, 0x35, 0x8b, 0x83, 0x3d, 0x3c, - 0x4c, 0xe3, 0x30, 0x3e, 0xa5, 0x25, 0x7d, 0x5e, 0xe8, 0xa4, 0x51, 0xd1, 0xf9, 0x71, 0x9e, 0xf5, 0x7d, 0x57, 0xf2, - 0xf8, 0x35, 0x5e, 0x9f, 0xd9, 0x53, 0x74, 0x9d, 0x1f, 0x7e, 0xf4, 0xa3, 0xb1, 0x65, 0xfc, 0x37, 0x7a, 0x61, 0x4f, - 0x17, 0x94, 0x96, 0x81, 0xf7, 0xe9, 0xd1, 0x62, 0x25, 0xfb, 0x82, 0x1c, 0x7d, 0x8c, 0x8e, 0xf6, 0x78, 0x4e, 0xf9, - 0x79, 0x16, 0xe7, 0xfd, 0xed, 0x6b, 0xbc, 0x38, 0xf3, 0xac, 0x5c, 0xeb, 0xcd, 0xa7, 0xde, 0x06, 0xec, 0x2d, 0x70, - 0x3f, 0x89, 0xdd, 0x40, 0x84, 0x93, 0x60, 0x0c, 0xd3, 0xbd, 0x69, 0x44, 0x03, 0xec, 0x77, 0xed, 0xf9, 0xc0, 0x03, - 0xfd, 0xcf, 0xe6, 0xf5, 0xe0, 0xdc, 0x6e, 0x54, 0x53, 0x0a, 0x70, 0xc1, 0x64, 0x45, 0x31, 0x46, 0x82, 0x48, 0x23, - 0xbd, 0x1d, 0x1d, 0xb9, 0xa8, 0x2b, 0x9c, 0x26, 0xba, 0xe4, 0x69, 0xe2, 0x26, 0x65, 0x6b, 0x99, 0x00, 0x50, 0x96, - 0x64, 0xec, 0xd0, 0xf3, 0x7a, 0x80, 0xf4, 0x0e, 0x72, 0x42, 0x2c, 0xc7, 0x25, 0x90, 0x2d, 0x19, 0x7c, 0xfb, 0x0f, - 0xab, 0x40, 0x5e, 0x6f, 0xe8, 0xb0, 0x09, 0x69, 0xf6, 0x38, 0x3d, 0x7d, 0x71, 0x00, 0xae, 0x44, 0xa6, 0x67, 0x9a, - 0x06, 0x17, 0x7d, 0x8e, 0x3e, 0x34, 0xc2, 0x5a, 0x60, 0x2a, 0xea, 0xb4, 0xe5, 0xad, 0x52, 0x71, 0xf3, 0xe0, 0x78, - 0x0a, 0x07, 0x43, 0x33, 0x30, 0x22, 0x7f, 0xfa, 0x0f, 0x1b, 0xc6, 0x72, 0x24, 0xad, 0x6c, 0x98, 0xbf, 0xec, 0x72, - 0x2b, 0x37, 0x4b, 0x12, 0x9a, 0x86, 0x5e, 0x3d, 0x88, 0x15, 0xde, 0xa9, 0xff, 0xe7, 0x41, 0x69, 0x83, 0x38, 0x87, - 0x64, 0x01, 0x51, 0x3c, 0x47, 0x38, 0xc5, 0xa0, 0xc5, 0x6c, 0x90, 0xc3, 0x94, 0x81, 0xc0, 0x2b, 0xab, 0x37, 0x81, - 0x1b, 0x71, 0xb9, 0xec, 0xe9, 0xd4, 0x6b, 0xae, 0x9d, 0xd4, 0x26, 0xb2, 0x08, 0x57, 0xf8, 0xcd, 0x07, 0x80, 0xae, - 0x36, 0xd4, 0x51, 0x08, 0xe4, 0x08, 0x9b, 0xe7, 0x8a, 0x14, 0xdd, 0x78, 0x7c, 0x1b, 0xf6, 0x2d, 0x47, 0x88, 0xcd, - 0x8f, 0xb9, 0x6b, 0x8d, 0x06, 0x8d, 0x4c, 0x32, 0x6c, 0x5c, 0x0a, 0x76, 0x92, 0xa0, 0x87, 0x1a, 0xc7, 0x38, 0x94, - 0x15, 0x7a, 0x1e, 0x19, 0xe3, 0x88, 0xaf, 0x7c, 0xc9, 0x9a, 0x93, 0x68, 0x91, 0x8a, 0x81, 0xfd, 0x1c, 0xbe, 0xce, - 0x0b, 0x41, 0x2e, 0x8e, 0xb8, 0xe9, 0xa9, 0x21, 0xa7, 0x3e, 0x19, 0x14, 0xa8, 0x88, 0x5b, 0xaf, 0x2d, 0x68, 0x98, - 0x47, 0x01, 0x71, 0x6e, 0x16, 0x38, 0xc2, 0x29, 0x2c, 0x6a, 0xff, 0xe0, 0xe8, 0xbc, 0x75, 0xb4, 0x40, 0x90, 0xda, - 0x09, 0x67, 0x38, 0x99, 0xd1, 0x11, 0x32, 0xc3, 0xe5, 0xf1, 0x71, 0x53, 0xd3, 0x5a, 0x53, 0xa7, 0x95, 0x22, 0xc9, - 0x0c, 0x69, 0x26, 0xb0, 0xc4, 0x0f, 0xdb, 0xde, 0x5c, 0xa4, 0x62, 0x45, 0xe0, 0x2d, 0x66, 0xfc, 0x5c, 0xd8, 0x81, - 0xe2, 0xd5, 0x84, 0x0e, 0x6c, 0xaa, 0xfc, 0xdc, 0xe6, 0xa6, 0x27, 0xfc, 0xc2, 0x61, 0xfa, 0x75, 0x26, 0xfa, 0x59, - 0x98, 0xa3, 0xd5, 0x41, 0x2f, 0x5c, 0x21, 0xe3, 0xc4, 0x33, 0x64, 0xd9, 0x94, 0x43, 0xf7, 0x1a, 0x25, 0x8a, 0xa4, - 0x01, 0x39, 0xda, 0x43, 0x4e, 0x2e, 0xf3, 0xa4, 0xd5, 0x34, 0x2a, 0xbb, 0x24, 0xe1, 0x2d, 0x7e, 0xe4, 0x31, 0xa1, - 0x44, 0xf9, 0x3c, 0xcd, 0x33, 0x92, 0xac, 0x71, 0xb7, 0xa3, 0xe0, 0x1a, 0xbd, 0xb5, 0xba, 0xac, 0xd5, 0xb0, 0x9f, - 0xc8, 0xbf, 0x52, 0x47, 0x6f, 0x52, 0x3c, 0x18, 0x04, 0x19, 0x86, 0xab, 0x96, 0xdd, 0x43, 0x8b, 0x1e, 0xfb, 0xa2, - 0xfa, 0x77, 0x83, 0x60, 0xe2, 0x49, 0x21, 0x84, 0x96, 0x91, 0x03, 0xfd, 0x37, 0x55, 0xaa, 0x25, 0x12, 0xde, 0x3b, - 0x9f, 0xb3, 0x77, 0x13, 0xa4, 0x04, 0xb3, 0x4d, 0x95, 0x7b, 0x20, 0x5c, 0x87, 0x80, 0xd7, 0x0d, 0x77, 0xa8, 0x77, - 0x91, 0x5b, 0x11, 0x74, 0x29, 0x05, 0x88, 0x88, 0x00, 0x8c, 0x5e, 0x0c, 0x34, 0x1c, 0xa6, 0x19, 0xac, 0x44, 0x82, - 0x7f, 0x95, 0x85, 0x21, 0xb5, 0xec, 0x28, 0x07, 0xc0, 0x66, 0xb3, 0x11, 0x8c, 0xbe, 0x60, 0x05, 0x7c, 0x36, 0x89, - 0xff, 0xc6, 0xa9, 0x6a, 0xa6, 0x75, 0x23, 0xe5, 0xdd, 0xb8, 0xb1, 0x76, 0x81, 0x18, 0xa6, 0xa5, 0x75, 0x3b, 0x21, - 0x09, 0x28, 0x0d, 0x0b, 0x9f, 0x3c, 0xbf, 0x3d, 0x46, 0xd7, 0xdf, 0x1f, 0x3e, 0x30, 0x49, 0x14, 0x19, 0x55, 0x32, - 0x30, 0x4d, 0x84, 0x8c, 0x6f, 0x11, 0x3a, 0x1e, 0x8e, 0xa6, 0x45, 0x7e, 0xea, 0x75, 0x6c, 0x37, 0x50, 0x8f, 0x2f, - 0xbf, 0xb6, 0xdc, 0x39, 0xd1, 0xda, 0xe9, 0xb8, 0x3f, 0x04, 0x9a, 0x9c, 0x88, 0xaa, 0xb2, 0x18, 0x25, 0xfb, 0x87, - 0x81, 0x6d, 0x24, 0x39, 0xf5, 0x54, 0x18, 0x77, 0x6f, 0x73, 0x4f, 0x87, 0x89, 0x8b, 0x23, 0xff, 0xcb, 0x1f, 0xc1, - 0xb5, 0x52, 0xbc, 0xf2, 0x1d, 0xd8, 0x72, 0x09, 0x57, 0x0e, 0x56, 0x0d, 0x02, 0xa2, 0x94, 0x00, 0x72, 0x1d, 0x1f, - 0x1d, 0xe3, 0x24, 0x79, 0xd7, 0x33, 0xd6, 0xd4, 0x6c, 0x49, 0x69, 0xe6, 0x63, 0x5f, 0x53, 0x69, 0x1e, 0xe7, 0x9a, - 0x60, 0x96, 0x64, 0xd9, 0x49, 0x56, 0x80, 0xd7, 0x74, 0x0d, 0xf3, 0x55, 0x85, 0x40, 0x30, 0xdf, 0x55, 0x99, 0x8b, - 0x53, 0x85, 0xb8, 0x1d, 0x09, 0x6d, 0xaa, 0x45, 0x78, 0xe1, 0xc0, 0x38, 0x9c, 0x5f, 0x33, 0x2d, 0x06, 0x06, 0x20, - 0x57, 0x52, 0x6f, 0x84, 0xf3, 0xf4, 0x20, 0x6f, 0x43, 0xf1, 0xa4, 0xc0, 0x56, 0xac, 0x78, 0xf0, 0xad, 0x97, 0x46, - 0xb3, 0xca, 0x68, 0x97, 0x5b, 0x71, 0xa6, 0xf3, 0xa4, 0xcf, 0x4e, 0x9b, 0xd2, 0xad, 0x87, 0x80, 0x0a, 0xe5, 0xf9, - 0x19, 0xcf, 0xc7, 0x2b, 0xc4, 0x39, 0xe6, 0xac, 0x09, 0xd5, 0x73, 0x61, 0xfd, 0x3a, 0x3d, 0x64, 0xff, 0x7a, 0xbc, - 0xb5, 0xce, 0x54, 0xdc, 0x3c, 0x53, 0xc8, 0x54, 0xfc, 0x15, 0xf7, 0x5e, 0x3c, 0x30, 0x5c, 0x93, 0xc7, 0x90, 0x67, - 0x2a, 0x27, 0x7c, 0x69, 0xa0, 0xe9, 0x20, 0xaa, 0xd3, 0xad, 0x10, 0x57, 0x5d, 0x18, 0xa2, 0x70, 0xf7, 0x29, 0x2f, - 0x48, 0xeb, 0xb0, 0xf7, 0x54, 0xa3, 0xc3, 0xa0, 0xa6, 0x40, 0x9d, 0x16, 0x83, 0x95, 0xb4, 0x5c, 0x50, 0x0e, 0x05, - 0x33, 0xd5, 0x06, 0x1e, 0xd8, 0x9a, 0xff, 0x7f, 0x40, 0x21, 0x7a, 0xdc, 0xf6, 0xaf, 0xfc, 0x05, 0x73, 0xc2, 0x8c, - 0x25, 0x33, 0x3c, 0xbc, 0xda, 0x19, 0x7f, 0x0a, 0xba, 0xb1, 0x6a, 0xa3, 0x8c, 0x55, 0x39, 0x51, 0x06, 0xf7, 0x93, - 0xa5, 0x98, 0x3a, 0x85, 0x0b, 0x31, 0x95, 0x97, 0x7d, 0xa4, 0x92, 0x52, 0x1c, 0x79, 0x51, 0x01, 0xc0, 0xbc, 0x0b, - 0x34, 0x65, 0xca, 0x93, 0x20, 0x09, 0x5c, 0x54, 0x01, 0xd1, 0x8c, 0x97, 0x73, 0x7a, 0xe3, 0x2b, 0x8e, 0x7b, 0xc4, - 0x49, 0x74, 0xe6, 0x10, 0xd4, 0xf5, 0xf9, 0x29, 0x23, 0x62, 0x41, 0xd8, 0x57, 0x8c, 0x43, 0xd9, 0x4e, 0x58, 0x5f, - 0xac, 0xd7, 0x77, 0xde, 0x24, 0x8a, 0xa4, 0x2b, 0xb3, 0x7c, 0xe4, 0xfb, 0x0c, 0x99, 0xad, 0x92, 0x8d, 0x38, 0x86, - 0x32, 0xce, 0x19, 0x8f, 0x62, 0x03, 0x81, 0xb3, 0xa5, 0x2f, 0xb5, 0x90, 0xe3, 0xb2, 0x34, 0x94, 0xc7, 0xc0, 0xb9, - 0x2b, 0xdb, 0x9b, 0xd7, 0xf1, 0x31, 0xe7, 0xfd, 0xb7, 0xeb, 0x4d, 0xad, 0xa8, 0x3f, 0x63, 0xd5, 0x86, 0x7d, 0x81, - 0xa2, 0x79, 0x30, 0xeb, 0x74, 0x8e, 0xf2, 0x88, 0x27, 0x9c, 0x3c, 0x8b, 0x3a, 0xd6, 0xae, 0x8f, 0x92, 0x17, 0x67, - 0xaf, 0xa3, 0xe2, 0x34, 0x88, 0x7e, 0x59, 0xcd, 0x52, 0x07, 0xd7, 0x77, 0xc8, 0x5e, 0xe6, 0x72, 0xed, 0x44, 0xa9, - 0x86, 0x06, 0xce, 0x9f, 0xe4, 0xab, 0xd8, 0x3e, 0xe1, 0x2c, 0x67, 0xa2, 0xca, 0x7e, 0x9d, 0x07, 0xa9, 0x30, 0xe7, - 0xf8, 0xe3, 0xd2, 0x86, 0xe8, 0x2b, 0x22, 0x24, 0xe6, 0xac, 0xfb, 0xce, 0xa6, 0x2c, 0x71, 0xe9, 0xc3, 0x08, 0xa1, - 0x9f, 0x18, 0xa1, 0x19, 0x47, 0x3d, 0x6f, 0xfe, 0xb7, 0x91, 0xef, 0xb3, 0x9e, 0x53, 0x74, 0xc7, 0x7b, 0xb2, 0x1a, - 0x2a, 0xdb, 0xe9, 0x67, 0xee, 0xd4, 0x9e, 0x82, 0x53, 0x7b, 0x82, 0x4a, 0x90, 0xc0, 0xcf, 0x0b, 0xcf, 0xf1, 0xa4, - 0xd9, 0x54, 0x17, 0x4f, 0xdb, 0x5f, 0x8d, 0xcf, 0x2f, 0x95, 0x8d, 0xaf, 0x38, 0xbb, 0x52, 0x68, 0x67, 0x78, 0x4b, - 0x67, 0xae, 0x0c}; +const uint8_t INDEX_BR[] PROGMEM = { + 0x1b, 0xe2, 0x97, 0xa3, 0x90, 0xa2, 0x95, 0x55, 0x51, 0x04, 0x1b, 0x07, 0x80, 0x20, 0x79, 0x0e, 0x50, 0xab, 0x02, + 0xdb, 0x98, 0x16, 0xf4, 0x7b, 0x22, 0xa3, 0x4d, 0xd3, 0x86, 0xc1, 0x26, 0x48, 0x49, 0x60, 0xbe, 0xb3, 0xc9, 0xa1, + 0x8c, 0x96, 0x10, 0x1b, 0x21, 0xcf, 0x48, 0x68, 0xce, 0x10, 0x34, 0x32, 0x7c, 0xbf, 0x71, 0x7b, 0x03, 0x8f, 0xdd, + 0x37, 0x06, 0x9a, 0x30, 0x50, 0xe4, 0x08, 0x47, 0x68, 0xec, 0x93, 0xdc, 0x7d, 0x53, 0xf5, 0x4f, 0xd7, 0x8a, 0xcf, + 0x2f, 0x85, 0x3a, 0x6c, 0xa9, 0x63, 0xcb, 0xf5, 0xc8, 0x18, 0xe3, 0xf5, 0xdb, 0x0c, 0x05, 0x9b, 0x48, 0x2c, 0x42, + 0x21, 0xa0, 0x2c, 0x25, 0xf7, 0xcb, 0xb7, 0xaa, 0x65, 0xd5, 0x7f, 0x3e, 0x2f, 0x94, 0x2b, 0x53, 0xa7, 0x0f, 0x4e, + 0x56, 0xa9, 0xf7, 0xce, 0x54, 0x88, 0x39, 0xef, 0xea, 0x3d, 0x69, 0x56, 0xd0, 0x52, 0x96, 0x0a, 0x5b, 0x35, 0xd4, + 0x42, 0xd6, 0x35, 0x10, 0xf3, 0x7f, 0xec, 0x95, 0xd3, 0x2a, 0xfe, 0x4d, 0x22, 0x6a, 0xd6, 0x69, 0x6e, 0x7b, 0x5a, + 0xdd, 0x33, 0x58, 0x21, 0xa4, 0x33, 0xd6, 0x61, 0x05, 0xf5, 0x08, 0xa9, 0x10, 0x32, 0xf5, 0xdc, 0x04, 0x59, 0x72, + 0x41, 0xf4, 0x09, 0xfa, 0x08, 0x08, 0x9b, 0xcc, 0xf3, 0x2d, 0x71, 0xb4, 0x1c, 0xe3, 0x04, 0x64, 0x9a, 0x96, 0x5b, + 0x16, 0x58, 0xed, 0xbf, 0x37, 0xd5, 0x2a, 0x6d, 0x80, 0x66, 0xcf, 0xba, 0xd4, 0xb8, 0xd4, 0x38, 0x65, 0x10, 0x57, + 0x3a, 0xe7, 0x93, 0xe0, 0x82, 0x90, 0x78, 0xef, 0xfd, 0xff, 0x96, 0xed, 0x30, 0x44, 0x77, 0x13, 0x3b, 0x70, 0x92, + 0xe8, 0xb0, 0xf4, 0x25, 0x5a, 0xc9, 0xff, 0xff, 0xbb, 0x01, 0x76, 0x03, 0x94, 0x16, 0x20, 0xa5, 0x2d, 0x8a, 0xe2, + 0x56, 0x51, 0xd4, 0xdc, 0x18, 0xcb, 0x99, 0xb3, 0x4e, 0x3b, 0x55, 0x67, 0x5d, 0x64, 0xa3, 0xc4, 0xf8, 0xec, 0x2a, + 0xb7, 0x51, 0x68, 0x6c, 0x7a, 0xd9, 0x85, 0x97, 0x9e, 0xcb, 0x61, 0x26, 0xbe, 0xeb, 0x3a, 0x6b, 0xe5, 0x38, 0xd8, + 0x63, 0xa8, 0xb5, 0xba, 0xbe, 0xbd, 0x1d, 0xe3, 0xc4, 0x11, 0xa3, 0x08, 0xc4, 0xfe, 0x26, 0x3a, 0xfb, 0x01, 0x5d, + 0xb4, 0xfc, 0x1d, 0x78, 0xca, 0xb2, 0xac, 0x61, 0x39, 0x21, 0xe5, 0x6b, 0x5a, 0x70, 0x76, 0x57, 0x91, 0x4c, 0x8c, + 0x3d, 0x0e, 0x50, 0x4e, 0x41, 0x1c, 0xda, 0x62, 0xd2, 0xf1, 0x25, 0xce, 0x03, 0xf4, 0xfa, 0x3b, 0xc1, 0xc4, 0xed, + 0xc1, 0xdf, 0x8f, 0xe1, 0xc0, 0x0e, 0x34, 0x72, 0x3c, 0xb3, 0x3f, 0xfa, 0xc0, 0xe6, 0xcd, 0xf4, 0x01, 0x19, 0xf4, + 0x28, 0x5b, 0xde, 0x02, 0x6e, 0xa2, 0x24, 0x59, 0x76, 0x94, 0x8d, 0x00, 0x35, 0xab, 0xbe, 0xd9, 0xc0, 0xfb, 0xfa, + 0x97, 0x4f, 0x8f, 0x6e, 0xa4, 0x28, 0x0a, 0xfd, 0x43, 0xd9, 0xf2, 0xb2, 0xc2, 0x75, 0x49, 0x97, 0x8c, 0xcd, 0x61, + 0xb3, 0x64, 0x52, 0x1e, 0x46, 0x1e, 0xa2, 0xe0, 0xb5, 0x26, 0xd3, 0xf5, 0x3c, 0x9e, 0x19, 0x32, 0x45, 0xb9, 0x28, + 0xf5, 0x40, 0xcf, 0xa5, 0xf1, 0xcd, 0x8d, 0x29, 0x55, 0xe3, 0x2c, 0x43, 0x12, 0xa2, 0x4d, 0x37, 0xda, 0x94, 0x3e, + 0x49, 0x88, 0x4f, 0x2c, 0xa5, 0x67, 0xbe, 0xb7, 0x75, 0x28, 0xb8, 0x2f, 0x0d, 0x75, 0xce, 0x87, 0x3f, 0xe3, 0x30, + 0x5a, 0x25, 0x92, 0x30, 0xd3, 0x2d, 0x45, 0xca, 0xe5, 0x49, 0xc7, 0x4d, 0x13, 0x95, 0xa5, 0x9f, 0x7f, 0x2d, 0x49, + 0x46, 0x5a, 0x49, 0x11, 0x12, 0xd2, 0xdd, 0x38, 0x3c, 0x31, 0x63, 0x5e, 0xb6, 0xe6, 0xde, 0xcd, 0xcd, 0x6d, 0x67, + 0x46, 0x53, 0x16, 0x86, 0xd4, 0xad, 0x07, 0xac, 0xdb, 0xd7, 0x9f, 0x48, 0xcc, 0xa6, 0x4d, 0x9f, 0x6c, 0x8b, 0xf2, + 0xcb, 0xcd, 0x1b, 0x1e, 0xa9, 0x39, 0x37, 0x4d, 0xcd, 0x80, 0x9b, 0x19, 0x67, 0x64, 0x70, 0xb0, 0x38, 0x00, 0x9f, + 0xab, 0x26, 0xca, 0xb7, 0xbb, 0x55, 0x50, 0xcf, 0x31, 0x65, 0x12, 0xb6, 0x2b, 0x36, 0x9d, 0x17, 0x2b, 0x50, 0xd1, + 0x13, 0x72, 0x80, 0x7f, 0x88, 0x62, 0xe4, 0xee, 0x40, 0xb7, 0x56, 0xd2, 0x66, 0xa3, 0xb0, 0x0e, 0x31, 0xeb, 0x9a, + 0x27, 0xc1, 0xd5, 0x7b, 0x63, 0xb3, 0x84, 0x1b, 0xc8, 0xbf, 0x35, 0x29, 0x8a, 0x3c, 0xd0, 0x66, 0x03, 0x2a, 0x3e, + 0xb9, 0x79, 0x4c, 0x16, 0x01, 0xaa, 0xe8, 0x0e, 0x01, 0x1c, 0x73, 0x05, 0x78, 0x3a, 0x9c, 0x23, 0xb8, 0x18, 0x78, + 0xc5, 0xcd, 0x53, 0x7f, 0xb4, 0x61, 0xb8, 0x11, 0xa4, 0xcd, 0xc6, 0x27, 0x27, 0xb6, 0xae, 0x51, 0x01, 0x1d, 0xec, + 0xe4, 0x6b, 0x99, 0xe4, 0xdb, 0x2d, 0xbb, 0x66, 0x38, 0x54, 0xf5, 0xf2, 0xba, 0xc3, 0x24, 0x41, 0xfa, 0xae, 0x46, + 0x43, 0xdd, 0xfd, 0x9d, 0x0d, 0x52, 0x98, 0x1c, 0x7f, 0xab, 0x29, 0x83, 0x0f, 0xb9, 0x11, 0xe0, 0xd3, 0x49, 0x86, + 0xef, 0xbb, 0xdf, 0x0a, 0x04, 0x76, 0x11, 0x07, 0x48, 0x7f, 0x86, 0x4c, 0x3a, 0x84, 0xf5, 0xb6, 0x32, 0x54, 0x59, + 0xed, 0xd5, 0xf1, 0xf0, 0xf8, 0x39, 0x2d, 0x10, 0x85, 0x11, 0xd2, 0xef, 0x72, 0xcb, 0xd2, 0x8f, 0xf2, 0x2e, 0x7c, + 0x9b, 0x28, 0xa6, 0x07, 0x7f, 0x7a, 0x7c, 0x43, 0x28, 0x0b, 0x3f, 0xe5, 0x98, 0x64, 0x6f, 0x63, 0xad, 0xd9, 0x90, + 0x34, 0x84, 0x30, 0xf9, 0x53, 0x6e, 0xea, 0xe3, 0x5f, 0x36, 0x39, 0xe7, 0x26, 0x49, 0xf0, 0xe9, 0xe7, 0x32, 0x50, + 0x58, 0x41, 0x1e, 0xaa, 0x98, 0x6f, 0x6b, 0xfa, 0x94, 0x4b, 0x20, 0x01, 0x84, 0x2a, 0x32, 0x84, 0x73, 0x5a, 0x39, + 0x4a, 0x57, 0xbc, 0xbd, 0x86, 0xa4, 0xb2, 0x77, 0x99, 0xe5, 0xdd, 0x44, 0x5d, 0xd5, 0xde, 0x5b, 0x94, 0x7e, 0xec, + 0x53, 0xdd, 0x67, 0xb8, 0x8d, 0xbb, 0x1d, 0x65, 0xf4, 0xe8, 0xe4, 0x73, 0x3d, 0xbc, 0xba, 0xd9, 0x30, 0xbe, 0x1f, + 0xeb, 0x0b, 0x21, 0xaf, 0x24, 0x9a, 0x44, 0xa2, 0x0a, 0xbf, 0xfe, 0xfa, 0x06, 0x14, 0x59, 0x76, 0x6d, 0x97, 0x7e, + 0xe0, 0x70, 0x8c, 0x41, 0x28, 0xac, 0x0b, 0xad, 0x4b, 0xb5, 0xbb, 0x54, 0xeb, 0x0d, 0x05, 0x24, 0xc7, 0xad, 0x04, + 0xfb, 0x9b, 0x12, 0x44, 0xec, 0x20, 0x03, 0xff, 0xba, 0x91, 0xa0, 0x50, 0xba, 0x24, 0xed, 0x9c, 0x96, 0x7e, 0xef, + 0x6f, 0x24, 0x6c, 0xd1, 0x8c, 0x55, 0xe9, 0x0f, 0x8c, 0x2f, 0x8b, 0x62, 0x44, 0x3c, 0x1b, 0x46, 0x3b, 0x49, 0x99, + 0xdc, 0xd6, 0x7a, 0x70, 0x5d, 0xe5, 0x2a, 0x62, 0x2e, 0x54, 0xab, 0x44, 0xf2, 0xf4, 0x61, 0xb2, 0xd8, 0x07, 0x8b, + 0x01, 0x3e, 0x04, 0x19, 0xe1, 0x5d, 0x8e, 0x2a, 0xff, 0x86, 0xa3, 0x59, 0xe5, 0xcc, 0x8d, 0xd3, 0x51, 0x6f, 0xc1, + 0x15, 0x9f, 0x37, 0x73, 0x3d, 0x49, 0x99, 0xca, 0x53, 0x3a, 0x96, 0x0c, 0x92, 0x2b, 0x8b, 0xde, 0x08, 0x68, 0x52, + 0x87, 0x31, 0xb2, 0x68, 0x81, 0xb1, 0xe9, 0x9f, 0x78, 0xf1, 0x22, 0xe8, 0x84, 0x48, 0xdb, 0x49, 0x4d, 0xd2, 0xea, + 0x80, 0x1f, 0xec, 0x50, 0x77, 0x66, 0xe7, 0x13, 0x36, 0x02, 0x85, 0x6f, 0xdd, 0x68, 0xe0, 0x4b, 0x6c, 0x5b, 0xbe, + 0x18, 0xca, 0xaf, 0x92, 0x97, 0xdd, 0x4e, 0x90, 0x28, 0x4e, 0x48, 0x42, 0x62, 0xc3, 0xf1, 0xf7, 0x71, 0x59, 0x2b, + 0x24, 0x2e, 0x4b, 0xf1, 0x52, 0x2d, 0x7b, 0xbf, 0x8f, 0x5d, 0x1a, 0x29, 0x6b, 0xdd, 0xed, 0x8b, 0x0d, 0xa3, 0xaf, + 0x1a, 0x94, 0x32, 0xc4, 0x54, 0x3d, 0xa1, 0xee, 0x41, 0x42, 0x00, 0xc3, 0xc2, 0x23, 0x57, 0x52, 0x9c, 0x48, 0x54, + 0x42, 0x82, 0x61, 0xb1, 0xcb, 0x1b, 0xae, 0x8f, 0xfa, 0x30, 0x6c, 0x00, 0xc4, 0x1b, 0x74, 0x7c, 0x99, 0x51, 0x60, + 0x45, 0x6d, 0x05, 0xe0, 0x44, 0x15, 0x24, 0x98, 0xb1, 0x40, 0x5f, 0xa1, 0x5e, 0x43, 0x55, 0xae, 0x10, 0xbd, 0x9d, + 0x80, 0x41, 0x6e, 0x35, 0x5d, 0xe8, 0xb2, 0x34, 0x7a, 0x1b, 0xb8, 0x29, 0xad, 0x6d, 0xd3, 0xb4, 0x4f, 0x32, 0x0e, + 0x4e, 0xd7, 0xb3, 0x98, 0x12, 0x37, 0xd4, 0x5c, 0x19, 0xbd, 0x26, 0xaa, 0xbb, 0x5b, 0x7d, 0x92, 0xd3, 0xb7, 0xd3, + 0x2e, 0xfa, 0x6e, 0xf6, 0x2b, 0xaa, 0xc4, 0x24, 0x46, 0x6d, 0x58, 0xe9, 0x7e, 0x8d, 0x27, 0x23, 0x14, 0xbc, 0x15, + 0xaf, 0x1b, 0x88, 0x7b, 0xd1, 0x9d, 0xba, 0x9c, 0x08, 0xd2, 0xf9, 0x9b, 0x81, 0xfd, 0xf8, 0x94, 0xc1, 0x0a, 0xf1, + 0xc8, 0xfa, 0x4e, 0x5b, 0x87, 0x86, 0x34, 0xed, 0x92, 0xcf, 0xfd, 0x49, 0xda, 0xd7, 0x25, 0xc9, 0xe3, 0x22, 0xdf, + 0x9e, 0xdd, 0x53, 0x30, 0x15, 0xe0, 0x2c, 0x5a, 0xcf, 0x41, 0xb3, 0x0d, 0xa4, 0x3a, 0x7b, 0x70, 0xc8, 0x9e, 0x4e, + 0x6b, 0xa7, 0xeb, 0xa3, 0x55, 0xd5, 0xc6, 0x45, 0x89, 0x21, 0x81, 0x5f, 0xb1, 0x29, 0x01, 0xe4, 0x40, 0xe4, 0xd1, + 0x6b, 0xe3, 0x4b, 0xe1, 0xfa, 0xf5, 0x12, 0x7d, 0x82, 0x59, 0xb9, 0xfa, 0x07, 0x0d, 0xa9, 0xa4, 0xd5, 0x80, 0x90, + 0x91, 0xfa, 0x8c, 0xf2, 0xcc, 0x0a, 0xee, 0x97, 0xce, 0x17, 0x31, 0x3a, 0x3c, 0xfd, 0x6e, 0x3f, 0x34, 0xf6, 0x2d, + 0x94, 0x17, 0x65, 0xa5, 0x32, 0x73, 0x94, 0x13, 0x80, 0x24, 0x96, 0x3c, 0x25, 0xd2, 0xc6, 0xb7, 0xad, 0x2d, 0x11, + 0xc1, 0x37, 0x7c, 0x88, 0x77, 0xee, 0x05, 0xc7, 0x26, 0x21, 0x81, 0x0a, 0xed, 0x76, 0x01, 0x14, 0x54, 0x90, 0x89, + 0x23, 0xc9, 0xd5, 0xd1, 0x20, 0xb1, 0x3f, 0x56, 0x36, 0x1d, 0x3c, 0x22, 0x92, 0xb5, 0xcd, 0x06, 0xd0, 0x91, 0xc6, + 0xab, 0x4a, 0x92, 0x83, 0x08, 0x4b, 0x00, 0x3a, 0x56, 0xfe, 0x49, 0x4a, 0x5c, 0x4e, 0xd0, 0x85, 0x41, 0xc1, 0x5d, + 0x1a, 0xc6, 0xcd, 0x26, 0xb9, 0xb0, 0x52, 0x01, 0xfd, 0x78, 0xe8, 0xc7, 0x63, 0x0f, 0x45, 0x0a, 0x82, 0x56, 0x88, + 0x87, 0x9c, 0xd2, 0x81, 0x22, 0xfa, 0xa5, 0xfe, 0x71, 0x9b, 0x37, 0xbf, 0x26, 0xe6, 0x46, 0x89, 0x8a, 0xe6, 0x3c, + 0xa6, 0x52, 0xd4, 0xc7, 0x88, 0xc1, 0x3f, 0x66, 0xec, 0xd0, 0x61, 0xa2, 0x92, 0x5e, 0xaa, 0x54, 0xac, 0x83, 0x75, + 0x26, 0x95, 0x02, 0xed, 0xd4, 0xf8, 0xe2, 0x9b, 0x48, 0x12, 0xbc, 0x13, 0xb3, 0xce, 0x20, 0x85, 0x97, 0x2a, 0xac, + 0x95, 0xe8, 0x97, 0x2d, 0x0a, 0xa2, 0xc4, 0x35, 0xb4, 0x0e, 0x69, 0x42, 0x11, 0xec, 0x09, 0x1d, 0x94, 0x68, 0xf9, + 0x87, 0xb6, 0xca, 0x48, 0x82, 0x72, 0xdf, 0xf3, 0xc1, 0xbb, 0xcb, 0x80, 0xf4, 0xf0, 0x51, 0x0f, 0x29, 0x24, 0x16, + 0x3e, 0x61, 0xcb, 0x01, 0x5d, 0xb7, 0x41, 0x52, 0x00, 0xef, 0xaa, 0x62, 0x79, 0xd9, 0x2c, 0x88, 0xbb, 0x93, 0x35, + 0x35, 0x63, 0xbf, 0x4c, 0x60, 0xa7, 0x82, 0xa3, 0xd5, 0xb6, 0x09, 0x6b, 0xa9, 0x96, 0x24, 0xa3, 0x63, 0x81, 0x59, + 0x02, 0x89, 0x10, 0xe9, 0xfe, 0x58, 0x9c, 0x03, 0x31, 0xaf, 0x93, 0xcc, 0x80, 0xf3, 0xd4, 0x2a, 0x47, 0x13, 0x28, + 0x1c, 0xc7, 0x72, 0xbe, 0x26, 0x29, 0xc9, 0x13, 0x0e, 0xb0, 0x1a, 0xaf, 0xb0, 0x8e, 0x82, 0xfb, 0xb8, 0xa6, 0xa4, + 0xcc, 0xee, 0x7f, 0x99, 0xd2, 0xc4, 0x60, 0x57, 0xa2, 0x03, 0x12, 0x40, 0x4a, 0xb3, 0xd4, 0x62, 0xf0, 0x79, 0x44, + 0x3c, 0x16, 0x82, 0x89, 0x88, 0x44, 0xe1, 0x2b, 0x5d, 0xcb, 0xcf, 0xbc, 0x04, 0x84, 0xca, 0x4c, 0x83, 0xce, 0x92, + 0xd7, 0xaa, 0xa4, 0x86, 0xf6, 0x1b, 0xed, 0x46, 0x35, 0x2b, 0x9f, 0x14, 0x3e, 0x64, 0x1d, 0xb9, 0x7f, 0x1a, 0x98, + 0x64, 0xbd, 0xc9, 0x29, 0x95, 0x76, 0x96, 0xaf, 0xfe, 0xf5, 0x05, 0x8a, 0x8d, 0xaa, 0xa3, 0xe9, 0xb6, 0x3e, 0xda, + 0x10, 0x75, 0xf6, 0x11, 0x71, 0xc0, 0x13, 0x56, 0x33, 0x97, 0x5f, 0x65, 0xf8, 0xe1, 0x32, 0x39, 0x20, 0x45, 0x73, + 0x66, 0xa2, 0x6b, 0xfa, 0xef, 0x22, 0x39, 0x70, 0x89, 0xad, 0xc0, 0x14, 0x50, 0x46, 0x15, 0x63, 0x64, 0x39, 0x90, + 0xc4, 0x52, 0xc9, 0xe5, 0x7c, 0x84, 0x16, 0x59, 0x57, 0x4e, 0x19, 0x0a, 0x95, 0xd3, 0xc8, 0x1c, 0x36, 0x29, 0x8e, + 0x61, 0x5e, 0x96, 0xea, 0x79, 0x86, 0x90, 0x26, 0xdd, 0xd5, 0xa7, 0x88, 0x42, 0xcd, 0xaa, 0x7d, 0x17, 0xa6, 0xbe, + 0x08, 0x57, 0x85, 0x01, 0xf2, 0xfc, 0x61, 0x2d, 0xb2, 0xce, 0xa4, 0xf1, 0x62, 0x67, 0xbc, 0xa0, 0xb2, 0x61, 0x24, + 0x59, 0x96, 0x38, 0x28, 0x41, 0xe0, 0x94, 0x90, 0xc6, 0x3e, 0x71, 0xb8, 0x2d, 0x3f, 0x1e, 0x33, 0xb7, 0xe9, 0x50, + 0x46, 0x31, 0xe2, 0xea, 0x49, 0x95, 0x75, 0x0d, 0xe7, 0x21, 0xe6, 0x0f, 0x2f, 0x8b, 0xda, 0x6f, 0xba, 0xd2, 0xe8, + 0xc6, 0xa1, 0xb3, 0x02, 0x6d, 0x4f, 0x27, 0x73, 0x3a, 0x7d, 0x11, 0x57, 0x75, 0x52, 0x10, 0x50, 0x04, 0xc2, 0x1e, + 0x8f, 0xfe, 0x51, 0x1a, 0xed, 0x1f, 0x01, 0x4b, 0xd6, 0x31, 0xd8, 0x93, 0x6a, 0x8f, 0x09, 0x49, 0xcb, 0xdb, 0x1f, + 0x81, 0xb9, 0x52, 0x25, 0xd1, 0x43, 0xf0, 0xe1, 0x08, 0xa5, 0x05, 0x85, 0x64, 0xd3, 0x93, 0x6e, 0x43, 0xa6, 0x09, + 0x98, 0xe8, 0x71, 0x90, 0x67, 0xc3, 0x1b, 0x17, 0x55, 0x88, 0x3e, 0x3e, 0x30, 0xd9, 0xa5, 0x63, 0xb4, 0x69, 0x95, + 0x6d, 0xf6, 0x9f, 0xa1, 0xd8, 0xef, 0xf7, 0xd7, 0xcc, 0xa1, 0x48, 0xef, 0x3a, 0x23, 0x37, 0xb1, 0xe0, 0xfc, 0x14, + 0x25, 0xc6, 0xb3, 0xb6, 0x34, 0xa4, 0xe5, 0x10, 0x45, 0x48, 0x0e, 0x1d, 0x82, 0xbe, 0x0c, 0x19, 0x56, 0x57, 0xe8, + 0xf0, 0x2d, 0xfd, 0x82, 0x43, 0x26, 0x29, 0x39, 0xd2, 0x64, 0xbf, 0x97, 0xc4, 0x64, 0x57, 0xba, 0xa8, 0x40, 0x87, + 0xd5, 0xb4, 0x13, 0x43, 0xb2, 0xd5, 0xbb, 0xda, 0x66, 0xa9, 0xe5, 0x08, 0xee, 0xce, 0x03, 0xc9, 0x1f, 0x81, 0xaa, + 0xe7, 0xd1, 0x19, 0x47, 0x0b, 0x44, 0x9d, 0x4b, 0x92, 0xdb, 0x49, 0x31, 0xc8, 0x26, 0x52, 0x28, 0x90, 0xae, 0x10, + 0x8d, 0x61, 0x31, 0x6d, 0x3f, 0x08, 0x1c, 0x2c, 0x75, 0x9b, 0x64, 0xa4, 0xcf, 0x9d, 0xdd, 0x26, 0xc5, 0x23, 0x54, + 0x1e, 0xb5, 0xee, 0xbb, 0x69, 0x49, 0x90, 0xea, 0x24, 0x4f, 0x10, 0xb4, 0x67, 0x63, 0xef, 0x98, 0x80, 0xf9, 0xde, + 0x54, 0xcc, 0xaf, 0xa7, 0x6e, 0xc2, 0xc2, 0xee, 0x43, 0x8a, 0x5b, 0x66, 0x76, 0xf2, 0x9d, 0xf9, 0x1c, 0x69, 0xce, + 0x0c, 0x9d, 0xd4, 0x29, 0x24, 0xb3, 0xb1, 0xb7, 0xf4, 0x17, 0xa4, 0x79, 0x77, 0x2f, 0x3a, 0x94, 0x4d, 0xf8, 0x3d, + 0x21, 0xb8, 0x1e, 0x91, 0xc3, 0x08, 0xbe, 0xea, 0x90, 0xd8, 0xcd, 0x46, 0x2b, 0x52, 0x68, 0xed, 0x68, 0x88, 0x4b, + 0xb6, 0x7b, 0x37, 0x0b, 0x00, 0x88, 0x90, 0xd3, 0xef, 0x95, 0x86, 0x8c, 0x2d, 0xfd, 0xe2, 0x8c, 0xad, 0x14, 0xe8, + 0x59, 0x2d, 0xe2, 0x09, 0xaf, 0x09, 0x29, 0x41, 0x67, 0x85, 0x63, 0x86, 0xea, 0x43, 0xd0, 0xce, 0x1b, 0x4a, 0xb6, + 0x74, 0x30, 0x9c, 0xb8, 0x86, 0x92, 0x2d, 0x8c, 0x18, 0x1f, 0xba, 0xd9, 0x7b, 0x5a, 0x24, 0x43, 0xc1, 0x8f, 0x54, + 0x11, 0xe5, 0x22, 0x6a, 0x46, 0x68, 0x6c, 0x69, 0x30, 0x8a, 0x36, 0x9c, 0x9b, 0x77, 0x57, 0x04, 0x71, 0xd9, 0x27, + 0x56, 0x52, 0xc4, 0x8f, 0x83, 0xc4, 0xe9, 0x57, 0xab, 0x11, 0xf4, 0x32, 0x67, 0xa1, 0x34, 0xbe, 0x29, 0x85, 0x79, + 0xe4, 0x81, 0xc1, 0xb2, 0xb5, 0x0d, 0xd3, 0x3e, 0x69, 0x59, 0x3d, 0x5f, 0x55, 0x03, 0xdb, 0x20, 0x1c, 0xb5, 0x2c, + 0x1d, 0xeb, 0xe7, 0xb3, 0x8a, 0x5e, 0x37, 0xf2, 0xaf, 0x56, 0xac, 0xc5, 0x17, 0x20, 0x3b, 0x63, 0x98, 0xcd, 0x98, + 0x34, 0x2a, 0xa0, 0x16, 0x92, 0x29, 0x6b, 0x8b, 0x8a, 0xa7, 0x49, 0x09, 0x1b, 0x1a, 0x70, 0x34, 0x2d, 0x0b, 0xe9, + 0xc5, 0xeb, 0xa1, 0x7d, 0x70, 0xd6, 0xe1, 0x73, 0xcb, 0xd2, 0x23, 0x58, 0x0d, 0x78, 0x8d, 0x88, 0x12, 0x44, 0x2a, + 0xa4, 0x44, 0x85, 0x94, 0x43, 0x15, 0xd3, 0x41, 0xa7, 0x5c, 0x53, 0x67, 0xa5, 0x95, 0x79, 0x97, 0xc6, 0xf8, 0xd3, + 0x22, 0xa4, 0xb0, 0xae, 0x80, 0xc1, 0xa2, 0xf8, 0x0d, 0x04, 0xc0, 0x8b, 0x35, 0xd3, 0x33, 0x31, 0x30, 0xc7, 0x4b, + 0x5a, 0xde, 0x4b, 0x13, 0x66, 0xb1, 0x74, 0x63, 0x53, 0xa8, 0x8f, 0x8c, 0x42, 0x7a, 0xce, 0x25, 0x20, 0xea, 0xa6, + 0xc7, 0x97, 0xd9, 0x7a, 0xcf, 0xb8, 0x24, 0xff, 0x75, 0xbe, 0xdd, 0x9b, 0x15, 0x0e, 0xcf, 0x3d, 0x72, 0x38, 0x70, + 0x06, 0xa9, 0x48, 0x63, 0x06, 0x39, 0x05, 0x2f, 0x7a, 0x85, 0x19, 0x7f, 0xa4, 0x2b, 0x59, 0x22, 0x0a, 0x4f, 0x00, + 0x7f, 0x57, 0x2d, 0x42, 0xb7, 0x07, 0x84, 0xef, 0x42, 0xc6, 0x67, 0x35, 0x4c, 0xf2, 0x47, 0x18, 0x23, 0xf1, 0xe5, + 0x7b, 0x70, 0x53, 0x99, 0x8c, 0x6f, 0x7e, 0xcb, 0x92, 0x40, 0x65, 0x19, 0x4c, 0x53, 0x83, 0x92, 0x3a, 0xfb, 0x04, + 0x79, 0xe4, 0xbc, 0xaa, 0x1b, 0xa6, 0x4e, 0x9a, 0x49, 0x1e, 0xf4, 0x41, 0xa6, 0x08, 0x44, 0xa7, 0x8b, 0x61, 0xe4, + 0x81, 0x10, 0x00, 0xcf, 0x11, 0x88, 0xb4, 0x04, 0xce, 0x00, 0x8e, 0xe9, 0x9c, 0x0c, 0x1a, 0x91, 0xd1, 0xf8, 0xa9, + 0x51, 0x84, 0x8a, 0x54, 0xae, 0x63, 0xc7, 0xe1, 0x68, 0x89, 0x68, 0x94, 0xdf, 0x40, 0x31, 0x05, 0xff, 0xd2, 0xb8, + 0xb5, 0x69, 0xd7, 0x7b, 0xe2, 0x19, 0xc6, 0x96, 0xa6, 0x99, 0xa6, 0x45, 0xd1, 0x48, 0xdd, 0x67, 0x0c, 0x57, 0x2c, + 0x41, 0x9b, 0x84, 0xa2, 0x0c, 0xa3, 0x3a, 0xa6, 0x4a, 0x71, 0x0b, 0x47, 0x68, 0x54, 0xbe, 0xb5, 0x08, 0xed, 0xfd, + 0xc4, 0xf1, 0xe9, 0x32, 0x42, 0x5a, 0x9f, 0x1f, 0xbd, 0x2c, 0x30, 0xfd, 0x32, 0x9c, 0xa1, 0xaf, 0x44, 0x44, 0x34, + 0xad, 0x02, 0x3b, 0x1c, 0xe8, 0x6a, 0xc3, 0x4b, 0x73, 0x17, 0xb7, 0x35, 0xd1, 0x83, 0x33, 0xf6, 0x54, 0x86, 0xf4, + 0xed, 0x99, 0xc8, 0xba, 0x28, 0xea, 0xf6, 0xb7, 0x93, 0xaf, 0xe1, 0xb1, 0xf9, 0x78, 0x4c, 0xea, 0x14, 0xe5, 0x6b, + 0xa2, 0xd6, 0xea, 0x5a, 0x1f, 0x82, 0x99, 0x79, 0xf4, 0x5c, 0x31, 0x19, 0xe3, 0xd4, 0x8c, 0x8c, 0xac, 0xef, 0x59, + 0xe2, 0xc5, 0x36, 0xf1, 0x3b, 0x85, 0xe4, 0x47, 0xc7, 0x19, 0xd2, 0x88, 0x82, 0xa0, 0xca, 0xfc, 0x8a, 0x42, 0x19, + 0x18, 0xe9, 0xe7, 0xb6, 0xf6, 0x03, 0x72, 0xc5, 0x28, 0x96, 0xf1, 0x6c, 0x33, 0x3e, 0xe5, 0xea, 0x1f, 0x57, 0x34, + 0xc8, 0xb2, 0xb4, 0xdf, 0x89, 0xa7, 0x6d, 0x1e, 0xda, 0x66, 0x5e, 0xd9, 0x24, 0x02, 0x78, 0x95, 0x26, 0xd9, 0xf6, + 0x70, 0xaa, 0xf5, 0x47, 0xe0, 0x57, 0x5e, 0x41, 0x80, 0xcb, 0x49, 0x58, 0xb9, 0x8b, 0x02, 0x45, 0xb5, 0x2d, 0xb8, + 0x7c, 0xb0, 0x4b, 0x9f, 0x47, 0xb1, 0x44, 0x36, 0xf7, 0xc0, 0x6c, 0x51, 0x44, 0x78, 0x4a, 0xbd, 0xad, 0x51, 0xef, + 0xdf, 0x4d, 0x11, 0x1f, 0x71, 0x24, 0x77, 0x27, 0xab, 0x6e, 0x1c, 0x95, 0x47, 0x5a, 0x28, 0xfd, 0x00, 0x2f, 0x2e, + 0x9a, 0x4b, 0x97, 0x8a, 0xc7, 0x5e, 0x0a, 0xd9, 0x46, 0xc2, 0xdc, 0x22, 0x4e, 0x6d, 0xfb, 0x6a, 0xf2, 0xfd, 0x5c, + 0xd0, 0x24, 0x31, 0xeb, 0x4b, 0x97, 0xd6, 0x86, 0x4f, 0x32, 0xbd, 0xb3, 0xcf, 0x7a, 0xf6, 0x64, 0xce, 0xe4, 0xc6, + 0xe0, 0x39, 0xa8, 0xfa, 0xbd, 0xfd, 0x94, 0xba, 0x6e, 0x78, 0x94, 0xc4, 0x94, 0x26, 0x7f, 0xe1, 0x4e, 0x92, 0xe9, + 0xae, 0x33, 0x1f, 0x25, 0xdd, 0x37, 0x1c, 0xce, 0xde, 0xdf, 0xc6, 0x5d, 0x81, 0x54, 0x16, 0x1f, 0x43, 0x24, 0x3c, + 0xf1, 0xeb, 0xad, 0x31, 0xe0, 0xa1, 0x40, 0xc0, 0x83, 0x4a, 0xba, 0x59, 0xac, 0x15, 0x1d, 0xe7, 0x74, 0xff, 0x66, + 0x13, 0xce, 0x0a, 0xc3, 0x93, 0x1c, 0x27, 0xb1, 0xcb, 0xab, 0xdc, 0x4e, 0xa5, 0xad, 0x7e, 0x9a, 0x6c, 0xc0, 0x5b, + 0x68, 0x43, 0xd1, 0x72, 0x7c, 0x86, 0x5d, 0xf5, 0x43, 0x53, 0xf9, 0x27, 0xa1, 0x14, 0xc7, 0x36, 0x0d, 0x63, 0x0d, + 0xb9, 0xfe, 0xbe, 0x1d, 0xc8, 0xb4, 0x7a, 0xf3, 0xcf, 0xd9, 0xf7, 0xea, 0xed, 0x58, 0x37, 0x3c, 0x91, 0xde, 0x0e, + 0xfe, 0x7a, 0x48, 0x8a, 0x62, 0x79, 0x7b, 0x55, 0xfd, 0xd7, 0x16, 0xbf, 0x7e, 0xac, 0x2e, 0x6b, 0x2c, 0x96, 0xf9, + 0xf8, 0xb2, 0x1a, 0x4f, 0x2d, 0xef, 0xdf, 0x4e, 0xf5, 0x87, 0x2f, 0x3f, 0xf5, 0x1a, 0xb8, 0x3a, 0x73, 0x9e, 0xa4, + 0x57, 0x14, 0xfb, 0x28, 0x57, 0xc1, 0x4b, 0xf8, 0x20, 0x3f, 0x6d, 0x8f, 0xeb, 0xa7, 0xfb, 0x65, 0x3d, 0x1f, 0x68, + 0xc9, 0xe3, 0x66, 0xeb, 0xed, 0x8d, 0xe6, 0xd5, 0x5e, 0xa6, 0x75, 0x0e, 0x1b, 0x13, 0x7c, 0x28, 0xb7, 0x8a, 0x82, + 0xf1, 0x26, 0x20, 0xf9, 0x03, 0x31, 0xaf, 0xde, 0x36, 0xbb, 0xbe, 0xfc, 0x58, 0xac, 0x59, 0x5e, 0x61, 0x01, 0x96, + 0x35, 0x1a, 0x9a, 0xb3, 0x01, 0x67, 0x49, 0x7a, 0xaf, 0xae, 0xce, 0x9c, 0xe0, 0x9c, 0xc9, 0xed, 0x4d, 0xfc, 0xc7, + 0x4f, 0x53, 0x6d, 0xce, 0x32, 0xcb, 0xe1, 0x2f, 0x8e, 0x62, 0x67, 0x71, 0xd8, 0x6e, 0xc0, 0xfa, 0xaa, 0xe3, 0x2d, + 0xaa, 0xca, 0x56, 0xe7, 0x62, 0x26, 0x4b, 0x44, 0xe5, 0x76, 0xd2, 0xe1, 0x40, 0x37, 0x73, 0x6b, 0x1f, 0xf8, 0xdf, + 0x63, 0x17, 0x2a, 0x9d, 0xc2, 0x3f, 0x97, 0x47, 0x05, 0x17, 0x72, 0x9b, 0x6c, 0x2e, 0xb9, 0x91, 0xee, 0x58, 0x9f, + 0xbc, 0xb1, 0x33, 0x13, 0x46, 0x33, 0x11, 0x56, 0xd8, 0x0f, 0x47, 0xc0, 0x3d, 0x2e, 0x18, 0x7b, 0x2e, 0xfc, 0xd6, + 0xc5, 0x96, 0xbd, 0x77, 0x7d, 0x36, 0xf9, 0x28, 0x64, 0x01, 0xfb, 0x0d, 0x81, 0x1d, 0x68, 0xdc, 0x1c, 0x47, 0x3b, + 0x24, 0xeb, 0x08, 0xe6, 0xa2, 0x5b, 0xc9, 0x56, 0x06, 0xbf, 0x55, 0xb8, 0x9f, 0xdc, 0x05, 0x20, 0x69, 0xf5, 0xee, + 0xc7, 0x5e, 0xdf, 0x7f, 0xd5, 0xcf, 0x5b, 0xbd, 0xca, 0xd8, 0x3e, 0x19, 0xf8, 0x48, 0x83, 0xae, 0x77, 0xc3, 0xcb, + 0x95, 0x6a, 0xa2, 0xcd, 0xb8, 0x59, 0x5e, 0xc9, 0xe8, 0x0d, 0xe9, 0xda, 0xee, 0x3c, 0x54, 0x27, 0x37, 0x5e, 0xb6, + 0x4c, 0x06, 0x78, 0x55, 0x67, 0x33, 0xf9, 0x05, 0x62, 0x7d, 0x7d, 0xd3, 0xc5, 0x16, 0x9a, 0xd9, 0x23, 0xd4, 0x09, + 0x7f, 0xbd, 0x8c, 0xa2, 0x52, 0x24, 0x7a, 0x69, 0x76, 0xf2, 0x78, 0xde, 0x1b, 0x6f, 0x0c, 0x59, 0x4e, 0xa6, 0x87, + 0x20, 0xd1, 0x47, 0xf4, 0x92, 0xc5, 0xf5, 0x0e, 0x83, 0xcf, 0x73, 0x94, 0x66, 0xd9, 0xb0, 0xf2, 0x45, 0xfc, 0x8c, + 0x8e, 0x25, 0x1b, 0xf9, 0xb8, 0x85, 0xad, 0x64, 0xd9, 0xe6, 0x7e, 0xd7, 0x3b, 0x5b, 0xd5, 0xcb, 0x37, 0x1b, 0xcb, + 0xee, 0x58, 0x79, 0x7e, 0x51, 0xa9, 0x59, 0x0a, 0x3b, 0x7c, 0x8e, 0x47, 0x6b, 0xc1, 0x92, 0xdb, 0xbc, 0x1c, 0x21, + 0xbd, 0x97, 0xa4, 0xbf, 0x76, 0xb2, 0x14, 0xc9, 0x87, 0xb2, 0xac, 0xf2, 0x1f, 0x92, 0x24, 0x62, 0x55, 0x14, 0xa6, + 0x1c, 0x64, 0x9e, 0x7c, 0x28, 0x37, 0xbd, 0x78, 0xe7, 0xab, 0xc2, 0x4f, 0x75, 0xd8, 0x4b, 0xeb, 0x37, 0x20, 0x0a, + 0x66, 0x01, 0x7c, 0x21, 0xee, 0x45, 0xb3, 0xeb, 0x99, 0x3c, 0x06, 0x09, 0xf4, 0x39, 0xf0, 0x0f, 0x3e, 0xfa, 0x01, + 0x05, 0x9f, 0x8b, 0x0e, 0x8c, 0x00, 0x00, 0x72, 0xc7, 0xa1, 0xec, 0xf9, 0xbd, 0x29, 0x57, 0x28, 0xab, 0xa1, 0x5a, + 0x9b, 0xfc, 0x49, 0x73, 0x1d, 0x09, 0xce, 0x7b, 0xa4, 0xc8, 0x3f, 0xf1, 0x7a, 0x36, 0x69, 0x1a, 0x62, 0x17, 0x15, + 0x0a, 0x4c, 0x54, 0xe9, 0x24, 0x4f, 0x95, 0x2c, 0xb5, 0x2a, 0x59, 0xa3, 0x07, 0x1f, 0x76, 0xeb, 0xb5, 0x79, 0x55, + 0x1e, 0x92, 0x9f, 0x25, 0x10, 0xa6, 0x7f, 0xa5, 0x65, 0xb9, 0xbd, 0xa1, 0x4a, 0xe5, 0x20, 0x0f, 0xc1, 0x23, 0xab, + 0xfc, 0xba, 0x7c, 0xe2, 0xc1, 0x8d, 0x28, 0x7f, 0xa5, 0xcf, 0x21, 0xa8, 0x04, 0xfe, 0x5b, 0x36, 0x9b, 0xbe, 0xf2, + 0xf9, 0xf6, 0xc7, 0x73, 0x41, 0x04, 0x4f, 0x97, 0xec, 0x0d, 0xe6, 0x6a, 0x6f, 0x50, 0x9a, 0xac, 0x7b, 0x67, 0x43, + 0xcc, 0x05, 0xcb, 0x1f, 0xd1, 0xe6, 0xdf, 0x27, 0xdf, 0xec, 0x85, 0x96, 0x40, 0xd3, 0x7a, 0x0d, 0xd0, 0x32, 0xcf, + 0x3b, 0x32, 0xd8, 0x23, 0xef, 0x52, 0x1e, 0x56, 0x1c, 0x57, 0xbd, 0xe4, 0xef, 0xe1, 0x2d, 0xdc, 0x69, 0x1b, 0x29, + 0x12, 0xf5, 0x3a, 0xab, 0x14, 0x81, 0xf3, 0x1e, 0xbe, 0x9a, 0xf3, 0x74, 0xaa, 0x21, 0xf1, 0x4b, 0xc7, 0xdc, 0x86, + 0x0a, 0xeb, 0x65, 0x31, 0xbb, 0xbf, 0x7b, 0x83, 0xdc, 0x12, 0x9b, 0xdf, 0x3b, 0x6f, 0x01, 0x48, 0xb5, 0xfa, 0x94, + 0xb2, 0x23, 0xff, 0x51, 0xaa, 0x1d, 0xf0, 0x2a, 0x1f, 0xa8, 0xa0, 0x1a, 0x33, 0xa4, 0xb4, 0xe2, 0xaa, 0x13, 0x49, + 0xd0, 0xdb, 0xa2, 0x64, 0xb0, 0x91, 0x29, 0xec, 0x43, 0x5e, 0x94, 0xe8, 0xfb, 0x52, 0xc9, 0x72, 0x0b, 0xaf, 0x1c, + 0xcb, 0x5a, 0xee, 0x1b, 0x25, 0x7e, 0x98, 0x20, 0x3f, 0x0d, 0x2f, 0x32, 0xf2, 0xe4, 0x6e, 0x71, 0x24, 0xf0, 0xf1, + 0x49, 0x26, 0x82, 0x7d, 0x03, 0x79, 0x92, 0x5c, 0x3c, 0x89, 0x44, 0x65, 0x62, 0xbb, 0xe4, 0xe8, 0xe8, 0xde, 0x24, + 0xa9, 0xd7, 0xd2, 0xe8, 0x50, 0xe8, 0xb8, 0x8d, 0x42, 0x6d, 0x1d, 0xcf, 0xd9, 0x94, 0x8d, 0x47, 0x77, 0xc9, 0x76, + 0x11, 0xb7, 0x87, 0xd2, 0x08, 0x95, 0xd4, 0x26, 0xe8, 0x58, 0x9a, 0x06, 0x91, 0xc7, 0x03, 0x5b, 0x84, 0x88, 0x3e, + 0x9b, 0x4a, 0x67, 0x39, 0xc4, 0x6a, 0x3b, 0x1f, 0x58, 0x8e, 0x2d, 0x87, 0x2c, 0x09, 0x28, 0x9a, 0x95, 0x22, 0xe1, + 0x60, 0xe0, 0x38, 0x9a, 0xa3, 0x4a, 0x81, 0x31, 0x73, 0x35, 0x87, 0x9d, 0xaf, 0x33, 0x72, 0x2c, 0x8d, 0x34, 0x1b, + 0xbe, 0x2e, 0x45, 0x77, 0x6b, 0xeb, 0x63, 0x6d, 0x44, 0x32, 0xb2, 0xc9, 0x9e, 0xcb, 0xdc, 0x13, 0x56, 0xe9, 0xa9, + 0xdc, 0x8d, 0x95, 0x94, 0x15, 0xe7, 0xf9, 0x64, 0xb4, 0xdb, 0x90, 0x45, 0xab, 0x06, 0xab, 0xf1, 0x25, 0xd3, 0xee, + 0xb3, 0x2f, 0xb5, 0x0d, 0xda, 0x6a, 0x52, 0x17, 0x68, 0xce, 0xc3, 0xba, 0xc2, 0xdf, 0xc8, 0x13, 0x38, 0x93, 0x9e, + 0xbd, 0xea, 0x2e, 0x3f, 0xaa, 0x51, 0xda, 0xee, 0x2d, 0x5c, 0x31, 0x8f, 0xb9, 0x0a, 0xc1, 0xae, 0xd5, 0x44, 0x4f, + 0x66, 0x90, 0xc3, 0xf7, 0x04, 0x5c, 0x8e, 0xfc, 0x66, 0x80, 0xed, 0xd9, 0x38, 0x97, 0xb4, 0x53, 0xde, 0x27, 0x2d, + 0x45, 0x7e, 0xc6, 0x4d, 0xd6, 0x9c, 0x28, 0xff, 0x97, 0x42, 0xac, 0xb2, 0xe0, 0x0b, 0xeb, 0x23, 0xeb, 0xef, 0xd1, + 0xa9, 0x4e, 0x79, 0xeb, 0xd5, 0x8c, 0x7e, 0x2b, 0x2a, 0x4c, 0xd8, 0x3b, 0xa0, 0xc1, 0x64, 0xc7, 0x5a, 0x0d, 0xed, + 0x6e, 0xd9, 0xd1, 0xa2, 0x38, 0x6d, 0xcf, 0x68, 0x55, 0x7b, 0x21, 0x23, 0x1e, 0x7e, 0x6e, 0x34, 0x12, 0x8b, 0xa4, + 0x58, 0x40, 0xe7, 0x2b, 0xea, 0xfd, 0xb5, 0x9c, 0xd3, 0x93, 0xd6, 0x64, 0xf0, 0xa8, 0x33, 0xa7, 0xce, 0x55, 0x9f, + 0xbd, 0xde, 0xd5, 0xa1, 0xf2, 0x27, 0xe2, 0xfa, 0x13, 0x34, 0x55, 0x55, 0x73, 0xd7, 0x4a, 0x90, 0x9a, 0xb2, 0x6c, + 0xe2, 0xc8, 0xa7, 0xc9, 0xf7, 0xf9, 0x4c, 0x87, 0xec, 0xc3, 0x75, 0xa8, 0x8a, 0x17, 0x23, 0xb1, 0x05, 0x21, 0xb9, + 0x70, 0x82, 0x65, 0x51, 0xdf, 0x63, 0x29, 0x8a, 0xa3, 0x84, 0x92, 0xe1, 0x05, 0x8a, 0xc0, 0x51, 0x0b, 0x0c, 0x94, + 0xe4, 0x44, 0x1d, 0x1a, 0xc9, 0xce, 0xd3, 0xc1, 0x8b, 0x4f, 0x6c, 0xf2, 0x2d, 0xa1, 0x43, 0x3a, 0x43, 0x79, 0x05, + 0xdf, 0x8b, 0x77, 0x45, 0x9e, 0x30, 0xd5, 0xd2, 0x31, 0xcf, 0xbd, 0x66, 0xfa, 0xd8, 0x35, 0x78, 0x21, 0xba, 0x0e, + 0x97, 0x67, 0x48, 0x19, 0xab, 0x48, 0xd5, 0x34, 0xed, 0x87, 0x77, 0x87, 0x28, 0x49, 0x55, 0xb6, 0xdb, 0x7b, 0xa7, + 0x2d, 0x44, 0x09, 0xa4, 0xc9, 0xba, 0x0d, 0x8c, 0x64, 0x7a, 0xce, 0xb1, 0x2a, 0x45, 0x31, 0x86, 0x19, 0x82, 0x5c, + 0xe8, 0xb0, 0x15, 0x92, 0x4a, 0x3f, 0xca, 0x22, 0xe8, 0x26, 0x9d, 0xf1, 0x60, 0x96, 0x81, 0x51, 0xe1, 0xf8, 0xa4, + 0xde, 0x85, 0x77, 0x6d, 0x73, 0x72, 0x68, 0x15, 0x69, 0x02, 0x75, 0x2c, 0x90, 0x1e, 0xe5, 0x6f, 0xbe, 0x7b, 0x8c, + 0x6b, 0xd3, 0xaf, 0x8b, 0x55, 0x21, 0x33, 0x76, 0x02, 0x07, 0x90, 0x69, 0xbb, 0xf9, 0x9d, 0x7d, 0xa3, 0x24, 0x05, + 0x23, 0xad, 0xe7, 0x9e, 0x19, 0x5c, 0x8c, 0xc9, 0x42, 0xb4, 0xad, 0x76, 0xd3, 0x47, 0x07, 0x6d, 0x64, 0xe5, 0x35, + 0x00, 0xab, 0x24, 0x2d, 0x39, 0x1b, 0xc0, 0xc2, 0x6a, 0xc7, 0x36, 0x4c, 0x2f, 0x0d, 0x80, 0x4d, 0xbf, 0x05, 0x58, + 0xc0, 0x0b, 0xa2, 0xfd, 0xcc, 0xbc, 0xd2, 0x2c, 0xc2, 0x03, 0xef, 0x13, 0x80, 0x0d, 0xb1, 0x52, 0x51, 0x2d, 0x16, + 0x0b, 0xaf, 0x14, 0x0b, 0x5a, 0xd3, 0xcc, 0x96, 0x4e, 0xc0, 0xfa, 0x72, 0x47, 0xa1, 0x3a, 0xe5, 0xaf, 0xa8, 0xc4, + 0x9a, 0x43, 0x55, 0xf1, 0xd1, 0xfd, 0x66, 0x7d, 0x9a, 0x62, 0x91, 0xda, 0xa7, 0xd6, 0x93, 0x0c, 0xf0, 0x76, 0x8b, + 0xe7, 0xc0, 0x4b, 0xcb, 0xa2, 0xf7, 0xbd, 0x9d, 0xb5, 0x64, 0x51, 0xdd, 0x72, 0x7c, 0xd5, 0xca, 0xe4, 0x74, 0x25, + 0x97, 0x82, 0x32, 0x14, 0xf9, 0x9e, 0x27, 0x49, 0x21, 0xae, 0x4f, 0x1f, 0xcc, 0x7c, 0x84, 0x71, 0x65, 0xc6, 0x8b, + 0x6f, 0xc5, 0xc3, 0x8c, 0x27, 0xa5, 0x48, 0x6a, 0x79, 0x51, 0x01, 0xa9, 0xc6, 0x28, 0xbe, 0x20, 0x43, 0xcf, 0xf9, + 0x7a, 0xd4, 0xa7, 0xb8, 0x73, 0xb6, 0x24, 0x0e, 0xa2, 0x70, 0x98, 0x3e, 0x2b, 0x54, 0x08, 0xfe, 0x3b, 0x20, 0x26, + 0x19, 0x82, 0x00, 0x73, 0x22, 0xa1, 0x0e, 0xb2, 0xf0, 0x84, 0x67, 0x7b, 0xc9, 0x68, 0x25, 0xa3, 0x13, 0xa9, 0x32, + 0x11, 0x51, 0xf9, 0xed, 0xca, 0x26, 0x41, 0xb3, 0xec, 0xa5, 0x28, 0xdc, 0x88, 0x25, 0x11, 0x5c, 0x2b, 0x83, 0x9b, + 0x7e, 0x44, 0xa9, 0xee, 0x96, 0x86, 0xeb, 0x8c, 0x65, 0x72, 0xe1, 0x1b, 0x6f, 0xe8, 0xfa, 0xd2, 0xf5, 0x67, 0xe4, + 0xb6, 0xa8, 0xf0, 0xc9, 0x47, 0xf2, 0xc0, 0xb9, 0xbe, 0x9a, 0x66, 0x3a, 0xc7, 0xbc, 0x8b, 0x50, 0x5c, 0x63, 0xb2, + 0xcd, 0x7e, 0xdb, 0x2c, 0xc1, 0xeb, 0xfc, 0x59, 0xb2, 0x9c, 0xa6, 0x02, 0x76, 0x31, 0xf1, 0x8b, 0xa0, 0x44, 0x1b, + 0xae, 0x7a, 0xff, 0xde, 0xd6, 0x7a, 0xf7, 0xd9, 0x07, 0x1c, 0x16, 0xe5, 0x6f, 0xd4, 0xf6, 0x0c, 0x28, 0xa8, 0xe4, + 0xb9, 0xab, 0xd6, 0x80, 0xb1, 0x1d, 0xc3, 0x0f, 0x51, 0x1f, 0xed, 0x1a, 0xa0, 0xae, 0xd9, 0xca, 0x29, 0x06, 0x63, + 0x00, 0x1d, 0xdd, 0xfa, 0xd4, 0x20, 0x75, 0x58, 0xd8, 0x94, 0xd6, 0xdb, 0x58, 0xbc, 0xd0, 0x22, 0xe6, 0x72, 0x95, + 0x2c, 0xad, 0xf9, 0x1a, 0xfe, 0x37, 0xb8, 0xa6, 0xe0, 0x77, 0x94, 0xbf, 0x92, 0x78, 0xd7, 0x9d, 0xd3, 0x0a, 0x89, + 0x82, 0x79, 0x2e, 0xbc, 0x22, 0xc2, 0x4a, 0x9f, 0x10, 0x73, 0xcc, 0x75, 0x99, 0x93, 0x7d, 0xe1, 0xd0, 0x1a, 0xa9, + 0x43, 0xc0, 0xa5, 0xfb, 0x1e, 0x4f, 0x2f, 0xf8, 0x12, 0x5d, 0x1d, 0xdf, 0xcb, 0x3c, 0x9a, 0x01, 0xab, 0xba, 0x6f, + 0x31, 0x09, 0x53, 0x51, 0x46, 0x09, 0x41, 0xdc, 0x54, 0x22, 0x0b, 0x43, 0xcf, 0x1a, 0x57, 0x1f, 0x3b, 0xad, 0xa7, + 0x0c, 0x00, 0x28, 0x25, 0x09, 0xdd, 0x33, 0x94, 0x31, 0xa3, 0x97, 0x56, 0x81, 0x72, 0xcb, 0xd5, 0xc1, 0xcb, 0xce, + 0x3d, 0x86, 0x81, 0x9d, 0xd9, 0x5a, 0x67, 0x1a, 0x07, 0x22, 0xcb, 0x40, 0x80, 0x38, 0xc8, 0xb7, 0xa9, 0xd2, 0x58, + 0x74, 0x03, 0xd4, 0xb5, 0xa8, 0x0f, 0xd2, 0x8e, 0x2c, 0xc4, 0x19, 0x26, 0x3a, 0x06, 0xf6, 0xa7, 0x97, 0x68, 0xa4, + 0xa4, 0x42, 0xe0, 0x95, 0x31, 0xf3, 0x40, 0x22, 0x7b, 0xa0, 0x1d, 0x94, 0x0d, 0x80, 0x24, 0x67, 0x8e, 0x2b, 0x05, + 0x69, 0x2d, 0x23, 0x96, 0xd0, 0xff, 0x13, 0x2b, 0x8d, 0x32, 0x01, 0xf9, 0xc8, 0xa1, 0x4d, 0x49, 0xe3, 0x79, 0x78, + 0x2d, 0x1c, 0x48, 0x3e, 0x4c, 0x7f, 0x9c, 0x05, 0x8d, 0xc8, 0x94, 0xd3, 0xb9, 0x15, 0x6c, 0xe3, 0x8b, 0x3b, 0x4f, + 0x23, 0x51, 0x61, 0xfa, 0xcc, 0x77, 0x96, 0xb7, 0x93, 0x55, 0x84, 0xe5, 0x8f, 0xb9, 0xec, 0xa7, 0xe8, 0x7f, 0xad, + 0xa2, 0x24, 0xc9, 0x06, 0x5f, 0x2a, 0x99, 0x8e, 0xdb, 0xf3, 0x6b, 0xad, 0x8d, 0x96, 0xee, 0x01, 0xce, 0x78, 0x0f, + 0xaa, 0x3b, 0x12, 0x7a, 0xc8, 0x69, 0xcd, 0x53, 0x87, 0xa8, 0xaa, 0xa0, 0x84, 0x44, 0x63, 0x5c, 0xa4, 0xd6, 0x44, + 0xea, 0x9b, 0xc5, 0xd3, 0x00, 0x92, 0x69, 0x0c, 0x2a, 0xaa, 0xdc, 0x57, 0xcf, 0x6c, 0x5e, 0x4c, 0x4f, 0xa4, 0xc9, + 0x74, 0x41, 0x2e, 0x3f, 0xc5, 0xe8, 0x66, 0x4a, 0xc9, 0xb2, 0x58, 0x86, 0xc3, 0x1e, 0x23, 0xcc, 0x01, 0x43, 0x44, + 0xa5, 0xc2, 0x78, 0xc3, 0xa4, 0xbc, 0x9f, 0x94, 0xfc, 0x69, 0x8a, 0xf3, 0x0b, 0x61, 0xf5, 0x61, 0x5b, 0x07, 0xb8, + 0x3a, 0x07, 0xe5, 0x08, 0xb7, 0x96, 0x07, 0xd8, 0xd8, 0x98, 0x47, 0x7b, 0x39, 0x55, 0x25, 0x22, 0xd3, 0xac, 0x3b, + 0x58, 0x52, 0xde, 0xa4, 0xef, 0x0c, 0x99, 0xb0, 0x75, 0x33, 0x14, 0x41, 0x6e, 0x3c, 0xc9, 0xae, 0xb1, 0xd5, 0x07, + 0x81, 0xb3, 0x7a, 0x44, 0x5e, 0xc6, 0xa3, 0xaa, 0xce, 0xaa, 0xed, 0x94, 0xfc, 0x34, 0xbc, 0x4f, 0xae, 0x3b, 0xc9, + 0x09, 0x95, 0xd5, 0x24, 0x2a, 0x0a, 0x8a, 0xc2, 0xf3, 0x24, 0x20, 0x82, 0xe2, 0x8c, 0xfa, 0xa1, 0x8a, 0xfa, 0xa6, + 0xc8, 0xfe, 0x71, 0xea, 0xd5, 0xbe, 0xe5, 0x25, 0x80, 0x24, 0x3f, 0x93, 0x49, 0x77, 0x8c, 0x7b, 0x67, 0x5d, 0x1e, + 0x3e, 0x4a, 0x14, 0xe6, 0x3e, 0x14, 0x57, 0x31, 0x49, 0x51, 0x2c, 0x01, 0xf7, 0xca, 0x65, 0x2f, 0x1e, 0x49, 0x3a, + 0x41, 0x66, 0xa8, 0x5c, 0x1b, 0xef, 0x9b, 0x7a, 0xa4, 0xea, 0x49, 0x96, 0x02, 0x79, 0xe4, 0xee, 0x77, 0x46, 0x50, + 0xf2, 0xfc, 0xb7, 0xec, 0x8a, 0xd7, 0x49, 0x79, 0x86, 0x36, 0x1b, 0x22, 0x7a, 0x5d, 0x8e, 0x36, 0x05, 0xcc, 0x31, + 0x23, 0x02, 0xfd, 0x73, 0xb0, 0x0a, 0xf9, 0xb2, 0xe3, 0x14, 0xdb, 0x54, 0x01, 0x4a, 0xb9, 0xf7, 0xfd, 0x55, 0x1e, + 0x08, 0xfb, 0x33, 0x92, 0x9c, 0x49, 0x46, 0x44, 0x50, 0xb6, 0xc0, 0x23, 0xb0, 0x2f, 0xa4, 0x8b, 0x13, 0xb5, 0x0a, + 0xfb, 0x82, 0x9a, 0xb3, 0x67, 0xa9, 0x88, 0xea, 0x14, 0x7d, 0xfc, 0xca, 0xb8, 0x60, 0x2e, 0xab, 0x91, 0xb6, 0x22, + 0x5a, 0x9e, 0xaa, 0x04, 0x04, 0xb5, 0x10, 0x0b, 0xb1, 0xa9, 0x80, 0x60, 0x7c, 0xaf, 0xa7, 0x27, 0x18, 0x31, 0x0b, + 0xc5, 0x8b, 0xcc, 0xe5, 0x44, 0xbb, 0xfc, 0x87, 0x9b, 0x30, 0x9d, 0x33, 0x86, 0x34, 0x22, 0xa9, 0x47, 0xd6, 0xef, + 0x5f, 0x2f, 0x2f, 0x54, 0x65, 0x13, 0x49, 0x65, 0x23, 0xee, 0xe6, 0x73, 0x9d, 0x1b, 0xd3, 0x44, 0x70, 0xc5, 0x92, + 0xd9, 0x62, 0xe3, 0xe9, 0xfc, 0xc3, 0x95, 0x59, 0x48, 0xd7, 0x44, 0x39, 0x92, 0xc8, 0x4f, 0x0a, 0xc1, 0x43, 0x8d, + 0xf2, 0x42, 0x18, 0x91, 0xfa, 0x6f, 0x86, 0xdc, 0x75, 0x29, 0xda, 0xd5, 0x46, 0x75, 0xd9, 0x02, 0xd8, 0xd2, 0xd7, + 0x30, 0x32, 0x14, 0x42, 0x47, 0x0c, 0x92, 0xdc, 0xa5, 0x3e, 0x2a, 0x19, 0xc8, 0xa2, 0x2b, 0xcc, 0x40, 0x99, 0x7b, + 0xe8, 0xe4, 0x8d, 0x93, 0x28, 0x01, 0xb9, 0x9f, 0x99, 0x4f, 0xea, 0xec, 0x24, 0xf2, 0x62, 0x2d, 0x05, 0x74, 0xa4, + 0xba, 0x4e, 0x25, 0x56, 0x59, 0xad, 0x84, 0x9e, 0x08, 0x76, 0x17, 0xcd, 0xe0, 0x55, 0x9b, 0xe7, 0xe9, 0xb1, 0xe6, + 0x9f, 0xc7, 0x57, 0x94, 0xb7, 0x35, 0x91, 0x16, 0x74, 0x22, 0xb4, 0xfa, 0xc0, 0x7d, 0xdd, 0x5c, 0xd9, 0x1a, 0xe4, + 0x65, 0x01, 0xd0, 0x72, 0xce, 0x72, 0x7a, 0x12, 0xca, 0xba, 0x79, 0x5e, 0x26, 0x99, 0x7b, 0x15, 0x07, 0x5b, 0x40, + 0x73, 0x01, 0x37, 0xc1, 0x67, 0x1f, 0x27, 0xa4, 0x7e, 0xa8, 0x3c, 0x56, 0x36, 0xdf, 0xd6, 0x60, 0xee, 0xdb, 0xc4, + 0xe9, 0xb0, 0xd9, 0x24, 0x22, 0x26, 0x73, 0x37, 0xb6, 0xde, 0x08, 0x67, 0x2d, 0x54, 0xed, 0x11, 0xf3, 0x84, 0x00, + 0x53, 0xd5, 0x20, 0x7c, 0xda, 0xc7, 0x49, 0x4c, 0x6f, 0x11, 0x15, 0xa0, 0x5c, 0x62, 0x52, 0xaf, 0xdc, 0xa5, 0xa5, + 0xd6, 0xbd, 0x4f, 0x17, 0x58, 0x57, 0xba, 0x78, 0xbc, 0xd3, 0x7d, 0xe0, 0x00, 0x70, 0x3f, 0x83, 0xaa, 0x55, 0x5e, + 0xaa, 0xea, 0x0b, 0x6a, 0x69, 0x82, 0x94, 0x04, 0xbc, 0x55, 0x49, 0xef, 0xe7, 0x99, 0x06, 0x82, 0xe6, 0x6b, 0x64, + 0x75, 0xe4, 0x0b, 0x91, 0xc8, 0x43, 0xcf, 0x4b, 0x7c, 0xbc, 0x08, 0xcf, 0x09, 0x1e, 0xbf, 0x8c, 0xad, 0x0b, 0x3a, + 0x65, 0xfe, 0x20, 0x81, 0xe5, 0x40, 0xed, 0xda, 0xe5, 0xeb, 0x38, 0x11, 0xec, 0x14, 0x05, 0xea, 0x29, 0x2a, 0x40, + 0x83, 0x40, 0xd1, 0x48, 0x0b, 0xe8, 0x24, 0xf9, 0x39, 0xa6, 0x05, 0x84, 0xd4, 0x29, 0x10, 0x31, 0xdf, 0x0e, 0xcb, + 0x11, 0xdc, 0x95, 0x22, 0x27, 0x9e, 0x38, 0x37, 0x6b, 0xe5, 0xcb, 0x7d, 0x88, 0xaa, 0x73, 0x7f, 0x7c, 0x83, 0x3b, + 0x70, 0x15, 0xdb, 0x8d, 0xe3, 0x1f, 0x71, 0xbf, 0x49, 0x16, 0x72, 0x0e, 0x44, 0x8a, 0xbc, 0x1c, 0x11, 0x22, 0x13, + 0x87, 0x3a, 0xdc, 0x84, 0x90, 0x8e, 0x2f, 0xa0, 0x3f, 0x8e, 0x98, 0xc6, 0x56, 0x9d, 0x26, 0x20, 0xe7, 0x3c, 0xbe, + 0x3d, 0x9d, 0xde, 0xba, 0xa8, 0x1e, 0x44, 0xdb, 0x22, 0xe2, 0x87, 0xb6, 0xa8, 0x51, 0xa8, 0x3c, 0x9c, 0x5a, 0x5f, + 0x53, 0xc3, 0x31, 0xc4, 0xe1, 0xdf, 0x06, 0x48, 0x00, 0x85, 0xdd, 0x26, 0xd7, 0x5c, 0xd0, 0xe9, 0x9d, 0xa4, 0x23, + 0xb4, 0xd6, 0xf4, 0x53, 0xb9, 0x6a, 0xd6, 0xc1, 0xca, 0xb4, 0xd3, 0xfb, 0x6c, 0xe3, 0xb6, 0x38, 0x01, 0x41, 0xb4, + 0xd2, 0xeb, 0x9b, 0x30, 0x61, 0x89, 0x31, 0x06, 0xde, 0x17, 0x62, 0xce, 0x53, 0x98, 0x49, 0xcc, 0xc7, 0x70, 0xb4, + 0x3a, 0x8b, 0x77, 0x6e, 0xd1, 0xa5, 0xbd, 0xd1, 0x9b, 0x36, 0x92, 0xa9, 0x84, 0x8e, 0x05, 0xf0, 0xc7, 0xe9, 0xa8, + 0x1d, 0x71, 0x07, 0x04, 0xd8, 0xca, 0x12, 0xe3, 0xd2, 0x2d, 0xd8, 0xaa, 0x6c, 0xf9, 0xb4, 0x71, 0xae, 0xdc, 0xcf, + 0xd6, 0x2e, 0x74, 0x44, 0x70, 0x58, 0x97, 0x34, 0x07, 0xe6, 0x63, 0xc1, 0x5c, 0x8a, 0x8b, 0xd5, 0x4e, 0x01, 0x12, + 0xb4, 0x92, 0x3c, 0x5c, 0x66, 0x48, 0x7a, 0x7c, 0xa2, 0x2e, 0x12, 0x72, 0xc6, 0x8d, 0xb6, 0x06, 0xec, 0xe0, 0xdd, + 0x5e, 0x8f, 0xb4, 0xee, 0xbc, 0x45, 0xde, 0x8b, 0xe2, 0x05, 0xa4, 0x9a, 0x02, 0x71, 0x65, 0x83, 0x20, 0xed, 0x3a, + 0x25, 0xac, 0xbf, 0x19, 0x2c, 0x8d, 0xdb, 0x77, 0x6d, 0x4a, 0x0f, 0x7a, 0x76, 0xa6, 0x87, 0x5c, 0xf8, 0xb3, 0xa2, + 0x6f, 0x5f, 0x79, 0xcb, 0x36, 0xec, 0xa7, 0xa5, 0x00, 0xb2, 0xba, 0xb8, 0x1b, 0xe7, 0xbc, 0x60, 0x8b, 0xa5, 0xc9, + 0xe9, 0xab, 0x65, 0x85, 0x9a, 0xc0, 0x1e, 0x7c, 0xa0, 0x65, 0xa4, 0x52, 0x5f, 0x29, 0x29, 0x5a, 0x1e, 0x1a, 0x93, + 0x6c, 0x6d, 0x6a, 0x85, 0xb8, 0xaa, 0x06, 0xab, 0xea, 0xe1, 0x12, 0x4b, 0x4b, 0xdb, 0x52, 0x0b, 0xcd, 0x75, 0xef, + 0x05, 0x98, 0x7c, 0x8f, 0x1e, 0xb1, 0xbc, 0x00, 0xba, 0xfb, 0x85, 0x7c, 0x19, 0x87, 0x41, 0x5a, 0x54, 0x41, 0x00, + 0xe9, 0x75, 0x1d, 0xc3, 0xa6, 0x61, 0x8d, 0x89, 0x0e, 0x8b, 0x3e, 0x8d, 0x40, 0x45, 0xa8, 0x81, 0x21, 0xd8, 0x42, + 0xae, 0x4c, 0xc5, 0xd2, 0xa9, 0x97, 0xc9, 0xe2, 0xd2, 0xe7, 0x5e, 0x6c, 0x6b, 0xd2, 0x15, 0xb3, 0x54, 0x41, 0x5c, + 0x1a, 0x75, 0xbd, 0xd1, 0x37, 0x6a, 0x79, 0xd0, 0x35, 0xde, 0xe3, 0x26, 0x19, 0xd6, 0xa6, 0x72, 0x7d, 0x94, 0x6c, + 0xb7, 0xff, 0x59, 0xb9, 0x44, 0xb5, 0xe4, 0x2c, 0xad, 0xb1, 0xea, 0x61, 0x8b, 0x02, 0x5c, 0xbe, 0xe3, 0x4e, 0xc6, + 0x00, 0x59, 0x8e, 0xb4, 0x61, 0x6e, 0x1d, 0xce, 0x65, 0x1b, 0x68, 0xfb, 0xcd, 0xa7, 0x92, 0x60, 0xeb, 0x57, 0x4f, + 0xa7, 0xb1, 0x4d, 0x91, 0xc3, 0x28, 0x70, 0x14, 0x9e, 0xbb, 0xe7, 0xbc, 0x5a, 0x29, 0xe3, 0x12, 0xdb, 0xed, 0x73, + 0xd3, 0x4f, 0x5e, 0xd9, 0x86, 0xf5, 0x14, 0x5f, 0x8f, 0x91, 0x8d, 0xbd, 0xe7, 0xc9, 0x7a, 0x32, 0x16, 0x77, 0x0c, + 0x80, 0x8b, 0x92, 0x62, 0xb8, 0x5b, 0xc1, 0xc5, 0x83, 0x5f, 0xf8, 0x7c, 0x2a, 0xa7, 0x9b, 0x34, 0xee, 0xcd, 0xbf, + 0xed, 0xed, 0x85, 0x07, 0xcd, 0x24, 0x7d, 0x99, 0xa5, 0xcb, 0x2a, 0xb9, 0x16, 0xc8, 0xb5, 0x1b, 0x9e, 0x8b, 0x72, + 0xbd, 0x69, 0x6b, 0x23, 0x4c, 0x50, 0xbc, 0x1c, 0xf8, 0xdb, 0xbb, 0xf8, 0xed, 0xb9, 0xec, 0xf9, 0xb9, 0xb7, 0x68, + 0x08, 0x31, 0xdf, 0xbc, 0x8f, 0x2a, 0x2b, 0x8e, 0x63, 0xe2, 0x7d, 0x3e, 0x34, 0xde, 0xeb, 0x1a, 0x2d, 0x63, 0xae, + 0xf0, 0xf3, 0x18, 0xaa, 0xda, 0xc7, 0xcd, 0x2d, 0xff, 0x6c, 0x77, 0x9d, 0x95, 0xa2, 0x30, 0x9b, 0xc9, 0xc3, 0xd2, + 0x94, 0xb4, 0x3b, 0x0e, 0x36, 0xdc, 0x3e, 0x2b, 0x00, 0x73, 0x00, 0x2c, 0x8f, 0x74, 0x7d, 0x16, 0x7b, 0x16, 0xca, + 0xb6, 0x8b, 0x38, 0x54, 0x6f, 0x61, 0x57, 0xdc, 0x9c, 0xe5, 0x59, 0xea, 0x6e, 0xe3, 0x0b, 0x03, 0x54, 0x3d, 0xe4, + 0x8e, 0x39, 0x92, 0x96, 0x09, 0xa6, 0x4a, 0x7e, 0xbb, 0x71, 0xdc, 0xcc, 0x19, 0x3b, 0xf1, 0x0c, 0xb3, 0x79, 0xea, + 0x0d, 0x2b, 0x9a, 0xf7, 0xed, 0x2b, 0xf7, 0x34, 0x30, 0xf1, 0xad, 0x8d, 0xca, 0x54, 0xf6, 0x75, 0x00, 0x94, 0x2c, + 0xd1, 0x9f, 0x76, 0x51, 0x5a, 0x57, 0x08, 0xa3, 0xc2, 0xa9, 0xf2, 0x0f, 0xd6, 0x92, 0x56, 0x31, 0x11, 0x8b, 0xa3, + 0x23, 0xcd, 0x19, 0xe0, 0x96, 0x78, 0xcb, 0xa8, 0x03, 0xc5, 0x98, 0xd1, 0xc6, 0x4c, 0xca, 0x6a, 0x8f, 0x66, 0x07, + 0xc2, 0xc8, 0x73, 0x6d, 0x11, 0xe9, 0x28, 0x60, 0xbd, 0x54, 0x70, 0xe0, 0x37, 0xef, 0x55, 0xa0, 0x79, 0xdf, 0xb3, + 0x01, 0xe5, 0x00, 0xee, 0x37, 0x74, 0x94, 0xd4, 0xa6, 0x8d, 0xbf, 0xe4, 0x8a, 0xd1, 0xd5, 0x83, 0x24, 0xd0, 0x36, + 0x63, 0xc0, 0x07, 0x4c, 0xae, 0xa8, 0x42, 0xfa, 0x34, 0x46, 0xde, 0x28, 0x90, 0x9c, 0x63, 0xd3, 0x50, 0x4c, 0x3b, + 0xac, 0x27, 0x91, 0x94, 0x0e, 0x22, 0x64, 0x8a, 0xc5, 0xf4, 0xa0, 0x0e, 0x96, 0x64, 0xa4, 0x75, 0x2a, 0x6f, 0x45, + 0x47, 0xfd, 0x9e, 0x8d, 0xa0, 0x39, 0xb6, 0xac, 0x2a, 0xd4, 0x37, 0xcb, 0x2d, 0x13, 0x95, 0x74, 0xf3, 0x6c, 0x2a, + 0x1f, 0x97, 0x83, 0xc8, 0xa6, 0x69, 0xc7, 0x6f, 0xfb, 0xbc, 0xc7, 0x0c, 0xee, 0x62, 0x84, 0x82, 0xac, 0x6d, 0xc8, + 0x60, 0x8f, 0x3c, 0x5c, 0xd0, 0x2d, 0xfd, 0x40, 0xa1, 0xdf, 0xae, 0x96, 0x00, 0x7e, 0x4a, 0xe0, 0x2b, 0x41, 0x6f, + 0x37, 0xb9, 0x53, 0xbb, 0xce, 0x3d, 0xef, 0x13, 0xd9, 0x0b, 0x27, 0x0f, 0x92, 0x6d, 0x5b, 0xa2, 0x6d, 0xd5, 0x8d, + 0x5b, 0xfe, 0xb1, 0xc3, 0x4f, 0x4a, 0x53, 0x44, 0xad, 0x49, 0xea, 0xb4, 0xb1, 0xdc, 0x12, 0xb5, 0xa3, 0xc1, 0x51, + 0xba, 0x11, 0x5e, 0xb8, 0xdf, 0x86, 0xfd, 0x86, 0x82, 0xb1, 0x1c, 0xbd, 0x72, 0x17, 0x1d, 0x0b, 0x68, 0x1c, 0x29, + 0xe8, 0xd8, 0x1e, 0x47, 0xb5, 0x31, 0x86, 0x72, 0xcc, 0xde, 0x70, 0x0c, 0x65, 0x35, 0x06, 0x6a, 0x63, 0xeb, 0x26, + 0x74, 0x37, 0x9e, 0x88, 0xe4, 0x30, 0xa0, 0x71, 0x40, 0xea, 0x96, 0x19, 0xa9, 0xfc, 0x3a, 0x27, 0x2c, 0x10, 0x83, + 0x3b, 0xf6, 0x78, 0xa1, 0x7d, 0xc1, 0x30, 0xc4, 0x11, 0xe8, 0x16, 0x8f, 0x62, 0xb6, 0xa8, 0x0c, 0xf5, 0xe2, 0xca, + 0x5a, 0x98, 0xc0, 0xda, 0x11, 0xa2, 0x42, 0x7f, 0x6c, 0xf3, 0x5d, 0x3b, 0x14, 0xe4, 0x8a, 0x1f, 0xc6, 0xfe, 0x32, + 0xfd, 0x68, 0xe4, 0xa9, 0xa4, 0xff, 0x22, 0x8c, 0x7e, 0xea, 0x84, 0x95, 0x13, 0x40, 0xf0, 0x27, 0x48, 0x72, 0xdb, + 0x78, 0x3f, 0x4c, 0x69, 0xa6, 0xff, 0xb1, 0xb1, 0xe9, 0x8a, 0xf7, 0x43, 0x3f, 0xcc, 0x1f, 0x3a, 0x51, 0x07, 0xf9, + 0xa7, 0x5f, 0x3c, 0x74, 0x5c, 0x8f, 0xed, 0x63, 0x4c, 0xdd, 0xb1, 0xa5, 0xf9, 0x78, 0xec, 0xda, 0x4b, 0xb6, 0xdb, + 0xf6, 0xe3, 0xf0, 0x64, 0x78, 0x38, 0x64, 0x43, 0x1a, 0xb8, 0xf7, 0xfc, 0x72, 0x8e, 0x3d, 0x4f, 0xde, 0x3d, 0xf4, + 0xe9, 0x81, 0x9c, 0x8b, 0x94, 0x31, 0xd9, 0x2d, 0x9e, 0xb6, 0x5d, 0xa4, 0x34, 0x02, 0xd4, 0xd1, 0x1b, 0xe1, 0x63, + 0x41, 0xd7, 0x24, 0x55, 0xc8, 0xa0, 0x7c, 0x86, 0x49, 0xa3, 0xea, 0x0f, 0xf1, 0x0c, 0x85, 0x88, 0x83, 0xc0, 0x7f, + 0xf9, 0x67, 0x8f, 0xd6, 0x13, 0xa7, 0xd5, 0x69, 0x6d, 0x78, 0xec, 0xf7, 0x65, 0x97, 0xa5, 0x9e, 0x94, 0x51, 0xba, + 0xcd, 0xc4, 0x4b, 0x8c, 0xcc, 0x4d, 0x7e, 0xc8, 0xb1, 0x3d, 0x75, 0x0f, 0x93, 0xff, 0x42, 0x04, 0x45, 0xb8, 0xc7, + 0x02, 0x19, 0xef, 0x21, 0x50, 0x39, 0x15, 0xa2, 0x98, 0x96, 0x8b, 0xb3, 0x05, 0xb0, 0x6b, 0xf4, 0x4b, 0x64, 0x45, + 0x3c, 0x33, 0x9e, 0xdf, 0xb5, 0x36, 0xd7, 0x01, 0xfc, 0x7e, 0x6d, 0xf4, 0x64, 0x46, 0xab, 0x80, 0xac, 0xfb, 0xa0, + 0x0c, 0x2e, 0x09, 0x4f, 0xa5, 0x3d, 0x97, 0xd5, 0x58, 0xd3, 0x7e, 0xa0, 0x57, 0x33, 0xfd, 0x69, 0xfb, 0xac, 0x21, + 0x74, 0x3d, 0x9a, 0x29, 0x05, 0x54, 0xaa, 0x7c, 0x50, 0x66, 0x5f, 0x5f, 0x40, 0x38, 0xa2, 0x55, 0xc8, 0x2f, 0x15, + 0xa7, 0x87, 0xb1, 0x8d, 0x82, 0x20, 0xdf, 0x79, 0x86, 0xc8, 0x0f, 0xc9, 0x13, 0x2a, 0xec, 0xce, 0xfd, 0x02, 0xf4, + 0x45, 0x85, 0xa7, 0xf4, 0xfd, 0x69, 0x8e, 0xdb, 0xd5, 0xbc, 0x8f, 0xef, 0x03, 0x19, 0x25, 0x58, 0x46, 0xba, 0x39, + 0x74, 0xd2, 0xa8, 0x1d, 0x3d, 0xf2, 0x95, 0x48, 0x8e, 0x2e, 0xd0, 0xf4, 0x3d, 0xd6, 0x86, 0x17, 0x49, 0x4a, 0xd0, + 0xa7, 0x72, 0x2d, 0xc9, 0xb0, 0x57, 0x75, 0x60, 0x74, 0x44, 0xde, 0x5e, 0x8a, 0x0d, 0x90, 0x24, 0xd5, 0xd3, 0x12, + 0xa1, 0xfd, 0x50, 0xce, 0x7a, 0x53, 0x7e, 0x89, 0x7b, 0xf1, 0x84, 0x57, 0x46, 0x74, 0xc3, 0x5f, 0x7c, 0x13, 0xe2, + 0x5e, 0x28, 0xee, 0x8b, 0x02, 0x96, 0x25, 0x54, 0x11, 0x41, 0x6f, 0x1a, 0xa8, 0x1c, 0x0c, 0xfd, 0xb1, 0x28, 0xf0, + 0x6c, 0x05, 0x58, 0x96, 0x09, 0x29, 0x03, 0x47, 0x6c, 0x44, 0xff, 0x4a, 0x9a, 0xfa, 0x29, 0xa5, 0xb9, 0x6f, 0x49, + 0xbc, 0xec, 0x17, 0x84, 0x94, 0x37, 0x10, 0x0a, 0x82, 0x96, 0x0a, 0xde, 0x04, 0x29, 0x68, 0x4c, 0x3b, 0xcc, 0x95, + 0x41, 0xd9, 0xe3, 0xb8, 0x01, 0x2e, 0x5f, 0x39, 0xa8, 0x4d, 0xd5, 0xeb, 0x24, 0xb6, 0x2a, 0x6e, 0xf4, 0x9f, 0xe8, + 0xd6, 0xda, 0x0f, 0x07, 0x28, 0x82, 0xb6, 0x28, 0x9b, 0xf4, 0x8a, 0xc6, 0xb3, 0x30, 0x16, 0x96, 0x3d, 0x46, 0x0f, + 0x6a, 0x06, 0x4a, 0x2a, 0xac, 0x36, 0x54, 0x28, 0xe6, 0x53, 0xbb, 0x08, 0xa3, 0xf0, 0x41, 0x53, 0x19, 0x79, 0xf8, + 0xd0, 0x9d, 0x46, 0xef, 0xc6, 0x51, 0x2c, 0x72, 0x43, 0x9b, 0xd7, 0x2c, 0x45, 0xc2, 0xa4, 0x49, 0x3e, 0xbd, 0x6c, + 0xd6, 0xb3, 0x66, 0xd2, 0xb2, 0x15, 0x7a, 0xd5, 0x78, 0x63, 0x20, 0x52, 0xd4, 0x6f, 0xbe, 0x4e, 0x7a, 0xb5, 0x9e, + 0xc3, 0xec, 0x47, 0xc2, 0xf2, 0xa2, 0xe8, 0x7a, 0xa6, 0xdb, 0xbc, 0x6a, 0xa3, 0x3b, 0x73, 0xaa, 0xaf, 0xd4, 0x60, + 0x08, 0xf8, 0x95, 0x73, 0x79, 0x50, 0x26, 0xa8, 0x9c, 0xd8, 0x76, 0x0f, 0x6d, 0x46, 0x40, 0x07, 0xcf, 0xb2, 0xd3, + 0xcc, 0x97, 0xaf, 0x96, 0x49, 0x31, 0xac, 0x77, 0xa9, 0x43, 0x81, 0x97, 0x7b, 0x95, 0xfe, 0x81, 0x46, 0x95, 0x32, + 0xf2, 0x82, 0xa8, 0x3a, 0xd1, 0x5e, 0x70, 0x10, 0xc7, 0x1d, 0xfe, 0x3d, 0xe2, 0x70, 0xc9, 0x3d, 0x87, 0x1d, 0x40, + 0x4e, 0x59, 0x44, 0x3a, 0xca, 0xc7, 0x77, 0x8f, 0xbe, 0x65, 0xcc, 0x31, 0xd2, 0x65, 0xf5, 0x53, 0x11, 0x6d, 0x1f, + 0x51, 0x12, 0xe9, 0x0e, 0x07, 0xfb, 0x14, 0x21, 0xde, 0x6c, 0x8a, 0x41, 0x00, 0x2b, 0x74, 0xbe, 0x44, 0x74, 0x42, + 0x5a, 0xd4, 0x03, 0x0a, 0x87, 0xad, 0x82, 0xcf, 0x72, 0xc1, 0x09, 0x96, 0xfe, 0x10, 0x13, 0xab, 0x52, 0x24, 0x3b, + 0x34, 0xcb, 0xbf, 0x4c, 0x6d, 0xaf, 0x96, 0xa6, 0x51, 0x6d, 0x1e, 0xc1, 0x7d, 0xe3, 0xb2, 0xa4, 0x68, 0x05, 0x76, + 0x97, 0xbd, 0x54, 0xc8, 0xc2, 0x86, 0x6b, 0x2f, 0x79, 0xa6, 0x6d, 0x4b, 0x5e, 0x34, 0x78, 0x40, 0x12, 0xd8, 0x7c, + 0x01, 0xac, 0xff, 0x71, 0xb5, 0x2c, 0x43, 0x2d, 0x54, 0x35, 0x30, 0x42, 0xbe, 0xdb, 0x75, 0x04, 0xd1, 0x9e, 0x55, + 0x37, 0xbf, 0x06, 0x26, 0x5a, 0xf6, 0x26, 0xb0, 0x74, 0x90, 0x45, 0x0b, 0x81, 0x60, 0xe7, 0xfe, 0x7c, 0xed, 0xb2, + 0xd8, 0xce, 0x78, 0x8c, 0x35, 0x61, 0xe1, 0x11, 0xb9, 0x71, 0x80, 0x95, 0xc7, 0x65, 0x09, 0x42, 0x56, 0x94, 0x61, + 0x57, 0xee, 0x1c, 0x50, 0x8f, 0x85, 0x1a, 0x55, 0x08, 0xb2, 0xd6, 0x67, 0xaf, 0xa7, 0x8a, 0x35, 0xc9, 0xfd, 0x3e, + 0x28, 0x30, 0x38, 0x83, 0xbb, 0x4d, 0x45, 0x28, 0x7d, 0x48, 0xe1, 0x4f, 0x6d, 0xba, 0x3e, 0x4b, 0x7b, 0x9e, 0x82, + 0x49, 0xb1, 0x20, 0x5e, 0x2b, 0xf9, 0xe7, 0xe9, 0x2f, 0x12, 0xa8, 0x83, 0x94, 0xdc, 0x98, 0x3e, 0xe2, 0xb5, 0x11, + 0x42, 0x64, 0xac, 0xe7, 0xa0, 0x71, 0x20, 0x9c, 0x52, 0x30, 0xa8, 0x9c, 0xd9, 0x32, 0x8b, 0xe9, 0x78, 0x67, 0x4b, + 0x9d, 0x90, 0x6d, 0x0d, 0x3f, 0xf0, 0x66, 0x1a, 0xfb, 0x89, 0x70, 0xdd, 0xdc, 0xe4, 0x5b, 0x83, 0x67, 0xe8, 0x14, + 0x33, 0x7e, 0x93, 0x31, 0x14, 0xd3, 0xd6, 0x3d, 0x17, 0x4f, 0x4f, 0x4f, 0xc5, 0xa8, 0xb2, 0xb9, 0xe2, 0x61, 0xbc, + 0x1c, 0xab, 0x6a, 0x55, 0x15, 0xd3, 0x42, 0x2b, 0xab, 0xcf, 0x7f, 0x16, 0xc3, 0x25, 0xba, 0xc5, 0x70, 0xb6, 0x08, + 0x6d, 0xa2, 0x88, 0x16, 0x8d, 0x74, 0xcd, 0xd5, 0xfd, 0x4e, 0xdd, 0x95, 0xec, 0xe3, 0xab, 0x77, 0xfb, 0x1f, 0x12, + 0x46, 0xad, 0x97, 0xee, 0x14, 0x90, 0x57, 0x23, 0x9e, 0xf7, 0x5f, 0xcf, 0x29, 0xaf, 0x5a, 0x5e, 0x1a, 0x7d, 0x14, + 0x3c, 0x67, 0xfa, 0xdc, 0xd0, 0xf8, 0x45, 0xd3, 0x28, 0xcd, 0x3e, 0x50, 0x23, 0xbb, 0x81, 0xd6, 0x9b, 0xb4, 0x43, + 0xc6, 0x3b, 0x12, 0x7c, 0xb2, 0x42, 0x78, 0x69, 0xdc, 0x9e, 0x38, 0x89, 0x94, 0x62, 0x34, 0x55, 0x29, 0x54, 0xb5, + 0xce, 0x0a, 0x4d, 0x5b, 0x55, 0x21, 0xc9, 0x81, 0x03, 0xa5, 0x93, 0x21, 0xcc, 0xf1, 0xa4, 0x9c, 0xc4, 0x93, 0xa4, + 0x59, 0xcd, 0x43, 0x4e, 0x79, 0x51, 0x92, 0x86, 0xf4, 0x75, 0xe6, 0x14, 0x80, 0x66, 0x03, 0x25, 0x70, 0x28, 0x49, + 0x01, 0x66, 0x1a, 0xd2, 0x33, 0x44, 0x14, 0x82, 0x01, 0x7a, 0x73, 0x15, 0x13, 0x8f, 0x13, 0x6f, 0x1b, 0xed, 0xb2, + 0xa6, 0x20, 0x9e, 0x7c, 0xec, 0x7d, 0xb3, 0x98, 0xd6, 0x9d, 0x5c, 0x50, 0xc9, 0xf3, 0xc5, 0xd4, 0xd2, 0x04, 0xee, + 0x13, 0x32, 0xd5, 0x8c, 0xa9, 0x42, 0xfe, 0x4d, 0xee, 0xdb, 0xd1, 0x7e, 0x2c, 0x8e, 0xc5, 0xbb, 0x33, 0x34, 0xdd, + 0xcd, 0x55, 0x8e, 0xdc, 0x37, 0x23, 0xb9, 0xd5, 0xb2, 0xa6, 0x11, 0x84, 0x2c, 0x7c, 0xe1, 0x7a, 0xed, 0xf5, 0xf1, + 0x7d, 0xd6, 0xfd, 0xab, 0x0d, 0xc7, 0x8b, 0xe6, 0x25, 0x1f, 0xd2, 0x5d, 0x31, 0xb1, 0x68, 0xaf, 0xfc, 0x24, 0xa9, + 0x77, 0x6a, 0x3d, 0x66, 0xc2, 0xdd, 0x3f, 0x94, 0xa6, 0x31, 0xd3, 0x3b, 0xea, 0x78, 0x3f, 0xba, 0xc3, 0x1c, 0x8a, + 0x98, 0x6a, 0x58, 0xdd, 0x48, 0xa5, 0x5c, 0x98, 0x9e, 0x61, 0x63, 0xae, 0x4e, 0x3b, 0x4a, 0x4a, 0xd0, 0xa9, 0x5a, + 0xff, 0x51, 0x1e, 0xe1, 0x34, 0x55, 0xc1, 0x4f, 0x5e, 0x6d, 0xc7, 0xa2, 0x6b, 0x2f, 0x47, 0x6b, 0xd1, 0xb3, 0x1d, + 0xe5, 0x84, 0x7d, 0x7c, 0x8f, 0x50, 0x75, 0x7d, 0xb1, 0x3e, 0xfd, 0xb5, 0xfe, 0x56, 0xee, 0x06, 0x2a, 0x81, 0x3a, + 0x1b, 0xcb, 0xec, 0x5a, 0x13, 0x17, 0xb6, 0xbf, 0x6e, 0x53, 0xab, 0x06, 0x4e, 0xf6, 0x6a, 0xc3, 0xca, 0x9a, 0xcf, + 0x84, 0x6c, 0x7c, 0x93, 0xb2, 0x5f, 0x88, 0xe1, 0x27, 0xa9, 0x4d, 0x4d, 0x9b, 0xa4, 0xb5, 0xfc, 0x2c, 0xd7, 0xcd, + 0xdb, 0x56, 0xc4, 0xe9, 0xbe, 0x28, 0x82, 0x9c, 0x22, 0x09, 0xd9, 0xc6, 0x78, 0x84, 0xb0, 0x85, 0x0e, 0xe2, 0x5c, + 0xba, 0x88, 0xb1, 0x2c, 0x62, 0x78, 0x2f, 0x8f, 0x7d, 0x12, 0x6a, 0xda, 0x68, 0xa7, 0x2c, 0xb2, 0xff, 0x3e, 0xd3, + 0x8f, 0x8b, 0x2a, 0xa8, 0x03, 0x30, 0xbd, 0xbf, 0x6a, 0x7b, 0xb9, 0x38, 0xea, 0x37, 0x15, 0x07, 0x57, 0xff, 0x94, + 0x36, 0x37, 0x6c, 0xaa, 0xf9, 0x86, 0xa8, 0x54, 0xca, 0xbe, 0x18, 0xf4, 0x8c, 0xec, 0x55, 0xa3, 0x51, 0xcc, 0xa7, + 0xd0, 0xb2, 0x44, 0xfc, 0xf1, 0x54, 0x28, 0x6a, 0xa8, 0xe6, 0x2e, 0xe4, 0xe4, 0xd8, 0x30, 0xf6, 0x27, 0x93, 0xdd, + 0x9e, 0xb6, 0xea, 0xa7, 0xac, 0x67, 0x48, 0x87, 0x87, 0x82, 0x1f, 0xb8, 0xdc, 0x75, 0xf1, 0xa6, 0xec, 0xdd, 0xaa, + 0x45, 0x2a, 0x51, 0x10, 0x2a, 0x9b, 0x7d, 0xf5, 0x86, 0xa9, 0x81, 0x1e, 0x6a, 0xf4, 0x40, 0x19, 0x4c, 0xf1, 0x09, + 0x80, 0x9a, 0xd6, 0xe1, 0xd3, 0xd4, 0x42, 0xd9, 0x48, 0xdf, 0x0b, 0xcc, 0x30, 0xfd, 0xd7, 0x61, 0xb2, 0x42, 0x06, + 0xfc, 0xea, 0x69, 0x79, 0x33, 0xce, 0xbf, 0xe7, 0xb6, 0x87, 0xde, 0xa7, 0x7e, 0xfa, 0x2a, 0x89, 0x71, 0x0f, 0xf6, + 0xf7, 0x69, 0xe6, 0x4c, 0xc9, 0xd8, 0x51, 0x01, 0x24, 0x54, 0xdc, 0x4c, 0x61, 0x08, 0x4f, 0x17, 0x82, 0x22, 0x86, + 0xae, 0x6f, 0xd7, 0xf3, 0x3b, 0xbe, 0x62, 0x1e, 0x51, 0xbb, 0x4c, 0xd5, 0x50, 0xd2, 0xfa, 0x30, 0x1b, 0x10, 0xd6, + 0x04, 0x4f, 0x8e, 0x70, 0xc3, 0xd2, 0x55, 0x44, 0x66, 0xc1, 0x0a, 0xcf, 0xc0, 0xa9, 0x09, 0xb8, 0x6e, 0x8a, 0xcc, + 0x7b, 0x9c, 0x00, 0xce, 0xc7, 0x63, 0x1c, 0xed, 0x29, 0xe0, 0xed, 0xb2, 0xba, 0xda, 0x5b, 0x6a, 0xbd, 0x73, 0x1e, + 0xda, 0x44, 0x10, 0x95, 0xf8, 0x79, 0x36, 0x91, 0xfb, 0x07, 0x6f, 0xce, 0xab, 0xc9, 0x96, 0xa4, 0x43, 0xc9, 0xdf, + 0x41, 0xd1, 0x9b, 0xac, 0xb0, 0x92, 0x1b, 0xc5, 0x22, 0x99, 0x34, 0x02, 0x20, 0x30, 0xaf, 0xf2, 0x1d, 0x11, 0xc0, + 0x55, 0x58, 0x68, 0x34, 0x45, 0x51, 0x5e, 0x51, 0x6d, 0x9e, 0xd1, 0xee, 0xd8, 0xaf, 0xe7, 0xb8, 0x2c, 0xd7, 0x96, + 0xd4, 0x6a, 0x2c, 0xeb, 0x48, 0x8a, 0x66, 0x18, 0xbc, 0x39, 0x2f, 0x05, 0x2f, 0xf1, 0xc1, 0x3c, 0x6f, 0x89, 0xaf, + 0x54, 0x5a, 0x41, 0x23, 0xd7, 0x6b, 0x8a, 0x99, 0x03, 0x9a, 0xd3, 0x65, 0x7a, 0x97, 0xe2, 0xfd, 0xeb, 0x15, 0xbf, + 0x2c, 0x5b, 0xaa, 0xba, 0xee, 0xfa, 0x93, 0x15, 0x71, 0x5c, 0x64, 0xb1, 0x6f, 0x59, 0xb4, 0x19, 0xec, 0x10, 0xfb, + 0x31, 0xed, 0xf3, 0x28, 0xcf, 0xb5, 0xcf, 0x36, 0x3f, 0x97, 0x10, 0x47, 0x96, 0x68, 0xbd, 0x3a, 0x62, 0x3f, 0xb5, + 0x64, 0x63, 0xb9, 0xef, 0x44, 0x29, 0x76, 0xb4, 0xb8, 0x90, 0xe6, 0x42, 0x1f, 0x3c, 0xd7, 0x83, 0xa5, 0x0c, 0x7f, + 0x16, 0x57, 0xb6, 0xf4, 0xaa, 0x1c, 0xad, 0xf4, 0x9f, 0x75, 0xa3, 0x87, 0x53, 0x9b, 0x62, 0xea, 0xde, 0x47, 0xc2, + 0x34, 0xa1, 0xf9, 0xbe, 0x21, 0x36, 0x55, 0x4c, 0x14, 0x44, 0x23, 0x6d, 0x03, 0xc7, 0xfb, 0xe7, 0xf5, 0x95, 0xa7, + 0xbc, 0x94, 0xfc, 0xe1, 0x3a, 0x6e, 0x79, 0x63, 0x68, 0x32, 0xf1, 0x06, 0xad, 0x07, 0x39, 0x81, 0x6d, 0x6c, 0x9f, + 0x1e, 0x69, 0x8f, 0xc2, 0x09, 0xe9, 0x4e, 0x39, 0xb4, 0x0e, 0xd7, 0x27, 0xef, 0xd0, 0x85, 0x28, 0x8d, 0x4c, 0xfc, + 0x84, 0xf4, 0xc6, 0x69, 0x74, 0xaa, 0xab, 0x7f, 0xf2, 0xbc, 0xb3, 0xd8, 0x37, 0xb0, 0xa0, 0xde, 0xff, 0xe9, 0xc6, + 0x50, 0x62, 0x3c, 0x6f, 0x19, 0x71, 0x4c, 0x84, 0xa4, 0xdc, 0x4a, 0xbe, 0x4f, 0x22, 0x2a, 0xb5, 0x52, 0x38, 0xa3, + 0x17, 0xf4, 0x88, 0x1a, 0x2c, 0x9e, 0x9f, 0x5a, 0xe7, 0xc0, 0xa4, 0x1b, 0xe5, 0xa5, 0x51, 0x20, 0x0d, 0x22, 0x4f, + 0xcd, 0xf4, 0x0c, 0x9a, 0xb7, 0x0f, 0xaf, 0x03, 0xf7, 0x9e, 0x20, 0x9f, 0xff, 0xfe, 0x30, 0xdc, 0xde, 0x1a, 0x68, + 0x96, 0xf5, 0x39, 0x76, 0x51, 0xeb, 0x8b, 0x15, 0x7a, 0x58, 0x80, 0xdd, 0x13, 0x92, 0xeb, 0x3f, 0x05, 0xe8, 0x1a, + 0xcc, 0xb2, 0x55, 0xc7, 0xbc, 0x6d, 0xfb, 0xb7, 0xf3, 0x2a, 0xdc, 0x1d, 0x33, 0x10, 0x68, 0x77, 0xc6, 0x38, 0x87, + 0xff, 0x67, 0x89, 0x64, 0x15, 0xc6, 0xe4, 0xa2, 0xbd, 0x6e, 0x0f, 0x97, 0xc4, 0x6e, 0xb5, 0x66, 0x39, 0xd3, 0x76, + 0x60, 0xeb, 0x39, 0x2f, 0xa2, 0xd2, 0x20, 0xc1, 0x4e, 0x6a, 0x43, 0x03, 0x44, 0x32, 0xe8, 0xf6, 0x52, 0xc6, 0xbd, + 0x20, 0x9f, 0x01, 0x7d, 0x6d, 0x67, 0x2e, 0xbd, 0x31, 0x35, 0xae, 0x70, 0x52, 0x97, 0x9d, 0xbb, 0xc9, 0x70, 0xd6, + 0x3e, 0x16, 0xca, 0xd7, 0x63, 0x81, 0x2f, 0xac, 0x8f, 0xd3, 0xf4, 0xc1, 0x1d, 0xd9, 0x47, 0x93, 0x63, 0x2f, 0xa6, + 0xa4, 0x2a, 0x33, 0x18, 0x65, 0x08, 0xb4, 0x74, 0x2d, 0xcb, 0x94, 0x62, 0x8f, 0xde, 0x3e, 0x9c, 0x32, 0x6e, 0xfa, + 0x79, 0x98, 0x73, 0xd0, 0x89, 0x65, 0x8b, 0xe7, 0x15, 0xd9, 0xc3, 0xd4, 0x9d, 0x00, 0x89, 0x04, 0x61, 0xa2, 0x0b, + 0x95, 0x7a, 0x90, 0x61, 0x4d, 0x78, 0x84, 0x34, 0x71, 0x71, 0x3a, 0x32, 0x61, 0x77, 0xe4, 0x49, 0x07, 0x51, 0x07, + 0x86, 0xca, 0xd5, 0x73, 0xfe, 0xd0, 0x63, 0xb2, 0x17, 0x14, 0xd9, 0xf6, 0x48, 0xe1, 0x9c, 0x79, 0xf3, 0x21, 0x7b, + 0xe8, 0x5f, 0x37, 0xbd, 0xe6, 0x88, 0x05, 0xf7, 0xb7, 0x50, 0x81, 0x32, 0x04, 0xdc, 0x1f, 0xfa, 0xee, 0x36, 0x47, + 0xad, 0xa0, 0x33, 0x30, 0x7d, 0xb2, 0xcf, 0xf4, 0x62, 0x4d, 0x69, 0xb8, 0x6f, 0x46, 0xce, 0xe0, 0x4e, 0xd0, 0xb5, + 0x33, 0xa9, 0xb4, 0xbb, 0x7c, 0x21, 0xa8, 0xf0, 0xe1, 0x1a, 0xb4, 0x3a, 0x88, 0x9c, 0x92, 0xfe, 0x4e, 0x48, 0x75, + 0xb5, 0x29, 0x26, 0xdc, 0x40, 0xcd, 0x06, 0x8a, 0xa3, 0x70, 0xe3, 0x07, 0x89, 0x01, 0x66, 0x6e, 0xa4, 0x61, 0x25, + 0xaf, 0x9d, 0x87, 0x5f, 0xec, 0x07, 0x39, 0xcf, 0x63, 0x2a, 0xd1, 0x43, 0x9f, 0x56, 0x75, 0xfd, 0x21, 0xe6, 0x1b, + 0x6a, 0x9f, 0x41, 0x6d, 0x93, 0x10, 0xa2, 0x4e, 0xd3, 0x3e, 0xe6, 0x59, 0xf9, 0xd1, 0xc1, 0x84, 0x98, 0x7b, 0x32, + 0xd0, 0xaa, 0x5d, 0x81, 0xa5, 0xec, 0x52, 0x95, 0x70, 0xed, 0xd4, 0x6f, 0x2a, 0x69, 0x17, 0xab, 0x95, 0x57, 0xa7, + 0xd8, 0xb3, 0x7f, 0xe7, 0xda, 0xfb, 0x90, 0xf1, 0x99, 0xe8, 0x58, 0xb3, 0xda, 0xbd, 0xee, 0x27, 0xce, 0x69, 0xbc, + 0xc4, 0x46, 0x09, 0xe5, 0x87, 0x69, 0x40, 0x3c, 0x78, 0x83, 0x78, 0xd7, 0x4f, 0x6c, 0xf6, 0xe2, 0xaa, 0x2f, 0x35, + 0x5a, 0xa8, 0x3f, 0xe9, 0xc3, 0xa3, 0x1a, 0x9c, 0x3c, 0x5c, 0x86, 0x27, 0x5f, 0x79, 0x3b, 0x19, 0xe0, 0xb1, 0x12, + 0xf8, 0xdc, 0x5a, 0x02, 0x4a, 0x47, 0x24, 0xaf, 0xe4, 0x03, 0xfa, 0x7f, 0x0e, 0xcf, 0x87, 0x5d, 0x8f, 0x9f, 0x2d, + 0x6d, 0xa8, 0x45, 0x27, 0x1d, 0x61, 0x09, 0x6a, 0x7b, 0x48, 0x43, 0x88, 0x8c, 0x1d, 0x81, 0x69, 0xcc, 0x9f, 0x14, + 0x61, 0x1e, 0x81, 0xf7, 0x39, 0x03, 0x8e, 0xda, 0x96, 0xf8, 0xc2, 0x09, 0x77, 0xef, 0xf2, 0xe1, 0x37, 0xf0, 0xbd, + 0xb2, 0x4b, 0x58, 0x6e, 0xab, 0x1d, 0xbb, 0xd9, 0x04, 0x9a, 0xa3, 0x28, 0x6e, 0xbf, 0x99, 0x68, 0xd1, 0xb3, 0xc3, + 0x7e, 0x0e, 0xba, 0x97, 0xa1, 0x42, 0xf9, 0x98, 0xf6, 0x99, 0xdc, 0xaf, 0x47, 0x80, 0x22, 0xe0, 0x10, 0x43, 0x6c, + 0xff, 0xd8, 0x2b, 0x0f, 0xb5, 0x9e, 0x05, 0x04, 0x14, 0xc3, 0x9f, 0x5c, 0x70, 0x66, 0xfa, 0xe0, 0x18, 0x30, 0x39, + 0x00, 0xd4, 0x06, 0x17, 0x8d, 0xc5, 0x29, 0xfe, 0xbf, 0xf3, 0x8d, 0xe4, 0xed, 0xba, 0x38, 0x1d, 0xf1, 0x2e, 0x9f, + 0x51, 0x54, 0xcc, 0x90, 0x42, 0x0b, 0xbf, 0xe8, 0x06, 0xc2, 0x4a, 0x11, 0x0b, 0x7a, 0x2b, 0x1f, 0xdb, 0xcb, 0x63, + 0x14, 0xaa, 0xff, 0xab, 0x97, 0xec, 0x8f, 0x5a, 0xf0, 0xd8, 0xa5, 0x58, 0xde, 0xf0, 0x91, 0x53, 0xaa, 0x87, 0xbb, + 0x78, 0xb3, 0x1d, 0x06, 0x05, 0xbd, 0x1d, 0x10, 0x6f, 0xfd, 0x9f, 0x25, 0x49, 0xb6, 0xdc, 0x6a, 0x86, 0x24, 0xb9, + 0xae, 0x8e, 0x3b, 0xe2, 0xdf, 0x8f, 0x78, 0x57, 0x1b, 0x1d, 0xaa, 0xf6, 0x7c, 0x5c, 0x67, 0xfe, 0x2b, 0xce, 0xf2, + 0x86, 0xa4, 0xd3, 0xcc, 0xee, 0x6b, 0x5c, 0xce, 0x65, 0x3b, 0x99, 0x2f, 0x66, 0x77, 0xb3, 0xfd, 0xf2, 0xfd, 0x96, + 0x2a, 0x63, 0xeb, 0xf9, 0x45, 0xf3, 0x31, 0xc7, 0x1d, 0x91, 0x94, 0x65, 0x18, 0xcb, 0xf9, 0xb9, 0x4b, 0xf3, 0xe3, + 0x0f, 0xc2, 0x9b, 0x1f, 0xbf, 0x78, 0x28, 0x38, 0x9d, 0x62, 0x2a, 0x23, 0x4e, 0x95, 0xce, 0x9c, 0x24, 0x86, 0xa9, + 0x14, 0x68, 0x26, 0xba, 0xbe, 0x06, 0xc9, 0x00, 0xbd, 0x82, 0xa6, 0xc3, 0xd0, 0x9f, 0xf1, 0x01, 0xae, 0x3a, 0x79, + 0xa6, 0x92, 0xcc, 0x17, 0x8c, 0x31, 0x5e, 0xf0, 0x43, 0xbf, 0xf0, 0xe4, 0x5e, 0x3b, 0x32, 0x80, 0x21, 0x15, 0x7b, + 0xfc, 0x78, 0xd1, 0x7c, 0x79, 0x69, 0x44, 0x08, 0x55, 0xc8, 0x52, 0x80, 0xa7, 0x3c, 0x7f, 0x26, 0xab, 0xeb, 0xd9, + 0x6f, 0x36, 0x5d, 0x69, 0xb8, 0xaf, 0xa6, 0x9e, 0x2a, 0x60, 0x6c, 0xb9, 0x91, 0x8f, 0x29, 0x66, 0xd6, 0x06, 0xeb, + 0x74, 0x50, 0xab, 0xc7, 0x1c, 0xe3, 0xa9, 0xa0, 0x2e, 0xa6, 0xd4, 0x93, 0x3c, 0xd6, 0xd9, 0xf4, 0x41, 0x36, 0xb8, + 0x81, 0x71, 0xc5, 0xc9, 0x47, 0x10, 0x45, 0x13, 0x60, 0x39, 0x4f, 0x5b, 0x44, 0x11, 0x7c, 0x87, 0x66, 0x14, 0xc1, + 0x10, 0xb1, 0x88, 0x2d, 0xef, 0x56, 0xc9, 0xbc, 0xbd, 0xec, 0x72, 0x92, 0xe9, 0xb7, 0xa5, 0xcc, 0x49, 0xa2, 0xc1, + 0xc1, 0x2a, 0x9f, 0xb5, 0xea, 0xa6, 0x1f, 0xec, 0x4b, 0x28, 0x00, 0x8e, 0xcc, 0xc0, 0x81, 0x92, 0x62, 0x56, 0xaa, + 0x8a, 0x1a, 0x39, 0x08, 0x70, 0xf2, 0xc3, 0x3f, 0x54, 0x5f, 0x84, 0xa5, 0xb3, 0xdb, 0x29, 0x08, 0x3d, 0xc1, 0x08, + 0x91, 0x40, 0xe3, 0x27, 0x97, 0x6c, 0xfa, 0xef, 0xdc, 0xcc, 0x48, 0x5f, 0xfe, 0xbd, 0x9e, 0xec, 0x6d, 0x6b, 0x50, + 0x30, 0xb9, 0x1e, 0xed, 0xeb, 0x58, 0x2b, 0x96, 0x4e, 0xa8, 0x4b, 0x7f, 0x71, 0x05, 0x3e, 0xa9, 0x09, 0x91, 0xb1, + 0x62, 0xa6, 0x32, 0x6b, 0x29, 0x78, 0xae, 0x7e, 0xcc, 0x65, 0x60, 0x26, 0x52, 0xda, 0x15, 0x93, 0xa6, 0x34, 0xf3, + 0x29, 0x17, 0xd1, 0xb3, 0x67, 0x5d, 0xa7, 0xa1, 0xb5, 0x0e, 0xac, 0xcb, 0x7e, 0x88, 0xb7, 0xf9, 0xd5, 0x99, 0xa6, + 0x30, 0xca, 0xf9, 0xab, 0xf3, 0x0e, 0x8b, 0x72, 0xb3, 0xbe, 0x62, 0x3e, 0xec, 0x1d, 0xda, 0x69, 0x65, 0xf4, 0xf1, + 0x5c, 0xad, 0x70, 0xdf, 0x81, 0x90, 0xf3, 0xe8, 0x7b, 0x03, 0x1e, 0xff, 0x0a, 0xff, 0xbf, 0x3e, 0x04, 0xda, 0xb1, + 0x15, 0x0c, 0xdd, 0xf0, 0x89, 0x4d, 0x70, 0x8f, 0x86, 0x99, 0xd3, 0xd9, 0xca, 0xef, 0x43, 0x22, 0xea, 0x16, 0x70, + 0xb7, 0x8b, 0x1f, 0xd7, 0x3e, 0xc3, 0xd5, 0xc8, 0xc6, 0x18, 0x0e, 0xb9, 0x01, 0xb2, 0x84, 0xf0, 0x09, 0x09, 0x63, + 0xdd, 0x39, 0x3f, 0x38, 0xa3, 0x31, 0xbe, 0xfb, 0x5b, 0xe7, 0xf9, 0x66, 0xbc, 0x8d, 0xf9, 0x75, 0xf2, 0x4d, 0xe7, + 0x7a, 0xa0, 0xf3, 0xf4, 0xa0, 0xd6, 0x6a, 0xfd, 0xc3, 0x4d, 0xef, 0x5d, 0x0c, 0x4b, 0xb8, 0x9f, 0x3a, 0xba, 0xb9, + 0x7b, 0x13, 0x11, 0x11, 0xa8, 0x3f, 0x78, 0x68, 0xd1, 0xf3, 0x09, 0xd4, 0xe9, 0x12, 0x22, 0xfa, 0xa3, 0xcd, 0x9e, + 0xdb, 0xc9, 0x9c, 0x3a, 0x79, 0xb2, 0x8d, 0xae, 0x45, 0x25, 0x5f, 0x58, 0x2c, 0xf3, 0x3e, 0x6d, 0xdd, 0x88, 0xc8, + 0x81, 0xc4, 0x64, 0xc5, 0x36, 0xc3, 0xd4, 0xd0, 0x71, 0xea, 0x22, 0xf1, 0x3f, 0xef, 0xeb, 0xc4, 0x50, 0xf2, 0xb2, + 0xd4, 0x02, 0x0b, 0x4b, 0x55, 0xd8, 0x3e, 0xee, 0x39, 0x95, 0x85, 0x55, 0x37, 0x46, 0xbc, 0x75, 0xdf, 0x76, 0x4d, + 0xc7, 0x26, 0x8a, 0xd7, 0x5f, 0xbf, 0x02, 0xad, 0x21, 0x3d, 0x16, 0xf1, 0x7e, 0x91, 0x8e, 0x63, 0x00, 0xde, 0x31, + 0x74, 0x0b, 0x77, 0xcb, 0xb2, 0x6a, 0xcf, 0xfb, 0x74, 0x0c, 0x25, 0x45, 0xb1, 0x94, 0xdc, 0x3d, 0x62, 0xeb, 0x71, + 0x94, 0xe0, 0xa9, 0xee, 0x3d, 0xbd, 0x45, 0x2a, 0x91, 0xa5, 0xa3, 0xf4, 0xd8, 0xcf, 0x29, 0x60, 0xea, 0xa5, 0xf8, + 0x7d, 0xf4, 0x68, 0x59, 0x32, 0x40, 0x8b, 0x8d, 0x58, 0xe5, 0x1d, 0x5b, 0xc1, 0x5a, 0x9c, 0x92, 0x63, 0xbc, 0xed, + 0xdd, 0x97, 0x54, 0xca, 0x5d, 0xcc, 0x6c, 0x94, 0x76, 0x6a, 0xbc, 0x1c, 0x1c, 0xa7, 0xa5, 0xb0, 0x22, 0xc6, 0x18, + 0x39, 0xbb, 0x12, 0xb4, 0x35, 0x42, 0x77, 0xb8, 0x66, 0x89, 0xff, 0xbe, 0xac, 0x2d, 0x6e, 0x25, 0x90, 0x91, 0x2f, + 0xc3, 0x37, 0xe5, 0x9b, 0xa0, 0xad, 0xfe, 0x62, 0x8f, 0xbe, 0x56, 0x10, 0x32, 0xe1, 0x57, 0x7c, 0x35, 0xba, 0xe6, + 0xf6, 0x7d, 0xd9, 0x4d, 0x56, 0x69, 0x92, 0x9d, 0x40, 0x6b, 0x93, 0xca, 0xb9, 0xf0, 0xf0, 0x39, 0x77, 0x47, 0x92, + 0x3e, 0x7d, 0x2a, 0xcc, 0x28, 0x79, 0xc9, 0x54, 0x50, 0x3a, 0xc8, 0x66, 0x7f, 0x82, 0x25, 0xa8, 0x87, 0x7c, 0x41, + 0x6d, 0xdd, 0xe3, 0xe9, 0xf3, 0x1a, 0x88, 0xeb, 0x65, 0xc3, 0x0a, 0x44, 0x22, 0xfa, 0x6f, 0xb3, 0x8f, 0x3e, 0x64, + 0x73, 0x42, 0xf6, 0xfa, 0x66, 0x8e, 0xd3, 0x9d, 0x44, 0x28, 0xca, 0x1d, 0xb7, 0x03, 0x4a, 0x29, 0x0e, 0x4a, 0xd5, + 0xf0, 0xd8, 0x2c, 0x91, 0x63, 0xe6, 0x07, 0xa7, 0xbb, 0xd8, 0x4f, 0x5c, 0x8b, 0x5f, 0xd8, 0xb1, 0x53, 0x79, 0xf3, + 0xcf, 0xbe, 0x7c, 0xd9, 0xc7, 0x83, 0xc8, 0xe8, 0x0f, 0x42, 0x11, 0x5f, 0xf6, 0x9b, 0x26, 0xf1, 0xe2, 0x17, 0xdf, + 0xd2, 0x53, 0x3c, 0xf7, 0x6b, 0x75, 0x11, 0xb7, 0x75, 0xf7, 0xbe, 0x8a, 0x76, 0x29, 0xb1, 0xe1, 0x36, 0x0c, 0x4f, + 0x93, 0xe4, 0xf4, 0x00, 0xe0, 0x03, 0xce, 0xe5, 0x3f, 0x73, 0x14, 0xca, 0x47, 0x2e, 0xc3, 0xf9, 0x62, 0x11, 0x62, + 0x4c, 0xfe, 0xc6, 0x18, 0xa5, 0x35, 0x6f, 0x9f, 0xb7, 0x77, 0xbf, 0x71, 0x6c, 0x78, 0x6d, 0xbc, 0x89, 0x86, 0x8a, + 0x16, 0xe5, 0x4d, 0xe1, 0x53, 0x5e, 0x17, 0x76, 0x79, 0xaf, 0xf0, 0x98, 0xf7, 0x0b, 0x4f, 0xf9, 0x60, 0xed, 0xd1, + 0x68, 0x45, 0x48, 0xc1, 0xb5, 0x40, 0xd6, 0x85, 0x42, 0x97, 0x71, 0x04, 0xf7, 0x94, 0x17, 0x6d, 0xcd, 0xef, 0xd0, + 0x44, 0x96, 0xff, 0x07, 0x62, 0x85, 0xd5, 0xe9, 0x07, 0x4d, 0xf1, 0x0a, 0xc4, 0x58, 0xe6, 0x58, 0x8a, 0xd5, 0xed, + 0x7f, 0xd6, 0x52, 0x31, 0x1e, 0x73, 0xb6, 0x99, 0x81, 0xbe, 0x5a, 0xbe, 0xc2, 0xc6, 0x40, 0xe3, 0xeb, 0x4d, 0x69, + 0xf5, 0x1a, 0x58, 0x8b, 0xfd, 0x7c, 0x4d, 0x23, 0x59, 0x89, 0xb0, 0x52, 0xe5, 0x61, 0x60, 0xa2, 0x2a, 0xf3, 0x8c, + 0x74, 0x04, 0xc5, 0xf3, 0xe9, 0x0b, 0xbe, 0x72, 0xd4, 0xda, 0x67, 0x05, 0xa8, 0x86, 0xc7, 0x42, 0x47, 0x2f, 0x8c, + 0xec, 0xea, 0xba, 0xa5, 0xa6, 0xb6, 0x67, 0x5f, 0x12, 0x6b, 0xe4, 0xb7, 0xe3, 0x67, 0x52, 0x24, 0xb4, 0x6c, 0xfc, + 0x3e, 0x8f, 0x77, 0xb1, 0xf7, 0x95, 0x86, 0x34, 0x40, 0x68, 0x9d, 0x90, 0x59, 0xd4, 0x74, 0xc1, 0x4b, 0xc2, 0xa7, + 0xa5, 0x8f, 0xe9, 0x47, 0xc7, 0xfb, 0x8b, 0xaf, 0xf0, 0x00, 0x47, 0x5a, 0xbb, 0xd8, 0xe4, 0xc7, 0xe3, 0x02, 0x7e, + 0xed, 0x37, 0x1d, 0x0a, 0x6b, 0xc6, 0x2a, 0x97, 0xde, 0xb4, 0xab, 0x8b, 0xe0, 0x6b, 0x4b, 0x9f, 0xf1, 0xb8, 0x7f, + 0xec, 0x4d, 0x1d, 0xef, 0x4f, 0x7a, 0x04, 0xbe, 0x01, 0x28, 0x15, 0x35, 0x88, 0x7d, 0x10, 0x7a, 0xbc, 0xb3, 0x2a, + 0x82, 0xcb, 0xf0, 0x38, 0xa4, 0xed, 0xf9, 0x32, 0xb3, 0xab, 0xc7, 0xf8, 0x8d, 0x90, 0x04, 0xdd, 0xf0, 0x4e, 0x5a, + 0x12, 0xa0, 0xf4, 0x51, 0x09, 0x93, 0x1c, 0xb1, 0xcf, 0x2f, 0x5a, 0xf6, 0xa6, 0x8d, 0x4e, 0xe1, 0x5b, 0x8f, 0x98, + 0x67, 0x6d, 0x99, 0xf3, 0x9f, 0x06, 0x71, 0x30, 0x93, 0xa3, 0xf8, 0xfd, 0x10, 0xe7, 0x45, 0x15, 0x75, 0xe9, 0xc5, + 0x6c, 0x6f, 0x03, 0xb6, 0xf0, 0xbb, 0x0f, 0xb3, 0x81, 0xef, 0x4f, 0x7d, 0xb9, 0xd6, 0xa1, 0x9e, 0xd1, 0xfd, 0x56, + 0x75, 0xdb, 0xc7, 0x91, 0x75, 0xf2, 0x9c, 0xc5, 0xc3, 0xe8, 0xdd, 0xf7, 0x85, 0xaf, 0x71, 0x66, 0xb4, 0xf8, 0x24, + 0x2a, 0x0a, 0x2b, 0x97, 0x41, 0xb9, 0x7c, 0x4d, 0x55, 0xb5, 0x47, 0x9b, 0x2f, 0x62, 0x74, 0x5e, 0xfc, 0x5e, 0xa7, + 0x8f, 0xba, 0xc6, 0xeb, 0x48, 0xf9, 0x68, 0x5f, 0x16, 0xc3, 0x1f, 0xac, 0x20, 0xb4, 0x98, 0xd8, 0xec, 0xb1, 0x5f, + 0x8e, 0x16, 0xa7, 0x67, 0x69, 0x33, 0xec, 0x34, 0x6d, 0xb5, 0x71, 0x3b, 0xd8, 0x6f, 0x1d, 0xd2, 0x92, 0xc4, 0x8b, + 0xf1, 0x15, 0x2a, 0x7f, 0xc0, 0x43, 0xec, 0x39, 0x48, 0xd0, 0x88, 0x35, 0xe7, 0xb7, 0xc8, 0x75, 0xba, 0x16, 0x48, + 0x5d, 0xf8, 0x7a, 0xe8, 0x61, 0xd2, 0x22, 0xd5, 0x41, 0x59, 0x06, 0xba, 0x89, 0x02, 0xfa, 0x9e, 0xba, 0x2d, 0xc8, + 0x45, 0xf6, 0xf7, 0x9c, 0x9d, 0xbe, 0xc6, 0xfb, 0x73, 0x0b, 0x3b, 0x51, 0xf8, 0xcd, 0x1f, 0x93, 0x18, 0xd6, 0xdc, + 0x76, 0x91, 0x2d, 0x82, 0xde, 0x6c, 0x5a, 0x3e, 0x28, 0x07, 0x6c, 0x7e, 0x69, 0xa1, 0xca, 0xc8, 0x11, 0xeb, 0xf9, + 0x6f, 0xf7, 0x63, 0x97, 0x98, 0x57, 0x41, 0xa8, 0x5e, 0xa9, 0x2a, 0x31, 0x80, 0x3e, 0xa9, 0x3d, 0x03, 0x75, 0x66, + 0x76, 0x55, 0xe9, 0xf5, 0xeb, 0xac, 0x3e, 0xd4, 0xee, 0x02, 0xf7, 0x4e, 0xc3, 0xb3, 0x13, 0x6b, 0x25, 0x8b, 0xe8, + 0x23, 0x24, 0x61, 0x02, 0xfd, 0x7e, 0xd7, 0xb5, 0xaf, 0x7b, 0x3a, 0x96, 0x05, 0x94, 0x89, 0x3a, 0x5c, 0x9c, 0x20, + 0x18, 0x3f, 0xc8, 0x71, 0x80, 0x6d, 0xe4, 0xc7, 0x2e, 0x8b, 0xab, 0xfe, 0x1c, 0x28, 0x92, 0xa0, 0xb9, 0x96, 0xfb, + 0x35, 0xb8, 0xaf, 0xef, 0x74, 0x93, 0x15, 0xd9, 0x65, 0x98, 0x33, 0xde, 0x30, 0xc6, 0x08, 0x51, 0xc5, 0x22, 0x9e, + 0xe7, 0xb8, 0x81, 0xe5, 0x71, 0x09, 0xde, 0x58, 0xce, 0x3b, 0xa3, 0xda, 0xf2, 0x6c, 0x80, 0xa6, 0xb4, 0x62, 0x1b, + 0x95, 0x6a, 0x65, 0x0c, 0x0c, 0x64, 0xcb, 0x4e, 0xa6, 0xef, 0xa9, 0x2c, 0xc6, 0xfb, 0x77, 0x47, 0x04, 0x37, 0x3d, + 0xca, 0x7c, 0x7d, 0x10, 0xc6, 0xd0, 0xdc, 0xc3, 0xa0, 0x62, 0xb7, 0x4d, 0x39, 0x06, 0x17, 0x5c, 0x74, 0xa2, 0x26, + 0x35, 0x94, 0x45, 0xb5, 0x8c, 0x14, 0x5e, 0xcd, 0x8a, 0xbe, 0xee, 0x69, 0xf1, 0x5a, 0x84, 0x18, 0x94, 0xe1, 0xba, + 0x24, 0x21, 0x54, 0x26, 0x08, 0x7d, 0xa8, 0x30, 0xa5, 0xc2, 0xeb, 0x94, 0x80, 0xfd, 0x3d, 0xcf, 0x79, 0xdd, 0xfb, + 0x5d, 0x3b, 0x2c, 0xb3, 0xe4, 0xb8, 0xd7, 0x70, 0xbb, 0x82, 0xbb, 0x23, 0xcf, 0x46, 0x76, 0x6b, 0x64, 0xf2, 0xbe, + 0x56, 0x0c, 0xe9, 0xb6, 0x60, 0x2a, 0x2e, 0x8a, 0x68, 0x95, 0xc5, 0xb8, 0x1d, 0xf8, 0x95, 0xbb, 0x45, 0xb3, 0x9e, + 0x3a, 0x93, 0xf5, 0x86, 0x21, 0x7c, 0x1a, 0x96, 0xb1, 0x84, 0x58, 0xbd, 0x1e, 0xf9, 0x7f, 0x97, 0x85, 0x47, 0x45, + 0xbb, 0x4f, 0x28, 0xc4, 0xbd, 0xc9, 0x8c, 0x37, 0x03, 0x70, 0x90, 0x63, 0x88, 0x63, 0x70, 0xa0, 0xb5, 0xac, 0xd0, + 0xa9, 0x91, 0x80, 0x88, 0xb5, 0x25, 0x7f, 0xd3, 0x5b, 0xec, 0x2a, 0x7a, 0x6d, 0xdb, 0x77, 0x8e, 0x7f, 0xfe, 0xb6, + 0xda, 0xd6, 0x4d, 0x2c, 0xe4, 0x9d, 0x91, 0x41, 0x3d, 0xb0, 0xbf, 0xef, 0x88, 0x13, 0x6d, 0x81, 0xc0, 0xd5, 0x07, + 0xd3, 0x62, 0x7d, 0xbc, 0x10, 0x31, 0x3f, 0xf8, 0x18, 0x26, 0xf1, 0x14, 0x1d, 0x7d, 0xc6, 0xe7, 0x86, 0x8f, 0xc2, + 0x0f, 0xff, 0xb3, 0x1c, 0x58, 0x99, 0x74, 0x24, 0xa7, 0x8e, 0xa9, 0x8e, 0x02, 0x02, 0xe8, 0x4c, 0xee, 0x91, 0xef, + 0xbf, 0x3a, 0xb4, 0x54, 0xb1, 0x6c, 0x3a, 0x43, 0xb3, 0x93, 0x4e, 0xac, 0x5b, 0xcc, 0x06, 0x9f, 0x38, 0xf7, 0x8b, + 0xcb, 0x0f, 0xe9, 0xc9, 0x61, 0x7f, 0x7b, 0xd2, 0x68, 0xd3, 0x63, 0x46, 0x03, 0x60, 0x0c, 0x2b, 0xfd, 0x78, 0x90, + 0xd2, 0xeb, 0x27, 0x6a, 0xa2, 0x65, 0x43, 0x78, 0x66, 0x3c, 0xba, 0x0c, 0x91, 0xfe, 0xc3, 0xa0, 0x78, 0xd8, 0x6c, + 0xbd, 0x32, 0x5f, 0xb0, 0x9a, 0x83, 0xd1, 0x0b, 0x82, 0x66, 0xc3, 0x16, 0x8b, 0xca, 0xea, 0x71, 0x7e, 0x84, 0x59, + 0x50, 0x00, 0x3e, 0x65, 0x6d, 0x80, 0xfe, 0x39, 0xe6, 0x98, 0x0b, 0x88, 0x46, 0xa3, 0x36, 0x52, 0x6d, 0xf5, 0xbc, + 0xe2, 0x9f, 0xa9, 0x38, 0x50, 0xeb, 0x3d, 0x39, 0x66, 0x7b, 0xca, 0xea, 0x6a, 0x93, 0x4a, 0x03, 0xb4, 0xbe, 0x4c, + 0xf0, 0xb5, 0x0e, 0xb5, 0x04, 0x72, 0x56, 0xc0, 0x67, 0x96, 0x56, 0x97, 0xd9, 0x3d, 0xe7, 0xf8, 0xbd, 0x78, 0xf7, + 0xa0, 0x33, 0xee, 0x36, 0xdf, 0x6d, 0x06, 0x3b, 0x2b, 0x91, 0xdf, 0x0f, 0x1c, 0xb0, 0xf5, 0xce, 0xf1, 0xb2, 0x16, + 0x78, 0xbf, 0x85, 0x41, 0x00, 0xf2, 0x7e, 0x81, 0x5d, 0xd2, 0x38, 0x0d, 0xf3, 0x95, 0xb6, 0x94, 0xc6, 0xb8, 0x72, + 0xfc, 0x94, 0x33, 0xff, 0x3f, 0xd4, 0x58, 0x19, 0xc7, 0x4f, 0x6c, 0x80, 0x76, 0x15, 0x20, 0xc9, 0x01, 0xd1, 0xc1, + 0x93, 0x16, 0x8f, 0xdf, 0x08, 0x0a, 0xfd, 0x6f, 0xae, 0xf9, 0xf5, 0x86, 0x41, 0x6c, 0x7b, 0x84, 0xf0, 0x0b, 0x6d, + 0xd8, 0xfc, 0x4d, 0x67, 0xcd, 0x25, 0x44, 0x72, 0xfd, 0x1d, 0x29, 0xa9, 0xab, 0xe7, 0x91, 0xfb, 0x93, 0x06, 0xc0, + 0xa4, 0xb2, 0xfa, 0x3a, 0xed, 0xf9, 0xc2, 0xeb, 0x79, 0x07, 0xb1, 0x19, 0xc7, 0xef, 0x8e, 0x98, 0xf8, 0x50, 0x54, + 0xd5, 0x59, 0xd4, 0xb4, 0x3a, 0xf6, 0xd6, 0x49, 0x07, 0x3a, 0x71, 0x41, 0xf0, 0x18, 0xbf, 0x04, 0xfb, 0x79, 0xf3, + 0x43, 0x42, 0x1d, 0xbf, 0xeb, 0x87, 0xe4, 0x7a, 0x37, 0x85, 0x07, 0x76, 0xc0, 0xf7, 0xf0, 0xc1, 0xda, 0x44, 0xd3, + 0xb9, 0x10, 0x1f, 0x42, 0x52, 0x11, 0x90, 0xf5, 0x24, 0x4e, 0x6e, 0x4a, 0x92, 0x60, 0xc3, 0x5e, 0xd6, 0xb6, 0x82, + 0xc3, 0xb9, 0x76, 0x87, 0x22, 0x9c, 0x46, 0x07, 0xdd, 0x0c, 0x8f, 0x38, 0xe3, 0xa4, 0x6e, 0x65, 0xea, 0xb3, 0x6d, + 0x10, 0x89, 0x91, 0x70, 0x05, 0x04, 0x9f, 0x08, 0x1e, 0x8c, 0x98, 0x1a, 0x20, 0xa9, 0x08, 0x70, 0xfd, 0xb0, 0x8d, + 0x50, 0x76, 0x3f, 0xe5, 0x27, 0x7c, 0x12, 0x43, 0x0e, 0x39, 0xac, 0xc3, 0xf3, 0xe7, 0x70, 0xd1, 0x50, 0x2c, 0xce, + 0x1c, 0x67, 0x5e, 0x94, 0xd5, 0xb4, 0x50, 0x9c, 0x58, 0xf9, 0x82, 0x07, 0x5c, 0x6f, 0xc0, 0xbc, 0x9d, 0x0a, 0x76, + 0xc6, 0x33, 0x5e, 0x61, 0x4a, 0x4c, 0x6f, 0x77, 0xce, 0x2b, 0x5d, 0xb9, 0x55, 0x14, 0xaf, 0x1a, 0xb4, 0x67, 0x46, + 0x5c, 0xf8, 0x3b, 0xad, 0x8d, 0x6e, 0xd9, 0xa5, 0x71, 0xf8, 0x37, 0x4a, 0x24, 0x04, 0x9b, 0x9f, 0x78, 0xe3, 0x3d, + 0xb4, 0x6b, 0xdf, 0x05, 0x87, 0x59, 0x7e, 0xfb, 0x1a, 0xfd, 0xe9, 0x4d, 0xcf, 0xb0, 0x28, 0xbd, 0x9f, 0x99, 0x83, + 0xea, 0x40, 0x56, 0x57, 0x87, 0x03, 0x0c, 0xda, 0xe1, 0x8e, 0x57, 0x90, 0x6e, 0xc5, 0x2c, 0x43, 0xa4, 0x33, 0x19, + 0xfd, 0xdd, 0x8b, 0x79, 0xc1, 0x3a, 0x04, 0x66, 0x1f, 0x0d, 0x73, 0x02, 0x17, 0xab, 0x0c, 0x0a, 0xa1, 0x0a, 0x21, + 0x7c, 0x1c, 0xe6, 0x8a, 0x9c, 0x06, 0x52, 0xe1, 0x8a, 0x9c, 0xfa, 0xa4, 0x83, 0x72, 0x1d, 0x3a, 0x5f, 0xad, 0x71, + 0x3c, 0xc5, 0x84, 0xbe, 0x18, 0x78, 0xa8, 0xaf, 0xd8, 0x2c, 0x3e, 0xf7, 0x42, 0x64, 0xfd, 0x0d, 0x98, 0xdc, 0xe0, + 0x65, 0x75, 0x9f, 0x85, 0x10, 0xb3, 0x70, 0x99, 0x19, 0xa9, 0x5f, 0x8a, 0x5a, 0x4f, 0xa3, 0x11, 0xa0, 0xd6, 0x3c, + 0xa0, 0x55, 0xcb, 0x10, 0x61, 0xfc, 0x25, 0xb4, 0xf4, 0x7b, 0xed, 0xe0, 0x86, 0x5f, 0xc5, 0x34, 0x1c, 0xc3, 0xfc, + 0x47, 0x11, 0x7a, 0x88, 0x01, 0x97, 0x71, 0x4d, 0xad, 0x5c, 0x8d, 0x06, 0xb9, 0x62, 0x7c, 0x01, 0x90, 0x32, 0x18, + 0x60, 0xac, 0x59, 0x28, 0x9e, 0x7f, 0xc7, 0x1f, 0x82, 0x08, 0xf5, 0x6a, 0x1f, 0xfb, 0xd1, 0x0d, 0x31, 0xa6, 0x36, + 0x3e, 0x26, 0x38, 0xf8, 0xd8, 0x5a, 0x69, 0xdf, 0x74, 0x95, 0x35, 0xc2, 0x09, 0xb4, 0xe0, 0xca, 0x3c, 0x88, 0x0f, + 0xa7, 0x36, 0xff, 0x2f, 0xc5, 0xaa, 0x1e, 0xbb, 0xfb, 0xfb, 0x23, 0x5c, 0x0f, 0x9d, 0x72, 0x90, 0x57, 0xb8, 0x00, + 0x2e, 0xbb, 0xea, 0x9c, 0x57, 0xbe, 0xb2, 0x4c, 0xfe, 0x16, 0x0e, 0x96, 0x0f, 0xca, 0x71, 0x3a, 0xfd, 0xcb, 0xb5, + 0x8b, 0xa3, 0x3d, 0x98, 0x4f, 0xd3, 0x30, 0xfe, 0x49, 0x2c, 0x7d, 0x5e, 0xd0, 0xd9, 0x6f, 0x48, 0x1b, 0x3f, 0x2e, + 0xb2, 0x7d, 0xe8, 0xba, 0x3c, 0x7f, 0x8d, 0xb7, 0xe7, 0x76, 0x4d, 0x9b, 0xce, 0xf7, 0x3f, 0xa5, 0xb3, 0x71, 0xcf, + 0xf8, 0x6f, 0xf4, 0x44, 0x27, 0xdf, 0x18, 0x7f, 0x48, 0x6b, 0xe3, 0xd3, 0x20, 0xbe, 0x6c, 0x0b, 0xb2, 0x87, 0x73, + 0x78, 0x1a, 0xce, 0x17, 0x94, 0x5f, 0x64, 0x71, 0xd1, 0x9f, 0xbe, 0xc6, 0x8b, 0x73, 0xcf, 0xcb, 0xb5, 0xd6, 0x7c, + 0x6a, 0x6d, 0xc0, 0xd6, 0x02, 0xe7, 0x46, 0xed, 0x96, 0x49, 0xaa, 0x56, 0xde, 0x88, 0xe9, 0x6c, 0x1a, 0x51, 0x07, + 0xfb, 0x7d, 0x7b, 0xdc, 0xf1, 0x40, 0xff, 0xb3, 0x79, 0x5d, 0x71, 0x6d, 0xd5, 0x4d, 0x77, 0x56, 0xe0, 0x0d, 0x93, + 0xa5, 0x23, 0x3c, 0x2b, 0x88, 0x34, 0xd2, 0x07, 0xa4, 0x65, 0x6d, 0xdb, 0x12, 0x43, 0xbb, 0x59, 0xc9, 0x34, 0x71, + 0x5b, 0x33, 0x5c, 0xe2, 0x4c, 0x08, 0x10, 0x49, 0xa6, 0x18, 0xba, 0xd6, 0x0c, 0x90, 0xde, 0x41, 0x49, 0x88, 0x65, + 0xbf, 0x04, 0x8a, 0x25, 0x83, 0x4f, 0xff, 0x61, 0x45, 0x4c, 0x8e, 0x37, 0x74, 0x70, 0x2a, 0x68, 0xf6, 0xd8, 0x8e, + 0xb9, 0x08, 0xc2, 0x97, 0x28, 0xf4, 0x4c, 0x63, 0x27, 0x57, 0x6d, 0x8e, 0x9e, 0xd8, 0x09, 0x6b, 0x1a, 0x05, 0x55, + 0xbb, 0xdf, 0xde, 0x2a, 0x15, 0x37, 0x57, 0x9c, 0xcf, 0x60, 0x8c, 0x27, 0x1d, 0x41, 0xe4, 0xcf, 0xfe, 0x02, 0xca, + 0xd0, 0x25, 0x8c, 0xb2, 0x65, 0xde, 0x8f, 0x26, 0xb7, 0x52, 0xc7, 0x92, 0xd0, 0xd4, 0xf5, 0xea, 0x8a, 0x54, 0xe1, + 0xfe, 0x2e, 0xfc, 0xb3, 0x06, 0x71, 0x87, 0x38, 0x87, 0x64, 0x01, 0x51, 0x3d, 0x63, 0x25, 0xc5, 0x20, 0x66, 0x36, + 0x28, 0x61, 0x4a, 0x9f, 0xb4, 0xda, 0x6a, 0x9d, 0x1c, 0x7b, 0x5c, 0xae, 0xea, 0x42, 0xd6, 0x2d, 0x7f, 0xa4, 0x45, + 0x22, 0x2d, 0x70, 0x85, 0xef, 0x2c, 0x00, 0x5d, 0x09, 0xe0, 0x29, 0x04, 0x72, 0x98, 0x84, 0xbf, 0x95, 0x55, 0xf4, + 0xe0, 0xfe, 0x6d, 0x98, 0x5b, 0x8e, 0x40, 0xc2, 0x87, 0xb9, 0x69, 0x8d, 0x3a, 0x8d, 0x4c, 0x6b, 0xd8, 0xba, 0x04, + 0xe2, 0x24, 0x41, 0x0b, 0x35, 0xf6, 0x71, 0x28, 0x1c, 0x7a, 0x1e, 0xb9, 0x49, 0xae, 0xe5, 0xca, 0x97, 0xa2, 0x39, + 0x89, 0x3d, 0x52, 0xd1, 0xb1, 0x9f, 0x91, 0xe3, 0xbc, 0x10, 0xe4, 0xe2, 0x48, 0x9a, 0x9e, 0x6a, 0x92, 0x43, 0x9b, + 0x0c, 0x2a, 0x94, 0xdb, 0x2c, 0x68, 0x73, 0x1b, 0xb1, 0xbf, 0x8e, 0x88, 0x0b, 0x1b, 0x40, 0x22, 0x9c, 0x5c, 0x55, + 0xfd, 0x2d, 0xb9, 0xbe, 0x6e, 0x7c, 0x55, 0x0b, 0x19, 0x0f, 0x28, 0x19, 0x4e, 0xea, 0xed, 0x19, 0x0a, 0xc3, 0xc5, + 0xfc, 0xb4, 0xbe, 0xb0, 0xd6, 0xd4, 0x6e, 0xa5, 0x48, 0x0a, 0x43, 0x9a, 0xf2, 0x44, 0xe2, 0x87, 0x65, 0x77, 0xb1, + 0x49, 0xc5, 0x8a, 0xc0, 0xfb, 0x9c, 0xf9, 0x73, 0xe1, 0xd4, 0x1a, 0xff, 0x21, 0xc0, 0xad, 0x39, 0x38, 0xa8, 0xbf, + 0x8b, 0xdc, 0x64, 0xab, 0x1e, 0x38, 0x4d, 0x7e, 0x74, 0x45, 0x3f, 0x8b, 0x62, 0xdc, 0x83, 0x41, 0x9e, 0xb3, 0x46, + 0x1c, 0x27, 0x5e, 0xa1, 0xc8, 0xa6, 0x12, 0xba, 0xdb, 0x75, 0xa6, 0x88, 0xeb, 0x90, 0xa3, 0x19, 0x72, 0x72, 0x38, + 0x4e, 0x5a, 0xcd, 0xa3, 0xb2, 0x49, 0x12, 0x9e, 0xe2, 0x47, 0xee, 0x13, 0x8a, 0x5d, 0x9f, 0x85, 0x32, 0x23, 0xce, + 0x19, 0x67, 0xdb, 0x0b, 0xae, 0xd1, 0x5b, 0x73, 0x90, 0x8e, 0x1d, 0xf6, 0xfc, 0x89, 0x22, 0x4c, 0x21, 0x65, 0xa7, + 0x26, 0x6d, 0xd2, 0x55, 0x97, 0x71, 0x9f, 0x0e, 0x75, 0x1c, 0x52, 0x3d, 0x3b, 0x1c, 0xea, 0xa5, 0x2d, 0x4f, 0x1c, + 0xe2, 0xca, 0x87, 0xfe, 0x38, 0xf2, 0xeb, 0xc2, 0x7a, 0x51, 0xc8, 0xf8, 0xa4, 0xd0, 0x49, 0x4b, 0x95, 0x78, 0x00, + 0xb7, 0x95, 0x4d, 0x6f, 0xcb, 0xd4, 0xda, 0xd0, 0x71, 0xe9, 0x6f, 0x02, 0xa4, 0x90, 0xc5, 0xa9, 0x5c, 0x0a, 0xe5, + 0x9a, 0xf1, 0xe2, 0xb0, 0xe2, 0xf6, 0xd5, 0x7d, 0xda, 0x57, 0x14, 0x1d, 0x20, 0x10, 0x11, 0x5a, 0x01, 0xc2, 0x17, + 0x26, 0x70, 0x75, 0x95, 0xa5, 0xb0, 0x8e, 0x09, 0xc1, 0x53, 0xf8, 0x46, 0x6a, 0xa5, 0x55, 0x46, 0xc4, 0x05, 0xdb, + 0x8d, 0x50, 0xf6, 0x00, 0x1a, 0x10, 0xc3, 0x49, 0xfc, 0x2f, 0x4f, 0x55, 0xcb, 0xb4, 0x5b, 0xc9, 0xa5, 0x91, 0x76, + 0xa3, 0x2d, 0xde, 0x98, 0x56, 0x14, 0x14, 0x13, 0x92, 0xbe, 0xd2, 0xa0, 0xd5, 0xb1, 0xf5, 0x9b, 0xbd, 0x5e, 0xbc, + 0x3a, 0xbe, 0xe3, 0xe4, 0x60, 0x94, 0x63, 0xc9, 0x20, 0x53, 0x11, 0xca, 0xc5, 0x45, 0xd8, 0x7a, 0xd8, 0xd9, 0x16, + 0xda, 0x69, 0xd0, 0x71, 0xb7, 0x82, 0x1a, 0x84, 0xf9, 0xd0, 0x73, 0xa7, 0xdb, 0x3e, 0x5d, 0x19, 0xb7, 0x8b, 0x78, + 0x95, 0xe3, 0x54, 0x55, 0x09, 0xa4, 0x64, 0xf3, 0x31, 0x48, 0x95, 0x24, 0x47, 0xa6, 0x0a, 0xeb, 0x1e, 0x6c, 0xef, + 0x98, 0x30, 0x09, 0x79, 0xe4, 0x7d, 0xf8, 0x27, 0x84, 0x5a, 0x8a, 0x7e, 0xdb, 0xf6, 0x6d, 0xc9, 0xe1, 0x95, 0xa3, + 0x55, 0x83, 0x80, 0xd8, 0x88, 0x00, 0x35, 0x8f, 0x8f, 0xf6, 0x26, 0x6e, 0xbd, 0xa3, 0x72, 0x37, 0x35, 0x7e, 0xcf, + 0x56, 0x76, 0x1e, 0xf9, 0x1d, 0xaf, 0xec, 0xe3, 0x42, 0x15, 0xec, 0x92, 0x12, 0x3d, 0xc9, 0xfa, 0xf1, 0xca, 0xa6, + 0x35, 0xfb, 0x79, 0x7d, 0x41, 0xc8, 0xe6, 0x55, 0xf6, 0xc8, 0xab, 0x42, 0xbd, 0x18, 0x09, 0x63, 0xaa, 0x43, 0x78, + 0xe3, 0xc8, 0xd8, 0x9f, 0x17, 0x32, 0x8d, 0x81, 0x05, 0x28, 0xb4, 0xd4, 0xbb, 0x11, 0x4f, 0x8f, 0x65, 0x56, 0xa4, + 0x75, 0x27, 0x5c, 0xc5, 0x7a, 0x09, 0x3f, 0xba, 0x0d, 0x58, 0x58, 0x29, 0xdd, 0x22, 0x97, 0x77, 0x75, 0x91, 0xf5, + 0xd9, 0x6b, 0x13, 0x43, 0xef, 0x92, 0x42, 0x85, 0xb2, 0x63, 0xca, 0x8a, 0xf9, 0x0a, 0x69, 0x8e, 0x05, 0x6f, 0x42, + 0xfd, 0xbc, 0x2d, 0x7f, 0x87, 0x2a, 0x16, 0x7f, 0x5d, 0xd1, 0x5b, 0xa7, 0x6a, 0xb6, 0xcf, 0x14, 0x33, 0x65, 0x3b, + 0x17, 0xee, 0x8b, 0xfb, 0x8d, 0x6f, 0x88, 0xa7, 0x62, 0xd5, 0x77, 0x45, 0x71, 0xe4, 0xa0, 0xc9, 0x20, 0xaa, 0x93, + 0xb5, 0x10, 0x77, 0x5d, 0x19, 0x92, 0x70, 0xe7, 0x09, 0x33, 0x48, 0xe7, 0xb0, 0x71, 0x55, 0x23, 0xd3, 0xa0, 0xe6, + 0x40, 0x9d, 0x54, 0x83, 0x15, 0xb4, 0x42, 0x52, 0xf6, 0x14, 0x33, 0x51, 0x07, 0xee, 0xf7, 0x9a, 0xfd, 0x3f, 0xa0, + 0x12, 0x7d, 0xdd, 0xf5, 0x57, 0x7d, 0x0b, 0xe7, 0x82, 0x05, 0x4b, 0x2a, 0xfb, 0x72, 0x5b, 0x6f, 0xfc, 0x29, 0x6c, + 0xea, 0xd4, 0xad, 0xbb, 0x5d, 0xea, 0x72, 0x9a, 0x0d, 0xce, 0x3b, 0x47, 0x31, 0x77, 0x0a, 0x1f, 0x62, 0x2e, 0x2f, + 0xd9, 0x44, 0x25, 0x57, 0x71, 0xe2, 0x45, 0x0d, 0x00, 0xf3, 0x0e, 0x90, 0x9c, 0x29, 0x61, 0x94, 0xf8, 0x73, 0x52, + 0x01, 0xd5, 0x94, 0xae, 0xb3, 0xb3, 0xee, 0x17, 0x7b, 0xfe, 0x8a, 0xbc, 0xbe, 0x72, 0x0c, 0xea, 0xe6, 0xbc, 0x20, + 0xa7, 0x98, 0x5f, 0x34, 0x25, 0x63, 0x4f, 0xb7, 0xad, 0xaa, 0x93, 0xb5, 0xcb, 0x8b, 0xda, 0x44, 0x89, 0x74, 0xc9, + 0x0d, 0x2f, 0xf5, 0xb6, 0xbc, 0x66, 0xcb, 0x93, 0x75, 0x7a, 0x2a, 0xd6, 0xd8, 0xbe, 0x08, 0x63, 0x7d, 0x18, 0x5d, + 0xe9, 0x49, 0x07, 0x39, 0x2d, 0x4b, 0x4b, 0xb9, 0x8b, 0x9c, 0x5b, 0xba, 0x5d, 0x3a, 0xcc, 0x8f, 0x19, 0x6b, 0x6f, + 0x8d, 0x8d, 0xad, 0xe5, 0xe6, 0xbf, 0xae, 0x6c, 0xc3, 0x54, 0xa1, 0x68, 0x01, 0x4c, 0xcf, 0x26, 0x87, 0xf5, 0x01, + 0x35, 0x53, 0x6f, 0x51, 0xbb, 0xe2, 0xf5, 0x4e, 0xf4, 0xbc, 0xfb, 0x0e, 0x6a, 0x86, 0x5a, 0x8f, 0x92, 0x68, 0xa9, + 0x7d, 0xef, 0x5b, 0x4a, 0x5b, 0xe6, 0xb1, 0xf2, 0xa2, 0xd4, 0x43, 0xfd, 0xea, 0x8f, 0xd3, 0xda, 0xb8, 0x27, 0xbc, + 0x65, 0xa3, 0xae, 0xe2, 0x63, 0x9f, 0xe7, 0xc2, 0xcc, 0x2c, 0x3e, 0x97, 0xd6, 0x83, 0x5f, 0x4e, 0xbb, 0x99, 0x39, + 0x3d, 0xbe, 0xa7, 0x83, 0xc4, 0x5c, 0x7a, 0x2f, 0x43, 0xa0, 0x68, 0x85, 0x66, 0x1d, 0x35, 0xcc, 0x79, 0x9f, 0x3a, + 0xc6, 0xcf, 0x7b, 0x4c, 0xc9, 0x1d, 0x3f, 0xe3, 0xf5, 0xd0, 0xa6, 0x9f, 0x3e, 0x66, 0xce, 0x87, 0x89, 0xf0, 0x6a, + 0x57, 0xa3, 0x13, 0x56, 0xe0, 0xeb, 0xa5, 0xc7, 0xc9, 0xa7, 0xbd, 0xaa, 0x5a, 0x5a, 0xdf, 0x7f, 0x6b, 0x62, 0x80, + 0xa9, 0x52, 0x7e, 0x45, 0xfb, 0xb9, 0xc6, 0x62, 0x86, 0x97, 0x74, 0xd9, 0xcb, 0x00}; // Backwards compatibility alias #define INDEX_GZ INDEX_BR diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h index 1f61b19fb5..b7c15df32b 100644 --- a/esphome/components/web_server/server_index_v3.h +++ b/esphome/components/web_server/server_index_v3.h @@ -9,7 +9,7 @@ namespace esphome::web_server { #ifdef USE_WEBSERVER_GZIP -constexpr uint8_t INDEX_GZ[] PROGMEM = { +const uint8_t INDEX_GZ[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, 0xbd, 0x7b, 0x7f, 0x1a, 0xb9, 0xb2, 0x28, 0xfa, 0xf7, 0x3d, 0x9f, 0xc2, 0xee, 0x9d, 0xf1, 0xb4, 0x8c, 0x68, 0x03, 0x36, 0x8e, 0xd3, 0x58, 0xe6, 0xe4, 0x39, 0xc9, 0x3c, 0x92, 0x4c, 0x9c, 0x64, 0x26, 0xc3, 0xb0, 0x33, 0xa2, 0x11, 0xa0, 0xa4, 0x91, 0x98, 0x96, 0x88, 0xed, 0x01, @@ -3634,58 +3634,58 @@ constexpr uint8_t INDEX_GZ[] PROGMEM = { 0x36, 0x16, 0x43, 0x14, 0xa2, 0x85, 0xb1, 0x9f, 0x44, 0x7a, 0x6a, 0xf7, 0x8b, 0xa8, 0x63, 0x84, 0xe7, 0x2e, 0x8e, 0x40, 0xbb, 0x60, 0xb2, 0xd8, 0xed, 0x3a, 0x06, 0xb0, 0x93, 0x12, 0x46, 0xf3, 0x4c, 0x91, 0xc8, 0x45, 0x3d, 0x95, 0x78, 0xf0, 0xa9, 0x53, 0x8d, 0x99, 0x83, 0xf0, 0x54, 0x31, 0xd4, 0xc0, 0xc7, 0x7a, 0xaf, 0x4d, 0xc8, 0x99, 0xff, - 0xaf, 0xbd, 0x67, 0x5b, 0x6e, 0xdb, 0x48, 0xf6, 0x3d, 0x5f, 0x01, 0xc1, 0x5e, 0x1b, 0xb0, 0x01, 0x08, 0x20, 0x75, - 0xa1, 0x49, 0x81, 0x4a, 0x6c, 0xcb, 0x49, 0x76, 0x95, 0x38, 0x65, 0x2b, 0xde, 0x8b, 0x56, 0x25, 0x82, 0xe4, 0x90, - 0xc4, 0x1a, 0x04, 0x58, 0x00, 0x28, 0x4a, 0xa1, 0xb1, 0xdf, 0xb2, 0x9f, 0x70, 0xbe, 0x61, 0xbf, 0xec, 0x54, 0x77, - 0xcf, 0x00, 0x83, 0x0b, 0x29, 0x2a, 0x76, 0xb2, 0x7b, 0xaa, 0x4e, 0x25, 0xb6, 0x89, 0xc1, 0xcc, 0xa0, 0xe7, 0xd6, - 0xdd, 0xd3, 0xd7, 0x32, 0xa5, 0xb4, 0x2b, 0xf8, 0x57, 0x58, 0x21, 0x57, 0x4a, 0x69, 0xcb, 0x81, 0x98, 0xd3, 0xed, - 0xe3, 0xaa, 0x81, 0x55, 0xa1, 0xb8, 0x27, 0x83, 0x99, 0x60, 0x65, 0xd7, 0x89, 0x79, 0x98, 0x75, 0x69, 0xc3, 0x1b, - 0x81, 0x0b, 0xa6, 0x87, 0x1b, 0x6a, 0x8d, 0xbb, 0x5e, 0x29, 0x14, 0x66, 0x5c, 0x9e, 0xd4, 0x13, 0xaf, 0xfc, 0x0c, - 0x5b, 0xba, 0x52, 0x05, 0x7c, 0x63, 0x2a, 0x95, 0x40, 0x0a, 0x16, 0x9c, 0xd2, 0xe7, 0xad, 0x34, 0x3a, 0x8f, 0x56, - 0x42, 0x70, 0x7c, 0xe2, 0x35, 0x14, 0xe2, 0x39, 0xe9, 0x8e, 0x4e, 0x02, 0xfa, 0xe1, 0x64, 0x1b, 0x28, 0x40, 0x56, - 0x4c, 0x70, 0xce, 0xb6, 0x0e, 0xe8, 0x32, 0x75, 0xfd, 0x78, 0x2d, 0xb6, 0x5c, 0x36, 0xf0, 0xf3, 0xb4, 0xb0, 0x25, - 0x96, 0x23, 0xe3, 0x53, 0x2f, 0x47, 0x21, 0x6d, 0xa8, 0xc6, 0xf7, 0x87, 0xeb, 0x37, 0xf2, 0x2d, 0x16, 0x3d, 0x32, - 0xa2, 0xe9, 0xcd, 0x55, 0xd8, 0x2d, 0x1b, 0x69, 0x4d, 0x80, 0x91, 0xe0, 0x49, 0x0c, 0x01, 0x03, 0x33, 0x23, 0xea, - 0xff, 0x36, 0xae, 0xa2, 0x7e, 0xb4, 0xbf, 0xcb, 0x91, 0xff, 0x4f, 0x6f, 0xdf, 0x5f, 0x80, 0x5e, 0xcb, 0x43, 0x45, - 0xf4, 0x5a, 0xe5, 0x36, 0x2c, 0x26, 0x68, 0x8a, 0xd4, 0xae, 0xea, 0x2d, 0x80, 0x3a, 0xe3, 0x8d, 0x61, 0xff, 0xd6, - 0x5c, 0xad, 0x56, 0x26, 0x58, 0xb4, 0x9a, 0xcb, 0x38, 0x20, 0xee, 0x70, 0xac, 0x66, 0x02, 0xa9, 0xb3, 0x0a, 0x52, - 0x87, 0x70, 0xb8, 0x3c, 0x9f, 0xca, 0xfb, 0x59, 0xb4, 0xfa, 0x26, 0x08, 0x64, 0xb1, 0x8d, 0x60, 0xe2, 0xb8, 0x24, - 0xa3, 0x84, 0x0c, 0x34, 0xd0, 0x3e, 0x59, 0x7e, 0x72, 0xcd, 0xed, 0x05, 0xc6, 0xd7, 0xc3, 0xbb, 0x6b, 0xae, 0x93, - 0xc8, 0xe3, 0x11, 0xbf, 0x1f, 0x9c, 0x8c, 0xfd, 0x1b, 0x05, 0x39, 0x4d, 0x57, 0x05, 0x67, 0xae, 0x80, 0x0d, 0x97, - 0x69, 0x1a, 0x85, 0x66, 0x1c, 0xad, 0xd4, 0xfe, 0x09, 0x3d, 0x88, 0x0a, 0x1e, 0x3d, 0xaa, 0xca, 0xd7, 0xa3, 0xc0, - 0x1f, 0x7d, 0x74, 0xd5, 0xc7, 0x6b, 0xdf, 0xed, 0x57, 0xf8, 0x49, 0x3b, 0x53, 0xfb, 0x00, 0xab, 0xf2, 0x4d, 0x10, - 0x9c, 0xec, 0x53, 0x8b, 0xfe, 0xc9, 0xfe, 0xd8, 0xbf, 0xe9, 0x4b, 0xa9, 0x61, 0xb8, 0xde, 0xd4, 0xe5, 0x21, 0x38, - 0x73, 0x4b, 0xb3, 0x04, 0x63, 0x3a, 0x8c, 0x98, 0x56, 0x5c, 0x7e, 0x21, 0xd6, 0x0c, 0xc1, 0xab, 0x8d, 0x50, 0x9c, - 0x1e, 0xc0, 0x55, 0xef, 0xd3, 0x27, 0x2d, 0xb7, 0x43, 0x9d, 0x49, 0x41, 0xda, 0x50, 0xcd, 0x87, 0x55, 0x0c, 0x8c, - 0x34, 0xa3, 0x6b, 0x22, 0x94, 0x5c, 0xa0, 0x1b, 0xa3, 0xcc, 0xc0, 0x0c, 0x3b, 0xde, 0x02, 0x34, 0x8e, 0xfc, 0xa7, - 0x74, 0x23, 0x1e, 0x41, 0x56, 0x6d, 0x09, 0x89, 0xeb, 0x92, 0xce, 0x85, 0x4e, 0x21, 0x8f, 0x13, 0x08, 0xca, 0x12, - 0xfc, 0x0e, 0xe9, 0x41, 0xb4, 0x40, 0x87, 0xac, 0x6e, 0x79, 0x70, 0x1e, 0x2f, 0x13, 0x79, 0xd4, 0xc4, 0xbc, 0x9c, - 0x96, 0x56, 0xa8, 0x5b, 0x5d, 0x2f, 0x11, 0x35, 0x72, 0x2f, 0xd9, 0xb4, 0x64, 0xa0, 0xc3, 0xd3, 0x52, 0xa3, 0x42, - 0x73, 0xc1, 0xab, 0x4f, 0x52, 0x1c, 0x31, 0x43, 0xbb, 0x4c, 0x8c, 0xe8, 0xaa, 0xa0, 0x53, 0x09, 0x21, 0xca, 0x6e, - 0x94, 0x15, 0x01, 0x9c, 0x69, 0xd5, 0xfb, 0x8f, 0xd7, 0x21, 0x12, 0xb6, 0xc4, 0xed, 0x97, 0xf7, 0x41, 0xea, 0x0d, - 0x4d, 0xda, 0xcc, 0xaa, 0xf2, 0xf5, 0x78, 0x18, 0xe4, 0x8b, 0x4d, 0x87, 0x60, 0xe6, 0x85, 0xe3, 0x80, 0x5d, 0x78, - 0xc3, 0xef, 0xb0, 0xce, 0xeb, 0x61, 0xf0, 0x0a, 0x2a, 0x64, 0x6a, 0xff, 0xf1, 0x9a, 0x48, 0x77, 0x13, 0xc2, 0xce, - 0x68, 0x0b, 0x54, 0xbf, 0xc3, 0x53, 0x2e, 0xb1, 0x98, 0x5a, 0x23, 0xb0, 0x44, 0x6e, 0x29, 0x8e, 0x6d, 0x19, 0x32, - 0x9e, 0xf2, 0x07, 0xf6, 0xa6, 0xc2, 0x4f, 0x2d, 0xc0, 0x15, 0x89, 0x13, 0x2c, 0xef, 0x4c, 0x19, 0x58, 0x22, 0xab, - 0xef, 0xa2, 0x95, 0x80, 0x94, 0x4f, 0x00, 0x85, 0xa8, 0x3c, 0x7d, 0x3f, 0x38, 0x91, 0xd5, 0x42, 0x28, 0x3b, 0xa7, - 0x7e, 0xe1, 0x57, 0xa6, 0x2a, 0x45, 0x02, 0xa8, 0xc5, 0xad, 0xda, 0x3f, 0xd9, 0x97, 0x6b, 0xf7, 0x07, 0xdd, 0x33, - 0x69, 0x70, 0xd8, 0xab, 0xb8, 0x37, 0x5f, 0x16, 0x0f, 0xd9, 0x95, 0x02, 0xb7, 0xe4, 0x0c, 0x4a, 0x60, 0x8e, 0xca, - 0x4d, 0x6a, 0xe4, 0x07, 0x52, 0x26, 0x16, 0x04, 0x8a, 0x76, 0x8f, 0xc0, 0x8f, 0x91, 0xde, 0xcd, 0x97, 0x90, 0x2c, - 0x33, 0x45, 0x6f, 0x03, 0xfe, 0x6f, 0x31, 0x25, 0x28, 0xe9, 0x66, 0x61, 0x12, 0xc5, 0x2a, 0x0c, 0xb3, 0x9a, 0x37, - 0x49, 0x91, 0xf2, 0xb5, 0xe1, 0x80, 0x1b, 0xc9, 0x2a, 0x4c, 0xd8, 0x7e, 0xb5, 0xa9, 0x34, 0xee, 0x81, 0x5e, 0xfc, - 0x50, 0xf8, 0x60, 0x2a, 0x48, 0x2b, 0x07, 0x70, 0x73, 0x3e, 0xaa, 0xcb, 0xc7, 0xbe, 0xf1, 0xe7, 0xc8, 0x18, 0x7a, - 0xc6, 0xb5, 0x67, 0xfc, 0x10, 0x5e, 0x65, 0x8d, 0x8b, 0x97, 0xe7, 0x92, 0x33, 0x58, 0x4f, 0x83, 0x08, 0x4c, 0xe5, - 0x4b, 0x85, 0x6f, 0x71, 0x9b, 0x91, 0x0b, 0x2f, 0x9e, 0x32, 0x91, 0xc2, 0x4d, 0xbc, 0x15, 0xb2, 0x03, 0x5d, 0x9a, - 0x16, 0x08, 0x4f, 0xb6, 0xc7, 0x4d, 0xeb, 0x7c, 0x6b, 0x94, 0xc6, 0xc1, 0x9f, 0xd8, 0x1d, 0xb0, 0x59, 0x49, 0x1a, - 0x2d, 0x40, 0x66, 0xe5, 0x4d, 0xb9, 0x0e, 0xc2, 0xd0, 0xd8, 0x6e, 0x9f, 0xfb, 0xf4, 0x89, 0x49, 0x59, 0xc5, 0xd2, - 0x68, 0x3a, 0x0d, 0x98, 0x26, 0x65, 0x1f, 0xcb, 0x3f, 0x73, 0xba, 0x67, 0x8b, 0xc8, 0xd5, 0x7a, 0xb6, 0xe9, 0x60, + 0xaf, 0xbd, 0xa7, 0xdd, 0x6e, 0x13, 0x49, 0xf6, 0xff, 0x3c, 0x05, 0x26, 0xd9, 0x04, 0x12, 0xc0, 0x20, 0xf9, 0x43, + 0x91, 0x8c, 0x3c, 0x93, 0xc4, 0x99, 0x8f, 0xf5, 0x4c, 0xe6, 0x24, 0x9e, 0xec, 0xbd, 0xeb, 0xf5, 0xb1, 0x90, 0xd4, + 0x92, 0xd8, 0x20, 0xd0, 0x01, 0x64, 0xd9, 0xa3, 0xb0, 0xcf, 0xb2, 0x8f, 0x70, 0x9f, 0x61, 0x9f, 0xec, 0x9e, 0xaa, + 0xea, 0x86, 0x06, 0x81, 0x2c, 0x4f, 0x32, 0xb3, 0x7b, 0xcf, 0xb9, 0x67, 0x26, 0x89, 0x68, 0xba, 0x9b, 0xea, 0xaf, + 0xaa, 0xea, 0xfa, 0x2c, 0x53, 0x4a, 0xbb, 0x82, 0x7f, 0x85, 0x15, 0x72, 0xa5, 0x94, 0xb6, 0x1c, 0x88, 0x39, 0xdd, + 0x3e, 0xae, 0x1a, 0x58, 0x15, 0x8a, 0x7b, 0x32, 0x98, 0x09, 0x56, 0x76, 0x9d, 0x98, 0x87, 0x59, 0x97, 0x36, 0xbc, + 0x11, 0xb8, 0x60, 0x7a, 0xd8, 0x50, 0x6b, 0xdc, 0xf5, 0x4a, 0xa1, 0x30, 0xe3, 0xf2, 0xa4, 0x9e, 0x78, 0xe5, 0x67, + 0xd8, 0xd2, 0x95, 0x2a, 0xe0, 0x1b, 0x53, 0xa9, 0x04, 0x52, 0xb0, 0xe0, 0x94, 0x3e, 0x6f, 0xa5, 0xd1, 0x79, 0xb4, + 0x12, 0x82, 0xe3, 0x13, 0xaf, 0xa6, 0x10, 0xcf, 0x49, 0x77, 0x74, 0x12, 0xd0, 0x0f, 0x27, 0x6b, 0xa0, 0x00, 0x59, + 0x31, 0xc1, 0x39, 0xdb, 0x3a, 0xa0, 0xcb, 0xd4, 0xf5, 0xe3, 0xb5, 0xd8, 0x72, 0xd9, 0xc0, 0xcf, 0xd3, 0xc2, 0x96, + 0x58, 0x8e, 0x8c, 0x4f, 0xbd, 0x1c, 0x85, 0xb4, 0xa6, 0x1a, 0xdf, 0x1f, 0xae, 0x5f, 0xcb, 0xb7, 0x58, 0xf4, 0xc8, + 0x88, 0xa6, 0xd7, 0x57, 0x61, 0xb7, 0x6c, 0xa4, 0xd5, 0x01, 0x46, 0x82, 0x27, 0x31, 0x04, 0x0c, 0xcc, 0x8c, 0xa8, + 0xff, 0xdb, 0xb8, 0x8a, 0xfa, 0xd1, 0xfe, 0x2e, 0x47, 0xfe, 0x3f, 0xbf, 0x7d, 0x7f, 0x01, 0x7a, 0x2d, 0x0f, 0x15, + 0xd1, 0x6b, 0x95, 0xdb, 0xb0, 0x98, 0xa0, 0x29, 0x52, 0xbb, 0xaa, 0xb7, 0x00, 0xea, 0x8c, 0x37, 0x86, 0xfd, 0x5b, + 0x73, 0xb5, 0x5a, 0x99, 0x60, 0xd1, 0x6a, 0x2e, 0xe3, 0x80, 0xb8, 0xc3, 0xb1, 0x9a, 0x09, 0xa4, 0xce, 0x2a, 0x48, + 0x1d, 0xc2, 0xe1, 0xf2, 0x7c, 0x2a, 0xef, 0x67, 0xd1, 0xea, 0x9b, 0x20, 0x90, 0xc5, 0x36, 0x82, 0x89, 0xe3, 0x92, + 0x8c, 0x12, 0x32, 0xd0, 0x40, 0xfb, 0x64, 0xf9, 0xc9, 0x35, 0xb7, 0x17, 0x18, 0x5f, 0x0f, 0xef, 0xae, 0xb9, 0x4e, + 0x22, 0x8f, 0x47, 0xfc, 0x7e, 0x70, 0x32, 0xf6, 0x6f, 0x14, 0xe4, 0x34, 0x5d, 0x15, 0x9c, 0xb9, 0x02, 0x36, 0x5c, + 0xa6, 0x69, 0x14, 0x9a, 0x71, 0xb4, 0x52, 0xfb, 0x27, 0xf4, 0x20, 0x2a, 0x78, 0xf4, 0xa8, 0x2a, 0x5f, 0x8f, 0x02, + 0x7f, 0xf4, 0xd1, 0x55, 0x1f, 0xaf, 0x7d, 0xb7, 0x5f, 0xe1, 0x27, 0xed, 0x4c, 0xed, 0x03, 0xac, 0xca, 0x37, 0x41, + 0x70, 0xb2, 0x4f, 0x2d, 0xfa, 0x27, 0xfb, 0x63, 0xff, 0xa6, 0x2f, 0xa5, 0x86, 0xe1, 0x7a, 0x53, 0x97, 0x87, 0xe0, + 0xcc, 0x2d, 0xcd, 0x12, 0x8c, 0xe9, 0x30, 0x62, 0x5a, 0x71, 0xf9, 0x85, 0x58, 0x33, 0x04, 0xaf, 0x36, 0x42, 0x71, + 0x7a, 0x00, 0x57, 0xbd, 0x4f, 0x9f, 0xb4, 0xdc, 0x0e, 0x75, 0x26, 0x05, 0x69, 0x43, 0x35, 0x1f, 0x56, 0x31, 0x30, + 0xd2, 0x8c, 0xae, 0x89, 0x50, 0x72, 0x81, 0x6e, 0x8c, 0x32, 0x03, 0x33, 0xec, 0x78, 0x0b, 0xd0, 0x38, 0xf2, 0x9f, + 0xd2, 0x8d, 0x78, 0x04, 0x59, 0xb5, 0x25, 0x24, 0xae, 0x4b, 0x3a, 0x17, 0x3a, 0x85, 0x3c, 0x4e, 0x20, 0x28, 0x4b, + 0xf0, 0x3b, 0xa4, 0x07, 0xd1, 0x02, 0x1d, 0xb2, 0xba, 0xe5, 0xc1, 0x79, 0xbc, 0x4c, 0xe4, 0x51, 0x13, 0xf3, 0x72, + 0x5a, 0x5a, 0xa1, 0x6e, 0x75, 0xbd, 0x44, 0xd4, 0xc8, 0xbd, 0xa4, 0x69, 0xc9, 0x40, 0x87, 0xa7, 0xa5, 0x46, 0x85, + 0xe6, 0x82, 0x57, 0x9f, 0xa4, 0x38, 0x62, 0x86, 0x76, 0x99, 0x18, 0xd1, 0x55, 0x41, 0xa7, 0x12, 0x42, 0x94, 0xdd, + 0x28, 0x2b, 0x02, 0x38, 0xd3, 0xaa, 0xf7, 0x1f, 0xaf, 0x43, 0x24, 0x6c, 0x89, 0xdb, 0x2f, 0xef, 0x83, 0xd4, 0x1b, + 0x9a, 0xb4, 0x99, 0x55, 0xe5, 0xeb, 0xf1, 0x30, 0xc8, 0x17, 0x9b, 0x0e, 0xc1, 0xcc, 0x0b, 0xc7, 0x01, 0xbb, 0xf0, + 0x86, 0xdf, 0x61, 0x9d, 0xd7, 0xc3, 0xe0, 0x15, 0x54, 0xc8, 0xd4, 0xfe, 0xe3, 0x35, 0x91, 0xee, 0x3a, 0x84, 0x9d, + 0xd1, 0x16, 0xa8, 0x7e, 0x87, 0xa7, 0x5c, 0x62, 0x31, 0xb5, 0x46, 0x60, 0x89, 0xdc, 0x52, 0x1c, 0xdb, 0x32, 0x64, + 0x3c, 0xe5, 0x0f, 0xec, 0x4d, 0x85, 0x9f, 0x5a, 0x80, 0x2b, 0x12, 0x27, 0x58, 0xde, 0x99, 0x32, 0xb0, 0x44, 0x56, + 0xdf, 0x45, 0x2b, 0x01, 0x29, 0x9f, 0x00, 0x0a, 0x51, 0x79, 0xfa, 0x7e, 0x70, 0x22, 0xab, 0x85, 0x50, 0x76, 0x4e, + 0xfd, 0xc2, 0xaf, 0x4c, 0x55, 0x8a, 0x04, 0x50, 0x8b, 0x5b, 0xb5, 0x7f, 0xb2, 0x2f, 0xd7, 0xee, 0x0f, 0xba, 0x67, + 0xd2, 0xe0, 0xb0, 0x57, 0x71, 0x6f, 0xbe, 0x2c, 0x1e, 0xb2, 0x2b, 0x05, 0x6e, 0xc9, 0x19, 0x94, 0xc0, 0x1c, 0x95, + 0x9b, 0x6c, 0x90, 0x1f, 0x48, 0x99, 0x58, 0x10, 0x28, 0xda, 0x3d, 0x02, 0x3f, 0x46, 0x7a, 0x37, 0x5f, 0x42, 0xb2, + 0xcc, 0x14, 0xbd, 0x0d, 0xf8, 0xbf, 0xc5, 0x94, 0xa0, 0xa4, 0x9b, 0x85, 0x49, 0x14, 0xab, 0x30, 0xcc, 0x6a, 0xde, + 0x24, 0x45, 0xca, 0xd7, 0x86, 0x03, 0xae, 0x25, 0xab, 0x30, 0x61, 0xfb, 0xd5, 0xa6, 0xd2, 0xb8, 0x07, 0x7a, 0xf1, + 0x43, 0xe1, 0x83, 0xa9, 0x20, 0xad, 0x1c, 0xc0, 0xe6, 0x7c, 0x54, 0x97, 0x8f, 0x7d, 0xe3, 0x2f, 0x91, 0x31, 0xf4, + 0x8c, 0x6b, 0xcf, 0xf8, 0x31, 0xbc, 0xca, 0x6a, 0x17, 0x2f, 0xcf, 0x25, 0x67, 0xb0, 0x9e, 0x06, 0x11, 0x98, 0xca, + 0x97, 0x0a, 0xdf, 0xe2, 0x36, 0x23, 0x17, 0x5e, 0x3c, 0x65, 0x22, 0x85, 0x9b, 0x78, 0x2b, 0x64, 0x07, 0xba, 0x34, + 0x2d, 0x10, 0x9e, 0x6c, 0x8f, 0x9b, 0xd6, 0xf9, 0xd6, 0x28, 0x8d, 0x83, 0x3f, 0xb3, 0x3b, 0x60, 0xb3, 0x92, 0x34, + 0x5a, 0x80, 0xcc, 0xca, 0x9b, 0x72, 0x1d, 0x84, 0xa1, 0xb1, 0xdd, 0x3e, 0xf7, 0xe9, 0x13, 0x93, 0xb2, 0x8a, 0xa5, + 0xd1, 0x74, 0x1a, 0x30, 0x4d, 0xca, 0x3e, 0x96, 0x7f, 0xe6, 0x74, 0xcf, 0x16, 0x91, 0xab, 0xf5, 0xac, 0xe9, 0x60, 0x89, 0x11, 0xb3, 0x9c, 0x1b, 0x04, 0xc4, 0x45, 0xc6, 0x55, 0xc8, 0x90, 0x6b, 0xe2, 0x5c, 0x14, 0x07, 0xd7, 0x1c, 0x47, 0xcb, 0x61, 0xc0, 0x4c, 0x3c, 0x0d, 0xf0, 0xc9, 0xf5, 0x70, 0x39, 0x1c, 0x06, 0x94, 0x2e, 0x0c, 0xe2, 0xaf, 0x45, 0x09, 0xca, 0x45, 0x33, 0xbd, 0x07, 0x83, 0xb2, 0xd2, 0x2a, 0xf8, 0x60, 0x33, 0x09, 0x37, 0x07, 0xfa, 0x40, - 0x0a, 0x32, 0xd0, 0xfa, 0x99, 0x76, 0x55, 0xb8, 0xb1, 0xb0, 0x44, 0xed, 0x35, 0xb0, 0x74, 0xee, 0xa5, 0xfa, 0x1e, - 0x67, 0x58, 0xf1, 0xc2, 0xb1, 0xf2, 0x8a, 0xf6, 0xae, 0x6a, 0xa8, 0x64, 0xfa, 0xc5, 0xb3, 0xcb, 0xa9, 0x86, 0xfa, - 0xda, 0xf7, 0xa6, 0x61, 0x94, 0xa4, 0xfe, 0x48, 0xbd, 0xea, 0xbd, 0xf6, 0xb5, 0xcb, 0x79, 0xaa, 0xe9, 0x57, 0xc6, - 0xb7, 0x72, 0x1e, 0x30, 0x81, 0x29, 0x31, 0x0d, 0xd8, 0x86, 0x3a, 0xf2, 0xe9, 0xd9, 0x56, 0x4f, 0x60, 0x64, 0xac, + 0x0a, 0x32, 0xd0, 0xcd, 0x33, 0xed, 0xaa, 0x70, 0x63, 0x61, 0x89, 0xda, 0xab, 0x61, 0xe9, 0xdc, 0x4b, 0xf5, 0x3d, + 0xce, 0xb0, 0xe2, 0x85, 0x63, 0xe5, 0x15, 0xed, 0x5d, 0xd5, 0x50, 0xc9, 0xf4, 0x8b, 0x67, 0x97, 0x53, 0x0d, 0xf5, + 0xb5, 0xef, 0x4d, 0xc3, 0x28, 0x49, 0xfd, 0x91, 0x7a, 0xd5, 0x7b, 0xed, 0x6b, 0x97, 0xf3, 0x54, 0xd3, 0xaf, 0x8c, + 0x6f, 0xe5, 0x3c, 0x60, 0x02, 0x53, 0x62, 0x1a, 0xb0, 0x86, 0x3a, 0xf2, 0xe9, 0xd9, 0x56, 0x4f, 0x60, 0x64, 0xac, 0xf3, 0xad, 0x0b, 0xb5, 0x2a, 0x19, 0xc5, 0x30, 0x55, 0x24, 0x64, 0x14, 0xfb, 0x56, 0xef, 0x91, 0x10, 0xe6, 0x9b, 0xe5, 0x1a, 0x99, 0x86, 0xb4, 0x20, 0xbe, 0x18, 0x04, 0x5f, 0x78, 0x8e, 0xd2, 0xf3, 0x9e, 0xec, 0xf5, 0x50, 0x22, 0xe3, 0x83, 0x6f, 0xca, 0x1c, 0xc8, 0xe3, 0x75, 0x9a, 0x81, 0xc9, 0x61, 0x18, 0xa5, 0x0a, 0x44, 0x76, 0x83, 0x0f, @@ -3695,3994 +3695,3997 @@ constexpr uint8_t INDEX_GZ[] PROGMEM = { 0xba, 0x25, 0xf4, 0xaa, 0x09, 0x76, 0x37, 0x16, 0x31, 0xf3, 0xb9, 0x18, 0x45, 0x30, 0x60, 0x95, 0xa3, 0x07, 0xc1, 0x9a, 0x72, 0xde, 0x2a, 0x05, 0x8b, 0x6b, 0x24, 0x18, 0x80, 0xb9, 0x38, 0x8f, 0x30, 0xc8, 0xae, 0x81, 0x91, 0x84, 0x08, 0x66, 0x62, 0x8c, 0x46, 0x24, 0x27, 0x91, 0xf3, 0xc3, 0xc5, 0x32, 0xc5, 0xc8, 0xf4, 0x00, 0x00, 0xcb, 0x54, - 0x05, 0x2f, 0x8c, 0x80, 0xeb, 0x8b, 0x0b, 0x4f, 0xa6, 0x2a, 0xfe, 0xb8, 0x5e, 0xc6, 0xa5, 0x33, 0x80, 0xe3, 0x70, - 0x18, 0xa8, 0xd7, 0x81, 0xc7, 0x98, 0x0f, 0x63, 0x64, 0x14, 0x69, 0x5d, 0xb4, 0x11, 0xda, 0x3f, 0x34, 0x20, 0x90, - 0x11, 0xf5, 0xd3, 0xd3, 0x82, 0xc6, 0xc1, 0x42, 0xb4, 0xea, 0xd2, 0x30, 0x07, 0x20, 0xa3, 0x3c, 0x85, 0xb9, 0x73, - 0xe1, 0x52, 0x2f, 0x4c, 0xeb, 0xd4, 0x0b, 0x95, 0xec, 0xea, 0x06, 0x38, 0x0d, 0x83, 0xec, 0xba, 0x70, 0x74, 0x2d, - 0xc6, 0x0b, 0x5b, 0x92, 0xca, 0x15, 0xb4, 0x74, 0x73, 0xb9, 0x3d, 0xdb, 0x22, 0xf6, 0xe7, 0x5e, 0x7c, 0x47, 0xe6, - 0x6f, 0x86, 0x6c, 0x23, 0xa7, 0xab, 0x0a, 0xd1, 0x03, 0x9a, 0x00, 0x22, 0x0d, 0xaa, 0xf2, 0x75, 0x5e, 0xc6, 0xf8, - 0x68, 0x73, 0x1b, 0x20, 0xf8, 0xd6, 0xb5, 0xfa, 0x9c, 0x59, 0x24, 0x7f, 0xa4, 0x26, 0x3d, 0x2d, 0xd9, 0x30, 0xbc, - 0xa4, 0x3c, 0xbc, 0xb0, 0xbc, 0xd1, 0x70, 0x30, 0x44, 0x29, 0x08, 0x6e, 0x1c, 0x19, 0x26, 0xc1, 0x6c, 0x5e, 0x51, - 0x7a, 0xf7, 0xbb, 0x2e, 0x07, 0x83, 0xe5, 0x08, 0x61, 0x39, 0x1a, 0x44, 0xb3, 0x9e, 0x58, 0x11, 0xe0, 0x45, 0x80, + 0x05, 0x2f, 0x8c, 0x80, 0xeb, 0x8b, 0x0b, 0x4f, 0xa6, 0x2a, 0xfe, 0x78, 0xb3, 0x8c, 0x4b, 0x67, 0x00, 0xc7, 0xe1, + 0x30, 0x50, 0xaf, 0x03, 0x8f, 0x31, 0x1f, 0xc6, 0xc8, 0x28, 0xd2, 0xba, 0x68, 0x23, 0xb4, 0x7f, 0xa8, 0x41, 0x20, + 0x23, 0xea, 0xa7, 0xa7, 0x05, 0xb5, 0x83, 0x85, 0x68, 0xd5, 0xa5, 0x61, 0x0e, 0x40, 0x46, 0x79, 0x0a, 0x73, 0xe7, + 0xc2, 0xa5, 0x5e, 0x98, 0xd6, 0xa9, 0x17, 0x2a, 0xd9, 0xd5, 0x0d, 0x70, 0x1a, 0x06, 0xd9, 0x75, 0xe1, 0xe8, 0x5a, + 0x8c, 0x17, 0xb6, 0x24, 0x95, 0x2b, 0x68, 0xe9, 0xe6, 0x72, 0x7b, 0xb6, 0x45, 0xec, 0xcf, 0xbd, 0xf8, 0x8e, 0xcc, + 0xdf, 0x0c, 0xd9, 0x46, 0x4e, 0x57, 0x15, 0xa2, 0x07, 0x34, 0x01, 0x44, 0x1a, 0x54, 0xe5, 0xeb, 0xbc, 0x8c, 0xf1, + 0xd1, 0xe6, 0x36, 0x40, 0xf0, 0xad, 0x6b, 0xf5, 0x39, 0xb3, 0x48, 0xfe, 0x48, 0x4d, 0x7a, 0x5a, 0xd2, 0x30, 0xbc, + 0xa4, 0x3c, 0xbc, 0xb0, 0xbc, 0xd1, 0x70, 0x30, 0x44, 0x29, 0x08, 0x6e, 0x1c, 0x19, 0x26, 0xc1, 0xac, 0x5f, 0x51, + 0x7a, 0xf7, 0x87, 0x2e, 0x07, 0x83, 0xe5, 0x08, 0x61, 0x39, 0x6a, 0x44, 0xb3, 0x9e, 0x58, 0x11, 0xe0, 0x45, 0x80, 0x0b, 0x89, 0x91, 0x03, 0xa1, 0xfc, 0x98, 0x4a, 0xbe, 0x85, 0x62, 0x38, 0x1a, 0x04, 0x3b, 0x1d, 0x8d, 0xd8, 0x75, 0x23, 0x6c, 0x15, 0x67, 0x27, 0xfb, 0x54, 0x9b, 0x88, 0x22, 0x55, 0x82, 0x69, 0x88, 0x61, 0x84, 0xc5, 0x2c, 0x40, 0x82, 0x70, 0xd7, 0x29, 0x2e, 0x3a, 0xd6, 0x1c, 0xd5, 0xd2, 0xce, 0x69, 0x99, 0xe1, 0xc1, 0x56, 0x6a, 0xff, 0x04, 0x53, 0x7e, 0x02, 0x59, 0x87, 0xa0, 0x58, 0x27, 0xfb, 0xf4, 0xa8, 0x54, 0x4e, 0x44, 0xd1, 0x89, 0x90, 0x41, 0x76, 0x79, 0x07, 0x0f, 0x3a, 0x2a, 0x49, 0xca, 0x16, 0x50, 0xea, 0x65, 0xaa, 0x32, 0xe7, 0x0c, 0x16, 0x8f, 0xbe, 0x07, 0xa1, 0x79, 0x6c, 0x70, 0x89, 0x50, 0x95, 0xb9, 0x77, 0x8b, 0x23, 0x17, 0x6f, 0xbc, 0x5b, 0xcd, 0xe1, 0xaf, 0x8a, - 0xb3, 0x96, 0x94, 0xcf, 0xda, 0xa8, 0x76, 0x43, 0x0e, 0xe0, 0x86, 0x3c, 0x6a, 0x5e, 0xdc, 0x99, 0x58, 0xdc, 0xf1, + 0xb3, 0x96, 0x94, 0xcf, 0xda, 0x68, 0xe3, 0x86, 0x1c, 0xc0, 0x0d, 0x79, 0x54, 0xbf, 0xb8, 0x33, 0xb1, 0xb8, 0xe3, 0x86, 0xc5, 0x1d, 0x6f, 0x59, 0xdc, 0x80, 0x2f, 0xa4, 0x92, 0x4f, 0x5d, 0x8c, 0xbe, 0xd4, 0xf9, 0xe4, 0x71, 0x7e, - 0xa4, 0xcb, 0xcf, 0x19, 0xce, 0x93, 0x99, 0x04, 0x60, 0x4b, 0xbc, 0x61, 0xae, 0x9a, 0xe6, 0x45, 0x9a, 0x88, 0xfa, - 0xc0, 0xf3, 0x53, 0x27, 0xc6, 0x0d, 0x29, 0xbc, 0xb5, 0xa0, 0x3a, 0x5e, 0xd8, 0xa5, 0xd8, 0xd0, 0xd0, 0x66, 0x1b, - 0x46, 0x3a, 0xdb, 0x32, 0xd2, 0x51, 0xe9, 0xe8, 0xf2, 0x61, 0xd3, 0x21, 0x94, 0x07, 0x05, 0x7b, 0x10, 0xfc, 0x2b, - 0x70, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x1c, 0x2b, 0xed, 0xa8, 0x85, 0x97, 0x24, 0xab, 0x28, 0x06, 0x03, 0x05, 0xe8, - 0xe6, 0x61, 0x5b, 0x6a, 0xee, 0x87, 0x3c, 0xf6, 0xd9, 0xc6, 0xcd, 0x54, 0xbc, 0x97, 0xb7, 0x54, 0xeb, 0xf0, 0x90, - 0x6a, 0x2c, 0xbc, 0x34, 0x65, 0x31, 0x4e, 0xba, 0x07, 0x49, 0x32, 0xfe, 0x4b, 0xb6, 0x59, 0x03, 0x0e, 0x09, 0x24, - 0xac, 0x8e, 0x18, 0x7a, 0x01, 0x2c, 0x18, 0x69, 0x24, 0x43, 0x7d, 0x2d, 0xc5, 0x51, 0x8d, 0xf3, 0x89, 0xff, 0x11, - 0x8f, 0xab, 0x16, 0x4b, 0x9e, 0xbe, 0xce, 0x91, 0x6e, 0x2d, 0xbc, 0xf1, 0x7b, 0xb0, 0x83, 0xd1, 0x5a, 0x06, 0xf8, - 0xb4, 0xc8, 0x51, 0x53, 0x63, 0xe2, 0x09, 0x47, 0x05, 0x92, 0x44, 0x2c, 0xc9, 0x2d, 0x86, 0x21, 0xd8, 0x80, 0x67, - 0x4e, 0xae, 0xd6, 0xad, 0x6c, 0x7f, 0xea, 0xeb, 0x35, 0xac, 0x09, 0xa8, 0x2d, 0x70, 0xfb, 0xb9, 0xd0, 0x2d, 0x30, - 0x9c, 0x23, 0x1d, 0x14, 0xa5, 0x97, 0x90, 0x0e, 0xdd, 0x16, 0x97, 0xe9, 0x41, 0x0c, 0x54, 0x0b, 0xd4, 0x8a, 0x4f, - 0xa6, 0xf8, 0xcb, 0xb9, 0xca, 0x9e, 0x0c, 0xf1, 0x57, 0xeb, 0x2a, 0x57, 0x62, 0x55, 0xa4, 0x08, 0xd2, 0x98, 0xd5, - 0x7e, 0x69, 0x3f, 0x91, 0xb9, 0xf6, 0x03, 0xb6, 0x0d, 0x5f, 0xe0, 0x47, 0x8f, 0xd7, 0x09, 0x04, 0x28, 0x90, 0xc7, - 0x10, 0x5a, 0xb1, 0x9e, 0x35, 0x96, 0x4f, 0x37, 0x94, 0x0f, 0xf5, 0xdf, 0x99, 0xf0, 0xe3, 0x2e, 0x89, 0x0a, 0x9a, - 0x52, 0x96, 0x81, 0x5c, 0x0f, 0xfd, 0xd0, 0x8b, 0xef, 0xae, 0xe9, 0x16, 0xa2, 0x09, 0x16, 0x3f, 0x97, 0xed, 0x10, - 0x2f, 0x5a, 0xb6, 0x0e, 0x49, 0x25, 0x45, 0xd5, 0x1d, 0x27, 0xf4, 0xee, 0x9f, 0x62, 0x89, 0xbf, 0x2b, 0x5d, 0x63, - 0xf9, 0x82, 0x94, 0x3e, 0x74, 0xfd, 0x78, 0xad, 0xb1, 0x7a, 0x37, 0x95, 0xd1, 0x56, 0x18, 0x48, 0x58, 0x1e, 0xbc, - 0x12, 0xcf, 0xc7, 0x7e, 0x17, 0xcd, 0x3f, 0x86, 0xd1, 0xad, 0xf9, 0x78, 0x9d, 0x9e, 0xaa, 0x73, 0x2f, 0xfe, 0xc8, - 0xc6, 0xe6, 0xc8, 0x8f, 0x47, 0x01, 0x30, 0x8f, 0xc3, 0xc0, 0x0b, 0x3f, 0xf2, 0x47, 0x33, 0x5a, 0xa6, 0x68, 0xd0, - 0x75, 0xef, 0x0d, 0x5a, 0xcc, 0x09, 0x09, 0x12, 0x91, 0xab, 0x6d, 0x98, 0x05, 0xe5, 0xfd, 0x40, 0x5c, 0xeb, 0x0b, - 0x46, 0xb1, 0xa8, 0x65, 0x80, 0x3f, 0x02, 0xd8, 0x98, 0x41, 0x80, 0x07, 0x43, 0xc5, 0xf5, 0x52, 0x0d, 0x79, 0xa8, - 0xa4, 0x55, 0xcb, 0x33, 0x14, 0x5f, 0x63, 0x0f, 0xbf, 0xfe, 0x73, 0x50, 0xf2, 0x90, 0xcf, 0xe5, 0xbd, 0x7c, 0xde, - 0x08, 0xa1, 0xd4, 0x24, 0xc7, 0xc2, 0x07, 0x7c, 0x9c, 0x33, 0x98, 0x9b, 0x3f, 0x2d, 0x37, 0xf6, 0x92, 0x64, 0x39, - 0x67, 0x63, 0x52, 0x89, 0x9d, 0x16, 0x40, 0x95, 0xef, 0x21, 0x32, 0x60, 0x7f, 0x5f, 0xb6, 0x8e, 0x0f, 0x5e, 0x81, - 0x81, 0x1f, 0x30, 0x94, 0xd1, 0x64, 0xa2, 0x16, 0xa2, 0x80, 0x7b, 0x9a, 0x39, 0x07, 0x7f, 0x5f, 0xbe, 0x39, 0xb3, - 0xdf, 0xe4, 0x8d, 0x43, 0x60, 0x8c, 0x85, 0xb5, 0x12, 0xe7, 0x8b, 0x25, 0x78, 0xc5, 0x88, 0x26, 0x5e, 0xb8, 0x79, - 0x38, 0x97, 0xa5, 0x2d, 0xbe, 0x60, 0x6c, 0x0c, 0x0c, 0xb7, 0x51, 0x2b, 0xbd, 0x0e, 0xd8, 0x0d, 0xcb, 0x2d, 0xa1, - 0xea, 0x1f, 0x6b, 0x68, 0x81, 0xa1, 0x5a, 0xb9, 0xee, 0x91, 0x73, 0x75, 0xd2, 0x90, 0x06, 0x38, 0x06, 0x3e, 0x72, - 0xf9, 0x88, 0x55, 0x8e, 0xd4, 0xc0, 0x50, 0x25, 0x00, 0x36, 0x42, 0x76, 0xba, 0xa1, 0xbc, 0x0b, 0x88, 0x7a, 0x03, - 0x6c, 0x86, 0xa3, 0x77, 0x21, 0xb5, 0x05, 0x9f, 0xa7, 0x00, 0x4e, 0x9e, 0x56, 0x48, 0x4d, 0x36, 0xcd, 0x58, 0x93, - 0xa8, 0x4d, 0x25, 0x21, 0x8d, 0x70, 0x0e, 0x40, 0x2f, 0x19, 0x21, 0xae, 0x6a, 0x5c, 0x1b, 0xa5, 0x3c, 0xf2, 0x21, - 0x26, 0x7e, 0x0f, 0x59, 0x92, 0x6c, 0x9c, 0xb0, 0x7c, 0xd1, 0x0d, 0xb5, 0xa8, 0x5d, 0x9e, 0x8f, 0xa2, 0xdc, 0xb0, - 0x0d, 0x60, 0x09, 0x70, 0x80, 0xd5, 0x6f, 0x21, 0x79, 0xb9, 0x9e, 0x73, 0xf3, 0xce, 0x78, 0x3a, 0x54, 0xb9, 0xe9, - 0xdd, 0xa6, 0xf7, 0x2b, 0x95, 0x03, 0x55, 0x22, 0xd3, 0x8d, 0xa0, 0x69, 0x25, 0xd4, 0x5b, 0x93, 0x2a, 0x61, 0x07, - 0x02, 0xa6, 0x0a, 0x7e, 0x65, 0x93, 0x09, 0x1b, 0xa5, 0x89, 0x2e, 0x64, 0x4c, 0x79, 0xb0, 0x75, 0x70, 0xb2, 0xdd, - 0x73, 0xd5, 0x1f, 0x21, 0xe4, 0x8c, 0x88, 0x49, 0xc8, 0x01, 0x12, 0x77, 0xa6, 0xe6, 0x69, 0xa2, 0x1e, 0xcb, 0x53, - 0xc4, 0xbf, 0x02, 0x52, 0xe8, 0x86, 0x72, 0x04, 0x8d, 0xd3, 0x9f, 0x62, 0x5f, 0x44, 0xb9, 0x11, 0xe8, 0x76, 0x54, - 0xb4, 0xed, 0xf8, 0xae, 0x9d, 0x37, 0x87, 0x8e, 0x9d, 0xa9, 0x06, 0xb8, 0x3a, 0x7f, 0xac, 0x6c, 0x63, 0x22, 0x50, - 0xae, 0x7a, 0xfe, 0xf6, 0xd5, 0x9f, 0xce, 0x5e, 0xef, 0x8a, 0x11, 0xb0, 0xcb, 0x36, 0x74, 0xb9, 0x0c, 0xb7, 0x74, - 0xfa, 0xf3, 0x8f, 0x0f, 0xeb, 0xb6, 0xe5, 0xbc, 0x70, 0x54, 0x83, 0xac, 0xd3, 0x25, 0xbc, 0x38, 0x8a, 0x6e, 0x58, - 0xfc, 0xd9, 0xd3, 0x20, 0x77, 0xde, 0x0c, 0xee, 0xdb, 0x9f, 0xce, 0x7e, 0xdc, 0x19, 0xd4, 0x23, 0xc7, 0x06, 0xdc, - 0x9e, 0x46, 0x8b, 0x07, 0x8c, 0xae, 0xad, 0x1a, 0xea, 0x28, 0x88, 0x12, 0xb6, 0x01, 0x82, 0x57, 0xe7, 0x6f, 0xdf, - 0xe3, 0x74, 0x15, 0x2c, 0x08, 0x75, 0xf5, 0x79, 0x83, 0xff, 0xe9, 0xdd, 0xd9, 0xfb, 0xf7, 0xaa, 0x81, 0xc9, 0xba, - 0x13, 0xb9, 0x77, 0xbe, 0x89, 0xef, 0xa1, 0x38, 0x8d, 0x7b, 0x9d, 0xa8, 0x1a, 0x5d, 0xa4, 0xcb, 0xa3, 0xa1, 0xb2, - 0xda, 0x36, 0xe7, 0xd4, 0x8e, 0x7f, 0x99, 0x6e, 0xbf, 0x3b, 0x8d, 0xab, 0x01, 0x1f, 0x6d, 0x27, 0xa9, 0xa5, 0x92, - 0xb9, 0x1f, 0x5e, 0x37, 0x94, 0x7a, 0xb7, 0x0d, 0xa5, 0x70, 0x7d, 0xac, 0xe1, 0xc7, 0x65, 0x34, 0x97, 0xd8, 0x11, - 0x76, 0x7b, 0xff, 0x74, 0x49, 0x77, 0xb8, 0xcf, 0x00, 0x9a, 0x27, 0x5b, 0xa9, 0x42, 0xdd, 0x50, 0xcc, 0x2f, 0x5e, - 0xf9, 0xdc, 0x8e, 0x02, 0xb0, 0xc9, 0x67, 0xb2, 0x1a, 0xb2, 0xcc, 0xaa, 0x72, 0x8f, 0x1a, 0xb7, 0x72, 0x2b, 0xa0, - 0x66, 0xa4, 0xba, 0xe1, 0x34, 0x65, 0xe1, 0x8d, 0xc1, 0xd0, 0xdd, 0x1c, 0x46, 0x69, 0x1a, 0xcd, 0xbb, 0x8e, 0xbd, - 0xb8, 0x55, 0x95, 0x9e, 0x10, 0x76, 0x70, 0x3b, 0xfc, 0xee, 0xbf, 0xff, 0x55, 0x41, 0xf3, 0x54, 0x7e, 0x9d, 0xb2, - 0xf9, 0x82, 0xc5, 0x5e, 0xba, 0x8c, 0x59, 0xa6, 0xfc, 0xfb, 0x7f, 0x5e, 0x55, 0x2e, 0xf6, 0x3d, 0xb9, 0x0d, 0xb1, - 0xf4, 0x72, 0x93, 0xeb, 0x20, 0x5a, 0xed, 0x15, 0x1e, 0x77, 0xf7, 0x54, 0x9e, 0xf9, 0xd3, 0x59, 0x5e, 0xfb, 0x34, - 0xdd, 0x32, 0x36, 0x01, 0x3d, 0xe9, 0x03, 0x94, 0xf3, 0x68, 0xd5, 0xfd, 0xf7, 0xbf, 0x72, 0x81, 0xcd, 0xbd, 0xbb, - 0xae, 0x19, 0xd0, 0xf2, 0x8a, 0x36, 0xd7, 0xa9, 0x2d, 0x31, 0xbc, 0xaf, 0x2d, 0x70, 0xad, 0x90, 0x76, 0x65, 0x5d, - 0x37, 0xb7, 0x65, 0x4c, 0xdf, 0xf9, 0xd3, 0xd9, 0xe7, 0x0e, 0x0a, 0x26, 0xf4, 0xde, 0x51, 0x41, 0xa5, 0x2f, 0x30, - 0xac, 0x41, 0x77, 0xf7, 0x05, 0xfb, 0xcc, 0x71, 0xdd, 0x37, 0xa4, 0x2f, 0x31, 0x1a, 0x2e, 0xb9, 0x7d, 0x3f, 0x18, - 0xe4, 0xc9, 0x6a, 0xe5, 0xf6, 0xe0, 0x33, 0x78, 0x5a, 0x2b, 0xe1, 0xec, 0x45, 0xd7, 0xd6, 0x29, 0x98, 0xcf, 0x0e, - 0x13, 0x82, 0xd6, 0xef, 0x0d, 0xd3, 0xb1, 0x19, 0x5f, 0x93, 0x13, 0x5b, 0xed, 0xdb, 0x35, 0x64, 0x0d, 0xa5, 0x98, - 0xe8, 0x34, 0xd7, 0x1a, 0x1a, 0xcd, 0xe0, 0xac, 0x62, 0x6f, 0x41, 0x4a, 0x02, 0x05, 0x35, 0x26, 0x20, 0x74, 0xa9, - 0xdc, 0xa2, 0x6f, 0xbc, 0xe0, 0x66, 0xb7, 0x0b, 0xd5, 0x66, 0x0a, 0x86, 0xa4, 0xf9, 0x3f, 0x47, 0xbc, 0x91, 0x2e, - 0x3f, 0x98, 0x76, 0xaf, 0xbc, 0x94, 0xc5, 0xd7, 0x33, 0xf0, 0xf6, 0x15, 0xd2, 0x03, 0x88, 0xa3, 0xbb, 0x0d, 0x29, - 0x97, 0xd8, 0xd2, 0x06, 0x34, 0x5a, 0x60, 0xb8, 0x5f, 0x87, 0xbb, 0xbf, 0x10, 0xe6, 0xee, 0x9e, 0x81, 0x3f, 0xe6, - 0x6f, 0x86, 0xbd, 0xb7, 0x51, 0xa6, 0xff, 0xc7, 0xde, 0xff, 0x8d, 0xd8, 0x7b, 0xeb, 0x77, 0x7e, 0xcd, 0xc2, 0xfe, - 0x1f, 0xc0, 0xf2, 0x5d, 0xe6, 0x9e, 0x71, 0x4c, 0xaf, 0x69, 0x9e, 0xab, 0xc5, 0xa5, 0xc3, 0x8b, 0x78, 0xb5, 0xa6, - 0x60, 0xe5, 0xc1, 0xd6, 0xb8, 0xe5, 0xa0, 0x87, 0xc8, 0x7e, 0xcb, 0x51, 0xfe, 0xed, 0x11, 0x7d, 0x42, 0x19, 0xaa, + 0xa4, 0xcb, 0xcf, 0x19, 0xce, 0x93, 0x99, 0x04, 0x60, 0x4b, 0xdc, 0x30, 0x57, 0x75, 0xf3, 0x22, 0x4d, 0xc4, 0xe6, + 0xc0, 0xf3, 0x53, 0x27, 0xc6, 0x0d, 0x29, 0xbc, 0xb5, 0xa0, 0x3a, 0x5e, 0xd8, 0xa5, 0xd8, 0xd0, 0xd0, 0x66, 0x0d, + 0x23, 0x9d, 0x6d, 0x19, 0xe9, 0xa8, 0x74, 0x74, 0xf9, 0xb0, 0xe9, 0x10, 0xca, 0x83, 0x82, 0x3d, 0x08, 0xfe, 0x15, + 0xb8, 0x65, 0xca, 0xfb, 0xb0, 0x19, 0xc7, 0x4a, 0x3b, 0x6a, 0xe1, 0x25, 0xc9, 0x2a, 0x8a, 0xc1, 0x40, 0x01, 0xba, + 0x79, 0xd8, 0x96, 0x9a, 0xfb, 0x21, 0x8f, 0x7d, 0xd6, 0xb8, 0x99, 0x8a, 0xf7, 0xf2, 0x96, 0x6a, 0x1d, 0x1e, 0x52, + 0x8d, 0x85, 0x97, 0xa6, 0x2c, 0xc6, 0x49, 0xf7, 0x20, 0x49, 0xc6, 0x7f, 0xc8, 0x36, 0xab, 0xc1, 0x21, 0x81, 0x84, + 0xd5, 0x11, 0x43, 0x2f, 0x80, 0x05, 0x23, 0x8d, 0x64, 0xa8, 0xaf, 0xa5, 0x38, 0xaa, 0x71, 0x3e, 0xf1, 0x3f, 0xe1, + 0x71, 0xd5, 0x62, 0xc9, 0xd3, 0xd7, 0x39, 0xd2, 0xad, 0x85, 0x37, 0x7e, 0x0f, 0x76, 0x30, 0x5a, 0xcb, 0x00, 0x9f, + 0x16, 0x39, 0x6a, 0x6a, 0x4c, 0x3c, 0xe1, 0xa8, 0x40, 0x92, 0x88, 0x25, 0xb9, 0xc5, 0x30, 0x04, 0x1b, 0xf0, 0xcc, + 0xc9, 0xd5, 0xba, 0x95, 0xed, 0x4f, 0x7d, 0x7d, 0x03, 0x6b, 0x02, 0x6a, 0x0b, 0xdc, 0x7e, 0x2e, 0x74, 0x0b, 0x0c, + 0xe7, 0x48, 0x07, 0x45, 0xe9, 0x25, 0xa4, 0x43, 0xb7, 0xc5, 0x65, 0x7a, 0x10, 0x03, 0xd5, 0x02, 0xb5, 0xe2, 0x93, + 0x29, 0xfe, 0x72, 0xae, 0xb2, 0x27, 0x43, 0xfc, 0xd5, 0xba, 0xca, 0x95, 0x58, 0x15, 0x29, 0x82, 0x34, 0x66, 0xb5, + 0x5f, 0xda, 0x4f, 0x64, 0xae, 0xfd, 0x80, 0x6d, 0xc3, 0x17, 0xf8, 0xd1, 0xe3, 0x75, 0x02, 0x01, 0x0a, 0xe4, 0x31, + 0x84, 0x56, 0xac, 0x67, 0xb5, 0xe5, 0xd3, 0x86, 0xf2, 0xa1, 0xfe, 0x07, 0x13, 0x7e, 0xdc, 0x25, 0x51, 0x41, 0x53, + 0xca, 0x32, 0x90, 0xeb, 0xa1, 0x1f, 0x7a, 0xf1, 0xdd, 0x35, 0xdd, 0x42, 0x34, 0xc1, 0xe2, 0xe7, 0xb2, 0x1d, 0xe2, + 0x45, 0xcb, 0xd6, 0x21, 0xa9, 0xa4, 0xa8, 0xba, 0xe3, 0x84, 0xde, 0xfd, 0x73, 0x2c, 0xf1, 0x77, 0xa5, 0x6b, 0x2c, + 0x5f, 0x90, 0xd2, 0x87, 0xae, 0x1f, 0xaf, 0x35, 0xb6, 0xd9, 0x4d, 0x65, 0xb4, 0x15, 0x06, 0x12, 0x96, 0x07, 0xaf, + 0xc4, 0xf3, 0xb1, 0xdf, 0x45, 0xf3, 0x8f, 0x61, 0x74, 0x6b, 0x3e, 0x5e, 0xa7, 0xa7, 0xea, 0xdc, 0x8b, 0x3f, 0xb2, + 0xb1, 0x39, 0xf2, 0xe3, 0x51, 0x00, 0xcc, 0xe3, 0x30, 0xf0, 0xc2, 0x8f, 0xfc, 0xd1, 0x8c, 0x96, 0x29, 0x1a, 0x74, + 0xdd, 0x7b, 0x83, 0x16, 0x73, 0x42, 0x82, 0x44, 0xe4, 0x6a, 0x6b, 0x66, 0x41, 0x79, 0x3f, 0x10, 0xd7, 0xfa, 0x82, + 0x51, 0x2c, 0x6a, 0x19, 0xe0, 0x8f, 0x00, 0x36, 0x66, 0x10, 0xe0, 0xc1, 0x50, 0x71, 0xbd, 0x54, 0x43, 0x1e, 0x2a, + 0x69, 0xd5, 0xf2, 0x0c, 0xc5, 0xd7, 0xd8, 0xc3, 0x6f, 0xff, 0x1c, 0x94, 0x3c, 0xe4, 0x73, 0x79, 0x2f, 0x9f, 0x37, + 0x42, 0x28, 0x35, 0xc9, 0xb1, 0xf0, 0x01, 0x1f, 0xe7, 0x0c, 0x66, 0xf3, 0xa7, 0xe5, 0xc6, 0x5e, 0x92, 0x2c, 0xe7, + 0x6c, 0x4c, 0x2a, 0xb1, 0xd3, 0x02, 0xa8, 0xf2, 0x3d, 0x44, 0x06, 0xec, 0x6f, 0xcb, 0xd6, 0xf1, 0xc1, 0x2b, 0x30, + 0xf0, 0x03, 0x86, 0x32, 0x9a, 0x4c, 0xd4, 0x42, 0x14, 0x70, 0x4f, 0x33, 0xe7, 0xe0, 0x6f, 0xcb, 0x37, 0x67, 0xf6, + 0x9b, 0xbc, 0x71, 0x08, 0x8c, 0xb1, 0xb0, 0x56, 0xe2, 0x7c, 0xb1, 0x04, 0xaf, 0x18, 0xd1, 0xc4, 0x0b, 0x9b, 0x87, + 0x73, 0x59, 0xda, 0xe2, 0x0b, 0xc6, 0xc6, 0xc0, 0x70, 0x1b, 0x1b, 0xa5, 0xd7, 0x01, 0xbb, 0x61, 0xb9, 0x25, 0xd4, + 0xe6, 0xc7, 0x6a, 0x5a, 0x60, 0xa8, 0x56, 0xae, 0x7b, 0xe4, 0x5c, 0x9d, 0x34, 0xa4, 0x01, 0x8e, 0x81, 0x8f, 0x5c, + 0x3e, 0x62, 0x95, 0x23, 0x35, 0x30, 0x54, 0x09, 0x80, 0x46, 0xc8, 0x4e, 0x1b, 0xca, 0xbb, 0x80, 0xa8, 0x1b, 0x60, + 0x33, 0x1c, 0xbd, 0x0b, 0xa9, 0x2d, 0xf8, 0x3c, 0x05, 0x70, 0xf2, 0xb4, 0x42, 0x6a, 0xd2, 0x34, 0x63, 0x75, 0xa2, + 0x36, 0x95, 0x84, 0x34, 0xc2, 0x39, 0x00, 0xbd, 0x64, 0x84, 0xb8, 0xaa, 0x76, 0x6d, 0x94, 0xf2, 0xc8, 0x87, 0x98, + 0xf8, 0x3d, 0x64, 0x49, 0xd2, 0x38, 0x61, 0xf9, 0xa2, 0x1b, 0x6a, 0x51, 0xbb, 0x3c, 0x1f, 0x45, 0xb9, 0x61, 0x1b, + 0xc0, 0x12, 0xe0, 0x00, 0xab, 0xdf, 0x42, 0xf2, 0x72, 0x3d, 0xe7, 0xe6, 0x9d, 0xf1, 0x74, 0xa8, 0x72, 0xd3, 0xbb, + 0xa6, 0xf7, 0x2b, 0x95, 0x03, 0x55, 0x22, 0xd3, 0xb5, 0xa0, 0x69, 0x25, 0xd4, 0xbb, 0x21, 0x55, 0xc2, 0x0e, 0x04, + 0x4c, 0x15, 0xfc, 0xca, 0x26, 0x13, 0x36, 0x4a, 0x13, 0x5d, 0xc8, 0x98, 0xf2, 0x60, 0xeb, 0xe0, 0x64, 0xbb, 0xe7, + 0xaa, 0x3f, 0x41, 0xc8, 0x19, 0x11, 0x93, 0x90, 0x03, 0x24, 0xee, 0x4c, 0xf5, 0xd3, 0x44, 0x3d, 0x96, 0xa7, 0x88, + 0x7f, 0x05, 0xa4, 0xd0, 0x35, 0xe5, 0x08, 0x1a, 0xa7, 0x3f, 0xc5, 0xbe, 0x88, 0x72, 0x23, 0xd0, 0xed, 0xa8, 0x68, + 0xdb, 0xf1, 0x5d, 0x3b, 0x6f, 0x0e, 0x1d, 0x3b, 0x53, 0x0d, 0x70, 0x75, 0xfe, 0x58, 0xd9, 0xc6, 0x44, 0xa0, 0x5c, + 0xf5, 0xfc, 0xed, 0xab, 0x3f, 0x9f, 0xbd, 0xde, 0x15, 0x23, 0x60, 0x97, 0x6d, 0xe8, 0x72, 0x19, 0x6e, 0xe9, 0xf4, + 0x97, 0x9f, 0x1e, 0xd6, 0x6d, 0xcb, 0x79, 0xe1, 0xa8, 0x06, 0x59, 0xa7, 0x4b, 0x78, 0x71, 0x14, 0xdd, 0xb0, 0xf8, + 0xb3, 0xa7, 0x41, 0xee, 0xbc, 0x1e, 0xdc, 0xb7, 0x3f, 0x9f, 0xfd, 0xb4, 0x33, 0xa8, 0x47, 0x8e, 0x0d, 0xb8, 0x3d, + 0x8d, 0x16, 0x0f, 0x18, 0x5d, 0x5b, 0x35, 0xd4, 0x51, 0x10, 0x25, 0xac, 0x01, 0x82, 0x57, 0xe7, 0x6f, 0xdf, 0xe3, + 0x74, 0x15, 0x2c, 0x08, 0x75, 0xf5, 0x79, 0x83, 0xff, 0xf9, 0xdd, 0xd9, 0xfb, 0xf7, 0xaa, 0x81, 0xc9, 0xba, 0x13, + 0xb9, 0x77, 0xbe, 0x89, 0xef, 0xa1, 0x38, 0xb5, 0x7b, 0x9d, 0xa8, 0x1a, 0x5d, 0xa4, 0xcb, 0xa3, 0xa1, 0xb2, 0x8d, + 0x6d, 0xce, 0xa9, 0x1d, 0xff, 0x32, 0xdd, 0x7e, 0x77, 0x1a, 0x57, 0x0d, 0x3e, 0xda, 0x4e, 0x52, 0x4b, 0x25, 0x73, + 0x3f, 0xbc, 0xae, 0x29, 0xf5, 0x6e, 0x6b, 0x4a, 0xe1, 0xfa, 0xb8, 0x81, 0x1f, 0x97, 0xd1, 0x5c, 0x62, 0x47, 0xd8, + 0xed, 0xfd, 0xd3, 0x25, 0xdd, 0xe1, 0x3e, 0x03, 0x68, 0x9e, 0x6c, 0xa5, 0x0a, 0x75, 0x4d, 0x31, 0xbf, 0x78, 0xe5, + 0x73, 0x3b, 0x0a, 0xc0, 0x26, 0x9f, 0xc9, 0x6a, 0xc8, 0x32, 0xab, 0xca, 0x3d, 0x6a, 0xdc, 0xca, 0xad, 0x80, 0x9a, + 0x91, 0xea, 0x86, 0xd3, 0x94, 0x85, 0x37, 0x06, 0x43, 0x77, 0x73, 0x18, 0xa5, 0x69, 0x34, 0xef, 0x3a, 0xf6, 0xe2, + 0x56, 0x55, 0x7a, 0x42, 0xd8, 0xc1, 0xed, 0xf0, 0xbb, 0xff, 0xfa, 0x67, 0x05, 0xcd, 0x53, 0xf9, 0x75, 0xca, 0xe6, + 0x0b, 0x16, 0x7b, 0xe9, 0x32, 0x66, 0x99, 0xf2, 0xaf, 0xff, 0x79, 0x55, 0xb9, 0xd8, 0xf7, 0xe4, 0x36, 0xc4, 0xd2, + 0xcb, 0x4d, 0xae, 0x83, 0x68, 0xb5, 0x57, 0x78, 0xdc, 0xdd, 0x53, 0x79, 0xe6, 0x4f, 0x67, 0x79, 0xed, 0xd3, 0x74, + 0xcb, 0xd8, 0x04, 0xf4, 0xa4, 0x0f, 0x50, 0xce, 0xa3, 0x55, 0xf7, 0x5f, 0xff, 0xcc, 0x05, 0x36, 0xf7, 0xee, 0xba, + 0x7a, 0x40, 0xcb, 0x2b, 0x5a, 0x5f, 0x67, 0x63, 0x89, 0xe1, 0xfd, 0xc6, 0x02, 0x6f, 0x14, 0xd2, 0xae, 0xdc, 0xd4, + 0xcd, 0x6d, 0x19, 0xd3, 0x77, 0xfe, 0x74, 0xf6, 0xb9, 0x83, 0x82, 0x09, 0xbd, 0x77, 0x54, 0x50, 0xe9, 0x0b, 0x0c, + 0x6b, 0xd0, 0xdd, 0x7d, 0xc1, 0x3e, 0x73, 0x5c, 0xf7, 0x0d, 0xe9, 0x4b, 0x8c, 0x86, 0x4b, 0x6e, 0xdf, 0x0f, 0x06, + 0x79, 0xb2, 0x5a, 0xb9, 0x3d, 0xf8, 0x0c, 0x9e, 0x6e, 0x94, 0x70, 0xf6, 0xa2, 0x6b, 0xeb, 0x14, 0xcc, 0x67, 0x87, + 0x09, 0x41, 0xeb, 0xf7, 0x9a, 0xe9, 0x68, 0xc6, 0xd7, 0xe4, 0xc4, 0xb6, 0xf1, 0xed, 0x0d, 0x64, 0x0d, 0xa5, 0x98, + 0xe8, 0x34, 0xd7, 0x1a, 0x1a, 0xf5, 0xe0, 0xac, 0x62, 0x6f, 0x41, 0x4a, 0x02, 0x05, 0x35, 0x26, 0x20, 0x74, 0xa9, + 0xdc, 0xa2, 0x6f, 0xbc, 0xe0, 0x66, 0xb7, 0x0b, 0x55, 0x33, 0x05, 0x43, 0xd2, 0xfc, 0xef, 0x23, 0xde, 0x48, 0x97, + 0x1f, 0x4c, 0xbb, 0x57, 0x5e, 0xca, 0xe2, 0xeb, 0x19, 0x78, 0xfb, 0x0a, 0xe9, 0x01, 0xc4, 0xd1, 0xdd, 0x86, 0x94, + 0x4b, 0x6c, 0x69, 0x0d, 0x1a, 0x2d, 0x30, 0xdc, 0x6f, 0xc3, 0xdd, 0x5f, 0x08, 0x73, 0x77, 0xcf, 0xc0, 0x1f, 0xf3, + 0x77, 0xc3, 0xde, 0xdb, 0x28, 0xd3, 0xff, 0x63, 0xef, 0xff, 0x44, 0xec, 0xbd, 0xf5, 0x3b, 0xbf, 0x65, 0x61, 0xff, + 0x0f, 0x60, 0xf9, 0x2e, 0x73, 0xcf, 0x38, 0xa6, 0xd7, 0x34, 0xcf, 0xd5, 0xe2, 0xd2, 0xe1, 0x45, 0xbc, 0xba, 0xa1, + 0x60, 0xe5, 0xc1, 0xd6, 0xb8, 0xe5, 0xa0, 0x87, 0xc8, 0x7e, 0xcb, 0x51, 0xfe, 0xfd, 0x11, 0x7d, 0x42, 0x19, 0xaa, 0x24, 0x4c, 0xdf, 0x3d, 0x33, 0x92, 0xd2, 0x48, 0xbc, 0x95, 0x77, 0xb7, 0x0b, 0xde, 0x11, 0xc0, 0x7e, 0xb3, 0xf2, - 0xee, 0x9a, 0x80, 0xdd, 0x88, 0x5e, 0xab, 0x1f, 0x3b, 0x05, 0x2f, 0x9f, 0x2e, 0xba, 0xf8, 0x18, 0x83, 0x84, 0xa5, - 0xa7, 0x50, 0xe8, 0x3e, 0x5e, 0xef, 0x55, 0x2b, 0x66, 0x03, 0xf0, 0x7f, 0x96, 0x00, 0x8f, 0x4a, 0x80, 0xfb, 0xc9, - 0x75, 0x14, 0x3e, 0x04, 0xf2, 0x9f, 0x40, 0xf8, 0xf3, 0xab, 0x41, 0xc7, 0xcf, 0xd5, 0x60, 0xc7, 0xd2, 0x2a, 0xf0, - 0x58, 0x58, 0x85, 0xbe, 0xd7, 0x2c, 0xab, 0xaf, 0x10, 0x5a, 0xa4, 0xb1, 0x8c, 0x08, 0xad, 0x02, 0x7a, 0x15, 0x05, - 0x74, 0x5c, 0x15, 0x92, 0xeb, 0x87, 0x93, 0xd8, 0x8b, 0xd9, 0x78, 0xf3, 0x15, 0xa0, 0x64, 0x9d, 0x7c, 0x67, 0x25, - 0xcb, 0xc5, 0x22, 0x8a, 0xd3, 0xe4, 0x1a, 0xe3, 0xb4, 0xcc, 0x7d, 0xb8, 0x50, 0x40, 0x46, 0xb1, 0x3c, 0x6a, 0xef, - 0x59, 0x93, 0x7c, 0xdb, 0x60, 0x6e, 0x39, 0xd9, 0x06, 0xf7, 0xbe, 0x31, 0xb8, 0xff, 0xce, 0x4c, 0xd2, 0x5f, 0xcc, - 0xac, 0x34, 0xf6, 0xe7, 0x9a, 0x6e, 0x38, 0xb6, 0xae, 0x0b, 0xf9, 0xca, 0xcc, 0xed, 0xef, 0x51, 0xb4, 0xe1, 0x99, - 0x0e, 0x51, 0x0b, 0xd1, 0xa3, 0x05, 0x6c, 0xe5, 0x5e, 0x2e, 0x27, 0x13, 0x16, 0x6b, 0x22, 0x2c, 0x23, 0xc4, 0x85, - 0x25, 0x63, 0x40, 0xf0, 0x73, 0xfc, 0xe0, 0xb3, 0x15, 0xe4, 0x7f, 0x2a, 0xc2, 0xaa, 0x83, 0xaf, 0x27, 0x99, 0x93, - 0x43, 0x6e, 0xb9, 0xb4, 0xdd, 0xd2, 0xc6, 0xcf, 0x0e, 0x8c, 0x19, 0x04, 0x63, 0x2a, 0xdc, 0xe3, 0x31, 0xce, 0x9f, - 0x1f, 0xa6, 0x1d, 0xfc, 0x02, 0x74, 0x00, 0x87, 0x37, 0x70, 0x73, 0xbf, 0x28, 0x65, 0x94, 0x77, 0x38, 0x73, 0xfb, - 0xc1, 0x73, 0x97, 0xf4, 0x3c, 0x68, 0xb7, 0xf7, 0x6a, 0xe6, 0xc5, 0xaf, 0xa2, 0x31, 0x43, 0x40, 0x87, 0x69, 0x04, - 0xde, 0x9a, 0x52, 0x18, 0x1e, 0x8c, 0xc2, 0x63, 0x96, 0x22, 0xf3, 0xec, 0x43, 0xd1, 0xb5, 0x5c, 0xe4, 0x3e, 0x7f, - 0xbc, 0x6f, 0xc0, 0x49, 0x6b, 0x5e, 0x69, 0xb1, 0x68, 0x7c, 0xa9, 0x1b, 0x5f, 0xc9, 0xbb, 0xf5, 0x95, 0x17, 0xc7, - 0x3e, 0x8b, 0x15, 0xed, 0xbb, 0x5f, 0x74, 0x79, 0xd3, 0x96, 0x14, 0x3a, 0x5c, 0xcb, 0xac, 0x60, 0x34, 0xba, 0x89, - 0xcf, 0x82, 0xb1, 0xab, 0x8e, 0xa8, 0x61, 0xae, 0xbc, 0x69, 0x77, 0x6c, 0xdb, 0xe6, 0x0a, 0x53, 0x87, 0x7e, 0x82, - 0xc2, 0x14, 0x7e, 0xc2, 0x43, 0x49, 0xbc, 0xd8, 0x21, 0x2e, 0xa2, 0x46, 0xce, 0x1a, 0x21, 0x7c, 0x47, 0xf1, 0x7c, + 0xee, 0xea, 0x80, 0x6d, 0x44, 0xaf, 0xd5, 0x8f, 0x9d, 0x82, 0x97, 0x4f, 0x17, 0x5d, 0x7c, 0x8c, 0x41, 0xc2, 0xd2, + 0x53, 0x28, 0x74, 0x1f, 0xaf, 0xf7, 0xaa, 0x15, 0xb3, 0x01, 0xf8, 0x3f, 0x4b, 0x80, 0x47, 0x25, 0xc0, 0xfd, 0xe4, + 0x3a, 0x0a, 0x1f, 0x02, 0xf9, 0xcf, 0x20, 0xfc, 0xf9, 0xcd, 0xa0, 0xe3, 0xe7, 0x36, 0x60, 0xc7, 0xd2, 0x2a, 0xf0, + 0x58, 0x58, 0x85, 0xbe, 0x57, 0x2f, 0xab, 0xaf, 0x10, 0x5a, 0xa4, 0xb1, 0x8c, 0x08, 0xad, 0x02, 0x7a, 0x15, 0x05, + 0x74, 0x5c, 0x15, 0x92, 0xeb, 0x87, 0x93, 0xd8, 0x8b, 0xd9, 0xb8, 0xf9, 0x0a, 0x50, 0xb2, 0x4e, 0xbe, 0xb3, 0x92, + 0xe5, 0x62, 0x11, 0xc5, 0x69, 0x72, 0x8d, 0x71, 0x5a, 0xe6, 0x3e, 0x5c, 0x28, 0x20, 0xa3, 0x58, 0x1e, 0xb5, 0xf7, + 0xac, 0x4e, 0xbe, 0x6d, 0x30, 0xb7, 0x9c, 0x6c, 0x83, 0x7b, 0xdf, 0x18, 0xdc, 0x7f, 0x67, 0x26, 0xe9, 0x2f, 0x66, + 0x56, 0x1a, 0xfb, 0x73, 0x4d, 0x37, 0x1c, 0x5b, 0xd7, 0x85, 0x7c, 0x65, 0xe6, 0xf6, 0xf7, 0x28, 0xda, 0xf0, 0x4c, + 0x87, 0xa8, 0x85, 0xe8, 0xd1, 0x02, 0xb6, 0x72, 0x2f, 0x97, 0x93, 0x09, 0x8b, 0x35, 0x11, 0x96, 0x11, 0xe2, 0xc2, + 0x92, 0x31, 0x20, 0xf8, 0x39, 0x7e, 0xf0, 0xd9, 0x0a, 0xf2, 0x3f, 0x15, 0x61, 0xd5, 0xc1, 0xd7, 0x93, 0xcc, 0xc9, + 0x21, 0xb7, 0x5c, 0xda, 0x6e, 0x69, 0xe3, 0x67, 0x07, 0xc6, 0x0c, 0x82, 0x31, 0x15, 0xee, 0xf1, 0x18, 0xe7, 0xcf, + 0x0f, 0xd3, 0x0e, 0x7e, 0x01, 0x3a, 0x80, 0xc3, 0x1b, 0xb8, 0xb9, 0x5f, 0x94, 0x32, 0xca, 0x3b, 0x9c, 0xb9, 0xfd, + 0xe0, 0xb9, 0x4b, 0x7a, 0x1e, 0xb4, 0xdb, 0x7b, 0x35, 0xf3, 0xe2, 0x57, 0xd1, 0x98, 0x21, 0xa0, 0xc3, 0x34, 0x02, + 0x6f, 0x4d, 0x29, 0x0c, 0x0f, 0x46, 0xe1, 0x31, 0x4b, 0x91, 0x79, 0xf6, 0xa1, 0xe8, 0x5a, 0x2e, 0x72, 0x9f, 0x3f, + 0xde, 0x37, 0xe0, 0xa4, 0xd5, 0xaf, 0xb4, 0x58, 0x34, 0xbe, 0xd4, 0xb5, 0xaf, 0xe4, 0xdd, 0xfa, 0xca, 0x8b, 0x63, + 0x9f, 0xc5, 0x8a, 0xf6, 0xdd, 0xaf, 0xba, 0xbc, 0x69, 0x4b, 0x0a, 0x1d, 0xae, 0x65, 0x56, 0x30, 0x1a, 0xdd, 0xc4, + 0x67, 0xc1, 0xd8, 0x55, 0x47, 0xd4, 0x30, 0x57, 0xde, 0xb4, 0x3b, 0xb6, 0x6d, 0x73, 0x85, 0xa9, 0x43, 0x3f, 0x41, + 0x61, 0x0a, 0x3f, 0xe1, 0xa1, 0x24, 0x5e, 0xec, 0x10, 0x17, 0xb1, 0x41, 0xce, 0x6a, 0x21, 0x7c, 0x47, 0xf1, 0x7c, 0x1e, 0x02, 0x1b, 0x8f, 0xfb, 0x23, 0x40, 0x73, 0x04, 0x58, 0x05, 0x4c, 0x15, 0x80, 0x0e, 0x1f, 0x02, 0xd0, 0x85, - 0x3f, 0xf7, 0xc3, 0x69, 0xb2, 0x11, 0x22, 0x54, 0x9b, 0x96, 0xe0, 0x49, 0xa9, 0x85, 0xaa, 0xe0, 0x1a, 0xce, 0xa2, - 0x00, 0xf2, 0x10, 0xa9, 0xcc, 0x9a, 0x5a, 0xca, 0x0b, 0xdb, 0xb6, 0x0d, 0xf3, 0x00, 0x32, 0xfe, 0x1d, 0x1e, 0xd9, - 0x86, 0x09, 0x7f, 0x59, 0x96, 0xd5, 0x20, 0x8f, 0xed, 0xcd, 0xfd, 0xd0, 0xa4, 0xc7, 0x96, 0xbd, 0x1b, 0xbc, 0xf7, - 0x5a, 0xf5, 0x26, 0x5c, 0x37, 0x36, 0xcc, 0x5d, 0x47, 0xb5, 0xa1, 0x9b, 0x94, 0x6d, 0xdd, 0x2c, 0x0a, 0xb8, 0xc4, - 0xe3, 0x61, 0x54, 0x88, 0xd1, 0xb0, 0xfc, 0x16, 0xd9, 0xd2, 0xb8, 0x9a, 0xc7, 0x42, 0xfd, 0x9e, 0x83, 0xd5, 0x55, - 0x5e, 0x45, 0xcb, 0x60, 0x8c, 0xe6, 0x50, 0x60, 0xbb, 0xac, 0x14, 0x56, 0xa1, 0x95, 0x64, 0x53, 0x90, 0x4b, 0x1c, - 0x13, 0xad, 0xbd, 0x47, 0xe2, 0x14, 0xc5, 0xda, 0x53, 0x9c, 0xe2, 0xcb, 0xa6, 0x2d, 0x78, 0xf5, 0x14, 0xe2, 0x09, - 0xed, 0xd0, 0x80, 0xef, 0x0b, 0xa8, 0x1f, 0xec, 0x52, 0x5f, 0xac, 0xdb, 0xd5, 0x53, 0x0a, 0x3a, 0xeb, 0x7d, 0xfa, - 0xb4, 0x37, 0xfa, 0xf4, 0x69, 0xaf, 0x96, 0xa9, 0x63, 0xf3, 0x08, 0x69, 0x63, 0x30, 0x1e, 0x62, 0x04, 0xe2, 0x06, - 0x11, 0xd0, 0xdf, 0x43, 0x79, 0xd7, 0xe3, 0xd1, 0xaa, 0xe8, 0x69, 0x64, 0xf0, 0x0f, 0xd2, 0x63, 0x90, 0x55, 0x26, - 0x65, 0xe6, 0x7a, 0x24, 0xe6, 0xf9, 0xf4, 0x89, 0x1f, 0x37, 0x63, 0xec, 0x8e, 0xf2, 0x22, 0x47, 0x35, 0x96, 0x6e, - 0x90, 0x3f, 0xaa, 0x08, 0xf2, 0x92, 0x63, 0xcc, 0x02, 0xe2, 0x95, 0x17, 0x87, 0x32, 0xc0, 0x3f, 0x46, 0x0a, 0xff, - 0xac, 0xc2, 0x23, 0xa2, 0x8e, 0xab, 0xab, 0x31, 0x71, 0x99, 0xb6, 0x24, 0x1c, 0x28, 0x2c, 0xdd, 0xa4, 0x0e, 0x2e, - 0x04, 0xb6, 0xc7, 0xb4, 0xa8, 0x62, 0x80, 0xe8, 0x5f, 0x8d, 0x27, 0x77, 0x2c, 0x86, 0xf5, 0xce, 0x5b, 0x75, 0x97, - 0xe2, 0xe1, 0x8c, 0x4c, 0xe2, 0xbb, 0x93, 0xdc, 0x6f, 0x79, 0x41, 0x5e, 0x87, 0x53, 0xf7, 0xdb, 0x58, 0x5b, 0x18, - 0xa9, 0xa1, 0x0a, 0x32, 0xa2, 0xea, 0xc6, 0xbc, 0x29, 0xc0, 0x6a, 0x6f, 0xce, 0xc3, 0xcd, 0x68, 0x62, 0x2b, 0x5c, - 0x4f, 0xd0, 0x57, 0x21, 0x1c, 0xdd, 0x61, 0x00, 0xe5, 0xe2, 0x3d, 0x81, 0x72, 0xcd, 0xb3, 0xef, 0x8d, 0xe5, 0x57, - 0xb0, 0xe0, 0xaa, 0x31, 0xd1, 0x0d, 0xf2, 0x01, 0x98, 0x7e, 0x49, 0x73, 0x7f, 0x8a, 0xa9, 0x3c, 0x97, 0xc2, 0xbd, - 0x0a, 0x07, 0x80, 0xeb, 0x8a, 0x03, 0x40, 0xc3, 0x7c, 0x2a, 0x31, 0x4b, 0x16, 0x51, 0x08, 0x77, 0xc5, 0xeb, 0xc2, - 0xc3, 0xeb, 0xba, 0xee, 0xe1, 0xd5, 0xd0, 0x14, 0xdf, 0x50, 0x3b, 0x50, 0x49, 0x5f, 0xfc, 0xa5, 0x62, 0xa1, 0x2f, - 0x48, 0x3d, 0x66, 0x29, 0x3f, 0xdb, 0xe4, 0xd9, 0xfd, 0xfd, 0xfd, 0x9e, 0xdd, 0xe7, 0x3b, 0x79, 0x76, 0x7f, 0xff, + 0x3f, 0xf7, 0xc3, 0x69, 0xd2, 0x08, 0x11, 0xaa, 0x4d, 0x4b, 0xf0, 0xa4, 0xd4, 0x42, 0x55, 0x70, 0x0d, 0x67, 0x51, + 0x00, 0x79, 0x88, 0x54, 0x66, 0x4d, 0x2d, 0xe5, 0x85, 0x6d, 0xdb, 0x86, 0x79, 0x00, 0x19, 0xff, 0x0e, 0x8f, 0x6c, + 0xc3, 0x84, 0xbf, 0x2c, 0xcb, 0xaa, 0x91, 0xc7, 0xf6, 0xe6, 0x7e, 0x68, 0xd2, 0x63, 0xcb, 0xde, 0x0d, 0xde, 0x7b, + 0xad, 0x7a, 0x13, 0xae, 0x1b, 0x1b, 0xe6, 0xae, 0xa3, 0xda, 0xd0, 0x4d, 0xca, 0xb6, 0x6e, 0x16, 0x05, 0x5c, 0xe2, + 0xf1, 0x30, 0x2a, 0xc4, 0x68, 0x58, 0x7e, 0x8b, 0x6c, 0x69, 0x5c, 0xcd, 0x63, 0xa1, 0x7e, 0xcf, 0xc1, 0xea, 0x2a, + 0xaf, 0xa2, 0x65, 0x30, 0x46, 0x73, 0x28, 0xb0, 0x5d, 0x56, 0x0a, 0xab, 0xd0, 0x4a, 0xb2, 0x29, 0xc8, 0x25, 0x8e, + 0x89, 0xd6, 0xde, 0x23, 0x71, 0x8a, 0x62, 0xed, 0x29, 0x4e, 0xf1, 0x65, 0xdd, 0x16, 0xbc, 0x7a, 0x0a, 0xf1, 0x84, + 0x76, 0x68, 0xc0, 0xf7, 0x05, 0xd4, 0x0f, 0x76, 0xa9, 0x2f, 0xd6, 0xed, 0xea, 0x29, 0x05, 0x9d, 0xf5, 0x3e, 0x7d, + 0xda, 0x1b, 0x7d, 0xfa, 0xb4, 0xb7, 0x91, 0xa9, 0xa3, 0x79, 0x84, 0xb4, 0x31, 0x18, 0x0f, 0x31, 0x02, 0x71, 0x83, + 0x08, 0xe8, 0xef, 0xa1, 0xbc, 0xeb, 0xf1, 0x68, 0x55, 0xf4, 0x34, 0x32, 0xf8, 0x07, 0xe9, 0x31, 0xc8, 0x2a, 0x93, + 0x32, 0x73, 0x3d, 0x12, 0xf3, 0x7c, 0xfa, 0xc4, 0x8f, 0x9b, 0x31, 0x76, 0x47, 0x79, 0x91, 0xa3, 0x1a, 0x4b, 0x37, + 0xc8, 0x1f, 0x55, 0x04, 0x79, 0xc9, 0x31, 0x66, 0x01, 0xf1, 0xca, 0x8b, 0x43, 0x19, 0xe0, 0x9f, 0x22, 0x85, 0x7f, + 0x56, 0xe1, 0x11, 0x51, 0xc7, 0xd5, 0xd5, 0x98, 0xb8, 0x4c, 0x5b, 0x12, 0x0e, 0x14, 0x96, 0x6e, 0x52, 0x07, 0x17, + 0x02, 0xdb, 0x63, 0x5a, 0x54, 0x31, 0x40, 0xf4, 0xaf, 0xc6, 0x93, 0x3b, 0x16, 0xc3, 0x7a, 0xe7, 0xad, 0xba, 0x4b, + 0xf1, 0x70, 0x46, 0x26, 0xf1, 0xdd, 0x49, 0xee, 0xb7, 0xbc, 0x20, 0xaf, 0xc3, 0xa9, 0xfb, 0x6d, 0xac, 0x2d, 0x8c, + 0xd4, 0x50, 0x05, 0x19, 0x51, 0x75, 0x63, 0x5e, 0x17, 0x60, 0xb5, 0x37, 0xe7, 0xe1, 0x66, 0x34, 0xb1, 0x15, 0xae, + 0x27, 0xe8, 0xab, 0x10, 0x8e, 0xee, 0x30, 0x80, 0x72, 0xf1, 0x9e, 0x40, 0xb9, 0xe6, 0xd9, 0xf7, 0xc6, 0xf2, 0x2b, + 0x58, 0x70, 0xd5, 0x98, 0xe8, 0x06, 0xf9, 0x00, 0x4c, 0xbf, 0xa4, 0xb9, 0x3f, 0xc5, 0x54, 0x9e, 0x4b, 0xe1, 0x5e, + 0x85, 0x03, 0xc0, 0x75, 0xc5, 0x01, 0xa0, 0x66, 0x3e, 0x95, 0x98, 0x25, 0x8b, 0x28, 0x84, 0xbb, 0xe2, 0x75, 0xe1, + 0xe1, 0x75, 0xbd, 0xe9, 0xe1, 0x55, 0xd3, 0x14, 0xdf, 0x50, 0x3b, 0x50, 0x49, 0x5f, 0xfc, 0x57, 0xc5, 0x42, 0x5f, + 0x90, 0x7a, 0xcc, 0x52, 0x7e, 0xd6, 0xe4, 0xd9, 0xfd, 0xfd, 0xfd, 0x9e, 0xdd, 0xe7, 0x3b, 0x79, 0x76, 0x7f, 0xff, 0xc5, 0x3d, 0xbb, 0xcf, 0x64, 0xcf, 0x6e, 0x20, 0xc1, 0x67, 0x6c, 0x27, 0x47, 0x5a, 0xe1, 0xd2, 0x12, 0xad, 0x12, - 0xd7, 0xe1, 0x9a, 0xb5, 0x64, 0x34, 0x63, 0x60, 0xaa, 0xc0, 0x59, 0xdd, 0x20, 0x9a, 0x82, 0xbf, 0xeb, 0x66, 0x8f, - 0xd6, 0x2f, 0xe5, 0xcf, 0x1a, 0x44, 0x53, 0x55, 0xca, 0xd3, 0x16, 0x8a, 0x3c, 0x6d, 0x10, 0x9b, 0xee, 0xef, 0xb7, - 0xce, 0xcb, 0x4b, 0xa7, 0xd7, 0x76, 0x20, 0xce, 0x29, 0x68, 0x9f, 0xb1, 0xc0, 0xee, 0xb5, 0xdb, 0x50, 0xb0, 0x92, - 0x0a, 0x5a, 0x50, 0xe0, 0x4b, 0x05, 0x87, 0x50, 0x30, 0x92, 0x0a, 0x8e, 0xa0, 0x60, 0x2c, 0x15, 0x1c, 0x43, 0xc1, - 0x8d, 0x9a, 0x5d, 0x86, 0xb9, 0xdf, 0xfa, 0xb1, 0x7e, 0x55, 0x4a, 0xd1, 0x99, 0x9b, 0x4a, 0x88, 0x2a, 0xc7, 0x86, - 0xc8, 0x17, 0x61, 0x1e, 0xe8, 0x9c, 0x47, 0x1b, 0x7c, 0x35, 0x00, 0xcc, 0x0b, 0x96, 0x23, 0x06, 0xd8, 0xdd, 0x50, - 0xcd, 0xb6, 0x78, 0xad, 0x76, 0x73, 0x3f, 0x6f, 0xdb, 0x68, 0x09, 0xbf, 0xe9, 0x2e, 0x46, 0xf1, 0x10, 0x95, 0x0f, - 0x9f, 0xcf, 0xf2, 0xe0, 0xd1, 0x4b, 0xb7, 0x08, 0x86, 0xd3, 0x86, 0x14, 0x3a, 0x9c, 0x57, 0x63, 0x1a, 0xd8, 0xcb, - 0x40, 0xac, 0x13, 0x71, 0x8a, 0xc4, 0x07, 0x14, 0x74, 0x86, 0xef, 0x79, 0x05, 0x0f, 0xc7, 0x43, 0xad, 0x13, 0xf4, - 0xf3, 0x3c, 0x82, 0x35, 0xe9, 0x52, 0x97, 0x46, 0xea, 0x4d, 0xbb, 0x33, 0x83, 0x0c, 0xa9, 0xba, 0x53, 0x48, 0x49, - 0x72, 0x3a, 0xee, 0x2e, 0x8c, 0xd5, 0x8c, 0x85, 0xdd, 0x09, 0x77, 0x3b, 0x84, 0xf5, 0x27, 0x4f, 0x92, 0xb9, 0x2e, - 0x5c, 0xa0, 0x70, 0x4f, 0x14, 0x6f, 0x09, 0x4a, 0x33, 0xdf, 0x4a, 0x85, 0xf7, 0x8e, 0x26, 0x1b, 0x59, 0x7d, 0x09, - 0x5f, 0x8b, 0xd7, 0x6c, 0xb8, 0x9c, 0x2a, 0xe7, 0xd1, 0xf4, 0x5e, 0xbf, 0x0a, 0xf9, 0x15, 0x40, 0xa9, 0x92, 0x35, - 0xa9, 0x29, 0xb6, 0x37, 0xff, 0x16, 0x3d, 0x66, 0xe5, 0xfa, 0x29, 0xc0, 0xa6, 0xa4, 0xc4, 0x36, 0xc0, 0x77, 0x60, - 0xb6, 0x25, 0xcf, 0x85, 0x73, 0x98, 0x3f, 0xe9, 0xf9, 0xc2, 0x93, 0xe0, 0xe9, 0xff, 0xc0, 0x92, 0xc4, 0x9b, 0x32, - 0x19, 0xb5, 0x94, 0x3a, 0x07, 0x2c, 0x98, 0xab, 0x93, 0x71, 0x02, 0x81, 0xb1, 0xf7, 0x6b, 0xfe, 0x28, 0xe0, 0x32, + 0xd7, 0xe1, 0x9a, 0xb5, 0x64, 0x34, 0x63, 0x60, 0xaa, 0xc0, 0x59, 0xdd, 0x20, 0x9a, 0x82, 0xbf, 0x6b, 0xb3, 0x47, + 0xeb, 0x97, 0xf2, 0x67, 0x0d, 0xa2, 0xa9, 0x2a, 0xe5, 0x69, 0x0b, 0x45, 0x9e, 0x36, 0x88, 0x4d, 0xf7, 0xb7, 0x5b, + 0xe7, 0xe5, 0xa5, 0xd3, 0x6b, 0x3b, 0x10, 0xe7, 0x14, 0xb4, 0xcf, 0x58, 0x60, 0xf7, 0xda, 0x6d, 0x28, 0x58, 0x49, + 0x05, 0x2d, 0x28, 0xf0, 0xa5, 0x82, 0x43, 0x28, 0x18, 0x49, 0x05, 0x47, 0x50, 0x30, 0x96, 0x0a, 0x8e, 0xa1, 0xe0, + 0x46, 0xcd, 0x2e, 0xc3, 0xdc, 0x6f, 0xfd, 0x58, 0xbf, 0x2a, 0xa5, 0xe8, 0xcc, 0x4d, 0x25, 0x44, 0x95, 0x63, 0x43, + 0xe4, 0x8b, 0x30, 0x0f, 0x74, 0xce, 0xa3, 0x0d, 0xbe, 0x1a, 0x00, 0xe6, 0x05, 0xcb, 0x11, 0x03, 0xec, 0x6e, 0xa8, + 0x66, 0x5b, 0xbc, 0x56, 0xbb, 0xb9, 0x9f, 0xb7, 0x6d, 0xb4, 0x84, 0xdf, 0x74, 0x17, 0xa3, 0x78, 0x88, 0xca, 0x87, + 0xcf, 0x67, 0x79, 0xf0, 0xe8, 0xa5, 0x5b, 0x04, 0xc3, 0x69, 0x43, 0x0a, 0x1d, 0xce, 0xab, 0x31, 0x0d, 0xec, 0x65, + 0x20, 0xd6, 0x89, 0x38, 0x45, 0xe2, 0x03, 0x0a, 0x3a, 0xc3, 0xf7, 0xbc, 0x82, 0x87, 0xe3, 0xa1, 0xd6, 0x09, 0xfa, + 0x79, 0x1e, 0xc1, 0x9a, 0x74, 0xa9, 0x4b, 0x23, 0xf5, 0xa6, 0xdd, 0x99, 0x41, 0x86, 0x54, 0xdd, 0x29, 0xa4, 0x24, + 0x39, 0x1d, 0x77, 0x17, 0xc6, 0x6a, 0xc6, 0xc2, 0xee, 0x84, 0xbb, 0x1d, 0xc2, 0xfa, 0x93, 0x27, 0xc9, 0x5c, 0x17, + 0x2e, 0x50, 0xb8, 0x27, 0x8a, 0xb7, 0x04, 0xa5, 0x99, 0x6f, 0xa5, 0xc2, 0x7b, 0x47, 0x93, 0x8d, 0xac, 0xbe, 0x84, + 0xaf, 0xc5, 0x6b, 0x36, 0x5c, 0x4e, 0x95, 0xf3, 0x68, 0x7a, 0xaf, 0x5f, 0x85, 0xfc, 0x0a, 0xa0, 0x54, 0xc9, 0x9a, + 0xd4, 0x14, 0xdb, 0x9b, 0x7f, 0x8b, 0x1e, 0xb3, 0x72, 0xfd, 0x14, 0x60, 0x53, 0x52, 0x62, 0x1b, 0xe0, 0x3b, 0x30, + 0xdb, 0x92, 0xe7, 0xc2, 0x39, 0xcc, 0x9f, 0xf4, 0x7c, 0xe1, 0x49, 0xf0, 0xf4, 0x7f, 0x64, 0x49, 0xe2, 0x4d, 0x99, + 0x8c, 0x5a, 0x4a, 0x9d, 0x03, 0x16, 0xcc, 0xd5, 0xc9, 0x38, 0x81, 0xc0, 0xd8, 0xfb, 0x1b, 0xfe, 0x28, 0xe0, 0x32, 0x0b, 0x7e, 0x5a, 0xb0, 0x68, 0x85, 0xf3, 0x86, 0x6f, 0xc1, 0xf2, 0x94, 0xfd, 0x28, 0x00, 0x89, 0xdc, 0xb0, 0xa0, 0x5a, 0x98, 0x7a, 0xd3, 0x6a, 0x11, 0xad, 0x75, 0x56, 0x42, 0x7b, 0x7a, 0xe9, 0x51, 0xe0, 0xc2, 0xcf, 0xb0, 0xcb, - 0x0f, 0xa2, 0xe9, 0x6f, 0x6a, 0x94, 0xbf, 0xc5, 0x99, 0xe2, 0x87, 0xd0, 0x08, 0xd3, 0x81, 0x85, 0x73, 0xac, 0x58, + 0x0f, 0xa2, 0xe9, 0xef, 0x6a, 0x94, 0xbf, 0xc5, 0x99, 0xe2, 0xc7, 0xd0, 0x08, 0xd3, 0x81, 0x85, 0x73, 0xac, 0x58, 0x30, 0x85, 0xdd, 0x30, 0x9d, 0x99, 0x18, 0x58, 0x4e, 0x6b, 0x85, 0xba, 0x61, 0xe1, 0xda, 0xae, 0xab, 0xe1, 0x34, 0xbb, 0xf1, 0x74, 0xe8, 0x69, 0x4e, 0xeb, 0xd8, 0x10, 0x7f, 0x2c, 0xfb, 0x50, 0xcf, 0xb0, 0x07, 0x65, 0xec, 0xdf, 0xac, 0x27, 0x51, 0x98, 0x9a, 0x13, 0x6f, 0xee, 0x07, 0x77, 0xdd, 0x79, 0x14, 0x46, 0xc9, 0xc2, 0x1b, 0xb1, 0x9e, 0xc4, 0x8f, 0x62, 0xa0, 0x66, 0x1e, 0x2b, 0xd0, 0xb1, 0x5a, 0x31, 0x9b, 0x53, 0xeb, 0x3c, 0x0e, 0xf3, 0x24, 0x60, 0xb7, 0x19, 0xff, 0x7c, 0xa9, 0x32, 0x55, 0xc5, 0x2d, 0x47, 0x2d, 0x80, 0x65, 0xe6, 0x41, 0x9e, 0x21, 0xb5, 0x41, - 0x8f, 0x4b, 0x1d, 0xbb, 0x56, 0xeb, 0x30, 0x66, 0x73, 0xc5, 0x3a, 0xdc, 0xd8, 0x79, 0x1c, 0xad, 0xfa, 0x00, 0x2d, - 0x36, 0x36, 0x13, 0x16, 0x4c, 0xf0, 0x8d, 0x89, 0x71, 0xa5, 0x44, 0x3f, 0x26, 0xda, 0x15, 0x40, 0x6f, 0x6c, 0xde, - 0x83, 0xd7, 0xdd, 0x96, 0x62, 0x4b, 0xfc, 0xf4, 0xb1, 0xbd, 0x90, 0xfa, 0x92, 0xe7, 0x4f, 0x5f, 0x63, 0x75, 0x47, - 0xb1, 0x7b, 0xa0, 0x3f, 0x9e, 0x04, 0xd1, 0xaa, 0x3b, 0xf3, 0xc7, 0x63, 0x16, 0xf6, 0x10, 0xe6, 0xbc, 0x90, 0x05, - 0x81, 0xbf, 0x48, 0xfc, 0xa4, 0x37, 0xf7, 0x6e, 0x79, 0xaf, 0x07, 0x9b, 0x7a, 0x6d, 0xf3, 0x5e, 0xdb, 0x3b, 0xf7, - 0x2a, 0x75, 0x03, 0x31, 0xac, 0xa8, 0x1f, 0x0e, 0xda, 0xa1, 0x62, 0x57, 0xc6, 0xb9, 0x73, 0xaf, 0x8b, 0x98, 0xad, - 0xe7, 0x5e, 0x3c, 0xf5, 0xc3, 0xae, 0x9d, 0x59, 0x37, 0x6b, 0xda, 0x18, 0x8f, 0x3a, 0x9d, 0x4e, 0x66, 0x8d, 0xc5, - 0x93, 0x3d, 0x1e, 0x67, 0xd6, 0x48, 0x3c, 0x4d, 0x26, 0xb6, 0x3d, 0x99, 0x64, 0x96, 0x2f, 0x0a, 0xda, 0xad, 0xd1, - 0xb8, 0xdd, 0xca, 0xac, 0x95, 0x54, 0x23, 0xb3, 0x18, 0x7f, 0x8a, 0xd9, 0xb8, 0x87, 0x1b, 0x89, 0xfb, 0x3f, 0x1f, - 0xdb, 0x76, 0x86, 0x18, 0xe0, 0xb2, 0x84, 0x9b, 0xd0, 0x74, 0xe5, 0x6a, 0xbd, 0x73, 0x4d, 0xa5, 0xf8, 0xdc, 0x68, - 0xd4, 0x58, 0x6f, 0xec, 0xc5, 0x1f, 0xaf, 0x14, 0x69, 0x14, 0x9e, 0x47, 0xd5, 0xd6, 0x62, 0x1a, 0xcc, 0xdb, 0x2e, - 0x24, 0xec, 0xe8, 0x0d, 0xa3, 0x18, 0xce, 0x6c, 0xec, 0x8d, 0xfd, 0x65, 0xd2, 0x75, 0x5a, 0x8b, 0x5b, 0x51, 0xc4, - 0xf7, 0x7a, 0x51, 0x80, 0x67, 0xaf, 0x9b, 0x44, 0x81, 0x3f, 0x16, 0x45, 0x9b, 0xce, 0x92, 0xd3, 0xd2, 0x7b, 0xc8, - 0xbf, 0xfa, 0x18, 0x74, 0xd9, 0x0b, 0x02, 0xc5, 0x6a, 0x27, 0x0a, 0xf3, 0x12, 0x34, 0x97, 0x53, 0xec, 0x84, 0xe6, - 0x05, 0x43, 0xd3, 0x3a, 0x07, 0x8b, 0xdb, 0x7c, 0xcf, 0x3b, 0x47, 0x8b, 0xdb, 0xec, 0xeb, 0x39, 0x1b, 0xfb, 0x9e, - 0xa2, 0x15, 0xbb, 0xc9, 0xb1, 0xc1, 0xa4, 0x4e, 0x5f, 0x6f, 0xd8, 0xa6, 0xe2, 0x58, 0x40, 0x62, 0xa3, 0x3d, 0x7f, - 0x0e, 0x72, 0x18, 0x2f, 0x4c, 0xb3, 0x6c, 0x70, 0x95, 0x65, 0xbd, 0x73, 0x5f, 0xbb, 0xfc, 0xab, 0x46, 0xb4, 0x90, - 0x4c, 0x50, 0x33, 0xfd, 0xca, 0x38, 0x63, 0xb2, 0xbb, 0x0c, 0x90, 0x31, 0x74, 0x95, 0x91, 0x2b, 0x13, 0xbd, 0xad, - 0x57, 0xa6, 0x49, 0xce, 0xab, 0x93, 0xf7, 0x4d, 0xb9, 0x0a, 0x52, 0x20, 0xa8, 0x70, 0xc6, 0xdc, 0x73, 0xc9, 0xf7, - 0x06, 0x98, 0x1e, 0xac, 0x4c, 0x51, 0x85, 0x5e, 0x6f, 0xe2, 0x3d, 0x2f, 0xee, 0xe7, 0x3d, 0xff, 0x96, 0xee, 0xc2, - 0x7b, 0x5e, 0x7c, 0x71, 0xde, 0xf3, 0x75, 0x3d, 0xaa, 0xd0, 0x45, 0xe4, 0xaa, 0xb9, 0xc1, 0x24, 0x90, 0xa6, 0x98, - 0xe2, 0xf5, 0xbf, 0x4e, 0x7f, 0x6d, 0x78, 0x17, 0xd1, 0x1b, 0x12, 0x05, 0xce, 0xa7, 0x82, 0x98, 0xf5, 0x6d, 0xe8, - 0xfe, 0x29, 0x96, 0x9f, 0x27, 0x13, 0xf7, 0x75, 0x24, 0x15, 0xe4, 0x4f, 0xdc, 0x97, 0xa4, 0x14, 0x5b, 0x99, 0xde, - 0xe4, 0xde, 0x3e, 0x90, 0x7d, 0x1a, 0x42, 0xb3, 0x92, 0x6b, 0xf7, 0x38, 0xf7, 0xb9, 0xeb, 0x95, 0x41, 0xd0, 0x72, - 0x27, 0x57, 0x11, 0x80, 0xab, 0x66, 0x19, 0x35, 0x65, 0x42, 0x06, 0xf0, 0xf2, 0xee, 0xfb, 0xb1, 0x76, 0x11, 0xe9, - 0x99, 0x9f, 0xbc, 0xad, 0x86, 0xbf, 0x12, 0x7a, 0x2e, 0x79, 0x38, 0x19, 0xf7, 0x9b, 0x93, 0xa2, 0xdc, 0xe2, 0x6b, - 0x6a, 0x7e, 0x5a, 0x1a, 0x69, 0x57, 0x6e, 0xd8, 0xa3, 0x98, 0xdf, 0x35, 0x62, 0xcc, 0xc3, 0xc4, 0xac, 0x39, 0x97, + 0x8f, 0x4b, 0x1d, 0xbb, 0x56, 0xeb, 0x30, 0x66, 0x73, 0xc5, 0x3a, 0x6c, 0xec, 0x3c, 0x8e, 0x56, 0x7d, 0x80, 0x16, + 0x1b, 0x9b, 0x09, 0x0b, 0x26, 0xf8, 0xc6, 0xc4, 0xb8, 0x52, 0xa2, 0x1f, 0x13, 0xed, 0x0a, 0xa0, 0x37, 0x36, 0xef, + 0xc1, 0xeb, 0x6e, 0x4b, 0xb1, 0x25, 0x7e, 0xfa, 0xd8, 0x5e, 0x48, 0x7d, 0xc9, 0xf3, 0xa7, 0xaf, 0xb1, 0xba, 0xa3, + 0xd8, 0x3d, 0xd0, 0x1f, 0x4f, 0x82, 0x68, 0xd5, 0x9d, 0xf9, 0xe3, 0x31, 0x0b, 0x7b, 0x08, 0x73, 0x5e, 0xc8, 0x82, + 0xc0, 0x5f, 0x24, 0x7e, 0xd2, 0x9b, 0x7b, 0xb7, 0xbc, 0xd7, 0x83, 0xa6, 0x5e, 0xdb, 0xbc, 0xd7, 0xf6, 0xce, 0xbd, + 0x4a, 0xdd, 0x40, 0x0c, 0x2b, 0xea, 0x87, 0x83, 0x76, 0xa8, 0xd8, 0x95, 0x71, 0xee, 0xdc, 0xeb, 0x22, 0x66, 0xeb, + 0xb9, 0x17, 0x4f, 0xfd, 0xb0, 0x6b, 0x67, 0xd6, 0xcd, 0x9a, 0x36, 0xc6, 0xa3, 0x4e, 0xa7, 0x93, 0x59, 0x63, 0xf1, + 0x64, 0x8f, 0xc7, 0x99, 0x35, 0x12, 0x4f, 0x93, 0x89, 0x6d, 0x4f, 0x26, 0x99, 0xe5, 0x8b, 0x82, 0x76, 0x6b, 0x34, + 0x6e, 0xb7, 0x32, 0x6b, 0x25, 0xd5, 0xc8, 0x2c, 0xc6, 0x9f, 0x62, 0x36, 0xee, 0xe1, 0x46, 0xe2, 0xfe, 0xcf, 0xc7, + 0xb6, 0x9d, 0x21, 0x06, 0xb8, 0x2c, 0xe1, 0x26, 0x34, 0x5d, 0xb9, 0x5a, 0xef, 0x5c, 0x53, 0x29, 0x3e, 0x37, 0x1a, + 0xd5, 0xd6, 0x1b, 0x7b, 0xf1, 0xc7, 0x2b, 0x45, 0x1a, 0x85, 0xe7, 0x51, 0xb5, 0xb5, 0x98, 0x06, 0xf3, 0xb6, 0x0b, + 0x09, 0x3b, 0x7a, 0xc3, 0x28, 0x86, 0x33, 0x1b, 0x7b, 0x63, 0x7f, 0x99, 0x74, 0x9d, 0xd6, 0xe2, 0x56, 0x14, 0xf1, + 0xbd, 0x5e, 0x14, 0xe0, 0xd9, 0xeb, 0x26, 0x51, 0xe0, 0x8f, 0x45, 0x51, 0xd3, 0x59, 0x72, 0x5a, 0x7a, 0x0f, 0xf9, + 0x57, 0x1f, 0x83, 0x2e, 0x7b, 0x41, 0xa0, 0x58, 0xed, 0x44, 0x61, 0x5e, 0x82, 0xe6, 0x72, 0x8a, 0x9d, 0xd0, 0xbc, + 0x60, 0x68, 0x5a, 0xe7, 0x60, 0x71, 0x9b, 0xef, 0x79, 0xe7, 0x68, 0x71, 0x9b, 0x7d, 0x3d, 0x67, 0x63, 0xdf, 0x53, + 0xb4, 0x62, 0x37, 0x39, 0x36, 0x98, 0xd4, 0xe9, 0xeb, 0x86, 0x6d, 0x2a, 0x8e, 0x05, 0x24, 0x36, 0xda, 0xf3, 0xe7, + 0x20, 0x87, 0xf1, 0xc2, 0x34, 0xcb, 0x06, 0x57, 0x59, 0xd6, 0x3b, 0xf7, 0xb5, 0xcb, 0xff, 0xd6, 0x88, 0x16, 0x92, + 0x09, 0x6a, 0xa6, 0x5f, 0x19, 0x67, 0x4c, 0x76, 0x97, 0x01, 0x32, 0x86, 0xae, 0x32, 0x72, 0x65, 0xa2, 0xb7, 0x9b, + 0x95, 0x69, 0x92, 0xf3, 0xea, 0xe4, 0x7d, 0x53, 0xae, 0x82, 0x14, 0x08, 0x2a, 0x9c, 0x31, 0xf7, 0x5c, 0xf2, 0xbd, + 0x01, 0xa6, 0x07, 0x2b, 0x53, 0x54, 0xa1, 0xd7, 0x4d, 0xbc, 0xe7, 0xc5, 0xfd, 0xbc, 0xe7, 0x5f, 0xd3, 0x5d, 0x78, + 0xcf, 0x8b, 0x2f, 0xce, 0x7b, 0xbe, 0xde, 0x8c, 0x2a, 0x74, 0x11, 0xb9, 0x6a, 0x6e, 0x30, 0x09, 0xa4, 0x29, 0xa6, + 0x78, 0xfd, 0xaf, 0xd3, 0xdf, 0x1a, 0xde, 0x45, 0xf4, 0x86, 0x44, 0x81, 0xf3, 0xa9, 0x20, 0x66, 0x7d, 0x1b, 0xba, + 0x7f, 0x8e, 0xe5, 0xe7, 0xc9, 0xc4, 0x7d, 0x1d, 0x49, 0x05, 0xf9, 0x13, 0xf7, 0x25, 0x29, 0xc5, 0x56, 0xa6, 0x37, + 0xb9, 0xb7, 0x0f, 0x64, 0x9f, 0x86, 0xd0, 0xac, 0xe4, 0xda, 0x3d, 0xce, 0x7d, 0xee, 0x7a, 0x65, 0x10, 0xb4, 0xdc, + 0xc9, 0x55, 0x04, 0xe0, 0xda, 0xb0, 0x8c, 0x9a, 0x32, 0x21, 0x03, 0x78, 0x79, 0xf7, 0xfd, 0x58, 0xbb, 0x88, 0xf4, + 0xcc, 0x4f, 0xde, 0x56, 0xc3, 0x5f, 0x09, 0x3d, 0x97, 0x3c, 0x9c, 0x8c, 0xfb, 0xcd, 0x49, 0x51, 0x6e, 0xf1, 0x35, + 0x35, 0x3f, 0x2d, 0x8d, 0xb4, 0x2b, 0x37, 0xec, 0x51, 0xcc, 0xef, 0x0d, 0x62, 0xcc, 0xc3, 0xc4, 0xac, 0x39, 0x97, 0xb7, 0xc6, 0x67, 0x88, 0x1a, 0x3a, 0xa6, 0xe6, 0xfe, 0x38, 0xcb, 0xf4, 0x9e, 0x98, 0x08, 0x89, 0xd0, 0xb2, 0xfb, 0x98, 0xb8, 0xa4, 0x10, 0x02, 0x71, 0x89, 0x0f, 0x59, 0x33, 0x5f, 0x80, 0x7f, 0x00, 0xb7, 0x7d, 0xe6, 0x73, 0xa6, - 0x2a, 0x34, 0x7d, 0xe4, 0x37, 0x22, 0x0d, 0x08, 0x0c, 0xda, 0x65, 0x6f, 0xab, 0xd2, 0x82, 0xd4, 0x1d, 0x5b, 0x69, - 0x72, 0xd0, 0xc1, 0x01, 0x62, 0xfc, 0x0a, 0xb1, 0x10, 0xa1, 0x1d, 0x5e, 0x07, 0x1f, 0x32, 0x35, 0xe7, 0xfd, 0x70, - 0xfb, 0xf5, 0x4f, 0xf6, 0xa1, 0x41, 0xbf, 0xa2, 0x74, 0xbb, 0xc7, 0x2f, 0x13, 0x58, 0x89, 0x64, 0x65, 0x58, 0xc9, - 0x4a, 0x79, 0xb6, 0x16, 0xf1, 0xb1, 0x53, 0x6f, 0x61, 0x82, 0x96, 0x07, 0x71, 0x2f, 0xc7, 0x78, 0x52, 0x28, 0xee, - 0xde, 0x32, 0x01, 0xdc, 0x88, 0x72, 0x14, 0xc4, 0x3f, 0xbd, 0xd1, 0x32, 0x4e, 0xa2, 0xb8, 0xbb, 0x88, 0xfc, 0x30, - 0x65, 0x71, 0x46, 0x82, 0x15, 0x9c, 0x1f, 0x31, 0x3d, 0x57, 0xeb, 0x68, 0xe1, 0x8d, 0xfc, 0xf4, 0xae, 0x6b, 0x73, - 0x96, 0xc2, 0xee, 0x71, 0xee, 0xc0, 0x6e, 0xac, 0xdf, 0xe5, 0xb3, 0xf9, 0x1c, 0x19, 0xbf, 0xb8, 0xce, 0xce, 0xc8, - 0xdb, 0xbc, 0x27, 0xbd, 0xa5, 0x08, 0xe1, 0xc0, 0x7e, 0x78, 0xb1, 0x39, 0x05, 0x2c, 0x0f, 0x4b, 0x6d, 0x8f, 0xd9, - 0xd4, 0x40, 0xac, 0x0d, 0x66, 0x86, 0xe2, 0x8f, 0x75, 0xa8, 0x2b, 0x76, 0x73, 0x31, 0x70, 0x3c, 0xfa, 0x2e, 0x90, - 0x75, 0xbd, 0x49, 0xca, 0x62, 0x63, 0x97, 0x9a, 0x43, 0x36, 0x89, 0x62, 0x46, 0xd9, 0xe4, 0x9c, 0xce, 0xe2, 0x76, - 0xf7, 0xee, 0xb7, 0x0f, 0xbf, 0xb9, 0x9f, 0x30, 0x4a, 0x35, 0xd1, 0x99, 0x7e, 0x4f, 0x6f, 0x75, 0x7a, 0x06, 0xac, - 0x21, 0xcd, 0xfc, 0x88, 0xa4, 0x20, 0x10, 0x09, 0xac, 0x31, 0x69, 0xc7, 0x22, 0xe2, 0x34, 0x2f, 0x66, 0x81, 0x97, - 0xfa, 0x37, 0x82, 0x67, 0x6c, 0x1f, 0x2d, 0x6e, 0xc5, 0x1a, 0x23, 0xc1, 0x7b, 0xc0, 0x22, 0x55, 0x40, 0x11, 0x8b, - 0x54, 0x2d, 0xc6, 0x45, 0xea, 0xd5, 0x46, 0x23, 0xe2, 0x58, 0x57, 0x28, 0xfd, 0xe1, 0xe2, 0x56, 0x26, 0xd1, 0x45, - 0xb3, 0x9c, 0x52, 0x57, 0x13, 0x90, 0xcc, 0xfd, 0xf1, 0x38, 0x60, 0x59, 0x69, 0xa1, 0xcb, 0x6b, 0x29, 0x4d, 0x4e, - 0x3e, 0x0f, 0xde, 0x30, 0x89, 0x82, 0x65, 0xca, 0x9a, 0xa7, 0x4b, 0x48, 0x74, 0x8b, 0xc9, 0xc1, 0xdf, 0x65, 0x58, - 0x0f, 0x81, 0xdd, 0x86, 0x6d, 0x62, 0xf7, 0x20, 0xdf, 0xa0, 0xd9, 0x2e, 0x83, 0x0e, 0xaf, 0x72, 0xa0, 0x8d, 0x86, - 0x81, 0x18, 0x40, 0x96, 0x08, 0x7b, 0x2b, 0x96, 0xc3, 0xcb, 0xf2, 0x9c, 0x6b, 0x79, 0x51, 0x56, 0x1e, 0xcc, 0x6f, - 0x73, 0xc6, 0x5e, 0x34, 0x9f, 0xb1, 0x17, 0xe2, 0x8c, 0x6d, 0xdf, 0x99, 0x8f, 0x26, 0x0e, 0xfc, 0xd7, 0x2b, 0x06, - 0xd4, 0xb5, 0x95, 0xf6, 0xe2, 0x56, 0x71, 0x16, 0xb7, 0x8a, 0xd9, 0x5a, 0xdc, 0x2a, 0xd8, 0x35, 0xba, 0xb7, 0x18, - 0x56, 0x4b, 0x37, 0x6c, 0x05, 0x0a, 0xe1, 0x8f, 0x5d, 0x7a, 0xe5, 0x1c, 0xc0, 0x3b, 0x68, 0x75, 0x58, 0x7f, 0xd7, - 0xda, 0x7e, 0xd4, 0xe9, 0x2c, 0x09, 0xa4, 0xad, 0x5b, 0xa9, 0x37, 0x1c, 0x82, 0x28, 0x33, 0x1a, 0x2d, 0x93, 0x7f, - 0x72, 0xf8, 0xf9, 0x24, 0x6e, 0x45, 0x04, 0x95, 0x7e, 0x44, 0x53, 0x50, 0x14, 0xde, 0x30, 0xd1, 0xc3, 0x3a, 0x5f, - 0xa7, 0x2e, 0x25, 0x47, 0x6c, 0x59, 0x07, 0x0d, 0x9b, 0xbc, 0x79, 0xa2, 0x7f, 0xb3, 0x55, 0xda, 0x8c, 0x62, 0x3e, - 0x63, 0x5a, 0xb6, 0x4e, 0xc7, 0xc3, 0x67, 0x83, 0xaf, 0xa6, 0xdd, 0x69, 0x06, 0xf7, 0x52, 0x7c, 0xe9, 0x4a, 0x10, - 0x15, 0x4e, 0xb7, 0x78, 0x28, 0x8e, 0xed, 0xbd, 0x6e, 0xda, 0x23, 0xb5, 0x5e, 0xb7, 0x10, 0x84, 0xa2, 0xee, 0x8e, - 0x58, 0xfe, 0xd1, 0x8b, 0x03, 0xf8, 0x8f, 0xb8, 0xfa, 0xbf, 0xa5, 0x4d, 0x8c, 0xfa, 0xeb, 0xb4, 0xc4, 0xa8, 0x13, - 0xab, 0x84, 0x8c, 0xf8, 0xee, 0xf5, 0x27, 0x93, 0x87, 0x35, 0xd8, 0xb9, 0x36, 0x79, 0x86, 0x55, 0x6b, 0xbf, 0x8c, - 0xa2, 0x80, 0x79, 0x61, 0xbd, 0xba, 0x98, 0x1e, 0x72, 0xf3, 0x4f, 0x5d, 0x68, 0x24, 0xee, 0x11, 0xe4, 0x94, 0xa0, - 0x62, 0x1b, 0xba, 0x4a, 0x9c, 0x6f, 0xba, 0x4a, 0xbc, 0xbb, 0xff, 0x2a, 0xf1, 0xc7, 0x9d, 0xae, 0x12, 0xef, 0xbe, - 0xf8, 0x55, 0xe2, 0xbc, 0x7e, 0x95, 0x38, 0x8f, 0x84, 0x3b, 0xb0, 0xf1, 0x66, 0xc9, 0x7f, 0x7e, 0x20, 0x7b, 0xdf, - 0x77, 0x91, 0x7b, 0x68, 0x53, 0xc2, 0xc3, 0x8b, 0x5f, 0x7d, 0xb1, 0xc0, 0x8d, 0xf8, 0x0e, 0xbd, 0xe3, 0x8a, 0xab, - 0x05, 0xc7, 0xec, 0xf8, 0x1d, 0xa9, 0x38, 0x88, 0xc2, 0xe9, 0x4f, 0x60, 0xef, 0x0d, 0xe2, 0xc0, 0x58, 0x7a, 0xe1, - 0x27, 0x3f, 0x45, 0x8b, 0xe5, 0x02, 0x15, 0x55, 0x1f, 0xfc, 0xc4, 0x1f, 0x06, 0x2c, 0x8f, 0x30, 0x49, 0x5a, 0x57, - 0x2e, 0x5b, 0x07, 0xc5, 0xab, 0xf8, 0xe9, 0xdd, 0x8a, 0x9f, 0xe8, 0x62, 0xcb, 0x7f, 0x93, 0x9b, 0xa0, 0xda, 0x7c, - 0x11, 0x11, 0x16, 0x62, 0x12, 0xd0, 0x0f, 0xbf, 0x8c, 0x9c, 0x8b, 0x58, 0x5e, 0xa5, 0x51, 0x0a, 0xf7, 0x8d, 0x8d, - 0xfd, 0xb0, 0x6a, 0x3f, 0x6f, 0x96, 0xba, 0x91, 0x27, 0xe0, 0xa8, 0x8b, 0xf3, 0xe7, 0xd1, 0x32, 0x61, 0xe3, 0x68, - 0x15, 0xaa, 0x46, 0xc8, 0xf5, 0xaa, 0x11, 0xca, 0xd4, 0xf3, 0x36, 0x65, 0x85, 0xa3, 0x6a, 0x2d, 0x60, 0x0e, 0x4d, - 0xd2, 0x60, 0x9b, 0x38, 0x44, 0x55, 0x84, 0x6c, 0xea, 0xed, 0x69, 0x5a, 0xe4, 0x3e, 0xac, 0xa5, 0xf0, 0x3c, 0x89, - 0x2c, 0x2e, 0x15, 0x4e, 0xb4, 0x50, 0x08, 0x17, 0x45, 0x14, 0xec, 0x86, 0x85, 0xe3, 0x6f, 0x28, 0x42, 0x64, 0xf1, - 0x16, 0x74, 0x55, 0xd9, 0x92, 0xaf, 0x07, 0x8f, 0x09, 0x4d, 0x8f, 0xaf, 0xa4, 0x69, 0x7c, 0x7b, 0xc3, 0xe2, 0xc0, - 0xbb, 0xd3, 0xf4, 0x2c, 0x0a, 0x7f, 0x80, 0x09, 0x78, 0x1d, 0xad, 0x42, 0xb9, 0x02, 0xa6, 0x6a, 0x6f, 0xd8, 0x4b, - 0x8d, 0xd1, 0xcb, 0x21, 0x66, 0x87, 0x04, 0x81, 0x6f, 0x2d, 0xbc, 0x29, 0xfb, 0x8b, 0x41, 0xff, 0xfe, 0x55, 0xcf, - 0x8c, 0x77, 0x51, 0xfe, 0xa1, 0x9f, 0x17, 0x3b, 0x7c, 0xe6, 0xc9, 0x93, 0xbd, 0xcd, 0xc3, 0xd6, 0x46, 0x01, 0xf3, - 0x62, 0x01, 0x45, 0x43, 0x6b, 0x7d, 0xe3, 0x29, 0x00, 0x28, 0x2e, 0xa2, 0xe5, 0x68, 0x86, 0x7e, 0xbb, 0x5f, 0x6e, - 0xbc, 0x29, 0xf4, 0xc9, 0x92, 0x4b, 0xfb, 0x2a, 0x1f, 0x7a, 0xa5, 0xa8, 0x98, 0x05, 0xfc, 0xfe, 0x19, 0xa4, 0xdf, - 0xfa, 0x0f, 0x4e, 0x43, 0x7d, 0xd7, 0xe4, 0x21, 0xbf, 0x1e, 0xb4, 0x79, 0x7b, 0x3e, 0x44, 0xe5, 0xa1, 0xc0, 0xd6, - 0x42, 0x49, 0xd7, 0x8c, 0x64, 0xb2, 0xea, 0xa4, 0xc9, 0x49, 0x64, 0x36, 0xe5, 0xc7, 0x11, 0x5f, 0x61, 0x56, 0xc9, - 0x6a, 0xc4, 0x60, 0x1c, 0x5b, 0x55, 0x90, 0x0c, 0xf7, 0xa6, 0x60, 0x88, 0xbe, 0xaa, 0xef, 0xe6, 0x7e, 0x68, 0x60, - 0x0e, 0xd8, 0xfa, 0x1b, 0xef, 0x16, 0xb2, 0x20, 0x02, 0x72, 0xab, 0xbe, 0x82, 0x42, 0x43, 0x8e, 0x16, 0xe4, 0x8d, - 0xc7, 0x9a, 0xda, 0x38, 0x13, 0x42, 0x1b, 0x38, 0xf8, 0x4a, 0x51, 0x14, 0x25, 0xbf, 0x46, 0x28, 0xf9, 0x3d, 0x02, - 0xcb, 0xf1, 0x3a, 0x00, 0xda, 0x92, 0x6c, 0x71, 0x4b, 0x25, 0x70, 0x33, 0x40, 0xfb, 0x69, 0x51, 0xc0, 0x13, 0xfd, - 0x80, 0x71, 0x0b, 0x15, 0x88, 0x0b, 0x3d, 0xa8, 0xbe, 0xbd, 0x18, 0xf2, 0x01, 0x76, 0x15, 0xbc, 0xb0, 0xe3, 0x5b, - 0x2e, 0x09, 0x56, 0x6c, 0x7a, 0x1c, 0xf4, 0x58, 0x73, 0x46, 0x98, 0x50, 0xc2, 0x82, 0xa0, 0x75, 0xa8, 0x24, 0x78, - 0x34, 0x58, 0x03, 0x6e, 0xc4, 0x7b, 0xd1, 0x6d, 0x3a, 0x67, 0xe1, 0x52, 0x35, 0xc0, 0xea, 0x04, 0x33, 0xf4, 0x40, - 0x9d, 0xd7, 0xc4, 0x6c, 0x01, 0xb6, 0x69, 0x6e, 0x39, 0x23, 0x5a, 0x28, 0x4c, 0x55, 0x3c, 0x63, 0xc4, 0x03, 0xe0, - 0x24, 0x1c, 0xb7, 0x55, 0x29, 0x04, 0x5f, 0xd2, 0xa8, 0x8c, 0xcd, 0x79, 0xc8, 0x2b, 0xe4, 0x14, 0xc8, 0x46, 0x8c, - 0x8b, 0x8b, 0xc4, 0xb4, 0x6b, 0x5e, 0x75, 0xd1, 0x72, 0x8d, 0x8c, 0x57, 0x11, 0x14, 0xc5, 0x7a, 0xbd, 0x1b, 0x0e, - 0x27, 0xa4, 0x25, 0xd8, 0xd8, 0xcf, 0xa8, 0xd6, 0xcf, 0x86, 0x41, 0x7f, 0x64, 0x77, 0x44, 0x48, 0x68, 0xaa, 0x3e, - 0xb2, 0x3b, 0x30, 0x0e, 0x3f, 0x03, 0x69, 0x8a, 0xba, 0x05, 0x5d, 0x1b, 0x90, 0xe8, 0x77, 0x04, 0xa9, 0x2a, 0xb6, - 0x1c, 0x20, 0x3b, 0xdb, 0x82, 0xc5, 0x29, 0x1c, 0xa9, 0x91, 0xf4, 0xc4, 0x21, 0xe6, 0x11, 0x0b, 0xb4, 0xc6, 0x39, - 0x36, 0x1b, 0x8e, 0x86, 0xfe, 0xcc, 0xb1, 0xed, 0xfd, 0x5a, 0x7d, 0x10, 0x64, 0x37, 0xd5, 0xd6, 0x8d, 0xd4, 0x75, - 0x6c, 0xd3, 0x7f, 0x66, 0xb5, 0x7a, 0x35, 0x1a, 0x2d, 0x65, 0x92, 0x1a, 0xa0, 0xf8, 0xab, 0xff, 0x78, 0xad, 0xd5, - 0x0e, 0xa4, 0x5e, 0x8d, 0x00, 0x80, 0xb0, 0x65, 0x5c, 0xfe, 0x35, 0xa8, 0x93, 0x7e, 0xca, 0x63, 0x45, 0x59, 0xcd, - 0x07, 0x90, 0x0b, 0x51, 0x83, 0x63, 0xf4, 0x07, 0xe5, 0xb9, 0xa2, 0xd1, 0xf1, 0xd1, 0xf5, 0x41, 0x4f, 0x60, 0x14, - 0x11, 0x22, 0x47, 0xee, 0xa0, 0xf2, 0xc5, 0xa4, 0x8a, 0xe1, 0x78, 0xd6, 0x35, 0x56, 0x68, 0xf4, 0xb6, 0x72, 0x0b, - 0xd8, 0xff, 0x06, 0xf2, 0x69, 0x0d, 0x21, 0xc6, 0x23, 0xd4, 0x80, 0xcc, 0xa9, 0xf7, 0x76, 0x08, 0xe1, 0x79, 0xe5, - 0xee, 0xca, 0x44, 0x72, 0xf7, 0xce, 0x90, 0xe8, 0xa0, 0x0e, 0x2d, 0xef, 0xaf, 0x99, 0xdc, 0x3d, 0xb0, 0x4b, 0x16, - 0x8e, 0xcb, 0x1d, 0x56, 0xe8, 0xd7, 0xee, 0xdd, 0x95, 0x30, 0x0a, 0xa4, 0x14, 0x8e, 0x1a, 0x30, 0x4a, 0x16, 0x85, - 0xb8, 0xf9, 0xe9, 0xb8, 0xf9, 0x3b, 0x71, 0x31, 0xd8, 0x80, 0xf2, 0x81, 0xe4, 0xcd, 0x24, 0xa1, 0x38, 0xe4, 0xad, - 0xc4, 0x08, 0x5a, 0x9a, 0x60, 0x44, 0x37, 0xee, 0xc4, 0x54, 0xb8, 0x2b, 0x16, 0x6d, 0x7c, 0x9e, 0x89, 0x6a, 0x57, - 0xa9, 0xb5, 0x7f, 0xbf, 0xd4, 0x3a, 0xbd, 0x4f, 0x6a, 0x4d, 0xd1, 0x61, 0xb8, 0x3d, 0xa8, 0x88, 0x92, 0x23, 0x98, - 0x73, 0x39, 0xce, 0x50, 0x49, 0xd4, 0x8d, 0xc1, 0x64, 0x1a, 0xac, 0x48, 0xa9, 0x37, 0x72, 0x40, 0x44, 0xf1, 0xb7, - 0x74, 0x41, 0x11, 0x0a, 0x75, 0x59, 0x36, 0x7e, 0x5e, 0xc8, 0xc6, 0xe9, 0x56, 0x53, 0xc4, 0x05, 0x11, 0xdc, 0xbf, - 0x14, 0x73, 0x27, 0xbf, 0x1d, 0x14, 0xb1, 0x77, 0x0a, 0x48, 0xa5, 0x68, 0x32, 0xc5, 0x45, 0x43, 0x8a, 0x51, 0x24, - 0x6e, 0x19, 0xe5, 0x50, 0x45, 0xe5, 0xaa, 0x45, 0x30, 0x99, 0xa2, 0x1c, 0xa4, 0xee, 0x08, 0x72, 0x5e, 0x2c, 0x6f, - 0x9b, 0x72, 0x34, 0x11, 0xf9, 0xb5, 0xb4, 0x49, 0xf2, 0xb0, 0x1f, 0x34, 0xc1, 0x42, 0x4c, 0x5f, 0xd1, 0x6b, 0xe7, - 0x36, 0x10, 0x08, 0x64, 0x43, 0x94, 0xa2, 0xfb, 0xa5, 0xf3, 0x94, 0x2d, 0xb9, 0x50, 0x5d, 0x3b, 0x48, 0xdd, 0x49, - 0x13, 0x2c, 0xcb, 0x23, 0x70, 0xae, 0xaf, 0x24, 0x09, 0x42, 0xd7, 0x56, 0xec, 0x5e, 0x03, 0x03, 0x80, 0xf4, 0xbf, - 0xfa, 0xcc, 0x59, 0x01, 0x90, 0x44, 0x2a, 0xb6, 0xac, 0xf3, 0xc7, 0x43, 0x6c, 0x92, 0x25, 0x3b, 0x56, 0xad, 0x7f, - 0x93, 0xe4, 0x3d, 0x6b, 0x1e, 0x13, 0xa4, 0x2c, 0xce, 0xe7, 0x35, 0xba, 0x02, 0x0e, 0xbe, 0xcb, 0xe2, 0x65, 0x88, - 0x49, 0x70, 0xcd, 0x34, 0xf6, 0x46, 0x1f, 0xd7, 0xd2, 0xf7, 0xb8, 0x48, 0x14, 0xc4, 0xc5, 0x65, 0xa5, 0x42, 0xcf, - 0xc3, 0x9c, 0x51, 0xac, 0x6b, 0xb5, 0x12, 0x49, 0x50, 0xd3, 0x7d, 0x64, 0xb7, 0xbd, 0x17, 0x93, 0x83, 0x8a, 0xfc, - 0xb4, 0x75, 0x58, 0x96, 0xae, 0xe7, 0x70, 0xcc, 0xa3, 0x5f, 0x78, 0xf4, 0xa4, 0xdf, 0xff, 0xd3, 0x09, 0xff, 0x66, - 0x65, 0x8d, 0x3e, 0x07, 0x04, 0x68, 0x5f, 0x52, 0x4c, 0xcb, 0x6a, 0x9a, 0x5a, 0xc9, 0x26, 0xb0, 0x26, 0x7e, 0x10, - 0x98, 0x01, 0xb8, 0x31, 0xac, 0x3f, 0x6b, 0x78, 0xd8, 0xcf, 0x12, 0xb2, 0x15, 0x7e, 0x46, 0x3f, 0xe5, 0x9d, 0x92, - 0xce, 0x96, 0xf3, 0xe1, 0x5a, 0x16, 0x94, 0x4b, 0xf2, 0xf3, 0xba, 0xcc, 0x5c, 0xfe, 0xec, 0x64, 0x32, 0x29, 0x4b, - 0x8d, 0x6d, 0xe5, 0x00, 0x25, 0xbf, 0x8f, 0x6c, 0xdb, 0xae, 0xce, 0xef, 0xa6, 0x83, 0x42, 0x07, 0xc3, 0x44, 0x21, - 0x7c, 0xe7, 0xfe, 0x3d, 0xf5, 0x3b, 0x41, 0x4b, 0x5d, 0x6d, 0x3a, 0x8f, 0xb4, 0xd5, 0xfe, 0x2b, 0x40, 0x41, 0xd4, - 0x70, 0xdf, 0xf1, 0xaf, 0xef, 0x95, 0x2d, 0x3d, 0x55, 0x0f, 0xf0, 0xc3, 0x1a, 0xdf, 0xb3, 0xd7, 0x77, 0x68, 0xba, - 0x69, 0x7b, 0x67, 0x56, 0x41, 0x76, 0x4b, 0x36, 0x4b, 0x3d, 0xb2, 0x54, 0xf2, 0x53, 0x36, 0x4f, 0xba, 0x23, 0x86, - 0x0a, 0x52, 0x4b, 0xa2, 0xb6, 0x68, 0xd5, 0x63, 0x4e, 0xc1, 0x8e, 0xcb, 0x11, 0x78, 0xd8, 0x56, 0x50, 0x59, 0x55, - 0xd3, 0xac, 0x89, 0x8f, 0x20, 0x15, 0x5b, 0xd7, 0x15, 0x4e, 0xb8, 0x4d, 0x0f, 0xed, 0x3f, 0x94, 0xea, 0x29, 0xc0, - 0x9d, 0xae, 0x85, 0xb5, 0x09, 0x29, 0x4f, 0xf0, 0xef, 0x5c, 0x39, 0xf7, 0x62, 0x71, 0x5b, 0x36, 0xee, 0xea, 0x80, - 0xba, 0xa9, 0x20, 0x65, 0x04, 0x75, 0x13, 0xea, 0xcb, 0x4d, 0x80, 0x26, 0xb2, 0x75, 0x0b, 0x58, 0xd0, 0x88, 0x29, - 0xa8, 0xe8, 0x08, 0x73, 0x50, 0xf1, 0x3a, 0x0b, 0x3b, 0xaf, 0x90, 0xef, 0xe3, 0x2f, 0xc8, 0x52, 0x0e, 0xe9, 0x4e, - 0xfe, 0x60, 0x3c, 0xef, 0xa0, 0x72, 0xaf, 0xb4, 0x55, 0xd1, 0x54, 0x06, 0xf7, 0x80, 0xb8, 0x91, 0x2a, 0xcb, 0x38, - 0x30, 0x29, 0x71, 0xbd, 0xa6, 0xaf, 0xeb, 0xe3, 0xde, 0xdc, 0xbd, 0x73, 0x08, 0x7a, 0x8d, 0xfa, 0x54, 0xed, 0xa4, - 0xda, 0xab, 0xea, 0xb0, 0x05, 0x9c, 0xb0, 0x02, 0xe0, 0x33, 0xab, 0xa0, 0xd1, 0x90, 0x52, 0xc1, 0x7d, 0x34, 0xe8, - 0xfc, 0xad, 0x8c, 0xac, 0xc5, 0x38, 0xb1, 0xbb, 0xe6, 0x2a, 0xd4, 0xb7, 0xd0, 0x0c, 0xc2, 0xdc, 0x71, 0xec, 0x84, - 0xcf, 0x26, 0xec, 0x18, 0x19, 0x5d, 0x39, 0xb8, 0x83, 0xf0, 0x94, 0x9a, 0x94, 0xfc, 0x84, 0x4e, 0x29, 0xea, 0x12, - 0xfe, 0xd8, 0x28, 0xbc, 0xbf, 0x28, 0x49, 0xe3, 0x79, 0xd0, 0x89, 0x96, 0xbe, 0x53, 0xed, 0xb9, 0x1f, 0xee, 0x5e, - 0xd7, 0xbb, 0xdd, 0xb9, 0x2e, 0x30, 0x87, 0x3b, 0x57, 0x06, 0xee, 0x12, 0x2b, 0x5f, 0xa4, 0xee, 0x1f, 0x25, 0xe5, - 0x81, 0x1c, 0x30, 0x51, 0xc5, 0x56, 0x74, 0xa3, 0xff, 0x71, 0xe9, 0x0e, 0x4e, 0x4e, 0x6f, 0xe7, 0x81, 0x72, 0xc3, - 0xe2, 0x04, 0x12, 0x4a, 0xa8, 0x8e, 0x65, 0xab, 0x0a, 0x1a, 0xf4, 0xfb, 0xe1, 0xd4, 0x55, 0x7f, 0xbe, 0x78, 0x63, - 0x76, 0xd4, 0x53, 0x30, 0xc7, 0xb8, 0x99, 0x22, 0x8b, 0x7b, 0xee, 0xdd, 0xb1, 0xf8, 0xba, 0xc5, 0x3d, 0x7e, 0x88, - 0xb9, 0xc5, 0x32, 0xa5, 0xa5, 0xee, 0x90, 0x12, 0x5e, 0xb9, 0xf1, 0xd9, 0xea, 0x65, 0x74, 0xeb, 0xaa, 0x80, 0x58, - 0x9d, 0x56, 0x47, 0x71, 0x5a, 0x07, 0xd6, 0x51, 0x47, 0xed, 0x7f, 0xa5, 0x28, 0x27, 0x63, 0x36, 0x49, 0xfa, 0x28, - 0x8e, 0x39, 0x41, 0x7e, 0x90, 0x7e, 0x2b, 0x8a, 0x35, 0x0a, 0x12, 0xd3, 0x51, 0xd6, 0xfc, 0x51, 0x51, 0x00, 0x19, - 0x75, 0x95, 0x47, 0x93, 0xd6, 0xe4, 0x60, 0xf2, 0xa2, 0xc7, 0x8b, 0xb3, 0xaf, 0x4a, 0xd5, 0x0d, 0xfa, 0xb7, 0x25, - 0x35, 0x4b, 0xd2, 0x38, 0xfa, 0xc8, 0x38, 0x2f, 0xa9, 0xe4, 0x82, 0xa2, 0x6a, 0xd3, 0x56, 0xfd, 0x4b, 0x4e, 0x67, - 0x38, 0x9a, 0xb4, 0x8a, 0xea, 0x08, 0xe3, 0x7e, 0x0e, 0xe4, 0xc9, 0xbe, 0x00, 0xfd, 0x44, 0x9e, 0x26, 0xc7, 0x6c, - 0x9a, 0x28, 0x47, 0xe5, 0x63, 0x9c, 0x8a, 0xf1, 0x9d, 0x40, 0xc6, 0xb5, 0xc2, 0x7b, 0x31, 0xc1, 0x66, 0xae, 0xfa, - 0x83, 0xd3, 0xea, 0x18, 0x8e, 0x73, 0x64, 0x1d, 0x75, 0x46, 0xb6, 0x71, 0x60, 0x1d, 0x98, 0x6d, 0xeb, 0xc8, 0xe8, - 0x98, 0x1d, 0xa3, 0xf3, 0x5d, 0x67, 0x64, 0x1e, 0x58, 0x07, 0x86, 0x6d, 0x76, 0xa0, 0xd0, 0xec, 0x98, 0x9d, 0x1b, - 0xf3, 0xa0, 0x33, 0xb2, 0xb1, 0xb4, 0x65, 0x1d, 0x1e, 0x9a, 0x8e, 0x6d, 0x1d, 0x1e, 0x1a, 0x87, 0xd6, 0xd1, 0x91, - 0xe9, 0xb4, 0xad, 0xa3, 0xa3, 0xf3, 0xc3, 0x8e, 0xd5, 0x86, 0x77, 0xed, 0xf6, 0xa8, 0x6d, 0x39, 0x8e, 0x09, 0x7f, - 0x19, 0x1d, 0xab, 0x45, 0x3f, 0x1c, 0xc7, 0x6a, 0x3b, 0x86, 0x1d, 0x1c, 0xb6, 0xac, 0xa3, 0x17, 0x06, 0xfe, 0x8d, - 0xd5, 0x0c, 0xfc, 0x0b, 0xba, 0x31, 0x5e, 0x58, 0xad, 0x23, 0xfa, 0x85, 0x1d, 0xde, 0x1c, 0x74, 0xfe, 0xa6, 0xee, - 0x6f, 0x1c, 0x83, 0x43, 0x63, 0xe8, 0x1c, 0x5a, 0xed, 0xb6, 0x71, 0xe0, 0x58, 0x9d, 0xf6, 0xcc, 0x3c, 0x68, 0x59, - 0x47, 0xc7, 0x23, 0xd3, 0xb1, 0x8e, 0x8f, 0x0d, 0xdb, 0x6c, 0x5b, 0x2d, 0xc3, 0xb1, 0x0e, 0xda, 0xf8, 0xa3, 0x6d, - 0xb5, 0x6e, 0x8e, 0x5f, 0x58, 0x47, 0x87, 0xb3, 0x23, 0xeb, 0xe0, 0xc3, 0x41, 0xc7, 0x6a, 0xb5, 0x67, 0xed, 0x23, - 0xab, 0x75, 0x7c, 0x73, 0x64, 0x1d, 0xcc, 0xcc, 0xd6, 0xd1, 0xd6, 0x96, 0x4e, 0xcb, 0x82, 0x39, 0xc2, 0xd7, 0xf0, - 0xc2, 0xe0, 0x2f, 0xe0, 0xcf, 0x0c, 0xdb, 0xfe, 0x8e, 0xdd, 0x24, 0xf5, 0xa6, 0x2f, 0xac, 0xce, 0xf1, 0x88, 0xaa, - 0x43, 0x81, 0x29, 0x6a, 0x40, 0x93, 0x1b, 0x93, 0x3e, 0x8b, 0xdd, 0x99, 0xa2, 0x23, 0xf1, 0x87, 0x7f, 0xec, 0xc6, - 0x84, 0x0f, 0xd3, 0x77, 0xff, 0xa3, 0xfd, 0xe4, 0x4b, 0x7e, 0xb2, 0x3f, 0xa5, 0xad, 0x3f, 0xed, 0x7f, 0x75, 0x02, - 0x87, 0xbb, 0x3f, 0x30, 0x7e, 0xd9, 0xa4, 0x94, 0xfc, 0xc7, 0xfd, 0x4a, 0xc9, 0x97, 0xcb, 0x5d, 0x94, 0x92, 0xff, - 0xf8, 0xe2, 0x4a, 0xc9, 0x5f, 0xaa, 0xbe, 0x35, 0x6f, 0xaa, 0x59, 0xa8, 0xff, 0xb8, 0xae, 0x8a, 0x1c, 0x12, 0x4f, - 0xbb, 0xfc, 0x71, 0x79, 0x05, 0xf1, 0xe3, 0xdf, 0x44, 0xee, 0xcb, 0x65, 0xc9, 0xe0, 0x33, 0x02, 0x1c, 0xfb, 0x26, - 0x22, 0x1c, 0xfb, 0x61, 0xe9, 0x82, 0x95, 0x19, 0x67, 0x73, 0xfc, 0xb1, 0x39, 0xf3, 0x82, 0x49, 0xce, 0x22, 0x41, - 0x49, 0x0f, 0x8b, 0xc1, 0x6f, 0x1e, 0xc8, 0x33, 0xdc, 0x64, 0x96, 0xf3, 0x30, 0x01, 0x8b, 0x60, 0xb0, 0xe4, 0x98, - 0xc4, 0x59, 0xa5, 0xb1, 0x25, 0x22, 0xee, 0x5f, 0x73, 0x8f, 0xe2, 0x8d, 0xef, 0xd1, 0x00, 0xb8, 0xb9, 0x77, 0xa7, - 0xde, 0xaf, 0x02, 0x96, 0x75, 0xc2, 0x40, 0x1a, 0xb8, 0xfd, 0xa6, 0xf7, 0x65, 0x33, 0xdc, 0x8a, 0xe1, 0xf5, 0x66, - 0x48, 0x01, 0x92, 0x6a, 0x7b, 0xa7, 0x6c, 0xc6, 0x7b, 0xdf, 0x30, 0x1b, 0x3e, 0x5f, 0x6a, 0xbe, 0xc5, 0x86, 0x38, - 0xef, 0xb8, 0x3a, 0x55, 0xeb, 0x12, 0x9f, 0xd6, 0x3c, 0x21, 0xc5, 0x05, 0xb5, 0x30, 0x34, 0x2e, 0x38, 0x55, 0x5b, - 0x41, 0x7e, 0xc7, 0x96, 0xde, 0x95, 0xfa, 0x94, 0x8d, 0x93, 0x9f, 0xad, 0xf1, 0x5e, 0xe1, 0xff, 0x02, 0x9c, 0x28, - 0xe7, 0x78, 0x86, 0x91, 0x3c, 0xcf, 0x6b, 0xa9, 0x5f, 0x92, 0x46, 0x64, 0x33, 0x67, 0x5d, 0xe7, 0x45, 0x37, 0xba, - 0x25, 0x38, 0x6c, 0x2e, 0xb8, 0x20, 0xfc, 0x3c, 0x39, 0x01, 0x64, 0xe4, 0xa8, 0x81, 0x7e, 0x0e, 0xdb, 0x3a, 0x13, - 0xf5, 0x1e, 0xc1, 0x26, 0xe6, 0x9e, 0x80, 0x8a, 0x1c, 0xd2, 0x74, 0x3d, 0x09, 0x22, 0x2f, 0xed, 0x22, 0x9b, 0x26, - 0xb1, 0xbc, 0x2d, 0xf4, 0x58, 0xe8, 0x6d, 0x31, 0xa6, 0x93, 0x3b, 0xe6, 0x9d, 0xa0, 0xe7, 0xc3, 0x36, 0xfb, 0xbb, - 0xdc, 0xe1, 0x6c, 0x5d, 0x32, 0x47, 0x71, 0x0e, 0x8f, 0x0d, 0xe7, 0xc8, 0xb0, 0x8e, 0x0f, 0xf5, 0x4c, 0x1c, 0x38, - 0xb9, 0xcb, 0xd2, 0x84, 0x80, 0x03, 0x44, 0x0e, 0xa6, 0x1f, 0xfa, 0xa9, 0xef, 0x05, 0x19, 0xf0, 0xc3, 0xe5, 0x4b, - 0xca, 0x3f, 0x96, 0x49, 0x0a, 0x63, 0x14, 0x4c, 0x2f, 0x3a, 0x7f, 0x98, 0x43, 0x96, 0xae, 0x18, 0x0b, 0x37, 0x18, - 0xc6, 0x54, 0x7d, 0x49, 0x7e, 0x3b, 0xcb, 0xfa, 0x8c, 0xac, 0xd6, 0x86, 0x69, 0xc8, 0xf7, 0x87, 0x70, 0x7c, 0xc8, - 0x06, 0xc6, 0x77, 0x9b, 0x10, 0xee, 0xcf, 0xf7, 0x23, 0xdc, 0x94, 0xed, 0x82, 0x70, 0x7f, 0xfe, 0xe2, 0x08, 0xf7, - 0x3b, 0x19, 0xe1, 0x96, 0xfc, 0x07, 0x0b, 0x0d, 0xd3, 0x7b, 0x7c, 0xd6, 0xc0, 0x45, 0xf6, 0xb9, 0xba, 0x4f, 0x0c, - 0xbc, 0xaa, 0x17, 0xd9, 0x6b, 0xff, 0xbc, 0x94, 0x2d, 0xa8, 0x51, 0x00, 0x8a, 0x79, 0x1d, 0x7d, 0x74, 0x5d, 0xf6, - 0xc1, 0xd5, 0x4d, 0x84, 0x61, 0x80, 0x3e, 0xbf, 0x0f, 0xd3, 0xc0, 0x7a, 0xc7, 0xef, 0x91, 0xa0, 0xd0, 0x7d, 0x13, - 0xc5, 0x73, 0x0f, 0x53, 0x8c, 0xa8, 0x3a, 0xb8, 0xd3, 0xc1, 0x83, 0x0d, 0x81, 0x40, 0x46, 0x51, 0x38, 0xce, 0xb5, - 0x92, 0xcc, 0xbd, 0x24, 0x8e, 0x5b, 0xbd, 0x63, 0x5e, 0xac, 0x1a, 0xf4, 0x1a, 0x16, 0xf7, 0x59, 0xdb, 0x7e, 0xd6, - 0x3a, 0x78, 0x76, 0x64, 0xc3, 0xff, 0x0e, 0x6b, 0x67, 0x06, 0xaf, 0x38, 0x8f, 0xc2, 0x74, 0x56, 0xd4, 0xdc, 0x54, - 0x6d, 0xc5, 0xd8, 0xc7, 0xa2, 0xd6, 0x71, 0x73, 0xa5, 0xb1, 0x77, 0x57, 0xd4, 0x69, 0xac, 0x31, 0x8b, 0x96, 0x12, - 0x58, 0x0d, 0xd0, 0xf8, 0xe1, 0x12, 0xe4, 0xec, 0x52, 0x0d, 0xf9, 0x35, 0x1f, 0x6e, 0x31, 0x2e, 0xd6, 0xce, 0xae, - 0x44, 0x0e, 0x05, 0xb5, 0x27, 0xd2, 0xea, 0xdd, 0x3b, 0x83, 0x5c, 0x45, 0x69, 0x63, 0xce, 0x29, 0xcc, 0x6c, 0x08, - 0x19, 0xa7, 0x98, 0x58, 0x20, 0x8f, 0x16, 0x28, 0x8d, 0x97, 0xe1, 0x48, 0xc3, 0x9f, 0xde, 0x30, 0xd1, 0xfc, 0xfd, - 0xd8, 0xe2, 0x1f, 0xd6, 0x71, 0xd5, 0xbc, 0xbe, 0x5d, 0x24, 0x9d, 0x4f, 0xc4, 0xaa, 0x78, 0xcf, 0x52, 0x23, 0x46, - 0x3d, 0x36, 0x2d, 0xad, 0xe9, 0x7a, 0xcf, 0xf2, 0x86, 0xcf, 0x52, 0x23, 0x7c, 0x0e, 0xba, 0x4f, 0xd7, 0x7e, 0xf2, - 0x84, 0x6a, 0xed, 0xb9, 0x62, 0x58, 0xa7, 0xa3, 0x22, 0x33, 0x85, 0xe2, 0x4d, 0x23, 0x4a, 0x4e, 0xd1, 0x1d, 0x19, - 0xd1, 0xf3, 0xe7, 0x7d, 0xd7, 0xd1, 0x87, 0x31, 0xf3, 0x3e, 0x66, 0x22, 0xdc, 0x77, 0x88, 0xf9, 0x69, 0xcf, 0x77, - 0x33, 0x34, 0xd2, 0x1b, 0x5d, 0x69, 0x17, 0x70, 0x67, 0xb2, 0x85, 0x3b, 0x02, 0xc7, 0x5e, 0x90, 0xbb, 0x9e, 0x0c, - 0x0a, 0x3c, 0x61, 0xf0, 0x23, 0xea, 0xe4, 0xb7, 0xae, 0xb6, 0x65, 0x5b, 0xb6, 0x9a, 0x37, 0x9c, 0xf8, 0x53, 0x77, - 0x1d, 0xa5, 0x5e, 0x77, 0xcf, 0x31, 0x82, 0x68, 0x0a, 0x7e, 0x74, 0xa9, 0x9f, 0x06, 0xac, 0xab, 0xaa, 0xe0, 0x50, - 0x37, 0xa7, 0x7b, 0x79, 0xc6, 0xbd, 0x1b, 0xbc, 0x18, 0xd2, 0x96, 0xc7, 0x77, 0xc2, 0x15, 0x17, 0x83, 0xa5, 0xff, - 0x00, 0xc4, 0x50, 0x53, 0x35, 0x90, 0x0d, 0xb0, 0x38, 0x31, 0x65, 0x6f, 0xa1, 0xae, 0x02, 0x6d, 0x74, 0x95, 0x0f, - 0x62, 0x12, 0x7b, 0x73, 0xc8, 0xab, 0xbb, 0xce, 0x0c, 0x8e, 0x69, 0x55, 0x8e, 0x6a, 0x15, 0xe7, 0xc5, 0x91, 0xa1, - 0xb4, 0x1c, 0x43, 0xb1, 0x01, 0xdd, 0xaa, 0x99, 0xb1, 0xce, 0xae, 0x7a, 0xf7, 0x19, 0x3c, 0x10, 0x7e, 0x79, 0x44, - 0xe3, 0x20, 0x53, 0x07, 0xae, 0x4a, 0x4a, 0x29, 0x49, 0x8e, 0x26, 0x65, 0xd0, 0xf4, 0x49, 0xe9, 0x79, 0xc1, 0x6e, - 0x53, 0x1d, 0x34, 0x47, 0xa2, 0x8a, 0xaf, 0xaf, 0xd1, 0x61, 0xd8, 0x0f, 0x15, 0xff, 0xd3, 0x27, 0xcd, 0x07, 0x67, - 0x26, 0x57, 0x9a, 0x1f, 0x78, 0xd6, 0x4b, 0x13, 0xe6, 0x17, 0x6a, 0x7a, 0x9c, 0x2c, 0xf0, 0x34, 0x84, 0x7f, 0x8b, - 0x62, 0xf1, 0x83, 0x9b, 0x49, 0x58, 0x81, 0x17, 0x4e, 0x01, 0xa5, 0x79, 0xe1, 0xb4, 0x66, 0x8e, 0x45, 0x3e, 0xcf, - 0x95, 0xd2, 0xa2, 0xab, 0xc2, 0x54, 0x2a, 0x79, 0x79, 0x77, 0xe1, 0x4d, 0x7f, 0xf4, 0xe6, 0x4c, 0x53, 0x81, 0xca, - 0xa1, 0x8b, 0x6e, 0xa1, 0xc9, 0x7d, 0xee, 0x3e, 0x3d, 0x99, 0xb3, 0xd4, 0x23, 0x35, 0x10, 0x5c, 0x7e, 0x81, 0x1d, - 0x50, 0x38, 0xa1, 0xe1, 0x01, 0x2f, 0x5c, 0xca, 0xa5, 0x45, 0x74, 0xc2, 0x50, 0x38, 0x9d, 0x32, 0xd1, 0xe2, 0xd3, - 0x75, 0x0c, 0x72, 0x38, 0x18, 0x79, 0x98, 0x4f, 0xc7, 0x0d, 0x23, 0xb5, 0xff, 0x34, 0xf7, 0xcd, 0xdc, 0xb4, 0x08, - 0x81, 0x1f, 0x7e, 0xbc, 0x8c, 0x59, 0xf0, 0x4f, 0xf7, 0x29, 0x10, 0xee, 0xa7, 0x57, 0xaa, 0xde, 0x4b, 0xad, 0x59, - 0xcc, 0x26, 0xee, 0x53, 0xb8, 0x90, 0x76, 0xd1, 0x3c, 0x16, 0xb8, 0xf6, 0xe7, 0xb7, 0xf3, 0xc0, 0xc0, 0xeb, 0x3d, - 0xc1, 0xa2, 0xb6, 0x5b, 0x45, 0x5c, 0xf3, 0xf6, 0x4e, 0x97, 0xfa, 0x3e, 0xbf, 0xad, 0xc3, 0x0d, 0x70, 0x5d, 0xba, - 0x63, 0x3b, 0x3d, 0xbc, 0x3f, 0x0f, 0x03, 0x6f, 0xf4, 0xb1, 0x47, 0x6f, 0x4a, 0x0f, 0x26, 0x50, 0xeb, 0x91, 0xb7, - 0xe8, 0x22, 0x79, 0x95, 0x0b, 0xc1, 0x7b, 0x9a, 0x4a, 0x73, 0xce, 0xae, 0x71, 0x2f, 0xe3, 0x56, 0x5e, 0xe3, 0x97, - 0xf1, 0x53, 0xab, 0x99, 0x9f, 0x32, 0xf1, 0x29, 0x7c, 0xc8, 0x32, 0x71, 0x51, 0xa7, 0x2b, 0x2a, 0x5e, 0xac, 0xad, - 0xb6, 0xe2, 0x74, 0xbe, 0x3b, 0xbc, 0x71, 0xec, 0x59, 0xcb, 0xb1, 0x3a, 0x1f, 0x9c, 0xce, 0xac, 0x6d, 0x1d, 0x07, - 0x66, 0xdb, 0x3a, 0x86, 0x3f, 0x1f, 0x8e, 0xad, 0xce, 0xcc, 0x6c, 0x59, 0x07, 0x1f, 0x9c, 0x56, 0x60, 0x76, 0xac, - 0x63, 0xf8, 0x73, 0x4e, 0xad, 0xe0, 0x02, 0x44, 0xf7, 0x9d, 0xa7, 0x25, 0x2c, 0x20, 0xfd, 0xce, 0x75, 0xb2, 0x46, - 0x89, 0xbc, 0x35, 0xe8, 0x75, 0x17, 0x18, 0x45, 0x42, 0xe4, 0xaf, 0x09, 0x7b, 0x5a, 0xe8, 0x32, 0x4a, 0x2a, 0x2b, - 0xcc, 0xdb, 0x84, 0x1f, 0xba, 0xc8, 0xe6, 0xd9, 0x78, 0x8c, 0x78, 0x9b, 0xe6, 0x0c, 0x96, 0xba, 0xc8, 0x08, 0x8c, - 0xcf, 0x3f, 0x2f, 0x30, 0xfe, 0xba, 0x48, 0xc3, 0x2c, 0x61, 0x25, 0xf0, 0x3d, 0xb7, 0xc2, 0x68, 0x85, 0xb6, 0x15, - 0xf7, 0x01, 0x8e, 0xde, 0xfc, 0x4c, 0x58, 0x76, 0x7d, 0xd9, 0xbe, 0xa5, 0xcc, 0xd7, 0x9f, 0xd5, 0x0f, 0x0f, 0x0b, - 0x21, 0x67, 0x9f, 0x1c, 0xfb, 0x71, 0x0e, 0x9e, 0x84, 0xa2, 0x9d, 0xe6, 0xd4, 0x9f, 0xba, 0x41, 0xc1, 0x91, 0x58, - 0x7c, 0xe3, 0x05, 0x92, 0x21, 0x9b, 0xd4, 0x72, 0x2f, 0xc7, 0xfc, 0x4f, 0x9e, 0x14, 0xc0, 0x99, 0x15, 0xb8, 0x4f, - 0x9c, 0x43, 0x20, 0xbb, 0x87, 0xac, 0xbd, 0xd5, 0xa6, 0x92, 0x6e, 0x3a, 0xdb, 0x7c, 0xab, 0x8b, 0x4c, 0x47, 0xc2, - 0x6e, 0x4a, 0x58, 0x6c, 0x6c, 0x34, 0xec, 0xac, 0xd9, 0x6b, 0x40, 0xaa, 0xb8, 0xca, 0x55, 0x47, 0xd5, 0x7b, 0xa1, - 0x30, 0x3f, 0x08, 0xb7, 0x24, 0x79, 0xe3, 0x77, 0x31, 0x15, 0xa6, 0x66, 0xcb, 0x38, 0xee, 0x71, 0x10, 0xff, 0x4f, - 0x0f, 0x02, 0x9d, 0x35, 0xc1, 0x5e, 0xa2, 0x72, 0x5a, 0x4b, 0xce, 0x7b, 0x39, 0x5d, 0x25, 0x82, 0xca, 0x92, 0x53, - 0x15, 0x8a, 0xd4, 0xae, 0x8a, 0x8e, 0x61, 0x6a, 0x6e, 0x2c, 0x9a, 0x53, 0x8b, 0xa2, 0xc0, 0xf0, 0x31, 0xa1, 0xa6, - 0x70, 0x1c, 0xd5, 0x9f, 0x3c, 0xd9, 0x48, 0x84, 0xc8, 0x38, 0x27, 0x61, 0xa9, 0x60, 0xd0, 0x35, 0x55, 0xc6, 0x6f, - 0xaa, 0x8c, 0x62, 0xf2, 0x7e, 0x11, 0x6b, 0x08, 0x1b, 0x57, 0xda, 0x7b, 0xf8, 0x73, 0xc8, 0xbc, 0xd4, 0xe2, 0xca, - 0x52, 0x4d, 0x22, 0xee, 0x86, 0xc3, 0xda, 0x60, 0xdd, 0xca, 0xd3, 0x34, 0xf0, 0x34, 0x28, 0x8f, 0xd7, 0x7f, 0x5e, - 0xf2, 0xa8, 0x0e, 0xd0, 0xc7, 0x27, 0xbb, 0x88, 0xc3, 0xf9, 0x36, 0xf5, 0x28, 0x0e, 0x9a, 0x4c, 0x72, 0xa3, 0xd4, - 0x23, 0x7b, 0x0e, 0x1f, 0x43, 0xd7, 0x34, 0x47, 0xe4, 0x92, 0x22, 0x3f, 0xf4, 0xdf, 0x5e, 0x7c, 0xa3, 0xf0, 0xfd, - 0x4f, 0xd6, 0x02, 0x78, 0x91, 0xa1, 0x78, 0x33, 0x2e, 0xc5, 0x9b, 0x51, 0x78, 0x26, 0x63, 0xc8, 0xb9, 0x9a, 0xed, - 0xd3, 0x0c, 0xa2, 0x00, 0x9a, 0x6c, 0x28, 0xe6, 0xcb, 0x20, 0xf5, 0x17, 0x5e, 0x9c, 0xee, 0x63, 0xb0, 0x19, 0x0c, - 0x5e, 0xb3, 0x29, 0x1e, 0x04, 0x99, 0x61, 0x88, 0xec, 0x20, 0x69, 0x28, 0xec, 0x30, 0x26, 0x7e, 0x90, 0x9b, 0x61, - 0x88, 0x0f, 0x78, 0xa3, 0x11, 0x5b, 0xa4, 0x6e, 0x29, 0xa8, 0x4d, 0x34, 0x4a, 0x59, 0x6a, 0x26, 0x69, 0xcc, 0xbc, - 0xb9, 0x9a, 0x07, 0xb9, 0xaa, 0xf7, 0x97, 0x2c, 0x87, 0x10, 0xa5, 0x47, 0x84, 0xdb, 0xa2, 0x01, 0x82, 0x41, 0x04, - 0x80, 0x08, 0x41, 0x66, 0x68, 0x0a, 0xcf, 0xa3, 0x69, 0x65, 0x47, 0x15, 0x9c, 0xcb, 0x29, 0x26, 0x09, 0xa3, 0x9b, - 0x0c, 0x48, 0x8b, 0x47, 0x51, 0x70, 0xcd, 0x63, 0x58, 0xe4, 0xd9, 0x66, 0xd4, 0xfe, 0x09, 0xbf, 0xde, 0x2a, 0x18, - 0xbe, 0x45, 0x3d, 0xb4, 0x21, 0x0d, 0xda, 0xa6, 0xe8, 0x16, 0xfb, 0xbc, 0x32, 0x90, 0x26, 0xea, 0x19, 0x33, 0x59, - 0x12, 0x2c, 0x17, 0xc0, 0x08, 0x95, 0x0c, 0x66, 0x66, 0x4e, 0x3f, 0x77, 0xa7, 0x44, 0xa8, 0x90, 0x57, 0xfa, 0xf4, - 0xe9, 0xfd, 0xe0, 0xdf, 0xff, 0x82, 0x74, 0x9b, 0x33, 0x47, 0xc4, 0x94, 0xb8, 0x94, 0x6b, 0x71, 0xee, 0xd3, 0x18, - 0xa0, 0xb1, 0x14, 0x1b, 0x8b, 0x68, 0x7f, 0x62, 0x6b, 0x65, 0x83, 0x2b, 0x11, 0xa7, 0x0e, 0x12, 0xf5, 0xea, 0x22, - 0xf2, 0xc5, 0x00, 0x96, 0x77, 0x20, 0x62, 0xa2, 0x28, 0x7f, 0xbf, 0x7d, 0x79, 0xac, 0x14, 0xe1, 0x13, 0x9b, 0x2c, - 0x7a, 0x68, 0x0f, 0xf5, 0x4f, 0x3c, 0x05, 0x99, 0x16, 0x64, 0x3f, 0x92, 0xee, 0x3e, 0x0c, 0x73, 0x16, 0xcd, 0x99, - 0xe5, 0x47, 0xfb, 0x2b, 0x36, 0x34, 0xbd, 0x85, 0x4f, 0x76, 0x39, 0x28, 0x77, 0x53, 0x88, 0xf3, 0xcb, 0xcd, 0x5d, - 0x88, 0xbf, 0xce, 0x8a, 0xa9, 0x8c, 0x2a, 0x81, 0xd0, 0x5a, 0x85, 0x1e, 0xf0, 0x80, 0x07, 0x19, 0x13, 0x35, 0xfb, - 0x27, 0xfb, 0x5e, 0xbf, 0x9c, 0x79, 0xc6, 0x12, 0x19, 0x54, 0xcb, 0x44, 0xe0, 0x94, 0x12, 0xc8, 0x88, 0x5c, 0x31, - 0xc5, 0x83, 0x19, 0x4d, 0x26, 0x72, 0xb6, 0x18, 0xab, 0x0c, 0x5e, 0x3e, 0x69, 0xc5, 0x96, 0x8e, 0x16, 0xf4, 0xa5, - 0xfa, 0x27, 0xf2, 0x9f, 0x6a, 0x17, 0xd3, 0x44, 0xc1, 0x98, 0xe1, 0xb8, 0xd7, 0xb2, 0xce, 0xe4, 0x33, 0xf6, 0x88, - 0x2a, 0x71, 0x3c, 0x52, 0xcd, 0x71, 0xb8, 0x81, 0x73, 0xd9, 0x73, 0x5d, 0x42, 0x73, 0x55, 0x6c, 0x07, 0x93, 0xd8, - 0x90, 0x4d, 0x16, 0x06, 0x9b, 0x42, 0x43, 0x93, 0xdc, 0x65, 0xb1, 0x51, 0x75, 0x38, 0x75, 0x18, 0xf7, 0x3d, 0xb1, - 0xfd, 0x4a, 0x1b, 0x14, 0x36, 0x1e, 0x5f, 0x77, 0xc0, 0xef, 0xa2, 0x9f, 0x0a, 0x9a, 0x57, 0xbe, 0x26, 0x8c, 0x6e, - 0x06, 0xde, 0x5d, 0x24, 0x99, 0x31, 0xf1, 0x88, 0x26, 0xe7, 0x58, 0x7a, 0x21, 0x3c, 0x89, 0x6b, 0x07, 0x0d, 0x49, - 0x18, 0x64, 0xdd, 0xac, 0x1f, 0xb6, 0x82, 0xfe, 0x06, 0xec, 0xbe, 0xb3, 0x26, 0xd7, 0x2d, 0x0f, 0x06, 0x91, 0x67, - 0x56, 0x9c, 0xc3, 0xd2, 0x4b, 0x44, 0x0b, 0xd9, 0xc9, 0x3e, 0x8c, 0x0f, 0xa2, 0xb0, 0x94, 0x18, 0x27, 0x5f, 0x87, - 0x50, 0x2f, 0x5e, 0x42, 0xa6, 0x58, 0xdf, 0x8f, 0x05, 0xcf, 0x87, 0x17, 0x4b, 0x29, 0x97, 0xbc, 0x54, 0xa5, 0xce, - 0xcb, 0xd8, 0xcd, 0x4c, 0xe0, 0xfd, 0x29, 0x6a, 0x3f, 0x2c, 0x31, 0x3f, 0x6d, 0xd6, 0x4b, 0x99, 0x08, 0x72, 0x70, - 0x9e, 0x6e, 0x88, 0x83, 0xb0, 0xa9, 0x0a, 0xf1, 0xb3, 0x5b, 0x2a, 0x14, 0xfb, 0x78, 0x5b, 0xad, 0x82, 0x73, 0x2a, - 0xaa, 0x79, 0x9a, 0xfa, 0x08, 0x77, 0x7c, 0xad, 0x36, 0x96, 0x62, 0x74, 0x86, 0xd4, 0x85, 0xaa, 0x42, 0x16, 0xef, - 0x2d, 0x16, 0x54, 0x59, 0xef, 0x9d, 0xec, 0xd3, 0xb5, 0xb4, 0x4f, 0x3b, 0xac, 0x7f, 0x02, 0xa6, 0xdc, 0xb4, 0xe8, - 0xde, 0x62, 0xc1, 0x97, 0x94, 0x7e, 0xd1, 0x9b, 0xfd, 0x59, 0x3a, 0x0f, 0xfa, 0xff, 0x0b, 0x3a, 0x5f, 0xcc, 0x86, - 0x37, 0x7a, 0x03, 0x00}; + 0x2a, 0x34, 0x7d, 0xe4, 0x37, 0x22, 0x0d, 0x08, 0x0c, 0xda, 0x65, 0x6f, 0xab, 0xd2, 0x82, 0x6c, 0x3a, 0xb6, 0xd2, + 0xe4, 0xa0, 0x83, 0x03, 0xc4, 0xf8, 0x15, 0x62, 0x21, 0x42, 0x3b, 0xbc, 0x0e, 0x3e, 0x64, 0x6a, 0xce, 0xfb, 0xe1, + 0xf6, 0xeb, 0x9f, 0xec, 0x43, 0x83, 0x7e, 0x45, 0xe9, 0x76, 0x8f, 0x5f, 0x26, 0xb0, 0x12, 0xc9, 0xca, 0xb0, 0x92, + 0x95, 0xf2, 0x6c, 0x2d, 0xe2, 0x63, 0xa7, 0xde, 0xc2, 0x04, 0x2d, 0x0f, 0xe2, 0x5e, 0x8e, 0xf1, 0xa4, 0x50, 0xdc, + 0xbd, 0x65, 0x02, 0xb8, 0x11, 0xe5, 0x28, 0x88, 0x7f, 0x7a, 0xa3, 0x65, 0x9c, 0x44, 0x71, 0x77, 0x11, 0xf9, 0x61, + 0xca, 0xe2, 0x8c, 0x04, 0x2b, 0x38, 0x3f, 0x62, 0x7a, 0xae, 0xd6, 0xd1, 0xc2, 0x1b, 0xf9, 0xe9, 0x5d, 0xd7, 0xe6, + 0x2c, 0x85, 0xdd, 0xe3, 0xdc, 0x81, 0x5d, 0x5b, 0xbf, 0xcb, 0x67, 0xf3, 0x39, 0x32, 0x7e, 0xf1, 0x26, 0x3b, 0x23, + 0x6f, 0xf3, 0x9e, 0xf4, 0x96, 0x22, 0x84, 0x03, 0xfb, 0xe1, 0xc5, 0xe6, 0x14, 0xb0, 0x3c, 0x2c, 0xb5, 0x3d, 0x66, + 0x53, 0x03, 0xb1, 0x36, 0x98, 0x19, 0x8a, 0x3f, 0xd6, 0xa1, 0xae, 0xd8, 0xf5, 0xc5, 0xc0, 0xf1, 0xe8, 0xbb, 0x40, + 0xd6, 0xf5, 0x26, 0x29, 0x8b, 0x8d, 0x5d, 0x6a, 0x0e, 0xd9, 0x24, 0x8a, 0x19, 0x65, 0x93, 0x73, 0x3a, 0x8b, 0xdb, + 0xdd, 0xbb, 0xdf, 0x3e, 0xfc, 0xfa, 0x7e, 0xc2, 0x28, 0xd5, 0x44, 0x67, 0xfa, 0x3d, 0xbd, 0x6d, 0xd2, 0x33, 0x60, + 0x0d, 0x69, 0xe6, 0x47, 0x24, 0x05, 0x81, 0x48, 0x60, 0xb5, 0x49, 0x3b, 0x16, 0x11, 0xa7, 0x79, 0x31, 0x0b, 0xbc, + 0xd4, 0xbf, 0x11, 0x3c, 0x63, 0xfb, 0x68, 0x71, 0x2b, 0xd6, 0x18, 0x09, 0xde, 0x03, 0x16, 0xa9, 0x02, 0x8a, 0x58, + 0xa4, 0x6a, 0x31, 0x2e, 0x52, 0x6f, 0x63, 0x34, 0x22, 0x8e, 0x75, 0x85, 0xd2, 0x1f, 0x2e, 0x6e, 0x65, 0x12, 0x5d, + 0x34, 0xcb, 0x29, 0x75, 0x35, 0x01, 0xc9, 0xdc, 0x1f, 0x8f, 0x03, 0x96, 0x95, 0x16, 0xba, 0xbc, 0x96, 0xd2, 0xe4, + 0xe4, 0xf3, 0xe0, 0x0d, 0x93, 0x28, 0x58, 0xa6, 0xac, 0x7e, 0xba, 0x84, 0x44, 0xb7, 0x98, 0x1c, 0xfc, 0x5d, 0x86, + 0xf5, 0x10, 0xd8, 0x6d, 0xd8, 0x26, 0x76, 0x0f, 0xf2, 0x0d, 0x9a, 0xed, 0x32, 0xe8, 0xf0, 0x2a, 0x07, 0xda, 0xa8, + 0x19, 0x88, 0x01, 0x64, 0x89, 0xb0, 0xb7, 0x62, 0x39, 0xbc, 0x2c, 0xcf, 0xb9, 0x96, 0x17, 0x65, 0xe5, 0xc1, 0xfc, + 0x3e, 0x67, 0xec, 0x45, 0xfd, 0x19, 0x7b, 0x21, 0xce, 0xd8, 0xf6, 0x9d, 0xf9, 0x68, 0xe2, 0xc0, 0x7f, 0xbd, 0x62, + 0x40, 0x5d, 0x5b, 0x69, 0x2f, 0x6e, 0x15, 0x67, 0x71, 0xab, 0x98, 0xad, 0xc5, 0xad, 0x82, 0x5d, 0xa3, 0x7b, 0x8b, + 0x61, 0xb5, 0x74, 0xc3, 0x56, 0xa0, 0x10, 0xfe, 0xd8, 0xa5, 0x57, 0xce, 0x01, 0xbc, 0x83, 0x56, 0x87, 0x9b, 0xef, + 0x5a, 0xdb, 0x8f, 0x3a, 0x9d, 0x25, 0x81, 0xb4, 0x75, 0x2b, 0xf5, 0x86, 0x43, 0x10, 0x65, 0x46, 0xa3, 0x65, 0xf2, + 0x0f, 0x0e, 0x3f, 0x9f, 0xc4, 0xad, 0x88, 0xa0, 0xd2, 0x8f, 0x68, 0x0a, 0x8a, 0xc2, 0x1b, 0x26, 0x7a, 0x58, 0xe7, + 0xeb, 0xd4, 0xa5, 0xe4, 0x88, 0x2d, 0xeb, 0xa0, 0x66, 0x93, 0xd7, 0x4f, 0xf4, 0xef, 0xb6, 0x4a, 0xcd, 0x28, 0xe6, + 0x33, 0xa6, 0x65, 0xeb, 0x74, 0x3c, 0x7c, 0x36, 0xf8, 0x6a, 0xda, 0x9d, 0x7a, 0x70, 0x2f, 0xc5, 0x97, 0xae, 0x04, + 0x51, 0xe1, 0x74, 0x8b, 0x87, 0xe2, 0xd8, 0xde, 0x6b, 0xd3, 0x1e, 0xd9, 0xe8, 0x75, 0x0b, 0x41, 0x28, 0xea, 0xee, + 0x88, 0xe5, 0x1f, 0xbd, 0x38, 0x80, 0xff, 0x88, 0xab, 0xff, 0x6b, 0x5a, 0xc7, 0xa8, 0xbf, 0x4e, 0x4b, 0x8c, 0x3a, + 0xb1, 0x4a, 0xc8, 0x88, 0xef, 0x5e, 0x7f, 0x32, 0x79, 0x58, 0x83, 0x9d, 0x6b, 0x93, 0x67, 0x58, 0xb5, 0xf6, 0xcb, + 0x28, 0x0a, 0x98, 0x17, 0x6e, 0x56, 0x17, 0xd3, 0x43, 0x6e, 0xfe, 0xa9, 0x0b, 0x8d, 0xc4, 0x3d, 0x82, 0x9c, 0x12, + 0x54, 0x6c, 0x43, 0x57, 0x89, 0xf3, 0xa6, 0xab, 0xc4, 0xbb, 0xfb, 0xaf, 0x12, 0x3f, 0xec, 0x74, 0x95, 0x78, 0xf7, + 0xc5, 0xaf, 0x12, 0xe7, 0x9b, 0x57, 0x89, 0xf3, 0x48, 0xb8, 0x03, 0x1b, 0x6f, 0x96, 0xfc, 0xe7, 0x07, 0xb2, 0xf7, + 0x7d, 0x17, 0xb9, 0x87, 0x36, 0x25, 0x3c, 0xbc, 0xf8, 0xcd, 0x17, 0x0b, 0xdc, 0x88, 0xef, 0xd0, 0x3b, 0xae, 0xb8, + 0x5a, 0x70, 0xcc, 0x8e, 0xdf, 0x91, 0x8a, 0x83, 0x28, 0x9c, 0xfe, 0x0c, 0xf6, 0xde, 0x20, 0x0e, 0x8c, 0xa5, 0x17, + 0x7e, 0xf2, 0x73, 0xb4, 0x58, 0x2e, 0x50, 0x51, 0xf5, 0xc1, 0x4f, 0xfc, 0x61, 0xc0, 0xf2, 0x08, 0x93, 0xa4, 0x75, + 0xe5, 0xb2, 0x75, 0x50, 0xbc, 0x8a, 0x9f, 0xde, 0xad, 0xf8, 0x89, 0x2e, 0xb6, 0xfc, 0x37, 0xb9, 0x09, 0xaa, 0xf5, + 0x17, 0x11, 0x61, 0x21, 0x26, 0x01, 0xfd, 0xf0, 0xcb, 0xc8, 0xb9, 0x88, 0xe5, 0x55, 0x1a, 0xa5, 0x70, 0xdf, 0x68, + 0xec, 0x87, 0x55, 0xfb, 0x79, 0xb3, 0xd4, 0x8d, 0x3c, 0x01, 0xc7, 0xa6, 0x38, 0x7f, 0x1e, 0x2d, 0x13, 0x36, 0x8e, + 0x56, 0xa1, 0x6a, 0x84, 0x5c, 0xaf, 0x1a, 0xa1, 0x4c, 0x3d, 0x6f, 0x53, 0x56, 0x38, 0xaa, 0xd6, 0x02, 0xe6, 0xd0, + 0x24, 0x0d, 0xb6, 0x89, 0x43, 0x54, 0x45, 0xc8, 0xa6, 0xde, 0x9e, 0xa6, 0x45, 0xee, 0xc3, 0x5a, 0x0a, 0xcf, 0x93, + 0xc8, 0xe2, 0x52, 0xe1, 0x44, 0x0b, 0x85, 0x70, 0x51, 0x44, 0xc1, 0xae, 0x59, 0x38, 0xfe, 0x86, 0x22, 0x44, 0x16, + 0x6f, 0x41, 0x57, 0x95, 0x2d, 0xf9, 0x7a, 0xf0, 0x98, 0xd0, 0xf4, 0xf8, 0x4a, 0x9a, 0xc6, 0xb7, 0x37, 0x2c, 0x0e, + 0xbc, 0x3b, 0x4d, 0xcf, 0xa2, 0xf0, 0x47, 0x98, 0x80, 0xd7, 0xd1, 0x2a, 0x94, 0x2b, 0x60, 0xaa, 0xf6, 0x9a, 0xbd, + 0x54, 0x1b, 0xbd, 0x1c, 0x62, 0x76, 0x48, 0x10, 0xf8, 0xd6, 0xc2, 0x9b, 0xb2, 0xff, 0x32, 0xe8, 0xdf, 0xff, 0xd6, + 0x33, 0xe3, 0x5d, 0x94, 0x7f, 0xe8, 0x97, 0xc5, 0x0e, 0x9f, 0x79, 0xf2, 0x64, 0xaf, 0x79, 0xd8, 0xda, 0x28, 0x60, + 0x5e, 0x2c, 0xa0, 0xa8, 0x69, 0xad, 0x37, 0x9e, 0x02, 0x80, 0xe2, 0x22, 0x5a, 0x8e, 0x66, 0xe8, 0xb7, 0xfb, 0xe5, + 0xc6, 0x9b, 0x42, 0x9f, 0x2c, 0xb9, 0xb4, 0xaf, 0xf2, 0xa1, 0x57, 0x8a, 0x8a, 0x59, 0xc0, 0xef, 0x9f, 0x41, 0xfa, + 0xad, 0x7f, 0xe3, 0x34, 0x6c, 0xee, 0x9a, 0x3c, 0xe4, 0xd7, 0x83, 0x36, 0x6f, 0xcf, 0x87, 0xa8, 0x3c, 0x14, 0xd8, + 0x5a, 0x28, 0xe9, 0xea, 0x91, 0x4c, 0x56, 0x9d, 0x34, 0x39, 0x89, 0x4c, 0x53, 0x7e, 0x1c, 0xf1, 0x15, 0x66, 0x95, + 0xac, 0x46, 0x0c, 0xc6, 0xb1, 0x55, 0x05, 0xc9, 0x70, 0x6f, 0x0a, 0x86, 0xe8, 0xab, 0xfa, 0x6e, 0xee, 0x87, 0x06, + 0xe6, 0x80, 0xdd, 0x7c, 0xe3, 0xdd, 0x42, 0x16, 0x44, 0x40, 0x6e, 0xd5, 0x57, 0x50, 0x68, 0xc8, 0xd1, 0x82, 0xbc, + 0xf1, 0x58, 0x53, 0x6b, 0x67, 0x42, 0x68, 0x03, 0x07, 0x5f, 0x29, 0x8a, 0xa2, 0xe4, 0xd7, 0x08, 0x25, 0xbf, 0x47, + 0x60, 0x39, 0x5e, 0x07, 0x40, 0x5b, 0x92, 0x2d, 0x6e, 0xa9, 0x04, 0x6e, 0x06, 0x68, 0x3f, 0x2d, 0x0a, 0x78, 0xa2, + 0x1f, 0x30, 0x6e, 0xa1, 0x02, 0x71, 0xa1, 0x07, 0xd5, 0xb7, 0x17, 0x43, 0x3e, 0xc0, 0xae, 0x82, 0x17, 0x76, 0x7c, + 0xcb, 0x25, 0xc1, 0x8a, 0x4d, 0x8f, 0x83, 0x1e, 0xab, 0xcf, 0x08, 0x13, 0x4a, 0x58, 0x10, 0xb4, 0x0e, 0x95, 0x04, + 0x8f, 0x06, 0xab, 0xc1, 0x8d, 0x78, 0x2f, 0xba, 0x4d, 0xe7, 0x2c, 0x5c, 0xaa, 0x06, 0x58, 0x9d, 0x60, 0x86, 0x1e, + 0xa8, 0xf3, 0x9a, 0x98, 0x2d, 0xc0, 0x36, 0xf5, 0x2d, 0x67, 0x44, 0x0b, 0x85, 0xa9, 0x8a, 0x67, 0x8c, 0x78, 0x00, + 0x9c, 0x84, 0xe3, 0xb6, 0x2a, 0x85, 0xe0, 0x4b, 0x1a, 0x95, 0xb1, 0x39, 0x0f, 0x79, 0x85, 0x9c, 0x02, 0xd9, 0x88, + 0x71, 0x71, 0x91, 0x98, 0x76, 0xcd, 0xab, 0x2e, 0x5a, 0xae, 0x91, 0xf1, 0x2a, 0x82, 0xa2, 0x58, 0xdf, 0xec, 0x86, + 0xc3, 0x09, 0x69, 0x09, 0x1a, 0xfb, 0x19, 0x6d, 0xf4, 0xd3, 0x30, 0xe8, 0x8f, 0xec, 0x8e, 0x08, 0x09, 0x4d, 0xd5, + 0x47, 0x76, 0x07, 0xc6, 0xe1, 0x67, 0x20, 0x4d, 0x51, 0xb7, 0xa0, 0x6b, 0x03, 0x12, 0xfd, 0x8e, 0x20, 0x55, 0xc5, + 0x96, 0x03, 0x64, 0x67, 0x5b, 0xb0, 0x38, 0x85, 0x23, 0x35, 0x92, 0x9e, 0x38, 0xc4, 0x3c, 0x62, 0x81, 0x56, 0x3b, + 0xc7, 0x66, 0xcd, 0xd1, 0xd0, 0x9f, 0x39, 0xb6, 0xbd, 0xbf, 0x51, 0x1f, 0x04, 0xd9, 0x75, 0xb5, 0x75, 0x23, 0x75, + 0x1d, 0xdb, 0xf4, 0x9f, 0x59, 0xad, 0xde, 0x06, 0x8d, 0x96, 0x32, 0x49, 0x0d, 0x50, 0xfc, 0xd5, 0x7f, 0xbc, 0xd6, + 0x36, 0x0e, 0xa4, 0x5e, 0x8d, 0x00, 0x80, 0xb0, 0x65, 0x5c, 0xfe, 0x35, 0xd8, 0x24, 0xfd, 0x94, 0xc7, 0x8a, 0xb2, + 0x9a, 0x0f, 0x20, 0x17, 0xa2, 0x06, 0xc7, 0xe8, 0x4f, 0xca, 0x73, 0x45, 0xa3, 0xe3, 0xa3, 0xeb, 0x83, 0x9e, 0xc0, + 0x28, 0x22, 0x44, 0x8e, 0xdc, 0x41, 0xe5, 0x8b, 0x49, 0x15, 0xc3, 0xf1, 0xac, 0x6b, 0xac, 0xd0, 0xe8, 0x6d, 0xe5, + 0x16, 0xb0, 0xff, 0x06, 0xf2, 0x69, 0x0d, 0x21, 0xc6, 0x23, 0xd4, 0x80, 0xcc, 0xa9, 0xf7, 0x76, 0x08, 0xe1, 0x79, + 0xe5, 0xee, 0xca, 0x44, 0x72, 0xf7, 0xce, 0x90, 0xe8, 0xa0, 0x0e, 0x2d, 0xef, 0xaf, 0x9e, 0xdc, 0x3d, 0xb0, 0x4b, + 0x16, 0x8e, 0xcb, 0x1d, 0x56, 0xe8, 0xd7, 0xee, 0xdd, 0x95, 0x30, 0x0a, 0xa4, 0x14, 0x8e, 0x6a, 0x30, 0x4a, 0x16, + 0x85, 0xb8, 0xf9, 0xe9, 0xb8, 0xf9, 0x3b, 0x71, 0x31, 0xd8, 0x80, 0xf2, 0x81, 0xe4, 0xcd, 0x24, 0xa1, 0x38, 0xe4, + 0xad, 0xc4, 0x08, 0x5a, 0x9a, 0x60, 0x44, 0x1b, 0x77, 0x62, 0x2a, 0xdc, 0x15, 0x8b, 0x36, 0x3e, 0xcf, 0x44, 0xb5, + 0xab, 0xd4, 0xda, 0xbf, 0x5f, 0x6a, 0x9d, 0xde, 0x27, 0xb5, 0xa6, 0xe8, 0x30, 0xdc, 0x1e, 0x54, 0x44, 0xc9, 0x11, + 0xcc, 0xb9, 0x1c, 0x67, 0xa8, 0x24, 0xea, 0xc6, 0x60, 0x32, 0x35, 0x56, 0xa4, 0xd4, 0x1b, 0x39, 0x20, 0xa2, 0xf8, + 0x5b, 0xba, 0xa0, 0x08, 0x85, 0xba, 0x2c, 0x1b, 0x3f, 0x2f, 0x64, 0xe3, 0x74, 0xab, 0x29, 0xe2, 0x82, 0x08, 0xee, + 0x5f, 0x8a, 0xb9, 0x93, 0xdf, 0x0e, 0x8a, 0xd8, 0x3b, 0x05, 0xa4, 0x52, 0x34, 0x99, 0xe2, 0xa2, 0x21, 0xc5, 0x28, + 0x12, 0xb7, 0x8c, 0x72, 0xa8, 0xa2, 0x72, 0xd5, 0x22, 0x98, 0x4c, 0x51, 0x0e, 0x52, 0x77, 0x04, 0x39, 0x2f, 0x96, + 0xb7, 0x4d, 0x39, 0x9a, 0x88, 0xfc, 0x5a, 0xda, 0x24, 0x79, 0xd8, 0x0f, 0x9a, 0x60, 0x21, 0xa6, 0xaf, 0xe8, 0xb5, + 0x73, 0x1b, 0x08, 0x04, 0xb2, 0x26, 0x4a, 0xd1, 0xfd, 0xd2, 0x79, 0xca, 0x96, 0x5c, 0xa8, 0xae, 0x1d, 0xa4, 0xee, + 0xa4, 0x09, 0x96, 0xe5, 0x11, 0x38, 0xd7, 0x57, 0x92, 0x04, 0xa1, 0x6b, 0x2b, 0x76, 0xaf, 0x86, 0x01, 0x40, 0xfa, + 0x5f, 0x7d, 0xe6, 0xac, 0x00, 0x48, 0x22, 0x15, 0x5b, 0xd6, 0xf9, 0xe3, 0x21, 0x36, 0xc9, 0x92, 0x1d, 0xab, 0x6e, + 0x7e, 0x93, 0xe4, 0x3d, 0x6b, 0x1e, 0x13, 0xa4, 0x2c, 0xce, 0xe7, 0x35, 0xba, 0x02, 0x0e, 0xbe, 0xcb, 0xe2, 0x65, + 0x88, 0x49, 0x70, 0xcd, 0x34, 0xf6, 0x46, 0x1f, 0xd7, 0xd2, 0xf7, 0xb8, 0x48, 0x14, 0xc4, 0xc5, 0x65, 0xa5, 0x42, + 0xcf, 0xc3, 0x9c, 0x51, 0xac, 0x6b, 0xb5, 0x12, 0x49, 0x50, 0xd3, 0x7d, 0x64, 0xb7, 0xbd, 0x17, 0x93, 0x83, 0x8a, + 0xfc, 0xb4, 0x75, 0x58, 0x96, 0xae, 0xe7, 0x70, 0xcc, 0xa3, 0x5f, 0x79, 0xf4, 0xa4, 0x3f, 0xfe, 0xd3, 0x09, 0xff, + 0x66, 0x65, 0x8d, 0x3e, 0x07, 0x04, 0x68, 0x5f, 0x52, 0x4c, 0xcb, 0x6a, 0x9a, 0x8d, 0x92, 0x26, 0xb0, 0x26, 0x7e, + 0x10, 0x98, 0x01, 0xb8, 0x31, 0xac, 0x3f, 0x6b, 0x78, 0xd8, 0xcf, 0x12, 0xb2, 0x15, 0x7e, 0x46, 0x3f, 0xe5, 0x9d, + 0x92, 0xce, 0x96, 0xf3, 0xe1, 0x5a, 0x16, 0x94, 0x4b, 0xf2, 0xf3, 0x4d, 0x99, 0xb9, 0xfc, 0xd9, 0xc9, 0x64, 0x52, + 0x96, 0x1a, 0xdb, 0xca, 0x01, 0x4a, 0x7e, 0x1f, 0xd9, 0xb6, 0x5d, 0x9d, 0xdf, 0xa6, 0x83, 0x42, 0x07, 0xc3, 0x44, + 0x21, 0x7c, 0xe7, 0xfe, 0x3d, 0xf5, 0x07, 0x41, 0x4b, 0x5d, 0x35, 0x9d, 0x47, 0xda, 0x6a, 0xff, 0x11, 0xa0, 0x20, + 0x6a, 0xb8, 0xef, 0xf8, 0x6f, 0xee, 0x95, 0x2d, 0x3d, 0x55, 0x0f, 0xf0, 0xc3, 0x1a, 0xdf, 0xb3, 0xd7, 0x77, 0x68, + 0xda, 0xb4, 0xbd, 0x33, 0xab, 0x20, 0xbb, 0x25, 0x9b, 0xa5, 0x1e, 0x59, 0x2a, 0xf9, 0x29, 0x9b, 0x27, 0xdd, 0x11, + 0x43, 0x05, 0xa9, 0x25, 0x51, 0x5b, 0xb4, 0xea, 0x31, 0xa7, 0x60, 0xc7, 0xe5, 0x08, 0x3c, 0x6c, 0x2b, 0xa8, 0xac, + 0xda, 0xd0, 0xac, 0x89, 0x8f, 0x20, 0x15, 0x5b, 0x6f, 0x2a, 0x9c, 0x70, 0x9b, 0x1e, 0xda, 0x7f, 0x2a, 0xd5, 0x53, + 0x80, 0x3b, 0x5d, 0x0b, 0x6b, 0x13, 0x52, 0x9e, 0xe0, 0xdf, 0xb9, 0x72, 0xee, 0xc5, 0xe2, 0xb6, 0x6c, 0xdc, 0xd5, + 0x01, 0x75, 0x53, 0x41, 0xca, 0x08, 0xea, 0x3a, 0xd4, 0x97, 0x9b, 0x00, 0x4d, 0x64, 0xeb, 0x16, 0xb0, 0xa0, 0x11, + 0x53, 0x50, 0xd1, 0x11, 0xe6, 0xa0, 0xe2, 0x75, 0x16, 0x76, 0x5e, 0x21, 0xdf, 0xc7, 0x5f, 0x90, 0xa5, 0x1c, 0xd2, + 0x9d, 0xfc, 0xc9, 0x78, 0xde, 0x41, 0xe5, 0x5e, 0x69, 0xab, 0xa2, 0xa9, 0x0c, 0xee, 0x01, 0x71, 0x23, 0x55, 0x96, + 0x71, 0x60, 0x52, 0xe2, 0x7a, 0x4d, 0x5f, 0x6f, 0x8e, 0xbb, 0xb9, 0x7b, 0xe7, 0x10, 0xf4, 0x1a, 0x9b, 0x53, 0xb5, + 0x93, 0x6a, 0xaf, 0xaa, 0xc3, 0x16, 0x70, 0xc2, 0x0a, 0x80, 0xcf, 0xac, 0x82, 0x46, 0x43, 0x4a, 0x05, 0xf7, 0xd1, + 0xa0, 0xf3, 0xb7, 0x32, 0xb2, 0x16, 0xe3, 0xc4, 0xee, 0xea, 0xab, 0x50, 0xdf, 0x42, 0x33, 0x08, 0x73, 0xc7, 0xb1, + 0x13, 0x3e, 0x9b, 0xb0, 0x63, 0x64, 0x74, 0xe5, 0xe0, 0x0e, 0xc2, 0x53, 0x6a, 0x52, 0xf2, 0x13, 0x3a, 0xa5, 0xa8, + 0x4b, 0xf8, 0xa1, 0x56, 0x78, 0x7f, 0x51, 0x92, 0xc6, 0xf3, 0xa0, 0x13, 0x2d, 0x7d, 0xa7, 0xda, 0x73, 0x3f, 0xdc, + 0xbd, 0xae, 0x77, 0xbb, 0x73, 0x5d, 0x60, 0x0e, 0x77, 0xae, 0x0c, 0xdc, 0x25, 0x56, 0xbe, 0x48, 0xdd, 0x1f, 0x24, + 0xe5, 0x81, 0x1c, 0x30, 0x51, 0xc5, 0x56, 0x74, 0xa3, 0xff, 0x69, 0xe9, 0x0e, 0x4e, 0x4e, 0x6f, 0xe7, 0x81, 0x72, + 0xc3, 0xe2, 0x04, 0x12, 0x4a, 0xa8, 0x8e, 0x65, 0xab, 0x0a, 0x1a, 0xf4, 0xfb, 0xe1, 0xd4, 0x55, 0x7f, 0xb9, 0x78, + 0x63, 0x76, 0xd4, 0x53, 0x30, 0xc7, 0xb8, 0x99, 0x22, 0x8b, 0x7b, 0xee, 0xdd, 0xb1, 0xf8, 0xba, 0xc5, 0x3d, 0x7e, + 0x88, 0xb9, 0xc5, 0x32, 0xa5, 0xa5, 0xee, 0x90, 0x12, 0x5e, 0xb9, 0xf1, 0xd9, 0xea, 0x65, 0x74, 0xeb, 0xaa, 0x80, + 0x58, 0x9d, 0x56, 0x47, 0x71, 0x5a, 0x07, 0xd6, 0x51, 0x47, 0xed, 0x7f, 0xa5, 0x28, 0x27, 0x63, 0x36, 0x49, 0xfa, + 0x28, 0x8e, 0x39, 0x41, 0x7e, 0x90, 0x7e, 0x2b, 0x8a, 0x35, 0x0a, 0x12, 0xd3, 0x51, 0xd6, 0xfc, 0x51, 0x51, 0x00, + 0x19, 0x75, 0x95, 0x47, 0x93, 0xd6, 0xe4, 0x60, 0xf2, 0xa2, 0xc7, 0x8b, 0xb3, 0xaf, 0x4a, 0xd5, 0x0d, 0xfa, 0xb7, + 0x25, 0x35, 0x4b, 0xd2, 0x38, 0xfa, 0xc8, 0x38, 0x2f, 0xa9, 0xe4, 0x82, 0xa2, 0x6a, 0xd3, 0xd6, 0xe6, 0x97, 0x9c, + 0xce, 0x70, 0x34, 0x69, 0x15, 0xd5, 0x11, 0xc6, 0xfd, 0x1c, 0xc8, 0x93, 0x7d, 0x01, 0xfa, 0x89, 0x3c, 0x4d, 0x8e, + 0x59, 0x37, 0x51, 0x8e, 0xca, 0xc7, 0x38, 0x15, 0xe3, 0x3b, 0x81, 0x8c, 0x6b, 0x85, 0xf7, 0x62, 0x82, 0xcd, 0x5c, + 0xf5, 0x47, 0xa7, 0xd5, 0x31, 0x1c, 0xe7, 0xc8, 0x3a, 0xea, 0x8c, 0x6c, 0xe3, 0xc0, 0x3a, 0x30, 0xdb, 0xd6, 0x91, + 0xd1, 0x31, 0x3b, 0x46, 0xe7, 0xbb, 0xce, 0xc8, 0x3c, 0xb0, 0x0e, 0x0c, 0xdb, 0xec, 0x40, 0xa1, 0xd9, 0x31, 0x3b, + 0x37, 0xe6, 0x41, 0x67, 0x64, 0x63, 0x69, 0xcb, 0x3a, 0x3c, 0x34, 0x1d, 0xdb, 0x3a, 0x3c, 0x34, 0x0e, 0xad, 0xa3, + 0x23, 0xd3, 0x69, 0x5b, 0x47, 0x47, 0xe7, 0x87, 0x1d, 0xab, 0x0d, 0xef, 0xda, 0xed, 0x51, 0xdb, 0x72, 0x1c, 0x13, + 0xfe, 0x32, 0x3a, 0x56, 0x8b, 0x7e, 0x38, 0x8e, 0xd5, 0x76, 0x0c, 0x3b, 0x38, 0x6c, 0x59, 0x47, 0x2f, 0x0c, 0xfc, + 0x1b, 0xab, 0x19, 0xf8, 0x17, 0x74, 0x63, 0xbc, 0xb0, 0x5a, 0x47, 0xf4, 0x0b, 0x3b, 0xbc, 0x39, 0xe8, 0xfc, 0x55, + 0xdd, 0x6f, 0x1c, 0x83, 0x43, 0x63, 0xe8, 0x1c, 0x5a, 0xed, 0xb6, 0x71, 0xe0, 0x58, 0x9d, 0xf6, 0xcc, 0x3c, 0x68, + 0x59, 0x47, 0xc7, 0x23, 0xd3, 0xb1, 0x8e, 0x8f, 0x0d, 0xdb, 0x6c, 0x5b, 0x2d, 0xc3, 0xb1, 0x0e, 0xda, 0xf8, 0xa3, + 0x6d, 0xb5, 0x6e, 0x8e, 0x5f, 0x58, 0x47, 0x87, 0xb3, 0x23, 0xeb, 0xe0, 0xc3, 0x41, 0xc7, 0x6a, 0xb5, 0x67, 0xed, + 0x23, 0xab, 0x75, 0x7c, 0x73, 0x64, 0x1d, 0xcc, 0xcc, 0xd6, 0xd1, 0xd6, 0x96, 0x4e, 0xcb, 0x82, 0x39, 0xc2, 0xd7, + 0xf0, 0xc2, 0xe0, 0x2f, 0xe0, 0xcf, 0x0c, 0xdb, 0xfe, 0x81, 0xdd, 0x24, 0x9b, 0x4d, 0x5f, 0x58, 0x9d, 0xe3, 0x11, + 0x55, 0x87, 0x02, 0x53, 0xd4, 0x80, 0x26, 0x37, 0x26, 0x7d, 0x16, 0xbb, 0x33, 0x45, 0x47, 0xe2, 0x0f, 0xff, 0xd8, + 0x8d, 0x09, 0x1f, 0xa6, 0xef, 0xfe, 0x5b, 0xfb, 0xc9, 0x97, 0xfc, 0x64, 0x7f, 0x4a, 0x5b, 0x7f, 0xda, 0xff, 0xea, + 0x04, 0x0e, 0x77, 0x7f, 0x60, 0xfc, 0xda, 0xa4, 0x94, 0xfc, 0xfb, 0xfd, 0x4a, 0xc9, 0x97, 0xcb, 0x5d, 0x94, 0x92, + 0x7f, 0xff, 0xe2, 0x4a, 0xc9, 0x5f, 0xab, 0xbe, 0x35, 0x6f, 0xaa, 0x59, 0xa8, 0x7f, 0x58, 0x57, 0x45, 0x0e, 0x89, + 0xa7, 0x5d, 0xfe, 0xb4, 0xbc, 0x82, 0xf8, 0xf1, 0x6f, 0x22, 0xf7, 0xe5, 0xb2, 0x64, 0xf0, 0x19, 0x01, 0x8e, 0x7d, + 0x13, 0x11, 0x8e, 0xfd, 0xb0, 0x74, 0xc1, 0xca, 0x8c, 0xb3, 0x39, 0xfe, 0xd8, 0x9c, 0x79, 0xc1, 0x24, 0x67, 0x91, + 0xa0, 0xa4, 0x87, 0xc5, 0xe0, 0x37, 0x0f, 0xe4, 0x19, 0x6e, 0x32, 0xcb, 0x79, 0x98, 0x80, 0x45, 0x30, 0x58, 0x72, + 0x4c, 0xe2, 0xac, 0xd2, 0xd8, 0x12, 0x11, 0xf7, 0xaf, 0xb9, 0x47, 0x71, 0xe3, 0x7b, 0x34, 0x00, 0xae, 0xef, 0xdd, + 0xd9, 0xec, 0x57, 0x01, 0xcb, 0x3a, 0x61, 0x20, 0x0d, 0xdc, 0x7e, 0xdd, 0xfb, 0xb2, 0x19, 0x6e, 0xc5, 0xf0, 0xba, + 0x19, 0x52, 0x80, 0xa4, 0xda, 0xde, 0x29, 0x9b, 0xf1, 0xde, 0x37, 0xcc, 0x9a, 0xcf, 0x97, 0x9a, 0x6f, 0xb1, 0x21, + 0xce, 0x3b, 0xae, 0x4e, 0xd5, 0xba, 0xc4, 0xa7, 0xd5, 0x4f, 0x48, 0x71, 0x41, 0x2d, 0x0c, 0x8d, 0x0b, 0x4e, 0xd5, + 0x56, 0x90, 0xdf, 0xb1, 0xa5, 0x77, 0xa5, 0x3e, 0x65, 0xe3, 0xe4, 0x67, 0x6b, 0xbc, 0x57, 0xf8, 0xbf, 0x02, 0x27, + 0xca, 0x39, 0x9e, 0x61, 0x24, 0xcf, 0xf3, 0x5a, 0xea, 0x97, 0xa4, 0x11, 0xd9, 0xcc, 0x59, 0x6f, 0xf2, 0xa2, 0x8d, + 0x6e, 0x09, 0x0e, 0x9b, 0x0b, 0x2e, 0x08, 0x3f, 0x4f, 0x4e, 0x00, 0x19, 0x39, 0x6a, 0xa0, 0x9f, 0xc3, 0xb6, 0xce, + 0x44, 0xbd, 0x47, 0xb0, 0x89, 0xb9, 0x27, 0xa0, 0x22, 0x87, 0x34, 0x5d, 0x4f, 0x82, 0xc8, 0x4b, 0xbb, 0xc8, 0xa6, + 0x49, 0x2c, 0x6f, 0x0b, 0x3d, 0x16, 0x7a, 0x5b, 0x8c, 0xe9, 0xe4, 0x8e, 0x79, 0x27, 0xe8, 0xf9, 0xb0, 0xcd, 0xfe, + 0x2e, 0x77, 0x38, 0x5b, 0x97, 0xcc, 0x51, 0x9c, 0xc3, 0x63, 0xc3, 0x39, 0x32, 0xac, 0xe3, 0x43, 0x3d, 0x13, 0x07, + 0x4e, 0xee, 0xb2, 0x34, 0x21, 0xe0, 0x00, 0x91, 0x83, 0xe9, 0x87, 0x7e, 0xea, 0x7b, 0x41, 0x06, 0xfc, 0x70, 0xf9, + 0x92, 0xf2, 0xf7, 0x65, 0x92, 0xc2, 0x18, 0x05, 0xd3, 0x8b, 0xce, 0x1f, 0xe6, 0x90, 0xa5, 0x2b, 0xc6, 0xc2, 0x06, + 0xc3, 0x98, 0xaa, 0x2f, 0xc9, 0xef, 0x67, 0x59, 0x9f, 0x91, 0xd5, 0xda, 0x30, 0x0d, 0xf9, 0xfe, 0x10, 0x8e, 0x0f, + 0xd9, 0xc0, 0xf8, 0xae, 0x09, 0xe1, 0xfe, 0x72, 0x3f, 0xc2, 0x4d, 0xd9, 0x2e, 0x08, 0xf7, 0x97, 0x2f, 0x8e, 0x70, + 0xbf, 0x93, 0x11, 0x6e, 0xc9, 0x7f, 0xb0, 0xd0, 0x30, 0xbd, 0xc7, 0x67, 0x0d, 0x5c, 0x64, 0x9f, 0xab, 0xfb, 0xc4, + 0xc0, 0xab, 0x7a, 0x91, 0xbd, 0xf6, 0x2f, 0x4b, 0xd9, 0x82, 0x1a, 0x05, 0xa0, 0x98, 0xd7, 0xd1, 0x47, 0xd7, 0x65, + 0x1f, 0x5c, 0xdd, 0x44, 0x18, 0x06, 0xe8, 0xf3, 0xfb, 0x30, 0x0d, 0xac, 0x77, 0xfc, 0x1e, 0x09, 0x0a, 0xdd, 0x37, + 0x51, 0x3c, 0xf7, 0x30, 0xc5, 0x88, 0xaa, 0x83, 0x3b, 0x1d, 0x3c, 0xd8, 0x10, 0x08, 0x64, 0x14, 0x85, 0xe3, 0x5c, + 0x2b, 0xc9, 0xdc, 0x4b, 0xe2, 0xb8, 0xd5, 0x3b, 0xe6, 0xc5, 0xaa, 0x41, 0xaf, 0x61, 0x71, 0x9f, 0xb5, 0xed, 0x67, + 0xad, 0x83, 0x67, 0x47, 0x36, 0xfc, 0xef, 0xb0, 0x76, 0x66, 0xf0, 0x8a, 0xf3, 0x28, 0x4c, 0x67, 0x45, 0xcd, 0xa6, + 0x6a, 0x2b, 0xc6, 0x3e, 0x16, 0xb5, 0x8e, 0xeb, 0x2b, 0x8d, 0xbd, 0xbb, 0xa2, 0x4e, 0x6d, 0x8d, 0x59, 0xb4, 0x94, + 0xc0, 0xaa, 0x81, 0xc6, 0x0f, 0x97, 0x20, 0x67, 0x97, 0x6a, 0xc8, 0xaf, 0xf9, 0x70, 0x8b, 0x71, 0xb1, 0x76, 0x76, + 0x25, 0x72, 0x28, 0xa8, 0x3d, 0x91, 0x56, 0xef, 0xde, 0x19, 0xe4, 0x2a, 0x4a, 0x1b, 0x73, 0x4e, 0x61, 0x66, 0x43, + 0xc8, 0x38, 0xc5, 0xc4, 0x02, 0x79, 0xb4, 0x40, 0x69, 0xbc, 0x0c, 0x47, 0x1a, 0xfe, 0xf4, 0x86, 0x89, 0xe6, 0xef, + 0xc7, 0x16, 0xff, 0xb0, 0x8e, 0xab, 0xe6, 0xf5, 0xed, 0x22, 0xe9, 0x7c, 0x22, 0x56, 0xc5, 0x7b, 0x96, 0x1a, 0x31, + 0xea, 0xb1, 0x69, 0x69, 0x4d, 0xd7, 0x7b, 0x96, 0x37, 0x7c, 0x96, 0x1a, 0xe1, 0x73, 0xd0, 0x7d, 0xba, 0xf6, 0x93, + 0x27, 0x54, 0x6b, 0xcf, 0x15, 0xc3, 0x3a, 0x1d, 0x15, 0x99, 0x29, 0x14, 0x6f, 0x1a, 0x51, 0x72, 0x8a, 0xee, 0xc8, + 0x88, 0x9e, 0x3f, 0xef, 0xbb, 0x8e, 0x3e, 0x8c, 0x99, 0xf7, 0x31, 0x13, 0xe1, 0xbe, 0x43, 0xcc, 0x4f, 0x7b, 0xbe, + 0x9b, 0xa1, 0x91, 0x5e, 0xeb, 0x4a, 0xbb, 0x80, 0x3b, 0x93, 0x2d, 0xdc, 0x11, 0x38, 0xf6, 0x82, 0xdc, 0xf5, 0x64, + 0x50, 0xe0, 0x09, 0x83, 0x1f, 0x51, 0xe7, 0x7a, 0xe6, 0x25, 0x3f, 0x24, 0x51, 0xf8, 0xcb, 0x02, 0x82, 0x1f, 0x17, + 0x16, 0x45, 0xe2, 0x32, 0xd6, 0xb6, 0x6c, 0xcb, 0x56, 0xf3, 0xfe, 0x26, 0xfe, 0xd4, 0x5d, 0x47, 0xa9, 0xd7, 0xdd, + 0x73, 0x8c, 0x20, 0x9a, 0x82, 0x7b, 0x5d, 0xea, 0xa7, 0x01, 0xeb, 0xaa, 0x2a, 0xf8, 0xd9, 0xcd, 0xe9, 0xba, 0x9e, + 0x71, 0xa7, 0x07, 0x2f, 0x86, 0x6c, 0xe6, 0xf1, 0x9d, 0xf0, 0xd0, 0xc5, 0x18, 0xea, 0x3f, 0x02, 0x8d, 0xd4, 0x54, + 0x0d, 0x44, 0x06, 0x2c, 0x4e, 0x4c, 0xd9, 0x89, 0xa8, 0xab, 0x40, 0x1b, 0x5d, 0xe5, 0x63, 0x9b, 0xc4, 0xde, 0x1c, + 0xd2, 0xed, 0xae, 0x33, 0x83, 0x23, 0x60, 0x95, 0x63, 0x60, 0xc5, 0x79, 0x71, 0x64, 0x28, 0x2d, 0xc7, 0x50, 0x6c, + 0xc0, 0xc2, 0x6a, 0x66, 0xac, 0xb3, 0xab, 0xde, 0x7d, 0x76, 0x10, 0x84, 0x76, 0x1e, 0xd1, 0x38, 0xc8, 0x02, 0x82, + 0x6b, 0x98, 0x52, 0xca, 0x9d, 0xa3, 0x49, 0x89, 0x35, 0x7d, 0xd2, 0x85, 0x5e, 0xb0, 0xdb, 0x54, 0x07, 0x85, 0x92, + 0xa8, 0xe2, 0xeb, 0x6b, 0xf4, 0x23, 0xf6, 0x43, 0xc5, 0xff, 0xf4, 0x49, 0xf3, 0xc1, 0xc7, 0xc9, 0x95, 0xe6, 0x07, + 0x9e, 0xf5, 0xd2, 0x84, 0xf9, 0x85, 0xf6, 0x1e, 0x27, 0x0b, 0x1c, 0x10, 0xe1, 0xdf, 0xa2, 0x58, 0xfc, 0xe0, 0xd6, + 0x13, 0x56, 0xe0, 0x85, 0x53, 0xc0, 0x74, 0x5e, 0x38, 0xdd, 0xb0, 0xd2, 0x22, 0x57, 0xe8, 0x4a, 0x69, 0xd1, 0x55, + 0x61, 0x41, 0x95, 0xbc, 0xbc, 0xbb, 0xf0, 0xa6, 0x3f, 0x79, 0x73, 0xa6, 0xa9, 0x40, 0xfc, 0xd0, 0x73, 0xb7, 0x50, + 0xf0, 0x3e, 0x77, 0x9f, 0x9e, 0xcc, 0x59, 0xea, 0x91, 0x76, 0x08, 0xee, 0xc4, 0xc0, 0x25, 0x28, 0x9c, 0xfe, 0xf0, + 0x38, 0x18, 0x2e, 0xa5, 0xd8, 0x22, 0xf2, 0x61, 0x28, 0x9c, 0x7c, 0x99, 0x68, 0x08, 0xea, 0x3a, 0x06, 0xf9, 0x21, + 0x8c, 0x3c, 0x4c, 0xb3, 0xe3, 0x86, 0x91, 0xda, 0x7f, 0x9a, 0xbb, 0x6c, 0x36, 0x2d, 0x42, 0xe0, 0x87, 0x1f, 0x2f, + 0x63, 0x16, 0xfc, 0xc3, 0x7d, 0x0a, 0xf4, 0xfc, 0xe9, 0x95, 0xaa, 0xf7, 0x52, 0x6b, 0x16, 0xb3, 0x89, 0xfb, 0x14, + 0xee, 0xa9, 0x5d, 0xb4, 0x9a, 0x05, 0x66, 0xfe, 0xf9, 0xed, 0x3c, 0x30, 0xf0, 0xd6, 0x4f, 0xb0, 0xa8, 0xed, 0x56, + 0x11, 0xee, 0xbc, 0xbd, 0xd3, 0x5d, 0xbf, 0xcf, 0x2f, 0xf1, 0x70, 0x31, 0x5c, 0x97, 0xae, 0xde, 0x4e, 0x0f, 0xaf, + 0xd5, 0xc3, 0xc0, 0x1b, 0x7d, 0xec, 0xd1, 0x9b, 0xd2, 0x83, 0x09, 0x44, 0x7c, 0xe4, 0x2d, 0xba, 0x48, 0x75, 0xe5, + 0x42, 0x70, 0xaa, 0xa6, 0xd2, 0x9c, 0xe1, 0xab, 0xdd, 0xcb, 0xb8, 0x95, 0xd7, 0xf8, 0x65, 0xfc, 0xd4, 0x6a, 0xe6, + 0xa7, 0x4c, 0x7c, 0x0a, 0x1f, 0xb2, 0x4c, 0xdc, 0xdf, 0xe9, 0xe6, 0x8a, 0xf7, 0x6d, 0xab, 0xad, 0x38, 0x9d, 0xef, + 0x0e, 0x6f, 0x1c, 0x7b, 0xd6, 0x72, 0xac, 0xce, 0x07, 0xa7, 0x33, 0x6b, 0x5b, 0xc7, 0x81, 0xd9, 0xb6, 0x8e, 0xe1, + 0xcf, 0x87, 0x63, 0xab, 0x33, 0x33, 0x5b, 0xd6, 0xc1, 0x07, 0xa7, 0x15, 0x98, 0x1d, 0xeb, 0x18, 0xfe, 0x9c, 0x53, + 0x2b, 0xb8, 0x17, 0xd1, 0x35, 0xe8, 0x69, 0x09, 0x39, 0x48, 0xbf, 0x73, 0x55, 0xad, 0x51, 0xa2, 0x7a, 0x35, 0xea, + 0xde, 0x05, 0x06, 0x97, 0x10, 0x69, 0x6d, 0x30, 0xf4, 0x90, 0x16, 0xba, 0x8c, 0xd2, 0xcd, 0x0a, 0xc3, 0x37, 0xe1, + 0xa1, 0x5e, 0xe4, 0x3f, 0x95, 0x4e, 0x10, 0xaf, 0xdb, 0x4b, 0x68, 0xbb, 0x4b, 0x61, 0xe5, 0xb4, 0xca, 0xb1, 0x6b, + 0xc8, 0x7c, 0xac, 0x1b, 0xa0, 0x3a, 0x06, 0xc4, 0x54, 0x84, 0x83, 0xd2, 0x6a, 0xd1, 0x96, 0xc0, 0x66, 0x09, 0x4b, + 0xa9, 0x48, 0x13, 0x2d, 0x81, 0xd8, 0xe8, 0xba, 0x48, 0x58, 0x8c, 0x1d, 0xf3, 0x1a, 0x8c, 0x67, 0x56, 0xae, 0x7d, + 0xd5, 0xab, 0xe2, 0x4b, 0xf0, 0x8a, 0xb7, 0xc2, 0x68, 0x85, 0x56, 0x1f, 0xf7, 0xcd, 0x1d, 0xc6, 0x19, 0x60, 0xc2, + 0xe6, 0xac, 0x0c, 0x2c, 0x0f, 0x9d, 0x5d, 0xfd, 0xe0, 0x06, 0x82, 0x7e, 0xd0, 0x07, 0xa5, 0x44, 0xdd, 0x9f, 0xd5, + 0x0f, 0x8f, 0x62, 0x21, 0x27, 0xcb, 0x1c, 0xfb, 0x71, 0x0e, 0x9e, 0x44, 0x51, 0x9c, 0xfa, 0x4c, 0xa5, 0xba, 0x41, + 0xb1, 0x9c, 0x58, 0x7c, 0xe3, 0x05, 0x92, 0xdd, 0x9d, 0xd4, 0x72, 0x2f, 0x27, 0x54, 0x4f, 0x9e, 0x14, 0xc0, 0x99, + 0x15, 0xb8, 0x4f, 0x9c, 0x43, 0xe0, 0x12, 0x0e, 0x59, 0x7b, 0xab, 0x09, 0x28, 0x5d, 0xcc, 0xb6, 0xb9, 0x82, 0x17, + 0x89, 0x99, 0x84, 0x99, 0x97, 0x30, 0x30, 0x69, 0xb4, 0x43, 0xdd, 0x30, 0x2f, 0x81, 0xcc, 0x76, 0x95, 0x9b, 0x99, + 0xaa, 0xf7, 0x42, 0x61, 0x2d, 0x11, 0x6e, 0xc9, 0x49, 0xc7, 0xaf, 0x8e, 0x2a, 0x4c, 0xcd, 0x96, 0x71, 0xdc, 0xe3, + 0xcf, 0xfe, 0xef, 0x1e, 0x04, 0xfa, 0x96, 0x82, 0x79, 0x47, 0x05, 0x8b, 0x94, 0x7c, 0x0d, 0x73, 0x7a, 0x4f, 0x84, + 0x9e, 0x25, 0xa7, 0x2a, 0x14, 0xa9, 0x5d, 0x15, 0xfd, 0xd8, 0xd4, 0xdc, 0xb6, 0x35, 0xa7, 0x62, 0x45, 0x81, 0xe1, + 0x63, 0xfe, 0x4f, 0xe1, 0xe7, 0xaa, 0x3f, 0x79, 0xd2, 0x48, 0x1c, 0xc9, 0x96, 0x28, 0x61, 0xa9, 0xb8, 0x4f, 0x68, + 0xaa, 0x8c, 0x77, 0x55, 0x19, 0xf5, 0xe5, 0xfd, 0x22, 0x36, 0x13, 0x26, 0xb9, 0xb4, 0xf7, 0xf0, 0xe7, 0x90, 0x79, + 0xa9, 0xc5, 0x75, 0xbb, 0x9a, 0xc4, 0x74, 0x18, 0x80, 0x36, 0x32, 0x42, 0x21, 0xf9, 0x30, 0x07, 0x8f, 0xd7, 0x7f, + 0x59, 0xf2, 0x20, 0x14, 0xd0, 0xc7, 0xa7, 0x4f, 0x76, 0x11, 0x37, 0xf4, 0x6d, 0xea, 0x51, 0xdc, 0x36, 0x99, 0x17, + 0x88, 0x52, 0x8f, 0xec, 0x4f, 0x7c, 0x0c, 0xb5, 0x53, 0x1f, 0x41, 0x4c, 0x8a, 0x54, 0xd1, 0x7f, 0x7b, 0xf1, 0x8d, + 0xc2, 0x0f, 0x00, 0x59, 0x37, 0xe0, 0xc5, 0x8b, 0xe2, 0xe3, 0xb8, 0x14, 0x1f, 0x47, 0xe1, 0x99, 0x97, 0x21, 0x47, + 0x6c, 0xb6, 0x4f, 0x53, 0x88, 0x02, 0x73, 0xb2, 0xf9, 0x98, 0x2f, 0x83, 0xd4, 0x5f, 0x78, 0x71, 0xba, 0x8f, 0xc1, + 0x71, 0x30, 0xd8, 0x4e, 0x53, 0xfc, 0x0a, 0x32, 0x1b, 0x11, 0xd9, 0x4c, 0xd2, 0x50, 0xd8, 0x8d, 0x4c, 0xfc, 0x20, + 0x37, 0x1b, 0x11, 0x1f, 0xf0, 0x46, 0x23, 0xb6, 0x48, 0xdd, 0x52, 0x10, 0x9e, 0x68, 0x94, 0xb2, 0xd4, 0x4c, 0xd2, + 0x98, 0x79, 0x73, 0x35, 0x0f, 0xca, 0xb5, 0xd9, 0x5f, 0xb2, 0x1c, 0x42, 0x54, 0x21, 0x11, 0x1e, 0x8c, 0x06, 0x08, + 0x06, 0x1c, 0x00, 0x22, 0x04, 0xc5, 0xa1, 0x29, 0x3c, 0x8f, 0xa6, 0x95, 0x2d, 0x55, 0xb0, 0x54, 0xa7, 0x98, 0xd4, + 0x8c, 0x6e, 0x5e, 0x20, 0xdd, 0x1e, 0x45, 0xc1, 0x35, 0x8f, 0xb9, 0x91, 0x67, 0xc7, 0x51, 0xfb, 0x27, 0xfc, 0x3a, + 0xae, 0x60, 0xb8, 0x19, 0xf5, 0xd0, 0x86, 0xb4, 0x6d, 0x4d, 0xd1, 0x38, 0xf6, 0x79, 0x65, 0xa0, 0x99, 0xd4, 0x33, + 0x66, 0xde, 0x24, 0x58, 0x2e, 0x80, 0x64, 0x95, 0x0c, 0x7c, 0x66, 0x4e, 0x3f, 0x77, 0xff, 0x44, 0xa8, 0x90, 0xaa, + 0x7d, 0xfa, 0xf4, 0x7e, 0xf0, 0xaf, 0x7f, 0x42, 0x7a, 0xd0, 0x99, 0x23, 0x62, 0x60, 0x5c, 0xca, 0xb5, 0x38, 0x5b, + 0x6c, 0x0c, 0xd0, 0xb8, 0x8b, 0x8d, 0x45, 0x74, 0x42, 0xb1, 0xb7, 0xb2, 0xc1, 0x95, 0x88, 0xab, 0x07, 0x89, 0x85, + 0x75, 0x11, 0xa9, 0x63, 0x00, 0xcb, 0x3b, 0x10, 0x31, 0x5c, 0x94, 0xbf, 0xdd, 0xbe, 0x3c, 0x56, 0x8a, 0x70, 0x8f, + 0x75, 0x16, 0x48, 0xb4, 0x87, 0xfa, 0x27, 0x9e, 0x82, 0xdc, 0x14, 0xf2, 0x45, 0x49, 0x77, 0x1f, 0x86, 0x39, 0x8b, + 0xe6, 0xcc, 0xf2, 0xa3, 0xfd, 0x15, 0x1b, 0x9a, 0xde, 0xc2, 0x27, 0x3b, 0x22, 0x94, 0x13, 0x2a, 0xc4, 0x92, 0xe6, + 0xe6, 0x39, 0xc4, 0xf8, 0x67, 0xc5, 0x54, 0x46, 0x95, 0xc0, 0x6d, 0xad, 0x42, 0x6f, 0x79, 0xc0, 0x83, 0xa2, 0x89, + 0x9a, 0xfd, 0x93, 0x7d, 0xaf, 0x5f, 0xce, 0x94, 0x63, 0x89, 0x8c, 0xaf, 0x65, 0x2a, 0x70, 0x4a, 0x09, 0x6f, 0x44, + 0x6e, 0x9b, 0xe2, 0xc1, 0x8c, 0x26, 0x13, 0x39, 0xbb, 0x8d, 0x55, 0x06, 0x2f, 0x9f, 0xb4, 0x62, 0x4b, 0x47, 0x0b, + 0xfa, 0xd2, 0xe6, 0x27, 0xf2, 0x9f, 0x6a, 0x17, 0xd3, 0x5a, 0xc1, 0x98, 0xe1, 0xbc, 0x6f, 0x64, 0xc9, 0xc9, 0x67, + 0xec, 0x11, 0x55, 0xe2, 0x88, 0xa4, 0x9a, 0x93, 0xb1, 0x81, 0xa5, 0xda, 0x73, 0x5d, 0xc2, 0x73, 0x55, 0x74, 0x07, + 0x93, 0x58, 0x93, 0xfd, 0x16, 0x06, 0x9b, 0x42, 0x43, 0x93, 0xdc, 0x7b, 0xb1, 0x51, 0x75, 0x38, 0x9b, 0x30, 0xee, + 0x7b, 0x62, 0xfb, 0x95, 0x36, 0x28, 0x6c, 0x3c, 0xbe, 0xee, 0x80, 0xe0, 0x45, 0x3f, 0x15, 0x3c, 0xaf, 0x7c, 0x4d, + 0x28, 0xdd, 0x0c, 0xbc, 0xbb, 0x48, 0x32, 0xbb, 0xe2, 0x11, 0x58, 0xce, 0xb1, 0xf4, 0x42, 0x78, 0x3e, 0x6f, 0x1c, + 0x34, 0xa4, 0x61, 0x90, 0x25, 0x74, 0xf3, 0xb0, 0x15, 0x04, 0x38, 0x60, 0xf7, 0x9d, 0x35, 0xb9, 0x6e, 0x79, 0x30, + 0x88, 0x3c, 0xb3, 0xe2, 0x1c, 0x96, 0x5e, 0x22, 0x5a, 0xc8, 0x4e, 0xf6, 0x61, 0x7c, 0x94, 0xf7, 0x50, 0x30, 0x79, + 0xc2, 0xbe, 0x10, 0x6f, 0xbd, 0x7e, 0xd3, 0xad, 0xb7, 0xca, 0xa3, 0x94, 0x59, 0x2f, 0x5f, 0x87, 0xd8, 0x36, 0x5e, + 0x42, 0xb6, 0x67, 0xdf, 0x8f, 0x39, 0x61, 0x90, 0xbe, 0x92, 0x07, 0xc3, 0x2c, 0xd5, 0xd3, 0xb7, 0x06, 0x89, 0xa1, + 0x8c, 0xbb, 0x1f, 0x96, 0x98, 0x6e, 0x37, 0xeb, 0xa5, 0x4c, 0xc4, 0x6c, 0x38, 0x4f, 0x1b, 0xc2, 0x3a, 0x34, 0x55, + 0x21, 0x3e, 0x7c, 0x4b, 0x85, 0x62, 0x9b, 0x6f, 0xab, 0x55, 0x70, 0x56, 0x45, 0x35, 0x4f, 0x53, 0x1f, 0xe1, 0x81, + 0xd8, 0xa8, 0x8d, 0xa5, 0x18, 0x6c, 0x22, 0x75, 0xa1, 0xaa, 0x50, 0x2d, 0x78, 0x8b, 0x05, 0x55, 0xd6, 0x7b, 0x27, + 0xfb, 0x74, 0x9d, 0xee, 0xd3, 0x06, 0xec, 0x9f, 0x80, 0x65, 0x3a, 0xed, 0x09, 0x6f, 0xb1, 0xe0, 0x2b, 0x4e, 0xbf, + 0xe8, 0xcd, 0xfe, 0x2c, 0x9d, 0x07, 0xfd, 0xff, 0x05, 0x64, 0x23, 0xa6, 0xdb, 0x06, 0x7b, 0x03, 0x00}; #else // Brotli (default, smaller) -constexpr uint8_t INDEX_BR[] PROGMEM = { - 0x5b, 0x36, 0x7a, 0x53, 0xc2, 0x36, 0x06, 0x5a, 0x1f, 0xd4, 0x4e, 0x00, 0xb3, 0xd6, 0xea, 0xff, 0x0a, 0xab, 0x51, - 0x94, 0xb1, 0xe6, 0xb0, 0x2e, 0x61, 0xbb, 0x1a, 0x70, 0x3b, 0xd8, 0x06, 0xfd, 0x7d, 0x2f, 0x1a, 0x00, 0x55, 0x35, - 0xe3, 0xa8, 0x1c, 0x62, 0xca, 0xd3, 0xb4, 0x00, 0xdb, 0x5e, 0x43, 0xa7, 0x14, 0x08, 0xa4, 0x51, 0x99, 0x96, 0xb6, - 0xf5, 0x0e, 0x99, 0x80, 0x52, 0x31, 0xe8, 0x10, 0x27, 0x1c, 0x04, 0x11, 0x58, 0xc5, 0x1c, 0xcc, 0xd4, 0x74, 0x4c, - 0x33, 0x11, 0xbb, 0xdb, 0xb0, 0xb4, 0x0a, 0x87, 0x13, 0x12, 0xb4, 0x8f, 0xe7, 0xd1, 0xc8, 0x85, 0x26, 0x07, 0xab, - 0x2e, 0x7a, 0x6e, 0x93, 0xb9, 0x4c, 0xb4, 0x84, 0x5b, 0x59, 0xda, 0xde, 0x2f, 0x74, 0x88, 0x3c, 0x53, 0x3b, 0xfd, - 0x28, 0xf8, 0x60, 0x4b, 0xf2, 0xc2, 0x03, 0xda, 0x33, 0x59, 0xe4, 0x2a, 0x48, 0x26, 0xde, 0x20, 0x6e, 0xcb, 0x83, - 0xef, 0x81, 0x7a, 0x6b, 0x36, 0x9a, 0x3f, 0x38, 0x8e, 0xfd, 0xf9, 0x7e, 0x73, 0xab, 0x6e, 0x85, 0xf0, 0x62, 0xe0, - 0x60, 0x60, 0x23, 0x1b, 0x11, 0xaf, 0x39, 0x32, 0xed, 0x79, 0x20, 0x27, 0x04, 0x1f, 0x6b, 0xf4, 0xd9, 0x97, 0x2f, - 0x38, 0xe4, 0x5b, 0x75, 0xbb, 0xb4, 0xfe, 0xd5, 0xfb, 0x5f, 0xa5, 0xc2, 0x5c, 0x88, 0xc6, 0xdf, 0xd0, 0x1e, 0x10, - 0xa7, 0x44, 0x3b, 0xdd, 0xb8, 0xbd, 0x2c, 0x7a, 0x10, 0x61, 0xbe, 0x8b, 0xbb, 0x3c, 0x10, 0x0e, 0x5f, 0x06, 0xc6, - 0xe0, 0xf2, 0xe6, 0x88, 0xa8, 0xb8, 0xa2, 0xab, 0xf7, 0x6b, 0xab, 0xe9, 0xfb, 0xbd, 0xa6, 0xfe, 0xd7, 0xef, 0x23, - 0xd3, 0x86, 0xa9, 0xdc, 0x57, 0x3a, 0xf7, 0xb8, 0x49, 0x6e, 0x45, 0x76, 0xda, 0xa6, 0x21, 0xc3, 0x2b, 0x0f, 0xac, - 0xc9, 0x85, 0x03, 0x60, 0xdd, 0x28, 0x5d, 0xe5, 0x3b, 0xfb, 0xf3, 0xbb, 0xdc, 0xc2, 0x94, 0xab, 0x90, 0x2b, 0x05, - 0xc8, 0x64, 0x3f, 0x3f, 0xc8, 0x1a, 0xe3, 0xef, 0x17, 0x88, 0x77, 0x9f, 0x18, 0x8d, 0xda, 0xd2, 0xc0, 0xb8, 0x5b, - 0x99, 0x6e, 0xd9, 0x12, 0xaa, 0xdc, 0x2f, 0xeb, 0xff, 0xff, 0xfb, 0x4e, 0xff, 0xbf, 0x7e, 0xed, 0x55, 0x22, 0xe6, - 0x8a, 0x96, 0x64, 0x4c, 0xdf, 0x4b, 0x2c, 0xef, 0x43, 0x42, 0x69, 0x18, 0x37, 0x29, 0x19, 0x40, 0x1f, 0x19, 0x8a, - 0x6b, 0x84, 0xb5, 0x31, 0x6a, 0x1d, 0xd9, 0x57, 0x5b, 0x04, 0xbb, 0xd6, 0xde, 0xfa, 0x52, 0xfd, 0xbe, 0x7e, 0x1f, - 0xe7, 0x5d, 0xc3, 0x72, 0xc9, 0x69, 0x3a, 0x6f, 0xf7, 0x1e, 0x6d, 0x29, 0x74, 0xce, 0x4b, 0xde, 0x98, 0xe5, 0x62, - 0x40, 0x34, 0x7a, 0xba, 0x6d, 0x0c, 0x30, 0x01, 0xd0, 0x92, 0x98, 0x29, 0xed, 0xfb, 0xea, 0xeb, 0x7f, 0xfd, 0x56, - 0x3a, 0x29, 0x0a, 0x1f, 0xd9, 0xb7, 0x84, 0x3a, 0x26, 0xfa, 0xd6, 0xce, 0x76, 0x3a, 0x32, 0x19, 0x0a, 0xb2, 0x94, - 0xc7, 0x80, 0xbe, 0x24, 0x74, 0x27, 0x0a, 0xff, 0x5f, 0x5f, 0xd3, 0xfa, 0xfa, 0x95, 0x08, 0xbb, 0xcc, 0xa5, 0x4e, - 0x51, 0xa8, 0x7b, 0x7f, 0x4f, 0x49, 0xce, 0xb2, 0xec, 0x9e, 0x0a, 0x41, 0xcb, 0xb4, 0x8d, 0x17, 0xe1, 0x00, 0xdc, - 0x13, 0x13, 0x59, 0xf7, 0x30, 0x55, 0xeb, 0xbf, 0x9f, 0x97, 0x0d, 0x67, 0x15, 0x30, 0x14, 0x61, 0x0c, 0x48, 0xaa, - 0xd8, 0x41, 0x5a, 0x75, 0x4b, 0xd3, 0x16, 0xa5, 0xc1, 0xd4, 0xc8, 0x9c, 0x84, 0x1c, 0x78, 0x01, 0xe8, 0x24, 0x45, - 0xca, 0xff, 0x73, 0xbe, 0x2d, 0xad, 0xfe, 0x74, 0x75, 0x79, 0xa2, 0xba, 0x1f, 0x6a, 0x09, 0x10, 0xc6, 0x50, 0xb3, - 0x6c, 0x4a, 0xe7, 0x9f, 0x5d, 0xbf, 0x26, 0x78, 0xa6, 0x37, 0x07, 0xce, 0xa5, 0x55, 0xaf, 0xef, 0x06, 0xd4, 0x72, - 0x4f, 0x48, 0xdf, 0x15, 0x1b, 0xec, 0xd7, 0x48, 0xa6, 0xe5, 0xbd, 0xf3, 0x85, 0x88, 0xaa, 0x1c, 0x80, 0x11, 0xb4, - 0x51, 0x68, 0xa0, 0xbc, 0xbd, 0xf6, 0xaa, 0x6f, 0x55, 0x94, 0x8e, 0x0d, 0x8c, 0xc0, 0x32, 0xcb, 0xaf, 0x77, 0x27, - 0x94, 0x5c, 0xad, 0xbd, 0x6f, 0x92, 0xf0, 0x18, 0x70, 0x5a, 0x6c, 0x58, 0x38, 0x2f, 0xd9, 0x90, 0xa8, 0xf9, 0x9a, - 0xad, 0xc0, 0x05, 0x0a, 0xeb, 0x98, 0xcb, 0xaa, 0x7a, 0x8b, 0x0a, 0x89, 0xf8, 0x75, 0xfb, 0x7e, 0xc6, 0x7d, 0x4c, - 0x37, 0xc3, 0x0c, 0x86, 0x8d, 0x82, 0x27, 0x18, 0xd7, 0x33, 0xb5, 0x4c, 0x5f, 0x6f, 0xa7, 0x52, 0x3e, 0xdd, 0x19, - 0x97, 0x57, 0x40, 0x5b, 0x29, 0xed, 0xd9, 0x0b, 0xb1, 0xcb, 0x58, 0x04, 0x08, 0x0d, 0x20, 0x51, 0xe9, 0x1b, 0x22, - 0xf6, 0x9a, 0x6f, 0xe8, 0xe9, 0xbc, 0x01, 0x2c, 0x70, 0xf8, 0x86, 0x54, 0x72, 0xa5, 0x38, 0x22, 0xd0, 0xcb, 0x95, - 0xe1, 0xc1, 0xb5, 0xb9, 0x59, 0x01, 0xae, 0xd5, 0x5a, 0x4a, 0xfa, 0x13, 0x37, 0x9b, 0xd6, 0xff, 0x3e, 0x2f, 0xce, - 0xdb, 0xec, 0x44, 0xba, 0xfe, 0x92, 0xe3, 0xe4, 0x4a, 0xe9, 0xd9, 0x82, 0x09, 0x25, 0xcc, 0xb0, 0x86, 0x01, 0x93, - 0xa6, 0xd5, 0x3e, 0x3c, 0x24, 0x1f, 0x50, 0xab, 0x6f, 0xf8, 0x83, 0xe5, 0xff, 0xef, 0xad, 0xb4, 0xdc, 0xfe, 0x88, - 0x74, 0x20, 0x44, 0xf6, 0x00, 0xe4, 0x38, 0xc3, 0x91, 0xf5, 0xfb, 0xce, 0xcc, 0x2a, 0x50, 0x0d, 0x90, 0x6c, 0x59, - 0xbf, 0xd6, 0x62, 0x53, 0x71, 0xcd, 0xbb, 0xcc, 0xef, 0xa2, 0x33, 0x7e, 0x18, 0x56, 0x64, 0x44, 0x66, 0x23, 0x5d, - 0x0d, 0xcb, 0x36, 0xb2, 0x9c, 0x06, 0xf6, 0xbe, 0xf7, 0x7f, 0x14, 0xfe, 0xff, 0x91, 0xc5, 0x89, 0x88, 0x2c, 0x50, - 0x91, 0x59, 0xc5, 0x39, 0x99, 0x05, 0xcc, 0xa8, 0x0a, 0xe0, 0x8c, 0x0a, 0x60, 0x1f, 0x1d, 0x90, 0x63, 0x41, 0xd0, - 0x68, 0x9a, 0x6c, 0xf6, 0xd1, 0x90, 0x2d, 0x6f, 0x77, 0x5a, 0xac, 0x38, 0x94, 0xeb, 0x19, 0xd9, 0x96, 0xfc, 0x6e, - 0x07, 0xca, 0x9a, 0xa5, 0xb4, 0xd2, 0xd1, 0x7d, 0x73, 0x6f, 0x76, 0xca, 0xa9, 0x23, 0x50, 0x69, 0xd5, 0x56, 0x08, - 0xd7, 0xcc, 0xec, 0x06, 0x76, 0x3f, 0xe7, 0x97, 0x36, 0x1f, 0x37, 0xc5, 0xa4, 0x98, 0x94, 0xe0, 0x80, 0xe4, 0x19, - 0x7b, 0xc6, 0x12, 0x0a, 0xc7, 0xf2, 0xde, 0xa9, 0x3f, 0x86, 0xdf, 0x43, 0x69, 0x61, 0x30, 0x75, 0xa6, 0x69, 0xfa, - 0xef, 0xb6, 0x31, 0xab, 0x2f, 0xd7, 0xca, 0xcc, 0x2d, 0xcd, 0x10, 0x42, 0x0a, 0xa0, 0xa2, 0xeb, 0xff, 0x36, 0xbe, - 0xd6, 0x57, 0x8e, 0xda, 0xfa, 0x75, 0xd4, 0xdd, 0x7e, 0x5c, 0x67, 0x08, 0x10, 0x02, 0xed, 0x3c, 0x64, 0x4a, 0x75, - 0xdb, 0x71, 0x9e, 0x3d, 0x4d, 0x08, 0x21, 0x04, 0xe2, 0xa8, 0xe2, 0xf8, 0x5f, 0x23, 0x9d, 0x4a, 0x1b, 0x02, 0x0d, - 0xa4, 0x48, 0xfd, 0x1b, 0xeb, 0x6f, 0x0d, 0xdb, 0xf7, 0xf4, 0x10, 0x9d, 0xd8, 0xd3, 0x00, 0xa1, 0x36, 0x49, 0xbe, - 0xd8, 0x9a, 0xa7, 0xb5, 0x6d, 0x74, 0x2c, 0x43, 0x2d, 0x7f, 0xdf, 0x4c, 0xbf, 0x6d, 0x30, 0x06, 0x2c, 0x33, 0x25, - 0x81, 0x19, 0xf2, 0xb9, 0x6e, 0x04, 0xf7, 0xcf, 0x4c, 0x26, 0xce, 0x1e, 0x07, 0x80, 0xd3, 0xb1, 0x47, 0x5b, 0x88, - 0x19, 0x28, 0xc7, 0xb9, 0x83, 0x9b, 0x5b, 0x23, 0x98, 0xf6, 0xf6, 0x50, 0xb2, 0xdd, 0x47, 0x21, 0xd6, 0x20, 0x5a, - 0x78, 0x61, 0x76, 0xf4, 0x81, 0xc9, 0xdb, 0x4e, 0x15, 0xbd, 0xa5, 0x5b, 0x7e, 0xc2, 0x1c, 0x81, 0x66, 0xf4, 0x92, - 0x5f, 0x04, 0xf0, 0xbe, 0x7d, 0x0f, 0x45, 0x99, 0x04, 0xca, 0xfe, 0xfa, 0xc9, 0x96, 0x91, 0x9d, 0x9f, 0xb8, 0x6b, - 0x7b, 0xc3, 0xe6, 0xe0, 0x21, 0x83, 0x27, 0x75, 0x98, 0xd9, 0x7e, 0x29, 0x3f, 0xe1, 0x6a, 0x19, 0xe6, 0x36, 0xe6, - 0xf3, 0xfd, 0x14, 0x5d, 0xa1, 0x21, 0x63, 0x41, 0xea, 0xb9, 0xf7, 0x87, 0xc6, 0xf2, 0xc7, 0x64, 0x59, 0x06, 0x6e, - 0xcb, 0x89, 0xc7, 0x92, 0xfa, 0xc5, 0x52, 0x4d, 0xdf, 0x93, 0x26, 0x01, 0x80, 0xac, 0xb5, 0x0d, 0xfd, 0x08, 0x57, - 0x71, 0x7d, 0xad, 0x5c, 0x14, 0xe3, 0x9a, 0x6f, 0x87, 0x09, 0x06, 0x92, 0xf5, 0x13, 0x28, 0x6e, 0x7b, 0xf7, 0x6f, - 0xcf, 0x6e, 0x6d, 0x59, 0x64, 0xd4, 0x74, 0x38, 0xbb, 0x0f, 0x9d, 0x69, 0x03, 0x8a, 0xb8, 0xc3, 0xdd, 0xa7, 0x63, - 0x4d, 0x41, 0x62, 0xc3, 0x21, 0x83, 0xe7, 0x02, 0x1d, 0xcb, 0x3e, 0xa9, 0xa5, 0x24, 0x6b, 0x72, 0xe6, 0xd2, 0x10, - 0x66, 0xa3, 0x73, 0x76, 0x1b, 0x4b, 0x07, 0xdc, 0x96, 0x33, 0xda, 0x45, 0x26, 0xf7, 0xbc, 0x89, 0xef, 0x68, 0xcc, - 0x2f, 0xbb, 0xc0, 0xde, 0xfa, 0x20, 0xdb, 0x42, 0xd0, 0x6c, 0xcc, 0xec, 0xc0, 0x37, 0xde, 0x77, 0xd3, 0x21, 0x09, - 0x12, 0x4d, 0xdf, 0xb7, 0xa0, 0x79, 0x31, 0xfa, 0xb8, 0xee, 0x61, 0xab, 0x50, 0xdf, 0xfe, 0x88, 0x87, 0x19, 0x9e, - 0x78, 0x39, 0x23, 0x5f, 0xef, 0xdd, 0xe6, 0x65, 0xe7, 0xd1, 0x17, 0x31, 0xbe, 0x3d, 0xbb, 0x7d, 0xb9, 0x79, 0x64, - 0xf7, 0x11, 0xd6, 0xbe, 0x1b, 0x12, 0x76, 0x35, 0xbf, 0x77, 0x1b, 0x7e, 0xf4, 0xda, 0x4b, 0x35, 0xab, 0xc9, 0x7f, - 0xfa, 0xfe, 0x13, 0xda, 0xa8, 0x1d, 0xdc, 0xc3, 0xfd, 0x05, 0xc2, 0xb3, 0xa6, 0x38, 0x17, 0x58, 0x73, 0x18, 0x7f, - 0xb6, 0x66, 0xc9, 0x3f, 0x3b, 0x22, 0xf4, 0x39, 0xcc, 0xd7, 0x39, 0x6f, 0xcf, 0x62, 0x6a, 0xfd, 0x4a, 0x44, 0x61, - 0x22, 0x2a, 0x83, 0x26, 0x28, 0xca, 0x2b, 0x27, 0x7d, 0xc7, 0x45, 0x49, 0x20, 0x91, 0xdd, 0x52, 0x2b, 0xa5, 0x75, - 0xe1, 0xe4, 0xde, 0xef, 0x00, 0x02, 0xfd, 0x39, 0xb6, 0x2c, 0xbb, 0xe4, 0xf5, 0x4b, 0x49, 0x7d, 0xc7, 0x3c, 0xcd, - 0x3d, 0x00, 0x91, 0x0a, 0xdd, 0x2c, 0x65, 0x61, 0x89, 0x12, 0x79, 0x36, 0x9e, 0xeb, 0xbc, 0xca, 0xd0, 0x43, 0xb7, - 0xef, 0xdb, 0x25, 0xf2, 0xf0, 0x7c, 0x86, 0x03, 0x7c, 0xc7, 0x9c, 0x53, 0xbd, 0xc2, 0x84, 0xbc, 0x72, 0x56, 0xdc, - 0x8f, 0xa1, 0xd4, 0x68, 0x22, 0x56, 0xe4, 0x66, 0x34, 0xc8, 0x7b, 0x46, 0x6e, 0xaa, 0xfd, 0x52, 0x5b, 0x33, 0x33, - 0xd7, 0xb7, 0xad, 0x96, 0x71, 0x86, 0x72, 0x2f, 0xaa, 0x3a, 0xaa, 0xef, 0x49, 0x20, 0x3d, 0xcb, 0x19, 0xd7, 0x37, - 0x6f, 0x56, 0x94, 0x5f, 0x2b, 0x95, 0x50, 0xf6, 0x0d, 0x35, 0x79, 0xcd, 0xec, 0x4b, 0xea, 0x1a, 0xe6, 0x29, 0xd2, - 0x76, 0x3a, 0xf2, 0x5c, 0x14, 0x32, 0x68, 0x05, 0x7b, 0x9e, 0x3c, 0xba, 0xf6, 0x65, 0x5e, 0xe2, 0x2f, 0x2b, 0xcb, - 0x88, 0x04, 0x68, 0xe4, 0x5f, 0x10, 0xcd, 0x0c, 0x54, 0xc5, 0xd3, 0x64, 0xe1, 0x24, 0x68, 0x71, 0xa2, 0x0d, 0x9e, - 0xfd, 0x7e, 0xdb, 0xec, 0x83, 0x12, 0x2e, 0xaa, 0xd4, 0x7d, 0x4f, 0x13, 0xf2, 0xf0, 0x73, 0x91, 0xac, 0x65, 0xa0, - 0xd7, 0x60, 0x9e, 0x26, 0x20, 0x15, 0x96, 0xc9, 0x58, 0xe8, 0x82, 0x9a, 0xd1, 0x4d, 0x93, 0xe9, 0x11, 0x5f, 0xde, - 0xe2, 0xa2, 0xb8, 0xd5, 0x6a, 0xcb, 0x37, 0xb3, 0xb4, 0x63, 0xda, 0x02, 0xda, 0x1f, 0x3a, 0x81, 0x27, 0x6c, 0x1e, - 0x0b, 0xef, 0x26, 0x27, 0x23, 0x8c, 0x3f, 0xf7, 0x72, 0xa4, 0x1d, 0x6a, 0x77, 0x42, 0xf4, 0xea, 0x40, 0xe0, 0xbe, - 0x50, 0xb6, 0x62, 0xec, 0x4d, 0x12, 0x51, 0xdd, 0x7f, 0x40, 0xb7, 0xf6, 0xbf, 0x59, 0xbb, 0xf4, 0x45, 0xd0, 0x58, - 0x09, 0x47, 0xd2, 0xfa, 0x6d, 0xa8, 0x3d, 0x44, 0x00, 0x4e, 0xaf, 0x82, 0x19, 0x76, 0xdb, 0x80, 0xd9, 0x71, 0x51, - 0x8e, 0xfb, 0x7c, 0xc2, 0x32, 0x3f, 0xd0, 0x32, 0xba, 0xa9, 0xfd, 0x71, 0xfc, 0x21, 0x63, 0x96, 0xb6, 0x30, 0xb5, - 0xaf, 0x1a, 0x7f, 0x69, 0xd0, 0x48, 0xc5, 0x79, 0xed, 0xd0, 0xc0, 0x4f, 0xec, 0x0b, 0x96, 0x83, 0x23, 0x41, 0x2f, - 0xf3, 0xc1, 0x33, 0x97, 0x6a, 0xb0, 0xbc, 0x39, 0x72, 0xa0, 0x10, 0xb6, 0x14, 0xa1, 0x6c, 0xb0, 0xb5, 0xd2, 0x8a, - 0x55, 0x4f, 0x18, 0x9b, 0xf7, 0xa7, 0xb7, 0x26, 0xb2, 0x29, 0x5b, 0x38, 0x4c, 0xf5, 0x85, 0x82, 0x64, 0x7f, 0x16, - 0x77, 0x59, 0x26, 0xc0, 0x41, 0xc2, 0xf0, 0x82, 0x8e, 0x24, 0xdf, 0x07, 0x6f, 0xfa, 0x2c, 0x58, 0x18, 0x6d, 0x9b, - 0x1f, 0x6d, 0xbd, 0x17, 0xcf, 0x2c, 0x88, 0x6f, 0x16, 0x14, 0xdb, 0xb2, 0xe2, 0x08, 0x4b, 0x35, 0x6c, 0x42, 0x68, - 0x05, 0x11, 0xa8, 0xa9, 0x3f, 0xd7, 0x83, 0x6d, 0xd6, 0xbe, 0x6a, 0x55, 0xa5, 0xb3, 0x24, 0xd5, 0x38, 0x82, 0x42, - 0x0e, 0x06, 0x45, 0x10, 0xba, 0xb3, 0x7b, 0xf0, 0x13, 0x07, 0xe3, 0x42, 0xe0, 0x86, 0x96, 0xa7, 0xae, 0x5b, 0xc7, - 0x2d, 0x03, 0x53, 0x7d, 0xb9, 0xd2, 0x3c, 0xee, 0xa1, 0x75, 0xb0, 0x6b, 0x3b, 0x92, 0xcf, 0xb5, 0x78, 0x42, 0xdf, - 0x9d, 0xe8, 0x04, 0x86, 0x87, 0x23, 0x4f, 0xbc, 0x3c, 0x90, 0x80, 0x87, 0x00, 0xb3, 0xf2, 0xdd, 0x0f, 0xa1, 0x7a, - 0x7d, 0x11, 0x50, 0x40, 0x7c, 0x55, 0x6e, 0xfb, 0x03, 0x04, 0x2b, 0xea, 0x58, 0x00, 0x27, 0x2a, 0x4e, 0xc9, 0x01, - 0x09, 0xc6, 0x11, 0xea, 0x1b, 0xa0, 0x9b, 0x0f, 0x95, 0xf2, 0x2f, 0x5c, 0x4f, 0xbc, 0x28, 0xcf, 0xfa, 0xf9, 0x96, - 0x7c, 0xba, 0x6a, 0x51, 0x70, 0xaa, 0xb6, 0x49, 0xa6, 0x50, 0xba, 0xc1, 0x61, 0x4a, 0x11, 0xa7, 0x89, 0x44, 0x2d, - 0x04, 0x60, 0x5b, 0x45, 0xb4, 0xf4, 0xeb, 0x75, 0xd8, 0xd1, 0x52, 0xd8, 0xb2, 0xe0, 0x0b, 0xf5, 0x43, 0x8d, 0xb0, - 0xd8, 0xa8, 0xed, 0x5c, 0x6a, 0xfe, 0xf3, 0x35, 0xc9, 0x86, 0xd6, 0x2e, 0x7b, 0x0b, 0x41, 0x4d, 0xe1, 0x02, 0xb5, - 0xe5, 0x45, 0x32, 0xb5, 0x83, 0x98, 0xfd, 0xc8, 0x44, 0x72, 0x62, 0x79, 0x65, 0x6f, 0x2a, 0x5b, 0xd7, 0xa6, 0xdd, - 0x37, 0x25, 0x18, 0x7e, 0xd4, 0x52, 0x7a, 0x36, 0xec, 0xfc, 0x5a, 0x59, 0x7a, 0x0c, 0x6b, 0x67, 0x4a, 0x20, 0x70, - 0xf9, 0x17, 0xa7, 0xed, 0x02, 0x93, 0x5b, 0x3d, 0xa6, 0xf4, 0x52, 0x8f, 0xf9, 0xee, 0x75, 0x48, 0x95, 0x2c, 0x04, - 0xc9, 0x61, 0xa0, 0xbf, 0x16, 0x13, 0xa5, 0x40, 0x0b, 0x89, 0x50, 0x6e, 0x23, 0x09, 0x70, 0xff, 0x5e, 0x95, 0x31, - 0xc0, 0xb6, 0x0e, 0x3f, 0x4b, 0xb3, 0xab, 0xe7, 0x62, 0x40, 0xd8, 0x18, 0x3d, 0x4c, 0x9d, 0x11, 0xc2, 0x49, 0x53, - 0x7b, 0xe7, 0x2a, 0x12, 0xc9, 0x51, 0x8a, 0x58, 0x6c, 0x9c, 0x95, 0x2e, 0x35, 0xc2, 0x5a, 0x18, 0xcb, 0xb1, 0x02, - 0x92, 0x33, 0xb7, 0x59, 0x79, 0x7c, 0xdb, 0x1c, 0x24, 0xc0, 0x3d, 0xe2, 0xe2, 0x1f, 0x9c, 0x04, 0xc8, 0x35, 0x41, - 0x82, 0x84, 0xf6, 0xd9, 0x80, 0x4c, 0x18, 0x90, 0x91, 0x31, 0x89, 0x6e, 0x04, 0x92, 0x7b, 0x4d, 0xa7, 0xfa, 0x18, - 0x60, 0x2a, 0x27, 0xab, 0x09, 0x44, 0x42, 0x1c, 0x6f, 0x6a, 0xc3, 0x4e, 0x60, 0x2c, 0x03, 0xec, 0xb8, 0x74, 0x54, - 0x72, 0x2e, 0x0e, 0x30, 0xac, 0x9a, 0xf9, 0x85, 0x4d, 0x97, 0xc0, 0x10, 0x47, 0xb4, 0x0b, 0x28, 0xc8, 0xa9, 0xeb, - 0x73, 0x0b, 0x46, 0x0e, 0x12, 0xd7, 0xe8, 0x4e, 0x8b, 0x64, 0x14, 0x91, 0x97, 0xc4, 0xb8, 0xf8, 0x75, 0x4c, 0x93, - 0xb8, 0x58, 0x4f, 0x73, 0x9f, 0x8a, 0xde, 0xb9, 0x0d, 0xfe, 0x71, 0xa3, 0x27, 0x5d, 0x27, 0x2c, 0x01, 0x58, 0x8f, - 0x94, 0x64, 0xc0, 0xa5, 0x9a, 0x9e, 0xfc, 0x3a, 0x48, 0x09, 0xbc, 0x72, 0xd0, 0x39, 0xc4, 0xf1, 0x85, 0x12, 0xd1, - 0xe0, 0xdf, 0xe4, 0xc8, 0x23, 0xf0, 0xeb, 0x67, 0xcc, 0x30, 0xcd, 0x12, 0xd8, 0x63, 0xe5, 0x99, 0x88, 0xf9, 0xab, - 0x46, 0xd2, 0x48, 0x58, 0xf1, 0xb4, 0xd5, 0xd2, 0x54, 0xf8, 0xd8, 0x08, 0x05, 0xc2, 0x1e, 0x80, 0xa6, 0x00, 0xde, - 0x1b, 0x12, 0xf3, 0xe5, 0xa9, 0xa6, 0x24, 0xe5, 0x29, 0x3a, 0x9b, 0xb3, 0x60, 0xfa, 0x2c, 0x2c, 0xa0, 0x9b, 0x63, - 0xca, 0xc3, 0x4d, 0x2c, 0xf3, 0x32, 0xcc, 0x94, 0xcc, 0xa8, 0x25, 0x98, 0x08, 0x93, 0xe1, 0x75, 0x72, 0x01, 0xcb, - 0x7b, 0x9b, 0x66, 0xc6, 0x2d, 0xa3, 0x57, 0xae, 0x4f, 0xa0, 0x79, 0xdc, 0x93, 0x65, 0x91, 0xa6, 0x0c, 0x57, 0x38, - 0x00, 0xe9, 0xaf, 0x98, 0xc7, 0xc2, 0x29, 0x35, 0x2b, 0xb9, 0x71, 0xc3, 0xc5, 0x42, 0x6a, 0x5c, 0xdd, 0x95, 0x77, - 0x22, 0x04, 0x48, 0x65, 0x4b, 0x27, 0x83, 0x67, 0x40, 0xf1, 0x9e, 0x00, 0x02, 0x11, 0x8d, 0xc2, 0x67, 0x7e, 0x92, - 0xa3, 0x55, 0x4e, 0x10, 0x0b, 0x73, 0x55, 0x3b, 0x2f, 0xde, 0x2a, 0x44, 0x94, 0x0b, 0x8e, 0x36, 0x00, 0x5b, 0xb4, - 0x2f, 0x72, 0x9f, 0x41, 0xc0, 0xb7, 0x8f, 0x33, 0xc3, 0x5c, 0x9a, 0x76, 0x48, 0x95, 0xcf, 0xc6, 0xe1, 0xe7, 0xb2, - 0xc0, 0x33, 0x4e, 0x99, 0xd8, 0xfd, 0x67, 0xab, 0xba, 0x21, 0xea, 0xfc, 0x35, 0x75, 0xc0, 0xa9, 0xb6, 0xd9, 0xd9, - 0x8d, 0x41, 0x97, 0xc5, 0xc9, 0x01, 0x93, 0xb2, 0xb3, 0x75, 0xb0, 0xa2, 0x1c, 0xff, 0x72, 0xf2, 0x03, 0x19, 0x0b, - 0x34, 0x5e, 0x15, 0x44, 0x45, 0x46, 0xa6, 0x03, 0x41, 0xbc, 0x34, 0x7c, 0x2e, 0x06, 0x68, 0x91, 0x79, 0x55, 0x52, - 0xa0, 0xd0, 0xac, 0x46, 0x94, 0x37, 0xd0, 0x20, 0x9b, 0xbb, 0x9a, 0x6a, 0x14, 0x1c, 0x21, 0x8f, 0x5a, 0x6c, 0x4c, - 0x8f, 0xc5, 0x52, 0x4c, 0xcb, 0xb4, 0x39, 0x45, 0x12, 0x81, 0xc5, 0x01, 0x71, 0xfd, 0x59, 0xa9, 0xb1, 0x41, 0x94, - 0x79, 0xde, 0x8c, 0x30, 0xe8, 0x6e, 0xe8, 0x49, 0x36, 0x31, 0xd6, 0x4a, 0x10, 0x39, 0x75, 0xd0, 0xd8, 0x8f, 0x5d, - 0x9f, 0xc8, 0xdb, 0x5d, 0x53, 0x4c, 0x75, 0xb9, 0x3f, 0x51, 0x4c, 0x0c, 0x2d, 0xed, 0xfa, 0x79, 0x06, 0x51, 0x3f, - 0x3d, 0x78, 0x9a, 0x72, 0xb6, 0xf6, 0x18, 0x1e, 0xaa, 0xce, 0x25, 0x79, 0xbf, 0xd4, 0x0d, 0x01, 0xf9, 0xb5, 0xc0, - 0xea, 0x91, 0x93, 0x88, 0x22, 0x10, 0xf6, 0xb3, 0xfe, 0x96, 0x30, 0xfa, 0x9b, 0x81, 0x25, 0xbb, 0x1e, 0x6c, 0x4b, - 0x5d, 0x62, 0x2c, 0x6b, 0x65, 0xcd, 0x29, 0x30, 0x5c, 0xba, 0x54, 0x4e, 0x1e, 0x48, 0x3c, 0x54, 0x0e, 0x16, 0xd3, - 0xe7, 0xe9, 0xc2, 0x01, 0x23, 0x85, 0xec, 0xfd, 0x34, 0xc8, 0x8b, 0xd3, 0x8b, 0x24, 0xb5, 0x18, 0x31, 0x76, 0xa9, - 0xb6, 0xb1, 0xf4, 0x08, 0xab, 0xb6, 0x36, 0xf0, 0xfc, 0xc4, 0x76, 0xbb, 0xdd, 0xb0, 0x53, 0x41, 0x56, 0x52, 0x27, - 0x72, 0x33, 0x8b, 0xce, 0x8f, 0x26, 0x91, 0xca, 0x13, 0x46, 0x01, 0x79, 0x39, 0x63, 0x5b, 0x20, 0x8b, 0x6e, 0x8a, - 0x5e, 0x18, 0xe3, 0xd6, 0xb3, 0x5c, 0x7d, 0xeb, 0x37, 0x38, 0x14, 0x92, 0x32, 0x35, 0xcd, 0x94, 0x7b, 0x9d, 0xcd, - 0x77, 0x55, 0x44, 0x8b, 0x72, 0xd6, 0x5c, 0x9b, 0x5f, 0x24, 0xab, 0xbd, 0x14, 0xd9, 0xd2, 0xe9, 0x30, 0x7b, 0x97, - 0x8a, 0xd4, 0x92, 0x04, 0xaa, 0x1d, 0xc7, 0x66, 0x1c, 0xe7, 0x18, 0xf4, 0x56, 0x30, 0xb3, 0x86, 0x97, 0x80, 0xec, - 0x22, 0x85, 0x45, 0x56, 0x5a, 0xbc, 0xd1, 0x2d, 0x25, 0xef, 0x07, 0x89, 0xca, 0xd2, 0xc3, 0x30, 0x93, 0xbe, 0x14, - 0xf6, 0x80, 0x14, 0x8f, 0x50, 0x45, 0x98, 0xbb, 0xdf, 0x45, 0x50, 0xa0, 0x3a, 0xc3, 0x13, 0x98, 0xf6, 0x7c, 0x94, - 0x8e, 0x0b, 0x98, 0x9f, 0xcd, 0x44, 0xbb, 0x7a, 0xb5, 0x06, 0x2c, 0xbc, 0xfa, 0x90, 0xe2, 0x3a, 0xa5, 0xb7, 0xf2, - 0x55, 0xf8, 0x1c, 0x2b, 0xcf, 0x02, 0x1d, 0x2b, 0x15, 0x86, 0xd9, 0x5c, 0x18, 0x23, 0x49, 0x9a, 0x0f, 0xe7, 0xde, - 0xa0, 0x9b, 0x21, 0x28, 0x11, 0x53, 0xdc, 0x10, 0x62, 0x31, 0xcc, 0x58, 0x03, 0xca, 0xdd, 0xa2, 0x99, 0x93, 0xac, - 0xb9, 0x93, 0x49, 0xce, 0x7c, 0xf7, 0x95, 0x5e, 0xa5, 0x94, 0x10, 0x4d, 0xc7, 0x57, 0x39, 0x59, 0x3e, 0x46, 0xc3, - 0x2c, 0xae, 0x1c, 0x13, 0xb4, 0x4e, 0xe2, 0x84, 0xa2, 0x70, 0x48, 0x50, 0x5b, 0x61, 0xba, 0x53, 0x23, 0x9c, 0x0a, - 0x7a, 0x3f, 0xe9, 0xe6, 0x0e, 0xba, 0x13, 0xdb, 0x50, 0xd1, 0x9a, 0x86, 0x0a, 0x62, 0xdb, 0xbf, 0xf7, 0x33, 0x3a, - 0x74, 0xfc, 0x56, 0x34, 0xa6, 0x42, 0xa0, 0x66, 0x0e, 0x97, 0xe7, 0xbe, 0x98, 0x14, 0xe2, 0x4a, 0x5a, 0x9e, 0x08, - 0x92, 0xb4, 0x8f, 0x8d, 0x79, 0xb1, 0xb7, 0x83, 0xc2, 0x34, 0xac, 0xcb, 0x06, 0x44, 0xad, 0x17, 0x2a, 0xf3, 0xeb, - 0xb6, 0x8c, 0x3b, 0x4d, 0x18, 0xaf, 0x9b, 0x81, 0x98, 0xd7, 0xa0, 0x8d, 0x18, 0x8c, 0x55, 0x3b, 0x0e, 0x40, 0x39, - 0x3a, 0x2d, 0x1b, 0xeb, 0x4b, 0xab, 0x46, 0x6f, 0x68, 0x0c, 0x6c, 0xd7, 0x62, 0x91, 0x04, 0xa4, 0x30, 0x66, 0xdd, - 0x8d, 0x49, 0xa7, 0x0a, 0xea, 0x81, 0xec, 0x59, 0x9f, 0x75, 0x3c, 0x4b, 0x4c, 0xf8, 0x25, 0x03, 0x47, 0xf3, 0xe9, - 0xa4, 0x97, 0xae, 0x89, 0x8e, 0x68, 0x6d, 0x21, 0xfe, 0xd4, 0xe0, 0xd6, 0xe2, 0xa5, 0x0e, 0x7c, 0x05, 0xa0, 0x16, - 0x99, 0x0a, 0x21, 0x51, 0x25, 0x15, 0x57, 0x65, 0x3c, 0xd8, 0x94, 0xeb, 0x2a, 0xac, 0x7c, 0x72, 0xef, 0x7a, 0x07, - 0x7f, 0xb6, 0x07, 0x4b, 0xeb, 0x0e, 0xf3, 0xc1, 0xc9, 0x5f, 0x45, 0x48, 0x11, 0xf6, 0xcc, 0xd0, 0xc1, 0xc6, 0x3c, - 0x73, 0xe4, 0xe3, 0xb5, 0x1d, 0xf1, 0xad, 0x0b, 0x6f, 0x98, 0xe4, 0xee, 0x3d, 0x72, 0x19, 0xda, 0x52, 0x40, 0xd4, - 0x6d, 0x6e, 0xfb, 0x83, 0x74, 0xfc, 0x49, 0x4a, 0xf1, 0xef, 0x5d, 0x05, 0x51, 0xbb, 0x68, 0x21, 0x79, 0xa7, 0xe7, - 0xc0, 0x1a, 0x8c, 0x26, 0x8d, 0x11, 0x4c, 0xef, 0x01, 0x97, 0x8a, 0xe2, 0xfc, 0xd1, 0x49, 0x98, 0x70, 0xe2, 0x19, - 0xe0, 0x2f, 0x8d, 0x49, 0xd8, 0x16, 0x01, 0x77, 0xbb, 0x18, 0xff, 0xa2, 0xdd, 0x84, 0x41, 0xde, 0x5d, 0xdf, 0x91, - 0x7e, 0xc4, 0x3d, 0x6c, 0x2e, 0xfb, 0x5b, 0x5e, 0x8a, 0x56, 0xa2, 0x8a, 0x10, 0xa6, 0x46, 0x42, 0x43, 0x9d, 0x23, - 0x81, 0x38, 0xa6, 0x89, 0x35, 0xcc, 0xf6, 0x93, 0xf5, 0x61, 0x97, 0x0a, 0xa1, 0x50, 0x04, 0xa2, 0x33, 0x84, 0x1b, - 0x75, 0x9e, 0x30, 0xc0, 0x3b, 0x04, 0xa0, 0x25, 0xe8, 0xc7, 0x10, 0x9f, 0x5b, 0x27, 0x84, 0xe6, 0x62, 0x9e, 0x3e, - 0x66, 0x0a, 0x4a, 0x52, 0x7d, 0x2d, 0x6f, 0xb3, 0xe6, 0x05, 0x67, 0x2a, 0x2e, 0xa0, 0x68, 0x2b, 0x9e, 0xfa, 0xef, - 0x98, 0x8a, 0x3e, 0x8a, 0x4e, 0x6d, 0xcc, 0x69, 0x9e, 0x30, 0xe7, 0x88, 0x7e, 0xa0, 0xee, 0xc6, 0xf5, 0x6e, 0xc3, - 0x9d, 0xca, 0x12, 0xca, 0x32, 0xf4, 0xba, 0x65, 0xba, 0x94, 0xe4, 0x70, 0x8e, 0xf3, 0xfc, 0x57, 0x0c, 0x71, 0xff, - 0x35, 0xc7, 0xa7, 0xf7, 0x59, 0xda, 0x65, 0x7e, 0xf4, 0xe0, 0xa5, 0x05, 0x66, 0x76, 0xc6, 0x6e, 0x1e, 0xf6, 0x58, - 0x47, 0x02, 0x3b, 0xe2, 0x18, 0xea, 0x1a, 0x67, 0xbc, 0xde, 0x8a, 0x78, 0xa0, 0xb6, 0x1e, 0x6c, 0xbc, 0xa7, 0x34, - 0x4c, 0xb7, 0xa4, 0x8b, 0xac, 0x6b, 0xa2, 0xb2, 0xdf, 0x1f, 0x22, 0xbb, 0xa7, 0xc7, 0x93, 0x3a, 0x69, 0x53, 0x54, - 0x2c, 0x81, 0xce, 0x8d, 0x43, 0xff, 0xe4, 0x2c, 0xcc, 0x63, 0xe8, 0x98, 0xc9, 0x38, 0x5b, 0x67, 0x8c, 0xe7, 0xf6, - 0x33, 0x89, 0xb4, 0x93, 0x81, 0xdf, 0x29, 0x92, 0x9f, 0x7f, 0x58, 0x80, 0x46, 0x14, 0x82, 0xda, 0xed, 0x07, 0x0a, - 0xc5, 0xb1, 0xef, 0x7f, 0x84, 0xb5, 0x7d, 0x8f, 0xd8, 0x85, 0x5d, 0x2c, 0x01, 0xc4, 0x6e, 0x6c, 0xec, 0xff, 0x75, - 0x77, 0xab, 0x91, 0x0d, 0xab, 0x0f, 0x24, 0xd4, 0x57, 0x7b, 0xe6, 0xd9, 0x35, 0xcf, 0x8d, 0x08, 0xce, 0x44, 0x47, - 0xa0, 0x5e, 0xb5, 0xb9, 0xfe, 0x9b, 0xa4, 0xbb, 0x88, 0x22, 0x08, 0x56, 0xd6, 0x20, 0x6b, 0x36, 0xb2, 0xa0, 0x54, - 0xdc, 0x91, 0x1b, 0x7b, 0xbc, 0xc7, 0xf7, 0x76, 0x12, 0x4d, 0x19, 0x25, 0xd7, 0xaa, 0x29, 0x27, 0x0e, 0x63, 0x77, - 0x6f, 0x3c, 0x6b, 0x35, 0x5e, 0x28, 0xfe, 0xa6, 0x06, 0x61, 0xc5, 0x8d, 0xe3, 0x66, 0x83, 0x70, 0xff, 0x6c, 0x51, - 0xa7, 0x6b, 0x91, 0xf1, 0xbc, 0x5a, 0xaf, 0x7d, 0xb6, 0x1b, 0xa9, 0x26, 0xb5, 0x27, 0x34, 0x37, 0x62, 0x9b, 0x77, - 0xdc, 0x6d, 0xc0, 0xe7, 0xc0, 0xc5, 0xd4, 0x91, 0x78, 0xef, 0x51, 0x2f, 0x59, 0xb3, 0xd7, 0x5b, 0x13, 0x1e, 0x1c, - 0x7a, 0x65, 0xb7, 0x7a, 0x22, 0x3e, 0x9f, 0x56, 0xff, 0x74, 0x7f, 0x27, 0x3f, 0xbb, 0x97, 0xb7, 0x6a, 0xca, 0x51, - 0xfa, 0xd4, 0xc4, 0x26, 0x7b, 0x3d, 0x6b, 0x1c, 0xde, 0x6a, 0xdc, 0xee, 0xa4, 0x1b, 0x4d, 0xfb, 0x2f, 0x97, 0x32, - 0x5b, 0xd0, 0x2c, 0x0f, 0x7e, 0x0e, 0x16, 0xdf, 0xb3, 0xd0, 0x7b, 0x15, 0x31, 0xa7, 0x6c, 0x70, 0x48, 0x55, 0x33, - 0xfd, 0x30, 0xde, 0x89, 0x26, 0x6e, 0x3d, 0xda, 0x25, 0xee, 0xa2, 0x46, 0x9c, 0xe4, 0x01, 0xd6, 0x5c, 0xef, 0x0a, - 0xa6, 0xd4, 0x2e, 0xff, 0x04, 0xd2, 0xe2, 0xa5, 0x09, 0x9b, 0xb4, 0xa9, 0xb5, 0x4d, 0x1b, 0xae, 0x02, 0xcb, 0x3f, - 0x16, 0xdb, 0x7c, 0x57, 0xf5, 0x9b, 0x6e, 0xae, 0xf2, 0xf5, 0xcf, 0xe0, 0xc7, 0x6a, 0xaf, 0xe5, 0xa7, 0xff, 0xe1, - 0xfb, 0xff, 0x6a, 0xdc, 0x09, 0x66, 0xbb, 0x39, 0x0b, 0xbe, 0x6a, 0x70, 0x91, 0x65, 0xc3, 0xe7, 0x49, 0xf9, 0xff, - 0xea, 0x7a, 0xf7, 0x8f, 0xab, 0x7f, 0xbf, 0x68, 0x06, 0xf3, 0x11, 0x57, 0x9e, 0x49, 0x5d, 0x9c, 0xfd, 0x37, 0xc4, - 0xd5, 0xd3, 0x7b, 0x1f, 0xb1, 0xc6, 0x15, 0xfb, 0xcd, 0x6e, 0xb2, 0x6c, 0x16, 0x55, 0x96, 0xf0, 0xd4, 0xab, 0x9a, - 0x5d, 0x41, 0x90, 0xcf, 0x7b, 0x9d, 0xcd, 0x47, 0x87, 0x8f, 0x35, 0xa6, 0x7d, 0xa6, 0xdc, 0xfb, 0xfc, 0xc2, 0xf3, - 0x8b, 0x59, 0x39, 0x9e, 0xf7, 0xbc, 0xf4, 0x6a, 0xae, 0xec, 0xc7, 0x9a, 0xe4, 0x4c, 0x67, 0x70, 0xfe, 0x59, 0x39, - 0xbf, 0xf8, 0x7c, 0x7f, 0x76, 0x5f, 0xbe, 0xcc, 0x50, 0xc3, 0x31, 0xcf, 0xac, 0xf9, 0x88, 0x77, 0xa2, 0x56, 0x67, - 0xf1, 0xad, 0xd9, 0xcd, 0xf1, 0x64, 0xc5, 0x11, 0xae, 0xd0, 0x63, 0x3b, 0xac, 0xfc, 0x5d, 0x4f, 0x0d, 0x71, 0xc1, - 0xd0, 0x04, 0x12, 0x0f, 0xfd, 0xdf, 0xc1, 0xd0, 0x0f, 0xbd, 0x97, 0x9f, 0x4d, 0x1a, 0x0e, 0x80, 0xb0, 0xab, 0x96, - 0xc2, 0x6b, 0xa5, 0x3a, 0x62, 0x1b, 0x75, 0x54, 0xf8, 0x40, 0x45, 0x3b, 0x47, 0xdf, 0x5b, 0xde, 0xeb, 0x77, 0xa1, - 0xf4, 0xe0, 0xfa, 0xe1, 0xf1, 0x6b, 0xb1, 0x2e, 0x03, 0xc8, 0x16, 0xc1, 0xe9, 0x86, 0x77, 0xdb, 0xdb, 0x86, 0xe1, - 0x14, 0xaa, 0x3a, 0x51, 0x59, 0x53, 0xeb, 0xcc, 0xbe, 0x8f, 0x16, 0xdd, 0x00, 0x3c, 0x1f, 0xef, 0x13, 0x42, 0xf6, - 0x2e, 0xd2, 0x73, 0xd2, 0x09, 0x23, 0x10, 0xd8, 0x22, 0x0a, 0x6c, 0x1a, 0xe4, 0x7d, 0x7c, 0x87, 0x6e, 0x48, 0xcb, - 0xcf, 0x68, 0xae, 0x3e, 0x77, 0x31, 0xa5, 0xec, 0xe1, 0x6a, 0x6e, 0xb5, 0x4f, 0x01, 0x24, 0xb1, 0x4d, 0x08, 0x58, - 0xfe, 0x93, 0xc7, 0x4d, 0xc3, 0xd6, 0x9b, 0x74, 0xe9, 0x85, 0xd4, 0x9d, 0x9a, 0x34, 0x65, 0x84, 0x91, 0xe9, 0x85, - 0xe7, 0x15, 0x9d, 0x70, 0x97, 0x63, 0xa2, 0x57, 0x8c, 0x8c, 0x59, 0x71, 0xa7, 0xde, 0xb6, 0xbc, 0xfe, 0x5c, 0x07, - 0x41, 0x48, 0x37, 0x36, 0xa4, 0xcb, 0xcc, 0xdd, 0x2b, 0xb8, 0x99, 0x11, 0xb0, 0x79, 0x09, 0x75, 0xc6, 0xef, 0x99, - 0x24, 0xd1, 0x9d, 0x35, 0x4d, 0x9c, 0xf1, 0xb7, 0xd5, 0x6c, 0xa1, 0x8a, 0xc4, 0x0b, 0x73, 0x03, 0x12, 0x84, 0xfa, - 0x86, 0x5a, 0x61, 0xd5, 0x37, 0x98, 0xb4, 0x1f, 0x38, 0x39, 0xcf, 0x34, 0x83, 0x4e, 0xe3, 0x7d, 0x1d, 0x33, 0x26, - 0xba, 0x9a, 0xa2, 0x50, 0x18, 0x6d, 0xe7, 0xcf, 0xe2, 0x66, 0x96, 0xf5, 0x60, 0x02, 0xf0, 0x36, 0x0f, 0xa0, 0x9f, - 0xd7, 0x0a, 0x66, 0xf2, 0x06, 0x3f, 0xfc, 0x12, 0x06, 0x64, 0x7c, 0xe8, 0x41, 0xce, 0xe6, 0x27, 0x05, 0xfd, 0xc7, - 0x20, 0x5e, 0x77, 0x96, 0xb3, 0x5b, 0x42, 0x6b, 0x29, 0xd6, 0x8a, 0x71, 0x96, 0x91, 0xeb, 0xd4, 0x6f, 0xea, 0x2a, - 0x99, 0xaf, 0xed, 0xea, 0x72, 0xf1, 0x6d, 0x4f, 0xee, 0x30, 0x38, 0x05, 0xbc, 0xa0, 0xa1, 0x20, 0x66, 0x2a, 0x3f, - 0xaf, 0xce, 0x6e, 0x28, 0xf5, 0x41, 0x32, 0x7d, 0xae, 0xf0, 0xaa, 0x1a, 0xff, 0x85, 0x45, 0x5f, 0x6a, 0x25, 0xf4, - 0x17, 0x60, 0xf8, 0xd0, 0xb6, 0xcd, 0x84, 0x67, 0x67, 0x0b, 0xf7, 0x34, 0xf9, 0x54, 0x73, 0xb7, 0xda, 0x88, 0x39, - 0xcf, 0x01, 0x81, 0xb4, 0x50, 0x6a, 0xfc, 0x89, 0xd3, 0x12, 0x24, 0xb9, 0xf1, 0xb3, 0x85, 0x32, 0x3a, 0xba, 0xe2, - 0x14, 0xa7, 0x8b, 0xd7, 0x82, 0x55, 0xd4, 0xfe, 0xb6, 0xa9, 0xe3, 0x8b, 0xef, 0xd2, 0xb1, 0x6d, 0xb9, 0x7f, 0x37, - 0x7d, 0xdb, 0xa0, 0x38, 0x13, 0x36, 0x06, 0x7f, 0xe9, 0xbe, 0x6d, 0x0e, 0x34, 0x7c, 0x88, 0x3e, 0x77, 0xaf, 0xfe, - 0xb8, 0x26, 0x5d, 0x81, 0x6e, 0x89, 0xa7, 0x67, 0x3a, 0x28, 0x9a, 0x87, 0x92, 0x8b, 0x17, 0x25, 0xb0, 0x56, 0x30, - 0x9a, 0xce, 0x78, 0x11, 0x9c, 0x14, 0xda, 0xe7, 0x0d, 0x93, 0x9f, 0x16, 0x5c, 0xfb, 0x51, 0x49, 0xef, 0x14, 0x6a, - 0x8c, 0xef, 0xaf, 0x9b, 0x6c, 0xbd, 0x6b, 0x5e, 0x4b, 0xaa, 0x28, 0x8c, 0x7e, 0x87, 0x01, 0xf2, 0xd5, 0x97, 0x25, - 0x32, 0xfa, 0xf6, 0x4e, 0xdd, 0x6a, 0xbe, 0x77, 0x39, 0xd3, 0x19, 0x81, 0x3f, 0xdf, 0x8c, 0x59, 0xd3, 0x74, 0x33, - 0x46, 0x36, 0x02, 0x73, 0x17, 0x10, 0xa5, 0x89, 0x34, 0x28, 0x2b, 0xc8, 0x77, 0x57, 0xc3, 0x56, 0xa9, 0xcd, 0xde, - 0x9f, 0xfd, 0xdf, 0x4f, 0x0b, 0xee, 0x91, 0xf4, 0xe2, 0x8f, 0x1e, 0xaf, 0x63, 0x21, 0xcd, 0xbd, 0x50, 0xe3, 0x67, - 0xed, 0x71, 0xca, 0x6d, 0x3c, 0x40, 0xb3, 0x86, 0x0e, 0x0d, 0xdb, 0x87, 0x74, 0x5c, 0x1c, 0x5f, 0x63, 0xe8, 0xfb, - 0x06, 0x52, 0xc2, 0xd4, 0xe4, 0x3d, 0xa5, 0x15, 0x75, 0x60, 0x04, 0x15, 0xe5, 0x85, 0x72, 0x62, 0xd6, 0x56, 0xf4, - 0x6e, 0xc3, 0xc4, 0xd9, 0xa0, 0xfe, 0x66, 0xcb, 0xcb, 0x1e, 0x7b, 0x1f, 0xf0, 0xf5, 0x4c, 0x01, 0xc7, 0x38, 0xa1, - 0x46, 0xb0, 0x1d, 0xa4, 0xc8, 0x22, 0xf0, 0x09, 0x33, 0x6a, 0x08, 0x65, 0xcd, 0xd4, 0x96, 0xf2, 0x24, 0x48, 0xaf, - 0x2b, 0x2b, 0x5d, 0xd8, 0xe5, 0xdb, 0x2a, 0xba, 0x39, 0xbd, 0x83, 0x3d, 0xf9, 0x5e, 0xf3, 0xde, 0x7a, 0xa9, 0xd4, - 0x6a, 0xda, 0x90, 0xb0, 0x90, 0xb5, 0xc0, 0xae, 0x5b, 0xe7, 0x47, 0xd7, 0x31, 0x66, 0xf1, 0x08, 0x3e, 0x23, 0xd8, - 0x0b, 0x72, 0x53, 0xe7, 0xd6, 0xce, 0x60, 0x61, 0x42, 0xbe, 0xcf, 0xcf, 0x12, 0xb0, 0xb4, 0x63, 0xd3, 0x74, 0x70, - 0x3e, 0xa4, 0xef, 0xa1, 0x77, 0x4b, 0x01, 0x59, 0x38, 0x35, 0x7b, 0x57, 0x8b, 0x02, 0x4f, 0x1c, 0x92, 0x1a, 0xd0, - 0xf7, 0xec, 0x75, 0xfc, 0x46, 0x9f, 0x58, 0x24, 0x52, 0xd3, 0xdb, 0xf8, 0x9b, 0x67, 0xdf, 0xe8, 0xab, 0x53, 0xcf, - 0x84, 0xaf, 0x3e, 0x94, 0x5a, 0xcd, 0x86, 0x06, 0xec, 0x30, 0xd3, 0xc6, 0xb9, 0x0e, 0x4a, 0x7d, 0x33, 0x61, 0x27, - 0xe4, 0x65, 0x71, 0xe3, 0x28, 0x0d, 0xc1, 0x40, 0x7a, 0x11, 0x8f, 0xa2, 0xfc, 0xbe, 0xea, 0xc9, 0xcc, 0xfa, 0x08, - 0x4f, 0x2f, 0x1f, 0xfe, 0xf1, 0xb5, 0x2a, 0xbe, 0xbc, 0xb7, 0x1b, 0xf9, 0xc9, 0x4e, 0x41, 0xe2, 0xd0, 0x54, 0xec, - 0x01, 0x4d, 0x0e, 0x1c, 0x02, 0x71, 0x43, 0x79, 0xec, 0xc3, 0xfe, 0x5c, 0xf3, 0x0d, 0x01, 0x35, 0x56, 0x12, 0x54, - 0x4b, 0x67, 0xfe, 0x72, 0x25, 0x17, 0x2e, 0xde, 0x5d, 0x3c, 0xb7, 0x28, 0x7b, 0xff, 0xf3, 0x96, 0xfe, 0xd1, 0x7e, - 0x6f, 0x28, 0xb7, 0x97, 0x33, 0xff, 0xef, 0x35, 0x85, 0x0b, 0x81, 0x07, 0x24, 0xa9, 0x85, 0xe4, 0x4a, 0x87, 0x8f, - 0xdf, 0x1c, 0xea, 0xbc, 0xc7, 0x74, 0x5f, 0x61, 0x56, 0x17, 0x44, 0xc1, 0xc7, 0x07, 0xa8, 0x6c, 0x03, 0xc5, 0x08, - 0xe1, 0x02, 0x46, 0x1f, 0xee, 0xeb, 0x46, 0x2d, 0x02, 0x69, 0x57, 0xae, 0xfe, 0x78, 0x61, 0xe0, 0x95, 0xc3, 0x6f, - 0x2d, 0xb9, 0x2f, 0x25, 0xbe, 0xd0, 0xd8, 0x9e, 0x5c, 0x4b, 0xe3, 0x89, 0x8c, 0x8a, 0x50, 0x55, 0x91, 0x7c, 0xce, - 0xbd, 0x5a, 0x7d, 0x31, 0x8c, 0x7c, 0x26, 0x30, 0xd7, 0x9b, 0x36, 0x76, 0x9c, 0x54, 0x97, 0xfc, 0xa7, 0x1e, 0x60, - 0x30, 0xd8, 0x97, 0x6d, 0xd3, 0xf4, 0x7e, 0xe7, 0xa4, 0xe1, 0x09, 0x92, 0xc0, 0x1a, 0x0c, 0x5c, 0x95, 0x24, 0x48, - 0x6f, 0xcc, 0x8a, 0x2e, 0x4d, 0xc9, 0x7b, 0xea, 0x29, 0xd9, 0x88, 0xe4, 0x21, 0xa0, 0x23, 0xc1, 0x45, 0xff, 0x51, - 0x6b, 0x23, 0x5c, 0x6b, 0xf9, 0x39, 0x9f, 0x6c, 0xe8, 0x74, 0xb3, 0x2b, 0xb2, 0xa3, 0x0f, 0xa3, 0x3c, 0x9c, 0x3b, - 0x19, 0xe6, 0x61, 0x24, 0xb0, 0x92, 0xb9, 0x79, 0xdc, 0x00, 0xf1, 0x4d, 0x96, 0x64, 0xb7, 0xe4, 0x7f, 0xfc, 0x29, - 0xaf, 0x23, 0xa4, 0x64, 0x5b, 0xdf, 0x55, 0x34, 0x3a, 0x85, 0x93, 0x5c, 0xa7, 0x65, 0x79, 0x21, 0x9c, 0x50, 0x20, - 0x6c, 0x69, 0xd4, 0x48, 0x7e, 0xff, 0xfe, 0xc7, 0x10, 0x2c, 0xfa, 0xf8, 0xa6, 0x99, 0x75, 0x5b, 0x81, 0x31, 0x82, - 0x46, 0x9d, 0x99, 0xdd, 0xe8, 0xf4, 0x26, 0x23, 0x11, 0x28, 0x49, 0x63, 0x8a, 0xb4, 0x87, 0xc3, 0xdd, 0xe6, 0xab, - 0x3f, 0xb2, 0x1d, 0x4b, 0xaa, 0xb6, 0x59, 0xa8, 0x2d, 0x40, 0x80, 0x51, 0xbf, 0x37, 0x10, 0x4d, 0x34, 0x05, 0x05, - 0x2b, 0x6f, 0xe8, 0xdc, 0x8e, 0x6e, 0xcd, 0x6e, 0x41, 0xfb, 0x55, 0xfd, 0x19, 0xa1, 0x83, 0xdb, 0x4a, 0x7a, 0x4e, - 0x4a, 0x55, 0xa4, 0x2e, 0x38, 0xa7, 0x20, 0xb1, 0xb5, 0x0d, 0xb4, 0x7d, 0x6a, 0x4c, 0xe4, 0xfd, 0x45, 0xc5, 0x55, - 0x44, 0x00, 0x02, 0x84, 0x97, 0xe5, 0x5d, 0xc2, 0x27, 0xa3, 0x04, 0x00, 0xd3, 0xe3, 0xd2, 0x4b, 0xc6, 0x52, 0xd1, - 0xf0, 0xb0, 0x55, 0x50, 0x6d, 0xbb, 0x40, 0xe5, 0x80, 0x0b, 0xac, 0xac, 0xc3, 0x3c, 0x13, 0x52, 0x35, 0x29, 0x2e, - 0xba, 0x99, 0x5d, 0xa4, 0x3c, 0xdd, 0xa7, 0xa9, 0x24, 0x6c, 0x5a, 0x7f, 0x67, 0x7c, 0x19, 0x87, 0x68, 0x96, 0xbe, - 0x38, 0x6e, 0x3c, 0x5a, 0xde, 0x8e, 0xa6, 0x03, 0xd3, 0xda, 0x79, 0x12, 0x01, 0xca, 0x4e, 0x95, 0x70, 0xf5, 0x3c, - 0x04, 0x45, 0xa8, 0xf1, 0x43, 0xb7, 0x41, 0xc1, 0x6f, 0xe4, 0xe7, 0xa7, 0x86, 0x02, 0x84, 0xf1, 0xd2, 0x01, 0x0f, - 0xdd, 0xe4, 0xc5, 0x96, 0xb2, 0x73, 0xc0, 0xd8, 0x1b, 0xd1, 0x0b, 0x48, 0x6b, 0x62, 0xea, 0x4e, 0x72, 0x14, 0x5d, - 0x9c, 0x53, 0x5e, 0xc5, 0x2d, 0xd3, 0x65, 0xe9, 0x63, 0xea, 0x9d, 0x08, 0x9f, 0x13, 0x2b, 0x84, 0xff, 0x1d, 0x91, - 0xc3, 0xac, 0x94, 0x69, 0x81, 0x11, 0x6b, 0x89, 0x17, 0x38, 0xdf, 0x09, 0xd1, 0x4c, 0xd5, 0x4c, 0x57, 0x84, 0x79, - 0xaa, 0xaf, 0xf5, 0x9e, 0x3c, 0xc9, 0x1e, 0xa8, 0xf2, 0x61, 0xaf, 0xbb, 0x24, 0x98, 0xd7, 0xb2, 0xa9, 0xb7, 0x61, - 0xa2, 0xb0, 0x0f, 0x16, 0xf2, 0xb8, 0x6a, 0x08, 0x38, 0x3d, 0xf5, 0xab, 0x6f, 0xf5, 0x61, 0xdd, 0xb4, 0x2b, 0x04, - 0x9f, 0x93, 0x44, 0x84, 0x9f, 0xdb, 0x25, 0xce, 0xca, 0xab, 0xeb, 0xec, 0xb3, 0x58, 0xad, 0x41, 0xe6, 0xe5, 0x29, - 0xd1, 0xb6, 0xff, 0xd9, 0x41, 0x79, 0xde, 0x4d, 0x12, 0x3c, 0x4c, 0x47, 0x14, 0x33, 0x71, 0x8e, 0xa4, 0x21, 0x13, - 0xcf, 0xf9, 0xe2, 0x8b, 0x1a, 0xbd, 0x9f, 0x13, 0x4a, 0xc7, 0xa4, 0xf9, 0x8d, 0x0a, 0xa1, 0x0b, 0x09, 0x1d, 0x3f, - 0x74, 0xf9, 0xba, 0xb0, 0x76, 0xf3, 0x89, 0x88, 0xf5, 0x1f, 0xdc, 0x88, 0xa2, 0xd2, 0x79, 0x2c, 0x96, 0x40, 0x32, - 0xc6, 0x4f, 0xf4, 0x1b, 0x33, 0x4f, 0xba, 0x7a, 0xf8, 0x0c, 0x1b, 0x0d, 0xc7, 0x41, 0x9c, 0x03, 0x9e, 0xbf, 0x0c, - 0x7b, 0x5b, 0x1f, 0x15, 0xbf, 0x7f, 0x7d, 0x40, 0x54, 0x6b, 0xb8, 0xa2, 0xf4, 0x67, 0x1c, 0xe2, 0x12, 0xc9, 0x40, - 0x8b, 0x19, 0x7e, 0x21, 0xd2, 0xea, 0x7f, 0x45, 0xce, 0x3d, 0x0e, 0xec, 0x84, 0xfc, 0x17, 0xb7, 0xbd, 0x07, 0x5d, - 0x15, 0x42, 0xde, 0x8e, 0xa8, 0x91, 0x22, 0x0e, 0xef, 0xee, 0xcd, 0xd7, 0xd6, 0x22, 0xe7, 0xc0, 0xac, 0xdd, 0x4d, - 0x99, 0x85, 0xbb, 0x48, 0x6d, 0x31, 0x6d, 0x9a, 0x6d, 0x82, 0x97, 0x61, 0x27, 0x9d, 0x2c, 0x3e, 0xb5, 0x81, 0x50, - 0x55, 0x04, 0x48, 0x25, 0x0b, 0xfd, 0x0b, 0x94, 0xae, 0x5a, 0x2c, 0x43, 0x4b, 0x25, 0xe7, 0xba, 0x12, 0x4b, 0x3f, - 0xa1, 0xc0, 0x20, 0xfd, 0xe2, 0x56, 0x69, 0x3a, 0x2b, 0xa4, 0x88, 0x44, 0x8f, 0xd7, 0x96, 0xdd, 0x5d, 0xa8, 0x3c, - 0x92, 0xee, 0x33, 0x39, 0xc0, 0xf5, 0x4e, 0xaa, 0x8e, 0x95, 0x04, 0xed, 0x40, 0xf7, 0x00, 0xa5, 0x7e, 0x6a, 0x3d, - 0x44, 0x5a, 0x21, 0xf0, 0x12, 0x6e, 0xcc, 0x90, 0x68, 0x1f, 0xa8, 0x87, 0xc4, 0x04, 0xa0, 0x29, 0x38, 0xc1, 0x96, - 0x42, 0xdb, 0xb9, 0x91, 0x5c, 0xa1, 0x80, 0x95, 0xb1, 0x46, 0x35, 0x66, 0x1e, 0x5a, 0x61, 0x22, 0x8e, 0xb3, 0xcd, - 0xc8, 0x43, 0x1c, 0xa9, 0x43, 0xb4, 0xfd, 0x42, 0xe2, 0xa0, 0xc5, 0x99, 0x33, 0x8d, 0x5c, 0x21, 0x1c, 0x9f, 0x82, - 0x34, 0x8c, 0x60, 0xc3, 0xf5, 0x51, 0x6d, 0xac, 0x32, 0x21, 0x72, 0xab, 0x6e, 0x24, 0xed, 0xd7, 0xf1, 0x3b, 0x97, - 0x58, 0xc9, 0xb2, 0xe2, 0x9b, 0xa6, 0xd4, 0x33, 0xe5, 0xd5, 0x67, 0x56, 0x26, 0xbd, 0xdc, 0x47, 0x79, 0xc4, 0x5b, - 0xb0, 0xb8, 0x29, 0xf9, 0x21, 0xa6, 0xa0, 0x06, 0xf0, 0x68, 0x5c, 0x3b, 0x5c, 0x41, 0xb1, 0x18, 0x18, 0x69, 0x3a, - 0xad, 0x1c, 0xf3, 0xa5, 0x9a, 0x0d, 0x0c, 0xf3, 0x18, 0x4f, 0x2c, 0x74, 0x62, 0x7f, 0xcd, 0xf3, 0xb9, 0x45, 0x23, - 0x4f, 0xd3, 0x06, 0x59, 0x7e, 0x9b, 0xd6, 0x6b, 0x95, 0xe3, 0xf1, 0xb6, 0x02, 0x88, 0xdf, 0x41, 0x59, 0x50, 0x0c, - 0x15, 0x4d, 0x8a, 0x19, 0x0c, 0x97, 0xc6, 0x0b, 0x32, 0x01, 0xba, 0x0c, 0x33, 0x6b, 0x8b, 0xaa, 0xbc, 0x3d, 0x16, - 0xc3, 0x7d, 0x50, 0xaa, 0x48, 0x7e, 0xa5, 0x9a, 0x2d, 0x8f, 0x2a, 0xfc, 0xc7, 0x50, 0x1d, 0x43, 0xa4, 0x9d, 0xfc, - 0xab, 0xa3, 0x46, 0xc7, 0x7d, 0x71, 0xc8, 0x8e, 0x3d, 0x3f, 0x63, 0x20, 0x42, 0x4e, 0xba, 0x15, 0x6e, 0xf1, 0x49, - 0x7a, 0xd4, 0x08, 0xf4, 0x15, 0x04, 0x57, 0x6b, 0xde, 0x9d, 0x51, 0x61, 0xab, 0x51, 0x8e, 0x82, 0x32, 0x0c, 0x51, - 0x0d, 0x4f, 0xd1, 0x38, 0xf0, 0xb2, 0xc0, 0x01, 0x13, 0x01, 0x28, 0xe1, 0xb9, 0x24, 0xba, 0xe8, 0x7f, 0x4b, 0x73, - 0xf4, 0x86, 0x15, 0xec, 0xc8, 0x7c, 0xe9, 0x40, 0x8a, 0x80, 0x90, 0x4a, 0xb9, 0xaa, 0x7f, 0x30, 0x10, 0x8e, 0x87, - 0x91, 0xc1, 0xe4, 0x67, 0xc8, 0x87, 0xf2, 0x66, 0x86, 0x97, 0x47, 0x6e, 0x20, 0x4d, 0x4c, 0xa9, 0xc7, 0xb4, 0x46, - 0x6a, 0xb7, 0xdb, 0xc1, 0x55, 0x2a, 0xdd, 0xa0, 0xc6, 0x17, 0x45, 0x30, 0xfa, 0x97, 0x1b, 0x08, 0x3f, 0xfc, 0x2f, - 0x6e, 0x4b, 0xb0, 0x29, 0x7a, 0x8b, 0x03, 0x90, 0xf6, 0x6d, 0xa9, 0xba, 0x1e, 0x20, 0xc6, 0x96, 0x05, 0xfc, 0xe7, - 0xe0, 0x14, 0x11, 0x4b, 0x67, 0x2c, 0x66, 0xab, 0x53, 0x18, 0x72, 0xff, 0x8b, 0xa1, 0x23, 0x08, 0xfb, 0xd7, 0x19, - 0x76, 0x0c, 0x33, 0x40, 0x26, 0x7b, 0x90, 0x8a, 0x38, 0x52, 0x4c, 0x63, 0x1e, 0xad, 0x05, 0x8e, 0x14, 0x69, 0xf1, - 0x3e, 0x2a, 0x15, 0xdd, 0x97, 0x3c, 0x70, 0x40, 0x55, 0x0e, 0xe1, 0xb7, 0x16, 0x7d, 0x2b, 0x21, 0xf3, 0xba, 0xc9, - 0x02, 0x50, 0x17, 0x63, 0x31, 0xd6, 0x13, 0x92, 0x91, 0x9f, 0xb4, 0xa3, 0xc7, 0x68, 0x68, 0xf2, 0xf1, 0xa9, 0xee, - 0xb8, 0xe9, 0x9e, 0xbf, 0x51, 0x43, 0xb1, 0x7f, 0x2f, 0x13, 0x7d, 0x23, 0x8b, 0x64, 0xef, 0xec, 0xb3, 0xd9, 0x19, - 0xe6, 0xa6, 0xa7, 0xc6, 0x48, 0x37, 0xab, 0x3b, 0x9b, 0x2d, 0x53, 0x3b, 0x72, 0x07, 0x34, 0x67, 0x7c, 0x9d, 0xde, - 0x40, 0x1c, 0xef, 0x85, 0xc4, 0xcd, 0x74, 0xc4, 0x94, 0x7e, 0xdc, 0x88, 0x80, 0x1a, 0x45, 0x07, 0x1b, 0x99, 0xf6, - 0x6f, 0x81, 0x9c, 0x4d, 0xd0, 0x41, 0x15, 0x54, 0x5b, 0xcc, 0x4c, 0x0b, 0x39, 0x34, 0xd2, 0x82, 0x82, 0x95, 0xc6, - 0x60, 0xb0, 0x52, 0x95, 0x64, 0x2f, 0x4a, 0x2c, 0x3d, 0xcb, 0x59, 0xe8, 0x50, 0x36, 0x1d, 0x3c, 0x5f, 0x0a, 0x97, - 0x44, 0xbc, 0xac, 0x85, 0x61, 0xda, 0x6c, 0xa5, 0xa5, 0x65, 0x45, 0x25, 0xec, 0xe4, 0xfa, 0xbc, 0x94, 0x85, 0x79, - 0xa2, 0xb6, 0xf1, 0x8c, 0xdc, 0xcc, 0x50, 0xbe, 0x52, 0xfd, 0x30, 0xbd, 0x5f, 0xf8, 0x77, 0x90, 0x40, 0x9f, 0x22, - 0x60, 0x05, 0x5d, 0x12, 0x6c, 0xa4, 0xf4, 0xcf, 0x17, 0x97, 0x35, 0x0a, 0x7f, 0x7a, 0x01, 0xaf, 0xd2, 0xbd, 0x6e, - 0x87, 0xa1, 0xc8, 0xd7, 0x9e, 0x7c, 0x35, 0x9d, 0xfc, 0x91, 0xc2, 0xe1, 0xba, 0x92, 0x9e, 0x4b, 0x6f, 0x16, 0xf4, - 0x73, 0xeb, 0xd5, 0x57, 0xea, 0x2d, 0x54, 0x4f, 0x93, 0x88, 0xdd, 0x2d, 0xbd, 0x8f, 0x9e, 0x8d, 0x42, 0x68, 0x56, - 0xde, 0x7c, 0xff, 0x90, 0xb4, 0x4c, 0xd4, 0x2a, 0x17, 0x77, 0xb3, 0x81, 0xd0, 0xd6, 0x38, 0x47, 0xd8, 0xbb, 0x71, - 0xee, 0x5f, 0x5a, 0x92, 0x00, 0x55, 0x4c, 0x28, 0xbe, 0xa3, 0xd3, 0x40, 0xee, 0x83, 0x3b, 0x3a, 0x7e, 0xbb, 0xf3, - 0xb5, 0x9a, 0x06, 0xf6, 0x08, 0x53, 0x0f, 0xa2, 0xbf, 0xc1, 0xaa, 0x97, 0x5e, 0x2f, 0x17, 0xd8, 0x9c, 0x97, 0x3c, - 0xb0, 0x54, 0x90, 0x95, 0x57, 0xee, 0xc0, 0xa4, 0xf6, 0x08, 0x02, 0xe8, 0x2f, 0x1b, 0x37, 0xf7, 0x77, 0x22, 0x15, - 0xc1, 0x5d, 0x76, 0x9c, 0x8c, 0xd6, 0xf4, 0x3b, 0x3b, 0x8e, 0x05, 0x63, 0xa7, 0x97, 0x09, 0xab, 0x30, 0xd0, 0x8a, - 0xa3, 0xf5, 0x55, 0xf2, 0x8f, 0x2a, 0xc3, 0xac, 0x15, 0x05, 0xec, 0xfd, 0x52, 0x85, 0xf5, 0x41, 0x29, 0xaa, 0x8b, - 0x78, 0x42, 0xc7, 0x93, 0x66, 0xc3, 0x01, 0x8b, 0xa1, 0x45, 0x8c, 0x2d, 0xf6, 0x48, 0x87, 0xcd, 0x38, 0xa9, 0x77, - 0x7c, 0x56, 0xe1, 0xbc, 0x71, 0x1c, 0xb7, 0xc1, 0x6b, 0x8d, 0xca, 0xf2, 0x05, 0x6e, 0xe0, 0x17, 0xaf, 0x54, 0x8f, - 0x7f, 0xf8, 0xf6, 0xba, 0xb8, 0xa8, 0x3a, 0x0c, 0x6d, 0xf1, 0xa7, 0x0d, 0x69, 0x4c, 0x1a, 0xf6, 0x70, 0xfd, 0x4a, - 0x9a, 0x7c, 0xc1, 0xa8, 0xef, 0x90, 0x8d, 0xd9, 0xba, 0x5f, 0x00, 0x8f, 0x79, 0xef, 0x7a, 0xa9, 0x5f, 0x4a, 0x52, - 0x35, 0xa2, 0x15, 0x35, 0xf1, 0xcd, 0x1a, 0x37, 0xc9, 0x5a, 0x90, 0x84, 0xb6, 0x47, 0xed, 0x88, 0x0f, 0xf1, 0xfb, - 0xb7, 0x29, 0x54, 0x81, 0x78, 0x6f, 0x76, 0x5d, 0x06, 0xbb, 0xd5, 0xb3, 0x94, 0x84, 0x95, 0x1b, 0x30, 0x35, 0xd5, - 0xd2, 0x6c, 0x58, 0x85, 0x7c, 0x0e, 0x4c, 0xd2, 0x9a, 0x74, 0x4e, 0x69, 0x21, 0xd4, 0x32, 0xec, 0x9f, 0x92, 0x45, - 0xc4, 0xc7, 0x32, 0xf8, 0xbc, 0x90, 0x53, 0x77, 0xd0, 0x88, 0x2c, 0x46, 0xad, 0xdc, 0x82, 0xdd, 0x8e, 0xd6, 0x3e, - 0x55, 0x09, 0x88, 0xf5, 0xbb, 0x66, 0xe3, 0x6c, 0x14, 0xd8, 0x43, 0xe8, 0x07, 0xdf, 0xf1, 0x36, 0xcb, 0x5d, 0x60, - 0x4a, 0x79, 0xa4, 0xda, 0x52, 0xfa, 0x8c, 0x17, 0x3f, 0xf2, 0x1e, 0x5a, 0xca, 0xdd, 0x7d, 0xc5, 0x1f, 0x3f, 0x5d, - 0xe7, 0xb5, 0x98, 0x4e, 0xe2, 0x5c, 0x9a, 0x63, 0x49, 0xd9, 0x23, 0xc7, 0x71, 0x71, 0xf7, 0x29, 0x14, 0x9a, 0x51, - 0x11, 0x86, 0x34, 0x12, 0x94, 0x9f, 0x29, 0xae, 0xb8, 0xf6, 0x09, 0xad, 0x25, 0x02, 0x64, 0xf0, 0xfd, 0xa3, 0x4c, - 0x57, 0xee, 0xf3, 0x00, 0x7f, 0xb7, 0x68, 0x95, 0xb0, 0x66, 0x51, 0x84, 0x6d, 0x02, 0x92, 0xf5, 0xdd, 0x61, 0x87, - 0xec, 0xec, 0x86, 0x08, 0x02, 0x75, 0xd7, 0x21, 0x40, 0x18, 0xaf, 0x11, 0xca, 0xe5, 0x5f, 0x2b, 0xe3, 0x76, 0x25, - 0x13, 0xea, 0x30, 0xca, 0x2e, 0x28, 0xf0, 0xde, 0x8b, 0x7e, 0xe9, 0x6d, 0x95, 0x1b, 0x5a, 0x4e, 0xd6, 0x47, 0x2f, - 0x3f, 0x29, 0xbb, 0x24, 0x7f, 0xc8, 0x68, 0x01, 0x48, 0xd9, 0x98, 0x66, 0xe3, 0x98, 0xae, 0x5a, 0xb7, 0xcc, 0x47, - 0xd9, 0x06, 0xc3, 0x76, 0x88, 0x51, 0x3c, 0x68, 0xd5, 0x90, 0x5c, 0xb1, 0x69, 0x8f, 0x7b, 0xe9, 0xc1, 0x6d, 0xf7, - 0x7e, 0x38, 0x38, 0x17, 0xf2, 0x88, 0xd9, 0x4b, 0x98, 0x8f, 0x1a, 0xbb, 0x42, 0xa6, 0x19, 0x0e, 0xe2, 0x20, 0x07, - 0xd9, 0x76, 0xdd, 0x05, 0x53, 0x8e, 0x69, 0x71, 0xbb, 0xc5, 0x46, 0x36, 0x90, 0x11, 0x5a, 0xb0, 0xc9, 0xf8, 0x50, - 0x2c, 0xd3, 0xa1, 0x74, 0xdf, 0x63, 0x02, 0xc6, 0x5a, 0x0f, 0x13, 0xbf, 0x66, 0x1d, 0xa2, 0x4b, 0x16, 0xa4, 0xa9, - 0xd1, 0xe3, 0x9b, 0x3e, 0xa5, 0x5b, 0x66, 0x43, 0xc3, 0xf7, 0x3a, 0xcc, 0x1a, 0x0c, 0x2b, 0xf6, 0x89, 0xb2, 0x57, - 0xf5, 0xc7, 0xdb, 0x71, 0x50, 0x4b, 0x39, 0x73, 0x79, 0x9b, 0xd1, 0xbf, 0x99, 0xc3, 0x40, 0xe3, 0x85, 0xc2, 0x7b, - 0x39, 0x81, 0x9a, 0x96, 0x34, 0x29, 0x78, 0xbb, 0xbc, 0x5a, 0x6d, 0xc2, 0xb8, 0x7f, 0xf7, 0xa1, 0x54, 0x5c, 0xff, - 0xee, 0x7d, 0xdd, 0x55, 0xbd, 0x2f, 0x6f, 0x94, 0x4b, 0x3a, 0xaf, 0xd6, 0x57, 0x10, 0xa0, 0xd2, 0x5b, 0x99, 0xb2, - 0x21, 0xdb, 0x83, 0xd7, 0x75, 0xbd, 0x77, 0x55, 0x7e, 0xdc, 0x81, 0xdd, 0x6d, 0x72, 0x16, 0x6b, 0x0b, 0xea, 0xa9, - 0xd3, 0xb8, 0x7b, 0x29, 0xe5, 0x86, 0x83, 0x53, 0x8a, 0xba, 0xc5, 0x37, 0xbc, 0x3f, 0x67, 0xd7, 0xa9, 0x4b, 0xbd, - 0xd5, 0x6f, 0xd7, 0xbf, 0xf2, 0xd4, 0x58, 0xe5, 0xa0, 0x86, 0xf5, 0xab, 0xf6, 0x35, 0x99, 0x5d, 0x83, 0x99, 0x31, - 0x48, 0xe1, 0x72, 0xae, 0x3e, 0x1b, 0x1c, 0x85, 0x79, 0x4e, 0xa8, 0x60, 0x0b, 0x42, 0xfd, 0xf8, 0x25, 0x31, 0x95, - 0xcc, 0x3f, 0x1c, 0x57, 0x46, 0x3f, 0x08, 0x7d, 0xbb, 0x6a, 0xbd, 0x0c, 0x75, 0x4e, 0x91, 0x8f, 0xb9, 0x9a, 0xe0, - 0x97, 0xd4, 0xc1, 0xd1, 0x2c, 0xfc, 0x53, 0x1d, 0xb6, 0x3b, 0x9c, 0x8f, 0x1e, 0x68, 0x5c, 0xed, 0x1b, 0xf0, 0x46, - 0xb4, 0xb3, 0xb0, 0xe3, 0xdd, 0xa7, 0x69, 0xac, 0xc3, 0xe1, 0xcc, 0xb0, 0xa4, 0x8c, 0x38, 0x0c, 0x98, 0x87, 0x6e, - 0xc9, 0x76, 0xb9, 0x6e, 0x93, 0x83, 0x94, 0xf5, 0x1e, 0x4a, 0x31, 0x8f, 0xe6, 0xb9, 0x69, 0xef, 0x79, 0x2f, 0xba, - 0xc2, 0x70, 0x79, 0x30, 0x32, 0x1f, 0xb3, 0x42, 0xaa, 0xae, 0x53, 0xd7, 0x71, 0xa6, 0x35, 0x46, 0xe4, 0x23, 0xc6, - 0xcd, 0xf7, 0x96, 0xb0, 0x68, 0x57, 0xb7, 0x2b, 0x88, 0x33, 0xac, 0xfc, 0x5f, 0x19, 0x9b, 0xa9, 0xa7, 0x0b, 0xb6, - 0xa7, 0x16, 0xfc, 0x79, 0x93, 0xb2, 0xa2, 0x82, 0x1b, 0x1d, 0x41, 0xa9, 0x7f, 0x7c, 0x5e, 0xd4, 0xaa, 0x66, 0x64, - 0xcd, 0x6f, 0x89, 0x77, 0xc6, 0x78, 0x5d, 0xd7, 0x15, 0xb2, 0xdf, 0xc5, 0xa9, 0xd1, 0x87, 0x26, 0x35, 0x8a, 0x64, - 0xfd, 0xa5, 0x68, 0x0e, 0x0c, 0x61, 0x84, 0xc6, 0x9b, 0xb5, 0xce, 0xc9, 0xe0, 0x24, 0xce, 0xaf, 0x3a, 0xb0, 0xde, - 0xce, 0xb1, 0xbd, 0x82, 0x41, 0x10, 0xf8, 0x57, 0x11, 0xa3, 0x55, 0xfd, 0xbc, 0x33, 0x33, 0x54, 0xf5, 0x72, 0x9a, - 0xac, 0x6c, 0xfe, 0x18, 0x53, 0x0d, 0xca, 0x4b, 0xd9, 0x55, 0xf6, 0x89, 0x8c, 0xfa, 0xb1, 0xa0, 0x1e, 0x5d, 0x9e, - 0x33, 0x94, 0xb7, 0x60, 0xcf, 0x52, 0x6f, 0x06, 0x08, 0x91, 0xb6, 0xab, 0x61, 0xc2, 0x31, 0xcc, 0xe9, 0xc8, 0x8a, - 0x55, 0x99, 0xc0, 0x47, 0x11, 0x5f, 0x34, 0xa7, 0x05, 0xce, 0xac, 0x2e, 0x3b, 0xbc, 0x15, 0xa2, 0xa2, 0xb8, 0xe3, - 0x7e, 0x42, 0x6b, 0x3e, 0x0e, 0x33, 0x31, 0x5e, 0xb3, 0x78, 0xde, 0xfd, 0x05, 0x04, 0x4d, 0x9d, 0xd0, 0x60, 0xe1, - 0xdd, 0x0f, 0x05, 0x44, 0xc9, 0x6b, 0x2b, 0x72, 0x92, 0xe1, 0xb7, 0x02, 0xc9, 0x74, 0x84, 0xd0, 0xc2, 0x25, 0x70, - 0xb3, 0xfd, 0x74, 0xdc, 0x05, 0xc7, 0x48, 0x91, 0x58, 0x38, 0x9e, 0x26, 0x6c, 0x3e, 0xb1, 0x26, 0x96, 0xe3, 0xa4, - 0x43, 0xe9, 0x2a, 0x34, 0xd5, 0x2a, 0x06, 0xad, 0xab, 0xfa, 0xc9, 0xde, 0x29, 0x88, 0xdb, 0x96, 0x20, 0xa2, 0x26, - 0xc7, 0x37, 0x1d, 0xb4, 0x3d, 0xb1, 0xc8, 0x1a, 0x65, 0x14, 0xbe, 0xf3, 0x08, 0x65, 0x8c, 0xc0, 0x7d, 0x95, 0x1a, - 0x63, 0x43, 0x59, 0x66, 0x7f, 0x30, 0x7d, 0x33, 0xc1, 0x44, 0x2f, 0xa1, 0xcc, 0x68, 0x95, 0x9c, 0x20, 0xfa, 0x34, - 0x97, 0x72, 0x3c, 0x22, 0xfa, 0x86, 0x85, 0xbf, 0xc4, 0xe2, 0x2a, 0xe6, 0xdd, 0xe5, 0xed, 0x74, 0x6d, 0x91, 0xcf, - 0xd4, 0x16, 0x63, 0x97, 0xcc, 0xa1, 0xf6, 0xb0, 0x21, 0x3b, 0xf1, 0x86, 0x9d, 0x16, 0xa5, 0x7c, 0x3b, 0x4a, 0x11, - 0xf6, 0x5d, 0xd1, 0xbf, 0x5d, 0x6f, 0x0a, 0x73, 0xed, 0x8a, 0xc9, 0xdf, 0xea, 0xeb, 0x19, 0x5a, 0x4f, 0x7c, 0x35, - 0x74, 0x73, 0x58, 0xf3, 0xc7, 0x02, 0xdf, 0x22, 0x2c, 0xb7, 0xb7, 0xd1, 0xc4, 0xb6, 0xce, 0x4b, 0x4f, 0x60, 0xb0, - 0x10, 0x7e, 0x37, 0x4b, 0xf1, 0x80, 0xd5, 0x83, 0xe8, 0x83, 0x02, 0x13, 0x53, 0xb9, 0x7a, 0xb5, 0x62, 0x8f, 0xd0, - 0x1e, 0xc6, 0x3a, 0x91, 0x5a, 0xf9, 0x36, 0xb8, 0x5a, 0xe1, 0x95, 0xbe, 0xde, 0x14, 0xb1, 0x5e, 0x79, 0x58, 0xdb, - 0xea, 0x97, 0xdc, 0xc2, 0xe5, 0xdf, 0xb6, 0x2a, 0x02, 0x7c, 0xc2, 0x55, 0x88, 0x23, 0xd0, 0x77, 0x69, 0x15, 0x05, - 0xf5, 0x97, 0x1c, 0x72, 0xea, 0xfc, 0x88, 0x70, 0x3e, 0x5f, 0x57, 0xf5, 0x1c, 0x47, 0x78, 0xab, 0xfc, 0x0f, 0x96, - 0x26, 0x6f, 0xe2, 0x7a, 0xb4, 0xe7, 0x25, 0x1d, 0x3e, 0xc1, 0xa5, 0x3b, 0x0a, 0x23, 0xbc, 0x94, 0x31, 0x8d, 0x17, - 0xe7, 0x1a, 0x30, 0x7b, 0x83, 0xe4, 0xf5, 0x38, 0x10, 0x95, 0x1c, 0x87, 0x2d, 0x16, 0xb5, 0x9e, 0x14, 0x1a, 0x91, - 0x37, 0xac, 0xca, 0x50, 0x44, 0x4b, 0x62, 0x07, 0x88, 0xfc, 0x58, 0x14, 0x86, 0x0e, 0xd5, 0x22, 0xb4, 0x6b, 0x7c, - 0xbf, 0xa9, 0x8f, 0xd0, 0x12, 0xab, 0x89, 0xf0, 0x61, 0x41, 0xde, 0x03, 0x0c, 0x73, 0x98, 0x24, 0xad, 0xa3, 0x74, - 0x90, 0xe3, 0x2b, 0x41, 0x32, 0x39, 0x30, 0x93, 0xde, 0x41, 0x6c, 0xe7, 0x7c, 0x31, 0x79, 0xbf, 0x11, 0x3f, 0x85, - 0x34, 0x74, 0x95, 0xbd, 0xc6, 0x22, 0xfb, 0x60, 0x82, 0xb5, 0x2f, 0x0f, 0x97, 0x99, 0xd7, 0xe0, 0x27, 0xfc, 0xff, - 0x34, 0x4b, 0x0a, 0xba, 0x0b, 0xb8, 0x98, 0xbd, 0x0f, 0xc3, 0x04, 0x3e, 0x19, 0x4d, 0x54, 0x96, 0xe8, 0x85, 0x05, - 0x4a, 0xd9, 0xef, 0xb7, 0xd0, 0xe0, 0x10, 0xcc, 0x4b, 0xde, 0xf9, 0xaa, 0x5b, 0x29, 0xaf, 0xef, 0xe4, 0xc8, 0xe4, - 0xf3, 0x29, 0xda, 0x1a, 0xb6, 0x56, 0xc0, 0x4b, 0x08, 0x03, 0x41, 0x34, 0xa4, 0xb8, 0xa4, 0xc3, 0x15, 0xc8, 0x1a, - 0xb9, 0x63, 0xd1, 0x4a, 0x19, 0x4e, 0x1b, 0x37, 0x13, 0xb5, 0xfb, 0xb4, 0x10, 0xc3, 0x79, 0x49, 0x87, 0xb1, 0xa4, - 0x0f, 0x4c, 0xb8, 0xc1, 0xb2, 0xad, 0x0a, 0xec, 0x80, 0xe6, 0x79, 0xd1, 0x68, 0x95, 0x9a, 0x0c, 0xa9, 0xa4, 0x93, - 0xf0, 0x11, 0xaf, 0x1d, 0x29, 0x19, 0xeb, 0x44, 0x4e, 0x13, 0x86, 0xb0, 0xfd, 0xd0, 0x48, 0xd4, 0x41, 0x61, 0x4d, - 0x21, 0x38, 0x2f, 0x34, 0xe0, 0xa6, 0x8d, 0xee, 0x07, 0xa8, 0xba, 0xd0, 0x48, 0xb3, 0xd2, 0x16, 0xb9, 0x6e, 0x2c, - 0x0e, 0xca, 0x8f, 0x78, 0x6d, 0x5e, 0x67, 0x55, 0x61, 0x23, 0x91, 0x7b, 0x28, 0x86, 0xb0, 0x19, 0xd3, 0x1f, 0xae, - 0xdc, 0xe3, 0x12, 0xeb, 0xb8, 0xc7, 0x80, 0x2d, 0xaf, 0x90, 0xc6, 0xec, 0x55, 0x72, 0x60, 0x21, 0x03, 0x34, 0xaf, - 0xc4, 0xf0, 0xbe, 0xf5, 0xcb, 0xa1, 0xf1, 0xad, 0x5a, 0x99, 0x4b, 0xcf, 0x84, 0x89, 0x11, 0x1e, 0x08, 0x83, 0x5f, - 0xab, 0x3f, 0x9d, 0xf6, 0xb2, 0x4e, 0x71, 0xbf, 0xca, 0x21, 0x37, 0x27, 0x2c, 0x1a, 0xe8, 0xa0, 0x4c, 0x4e, 0x17, - 0x39, 0x07, 0xf5, 0xcd, 0xdd, 0x82, 0xbc, 0x40, 0x1c, 0x6b, 0x3c, 0x8e, 0x5c, 0xf7, 0x62, 0xde, 0x66, 0x22, 0xd8, - 0x9b, 0x0a, 0xfe, 0x39, 0xc4, 0x29, 0x21, 0x80, 0x35, 0x48, 0x6c, 0xd6, 0xe5, 0x1e, 0xdb, 0xcb, 0xd8, 0xae, 0x13, - 0x99, 0xa2, 0xb2, 0x82, 0xe4, 0xe7, 0x11, 0x76, 0x81, 0x1a, 0x0f, 0x36, 0x49, 0x0f, 0xb2, 0x32, 0x0d, 0x23, 0x96, - 0x6f, 0x57, 0xc5, 0x29, 0xcc, 0x6b, 0xb5, 0x0e, 0x85, 0x20, 0x99, 0xd9, 0x6d, 0x23, 0x9f, 0x33, 0x4f, 0xc2, 0xa0, - 0x63, 0x47, 0x69, 0x83, 0x0a, 0xe5, 0xd8, 0x56, 0xf3, 0x68, 0x82, 0x5e, 0xf6, 0xd6, 0x39, 0x24, 0x73, 0x5b, 0x4e, - 0x0b, 0x56, 0x04, 0x24, 0x1e, 0xd7, 0xe2, 0xa3, 0xa9, 0xbb, 0xa1, 0xce, 0x11, 0x16, 0x39, 0x30, 0xcb, 0x96, 0x89, - 0xa8, 0xc5, 0xa5, 0x67, 0x6e, 0x1a, 0x6c, 0x2a, 0xcb, 0x4c, 0x7a, 0x11, 0xb2, 0x68, 0xa5, 0x89, 0x2d, 0xcc, 0xc5, - 0x38, 0x33, 0x07, 0x96, 0xf6, 0x11, 0x1a, 0x06, 0xcb, 0x48, 0x48, 0x63, 0x4b, 0x96, 0xb7, 0xc8, 0xa9, 0xc0, 0xd1, - 0xfe, 0x67, 0x96, 0x3b, 0x62, 0x2b, 0xf7, 0xd0, 0x82, 0xef, 0xf7, 0x57, 0x51, 0xc3, 0xd0, 0xf6, 0x57, 0xfe, 0xbd, - 0xe4, 0x22, 0xa8, 0x57, 0x90, 0x0f, 0x49, 0x26, 0x15, 0x38, 0x28, 0x0c, 0xd4, 0xc9, 0xb8, 0x11, 0xad, 0x4d, 0x78, - 0x24, 0x87, 0x48, 0x13, 0x79, 0x6d, 0x29, 0x2a, 0x87, 0x22, 0x6b, 0xaf, 0xd4, 0x2a, 0x21, 0x00, 0xbd, 0xf5, 0x4e, - 0xb7, 0x1a, 0x0d, 0x6f, 0xd4, 0x24, 0xca, 0x41, 0x7c, 0x38, 0x0d, 0x4f, 0xda, 0xe8, 0x8a, 0xf3, 0x72, 0xe2, 0x33, - 0x75, 0x77, 0x40, 0xa0, 0x81, 0xb3, 0x80, 0xc3, 0x0b, 0x83, 0x59, 0x5d, 0x55, 0x56, 0xdb, 0x05, 0x09, 0xb2, 0xa9, - 0x7f, 0x41, 0x7f, 0x58, 0x9b, 0x23, 0xb5, 0x49, 0x30, 0x1a, 0x47, 0x93, 0xf5, 0xbf, 0x8b, 0x09, 0xbc, 0xa2, 0x2e, - 0xd0, 0x1e, 0x9f, 0xb6, 0x73, 0x2a, 0x4a, 0xb6, 0xfd, 0xe7, 0x43, 0x39, 0x81, 0xfd, 0x5e, 0x76, 0x62, 0x76, 0x78, - 0x2a, 0x47, 0x3d, 0xbd, 0x4a, 0xc5, 0xd8, 0x43, 0x0c, 0xf5, 0x76, 0x04, 0x2c, 0xeb, 0x1b, 0x6b, 0x96, 0xcd, 0x76, - 0x24, 0x5b, 0x73, 0xf4, 0x72, 0x96, 0x48, 0xee, 0x1e, 0x34, 0x58, 0xce, 0xc4, 0x96, 0xcf, 0xe8, 0x79, 0xbb, 0xb5, - 0xc7, 0xe4, 0xed, 0x2c, 0x3b, 0x82, 0x2f, 0x5a, 0xdf, 0xd8, 0xd5, 0x5e, 0xf4, 0xc8, 0x75, 0xec, 0xc3, 0x04, 0x92, - 0x60, 0xb1, 0x00, 0x17, 0x71, 0xcf, 0x27, 0x67, 0xd6, 0x62, 0x9f, 0x8a, 0xd8, 0x45, 0x5a, 0xa8, 0x9f, 0xd2, 0x32, - 0x22, 0xe9, 0xf0, 0xf2, 0x63, 0xcf, 0x48, 0x1e, 0xd7, 0x51, 0xaa, 0xd4, 0x6f, 0x3d, 0x8e, 0x32, 0xb2, 0xc8, 0x51, - 0x27, 0x5c, 0xc2, 0x63, 0xdb, 0xc9, 0x4e, 0x77, 0xac, 0x5a, 0xc8, 0x3e, 0x80, 0x00, 0x49, 0xc8, 0x96, 0xb4, 0xdd, - 0x45, 0x6a, 0xe4, 0xef, 0x71, 0x31, 0x2c, 0x46, 0x84, 0xf0, 0xb0, 0x6e, 0xf0, 0x4f, 0xba, 0xcc, 0xd4, 0xdb, 0xa9, - 0x7c, 0xf0, 0x82, 0x38, 0x1a, 0x0f, 0x8f, 0xd4, 0x28, 0xb4, 0xfa, 0x64, 0x1c, 0x35, 0x29, 0x9c, 0xa1, 0x95, 0xd3, - 0xf6, 0x6f, 0xa0, 0xb7, 0x53, 0xd3, 0x45, 0xa0, 0x45, 0xe1, 0x8b, 0x47, 0x28, 0x01, 0xb1, 0x44, 0x58, 0x31, 0xa4, - 0x92, 0x30, 0x95, 0x09, 0xb9, 0x64, 0xcc, 0x65, 0xc6, 0x9d, 0x5a, 0x05, 0x77, 0x59, 0x15, 0xf7, 0x58, 0x3d, 0xee, - 0xb3, 0x06, 0x3c, 0xa8, 0x35, 0xe2, 0x21, 0xab, 0xe1, 0x1c, 0xa2, 0x7a, 0x51, 0xbd, 0xac, 0x5e, 0x55, 0xd7, 0xca, - 0x75, 0xaf, 0x43, 0x26, 0x30, 0xfe, 0x25, 0x49, 0xb4, 0xfa, 0x10, 0x2d, 0x4d, 0x79, 0xbe, 0x73, 0xf7, 0xde, 0xfd, - 0x07, 0x0f, 0xc7, 0x05, 0x2a, 0x71, 0x56, 0xf7, 0x6d, 0x59, 0xd2, 0x00, 0xb6, 0x50, 0x3a, 0x7d, 0x4b, 0x49, 0x83, - 0x89, 0x42, 0xdb, 0xf9, 0x93, 0xa5, 0xbf, 0x3c, 0xfe, 0xa0, 0xea, 0xb9, 0x79, 0x56, 0xac, 0xbc, 0xf5, 0x88, 0xd3, - 0x02, 0x2d, 0x9e, 0x5e, 0xb0, 0x90, 0x4e, 0x07, 0x1d, 0xf3, 0x6a, 0x1e, 0xf3, 0x90, 0x51, 0x8f, 0xad, 0x85, 0xa7, - 0x5a, 0xc9, 0xf2, 0x07, 0x1d, 0xc0, 0xb1, 0x38, 0x9e, 0xc9, 0xbe, 0x79, 0x24, 0x66, 0xa2, 0x69, 0xda, 0x6a, 0x42, - 0xd5, 0x3f, 0xdc, 0xba, 0xa1, 0xea, 0xc0, 0xc6, 0xec, 0xf8, 0xed, 0x27, 0x0a, 0xb0, 0x4c, 0x13, 0x98, 0x70, 0xe3, - 0x38, 0x6b, 0x16, 0x2e, 0x66, 0xcb, 0xe6, 0xf9, 0x88, 0x01, 0xea, 0x99, 0x0a, 0xa0, 0x92, 0x1e, 0xf8, 0x67, 0xc7, - 0xfe, 0x74, 0xee, 0x2e, 0x6c, 0x18, 0xfd, 0xce, 0xec, 0x7e, 0xf5, 0x1b, 0x71, 0x02, 0xa9, 0xc7, 0xa2, 0xb2, 0x52, - 0xcd, 0xc4, 0x8b, 0x6a, 0x6f, 0xc4, 0xd1, 0xcd, 0x4c, 0x73, 0x63, 0x6f, 0x6f, 0x82, 0xd1, 0xee, 0xc8, 0x00, 0x88, - 0x40, 0xfd, 0xe7, 0xf4, 0x94, 0xd5, 0xfa, 0x76, 0xfa, 0x4d, 0xca, 0xa6, 0x48, 0x09, 0x3e, 0x2d, 0xfe, 0xe0, 0x9f, - 0xba, 0x6f, 0x5a, 0x6c, 0x85, 0x36, 0xf2, 0xb9, 0xca, 0x89, 0x23, 0x91, 0x27, 0xbe, 0x63, 0xeb, 0xac, 0xf2, 0xb0, - 0xf1, 0x53, 0x58, 0xde, 0x66, 0x5a, 0x5c, 0x8a, 0x63, 0x6d, 0x9c, 0xc3, 0x22, 0x37, 0xff, 0x4c, 0xb5, 0xa3, 0xf1, - 0x8b, 0x7d, 0xfb, 0x2b, 0x53, 0xe5, 0x61, 0x39, 0xbe, 0xf2, 0xef, 0xf2, 0x73, 0xf4, 0x38, 0x2f, 0x72, 0xb5, 0xfe, - 0x3e, 0x35, 0xcb, 0x96, 0x0f, 0x4f, 0x72, 0x5f, 0x71, 0x99, 0xa7, 0xa6, 0xf9, 0xa5, 0xaf, 0x86, 0x3c, 0x77, 0xad, - 0xe9, 0xdd, 0xcd, 0xcf, 0x58, 0xfe, 0x49, 0x35, 0xab, 0xf6, 0xa0, 0x7f, 0x95, 0x3d, 0x3b, 0x9e, 0x8a, 0x11, 0x99, - 0x1a, 0x2b, 0x73, 0x40, 0x75, 0x7f, 0x7e, 0x16, 0x09, 0x6e, 0xfc, 0xa7, 0xc7, 0x25, 0x3d, 0x83, 0xa4, 0xb7, 0x75, - 0xfe, 0x42, 0xe8, 0xa6, 0x9e, 0xf4, 0xe0, 0x10, 0xd4, 0x2b, 0xfe, 0x37, 0x0f, 0xe1, 0x0b, 0x4c, 0x5d, 0x20, 0x10, - 0x6f, 0x60, 0x2a, 0xf4, 0xf3, 0xcb, 0xe8, 0x34, 0xd1, 0xdd, 0xa4, 0x65, 0xaa, 0xa2, 0xa6, 0x94, 0x13, 0x3b, 0x42, - 0xc1, 0xb7, 0x93, 0x91, 0x5e, 0x32, 0xda, 0x3a, 0x7f, 0x2d, 0x74, 0x4b, 0x91, 0xdd, 0x4d, 0xbc, 0x55, 0xe7, 0x3d, - 0x2b, 0xe7, 0xcf, 0xf5, 0x74, 0x7b, 0x82, 0x5d, 0x7d, 0x06, 0x54, 0xcb, 0x02, 0x9c, 0x97, 0x6f, 0x60, 0xda, 0x2f, - 0x02, 0x94, 0xd1, 0x62, 0x35, 0xf4, 0x1b, 0xf5, 0x96, 0xc9, 0xfa, 0xdb, 0x8f, 0x6b, 0x0d, 0xd8, 0x39, 0xfc, 0x73, - 0x03, 0x86, 0xe7, 0x48, 0xf4, 0x1c, 0x41, 0x97, 0xae, 0x31, 0x97, 0x35, 0xda, 0x90, 0x3d, 0xd5, 0xd8, 0xbc, 0x05, - 0x97, 0x82, 0xf0, 0xb6, 0x61, 0x36, 0xcd, 0x7c, 0xac, 0x62, 0xae, 0xce, 0x65, 0x9e, 0x3e, 0x23, 0x21, 0xdf, 0xb7, - 0xac, 0x8d, 0x05, 0x53, 0x10, 0xcc, 0x6c, 0x98, 0x32, 0x96, 0xaf, 0x8b, 0xa6, 0x14, 0x7e, 0x1f, 0xc5, 0xb0, 0xee, - 0x19, 0x8b, 0xa4, 0x60, 0x5d, 0xf9, 0x2f, 0x39, 0xe6, 0x31, 0x8f, 0xa5, 0x83, 0x9e, 0x1b, 0xe6, 0xd1, 0x0c, 0x7c, - 0xcc, 0xa8, 0x4a, 0x9c, 0xc1, 0x8e, 0x17, 0xcf, 0x88, 0x82, 0x16, 0xcd, 0xf5, 0xc7, 0xb6, 0xd6, 0x87, 0x4c, 0xdd, - 0xad, 0x98, 0xcd, 0xcf, 0xf4, 0x6d, 0xb6, 0xe9, 0x80, 0xc9, 0x12, 0x41, 0x98, 0x43, 0xf3, 0x7b, 0xf5, 0xa1, 0xb2, - 0x93, 0x5b, 0xa3, 0xb5, 0x76, 0x46, 0xe3, 0x7c, 0xa8, 0x48, 0x75, 0x0e, 0x7d, 0x91, 0xa8, 0xcb, 0x88, 0x71, 0x93, - 0x2d, 0xbd, 0xdb, 0x2f, 0x4b, 0xe3, 0xbf, 0x96, 0xad, 0x32, 0xe2, 0xa9, 0xb9, 0x02, 0xba, 0xcb, 0x35, 0x5c, 0x56, - 0xc4, 0x64, 0x8a, 0x79, 0xb8, 0x6d, 0xe5, 0x6c, 0x16, 0x72, 0x69, 0x3e, 0x81, 0x33, 0xa0, 0x0a, 0xd7, 0x98, 0x05, - 0xd1, 0x5c, 0xb0, 0x00, 0xd6, 0x02, 0xa7, 0x97, 0x27, 0x73, 0x79, 0xd6, 0x31, 0x4a, 0x8c, 0x65, 0xed, 0x1f, 0x2f, - 0x2f, 0x0d, 0xfa, 0x49, 0x16, 0xf2, 0xcc, 0x77, 0xdc, 0xa9, 0xda, 0xa7, 0x78, 0x3a, 0xfa, 0xdd, 0x4f, 0xf9, 0x7b, - 0x0e, 0xdd, 0x76, 0x49, 0xb6, 0x6f, 0x9f, 0x3a, 0x14, 0xe0, 0x48, 0x17, 0xf2, 0x6b, 0x5b, 0xec, 0xb9, 0x5b, 0xf6, - 0x21, 0xa6, 0x85, 0xb0, 0x31, 0xf3, 0x68, 0x11, 0x70, 0x59, 0xde, 0xbb, 0x51, 0xeb, 0x79, 0x4b, 0x02, 0x2e, 0xf1, - 0x9e, 0x9f, 0xea, 0x68, 0x29, 0x6d, 0x47, 0xee, 0xb3, 0x83, 0x28, 0x67, 0x57, 0x5d, 0x3f, 0x31, 0x37, 0xfe, 0xdb, - 0x9d, 0x3d, 0x53, 0x6b, 0xb5, 0x20, 0x29, 0x97, 0x7e, 0x9e, 0x1f, 0x9a, 0x99, 0x4a, 0x26, 0xf0, 0xf0, 0x02, 0x12, - 0xbf, 0xf0, 0xd3, 0xbf, 0x1f, 0xa8, 0xb2, 0xae, 0x1c, 0x22, 0x3d, 0x03, 0x92, 0xe7, 0xe3, 0xc7, 0xd7, 0x85, 0xc7, - 0x3b, 0xa2, 0x4b, 0xbd, 0x9e, 0xe7, 0x16, 0x12, 0xe7, 0x49, 0x77, 0x4e, 0x5c, 0xad, 0x5c, 0xa0, 0x67, 0xa6, 0x21, - 0xe1, 0x5c, 0xf5, 0x8f, 0x0f, 0x81, 0x7f, 0x05, 0x0e, 0x24, 0xa9, 0xab, 0x0b, 0x15, 0x02, 0x9d, 0xd0, 0x7e, 0xde, - 0x12, 0x48, 0x78, 0xf7, 0x22, 0xd8, 0x62, 0x90, 0x7b, 0x2d, 0xa8, 0xa8, 0x2a, 0x54, 0x30, 0x6f, 0x44, 0x25, 0x78, - 0xe4, 0x1f, 0x30, 0x68, 0x9e, 0x98, 0x99, 0xe1, 0x3c, 0x82, 0x88, 0x24, 0x39, 0xb1, 0x45, 0x7c, 0x00, 0xa0, 0x8e, - 0x77, 0x82, 0xf1, 0x4a, 0xe2, 0x30, 0x42, 0x09, 0x2e, 0xbf, 0x17, 0xad, 0x47, 0x71, 0x67, 0x87, 0x83, 0x7f, 0x41, - 0x9a, 0xc7, 0xed, 0xde, 0x1f, 0x43, 0x7f, 0xf6, 0x01, 0xcd, 0xd0, 0xee, 0x04, 0xf4, 0x71, 0xb7, 0x26, 0xed, 0x7e, - 0x33, 0x3d, 0x13, 0x6d, 0xb7, 0x49, 0x62, 0x73, 0x20, 0x63, 0xde, 0x9e, 0x88, 0x0d, 0x6d, 0xfc, 0x01, 0x7e, 0x6b, - 0x6c, 0x56, 0x5d, 0x26, 0x9e, 0x59, 0x3d, 0x3c, 0x9e, 0x89, 0x27, 0x56, 0xab, 0x8d, 0xd8, 0xb1, 0xfa, 0x3f, 0xd4, - 0xf7, 0xf8, 0x96, 0x55, 0x78, 0x54, 0xfd, 0x17, 0xda, 0x81, 0x87, 0xb0, 0xb1, 0x36, 0x8f, 0x9e, 0x35, 0x6c, 0xf0, - 0x60, 0x75, 0x09, 0x3a, 0xf8, 0xf1, 0x57, 0x06, 0x8f, 0x88, 0xdd, 0x0f, 0x06, 0x2b, 0xab, 0x29, 0xb0, 0x3c, 0xde, - 0x1f, 0xdd, 0xff, 0x3f, 0x6f, 0x1a, 0x1e, 0xba, 0xd6, 0xd3, 0x1a, 0x2c, 0x2a, 0xa1, 0xc2, 0xfc, 0x7f, 0x56, 0x0f, - 0x62, 0xc6, 0x6a, 0x9d, 0x89, 0x29, 0xab, 0x3a, 0x13, 0x13, 0x56, 0xfb, 0xbc, 0x5e, 0x6f, 0x88, 0x1e, 0x2b, 0x5f, - 0x88, 0x31, 0xab, 0xe5, 0x9d, 0xe8, 0xb3, 0xaa, 0xb6, 0x7f, 0x03, 0x31, 0x60, 0xe5, 0x13, 0x31, 0x8c, 0x0c, 0x56, - 0x30, 0xfa, 0x1b, 0x2f, 0x77, 0x32, 0xb4, 0x5b, 0x3d, 0xb7, 0xc6, 0xff, 0x45, 0x27, 0xea, 0xd3, 0xe5, 0xc4, 0x95, - 0x67, 0x12, 0x70, 0xd1, 0xfe, 0x5b, 0x78, 0xbd, 0x09, 0x8f, 0x79, 0x60, 0xa4, 0x62, 0x69, 0x06, 0xc0, 0x38, 0x3f, - 0xfc, 0x4f, 0x77, 0x84, 0xb9, 0x91, 0x04, 0x46, 0x56, 0x29, 0x6b, 0xa3, 0xff, 0x97, 0xae, 0x20, 0x2a, 0x83, 0x6c, - 0xfb, 0xf0, 0xb6, 0x3a, 0x35, 0x7a, 0x0d, 0x6d, 0x18, 0xbd, 0xbc, 0xce, 0x59, 0x17, 0xd0, 0x51, 0x4b, 0x0a, 0xa1, - 0xeb, 0xba, 0x7b, 0x62, 0x7a, 0x5b, 0xbc, 0x23, 0x98, 0x11, 0xd4, 0x44, 0x04, 0x49, 0xd3, 0xfe, 0x4f, 0xce, 0xb6, - 0xe5, 0x58, 0x7b, 0xca, 0x62, 0xf9, 0xf0, 0x7d, 0x75, 0x75, 0x2a, 0x4c, 0x99, 0x09, 0x2e, 0xf3, 0xb0, 0xad, 0xde, - 0x53, 0x3d, 0x8c, 0xa5, 0xdb, 0xd3, 0xf0, 0x12, 0x31, 0x7c, 0x4b, 0xae, 0x5a, 0x10, 0xef, 0x09, 0xe6, 0xd8, 0x2d, - 0x81, 0x58, 0x29, 0x5c, 0x8d, 0xd7, 0x2d, 0x24, 0x8e, 0x19, 0xa9, 0xf1, 0x57, 0xeb, 0xfd, 0xdb, 0xcd, 0x14, 0xa7, - 0xc0, 0xa1, 0xe8, 0x36, 0xe0, 0x1d, 0x11, 0xe5, 0x94, 0x43, 0x96, 0x3c, 0xe2, 0x60, 0x87, 0x13, 0x07, 0x64, 0x99, - 0x26, 0xda, 0xac, 0x95, 0xd7, 0x04, 0xef, 0xea, 0xd1, 0x29, 0x93, 0x63, 0x6b, 0x03, 0xc7, 0x20, 0xf9, 0x17, 0xbc, - 0xea, 0x15, 0xa0, 0x0f, 0xd6, 0x54, 0x5d, 0xe8, 0xdb, 0x97, 0xf3, 0x3b, 0xd5, 0xa6, 0x5d, 0xe1, 0x95, 0xfd, 0x86, - 0xad, 0xce, 0xea, 0x1b, 0x41, 0x6a, 0xdd, 0x6d, 0xa4, 0x21, 0x40, 0xf7, 0x43, 0xbe, 0xbb, 0xa7, 0x23, 0x9c, 0x6c, - 0xed, 0x1c, 0x61, 0xa1, 0x99, 0x11, 0xfa, 0xdb, 0x08, 0xb8, 0x43, 0x01, 0x55, 0xdc, 0xda, 0x33, 0xa3, 0x48, 0x44, - 0xb4, 0x24, 0x15, 0xf1, 0x1e, 0x5c, 0xcf, 0xc6, 0xb0, 0x6c, 0xa4, 0x9d, 0xbd, 0xbe, 0xc9, 0xb6, 0x28, 0x82, 0xb0, - 0x75, 0xbd, 0x23, 0x0c, 0xe4, 0x2f, 0x03, 0xff, 0xd7, 0xea, 0xbd, 0xb4, 0x5a, 0xba, 0xa9, 0x7b, 0x7c, 0x0b, 0x7e, - 0xa8, 0x4b, 0xf9, 0x99, 0xa4, 0x98, 0x9d, 0x26, 0x3e, 0xf5, 0x49, 0x79, 0x8a, 0x97, 0x5d, 0x06, 0x40, 0xe4, 0x7a, - 0x4e, 0xc1, 0x87, 0xbc, 0xdb, 0x4c, 0xa9, 0x8b, 0xcc, 0x63, 0x82, 0x01, 0x66, 0x97, 0xd2, 0xc5, 0x3a, 0x35, 0x5c, - 0x6c, 0xa4, 0x1c, 0x6e, 0x3a, 0x9c, 0x36, 0xf4, 0xaa, 0x18, 0x17, 0x91, 0x1d, 0xdf, 0x35, 0x8d, 0x6f, 0x72, 0x23, - 0xf4, 0xde, 0xb9, 0xe1, 0xa9, 0xcf, 0x18, 0xf3, 0xb7, 0x82, 0x50, 0x19, 0x63, 0x3b, 0x9c, 0xad, 0x28, 0xd5, 0x4a, - 0x7e, 0x39, 0x6c, 0x73, 0xd8, 0xbf, 0xc9, 0xad, 0x6d, 0x0c, 0x18, 0xf1, 0x05, 0xe3, 0xbb, 0x10, 0xbf, 0x2f, 0x58, - 0x23, 0x7a, 0xc1, 0x25, 0xcb, 0x53, 0xb0, 0xf0, 0x50, 0x02, 0x53, 0xb6, 0x87, 0x26, 0xe0, 0xde, 0xe7, 0x26, 0x7e, - 0x3b, 0xe4, 0xe6, 0xd1, 0x87, 0x78, 0x2d, 0x94, 0x2a, 0x11, 0xf6, 0xad, 0x78, 0xd6, 0xa8, 0xe0, 0x99, 0x9b, 0x95, - 0xcc, 0x00, 0x28, 0x04, 0xba, 0xd5, 0x1c, 0xbe, 0xeb, 0x8f, 0x7b, 0x75, 0x80, 0xce, 0x6a, 0x5f, 0xce, 0x84, 0x8c, - 0x91, 0xe7, 0xf4, 0x20, 0xe8, 0xe9, 0xa3, 0x77, 0xbc, 0xbd, 0xac, 0x2a, 0x43, 0x8e, 0xc5, 0xc8, 0xa1, 0x99, 0x3c, - 0x2a, 0x4b, 0x1a, 0xb2, 0xe0, 0x72, 0x2a, 0xd7, 0xa4, 0x5a, 0xf5, 0x25, 0xe9, 0x7d, 0xcd, 0xd9, 0x0e, 0x68, 0xec, - 0x79, 0xbf, 0x85, 0xe0, 0x18, 0x84, 0x90, 0x30, 0x27, 0x36, 0xf7, 0xfe, 0xce, 0x00, 0xe7, 0xdb, 0x97, 0x50, 0x6f, - 0xbe, 0xf9, 0x81, 0x5b, 0xf4, 0x13, 0x8e, 0xa1, 0xb4, 0x38, 0xd5, 0x84, 0xab, 0xa3, 0x37, 0xb2, 0x36, 0x52, 0xd2, - 0x79, 0x1d, 0xbd, 0x1b, 0x1b, 0xc5, 0x78, 0xc7, 0x40, 0x54, 0x44, 0x79, 0xb8, 0x1f, 0x4b, 0xa2, 0x72, 0x73, 0x82, - 0x6b, 0x8a, 0x48, 0x44, 0xe1, 0x20, 0xdd, 0xc5, 0xd5, 0xf8, 0xc2, 0xa1, 0xc6, 0x34, 0x33, 0x07, 0x06, 0x48, 0xaa, - 0x43, 0x5d, 0x9b, 0xdd, 0x37, 0x02, 0xe1, 0x25, 0x17, 0xb0, 0x5c, 0x81, 0xcb, 0x43, 0xfe, 0x22, 0xf5, 0x5d, 0xcc, - 0x3b, 0x6d, 0x42, 0x24, 0xe7, 0xce, 0x80, 0x18, 0x38, 0xa4, 0x08, 0x25, 0xd3, 0x8d, 0x4b, 0x4e, 0xe2, 0xd6, 0x6c, - 0xce, 0x5c, 0x28, 0x19, 0x33, 0xf7, 0x88, 0xfe, 0x83, 0xf7, 0x36, 0x21, 0x5e, 0x70, 0x90, 0x45, 0x25, 0x3a, 0x1b, - 0x46, 0x3a, 0x91, 0xf0, 0x6b, 0x2c, 0xde, 0x60, 0x47, 0x96, 0x06, 0xd1, 0x4d, 0x91, 0x31, 0x84, 0x4d, 0x3b, 0xac, - 0x0e, 0xcd, 0x46, 0x49, 0x42, 0x0e, 0x08, 0xb5, 0xf3, 0x24, 0x27, 0x1d, 0xe1, 0xdd, 0xbb, 0xdc, 0xa6, 0xea, 0xc5, - 0xaf, 0x32, 0xd1, 0xa8, 0x36, 0x11, 0x2b, 0xbf, 0x9e, 0xc8, 0xca, 0xc2, 0x97, 0x02, 0x9a, 0x02, 0x25, 0x49, 0xfe, - 0xf6, 0xd7, 0xb4, 0xcc, 0xd3, 0x6b, 0x1d, 0x64, 0x30, 0x98, 0x7c, 0x25, 0x72, 0x8d, 0x1a, 0xd9, 0xe0, 0x3b, 0xe9, - 0x5c, 0xc6, 0x2a, 0xf7, 0x65, 0x88, 0x78, 0x9a, 0x9b, 0xfe, 0xa5, 0x0f, 0x2a, 0xd4, 0xea, 0x43, 0x23, 0xbb, 0x93, - 0xb6, 0x3e, 0x49, 0xd1, 0x48, 0x56, 0xec, 0xe2, 0x8b, 0x4b, 0x34, 0x5a, 0x32, 0x15, 0x4f, 0xca, 0x22, 0x63, 0x93, - 0x6b, 0xaf, 0x8d, 0x4d, 0xd4, 0x1d, 0x8c, 0x25, 0xb2, 0x34, 0x7c, 0x3b, 0x3d, 0xda, 0x10, 0xb7, 0xf7, 0x50, 0x57, - 0x37, 0x65, 0x1f, 0xde, 0xcd, 0xa8, 0x42, 0x73, 0xb3, 0x4a, 0x9d, 0x71, 0x70, 0x86, 0x5f, 0xaf, 0x50, 0x68, 0x4e, - 0x9f, 0x1a, 0x92, 0xe3, 0xec, 0x6b, 0x69, 0x00, 0xed, 0xab, 0xc9, 0x28, 0x16, 0x61, 0x21, 0xc4, 0x25, 0x1c, 0x80, - 0x5c, 0x3e, 0x4c, 0x97, 0x58, 0x6b, 0x95, 0x2b, 0xe9, 0x95, 0x48, 0x16, 0x28, 0xf1, 0x51, 0x9d, 0x5a, 0xa9, 0xac, - 0xe6, 0x4c, 0x62, 0x06, 0x0a, 0x98, 0xbc, 0x35, 0xbd, 0x91, 0x9e, 0xe5, 0x96, 0xb9, 0x4c, 0x70, 0xe6, 0x42, 0xb4, - 0xe6, 0x87, 0x6f, 0x72, 0x43, 0x56, 0x54, 0xd3, 0x88, 0x14, 0x3f, 0x38, 0x33, 0x10, 0x13, 0x20, 0x96, 0x31, 0xd7, - 0x27, 0x98, 0x60, 0x83, 0xf5, 0x66, 0x4d, 0xd7, 0xb0, 0xa1, 0xfc, 0x74, 0xff, 0xe4, 0x17, 0x63, 0x9e, 0x23, 0x80, - 0x95, 0x99, 0x78, 0x5e, 0xf2, 0xe9, 0x54, 0x29, 0x74, 0x89, 0x28, 0xce, 0x68, 0xd1, 0xd8, 0x99, 0x86, 0x65, 0x6c, - 0x23, 0x43, 0x00, 0xb4, 0x37, 0xf9, 0xf5, 0x65, 0x16, 0x25, 0xb5, 0x32, 0x21, 0xf2, 0x11, 0xd3, 0x8c, 0x3c, 0x39, - 0xd5, 0x21, 0x6b, 0x0d, 0x1e, 0x46, 0x95, 0x48, 0xfe, 0x78, 0x2a, 0xb9, 0x90, 0x44, 0xef, 0x61, 0x3b, 0x54, 0x59, - 0xb2, 0x60, 0xc5, 0x2a, 0x7a, 0xdf, 0xde, 0xee, 0xfa, 0x6b, 0x64, 0xc2, 0x5e, 0x00, 0xa2, 0xd7, 0x1e, 0x1c, 0xe3, - 0x95, 0xc9, 0x27, 0x57, 0x19, 0x2c, 0x28, 0x25, 0x42, 0x4d, 0x38, 0xda, 0x98, 0xcb, 0x32, 0x53, 0x70, 0xd5, 0x23, - 0xd9, 0xb2, 0x94, 0x39, 0xc9, 0xb0, 0xde, 0x06, 0x92, 0xf1, 0x11, 0xb5, 0xfc, 0xb5, 0x60, 0x6f, 0x1d, 0xd4, 0x29, - 0x04, 0x71, 0x92, 0xff, 0xe6, 0xf1, 0xba, 0xc5, 0xf7, 0xcb, 0x4f, 0x9b, 0x2c, 0x46, 0x92, 0xbd, 0x48, 0x53, 0xe9, - 0xbf, 0xd0, 0x2c, 0x0d, 0x0e, 0x4a, 0x4b, 0x6f, 0xcf, 0x05, 0x57, 0x7a, 0x21, 0x8a, 0x59, 0x00, 0x4f, 0x48, 0xa9, - 0x37, 0xba, 0x92, 0x68, 0x9d, 0x61, 0x75, 0x2c, 0xce, 0x6a, 0x11, 0x7a, 0x95, 0x4e, 0x88, 0xc5, 0x53, 0x23, 0xf2, - 0x9b, 0xac, 0x38, 0x47, 0xf7, 0xc6, 0xe3, 0x6b, 0x76, 0xbe, 0x2c, 0x43, 0x65, 0xea, 0x47, 0x88, 0xbe, 0x14, 0x1c, - 0x21, 0x36, 0x12, 0x75, 0x1b, 0x56, 0x8c, 0x10, 0x4c, 0x78, 0x75, 0x62, 0x96, 0x4b, 0xf4, 0xda, 0xfa, 0xe3, 0x7d, - 0xba, 0x67, 0xd5, 0x30, 0x7a, 0x65, 0x3e, 0xfe, 0x25, 0x91, 0xcd, 0x30, 0xfa, 0x13, 0xf8, 0x81, 0xc5, 0x9d, 0x9b, - 0xe9, 0x41, 0x38, 0x31, 0x4f, 0x4a, 0x2a, 0xb3, 0xf9, 0x83, 0xbd, 0xc3, 0x30, 0xba, 0xa0, 0xfb, 0xc1, 0x9b, 0x4e, - 0xad, 0x76, 0xbf, 0x21, 0xba, 0x8a, 0xa7, 0xdd, 0xfd, 0xaa, 0x3f, 0x98, 0x24, 0x0a, 0xd1, 0x8b, 0x06, 0x00, 0x3c, - 0xcd, 0x80, 0x67, 0x92, 0x62, 0x63, 0xf2, 0x66, 0x96, 0xae, 0x9c, 0x13, 0x5f, 0x50, 0xe7, 0xd9, 0x86, 0xac, 0xc9, - 0xbd, 0x24, 0xc8, 0x29, 0x55, 0x6e, 0x0d, 0xca, 0x18, 0x15, 0x55, 0x62, 0x78, 0x9a, 0x46, 0xb0, 0x01, 0x72, 0x4b, - 0x5b, 0x74, 0x3d, 0x23, 0x35, 0xa7, 0x73, 0x48, 0xd5, 0xca, 0x12, 0xdf, 0xa3, 0x3f, 0xca, 0xd0, 0x78, 0x48, 0xc4, - 0x56, 0x5d, 0xd3, 0xdc, 0xaf, 0xeb, 0x5d, 0x3a, 0x6e, 0xf8, 0x9d, 0x89, 0xc2, 0x6f, 0x5e, 0xe0, 0x3d, 0xb7, 0xd0, - 0xd1, 0x06, 0x37, 0x8e, 0xec, 0xe0, 0xcf, 0x60, 0x02, 0x63, 0x3f, 0x6f, 0x86, 0x83, 0xcb, 0x19, 0x9a, 0xaf, 0xa7, - 0xb9, 0xc7, 0xbd, 0x23, 0x6e, 0xd9, 0x5c, 0xe3, 0x7f, 0x73, 0x0b, 0x05, 0xe5, 0xfb, 0xcc, 0xb0, 0xa4, 0xd9, 0xde, - 0x8a, 0xa4, 0xf2, 0x35, 0x03, 0xd8, 0x85, 0x94, 0x9a, 0x0a, 0xb3, 0x69, 0x36, 0x99, 0x60, 0x00, 0x74, 0x91, 0xdf, - 0x5a, 0x2a, 0x88, 0x70, 0x89, 0xc6, 0x80, 0x1b, 0x40, 0x7d, 0x00, 0x86, 0x32, 0xe7, 0x10, 0x1e, 0x82, 0xaf, 0xb0, - 0x91, 0x18, 0xd9, 0x25, 0x18, 0xe3, 0x71, 0xdb, 0xc7, 0xaf, 0xc5, 0x5e, 0xd3, 0xec, 0x94, 0xef, 0x31, 0x36, 0xb1, - 0x79, 0x16, 0x1e, 0xd2, 0x07, 0x39, 0xf3, 0x9d, 0x19, 0x2b, 0xa2, 0x75, 0x7e, 0x2e, 0xec, 0x2f, 0x2d, 0x91, 0x60, - 0xd2, 0x52, 0xdb, 0x1b, 0x90, 0xf2, 0x89, 0x80, 0xa5, 0x34, 0x2f, 0x42, 0x5b, 0x35, 0xc8, 0x03, 0x25, 0xf4, 0x76, - 0x1a, 0xb5, 0xd7, 0x36, 0xeb, 0x85, 0x62, 0x5d, 0x70, 0xdc, 0x6a, 0x01, 0x43, 0x66, 0x38, 0x62, 0x03, 0xd6, 0x81, - 0x2b, 0x99, 0xa9, 0x66, 0xe2, 0x42, 0x9c, 0xd7, 0x99, 0xd1, 0x8c, 0x9f, 0xf3, 0xd4, 0x6e, 0xab, 0xcd, 0x95, 0x38, - 0x43, 0xff, 0xae, 0x5e, 0xbd, 0x99, 0xc6, 0xe8, 0x6e, 0x4c, 0x20, 0xdb, 0x4a, 0x1f, 0x0d, 0x7f, 0x3c, 0x9c, 0xa5, - 0x18, 0x06, 0xdc, 0x9f, 0x53, 0x15, 0xb4, 0xbf, 0x40, 0x79, 0x96, 0x97, 0x36, 0x76, 0x88, 0xd4, 0x64, 0xa0, 0x54, - 0x79, 0xbe, 0x97, 0x6c, 0x95, 0x48, 0xd0, 0x20, 0xb9, 0x91, 0x27, 0xcf, 0xe1, 0x0b, 0x32, 0xe2, 0x8f, 0xc6, 0xef, - 0x2f, 0x20, 0xc2, 0xce, 0x30, 0x93, 0x07, 0x06, 0x33, 0x77, 0x67, 0x03, 0x4f, 0x92, 0xd6, 0x9f, 0x8e, 0x12, 0xcd, - 0x97, 0x9b, 0xbb, 0x92, 0x4c, 0x71, 0x42, 0xf3, 0x93, 0x0f, 0x33, 0x54, 0x14, 0x97, 0x7f, 0xe0, 0x7a, 0xd6, 0x9e, - 0xa4, 0xc0, 0xf5, 0x7e, 0x08, 0x59, 0x11, 0xa9, 0xa8, 0x05, 0xf5, 0xd0, 0x8c, 0xc6, 0xf2, 0x43, 0x73, 0xfb, 0x45, - 0xaf, 0x08, 0x6c, 0xe2, 0x51, 0x8d, 0x9f, 0xf4, 0x5f, 0x3f, 0x30, 0x20, 0xe6, 0xbf, 0x4b, 0x62, 0x45, 0x55, 0xe3, - 0xdc, 0x65, 0x89, 0xaf, 0x60, 0xd5, 0x9f, 0x87, 0x44, 0x11, 0x64, 0xb7, 0x52, 0x84, 0x10, 0x9a, 0x2a, 0x62, 0xda, - 0x03, 0x38, 0xbd, 0x41, 0xdf, 0x51, 0x84, 0x85, 0x0a, 0x37, 0xa6, 0x9f, 0x90, 0x9a, 0x04, 0xa3, 0xd3, 0xd1, 0x40, - 0xe5, 0x80, 0xa4, 0x6f, 0x77, 0xbe, 0xbd, 0x47, 0x26, 0x59, 0xab, 0x5b, 0x99, 0xa4, 0x00, 0x81, 0x36, 0x7c, 0xc8, - 0xed, 0xed, 0x79, 0x9e, 0xe7, 0x2a, 0xab, 0xd7, 0xf1, 0x67, 0x1b, 0x0e, 0x13, 0xdb, 0xb1, 0x35, 0x3c, 0x78, 0xa2, - 0x85, 0x74, 0xfc, 0x45, 0x53, 0x34, 0xe8, 0x1a, 0xf1, 0x11, 0x05, 0xfa, 0x9c, 0x5d, 0x48, 0x1a, 0x37, 0xef, 0xca, - 0x75, 0xe0, 0x32, 0xb8, 0x29, 0x19, 0x1c, 0xd8, 0x9d, 0x0a, 0x99, 0x39, 0x35, 0x17, 0x54, 0x1e, 0x0f, 0xa4, 0xfe, - 0x90, 0xca, 0x8d, 0x59, 0xaa, 0x10, 0x1b, 0x54, 0xa7, 0x06, 0x7c, 0xd9, 0x13, 0x41, 0xcb, 0x13, 0xc8, 0xde, 0xab, - 0x21, 0xc5, 0x98, 0xe4, 0x72, 0x97, 0x03, 0xb6, 0xa1, 0x03, 0xd5, 0xa0, 0xe9, 0x18, 0x40, 0xb8, 0xbb, 0xf8, 0x96, - 0xf4, 0xbf, 0x7d, 0x9c, 0x7e, 0xaa, 0xee, 0x3c, 0x02, 0x4d, 0xb2, 0x56, 0x74, 0xbf, 0xd4, 0xa2, 0x21, 0x48, 0x78, - 0x1b, 0x1e, 0x22, 0xfe, 0xf4, 0x77, 0xe4, 0xd2, 0xc0, 0x5a, 0xd7, 0xa1, 0xff, 0x8e, 0x6c, 0xa6, 0x50, 0xa6, 0x15, - 0x52, 0xea, 0x54, 0x2d, 0x9c, 0x3b, 0x45, 0x59, 0x1a, 0x54, 0x3f, 0x48, 0x65, 0x85, 0x03, 0x09, 0x89, 0x44, 0x45, - 0x19, 0x26, 0x15, 0xaf, 0x69, 0x7d, 0x9f, 0x62, 0x13, 0x9e, 0xdd, 0xad, 0xfc, 0x90, 0x39, 0x88, 0x97, 0xc2, 0x1f, - 0x0f, 0xc6, 0xd7, 0x48, 0x6b, 0xa8, 0x67, 0x87, 0x87, 0x23, 0xcc, 0x51, 0xc4, 0xfa, 0x14, 0x65, 0xa8, 0x04, 0x72, - 0x29, 0xc5, 0x13, 0x86, 0x97, 0x98, 0xa8, 0xe8, 0x1c, 0x72, 0xd0, 0xe6, 0x7c, 0x80, 0x85, 0x87, 0x5e, 0xf0, 0xaf, - 0xe8, 0x21, 0x77, 0xaf, 0x8c, 0x88, 0xa6, 0x32, 0xa5, 0xdb, 0x3a, 0xe5, 0x1e, 0x3a, 0x5b, 0x04, 0xbd, 0x7d, 0xcf, - 0x3f, 0x7d, 0xa7, 0xef, 0xd4, 0xcf, 0x3e, 0xe5, 0x63, 0x7d, 0xca, 0xbf, 0xee, 0xfe, 0x63, 0xdb, 0x21, 0xff, 0x78, - 0xc9, 0xa6, 0x6d, 0x58, 0xd3, 0x6e, 0x4a, 0x54, 0xba, 0x4f, 0x14, 0x66, 0xe2, 0xa5, 0x18, 0xff, 0xb6, 0x28, 0x6b, - 0x7d, 0xb9, 0xb0, 0x82, 0x74, 0x32, 0x9b, 0xf0, 0xf5, 0xaf, 0x0b, 0x47, 0x08, 0x2d, 0x02, 0x3b, 0x49, 0xe9, 0x7c, - 0x92, 0xb5, 0x05, 0x34, 0x97, 0xa4, 0xb3, 0x84, 0x59, 0xc2, 0xd6, 0xf9, 0x04, 0xf4, 0x40, 0xb3, 0xa9, 0x5e, 0xe0, - 0x3a, 0x72, 0x0c, 0xc5, 0xf1, 0x6a, 0xe7, 0xa3, 0xdf, 0xde, 0x8a, 0x6f, 0x31, 0xd8, 0x85, 0xa5, 0x16, 0xd4, 0x8c, - 0x9a, 0x55, 0x0b, 0x38, 0x83, 0xb3, 0x78, 0x16, 0x14, 0xe8, 0xe7, 0x82, 0x21, 0xb8, 0x80, 0xd6, 0x06, 0xfa, 0x60, - 0xda, 0x78, 0x84, 0x45, 0x59, 0xe4, 0x1d, 0xf5, 0xe2, 0x66, 0x5d, 0xf5, 0xde, 0xdf, 0x56, 0x8c, 0x4a, 0xbc, 0xe5, - 0x7f, 0x05, 0x55, 0x22, 0xe9, 0xae, 0x90, 0xc8, 0xbb, 0x2a, 0x3e, 0x5e, 0x9b, 0xd6, 0x07, 0xb1, 0xac, 0xda, 0xb2, - 0xfe, 0x8e, 0xb0, 0x33, 0xe1, 0x71, 0xe8, 0x9e, 0xaa, 0x50, 0x10, 0xd3, 0x38, 0x77, 0xc9, 0xf7, 0x43, 0xbe, 0xea, - 0x7c, 0x37, 0xfc, 0x5b, 0x54, 0xcb, 0x5c, 0xcf, 0x24, 0x02, 0xa2, 0x9c, 0x74, 0xc1, 0xca, 0x61, 0x78, 0xe2, 0x9e, - 0xe6, 0x75, 0x91, 0x9c, 0x17, 0xd4, 0x33, 0x2c, 0x6e, 0xdf, 0xcb, 0x5f, 0x84, 0x6d, 0x8a, 0xca, 0x5f, 0xd8, 0x8c, - 0x3d, 0x1c, 0x51, 0x4d, 0xb7, 0x4f, 0xa8, 0xa0, 0x55, 0xa5, 0x1c, 0x4f, 0xbb, 0xf0, 0x22, 0x72, 0xb6, 0x37, 0xb0, - 0x53, 0xe6, 0xb6, 0x66, 0xdb, 0x1d, 0xe9, 0xef, 0x62, 0x15, 0x45, 0xec, 0x8a, 0xc3, 0x3e, 0xad, 0xa4, 0xeb, 0x8a, - 0x9a, 0xc3, 0x10, 0x8d, 0xe3, 0x0d, 0x14, 0xe5, 0xdb, 0x00, 0x1b, 0x1d, 0x20, 0xf4, 0xdb, 0x06, 0x4f, 0x80, 0x39, - 0xcc, 0xac, 0x36, 0x2e, 0x5e, 0xcd, 0x96, 0x4a, 0xee, 0xa9, 0xea, 0xfd, 0x5b, 0x0e, 0x8c, 0xbd, 0xcd, 0xfe, 0x29, - 0x46, 0x1f, 0xf1, 0xd9, 0xfb, 0xdb, 0x4f, 0x18, 0x82, 0x3c, 0x73, 0xe5, 0x7d, 0xdd, 0x83, 0x98, 0x94, 0xd9, 0x2a, - 0x35, 0x6d, 0x2b, 0x5c, 0x32, 0x08, 0xaf, 0x1d, 0x6d, 0x58, 0xa2, 0x4e, 0x61, 0x7f, 0xad, 0x92, 0xd5, 0x4d, 0x80, - 0xcf, 0x93, 0x5a, 0x62, 0x4e, 0x95, 0xc7, 0xfe, 0xea, 0xc5, 0x49, 0x26, 0x7f, 0x62, 0x02, 0x75, 0x06, 0x97, 0xb0, - 0x29, 0xcb, 0x1f, 0xc4, 0xfe, 0xdd, 0xec, 0x6f, 0x97, 0x46, 0xfe, 0xe6, 0x28, 0xb1, 0x08, 0x29, 0xac, 0x60, 0x5c, - 0xca, 0xd7, 0x4b, 0x3a, 0x80, 0x46, 0x36, 0x29, 0x46, 0x2f, 0x68, 0x5f, 0x7e, 0xee, 0xbe, 0xc2, 0xdc, 0x53, 0x32, - 0x76, 0x71, 0x30, 0xcb, 0xb5, 0x45, 0xe1, 0x48, 0x83, 0x65, 0xf0, 0xa2, 0xb7, 0x3a, 0xc2, 0x47, 0xe6, 0x88, 0x8f, - 0xcf, 0xfb, 0xe5, 0x82, 0x68, 0x51, 0x9a, 0x3f, 0x0e, 0x9e, 0x06, 0x74, 0x5c, 0x6a, 0xdb, 0xf4, 0x1e, 0x39, 0x75, - 0x40, 0xe8, 0x1a, 0x9b, 0x4c, 0x3f, 0x56, 0x28, 0x25, 0x35, 0x4b, 0xdb, 0xe9, 0xb1, 0xb1, 0x53, 0x53, 0xa2, 0xf8, - 0xae, 0xef, 0xba, 0x3b, 0x45, 0xb5, 0xae, 0x9f, 0x72, 0x44, 0x3e, 0xea, 0x82, 0x78, 0x35, 0x72, 0x6d, 0x87, 0x5c, - 0x7d, 0xd9, 0xa9, 0xea, 0x41, 0x5d, 0xec, 0x7f, 0xc8, 0x95, 0x9c, 0x66, 0xe3, 0x5b, 0x6f, 0xd0, 0xea, 0x26, 0x0d, - 0x3d, 0xe4, 0xc0, 0x02, 0x87, 0x14, 0xe1, 0x46, 0x0c, 0x6d, 0x6b, 0x24, 0x78, 0xac, 0x98, 0xc2, 0x83, 0xb8, 0x3f, - 0x8e, 0x4c, 0x80, 0xaa, 0xe8, 0x45, 0xa8, 0x8d, 0x6d, 0x0e, 0x3d, 0x03, 0x5c, 0x0f, 0xe9, 0xaf, 0x82, 0x9c, 0xef, - 0xe0, 0x6e, 0x30, 0x5a, 0x67, 0xcf, 0x8b, 0xf2, 0x81, 0x6a, 0x5c, 0x6f, 0xdb, 0xe1, 0x90, 0x5d, 0x63, 0xb7, 0x8b, - 0xa4, 0x76, 0x59, 0xe8, 0x33, 0x5b, 0x83, 0x91, 0x62, 0x6c, 0xbd, 0x05, 0xbe, 0xd9, 0x96, 0x41, 0x65, 0xd7, 0x7e, - 0x23, 0x29, 0xa1, 0xd1, 0xc5, 0xd0, 0x60, 0xbc, 0x81, 0x40, 0x55, 0xb0, 0x3c, 0x8b, 0x69, 0x2b, 0x61, 0x34, 0x1a, - 0xf7, 0xb4, 0x9f, 0x46, 0xf5, 0xb1, 0xfc, 0x91, 0x6e, 0xa6, 0xdc, 0x48, 0x97, 0x1f, 0xa6, 0xcb, 0x3d, 0x04, 0x53, - 0x61, 0xf9, 0x52, 0xad, 0x24, 0x02, 0x6e, 0xb9, 0x82, 0xd2, 0x60, 0x7f, 0x3f, 0xaf, 0xc0, 0xcc, 0x4b, 0x9e, 0x63, - 0x68, 0x78, 0xb1, 0x51, 0xb1, 0x71, 0xe2, 0xa7, 0xbb, 0x44, 0xcb, 0xa9, 0x19, 0x3c, 0x45, 0x3c, 0x20, 0xd5, 0x6d, - 0x0b, 0x5e, 0x1e, 0x3c, 0x46, 0x23, 0x4b, 0x57, 0xca, 0x2e, 0x93, 0x67, 0xf5, 0x50, 0x8e, 0x2a, 0x71, 0xd0, 0x4b, - 0xa4, 0x51, 0x57, 0xde, 0xfa, 0xc6, 0x4b, 0x60, 0x95, 0xb4, 0x4c, 0x4e, 0xbf, 0xef, 0x88, 0x34, 0x48, 0xb8, 0x94, - 0x42, 0xf1, 0x57, 0x89, 0x90, 0x7a, 0x6f, 0x0d, 0x1d, 0xc3, 0xc0, 0xfd, 0x75, 0x3e, 0xe2, 0xac, 0xf8, 0xec, 0x17, - 0x07, 0xd0, 0xa5, 0x2a, 0x1b, 0xa4, 0x5d, 0xac, 0xdc, 0x99, 0xef, 0xf7, 0xe8, 0x6d, 0x95, 0x62, 0xf1, 0x2d, 0xa3, - 0x9f, 0x58, 0xbc, 0x15, 0x32, 0xd8, 0x3d, 0x3f, 0xc0, 0x83, 0x1d, 0x9a, 0x48, 0x5d, 0x25, 0x04, 0x30, 0x41, 0x27, - 0xbd, 0x9c, 0xbc, 0x42, 0x14, 0xa1, 0x05, 0xee, 0xc9, 0xa1, 0x8d, 0x4a, 0x61, 0xbe, 0x82, 0xf0, 0x8f, 0x72, 0xf9, - 0x1e, 0x03, 0xd3, 0xe0, 0x12, 0x0d, 0xe5, 0x03, 0x22, 0xd2, 0x93, 0x91, 0x14, 0x81, 0x17, 0xf2, 0x3e, 0x11, 0x4c, - 0x5c, 0xa3, 0x75, 0x13, 0xbc, 0xa7, 0xc5, 0xd1, 0x4d, 0xf3, 0xd4, 0xc2, 0x8c, 0xf8, 0x19, 0x13, 0x46, 0xe1, 0x32, - 0xc4, 0x77, 0x16, 0x14, 0x9e, 0x60, 0xa7, 0x1a, 0x54, 0xaf, 0x8f, 0xda, 0xf4, 0x62, 0x37, 0xf8, 0x2b, 0x37, 0x1f, - 0xcf, 0x45, 0x3a, 0xf2, 0x42, 0x5c, 0xf2, 0xdc, 0xf9, 0x01, 0x9a, 0x10, 0x9e, 0xbb, 0x61, 0x77, 0x89, 0x0e, 0xac, - 0x93, 0xc9, 0x86, 0x15, 0x4d, 0xdc, 0x74, 0x02, 0x0c, 0xf2, 0xdc, 0x39, 0xb4, 0x6a, 0xe2, 0xe9, 0x3f, 0x55, 0xb9, - 0x5d, 0xf2, 0xbc, 0xc3, 0xee, 0x9a, 0xda, 0x35, 0x36, 0x06, 0x22, 0xe2, 0x62, 0x34, 0xc7, 0xd2, 0x4b, 0xfc, 0x1c, - 0xee, 0xdc, 0x7b, 0x5c, 0x3f, 0xc5, 0x18, 0x20, 0x1f, 0xde, 0x42, 0xb6, 0x80, 0x9e, 0xc5, 0x79, 0x9f, 0xa1, 0x17, - 0xde, 0xed, 0x25, 0x66, 0x44, 0x72, 0x7f, 0xa6, 0xf5, 0x91, 0x28, 0x47, 0x7a, 0x09, 0x29, 0x4e, 0x70, 0x94, 0xec, - 0x44, 0xc0, 0xfe, 0xbf, 0x10, 0x6d, 0x27, 0x88, 0xf2, 0x6d, 0xc2, 0xcd, 0xdd, 0xed, 0x58, 0xb9, 0x7d, 0xcb, 0x13, - 0x42, 0xa9, 0xf8, 0x84, 0x71, 0x88, 0x69, 0x27, 0x13, 0xbb, 0x23, 0x43, 0x44, 0x0f, 0x4b, 0x70, 0x1d, 0xb8, 0x19, - 0x7e, 0x74, 0xf6, 0x36, 0x8e, 0xe4, 0xe2, 0x73, 0xf5, 0xf3, 0x67, 0xdb, 0x60, 0x71, 0xed, 0xf6, 0xf2, 0x02, 0xc8, - 0x44, 0x3e, 0xea, 0x48, 0xbc, 0xa2, 0x01, 0x1a, 0xa7, 0xd7, 0x80, 0x11, 0xa7, 0x2c, 0x7d, 0x41, 0x87, 0x89, 0xca, - 0x23, 0xf5, 0xa0, 0x11, 0x3f, 0xc2, 0x90, 0xed, 0xb2, 0xac, 0x89, 0xb4, 0x30, 0xda, 0xb7, 0x40, 0xe1, 0x04, 0x58, - 0xb9, 0x0d, 0x0b, 0xf4, 0x6b, 0x21, 0x23, 0xaf, 0x81, 0x86, 0xfa, 0x7c, 0xf3, 0xda, 0xdf, 0x4f, 0xf4, 0x4f, 0x8b, - 0xe6, 0x90, 0x96, 0xd4, 0x23, 0xbf, 0x0f, 0xb6, 0xc7, 0xd6, 0xe2, 0xe7, 0x9d, 0xaf, 0x32, 0xa6, 0x25, 0x18, 0x91, - 0x77, 0x63, 0x08, 0xf9, 0x20, 0xc7, 0x2a, 0x08, 0x25, 0x5f, 0xab, 0x5a, 0x3b, 0xc4, 0x7a, 0xca, 0xdb, 0x14, 0x79, - 0xdb, 0x7c, 0x54, 0x51, 0x58, 0xad, 0xc0, 0xfe, 0xaa, 0xa1, 0xac, 0xc4, 0x0b, 0xfd, 0x57, 0x42, 0xa2, 0x0a, 0x89, - 0x45, 0x07, 0x3d, 0x12, 0xce, 0x3f, 0x08, 0x51, 0xd0, 0xe5, 0x96, 0x6a, 0xd9, 0x6e, 0x5f, 0x1a, 0x0a, 0x57, 0x81, - 0x58, 0x60, 0xb7, 0xf1, 0xbc, 0xad, 0xe3, 0x45, 0x1c, 0x97, 0x99, 0xb5, 0x6f, 0xbc, 0xe2, 0x2b, 0xec, 0x05, 0x81, - 0xfd, 0x1a, 0xce, 0x9a, 0xfc, 0xdf, 0xcf, 0xf0, 0x9a, 0x99, 0xc5, 0xcd, 0xc5, 0xf0, 0x6f, 0x67, 0xb3, 0xfc, 0x62, - 0x78, 0xb3, 0xd9, 0x21, 0xb5, 0x98, 0xd3, 0x68, 0xda, 0x7c, 0x78, 0xfd, 0xf0, 0xf2, 0x20, 0x9d, 0xde, 0xf3, 0x93, - 0xbc, 0x75, 0x76, 0x71, 0x0c, 0x59, 0xf0, 0x09, 0x3f, 0x6b, 0xb0, 0x39, 0xfb, 0xaf, 0xad, 0xd0, 0x1e, 0xd7, 0xde, - 0x33, 0xbb, 0x12, 0xab, 0xd3, 0xd8, 0xeb, 0xed, 0xbe, 0x9a, 0x02, 0xfe, 0x13, 0x81, 0x26, 0xbe, 0xf2, 0xc9, 0xa4, - 0x14, 0x07, 0x40, 0xa0, 0xba, 0x35, 0xf8, 0x7b, 0x18, 0x8c, 0x32, 0x92, 0xf1, 0xf6, 0x13, 0x92, 0xc8, 0xc6, 0xe1, - 0xe9, 0xdc, 0x42, 0xb1, 0x1e, 0xe9, 0xfb, 0x3c, 0xcd, 0xb4, 0x7e, 0x5b, 0x46, 0xd5, 0xa9, 0x81, 0x2c, 0x68, 0x9c, - 0x69, 0x10, 0xac, 0x7f, 0xdb, 0x58, 0x9d, 0x59, 0xf8, 0x66, 0x21, 0xa2, 0x59, 0x16, 0xff, 0x78, 0x4e, 0xb6, 0xd0, - 0xa0, 0xc0, 0x8f, 0x9a, 0x66, 0xde, 0xb5, 0x6e, 0x75, 0x01, 0x21, 0xef, 0x96, 0xa7, 0xf5, 0xa5, 0x3f, 0xff, 0x82, - 0x35, 0xbb, 0xf1, 0x5f, 0x5d, 0x8f, 0xd6, 0x8b, 0x10, 0x25, 0x5b, 0x81, 0x00, 0x71, 0xb1, 0x8d, 0xe3, 0x2d, 0x79, - 0xe3, 0x34, 0x17, 0xc9, 0x3c, 0x7c, 0x75, 0x92, 0x66, 0x05, 0xa1, 0x9a, 0xdf, 0x26, 0xf1, 0x0a, 0xd4, 0x59, 0x89, - 0x8f, 0x8a, 0x77, 0xe3, 0xde, 0xf5, 0xc4, 0xf6, 0xbf, 0xf2, 0x25, 0x14, 0xc4, 0xf7, 0xfb, 0x16, 0xe8, 0x86, 0x9f, - 0x30, 0xc5, 0xdb, 0x8f, 0xd7, 0xe3, 0x37, 0xf9, 0xad, 0xc0, 0x3d, 0x16, 0x78, 0x67, 0xbd, 0x34, 0x97, 0xf2, 0x24, - 0x41, 0x66, 0x05, 0xae, 0xb8, 0xec, 0x07, 0x0f, 0x96, 0x2d, 0x4d, 0x80, 0x66, 0xab, 0xc8, 0x00, 0x19, 0xca, 0x25, - 0x08, 0x69, 0x83, 0x8c, 0xfe, 0x2d, 0x88, 0xa2, 0x24, 0xc7, 0xa7, 0xb3, 0x27, 0xd1, 0x0d, 0x95, 0x3e, 0x39, 0x32, - 0xb0, 0xb2, 0x0e, 0x50, 0x4b, 0x32, 0x54, 0x88, 0x84, 0x90, 0x64, 0x02, 0x60, 0x9f, 0x14, 0x1a, 0x0a, 0x9f, 0x6b, - 0x39, 0xed, 0xfc, 0xc2, 0xb7, 0x4c, 0x90, 0x78, 0x4c, 0x8e, 0x5a, 0xc9, 0x84, 0xb6, 0x7b, 0xad, 0xf9, 0xe8, 0xee, - 0xe2, 0xa9, 0x5d, 0x1c, 0x63, 0x3e, 0xf2, 0x3f, 0x4a, 0x73, 0x22, 0xf2, 0xb5, 0x0e, 0xc0, 0x4a, 0xde, 0x0a, 0x94, - 0x2d, 0x6f, 0x98, 0x17, 0x58, 0xfc, 0x56, 0x4b, 0x76, 0xf5, 0x0c, 0x02, 0xb4, 0x21, 0x9c, 0xb4, 0xe3, 0x5c, 0xe1, - 0xba, 0x99, 0x62, 0x0d, 0xe5, 0xf5, 0x0a, 0x47, 0x15, 0x9a, 0x26, 0xc6, 0x74, 0x73, 0x2d, 0x7a, 0x31, 0xf5, 0x9a, - 0x7a, 0x42, 0x92, 0xbc, 0x08, 0x67, 0xd5, 0x9e, 0xae, 0xfd, 0x67, 0x06, 0x48, 0x3d, 0x27, 0x17, 0xca, 0x36, 0x17, - 0xe3, 0xbb, 0x79, 0xe3, 0x59, 0xc6, 0xcd, 0xbd, 0x57, 0x6b, 0xaf, 0x9e, 0x67, 0xb7, 0x98, 0x8f, 0x25, 0xe4, 0xd3, - 0x0e, 0x31, 0x37, 0xb2, 0x50, 0x72, 0x84, 0x71, 0xd7, 0x86, 0x21, 0x13, 0x37, 0x2e, 0x2c, 0x98, 0x90, 0x1e, 0x1b, - 0x89, 0x71, 0x90, 0x35, 0xdf, 0xd5, 0x7e, 0x71, 0x7c, 0xfb, 0xa3, 0xb8, 0x48, 0x0b, 0xf6, 0xf0, 0xa4, 0xb3, 0x5f, - 0xf9, 0x4c, 0xa3, 0x6e, 0x23, 0x47, 0x02, 0x51, 0x0c, 0x44, 0x02, 0xba, 0x56, 0xa9, 0xd0, 0xcb, 0x8a, 0x79, 0xa8, - 0xc0, 0x67, 0x2d, 0xb4, 0x51, 0xc1, 0xaa, 0x57, 0xf8, 0x89, 0x08, 0x65, 0xa6, 0xd6, 0x6b, 0x80, 0x5c, 0x64, 0x6b, - 0xad, 0x9f, 0xf5, 0x76, 0x6d, 0xb8, 0x9c, 0x27, 0xf0, 0x57, 0xef, 0xe2, 0xd6, 0xc7, 0x04, 0x5d, 0x6e, 0xed, 0x9f, - 0x68, 0xcf, 0x32, 0x46, 0x12, 0x55, 0x9e, 0xc3, 0xd3, 0x0a, 0xe4, 0xeb, 0x8e, 0x34, 0x5e, 0x62, 0x43, 0xf6, 0x16, - 0xa5, 0x9f, 0x52, 0xc6, 0xbd, 0xfc, 0xa4, 0xd8, 0x03, 0xf6, 0xdc, 0x03, 0x82, 0x35, 0xfb, 0x5a, 0x5f, 0x6e, 0x4d, - 0xd3, 0x60, 0xff, 0xa3, 0x03, 0x4f, 0x40, 0xd9, 0xbe, 0x1c, 0x47, 0x18, 0x8f, 0xdc, 0x92, 0x31, 0x65, 0x08, 0x39, - 0xc1, 0x62, 0xbb, 0xd7, 0x1d, 0x6b, 0x68, 0x39, 0x95, 0x28, 0x16, 0x49, 0xee, 0x7e, 0x94, 0xce, 0x68, 0xff, 0xd4, - 0x4e, 0x25, 0xb4, 0xf5, 0xb7, 0x9a, 0x9d, 0x14, 0x4d, 0xd7, 0xf5, 0x0e, 0xe8, 0x3c, 0x4a, 0x94, 0x4f, 0x2c, 0x8f, - 0x5d, 0x7e, 0x79, 0xb7, 0x6b, 0x64, 0xbb, 0x29, 0xb7, 0xb5, 0x37, 0x1a, 0xa9, 0x18, 0x69, 0xe8, 0x81, 0xed, 0x70, - 0xd9, 0x29, 0x6d, 0x02, 0x22, 0x64, 0x54, 0x2f, 0x8e, 0xa4, 0x96, 0xfa, 0x42, 0x9c, 0x75, 0xe7, 0x23, 0xad, 0x68, - 0x2f, 0x82, 0x02, 0x10, 0x5a, 0x1d, 0xa9, 0x92, 0x35, 0x5c, 0x97, 0x11, 0x6c, 0x0f, 0xe3, 0xf5, 0x0d, 0x14, 0x55, - 0x79, 0x7a, 0x2d, 0xd8, 0x8a, 0x1f, 0xc7, 0xa6, 0xf0, 0xb0, 0x8b, 0x0c, 0xf6, 0xe0, 0x66, 0x8e, 0x13, 0x3c, 0x5d, - 0x9b, 0xd3, 0x92, 0x3d, 0xd9, 0x20, 0xb3, 0xe6, 0xeb, 0xdb, 0x21, 0x5e, 0xb8, 0x71, 0x3d, 0x2c, 0xd9, 0x25, 0x1c, - 0x5c, 0xfa, 0x04, 0x3e, 0xf8, 0xb5, 0x1d, 0xb3, 0x41, 0xa1, 0xab, 0xcb, 0x09, 0xf6, 0x92, 0xc6, 0xe7, 0xf9, 0x6f, - 0x66, 0x73, 0x51, 0xb2, 0x02, 0xac, 0xbd, 0xba, 0x6f, 0x11, 0x2e, 0x73, 0x07, 0x5f, 0xfe, 0x3f, 0x75, 0xd4, 0x76, - 0xf3, 0xf9, 0x2d, 0x9c, 0x9b, 0x1c, 0x3c, 0xc3, 0x21, 0xea, 0xf2, 0x40, 0xae, 0x5c, 0xbf, 0xfa, 0x4f, 0xa0, 0xe4, - 0x9d, 0x4e, 0x9a, 0x7f, 0xdd, 0x77, 0x61, 0x31, 0x36, 0x76, 0xd9, 0x3e, 0xe2, 0x84, 0xd1, 0x75, 0xa2, 0xd0, 0x7e, - 0xcf, 0xc4, 0xb6, 0x1a, 0x64, 0x04, 0x8b, 0x90, 0xd7, 0x77, 0xb6, 0x00, 0xf4, 0xfd, 0x65, 0x0f, 0x8b, 0xb7, 0x7e, - 0x45, 0xe2, 0x4d, 0xb1, 0xf0, 0xef, 0x47, 0x64, 0xe1, 0xda, 0xfe, 0x8a, 0x03, 0x04, 0xdb, 0x5a, 0xfb, 0x5a, 0xdc, - 0x72, 0xfb, 0xe8, 0x04, 0x20, 0x28, 0x61, 0x2d, 0x9e, 0x44, 0xed, 0x5f, 0x22, 0x23, 0x52, 0xf7, 0x19, 0x33, 0x35, - 0x4c, 0xc4, 0x9d, 0x15, 0xc7, 0xb0, 0xd2, 0x7d, 0x74, 0xe5, 0x36, 0xb9, 0x1a, 0x44, 0xd1, 0x1e, 0x9a, 0x88, 0x3b, - 0x36, 0x04, 0x79, 0x4f, 0xc8, 0x63, 0x81, 0xaa, 0xac, 0xc2, 0x96, 0x47, 0x29, 0x82, 0xe1, 0x39, 0x74, 0x01, 0xb6, - 0x52, 0xd4, 0x3a, 0x73, 0xc9, 0xe2, 0xc4, 0x81, 0xd7, 0x8f, 0x07, 0xbc, 0x1a, 0xdd, 0xcd, 0x91, 0x40, 0xdc, 0x49, - 0xb2, 0x5b, 0x50, 0xf5, 0xe6, 0x65, 0xe8, 0x56, 0x3c, 0xaf, 0x14, 0x77, 0xa3, 0xad, 0xbe, 0x0d, 0x21, 0x22, 0x0e, - 0xd1, 0xae, 0x1d, 0xa5, 0x07, 0x74, 0x20, 0x8b, 0x2e, 0xaa, 0x9a, 0x94, 0xe0, 0xbf, 0x29, 0xb3, 0x36, 0xa1, 0x86, - 0x09, 0x05, 0x05, 0xe7, 0x6c, 0xdc, 0x4a, 0xf8, 0xf4, 0x46, 0xc6, 0xdc, 0x52, 0xe0, 0x55, 0x68, 0x6e, 0xaa, 0x03, - 0xb9, 0x22, 0x1a, 0x74, 0xc9, 0xb5, 0xed, 0x32, 0xc7, 0x87, 0x59, 0xbb, 0xf0, 0xfc, 0xb9, 0xd8, 0x2f, 0x95, 0x52, - 0xe4, 0xa5, 0xa0, 0x10, 0x71, 0x6a, 0xa3, 0x12, 0x9a, 0xfa, 0x00, 0xd6, 0x74, 0x44, 0x70, 0x67, 0x3c, 0x7a, 0x87, - 0x48, 0xf2, 0x3f, 0x95, 0x52, 0x67, 0x23, 0x79, 0x04, 0x4c, 0xeb, 0x81, 0x49, 0xfd, 0x92, 0x6d, 0x81, 0xe0, 0xf0, - 0x40, 0x7f, 0x0c, 0x14, 0xc9, 0x13, 0x89, 0x58, 0x50, 0xc7, 0xd3, 0xa8, 0x6f, 0xec, 0x4b, 0xb5, 0x27, 0xf7, 0x76, - 0x7c, 0xd6, 0x1e, 0x7b, 0x88, 0x24, 0x63, 0x7e, 0x10, 0x41, 0x12, 0x24, 0xc2, 0x18, 0x8b, 0x3c, 0xc4, 0x40, 0x34, - 0x3f, 0xb9, 0xc1, 0xe0, 0x54, 0x53, 0x6d, 0xfd, 0x58, 0xa2, 0x23, 0x10, 0xa8, 0xcb, 0x34, 0xaa, 0xd8, 0xaa, 0x4c, - 0x10, 0xcc, 0x67, 0xfd, 0xbb, 0x76, 0x44, 0x60, 0xa6, 0x1d, 0x03, 0xb4, 0xc9, 0x1b, 0xcc, 0x47, 0x44, 0x66, 0xcb, - 0xce, 0x27, 0x89, 0x09, 0xa6, 0xae, 0xda, 0x23, 0xb3, 0x71, 0xc6, 0xc9, 0xa6, 0xe9, 0xd4, 0xee, 0xaa, 0x32, 0xb8, - 0x08, 0x2f, 0x5e, 0xa2, 0x11, 0x80, 0xe8, 0x5a, 0xbe, 0x16, 0x9e, 0x1c, 0x08, 0x20, 0xcc, 0x2d, 0x0d, 0xfc, 0x96, - 0x69, 0xfb, 0x27, 0x5d, 0xab, 0x1b, 0x22, 0x36, 0x0a, 0x11, 0xfe, 0xd3, 0x04, 0xd9, 0xf5, 0x5b, 0xab, 0x1d, 0xfb, - 0xfb, 0x4e, 0x5b, 0xf6, 0x5b, 0x8b, 0x59, 0x4a, 0x43, 0x17, 0xc2, 0x86, 0x61, 0x6b, 0x35, 0x14, 0x56, 0xcb, 0x59, - 0x73, 0xe8, 0x80, 0xcc, 0xbc, 0x10, 0x90, 0x65, 0xee, 0x57, 0x3e, 0x42, 0x67, 0x07, 0xf6, 0x3f, 0xf2, 0x9d, 0xe4, - 0x1c, 0x1b, 0x76, 0x88, 0xaf, 0x77, 0xc1, 0xa2, 0x89, 0xac, 0x24, 0x94, 0x8f, 0xa0, 0x7c, 0xae, 0x5d, 0x5a, 0x47, - 0x6a, 0xe7, 0x46, 0x87, 0x46, 0x06, 0xfc, 0xc1, 0x98, 0x09, 0x1c, 0x88, 0x40, 0x2f, 0x05, 0xdd, 0x87, 0xef, 0x3b, - 0x26, 0xd3, 0x6f, 0x0d, 0x04, 0xff, 0xfe, 0x8d, 0xfb, 0x2d, 0x25, 0x60, 0x09, 0x88, 0x3b, 0x2d, 0xa0, 0x1b, 0xc4, - 0xfc, 0x7a, 0x69, 0x88, 0xc9, 0x8b, 0x43, 0x1b, 0xbd, 0x2c, 0x64, 0x78, 0xed, 0xc1, 0xc3, 0xe7, 0x99, 0xf7, 0xb2, - 0x53, 0x71, 0x86, 0x6b, 0xb3, 0x9b, 0x5e, 0xe2, 0xb6, 0xe3, 0xd7, 0x23, 0xbf, 0x45, 0xdc, 0xc0, 0xcd, 0x6e, 0x50, - 0xe6, 0x21, 0xcc, 0x3c, 0x0b, 0xdc, 0xa3, 0x61, 0x4a, 0x7f, 0xc3, 0x42, 0xac, 0x1b, 0xb2, 0xf5, 0x99, 0xc1, 0xea, - 0xb6, 0x8a, 0x41, 0x2c, 0x4f, 0x72, 0x3c, 0xc1, 0xc8, 0x42, 0xba, 0x61, 0x91, 0x93, 0x84, 0x37, 0x49, 0x1c, 0x71, - 0xaf, 0x8d, 0xd9, 0x56, 0x60, 0xea, 0x10, 0x1a, 0x72, 0x7b, 0xfc, 0xbe, 0x0b, 0x09, 0x66, 0x1e, 0x67, 0xa9, 0x8a, - 0x46, 0xea, 0xed, 0x5f, 0x3c, 0xb1, 0x47, 0xf5, 0x11, 0x6a, 0x7b, 0xcb, 0x92, 0xdb, 0xd5, 0xbf, 0xf7, 0xad, 0xd3, - 0x80, 0x5e, 0x30, 0x73, 0xc3, 0x70, 0xdc, 0x37, 0x36, 0x00, 0xd9, 0x48, 0x0a, 0x0c, 0x84, 0xd5, 0x08, 0x56, 0xd2, - 0x62, 0xec, 0xe9, 0x5d, 0xfd, 0xec, 0x18, 0x01, 0x2e, 0x81, 0xf5, 0x63, 0xa5, 0xb0, 0xe1, 0x14, 0xec, 0x7a, 0x03, - 0xf4, 0xdd, 0x76, 0x7b, 0x14, 0x4a, 0x93, 0x1b, 0x1a, 0x78, 0x9f, 0x0d, 0x04, 0x36, 0xfd, 0x14, 0xcf, 0xa1, 0x77, - 0x5d, 0xbf, 0xee, 0xfd, 0xbd, 0x31, 0x10, 0x21, 0xad, 0x91, 0xa0, 0xb5, 0xef, 0x7b, 0x2f, 0x69, 0x66, 0x65, 0x94, - 0xa1, 0x29, 0xdb, 0x54, 0xfb, 0x69, 0x38, 0xb6, 0x2d, 0x8b, 0x40, 0xed, 0x00, 0xaf, 0x5c, 0xe7, 0xe0, 0x3a, 0x53, - 0x14, 0xba, 0x12, 0x1f, 0x4a, 0x27, 0x78, 0xb7, 0x8d, 0x62, 0x12, 0x10, 0xe7, 0x07, 0x2b, 0xb8, 0x41, 0xc8, 0x59, - 0x23, 0x04, 0xd6, 0x66, 0xbb, 0xeb, 0x23, 0xd3, 0x95, 0xf8, 0xb5, 0x07, 0x59, 0x43, 0xa5, 0xa8, 0x14, 0xb8, 0xb4, - 0x38, 0x25, 0x79, 0xd2, 0x60, 0x78, 0x5d, 0x3f, 0xad, 0x69, 0x55, 0x25, 0xbe, 0xd6, 0xc5, 0x4e, 0xa9, 0x80, 0xb9, - 0xcf, 0xe9, 0xa9, 0x75, 0xa4, 0x78, 0x6b, 0xad, 0xad, 0x4f, 0x18, 0xe6, 0xf6, 0xde, 0x69, 0x0f, 0x20, 0x7f, 0xcc, - 0x67, 0x26, 0xc1, 0xc0, 0x88, 0x30, 0xc0, 0x5b, 0xa2, 0x97, 0x33, 0x26, 0x4f, 0xd0, 0x4c, 0x5f, 0xdc, 0xa3, 0xdc, - 0xbb, 0xdc, 0x7d, 0xca, 0x37, 0x2a, 0xb3, 0x47, 0x37, 0x5d, 0x04, 0xb4, 0xd6, 0x4d, 0x94, 0x1a, 0x1e, 0xc7, 0xb5, - 0xcb, 0x0b, 0xb1, 0x94, 0xc4, 0xeb, 0x10, 0xcd, 0xbf, 0xcb, 0x4f, 0x0e, 0x9b, 0x94, 0x95, 0x25, 0xdf, 0x19, 0x4b, - 0xc3, 0x8f, 0x15, 0xf2, 0xc2, 0x46, 0xaa, 0x01, 0x14, 0x57, 0x7a, 0x1d, 0xed, 0x64, 0xed, 0x5d, 0x56, 0x41, 0xa3, - 0x54, 0xc8, 0xd1, 0xa3, 0x35, 0x70, 0x94, 0x3a, 0x21, 0xd9, 0xc0, 0x5b, 0x60, 0x26, 0xaf, 0x0c, 0x4e, 0x01, 0xb5, - 0xf2, 0x48, 0x78, 0xe6, 0x42, 0x5e, 0x9a, 0xfc, 0x4c, 0xde, 0x8d, 0xc0, 0x78, 0xca, 0x07, 0x9e, 0xb8, 0xb0, 0x4c, - 0xfc, 0xb7, 0xec, 0x0f, 0x10, 0x95, 0x4c, 0x06, 0x15, 0x08, 0x4c, 0x83, 0x5d, 0x7c, 0x2d, 0x8d, 0xd4, 0x7a, 0x08, - 0xc1, 0xc9, 0xd5, 0x46, 0x7f, 0x30, 0xeb, 0x6b, 0x40, 0xa9, 0x7a, 0x83, 0x8a, 0x46, 0xec, 0xca, 0xf6, 0xd3, 0xbc, - 0x3e, 0x98, 0xa8, 0x7d, 0xa3, 0x81, 0x1b, 0xb6, 0xf9, 0xd5, 0x1e, 0xc5, 0xae, 0x8d, 0xe7, 0x4b, 0x60, 0x13, 0xb5, - 0xbc, 0x65, 0x52, 0x14, 0x1c, 0xda, 0x34, 0xa8, 0x76, 0x04, 0x23, 0x66, 0xba, 0x83, 0xce, 0x5b, 0xdb, 0x20, 0x3a, - 0x1d, 0x9c, 0x46, 0xd0, 0x19, 0x8c, 0x8b, 0x53, 0x5b, 0x35, 0x42, 0x49, 0x8c, 0x2f, 0xc7, 0xd0, 0x2f, 0xb2, 0x78, - 0xa3, 0x66, 0xda, 0x00, 0x5d, 0x49, 0x05, 0xf3, 0x6c, 0xc4, 0x4c, 0x0a, 0xb7, 0xec, 0xb9, 0x5d, 0x8a, 0xff, 0xa5, - 0x3b, 0xd7, 0xf7, 0x3c, 0x11, 0xe4, 0x03, 0x59, 0x3a, 0x0e, 0xfe, 0xb5, 0x98, 0xe1, 0xe7, 0x19, 0x8c, 0x5e, 0x64, - 0xd6, 0xc6, 0x2c, 0xc9, 0x17, 0x7c, 0x67, 0xf8, 0xa5, 0x06, 0x93, 0x9f, 0xb0, 0x9c, 0x21, 0xfa, 0x1a, 0x04, 0x38, - 0x72, 0xb5, 0xeb, 0x69, 0xc3, 0x78, 0x07, 0x8b, 0x17, 0xc5, 0x02, 0x51, 0xd4, 0xfb, 0x6a, 0x8e, 0xc3, 0xe2, 0x9c, - 0xa4, 0x04, 0x33, 0x9b, 0x1a, 0x49, 0x21, 0x64, 0xef, 0x9b, 0x93, 0x57, 0x56, 0x1a, 0x52, 0x9c, 0xc0, 0xcb, 0x81, - 0x5e, 0x23, 0xd2, 0xf1, 0xb1, 0x3a, 0x6b, 0x28, 0x4e, 0x1a, 0x99, 0x62, 0x36, 0xb1, 0x90, 0xce, 0xaa, 0x07, 0x1b, - 0xf3, 0x69, 0x91, 0x2b, 0xaf, 0xeb, 0x08, 0x7f, 0xad, 0xc2, 0x70, 0x96, 0x5e, 0x6f, 0xbe, 0x18, 0x06, 0x1d, 0xfe, - 0xaf, 0xd5, 0x84, 0x6f, 0xf0, 0x6d, 0x3f, 0x5f, 0x44, 0x44, 0xa8, 0xca, 0x0f, 0x74, 0xa2, 0x1d, 0xea, 0xe8, 0x34, - 0xf4, 0xd0, 0xcc, 0x56, 0x50, 0xb0, 0x48, 0xfb, 0x7d, 0x37, 0xbd, 0xf5, 0x35, 0x39, 0x7b, 0xe7, 0xba, 0xa6, 0x35, - 0xc1, 0xfc, 0xf8, 0x35, 0xd0, 0x9a, 0x8d, 0x84, 0x93, 0xe5, 0xf7, 0xc8, 0xde, 0x6c, 0xaf, 0x76, 0x67, 0xd4, 0xbe, - 0x3e, 0x1a, 0xde, 0x34, 0x8f, 0x19, 0x1f, 0x65, 0x93, 0x26, 0x6a, 0x3a, 0x73, 0x2d, 0xe0, 0x73, 0x6a, 0xea, 0x4e, - 0x24, 0x3a, 0x70, 0x76, 0xb5, 0x3c, 0xc5, 0x6f, 0x45, 0x64, 0xfa, 0x35, 0x89, 0xea, 0x96, 0x66, 0x50, 0xe4, 0x52, - 0x5a, 0xa8, 0xba, 0xad, 0x2a, 0x80, 0x7d, 0x8d, 0xa8, 0x19, 0xa8, 0x31, 0x0b, 0xdd, 0x29, 0x1a, 0x21, 0x8d, 0xb5, - 0x8c, 0xed, 0x87, 0x9a, 0x76, 0xa5, 0xaa, 0x1e, 0xdb, 0x25, 0x0e, 0x45, 0x03, 0x34, 0x2d, 0xcc, 0xf5, 0x6f, 0x76, - 0x75, 0xb3, 0x6d, 0x4b, 0xbd, 0x41, 0x5c, 0xf2, 0x9f, 0x87, 0x2d, 0xac, 0x9d, 0x29, 0x85, 0xc3, 0x15, 0xad, 0xe8, - 0x91, 0x6c, 0x1c, 0xb4, 0x0a, 0x83, 0xa8, 0x51, 0x65, 0xda, 0x88, 0x61, 0x44, 0xc2, 0x08, 0x85, 0x42, 0xe1, 0x3e, - 0x62, 0x5d, 0x6c, 0xca, 0xa3, 0x87, 0xd2, 0xea, 0x92, 0x1f, 0xb3, 0x58, 0xa3, 0x79, 0x5a, 0x7b, 0x2c, 0x64, 0xa9, - 0xc3, 0xc7, 0x2b, 0xc1, 0xe8, 0xf7, 0xcb, 0x84, 0x56, 0x6e, 0x31, 0x41, 0xa9, 0x0e, 0x24, 0x76, 0x3b, 0x79, 0x8b, - 0xf4, 0x63, 0x8b, 0x42, 0x12, 0xb2, 0x3f, 0xbd, 0x2c, 0x93, 0xa7, 0x8a, 0xe1, 0x55, 0xe4, 0x2c, 0x47, 0x09, 0xf1, - 0x0e, 0xfc, 0xa4, 0x5f, 0x7f, 0x92, 0x7a, 0xad, 0xba, 0xad, 0x75, 0x54, 0xd4, 0xce, 0x6d, 0xe9, 0x86, 0x71, 0x9d, - 0x0c, 0xaa, 0xe0, 0x06, 0x4c, 0xd2, 0xe8, 0x5b, 0x27, 0xa8, 0x4f, 0x31, 0x9a, 0xf2, 0x6a, 0x07, 0x65, 0x2d, 0xc3, - 0x60, 0x8d, 0xf1, 0x61, 0xf8, 0xc0, 0x64, 0xc6, 0x18, 0x61, 0x6c, 0xc3, 0x1c, 0xf9, 0x6c, 0xfa, 0xeb, 0x17, 0x42, - 0xea, 0x4d, 0x12, 0x11, 0x81, 0x7c, 0x90, 0x7c, 0x30, 0x22, 0xfd, 0xa7, 0x25, 0x56, 0x3b, 0xbc, 0x70, 0x48, 0x9f, - 0xc4, 0x16, 0x0e, 0x84, 0xcd, 0xfa, 0xd1, 0x6f, 0x98, 0x64, 0xde, 0xbe, 0x38, 0x41, 0x7e, 0x09, 0x6e, 0xd8, 0xde, - 0x6a, 0x08, 0xaa, 0x18, 0xad, 0x10, 0xc4, 0x0a, 0x1a, 0x21, 0x9e, 0xc0, 0xf9, 0x26, 0x63, 0xd5, 0xab, 0x25, 0x2e, - 0x73, 0x45, 0x83, 0x7f, 0xf6, 0x6d, 0x5a, 0x24, 0x3d, 0x88, 0xf7, 0x03, 0x59, 0xcf, 0xb0, 0x87, 0xa0, 0xc7, 0xc2, - 0x8a, 0xe4, 0xbb, 0x42, 0x96, 0xae, 0xe3, 0xd3, 0x49, 0xaa, 0xf7, 0xa4, 0x5f, 0x3f, 0xc0, 0x1e, 0xb4, 0xa9, 0x2d, - 0x34, 0x7f, 0x85, 0xaa, 0x0a, 0xf3, 0x7a, 0x33, 0xca, 0xa3, 0x25, 0x9b, 0xee, 0x08, 0x74, 0x10, 0x08, 0xb5, 0xd6, - 0x4b, 0x03, 0x8c, 0xe3, 0xfb, 0xb0, 0x19, 0x3d, 0x7e, 0x5d, 0xc4, 0x84, 0xab, 0x97, 0x2d, 0x45, 0x69, 0x93, 0x46, - 0x8f, 0xfb, 0xae, 0x59, 0x76, 0x19, 0x22, 0x88, 0xc4, 0x1f, 0x47, 0xd0, 0x66, 0x5c, 0x0b, 0x17, 0xd1, 0x09, 0x86, - 0x96, 0x2b, 0x9e, 0xb8, 0x47, 0xdd, 0x2f, 0xbb, 0xe7, 0xdb, 0xe6, 0x49, 0x0c, 0x58, 0x8a, 0xf8, 0xae, 0xac, 0xcd, - 0x39, 0x94, 0xa2, 0x74, 0x9b, 0xc0, 0x2c, 0x47, 0x7a, 0x8c, 0x47, 0xf2, 0x48, 0xd4, 0x01, 0x83, 0x68, 0x54, 0x7c, - 0x67, 0x65, 0xe0, 0x6e, 0xad, 0xb5, 0xf8, 0xf2, 0xf7, 0x7e, 0xfd, 0x7a, 0xb7, 0x42, 0xbd, 0x0c, 0x5e, 0x4e, 0xed, - 0x19, 0xef, 0xbc, 0x20, 0xa5, 0xbe, 0x88, 0xc1, 0xeb, 0xc7, 0xbc, 0x8a, 0x66, 0xdf, 0x35, 0x04, 0xa1, 0x85, 0xcb, - 0x7f, 0x0b, 0x8f, 0x3a, 0x2d, 0xd3, 0xa5, 0xa7, 0xaf, 0xa6, 0x9b, 0x4e, 0x97, 0xef, 0xe8, 0xc1, 0xad, 0x10, 0x21, - 0x61, 0x54, 0x63, 0xed, 0x93, 0x73, 0x8b, 0xc9, 0x97, 0xd1, 0xda, 0xa5, 0x55, 0x51, 0xc1, 0xe7, 0x1c, 0xdd, 0x0d, - 0xaa, 0x5b, 0xb8, 0xa9, 0x72, 0xfb, 0xe8, 0xad, 0xa8, 0xa2, 0xa1, 0x87, 0x0b, 0xa7, 0x44, 0x12, 0x85, 0xc8, 0x4b, - 0x98, 0xd8, 0x7d, 0x37, 0xa4, 0x81, 0x71, 0x75, 0x75, 0x4a, 0x75, 0x83, 0xc7, 0xd0, 0xc3, 0x10, 0x24, 0xae, 0xd9, - 0xf9, 0xff, 0xd2, 0xeb, 0xc1, 0x9b, 0x97, 0x3e, 0x25, 0x99, 0x17, 0xfe, 0x5d, 0x5a, 0xb8, 0xc5, 0x17, 0xfc, 0x8c, - 0x96, 0xa0, 0x65, 0xcb, 0xa3, 0xb2, 0x03, 0xeb, 0xa1, 0x3d, 0xd0, 0xbf, 0xae, 0x27, 0x9b, 0x55, 0x00, 0x5a, 0x5b, - 0x9e, 0x64, 0x34, 0x31, 0x7a, 0x72, 0xde, 0xa1, 0x50, 0x44, 0x42, 0x0e, 0xa3, 0x44, 0xad, 0x75, 0x20, 0xc3, 0x55, - 0x77, 0x5a, 0x0a, 0xb7, 0xb1, 0xbb, 0x9e, 0x59, 0x88, 0xe8, 0x48, 0x2f, 0x49, 0x66, 0x2e, 0x34, 0x21, 0xa8, 0x92, - 0xc8, 0x0f, 0x88, 0x6d, 0x81, 0xe3, 0x41, 0x73, 0x62, 0xeb, 0xa3, 0xd0, 0x52, 0x40, 0x18, 0xb7, 0x57, 0xf1, 0x35, - 0x01, 0x84, 0xd2, 0xba, 0xf3, 0x66, 0xbb, 0x70, 0xf9, 0x37, 0x6d, 0x65, 0x0c, 0x36, 0x3a, 0x77, 0x56, 0x71, 0x81, - 0x5b, 0xdd, 0x8b, 0x21, 0x88, 0x02, 0x25, 0x05, 0x31, 0x9c, 0x04, 0xd5, 0x07, 0x73, 0x20, 0x01, 0x97, 0xc8, 0x83, - 0x52, 0xe3, 0x5c, 0xb8, 0xf1, 0x46, 0x21, 0xc4, 0x62, 0x24, 0xaa, 0x62, 0xb2, 0x41, 0x70, 0x4c, 0x05, 0xda, 0xfd, - 0xf4, 0xdc, 0x7b, 0xe1, 0xfe, 0xa1, 0xa6, 0x56, 0x73, 0xa1, 0x08, 0xa3, 0xdd, 0xc9, 0xbd, 0xa0, 0x85, 0x64, 0xab, - 0x5e, 0xae, 0x91, 0xbd, 0xf0, 0xcd, 0x73, 0xef, 0x2b, 0x25, 0x20, 0xec, 0xdf, 0x19, 0x07, 0x02, 0x60, 0x2e, 0xed, - 0x6a, 0x2d, 0xd1, 0xdf, 0x9e, 0x48, 0xb3, 0xa1, 0xa5, 0x58, 0x37, 0xf3, 0x50, 0x01, 0xd6, 0xd4, 0xea, 0x09, 0x4b, - 0x59, 0xe5, 0x8d, 0x66, 0xa7, 0x86, 0xb7, 0x1d, 0x74, 0x75, 0x92, 0xc2, 0x93, 0xee, 0xff, 0xbd, 0x1f, 0x5e, 0xab, - 0x6e, 0x85, 0xa0, 0x3a, 0x93, 0x74, 0x16, 0x32, 0xd5, 0x7a, 0x1a, 0x53, 0x9c, 0xa4, 0xef, 0x04, 0x45, 0x45, 0x68, - 0xfc, 0x53, 0xd1, 0xd9, 0xf8, 0xa9, 0xeb, 0x03, 0xf7, 0x03, 0x2e, 0x28, 0xbe, 0xc9, 0x3a, 0x7e, 0x98, 0x45, 0x44, - 0x64, 0xe5, 0x67, 0xbb, 0xbc, 0x76, 0xdd, 0xa6, 0x33, 0xf3, 0xd2, 0x6d, 0x74, 0x9b, 0x7f, 0x83, 0x25, 0x1f, 0x8a, - 0x92, 0x97, 0xb4, 0x85, 0xa3, 0x5f, 0xe0, 0x7a, 0x28, 0xd3, 0x81, 0x21, 0x73, 0xeb, 0xba, 0xfe, 0x51, 0x31, 0xd2, - 0xd4, 0x11, 0x4f, 0x99, 0x43, 0x05, 0x9e, 0x9a, 0x9b, 0x4a, 0x0e, 0x94, 0xce, 0x30, 0x5f, 0x13, 0xe1, 0xcd, 0xde, - 0x31, 0xfd, 0x73, 0x41, 0x74, 0x7c, 0x04, 0xd3, 0x86, 0x7c, 0x58, 0x85, 0xe7, 0xe2, 0x58, 0xfd, 0x60, 0x35, 0x89, - 0x3c, 0x89, 0x03, 0xbc, 0x0f, 0x2c, 0x52, 0x61, 0x62, 0xe0, 0x6b, 0x76, 0x3b, 0xce, 0x17, 0x80, 0x19, 0x0f, 0xb9, - 0x4f, 0x77, 0xfc, 0x10, 0x04, 0x8e, 0x17, 0xaa, 0xc5, 0xcd, 0xe1, 0x2d, 0x08, 0x80, 0x8c, 0x59, 0x71, 0x5a, 0x8c, - 0xf2, 0x24, 0x25, 0xe0, 0x99, 0x5c, 0xba, 0x55, 0x43, 0x2a, 0xb3, 0x3f, 0x04, 0x94, 0x4b, 0xd7, 0x42, 0x0a, 0x6e, - 0xd5, 0x17, 0xa6, 0x84, 0x74, 0xd7, 0x68, 0xb0, 0x85, 0x7f, 0x2c, 0x88, 0x25, 0x0d, 0xea, 0x1a, 0xbf, 0xed, 0x57, - 0xee, 0xa4, 0x73, 0xe2, 0x3a, 0x4a, 0x5d, 0x22, 0x89, 0xfb, 0x3c, 0x8c, 0x04, 0x82, 0x99, 0x3d, 0x21, 0xb2, 0x18, - 0x62, 0x1f, 0x47, 0x3b, 0x02, 0xf0, 0x04, 0xa2, 0x23, 0xcf, 0xec, 0x5e, 0x40, 0x7c, 0x7a, 0x82, 0xb0, 0x2c, 0x7f, - 0x23, 0xe3, 0xd7, 0xd7, 0xc3, 0xec, 0x89, 0x62, 0x78, 0x25, 0xf1, 0x54, 0xc5, 0x12, 0x49, 0x43, 0x6b, 0xc0, 0xd2, - 0x15, 0xc9, 0x65, 0xe4, 0x19, 0x71, 0x7e, 0x66, 0x7d, 0x02, 0x7e, 0xec, 0x63, 0x38, 0xf0, 0xeb, 0x40, 0x5f, 0xa4, - 0x54, 0xf9, 0x36, 0x12, 0xe7, 0xd5, 0x7b, 0x73, 0xfd, 0x70, 0x27, 0xe9, 0xea, 0xd5, 0xa3, 0x6d, 0x68, 0x6c, 0x92, - 0xf4, 0x6f, 0xcd, 0x43, 0x80, 0x63, 0x9d, 0xa4, 0x33, 0x14, 0xc6, 0x64, 0x79, 0xd8, 0xb0, 0xea, 0x62, 0xe8, 0xce, - 0x03, 0xee, 0xa6, 0xba, 0x23, 0x75, 0xf8, 0xd2, 0xa4, 0x27, 0x85, 0x59, 0xd2, 0xd8, 0x25, 0xe9, 0xdf, 0xaa, 0x74, - 0x38, 0x54, 0x29, 0x46, 0xe4, 0xb2, 0x22, 0x46, 0xa6, 0x1d, 0xdc, 0x49, 0xfc, 0xb6, 0xe4, 0x9d, 0x80, 0x97, 0x36, - 0xf5, 0x79, 0x57, 0x2b, 0x26, 0xb4, 0x8c, 0xc9, 0x93, 0xb7, 0x76, 0x58, 0x69, 0xa1, 0x54, 0xb2, 0x40, 0x36, 0x65, - 0xa1, 0x51, 0xf0, 0x53, 0xdf, 0xfc, 0xf0, 0x83, 0xa2, 0x32, 0x10, 0x70, 0x3b, 0x58, 0xfd, 0xe3, 0x83, 0x78, 0x19, - 0x43, 0x3c, 0x32, 0x32, 0xa6, 0x7f, 0xc9, 0x50, 0xf7, 0x4f, 0x20, 0x93, 0xf0, 0x75, 0x76, 0xbf, 0x34, 0xf7, 0x17, - 0x6a, 0x1d, 0x8c, 0xeb, 0x68, 0x43, 0x13, 0xf8, 0x26, 0x14, 0xee, 0x87, 0xca, 0xc0, 0x46, 0x29, 0x43, 0xbe, 0x2f, - 0x6d, 0x9e, 0x7b, 0xe2, 0x27, 0x41, 0xf1, 0x69, 0x86, 0x59, 0xc8, 0x08, 0xa0, 0xfa, 0x70, 0x32, 0xe9, 0xba, 0x43, - 0x6d, 0x7b, 0xab, 0xa9, 0x74, 0x76, 0xd4, 0x31, 0x41, 0xce, 0xf3, 0xa3, 0x19, 0x56, 0x9e, 0xbf, 0x36, 0xf9, 0x06, - 0x81, 0xcf, 0x9d, 0xf7, 0xa6, 0x5a, 0x07, 0x6a, 0xbf, 0x9c, 0x11, 0xb4, 0x2d, 0x03, 0x1c, 0xa9, 0x72, 0xa8, 0x8e, - 0x54, 0x0c, 0x2b, 0x33, 0xde, 0x98, 0xe2, 0xc5, 0x16, 0x7b, 0x9c, 0x2f, 0x21, 0x15, 0xb0, 0x1f, 0x90, 0xb2, 0xe4, - 0x98, 0xd5, 0x22, 0x65, 0x6f, 0x22, 0x05, 0x11, 0xca, 0x6f, 0x5e, 0x1e, 0xfc, 0xdd, 0x64, 0x84, 0x15, 0x58, 0xab, - 0x8e, 0x24, 0x5b, 0x9b, 0xc8, 0x69, 0x2d, 0xa9, 0x8a, 0xf3, 0x46, 0x19, 0x66, 0xbf, 0xeb, 0xcf, 0xcb, 0x26, 0x98, - 0xda, 0xc5, 0xa7, 0xe6, 0x60, 0x8d, 0x16, 0xa6, 0xa7, 0xc2, 0xfe, 0x82, 0x0f, 0x3d, 0x21, 0xbf, 0x19, 0xfc, 0xb2, - 0xaf, 0x6d, 0x18, 0x3c, 0x6a, 0x5f, 0x61, 0x43, 0xa5, 0x75, 0x31, 0xf5, 0xa2, 0x61, 0xb2, 0x2d, 0x7f, 0x7e, 0x2a, - 0xf7, 0x18, 0xb9, 0xc2, 0x8c, 0xc0, 0x1a, 0x95, 0x77, 0xc1, 0x01, 0xe1, 0x63, 0x44, 0x91, 0x1b, 0xb6, 0x45, 0x06, - 0x05, 0xdb, 0x46, 0xd3, 0xae, 0xf4, 0x31, 0x07, 0x79, 0x12, 0x84, 0x4e, 0x76, 0xc2, 0x3b, 0x5f, 0xbd, 0x32, 0x2c, - 0x8b, 0x24, 0xcd, 0x8b, 0xa8, 0xd2, 0x87, 0x55, 0xd5, 0x48, 0xe3, 0xbf, 0x00, 0x60, 0x14, 0xce, 0x97, 0xc2, 0xbf, - 0x29, 0x5c, 0xe3, 0x9d, 0xde, 0xaa, 0x91, 0x72, 0x8e, 0xc7, 0xbc, 0x9b, 0xb1, 0xc3, 0x0f, 0xc2, 0x97, 0xdc, 0xcf, - 0xa8, 0xc0, 0x3c, 0x2d, 0x0b, 0xb3, 0x35, 0xfc, 0x5a, 0x81, 0xdc, 0x3e, 0x12, 0xe7, 0x36, 0x6c, 0xa6, 0x53, 0x7b, - 0xd3, 0x97, 0x1b, 0x84, 0xcc, 0x19, 0xcd, 0xf2, 0xf5, 0x87, 0x87, 0x01, 0x75, 0x11, 0x7e, 0x3b, 0x16, 0xea, 0x51, - 0xb6, 0x74, 0xf0, 0x02, 0x1e, 0xae, 0x69, 0x29, 0x7a, 0xbe, 0xa9, 0x9d, 0xc8, 0x1f, 0x6f, 0x7c, 0x00, 0x6d, 0xef, - 0x75, 0x8c, 0x36, 0xd1, 0x43, 0x4a, 0x01, 0x22, 0x0b, 0x6d, 0xab, 0xaa, 0x66, 0xc8, 0xb2, 0x60, 0xb9, 0x0d, 0xbc, - 0xa7, 0x96, 0x08, 0x87, 0xef, 0xda, 0xd3, 0x85, 0x35, 0xfe, 0x58, 0x00, 0xfc, 0xfb, 0x8c, 0x88, 0x0a, 0xe5, 0x7f, - 0x87, 0xed, 0x19, 0x26, 0x22, 0xee, 0x08, 0xc9, 0x60, 0xc0, 0xc8, 0x43, 0x36, 0x23, 0x29, 0xd8, 0x6a, 0xa5, 0x00, - 0xbe, 0x87, 0x40, 0xe3, 0xba, 0x06, 0x21, 0xd8, 0xa0, 0xd7, 0x40, 0x3c, 0x1c, 0x2f, 0xa8, 0x6b, 0xbc, 0x36, 0x7e, - 0xbb, 0xd6, 0x9a, 0x30, 0xe2, 0xdb, 0xaa, 0x59, 0xbc, 0x56, 0x3d, 0x52, 0x39, 0x92, 0x10, 0x79, 0xa3, 0xa0, 0xd5, - 0x9b, 0x4e, 0xf7, 0xd3, 0x64, 0x44, 0x0a, 0x6a, 0x9d, 0x1b, 0x91, 0xf2, 0x4b, 0xb1, 0x39, 0xf5, 0x87, 0x94, 0x87, - 0x2c, 0x8f, 0xb9, 0x12, 0xd5, 0xb5, 0x08, 0x61, 0xd8, 0x75, 0xf4, 0xaf, 0xa1, 0x84, 0x21, 0x5f, 0x52, 0x19, 0x14, - 0x32, 0x53, 0x59, 0x20, 0x0d, 0xe5, 0x49, 0xe4, 0xee, 0x87, 0xe9, 0xea, 0xdd, 0xab, 0xdc, 0x27, 0xa9, 0x28, 0x89, - 0xdd, 0x85, 0x48, 0x93, 0x89, 0x37, 0xa6, 0xfd, 0xf6, 0x3f, 0x23, 0xe5, 0xdf, 0x54, 0x1d, 0x53, 0x8d, 0x25, 0xb1, - 0xd0, 0x00, 0xa5, 0x7c, 0xc4, 0xd3, 0x36, 0x5d, 0x8e, 0xa2, 0xad, 0xd2, 0x1e, 0x6a, 0x1e, 0x78, 0x58, 0x58, 0x13, - 0xc7, 0x11, 0xf4, 0x74, 0x84, 0xd8, 0x92, 0xda, 0x42, 0xd7, 0xa7, 0x99, 0x67, 0x45, 0x6d, 0x76, 0x8f, 0x54, 0xcb, - 0xe8, 0xa0, 0x35, 0x91, 0x34, 0xfb, 0xa9, 0xcb, 0x34, 0x90, 0x0a, 0x81, 0xef, 0x82, 0xdc, 0x2a, 0x4a, 0x5c, 0xaf, - 0xee, 0xdd, 0x43, 0xb5, 0xf2, 0x3b, 0xff, 0x74, 0x0b, 0x22, 0x23, 0x81, 0x81, 0x14, 0xd1, 0xbc, 0xa0, 0x9f, 0x18, - 0x96, 0xc1, 0x90, 0x33, 0x25, 0xb3, 0x9c, 0xb7, 0x00, 0xed, 0x91, 0xb6, 0x82, 0x0b, 0x12, 0x46, 0xe7, 0x58, 0x2b, - 0x83, 0xcf, 0x91, 0x22, 0x5f, 0xb5, 0xc5, 0xcc, 0x5e, 0xdd, 0xd3, 0x02, 0x53, 0x01, 0xac, 0x2b, 0x05, 0xcb, 0x59, - 0xdf, 0x28, 0xaa, 0xd8, 0xc8, 0xe4, 0xc7, 0x5f, 0xd0, 0x3d, 0xa5, 0x0c, 0x9d, 0x15, 0xae, 0x34, 0x6d, 0x3b, 0x97, - 0xc7, 0xee, 0x83, 0x02, 0x7c, 0xa2, 0x81, 0xcc, 0x4b, 0xf2, 0x9f, 0x9d, 0x6d, 0xd8, 0x7d, 0x52, 0xce, 0x77, 0x13, - 0xfd, 0xde, 0x48, 0xb3, 0xbf, 0x2e, 0x75, 0x28, 0xdb, 0xaf, 0x3c, 0xae, 0x5a, 0xe6, 0x3d, 0xd2, 0xe7, 0xc6, 0x64, - 0x44, 0x26, 0xb4, 0xcb, 0xfa, 0x36, 0xc2, 0xcd, 0xed, 0x33, 0x85, 0xc7, 0x37, 0xbc, 0x9c, 0x3f, 0x69, 0xc5, 0x36, - 0xa5, 0x8e, 0x94, 0xd8, 0x48, 0x14, 0x18, 0x64, 0x91, 0x9f, 0x78, 0x8a, 0x6e, 0xef, 0xa8, 0xad, 0x77, 0xea, 0xae, - 0x93, 0x13, 0x71, 0xe6, 0xea, 0x46, 0x52, 0xa5, 0x11, 0x76, 0xf3, 0x3c, 0xf2, 0xb2, 0x56, 0xd0, 0x8c, 0xd2, 0x43, - 0xed, 0xf6, 0x8e, 0x11, 0x1a, 0x56, 0x4a, 0x8a, 0x6c, 0x51, 0x1b, 0x2d, 0x07, 0x7a, 0xc8, 0x5f, 0x6b, 0x7e, 0xfe, - 0x67, 0x0b, 0x71, 0xe3, 0x70, 0xfa, 0x8a, 0x44, 0x44, 0x61, 0x10, 0xa7, 0x55, 0x24, 0xdb, 0x99, 0x40, 0x61, 0x1c, - 0x4c, 0xb0, 0x75, 0xa3, 0xa9, 0x87, 0x45, 0xa2, 0x96, 0x48, 0xc3, 0xf6, 0x28, 0x0f, 0x81, 0x2a, 0x09, 0x3d, 0x6d, - 0xad, 0x4e, 0xa2, 0xf5, 0x87, 0x6b, 0x9f, 0x11, 0xa1, 0x55, 0x8a, 0xac, 0xca, 0x2b, 0x57, 0x68, 0x04, 0x26, 0x12, - 0x89, 0x8e, 0x20, 0x0e, 0x4d, 0x08, 0x1f, 0x1e, 0xd2, 0x4b, 0xab, 0x22, 0x86, 0x56, 0x5c, 0x43, 0x66, 0x01, 0xc4, - 0x26, 0x63, 0xfa, 0x7a, 0xbf, 0x63, 0x19, 0xd7, 0xcb, 0x83, 0x56, 0xff, 0x91, 0x88, 0x13, 0xa4, 0xfb, 0xa2, 0x03, - 0x8c, 0x06, 0x1c, 0x55, 0xc1, 0xb7, 0x8f, 0xa1, 0xa8, 0x74, 0xa0, 0x5e, 0x8e, 0xdc, 0x22, 0xf2, 0x2b, 0xe0, 0xda, - 0xdd, 0x8a, 0x08, 0xdf, 0x2e, 0x9f, 0xd3, 0xac, 0x96, 0x11, 0xd4, 0xbe, 0x8f, 0x68, 0x95, 0x89, 0xb0, 0xb9, 0xb8, - 0xeb, 0xb1, 0x5c, 0x43, 0xd5, 0x87, 0x56, 0x5c, 0x44, 0xe1, 0xcd, 0x1c, 0xa4, 0x8d, 0xc9, 0x78, 0x49, 0x3f, 0xb5, - 0x1d, 0x95, 0x80, 0x5e, 0x28, 0x0b, 0x4d, 0x06, 0x49, 0xc1, 0xa3, 0xf7, 0x40, 0x98, 0xa4, 0x57, 0xce, 0x98, 0xfd, - 0x94, 0xa7, 0x24, 0x4e, 0xdf, 0x82, 0x76, 0x36, 0x45, 0xf0, 0x70, 0xd5, 0x5e, 0xda, 0x53, 0xd0, 0x7e, 0xcf, 0x74, - 0xb6, 0xbd, 0xac, 0x91, 0x78, 0x2f, 0x3a, 0xf0, 0x2a, 0xfa, 0x3c, 0x32, 0xc3, 0x98, 0xc1, 0xfd, 0x90, 0x90, 0xe4, - 0xb3, 0x94, 0x0a, 0x66, 0x41, 0x0f, 0xe4, 0x51, 0x91, 0x8c, 0xd2, 0x4c, 0xb7, 0xfd, 0x91, 0xe8, 0xfa, 0x69, 0xaa, - 0x76, 0xb5, 0xf6, 0x14, 0x55, 0x5e, 0xbe, 0x5e, 0xf8, 0xed, 0xf4, 0x8c, 0xae, 0xdc, 0x01, 0xc9, 0x7a, 0x46, 0x6f, - 0x5a, 0xb0, 0x5a, 0x28, 0x1d, 0xa9, 0x20, 0xf6, 0x3e, 0x27, 0xb0, 0x18, 0xd7, 0x43, 0x1a, 0xd6, 0xe0, 0x03, 0xa6, - 0x27, 0xab, 0xd3, 0x77, 0xce, 0x7d, 0xd9, 0xff, 0xf6, 0xdd, 0x76, 0x83, 0x35, 0x73, 0xf1, 0x07, 0xb9, 0x4b, 0x40, - 0xcd, 0x21, 0xd3, 0x64, 0xd2, 0x57, 0x69, 0x37, 0x27, 0xaf, 0x12, 0xb3, 0x70, 0x80, 0xfe, 0xdd, 0x1c, 0x72, 0xc2, - 0x3a, 0xde, 0xb8, 0x44, 0xf4, 0xd4, 0xbb, 0x70, 0xda, 0x13, 0x07, 0xf0, 0x2f, 0x18, 0x26, 0x4a, 0x88, 0x64, 0x2e, - 0xe1, 0x61, 0x5e, 0xc2, 0x51, 0xf2, 0x43, 0xb6, 0xcd, 0x54, 0xef, 0xa8, 0x6e, 0xde, 0x14, 0xd8, 0xf3, 0x14, 0x17, - 0xbb, 0x55, 0xc2, 0x8c, 0x55, 0xec, 0xb5, 0xd8, 0x43, 0x8f, 0x37, 0x28, 0x92, 0xcc, 0xf6, 0x19, 0x0d, 0x9d, 0xf9, - 0x4d, 0x7e, 0x7d, 0x71, 0x73, 0x37, 0xfd, 0x7f, 0x5c, 0x9d, 0x18, 0x87, 0x15, 0x7c, 0x36, 0xf4, 0x65, 0xbf, 0x2a, - 0xcb, 0xe7, 0x12, 0x5f, 0xad, 0x96, 0x77, 0x94, 0x8c, 0x7b, 0x9b, 0xf8, 0xc1, 0x00, 0x06, 0x6f, 0x5a, 0x48, 0x1e, - 0x4a, 0x14, 0x61, 0x64, 0xde, 0x1f, 0x2e, 0x29, 0xf0, 0x72, 0xf9, 0x55, 0x70, 0x91, 0x98, 0xfe, 0xb6, 0xf5, 0x4a, - 0x2a, 0xe2, 0x90, 0xaa, 0x23, 0xde, 0x4d, 0x10, 0x69, 0x51, 0x0e, 0x1d, 0xfd, 0xc4, 0x01, 0x93, 0x35, 0x38, 0x10, - 0x81, 0x82, 0xce, 0x67, 0x2f, 0x89, 0xc4, 0x8f, 0xd0, 0x5f, 0x79, 0x16, 0x75, 0xda, 0x8b, 0xf6, 0xb3, 0xed, 0x85, - 0xff, 0x7f, 0xba, 0xb4, 0xaa, 0x73, 0x6c, 0x40, 0xb0, 0xfe, 0x2f, 0x90, 0xb8, 0xd0, 0x0e, 0x4a, 0x90, 0xee, 0x53, - 0xf8, 0xc4, 0x9f, 0xdd, 0x69, 0x96, 0x13, 0x96, 0xaf, 0xd5, 0x6a, 0x19, 0x4f, 0xe8, 0x9c, 0x5c, 0x68, 0x1c, 0x27, - 0x6a, 0xca, 0x10, 0x3c, 0xe3, 0xe8, 0xed, 0xb5, 0x0c, 0xbd, 0xdb, 0x98, 0x4a, 0x82, 0x4e, 0xe2, 0x71, 0xc5, 0x52, - 0xac, 0xa2, 0x75, 0xbf, 0x6a, 0x63, 0xb6, 0x99, 0xc1, 0x19, 0x30, 0xce, 0xb2, 0x80, 0xd1, 0x83, 0xa5, 0x7a, 0x38, - 0x37, 0x0e, 0x98, 0x5e, 0xcb, 0x6b, 0x4c, 0x47, 0x04, 0x8d, 0xdd, 0xf2, 0xf5, 0x7a, 0x14, 0x51, 0x49, 0x26, 0x22, - 0xde, 0x2d, 0xf0, 0x40, 0x2f, 0x7e, 0x3e, 0x56, 0xbd, 0xf6, 0xa4, 0x6e, 0xe5, 0x2b, 0x15, 0x61, 0x59, 0x47, 0x53, - 0x19, 0x30, 0x5e, 0xdd, 0xac, 0x8a, 0xd0, 0xae, 0x84, 0xb8, 0x78, 0x21, 0x7b, 0x02, 0x31, 0x31, 0x92, 0x8f, 0x38, - 0x93, 0x60, 0x93, 0x83, 0x4c, 0x05, 0xe5, 0xe3, 0x43, 0xcd, 0x16, 0x04, 0xa1, 0xab, 0xdb, 0x50, 0x0b, 0x72, 0x2c, - 0x9c, 0x27, 0x92, 0x11, 0x4d, 0x12, 0x03, 0x57, 0x59, 0x49, 0xb0, 0x6a, 0x26, 0xe3, 0x65, 0xd6, 0x9d, 0x15, 0x7b, - 0x60, 0x53, 0xad, 0x39, 0x18, 0xdd, 0xff, 0x98, 0x17, 0x18, 0xa2, 0x28, 0x5a, 0xcf, 0x12, 0xc5, 0xf3, 0x88, 0x79, - 0xc0, 0x2c, 0x4b, 0xa0, 0x51, 0x84, 0x22, 0xf4, 0x6f, 0x89, 0x3d, 0xd4, 0x67, 0x95, 0x91, 0x58, 0x58, 0x0c, 0x27, - 0x54, 0xc5, 0xe9, 0x28, 0xed, 0x95, 0x85, 0xf7, 0xc1, 0x6e, 0x10, 0xc6, 0x57, 0xff, 0xd7, 0xf8, 0xee, 0x6d, 0x0f, - 0xa9, 0xed, 0xf9, 0x38, 0x9b, 0x99, 0x8f, 0xe9, 0x46, 0xef, 0xf6, 0x4f, 0x37, 0x22, 0x36, 0xbb, 0xad, 0x6c, 0x03, - 0x91, 0x4c, 0x14, 0x94, 0x9a, 0x3f, 0xb3, 0xdb, 0x03, 0xb6, 0xe2, 0xa0, 0x78, 0xdd, 0xa9, 0xa8, 0xcf, 0xd6, 0x6a, - 0x2c, 0x01, 0x08, 0xc7, 0x92, 0x46, 0xda, 0x25, 0xb6, 0x20, 0xd2, 0xfa, 0x1c, 0x19, 0x12, 0xbc, 0xb6, 0xce, 0xf3, - 0x00, 0x0e, 0x59, 0x32, 0x4d, 0x04, 0x2b, 0xd2, 0x4b, 0x00, 0x69, 0x1b, 0x21, 0xbd, 0xc8, 0x9e, 0x41, 0x09, 0xc0, - 0xab, 0x88, 0xf6, 0x46, 0x65, 0x22, 0x92, 0x37, 0x59, 0xa3, 0x14, 0xb6, 0xe3, 0x03, 0xe1, 0x65, 0x7e, 0x44, 0xb0, - 0xc4, 0xd4, 0x68, 0xcf, 0x96, 0x4e, 0x13, 0x50, 0x8b, 0xed, 0x34, 0x42, 0x98, 0xef, 0xd7, 0x8d, 0xc1, 0xc3, 0xe1, - 0x62, 0x49, 0x8a, 0x71, 0xb5, 0xde, 0x7c, 0x2c, 0xe5, 0x76, 0xe4, 0x5a, 0xec, 0x98, 0x3b, 0x70, 0x34, 0xe9, 0x9e, - 0xa6, 0x5d, 0xbd, 0xd1, 0xcd, 0xaf, 0xf8, 0xcd, 0xeb, 0x69, 0x89, 0x97, 0xc7, 0x47, 0x42, 0xf7, 0xae, 0x46, 0xa0, - 0xb9, 0x71, 0xce, 0x0f, 0xfd, 0xee, 0x5d, 0x9d, 0xe0, 0x8d, 0xff, 0x95, 0x1a, 0x4f, 0xca, 0xe4, 0xe4, 0x6f, 0xe6, - 0xd0, 0xf8, 0x8c, 0xf1, 0xb4, 0xb8, 0xa9, 0x40, 0xa0, 0x40, 0xd5, 0x01, 0xec, 0xce, 0xa2, 0xd2, 0x7f, 0x33, 0x62, - 0x7c, 0x04, 0x5c, 0x28, 0x3a, 0x35, 0xf8, 0x69, 0x49, 0x78, 0xc6, 0xf3, 0xd9, 0x2d, 0xd4, 0x22, 0x69, 0xa5, 0xce, - 0xc4, 0x4e, 0x1d, 0x7e, 0x2e, 0xf6, 0x0f, 0x2b, 0x22, 0x3a, 0x14, 0xf1, 0x61, 0x37, 0x05, 0x05, 0x41, 0xc3, 0x0b, - 0x62, 0x99, 0xa0, 0x0b, 0xa1, 0x7c, 0xd4, 0xec, 0xbe, 0x4c, 0x52, 0xfd, 0xc3, 0xfe, 0x82, 0x9f, 0x7b, 0xdb, 0xd7, - 0x22, 0x17, 0x4b, 0xa1, 0x59, 0xd9, 0x48, 0x27, 0x0f, 0x2e, 0x15, 0x6d, 0xaf, 0x82, 0xec, 0x6c, 0xde, 0x9a, 0x35, - 0x99, 0x03, 0xc9, 0x22, 0x2d, 0xc2, 0xfa, 0xc8, 0x73, 0xfe, 0xd9, 0xe2, 0x73, 0xba, 0x74, 0xdf, 0x37, 0x63, 0xdb, - 0x64, 0x98, 0xf4, 0x24, 0x81, 0x30, 0x51, 0x82, 0x6f, 0xcb, 0xe8, 0x01, 0x60, 0x7d, 0x6d, 0x39, 0xa2, 0xcc, 0x56, - 0x01, 0x99, 0xc9, 0x76, 0x7e, 0xed, 0x29, 0x20, 0xea, 0x6c, 0x05, 0x12, 0x31, 0x94, 0x3e, 0x03, 0x17, 0x34, 0x3e, - 0xb5, 0x20, 0x49, 0x89, 0x09, 0xc9, 0x0c, 0x1f, 0x01, 0x99, 0x02, 0x6e, 0xbe, 0xf3, 0x64, 0x0b, 0xfd, 0x54, 0xc6, - 0x29, 0xb0, 0x61, 0x5a, 0x0f, 0xe6, 0x2c, 0x8c, 0x67, 0x1a, 0x32, 0xe2, 0xf8, 0xe7, 0x1b, 0x81, 0xd5, 0x88, 0x3c, - 0x8f, 0xcc, 0x6c, 0x24, 0x2e, 0x60, 0x70, 0xd9, 0xf7, 0x92, 0x26, 0x10, 0xd7, 0xaf, 0x71, 0x8d, 0xf9, 0x24, 0x8f, - 0xd7, 0xea, 0xe6, 0xb7, 0xe6, 0x6f, 0x3d, 0x94, 0x67, 0xf9, 0xe2, 0xa4, 0x36, 0xad, 0x15, 0xf4, 0xcb, 0xb5, 0x56, - 0x1b, 0xa0, 0x56, 0xc1, 0xcc, 0x96, 0x8c, 0x5b, 0x69, 0x51, 0x04, 0x8e, 0x9a, 0xe5, 0xad, 0xd9, 0x1d, 0xdf, 0x6e, - 0x90, 0x3f, 0xd1, 0x10, 0x31, 0x3e, 0x55, 0x81, 0x4b, 0xd4, 0xf1, 0x73, 0xf4, 0x36, 0x87, 0x76, 0x18, 0xaf, 0xe2, - 0x87, 0x6d, 0xbc, 0xc8, 0xd8, 0xca, 0xf2, 0xf2, 0x75, 0x74, 0x88, 0x2b, 0x47, 0xeb, 0x30, 0x34, 0xfd, 0x34, 0x8d, - 0x39, 0x52, 0xa8, 0x27, 0xec, 0xf8, 0x7b, 0x0c, 0xf8, 0x4f, 0xed, 0xf1, 0xab, 0xfe, 0x93, 0xe3, 0x5f, 0x86, 0x5d, - 0xe5, 0x65, 0xfe, 0x63, 0x90, 0xbf, 0x87, 0x4f, 0xa9, 0xf2, 0xb3, 0x89, 0x2c, 0x54, 0x9b, 0x43, 0xf2, 0x68, 0x2d, - 0x87, 0x05, 0xfa, 0xea, 0xc3, 0xc9, 0xe9, 0x04, 0xc3, 0x9a, 0x53, 0xe7, 0x07, 0xa4, 0xaf, 0x6b, 0xe2, 0xc2, 0x2f, - 0xc6, 0xa7, 0xab, 0xb9, 0x0c, 0xdd, 0x74, 0xb9, 0x87, 0x54, 0xee, 0x8b, 0x4c, 0xb5, 0xad, 0xac, 0x9d, 0xfd, 0xfd, - 0x60, 0x70, 0x47, 0x04, 0x36, 0x9c, 0x7b, 0xf3, 0x85, 0xe7, 0x9f, 0xf4, 0x9f, 0xee, 0x29, 0x5a, 0x33, 0x16, 0x5f, - 0xe8, 0x33, 0xad, 0x5c, 0xbe, 0x71, 0x6d, 0xca, 0x36, 0xf4, 0x99, 0xda, 0x74, 0x03, 0x20, 0x26, 0x15, 0x34, 0x28, - 0xeb, 0xdc, 0xc7, 0x1f, 0x14, 0x7d, 0x48, 0x28, 0xfa, 0xd2, 0xe7, 0xa3, 0xda, 0x17, 0x06, 0x11, 0x00, 0x49, 0x0c, - 0x33, 0xf3, 0x97, 0x82, 0xee, 0x84, 0x86, 0x07, 0xfa, 0xe6, 0xe9, 0x27, 0x4e, 0x7d, 0x06, 0xde, 0x1a, 0xf5, 0x0f, - 0x52, 0x5c, 0x5f, 0x81, 0x04, 0xb0, 0x70, 0x9e, 0x2e, 0xff, 0x4f, 0x5e, 0x10, 0x42, 0xd2, 0x9c, 0x2c, 0x6a, 0x3b, - 0x57, 0xdd, 0xff, 0x98, 0x6c, 0xf0, 0x11, 0x1b, 0x24, 0xf8, 0x38, 0x29, 0x26, 0x9e, 0x05, 0x41, 0x75, 0x45, 0xcf, - 0x4d, 0xae, 0xfa, 0xb3, 0x8c, 0x43, 0xfe, 0xf7, 0xb1, 0x3c, 0x5f, 0x40, 0xce, 0x63, 0xc6, 0x77, 0x7e, 0x88, 0xb0, - 0x24, 0xa7, 0x61, 0x67, 0x76, 0x5f, 0xed, 0xcf, 0xa3, 0x81, 0xfa, 0x6a, 0x77, 0x7e, 0x03, 0x09, 0xf8, 0xc2, 0x0f, - 0x6b, 0xa8, 0x51, 0xf9, 0xa3, 0x39, 0xad, 0xbd, 0x4a, 0x1b, 0x7d, 0x42, 0x25, 0x22, 0xb8, 0x94, 0x1c, 0xa0, 0xbe, - 0x48, 0x3a, 0x3f, 0x99, 0x38, 0x66, 0xda, 0x94, 0x1c, 0x74, 0xe3, 0x5c, 0x72, 0xa1, 0x1c, 0x5a, 0x49, 0x1d, 0xa5, - 0x80, 0x9c, 0x94, 0xd1, 0x81, 0x15, 0xdd, 0x5e, 0x4a, 0xc6, 0x8f, 0x8a, 0xd0, 0x2e, 0x9b, 0xcd, 0x35, 0x2b, 0x8b, - 0x99, 0x44, 0x8c, 0x54, 0x70, 0x59, 0xb2, 0x32, 0x41, 0xbf, 0xa8, 0x8d, 0xa9, 0x8d, 0x64, 0xba, 0xb7, 0x59, 0x9d, - 0xba, 0x08, 0x34, 0xb8, 0x72, 0x40, 0x5e, 0xf1, 0x2a, 0x60, 0x4b, 0x48, 0x26, 0xcc, 0x22, 0x56, 0x70, 0xa1, 0xdc, - 0xf7, 0x99, 0xfb, 0x60, 0x7f, 0x9c, 0x04, 0xe7, 0x5b, 0x6f, 0xd1, 0xef, 0x12, 0x9c, 0x82, 0xea, 0xf5, 0xe7, 0xd4, - 0xb5, 0xb8, 0xbc, 0x62, 0x0a, 0x0a, 0x1c, 0x83, 0x7c, 0xba, 0xcb, 0x03, 0x22, 0xf0, 0x43, 0xfb, 0xa4, 0x8e, 0xd3, - 0xd6, 0x7f, 0x46, 0xc7, 0x0c, 0xb2, 0x81, 0x54, 0xe7, 0xbe, 0x2c, 0xb0, 0x9d, 0x2e, 0x5b, 0x22, 0xb7, 0x02, 0x77, - 0x4a, 0x75, 0xdb, 0x0b, 0x94, 0x29, 0xd1, 0x51, 0x11, 0x81, 0x6d, 0x06, 0xd0, 0xb3, 0x15, 0xc1, 0x4b, 0x1f, 0x79, - 0xd6, 0x2c, 0x68, 0xe8, 0x8f, 0x88, 0x34, 0x99, 0xd0, 0x80, 0x41, 0x2e, 0x26, 0x5e, 0x4c, 0xbd, 0xf4, 0x98, 0x45, - 0xc7, 0x19, 0x70, 0x67, 0xe7, 0x2c, 0x2c, 0xe6, 0xf5, 0x34, 0xe5, 0x4b, 0x8f, 0x7e, 0x33, 0xbc, 0xec, 0x5e, 0xba, - 0xf9, 0xe9, 0x73, 0xba, 0xc1, 0xc4, 0x06, 0xba, 0x6b, 0x75, 0x1c, 0xcd, 0x83, 0x87, 0x16, 0x30, 0x93, 0xd2, 0x1c, - 0xef, 0x5b, 0xd0, 0xd2, 0xb9, 0x08, 0x99, 0xc8, 0xcb, 0x83, 0x9e, 0xed, 0x1b, 0xd2, 0x50, 0xb3, 0x13, 0xe0, 0xb3, - 0xb3, 0x34, 0x9a, 0x2b, 0x5e, 0xd0, 0x42, 0x09, 0x23, 0xc4, 0x65, 0xfd, 0x13, 0xe0, 0x81, 0xaf, 0x01, 0xca, 0x9f, - 0x94, 0xeb, 0x81, 0x67, 0x8e, 0xb9, 0x43, 0x38, 0xe1, 0xa7, 0x8a, 0xc0, 0xdd, 0x45, 0x85, 0xfe, 0xc9, 0x8c, 0x21, - 0x85, 0x01, 0x5f, 0x15, 0xe3, 0x29, 0xe1, 0x15, 0x68, 0x1a, 0x94, 0x07, 0x87, 0x01, 0xaa, 0x51, 0xf7, 0x7d, 0xed, - 0x53, 0x38, 0xa2, 0x09, 0x0f, 0x79, 0x87, 0xbc, 0x1a, 0xaa, 0x85, 0x26, 0x3e, 0xe4, 0x1d, 0x93, 0xe0, 0x9b, 0x0f, - 0xf7, 0x32, 0x7d, 0x44, 0x95, 0xa3, 0x17, 0xfa, 0x84, 0x05, 0x92, 0x53, 0x3d, 0x5e, 0x4b, 0xd1, 0x5e, 0xd1, 0x1c, - 0x5a, 0x09, 0x54, 0x6c, 0x4c, 0x87, 0x70, 0xe9, 0xd9, 0x5e, 0x7f, 0x7a, 0x93, 0xf8, 0x8b, 0x38, 0x63, 0x0d, 0x7b, - 0x02, 0xce, 0x99, 0x0d, 0xaa, 0xef, 0x64, 0x97, 0xb0, 0x48, 0x92, 0x9e, 0x67, 0x4e, 0xc7, 0x04, 0xb9, 0x79, 0xcd, - 0x1d, 0xdc, 0xcc, 0x43, 0xb9, 0xaa, 0x4f, 0x44, 0xa1, 0x49, 0xdd, 0x49, 0x41, 0xc4, 0x5b, 0xf7, 0xd7, 0x09, 0x6a, - 0x19, 0x75, 0x75, 0xd3, 0xdf, 0x8a, 0x78, 0x64, 0xcc, 0xbf, 0x56, 0x91, 0xd1, 0x2a, 0xf7, 0xdb, 0xd6, 0x5f, 0x57, - 0x66, 0x0f, 0xd9, 0xcf, 0xab, 0x5a, 0xf7, 0x3f, 0x6b, 0xd8, 0x6b, 0x5e, 0x2b, 0x45, 0x11, 0xce, 0x5c, 0x4d, 0x7a, - 0x64, 0xbe, 0x41, 0x2f, 0xee, 0xf6, 0xf0, 0x9c, 0x04, 0x28, 0x13, 0x27, 0x21, 0x0e, 0x24, 0xe4, 0x18, 0x6b, 0xbe, - 0xa2, 0x3d, 0xe6, 0xba, 0x61, 0x51, 0x99, 0x6b, 0x7e, 0x20, 0x68, 0x40, 0x05, 0xf4, 0x87, 0x1d, 0x4e, 0x73, 0x6f, - 0x42, 0xc3, 0x6f, 0x42, 0x3e, 0x43, 0xf0, 0xbb, 0xfc, 0x63, 0x81, 0xa1, 0xd0, 0x52, 0x43, 0x86, 0xeb, 0x54, 0x37, - 0x63, 0xb2, 0xda, 0x04, 0xfe, 0xb7, 0xb4, 0x9b, 0x51, 0x43, 0x64, 0x41, 0x84, 0x0c, 0x30, 0x90, 0xd1, 0x16, 0x03, - 0xaf, 0x69, 0xa6, 0xd9, 0x6a, 0x30, 0x56, 0x1f, 0x36, 0x59, 0x0a, 0x76, 0xaf, 0x9c, 0xa9, 0x1c, 0x06, 0xb5, 0x81, - 0xe1, 0x5d, 0xfa, 0xde, 0x3e, 0x2c, 0xe3, 0x45, 0xad, 0x90, 0xfb, 0xe9, 0x10, 0x19, 0x6e, 0x52, 0xc7, 0x6a, 0xa6, - 0xff, 0x19, 0x33, 0x31, 0x3e, 0x35, 0x38, 0x04, 0x36, 0x8c, 0x5d, 0xd5, 0x82, 0x61, 0xda, 0x28, 0xed, 0x9d, 0xb2, - 0x2e, 0x68, 0x21, 0x2c, 0xad, 0x5a, 0xe3, 0x80, 0x71, 0x4e, 0x2f, 0x2f, 0xd4, 0xe9, 0xc4, 0x9b, 0xfa, 0xdb, 0xc8, - 0x84, 0x0f, 0xfe, 0x35, 0x87, 0xba, 0x5a, 0x18, 0x85, 0xe3, 0xe1, 0xa3, 0x94, 0x07, 0x49, 0x68, 0x89, 0x85, 0xa6, - 0x6c, 0x6e, 0x48, 0x54, 0x87, 0x62, 0x23, 0x28, 0xf8, 0x7c, 0x85, 0x08, 0xb8, 0xc3, 0x61, 0x4b, 0x49, 0xf7, 0x16, - 0xcf, 0x90, 0x24, 0x2a, 0x23, 0x17, 0x9b, 0x60, 0x0f, 0x04, 0xc7, 0xa5, 0xa6, 0xac, 0xe5, 0xf9, 0xaf, 0x92, 0xe8, - 0x9f, 0xa0, 0xe0, 0x25, 0x29, 0xe5, 0xfc, 0x3b, 0x16, 0x7f, 0xd6, 0xd7, 0xc7, 0x88, 0xde, 0xfb, 0x0b, 0xc9, 0x67, - 0x7d, 0xb6, 0x6d, 0x1b, 0x23, 0xf3, 0xf2, 0x66, 0xae, 0x1f, 0xeb, 0xb8, 0x8c, 0x5d, 0xa2, 0x80, 0xe8, 0x6f, 0x58, - 0x2e, 0xd3, 0x3c, 0xc0, 0xf2, 0xb0, 0x3c, 0x8a, 0xfc, 0xb6, 0x22, 0x59, 0xa2, 0x81, 0xb7, 0x38, 0x2d, 0xd2, 0xbb, - 0xed, 0x78, 0x97, 0x2b, 0x75, 0x3a, 0x74, 0x2b, 0x63, 0x49, 0x34, 0xaa, 0x94, 0x43, 0x10, 0x03, 0x77, 0xba, 0x38, - 0x06, 0xbb, 0x33, 0x99, 0x3d, 0x4e, 0xdb, 0x98, 0xea, 0x4e, 0xdc, 0xd1, 0x13, 0xbc, 0xc4, 0x27, 0x2d, 0x35, 0xbb, - 0xa3, 0x17, 0x5a, 0x86, 0x4a, 0xc8, 0xea, 0xf4, 0x85, 0x56, 0x3f, 0x8a, 0x90, 0x24, 0x07, 0xfc, 0xaa, 0xf2, 0x97, - 0xaf, 0xd7, 0x63, 0xa1, 0x52, 0x5d, 0x54, 0x14, 0x68, 0x7e, 0x9e, 0x26, 0x1e, 0xa3, 0xdd, 0x6f, 0xa5, 0xaf, 0xce, - 0x1b, 0xc2, 0x07, 0xa0, 0x02, 0x92, 0x5b, 0x39, 0x34, 0xa4, 0xa1, 0x65, 0x3e, 0x3c, 0xce, 0x50, 0x28, 0x02, 0x74, - 0x26, 0x75, 0xe1, 0xa9, 0x8b, 0xf3, 0xea, 0x1f, 0x13, 0x54, 0x6c, 0x3f, 0xa7, 0x0c, 0x80, 0x93, 0x34, 0x40, 0x34, - 0x1a, 0xcf, 0x59, 0xa7, 0xd1, 0x85, 0x52, 0x3c, 0x03, 0x47, 0xc0, 0x7a, 0x89, 0x5c, 0x7b, 0x45, 0xeb, 0x5a, 0x86, - 0x34, 0xe9, 0xfe, 0xed, 0x51, 0xbf, 0x0d, 0xc1, 0x1d, 0x98, 0x34, 0x12, 0x3a, 0xaa, 0xae, 0x98, 0x1b, 0xc9, 0x38, - 0x50, 0x77, 0xda, 0x4d, 0x29, 0x37, 0x56, 0xd8, 0xcb, 0x5c, 0xb6, 0xaa, 0x63, 0xb9, 0x44, 0x58, 0xc4, 0xc5, 0x51, - 0x62, 0x45, 0x80, 0xef, 0x91, 0x41, 0x54, 0xaa, 0xf2, 0x24, 0x8a, 0x90, 0xe4, 0x0d, 0x16, 0x18, 0x73, 0x0b, 0xfd, - 0x26, 0x12, 0x3c, 0xf8, 0xfa, 0xa7, 0x15, 0x49, 0xa1, 0x12, 0x10, 0x40, 0x83, 0x81, 0x16, 0x50, 0xcd, 0xfc, 0xa3, - 0x51, 0xb7, 0x18, 0x3a, 0xcf, 0xe2, 0x39, 0x25, 0xc9, 0xa0, 0x3f, 0xfe, 0xfb, 0x09, 0x61, 0xd0, 0x06, 0xb0, 0x90, - 0x11, 0x07, 0xdc, 0x30, 0xd7, 0x9b, 0x44, 0xfa, 0x6c, 0x51, 0x2c, 0xb6, 0xd8, 0xcb, 0xb9, 0x4d, 0xe9, 0x05, 0x8d, - 0x97, 0x50, 0xf2, 0x8e, 0xe1, 0x2b, 0xaf, 0x83, 0x99, 0xb7, 0xbc, 0xc6, 0x0d, 0x16, 0xfa, 0x05, 0x8b, 0xae, 0x4a, - 0x72, 0xef, 0x97, 0x3d, 0x00, 0x99, 0x4f, 0x27, 0xaa, 0x37, 0x04, 0x0f, 0x21, 0x65, 0x63, 0xcc, 0x98, 0x73, 0x83, - 0x7b, 0xe7, 0x53, 0x45, 0x0a, 0x23, 0x17, 0x86, 0x00, 0x4e, 0x62, 0x94, 0xd1, 0xa6, 0x9e, 0xce, 0x42, 0x9d, 0x7e, - 0xe1, 0xad, 0x03, 0xf5, 0x6b, 0x53, 0x09, 0xc5, 0x5e, 0xd6, 0x03, 0x22, 0x6a, 0xaa, 0xae, 0x04, 0xe5, 0xa6, 0x44, - 0xf5, 0xed, 0x27, 0x78, 0xa6, 0xe3, 0x50, 0xfc, 0xcc, 0xc0, 0x48, 0x4c, 0x84, 0xe4, 0x6c, 0x90, 0x24, 0x4f, 0xd2, - 0x65, 0x2d, 0x09, 0xea, 0xda, 0xaf, 0x12, 0xc2, 0x23, 0x92, 0x71, 0x7e, 0xd6, 0x87, 0x7a, 0xe0, 0xca, 0x06, 0xbb, - 0x1c, 0x4f, 0xbf, 0x08, 0xd7, 0xdd, 0xa6, 0x3d, 0x35, 0xbc, 0xfb, 0x54, 0x64, 0x72, 0xcb, 0x56, 0xcd, 0x62, 0x63, - 0x82, 0x9f, 0xf8, 0x3c, 0xe8, 0x3e, 0xee, 0x37, 0x24, 0xa1, 0x9f, 0x6f, 0x73, 0x3f, 0xb1, 0xd2, 0xe8, 0x03, 0x78, - 0xd0, 0x58, 0x8a, 0x4b, 0x2b, 0x50, 0x63, 0xc1, 0x97, 0xdb, 0x92, 0xbc, 0xcd, 0x3c, 0xf0, 0x9d, 0xb8, 0x10, 0xba, - 0xc8, 0x7d, 0xe4, 0x6b, 0xe4, 0xad, 0xf4, 0x6e, 0xd5, 0x46, 0xfe, 0xe0, 0x57, 0x7f, 0xc8, 0x4a, 0x4f, 0xe9, 0x8f, - 0xca, 0x9c, 0xc5, 0x37, 0x5c, 0xa2, 0x9b, 0x81, 0x1d, 0xc1, 0x49, 0x5d, 0xf5, 0xe1, 0x0d, 0xa0, 0xb5, 0x85, 0xb7, - 0x1c, 0x4d, 0x13, 0x81, 0xe7, 0x66, 0xb8, 0xc4, 0x15, 0xd9, 0xe0, 0x06, 0x8a, 0x3d, 0x28, 0x60, 0x20, 0x36, 0xca, - 0x74, 0x3c, 0x00, 0xfc, 0x1c, 0xe2, 0x6e, 0xcc, 0xcf, 0xba, 0x66, 0x1b, 0x2d, 0x70, 0x4e, 0x91, 0x05, 0x64, 0x2f, - 0x43, 0x03, 0x0a, 0xd0, 0x09, 0x45, 0x50, 0xda, 0xac, 0xb1, 0x03, 0x26, 0x84, 0x15, 0x46, 0xd3, 0x00, 0xc7, 0x86, - 0x98, 0xb3, 0x97, 0xe6, 0x16, 0x81, 0x2f, 0x97, 0x88, 0x5c, 0xd3, 0x23, 0xa1, 0x7c, 0x86, 0x14, 0x38, 0xd1, 0xcf, - 0xd3, 0x7f, 0x03, 0x26, 0xbd, 0x9b, 0x13, 0xb4, 0xa7, 0x83, 0x69, 0xbf, 0xd4, 0x10, 0x28, 0x2d, 0x23, 0xf7, 0x87, - 0xe6, 0xf9, 0x7a, 0x31, 0xa6, 0x6b, 0xac, 0x76, 0x1b, 0xcd, 0x3f, 0xc5, 0xf5, 0x3c, 0x19, 0xb7, 0x88, 0x5c, 0x18, - 0x00, 0x7e, 0x6f, 0x06, 0x8d, 0xb7, 0xde, 0x4f, 0x2a, 0x3c, 0x67, 0x0d, 0x4b, 0x28, 0xdd, 0x23, 0xf2, 0x6d, 0xfe, - 0x87, 0x69, 0x3a, 0x28, 0x82, 0x53, 0x1b, 0xf2, 0xde, 0x83, 0x7b, 0x58, 0x87, 0x82, 0xa1, 0xaf, 0xc3, 0x94, 0xf9, - 0xc9, 0xce, 0xb2, 0x81, 0xd2, 0xb6, 0xb3, 0x5d, 0x35, 0x25, 0xed, 0x42, 0x32, 0x5c, 0x91, 0x18, 0xa4, 0xda, 0xc8, - 0x8f, 0xb6, 0xb2, 0xb2, 0x66, 0x6e, 0xa7, 0x38, 0xf2, 0x73, 0xa7, 0x33, 0xec, 0xde, 0xd8, 0xac, 0x1b, 0x1e, 0x80, - 0x34, 0xd7, 0x29, 0x00, 0x08, 0xc2, 0xa5, 0x6c, 0xe2, 0x1d, 0x4b, 0x95, 0xed, 0x40, 0x7d, 0xb0, 0xd0, 0x1c, 0x5c, - 0xe7, 0xa3, 0x09, 0xf9, 0xb8, 0xd9, 0xac, 0xf4, 0x3c, 0x07, 0x88, 0xc7, 0x71, 0x52, 0x19, 0x0c, 0x91, 0x82, 0x9f, - 0x4a, 0xb0, 0xc3, 0xd1, 0xe2, 0x3c, 0xfa, 0x6b, 0xe4, 0xbc, 0x4f, 0x50, 0x0d, 0x15, 0x58, 0x15, 0x6c, 0xc3, 0xc6, - 0xd3, 0x8b, 0xc4, 0x65, 0xbb, 0x53, 0xa1, 0x45, 0x87, 0x83, 0x5a, 0xf8, 0xd0, 0x01, 0xfd, 0x90, 0x14, 0x0a, 0x71, - 0x2e, 0xc2, 0x79, 0x16, 0x92, 0xa7, 0x0d, 0x14, 0x46, 0x5e, 0x8c, 0xdf, 0xc6, 0x70, 0xb6, 0xeb, 0x16, 0x23, 0x4b, - 0xd7, 0x74, 0x6b, 0x9c, 0x67, 0x93, 0x1f, 0xd1, 0x13, 0x27, 0x55, 0x24, 0xd9, 0x44, 0x2a, 0xa8, 0x51, 0x1a, 0x6c, - 0xfc, 0x15, 0x00, 0x05, 0x73, 0xc3, 0x6b, 0x1a, 0x8f, 0xb4, 0x4c, 0xc4, 0x5d, 0x8e, 0x06, 0x9b, 0xcc, 0xc1, 0xe3, - 0x60, 0xd0, 0x2b, 0xc4, 0x19, 0xda, 0x05, 0x4e, 0x72, 0xab, 0xc4, 0x1e, 0x7f, 0x91, 0xef, 0x25, 0x5e, 0xd8, 0x94, - 0xa1, 0x47, 0x3c, 0x48, 0x2c, 0x9b, 0x8f, 0xc1, 0xea, 0xfc, 0xbb, 0xfd, 0x90, 0x68, 0x34, 0xd0, 0x01, 0xe8, 0xc8, - 0x97, 0x70, 0xde, 0x13, 0xd3, 0xa4, 0x7b, 0xac, 0xbb, 0xf8, 0xd6, 0xfd, 0xf5, 0x69, 0xf0, 0xdd, 0x21, 0xa3, 0x2f, - 0x70, 0x3b, 0x69, 0xc2, 0x76, 0x6e, 0x5a, 0xeb, 0xfa, 0x03, 0x58, 0x00, 0xa7, 0xcc, 0x78, 0x26, 0x86, 0x97, 0x0d, - 0xfa, 0x46, 0x17, 0xe4, 0xb9, 0xbb, 0x73, 0x1d, 0xf7, 0xe7, 0xb8, 0xf5, 0xe2, 0x94, 0x43, 0x6a, 0x61, 0x11, 0xa8, - 0x19, 0x40, 0x05, 0xe4, 0x65, 0x34, 0x25, 0x5d, 0x10, 0xfc, 0xda, 0xa0, 0xe8, 0x7c, 0x87, 0x31, 0x40, 0xbd, 0xea, - 0x39, 0xcd, 0xfb, 0x5b, 0x4e, 0xf2, 0x42, 0xc4, 0x7b, 0x9b, 0xa6, 0xfa, 0xa7, 0x95, 0x7d, 0xca, 0x94, 0xd7, 0x2f, - 0xcd, 0xd1, 0xd9, 0x84, 0xaa, 0xad, 0xdd, 0xa6, 0x1a, 0xe2, 0x73, 0xbc, 0x64, 0x1e, 0x51, 0xbc, 0x80, 0x81, 0xe6, - 0x81, 0x1f, 0x79, 0xaf, 0xed, 0xdd, 0x68, 0x56, 0x5e, 0xa7, 0x0b, 0xfa, 0x7e, 0x4e, 0xb3, 0x12, 0xbc, 0x67, 0x67, - 0xab, 0x4a, 0xf5, 0x92, 0x0a, 0x86, 0x79, 0xd7, 0x2b, 0x7f, 0x46, 0xbf, 0xd1, 0x13, 0x3f, 0xe5, 0x4d, 0xe3, 0x37, - 0x25, 0xf3, 0xdb, 0x24, 0x4c, 0xea, 0x1c, 0xd6, 0xf4, 0x28, 0xdd, 0x4e, 0x28, 0xe7, 0x41, 0xee, 0x5e, 0xf6, 0x35, - 0xb2, 0xdd, 0x78, 0xa5, 0xfc, 0xe2, 0x8b, 0x96, 0x7f, 0xd7, 0xab, 0xba, 0xd2, 0xa4, 0x79, 0x1a, 0x3b, 0x57, 0x0f, - 0xf5, 0xe9, 0x43, 0x47, 0xa6, 0xfb, 0x23, 0xbe, 0xcc, 0xc8, 0xd0, 0x22, 0x33, 0xdf, 0x55, 0x56, 0x43, 0x5c, 0x6b, - 0x35, 0xf1, 0xee, 0x54, 0xe6, 0xcc, 0x8e, 0xdd, 0x78, 0x91, 0x64, 0x30, 0xaa, 0x8e, 0x4c, 0x0d, 0x89, 0xe4, 0x84, - 0xa8, 0x5f, 0x31, 0x08, 0x98, 0x75, 0x8d, 0x7f, 0xb5, 0xaf, 0x29, 0xb7, 0xe5, 0x5b, 0x8f, 0xb9, 0xfe, 0x36, 0x4e, - 0xb7, 0x5f, 0x13, 0x60, 0xdb, 0x56, 0x5c, 0xea, 0xc5, 0x28, 0xb6, 0x36, 0x32, 0xb1, 0x82, 0x96, 0x27, 0xe0, 0xf0, - 0x80, 0x44, 0xa2, 0xc2, 0xa4, 0xd9, 0x37, 0x92, 0x4a, 0x76, 0xd8, 0xf0, 0xcd, 0x7d, 0xab, 0xb8, 0xa0, 0x8f, 0xf6, - 0x8f, 0x3a, 0x55, 0xd3, 0xcb, 0x42, 0x51, 0x55, 0x1d, 0xf4, 0xa0, 0x29, 0x95, 0xd2, 0xe7, 0x5f, 0xee, 0x4c, 0x12, - 0x10, 0x59, 0x25, 0x81, 0x31, 0x7d, 0x80, 0x62, 0x2a, 0xed, 0x5a, 0x03, 0xa2, 0xc6, 0xbf, 0x21, 0xe1, 0xb7, 0xfa, - 0x31, 0x3d, 0xba, 0x47, 0xdf, 0xfd, 0x5c, 0xda, 0xb5, 0x08, 0x56, 0xe9, 0xad, 0xfe, 0x25, 0x3f, 0xf5, 0x44, 0xd5, - 0xbc, 0x52, 0xbd, 0x33, 0xb4, 0xa7, 0xf9, 0xd3, 0x39, 0x3f, 0x7f, 0x3a, 0xe7, 0x75, 0x30, 0xcc, 0x8c, 0xad, 0x5b, - 0x15, 0xbc, 0x5c, 0xe0, 0xba, 0x84, 0x32, 0x3c, 0xf5, 0xe5, 0x3f, 0x3c, 0x0b, 0x53, 0x19, 0x90, 0x9a, 0x6c, 0x60, - 0x4c, 0x65, 0xe0, 0x74, 0x73, 0x43, 0x47, 0xd3, 0x8d, 0x56, 0x26, 0x9a, 0x19, 0x4f, 0x86, 0x1a, 0x72, 0x1a, 0x73, - 0xb0, 0xa7, 0x87, 0x8c, 0x43, 0xad, 0x66, 0xfc, 0x68, 0xb4, 0x05, 0x6d, 0x40, 0xe1, 0x67, 0x30, 0x53, 0x01, 0x06, - 0xd1, 0xf9, 0x36, 0xce, 0x3e, 0x49, 0x7f, 0x67, 0x99, 0xf3, 0x7c, 0xd9, 0x10, 0xc1, 0xaf, 0x34, 0xe9, 0x76, 0x59, - 0x04, 0xfc, 0x98, 0xd1, 0x58, 0xc6, 0xef, 0xc5, 0xa0, 0x7f, 0x91, 0x3e, 0xaa, 0x11, 0x38, 0x17, 0x20, 0xaf, 0x46, - 0x98, 0x06, 0x8a, 0x86, 0xf6, 0x1a, 0xfa, 0x42, 0xa9, 0x32, 0x7d, 0xed, 0x69, 0x4d, 0x2b, 0xb2, 0xb4, 0xd2, 0x4f, - 0xc6, 0x14, 0xb3, 0x2a, 0x71, 0xec, 0x69, 0xde, 0x37, 0xc8, 0x24, 0x5f, 0x38, 0xcb, 0x68, 0x29, 0xa7, 0xc6, 0x02, - 0xdd, 0x2a, 0xd4, 0xda, 0x85, 0xa7, 0x37, 0x68, 0x1c, 0x18, 0x2a, 0xca, 0xbe, 0x5f, 0x62, 0x8f, 0x78, 0xdf, 0x7e, - 0xc0, 0x47, 0x28, 0xb8, 0xed, 0x39, 0x49, 0x18, 0xa9, 0xfa, 0x5e, 0x51, 0xbc, 0xef, 0x9b, 0x64, 0x24, 0x37, 0x34, - 0x31, 0xd8, 0xa8, 0x85, 0xd3, 0xd3, 0x38, 0x5d, 0x38, 0x3d, 0xc5, 0xa9, 0x45, 0x5b, 0x32, 0xd3, 0xc8, 0x48, 0xac, - 0x5d, 0xe1, 0x44, 0x2d, 0xbf, 0xc9, 0xaf, 0xb2, 0x0d, 0x09, 0x14, 0x95, 0xd6, 0x5e, 0x95, 0x1e, 0xf4, 0x02, 0x36, - 0xe0, 0x4e, 0x75, 0x20, 0xf2, 0x12, 0x5f, 0x2d, 0x40, 0x00, 0x46, 0xf7, 0x3f, 0x58, 0x4d, 0xe9, 0xb4, 0xd1, 0x6e, - 0x4e, 0x39, 0x26, 0x50, 0x72, 0xcd, 0x07, 0x93, 0x90, 0x37, 0x38, 0x71, 0x5e, 0x43, 0xa0, 0x42, 0x1c, 0x43, 0x90, - 0x67, 0xc6, 0x16, 0xf3, 0xfb, 0xb7, 0xaa, 0xfa, 0xa1, 0xa2, 0x53, 0xa8, 0x21, 0x66, 0x5f, 0x68, 0x9e, 0xf0, 0x2b, - 0x72, 0x5e, 0xe6, 0xe4, 0xd2, 0x73, 0x8f, 0xe4, 0xe3, 0xd1, 0xd9, 0x63, 0x24, 0xe8, 0xdb, 0xd5, 0x8e, 0xe6, 0x26, - 0x2c, 0xc5, 0x97, 0xec, 0x67, 0x2a, 0xff, 0x54, 0x2d, 0x14, 0xcf, 0xac, 0xce, 0x3b, 0x65, 0xb1, 0xab, 0x2a, 0x76, - 0x49, 0x67, 0xd0, 0x29, 0x78, 0x33, 0x20, 0x82, 0x8e, 0xe0, 0x24, 0x49, 0x20, 0x11, 0x8d, 0x02, 0xed, 0xd9, 0x4c, - 0x24, 0xc1, 0x5c, 0x80, 0x25, 0xcb, 0x1b, 0x2e, 0x76, 0xed, 0x2f, 0xdd, 0x92, 0xcc, 0x13, 0x70, 0xd1, 0x3c, 0xd3, - 0xe9, 0xe5, 0x3a, 0xf2, 0x39, 0xc2, 0xd4, 0xba, 0xa9, 0xcd, 0xab, 0x84, 0xf3, 0x55, 0xb9, 0x89, 0x95, 0x78, 0x1b, - 0xa8, 0x19, 0xaf, 0x56, 0x2a, 0x7f, 0x62, 0x72, 0x4a, 0x6b, 0x64, 0xa4, 0xb0, 0x3f, 0xa4, 0xaa, 0x6d, 0x94, 0x70, - 0x1b, 0xd2, 0x6f, 0xe7, 0xa7, 0xed, 0x42, 0xf1, 0x5b, 0x3b, 0x18, 0xf2, 0xff, 0xf5, 0x1a, 0xdb, 0x85, 0xa8, 0x51, - 0x60, 0x84, 0x70, 0xb1, 0x08, 0x10, 0x9e, 0x0b, 0xa7, 0x6c, 0x88, 0x85, 0x07, 0x8f, 0xc2, 0xd9, 0xeb, 0xac, 0xab, - 0xde, 0x6f, 0xfe, 0x3e, 0xa8, 0xbf, 0x8f, 0x42, 0xe3, 0x5c, 0xaf, 0xf1, 0x6f, 0x15, 0x3f, 0xfe, 0xd0, 0x42, 0xb1, - 0x81, 0x11, 0x6e, 0x22, 0x68, 0xa5, 0x68, 0xb6, 0x25, 0xd5, 0xfa, 0xaa, 0x80, 0x22, 0x84, 0xdd, 0x49, 0x55, 0x0b, - 0x26, 0xac, 0x3b, 0x3d, 0xc1, 0xf2, 0xf9, 0xc0, 0xe9, 0x3f, 0xa6, 0xed, 0x39, 0x49, 0x54, 0xfa, 0xac, 0x4f, 0x85, - 0x27, 0x4f, 0xa2, 0xd5, 0x3e, 0xf3, 0x2f, 0xc1, 0xad, 0xaf, 0x7e, 0xb5, 0xac, 0x46, 0xca, 0x4c, 0x31, 0x8b, 0xc2, - 0x6b, 0xb7, 0x86, 0x99, 0xf1, 0x8a, 0x62, 0xd2, 0x34, 0x7b, 0x58, 0x0a, 0x8a, 0xbb, 0xba, 0x66, 0x65, 0x4e, 0xe7, - 0x65, 0x46, 0xe6, 0x54, 0x82, 0x71, 0x54, 0x7c, 0x8f, 0x33, 0x7e, 0xa3, 0xad, 0x18, 0x18, 0x75, 0x3c, 0xec, 0xf4, - 0x1c, 0xeb, 0x84, 0x01, 0x7a, 0xe5, 0xb9, 0x89, 0xf0, 0x1a, 0x2f, 0x81, 0x53, 0xa7, 0x36, 0x7d, 0x10, 0x69, 0xe5, - 0xa8, 0x29, 0xcf, 0xb0, 0xc5, 0x94, 0x5e, 0xe3, 0x36, 0x91, 0x76, 0xfb, 0x2f, 0x76, 0x5e, 0x05, 0x9f, 0xd8, 0xd3, - 0x11, 0x1e, 0xd1, 0xa4, 0xb4, 0x08, 0x5e, 0x24, 0xca, 0xc3, 0xf6, 0xc0, 0x73, 0x7e, 0x25, 0xd6, 0x5e, 0x4e, 0x94, - 0xf2, 0x7c, 0xe6, 0x39, 0x88, 0x21, 0x33, 0xb4, 0x84, 0x8e, 0xcf, 0x05, 0x47, 0x62, 0x5c, 0xbd, 0x4f, 0x90, 0xc4, - 0x49, 0xb0, 0xf7, 0xd7, 0x3e, 0x17, 0x69, 0x75, 0xfc, 0xf2, 0x3e, 0x61, 0x21, 0xb6, 0x6b, 0xda, 0x05, 0x2a, 0x64, - 0x3f, 0xf8, 0x53, 0x02, 0x5e, 0x13, 0xf2, 0xb2, 0xef, 0xd4, 0x6e, 0x9d, 0x75, 0xce, 0xff, 0x0b, 0x87, 0x43, 0x8f, - 0x5e, 0x39, 0x9a, 0x6b, 0x26, 0x60, 0x72, 0xc0, 0x51, 0xd5, 0xf7, 0xa2, 0xc4, 0xd1, 0xf0, 0x40, 0xa0, 0xac, 0x12, - 0xff, 0xb0, 0x7e, 0x30, 0x24, 0xa0, 0xf2, 0x88, 0xfb, 0xee, 0xd6, 0xee, 0x9a, 0x76, 0x65, 0x13, 0x2e, 0x57, 0x32, - 0xfe, 0x1b, 0x10, 0xa6, 0xef, 0x03, 0xce, 0xe1, 0xe8, 0xac, 0xfb, 0x02, 0x6e, 0x32, 0xe7, 0x14, 0xa3, 0xb8, 0x96, - 0x7c, 0xc1, 0xf6, 0x94, 0x90, 0xd7, 0xc4, 0x2e, 0xbf, 0x58, 0x47, 0xa1, 0x57, 0x9d, 0xd4, 0xcb, 0xb2, 0xe8, 0xbf, - 0x80, 0x75, 0x82, 0x78, 0x79, 0x9e, 0xe9, 0xb2, 0x6f, 0x12, 0x87, 0x2b, 0xac, 0xb0, 0x99, 0x95, 0x86, 0x66, 0x61, - 0xfa, 0x98, 0xd2, 0x75, 0x2c, 0x30, 0x0e, 0x55, 0xce, 0x76, 0x09, 0x6c, 0x49, 0xaa, 0x99, 0xc6, 0xfb, 0x0d, 0x59, - 0x85, 0x49, 0x4b, 0x2b, 0x8d, 0x17, 0xe8, 0x1e, 0x6b, 0x3c, 0xff, 0x4b, 0x30, 0x4c, 0x18, 0x67, 0x2f, 0xc3, 0xc4, - 0x4f, 0x2a, 0xb8, 0xaa, 0x79, 0x82, 0xc3, 0xe6, 0x9d, 0xf9, 0xab, 0xb6, 0x75, 0xc0, 0x4f, 0xb2, 0x2f, 0x1a, 0xc3, - 0x98, 0x2c, 0x2c, 0x06, 0xee, 0xd2, 0xd8, 0xcf, 0xc1, 0xc2, 0x0d, 0xfb, 0xe8, 0x1b, 0x05, 0x5f, 0xfa, 0xf7, 0x77, - 0xa0, 0x4e, 0x62, 0xd4, 0x75, 0x69, 0x25, 0xa5, 0xbf, 0x46, 0xbe, 0x68, 0x03, 0x88, 0x34, 0x4f, 0x7d, 0x8c, 0x85, - 0x53, 0x41, 0xc4, 0x92, 0x12, 0x61, 0xed, 0x8c, 0x30, 0x6b, 0x65, 0xf9, 0xfe, 0x6c, 0xea, 0x08, 0x05, 0x5d, 0x3b, - 0xcb, 0x9f, 0x73, 0xe9, 0x66, 0x11, 0x5d, 0x37, 0xc0, 0x58, 0x96, 0x1d, 0x51, 0x0e, 0x9e, 0x60, 0xdb, 0xea, 0xae, - 0x88, 0xbc, 0xa1, 0x3e, 0x49, 0xac, 0x4e, 0xe8, 0x23, 0x8e, 0xd6, 0xf9, 0x68, 0x13, 0x4d, 0xbe, 0x59, 0xe5, 0xf2, - 0xd3, 0x26, 0xe6, 0x34, 0xd4, 0xc5, 0x0c, 0x62, 0x38, 0xf8, 0x4e, 0x84, 0xce, 0xa6, 0x7d, 0xdc, 0xa0, 0xcd, 0xc2, - 0x19, 0x9a, 0x86, 0xeb, 0x10, 0x6f, 0x2a, 0x61, 0x51, 0xd9, 0x42, 0xd3, 0x29, 0x9d, 0x70, 0x75, 0x57, 0x98, 0x9b, - 0x73, 0xee, 0xa9, 0xe5, 0x1a, 0xba, 0x26, 0x02, 0x85, 0xe2, 0xb1, 0xe5, 0x1a, 0x7d, 0x75, 0x50, 0xa9, 0x42, 0xa7, - 0xdb, 0x79, 0xf6, 0x2a, 0x16, 0x1c, 0xae, 0x8c, 0xc5, 0x1c, 0x60, 0xe0, 0xa7, 0x71, 0xf2, 0xbe, 0x8a, 0xec, 0x54, - 0x5a, 0x72, 0xde, 0xa5, 0xe4, 0xc0, 0x25, 0xf5, 0xcf, 0x6d, 0x5e, 0x9d, 0x2f, 0x73, 0x9b, 0x29, 0x78, 0x0b, 0x6e, - 0xe9, 0xb4, 0x1e, 0x87, 0xa2, 0xed, 0x10, 0x53, 0xe5, 0x5e, 0x29, 0x25, 0xcf, 0x9a, 0x6a, 0x28, 0x59, 0xe7, 0x18, - 0xeb, 0x8f, 0x0e, 0x51, 0x3e, 0xc4, 0x34, 0xe2, 0x70, 0xa7, 0x62, 0x55, 0xf2, 0x64, 0x25, 0x48, 0x88, 0xd5, 0x36, - 0xcc, 0x0c, 0x5a, 0x59, 0x26, 0xaa, 0x7d, 0x77, 0x9e, 0x47, 0x89, 0x31, 0xbe, 0x32, 0xcb, 0xc2, 0xd7, 0xe5, 0x0e, - 0x74, 0x82, 0x34, 0xb7, 0x9b, 0xc0, 0xb2, 0x5e, 0xa3, 0x11, 0xe6, 0xd3, 0x38, 0x4a, 0x48, 0x40, 0x24, 0xd5, 0x2f, - 0x48, 0x97, 0x12, 0xee, 0x7a, 0xf4, 0x67, 0xf9, 0x20, 0x84, 0xf9, 0xf0, 0xe5, 0x84, 0x53, 0x97, 0x60, 0x3b, 0xde, - 0xe4, 0xb5, 0x02, 0x95, 0x44, 0xd3, 0x6b, 0x2b, 0x4e, 0x75, 0xa9, 0x7a, 0x5b, 0x8c, 0xe2, 0x34, 0xfd, 0xaa, 0x27, - 0xb9, 0xd9, 0x62, 0x61, 0x2c, 0x18, 0x04, 0x1a, 0x50, 0xd1, 0x4d, 0x00, 0xab, 0x31, 0x16, 0x11, 0xaf, 0xcb, 0x0f, - 0x99, 0x54, 0x53, 0x3a, 0x54, 0xed, 0xda, 0xef, 0x0f, 0xee, 0xdd, 0xf0, 0x70, 0xfc, 0xf8, 0x9f, 0xfb, 0xbd, 0x1e, - 0x54, 0x41, 0x97, 0xf0, 0x71, 0x67, 0x3b, 0xa6, 0x42, 0x01, 0xb2, 0xb2, 0x7d, 0x79, 0x01, 0x50, 0x63, 0x2a, 0x4e, - 0xba, 0x6b, 0xeb, 0xde, 0xb4, 0xe0, 0xd3, 0xba, 0x09, 0xdf, 0xfb, 0xe6, 0x7c, 0x6f, 0x98, 0x5a, 0x77, 0xf8, 0xdc, - 0xe5, 0x33, 0x9e, 0x02, 0x99, 0x0b, 0x83, 0xf7, 0x90, 0xe2, 0x26, 0x4c, 0x32, 0xe4, 0x6c, 0x9a, 0x77, 0xda, 0xb2, - 0xbc, 0xd6, 0x52, 0xb2, 0x23, 0x26, 0xec, 0xb9, 0xf2, 0x47, 0xde, 0x93, 0xf8, 0x48, 0x35, 0x04, 0xe0, 0x04, 0xa5, - 0x8d, 0xc0, 0x5c, 0xc5, 0xcd, 0xfc, 0xa9, 0x21, 0x88, 0x08, 0xf4, 0x4c, 0xe1, 0xde, 0xce, 0x1f, 0xce, 0xc6, 0x08, - 0x41, 0x2a, 0xf8, 0x66, 0xa5, 0x36, 0x6b, 0x78, 0xe9, 0x3f, 0x66, 0x67, 0x3b, 0x32, 0xd3, 0xdd, 0x26, 0x51, 0x5b, - 0xb6, 0xa6, 0x02, 0xcc, 0x20, 0x1a, 0x03, 0x17, 0x3c, 0x30, 0xa6, 0xf1, 0xd1, 0x9b, 0x71, 0x62, 0xad, 0xdd, 0xf2, - 0xe5, 0x8c, 0x8f, 0x1c, 0x7d, 0x4e, 0x16, 0xa8, 0x71, 0x77, 0x18, 0xcb, 0xcb, 0xf8, 0x6e, 0x3d, 0x6e, 0x56, 0xf7, - 0x20, 0x0b, 0x08, 0xd0, 0x6b, 0xb1, 0xae, 0x99, 0xe8, 0x55, 0xc2, 0x9d, 0x54, 0x9a, 0x27, 0x95, 0x98, 0x59, 0xe5, - 0xe5, 0xb5, 0xd3, 0xcb, 0x90, 0xbc, 0x0c, 0xd6, 0x6e, 0x54, 0xa1, 0xc7, 0xd6, 0x58, 0xe3, 0xb8, 0x66, 0x92, 0xa5, - 0xf1, 0xd7, 0xf0, 0x51, 0x3f, 0xbc, 0x5c, 0x45, 0xeb, 0xa6, 0x5a, 0xb4, 0x5e, 0x5b, 0x39, 0xcc, 0x97, 0xbc, 0xf8, - 0x85, 0x2d, 0xb6, 0xf0, 0x7a, 0xb1, 0xb9, 0x8f, 0xa8, 0x4c, 0x25, 0xaa, 0xd3, 0x4a, 0x54, 0xa6, 0x89, 0xc9, 0xcf, - 0x9e, 0x77, 0x01, 0x5c, 0x7f, 0xd4, 0xa9, 0x55, 0xfc, 0xa8, 0x32, 0xaa, 0xfc, 0x51, 0x23, 0x54, 0xeb, 0x13, 0x40, - 0x94, 0xc0, 0xac, 0x91, 0x87, 0x99, 0xb5, 0x61, 0x32, 0x29, 0xeb, 0x0b, 0x72, 0x85, 0xc3, 0xb4, 0xaa, 0x56, 0xbd, - 0xff, 0xe5, 0x86, 0xeb, 0x2f, 0x9b, 0xfc, 0x6e, 0xc6, 0xf5, 0xbe, 0x92, 0xfd, 0x60, 0x39, 0x18, 0x2c, 0xb4, 0xf1, - 0xe3, 0x16, 0xea, 0x7e, 0x8c, 0x1e, 0x86, 0xe0, 0xca, 0xf4, 0x35, 0x88, 0xfa, 0x95, 0x20, 0xf3, 0x23, 0xf2, 0x5a, - 0x01, 0x72, 0xb1, 0xd7, 0x37, 0xd2, 0xbb, 0xd6, 0x20, 0x1a, 0x1b, 0x12, 0xa9, 0xb3, 0x48, 0x86, 0x21, 0xb5, 0x7d, - 0xb8, 0xce, 0xe8, 0x68, 0xde, 0xe4, 0x2d, 0xbe, 0xa9, 0x86, 0x26, 0xcc, 0xb7, 0x0a, 0xab, 0x91, 0x9e, 0x93, 0xa6, - 0x29, 0x69, 0x56, 0xf6, 0x4d, 0xd0, 0xaf, 0x5e, 0x44, 0x26, 0x34, 0x06, 0x5f, 0x64, 0x70, 0xe0, 0xb7, 0x2b, 0x3a, - 0x0a, 0xd1, 0x4f, 0x79, 0x73, 0xff, 0x55, 0x30, 0x4a, 0xfd, 0x00, 0xb1, 0x6f, 0xd1, 0x05, 0x66, 0x67, 0x05, 0x7c, - 0x0b, 0xeb, 0xed, 0x05, 0x79, 0x94, 0xc6, 0xce, 0xc2, 0x11, 0x35, 0x61, 0xad, 0xf7, 0xb0, 0x31, 0xb2, 0xde, 0xf9, - 0xe7, 0xba, 0x2b, 0x51, 0x84, 0x4b, 0xcf, 0x65, 0x82, 0xea, 0xc0, 0x45, 0xe5, 0x5b, 0x6a, 0x2f, 0xa5, 0x09, 0xa7, - 0x22, 0x5f, 0x0c, 0x1b, 0xde, 0x87, 0xc3, 0xbe, 0x86, 0xc3, 0x0f, 0x7c, 0xd3, 0x5a, 0x6b, 0x26, 0x5b, 0x35, 0xb2, - 0x0b, 0x2e, 0xb8, 0xc0, 0xb0, 0x83, 0x81, 0xf5, 0xec, 0x7d, 0x1e, 0x82, 0xa6, 0x03, 0x61, 0xc1, 0x58, 0x34, 0xb7, - 0x01, 0x4f, 0x3e, 0x60, 0xa0, 0xd4, 0xcd, 0xdb, 0x6d, 0xd9, 0x22, 0xb9, 0x0d, 0x0c, 0xa9, 0xc5, 0x38, 0xcb, 0xe2, - 0xc0, 0x99, 0x3a, 0x9b, 0xe7, 0xfa, 0x46, 0x19, 0x77, 0xad, 0x44, 0x49, 0x1b, 0xbf, 0x9e, 0x0d, 0xee, 0x19, 0x29, - 0x74, 0x93, 0xff, 0x2f, 0x21, 0xe5, 0x5d, 0xae, 0x0a, 0x82, 0x6e, 0x70, 0xd2, 0xd7, 0x5a, 0xba, 0xc8, 0x4c, 0x44, - 0x77, 0x80, 0x2b, 0x68, 0x52, 0xae, 0x3d, 0x41, 0xd2, 0x67, 0x2b, 0xb7, 0x39, 0x11, 0xdb, 0x3d, 0x23, 0x9d, 0xd9, - 0x12, 0xea, 0xf3, 0x0b, 0x56, 0x97, 0x77, 0xee, 0x28, 0xe5, 0x73, 0x65, 0xcc, 0x78, 0x24, 0xcd, 0xb3, 0x3f, 0x4a, - 0x21, 0x4d, 0xc6, 0xf5, 0x22, 0x32, 0x9f, 0x97, 0xdb, 0x5b, 0x81, 0x07, 0x9e, 0xaa, 0xc0, 0x10, 0xb4, 0xde, 0x4b, - 0x7c, 0xf3, 0x55, 0x0d, 0xca, 0x3a, 0x19, 0x3f, 0x3e, 0x56, 0xbf, 0x35, 0xf6, 0xa2, 0xd2, 0xe4, 0x10, 0xcd, 0xd4, - 0x76, 0x5a, 0xe7, 0x2d, 0xa8, 0x65, 0x6a, 0xd7, 0x09, 0xa4, 0xd1, 0x39, 0xcf, 0x56, 0x91, 0x98, 0x6a, 0xfe, 0x6b, - 0xa6, 0x84, 0xbe, 0xaf, 0x50, 0x25, 0xfe, 0x19, 0x17, 0x89, 0x30, 0xe2, 0x3c, 0x50, 0x0f, 0x61, 0xd5, 0x12, 0x87, - 0xca, 0xbb, 0x31, 0x8c, 0x0b, 0x66, 0xe1, 0x10, 0x1b, 0x65, 0x7e, 0x16, 0x93, 0x4f, 0x97, 0x05, 0x4f, 0xce, 0xaf, - 0x64, 0x99, 0x75, 0xb3, 0x4f, 0x88, 0x87, 0x47, 0xed, 0x21, 0xd5, 0x2d, 0x0b, 0xad, 0x59, 0x59, 0x2f, 0xca, 0x6e, - 0xd4, 0x3e, 0x8b, 0x2f, 0xc8, 0x68, 0xd2, 0x1e, 0x78, 0xdc, 0x4b, 0x12, 0x48, 0x55, 0x2d, 0xdb, 0xcc, 0x21, 0xf2, - 0xf0, 0xf2, 0x21, 0x4f, 0xf9, 0xac, 0x4c, 0x54, 0x94, 0xb6, 0xc3, 0xe0, 0x81, 0xfb, 0x3a, 0x9a, 0xa0, 0x53, 0xac, - 0xd3, 0x15, 0x44, 0x6f, 0xc0, 0xac, 0x37, 0x8a, 0x3d, 0xab, 0xac, 0x4a, 0x36, 0xed, 0xe5, 0x1a, 0xbf, 0x71, 0x90, - 0x16, 0xdc, 0xd8, 0xe3, 0x48, 0x5d, 0x2f, 0x4a, 0xd7, 0xf5, 0x66, 0x6f, 0xb9, 0xd3, 0xea, 0x03, 0x3e, 0xfd, 0x94, - 0x6c, 0xc9, 0x5f, 0x2f, 0x5d, 0x93, 0x56, 0x6e, 0x0b, 0x1a, 0x35, 0xd6, 0x64, 0xbc, 0xe9, 0x4b, 0x10, 0x15, 0x55, - 0x09, 0x9e, 0x53, 0x7e, 0x36, 0x8c, 0x46, 0x32, 0xd1, 0x80, 0x7c, 0x69, 0xed, 0x7e, 0xae, 0x55, 0xbc, 0xb5, 0x3a, - 0x74, 0xca, 0xea, 0xe0, 0xf8, 0xd2, 0xb9, 0xd9, 0xba, 0x28, 0x14, 0x20, 0x01, 0xf6, 0x50, 0x43, 0x8e, 0x9d, 0xd5, - 0x8c, 0xdb, 0xdb, 0x6f, 0x1b, 0x31, 0x90, 0x62, 0x2e, 0xfb, 0xae, 0x1f, 0x22, 0x64, 0x32, 0x23, 0x4c, 0xac, 0x91, - 0xdd, 0x18, 0xa3, 0x09, 0x09, 0xc9, 0x78, 0x2d, 0x84, 0x84, 0xde, 0xea, 0x3c, 0x01, 0x5c, 0x12, 0x4f, 0x06, 0x6b, - 0x0a, 0x66, 0x45, 0x5e, 0x57, 0x5b, 0x71, 0x25, 0x16, 0x89, 0xf0, 0x75, 0x51, 0x23, 0xdb, 0x26, 0x58, 0x41, 0x8b, - 0x62, 0x0e, 0x14, 0x3a, 0xf3, 0x0d, 0x5f, 0x30, 0xe1, 0x9c, 0xdf, 0x75, 0x6b, 0x94, 0x96, 0x99, 0xa0, 0xaf, 0x1a, - 0x16, 0xb6, 0xdb, 0x2f, 0x10, 0xd7, 0x34, 0x03, 0x03, 0x8a, 0xb2, 0x43, 0x35, 0xbf, 0x03, 0x4b, 0x94, 0x9c, 0xb4, - 0x91, 0x9b, 0x5f, 0xa1, 0x63, 0x82, 0x18, 0x58, 0x68, 0x6c, 0x2f, 0x64, 0x2b, 0xd1, 0x9a, 0x1a, 0xb2, 0x11, 0x36, - 0xc1, 0x07, 0xa7, 0xa7, 0x70, 0x6d, 0x02, 0x55, 0xd3, 0x94, 0x46, 0x60, 0x9e, 0xf0, 0x40, 0x69, 0xbe, 0x9f, 0x5d, - 0x10, 0xd8, 0x98, 0xb7, 0x22, 0x8b, 0x03, 0x92, 0x12, 0x1b, 0x58, 0x78, 0xd4, 0x58, 0x2f, 0xef, 0x34, 0x8e, 0x2e, - 0xab, 0x51, 0x57, 0xa4, 0x58, 0x2a, 0x69, 0xc6, 0xa2, 0xc1, 0x98, 0x92, 0x90, 0x64, 0x2d, 0x04, 0x6b, 0x36, 0xfc, - 0xcd, 0x7b, 0x54, 0x7f, 0x6b, 0x2e, 0x60, 0x4f, 0x30, 0xdb, 0x79, 0x31, 0xbd, 0xbe, 0x1a, 0x65, 0xdb, 0xba, 0x85, - 0x79, 0x4f, 0x61, 0xd0, 0x9c, 0x8f, 0x29, 0x65, 0xce, 0x33, 0x40, 0x99, 0x49, 0x16, 0x01, 0x39, 0x0c, 0xb8, 0x07, - 0xa4, 0x2b, 0x2f, 0x0e, 0x7b, 0x19, 0xad, 0x9c, 0xb9, 0xf0, 0xf2, 0x72, 0x75, 0x34, 0x41, 0x39, 0x50, 0xe4, 0xc0, - 0x8b, 0xeb, 0x17, 0x4f, 0x73, 0x2d, 0x56, 0x59, 0x6f, 0x58, 0xa8, 0xae, 0xb7, 0xf4, 0xb9, 0xf5, 0x31, 0xf0, 0xf9, - 0xb5, 0x96, 0x5a, 0x34, 0x7f, 0xe8, 0xb5, 0xd5, 0xa4, 0xa0, 0xdd, 0xbf, 0xf5, 0x64, 0x14, 0x39, 0xa5, 0xd5, 0xb2, - 0xf8, 0x54, 0xbb, 0xe8, 0x29, 0x5a, 0xca, 0x26, 0xef, 0xb2, 0x87, 0xaa, 0x0b, 0xb3, 0xd6, 0x51, 0x98, 0xd5, 0xf6, - 0x28, 0xef, 0xec, 0xbd, 0x36, 0x0b, 0xca, 0x94, 0x56, 0x9f, 0x70, 0xbd, 0xf1, 0x02, 0xaa, 0xf9, 0x96, 0x1a, 0x8b, - 0x63, 0x7e, 0x49, 0x5d, 0xd9, 0x28, 0x7b, 0x9e, 0xd6, 0xb8, 0xbc, 0xeb, 0xa2, 0x17, 0x53, 0xc0, 0x29, 0xca, 0x4a, - 0x17, 0x37, 0x72, 0x09, 0x5d, 0x2b, 0xd2, 0x1a, 0xf8, 0x0c, 0x8c, 0x62, 0xb2, 0x9a, 0x7c, 0x90, 0xf4, 0xdf, 0x99, - 0xf5, 0x57, 0x9d, 0xb9, 0xfe, 0xa6, 0x17, 0xae, 0xbf, 0x5e, 0x54, 0x56, 0x85, 0x7d, 0x63, 0xec, 0x19, 0x70, 0x05, - 0x93, 0x4a, 0x7c, 0xa5, 0x73, 0x8e, 0x08, 0x6a, 0x0c, 0x15, 0xb2, 0x9b, 0x2f, 0x2c, 0x6c, 0x88, 0x3c, 0x3b, 0xbb, - 0xcc, 0xd2, 0x35, 0xd6, 0x98, 0xdc, 0xdf, 0xbb, 0x82, 0x59, 0x17, 0x56, 0x2d, 0xe3, 0x55, 0xce, 0xa5, 0x28, 0x92, - 0x62, 0x72, 0x91, 0x83, 0x14, 0x21, 0x80, 0x90, 0x8b, 0x24, 0xd0, 0x51, 0xda, 0xa2, 0x68, 0x24, 0x14, 0x80, 0xfa, - 0x72, 0xbe, 0x05, 0x08, 0x1c, 0x82, 0x39, 0x21, 0x08, 0x46, 0xf2, 0x2c, 0x20, 0x72, 0x42, 0xf6, 0x4e, 0x54, 0x88, - 0x30, 0xab, 0x83, 0x13, 0x68, 0x50, 0x16, 0xd8, 0xa2, 0x79, 0x99, 0x09, 0x8a, 0x2a, 0x44, 0x84, 0x65, 0xc5, 0xe5, - 0xea, 0x8f, 0x2e, 0x6d, 0xbd, 0x5c, 0x53, 0xe8, 0x92, 0xe5, 0xd3, 0xec, 0x1a, 0xca, 0xfc, 0x00, 0xfc, 0x6b, 0x51, - 0x07, 0xf6, 0xb4, 0x83, 0x34, 0xb0, 0x15, 0x17, 0xa7, 0xe2, 0xfa, 0xe7, 0x9c, 0x02, 0x42, 0x49, 0x4f, 0x2b, 0xc4, - 0x5c, 0xa0, 0x73, 0x0f, 0x71, 0x0d, 0x0a, 0x80, 0xe1, 0x92, 0xf1, 0xc2, 0x50, 0xdb, 0x7a, 0x7a, 0xea, 0xfc, 0x1e, - 0xc9, 0x35, 0x3a, 0x34, 0xf1, 0x22, 0xca, 0xdc, 0x65, 0x61, 0x3b, 0x52, 0xbc, 0xe7, 0x46, 0xb5, 0xc7, 0x94, 0x97, - 0xe7, 0x7b, 0xe8, 0x2f, 0xc4, 0xbc, 0x6d, 0x82, 0xaa, 0xa7, 0x7b, 0x6f, 0xad, 0x8b, 0xc0, 0x8f, 0x5e, 0x16, 0x05, - 0xea, 0xdb, 0x15, 0x23, 0x0d, 0x3d, 0xd9, 0xb1, 0x42, 0x97, 0x69, 0x59, 0xdb, 0xbb, 0xcd, 0xfa, 0xb6, 0x06, 0x83, - 0x8c, 0x7d, 0xa5, 0x78, 0x05, 0x84, 0x4d, 0xf1, 0x64, 0x26, 0xda, 0x6a, 0x08, 0x4e, 0x10, 0xca, 0xe9, 0xea, 0xf0, - 0xad, 0x20, 0x45, 0x45, 0x60, 0xeb, 0x7e, 0xac, 0x3d, 0xd4, 0xbe, 0x1b, 0x4a, 0xa7, 0x67, 0x8f, 0x1a, 0x1c, 0x3d, - 0xe5, 0x05, 0x3b, 0x34, 0x52, 0x97, 0x16, 0x21, 0x55, 0xf1, 0xb6, 0x01, 0xab, 0xf4, 0xe0, 0xd3, 0x06, 0x33, 0x9f, - 0xb1, 0xe2, 0x0e, 0x72, 0x15, 0x1b, 0xd1, 0x08, 0x05, 0xdd, 0x23, 0xf2, 0xf3, 0xfe, 0x82, 0x3d, 0x37, 0xe6, 0x56, - 0xf0, 0x4b, 0xc0, 0x30, 0xd5, 0x2b, 0x4c, 0x58, 0x2d, 0x8d, 0x16, 0x60, 0xe9, 0x8d, 0x67, 0xab, 0x66, 0xaf, 0x7c, - 0x2a, 0x95, 0x14, 0xab, 0x10, 0xbe, 0x53, 0x65, 0x05, 0x27, 0x1f, 0x62, 0x30, 0xc4, 0x4f, 0xdf, 0x56, 0x7e, 0xbd, - 0xea, 0xe6, 0x50, 0xf1, 0xa8, 0xb1, 0xa7, 0x3d, 0x8c, 0x92, 0xda, 0xf0, 0xaa, 0xc3, 0x10, 0x77, 0x67, 0xd9, 0x99, - 0x3d, 0x45, 0xd6, 0x54, 0x02, 0xf8, 0x15, 0x9b, 0xa2, 0x2e, 0x83, 0x8f, 0x88, 0x79, 0x23, 0x60, 0xfe, 0x66, 0x50, - 0x8c, 0xe6, 0x4d, 0x15, 0xad, 0x16, 0xf7, 0x26, 0x74, 0xc9, 0xb8, 0x44, 0xd9, 0xd3, 0x87, 0xf4, 0x3b, 0x24, 0x18, - 0x39, 0xdd, 0xac, 0xb8, 0xaf, 0x07, 0x87, 0x63, 0x1f, 0x5b, 0x97, 0x30, 0x05, 0x40, 0x8b, 0x5c, 0x4c, 0x80, 0xe9, - 0x7a, 0xcd, 0xb1, 0x90, 0xad, 0x0b, 0x49, 0x34, 0x34, 0x85, 0xa2, 0x6e, 0x41, 0x30, 0x31, 0x2a, 0xed, 0xf6, 0x83, - 0xb4, 0x30, 0x9e, 0x33, 0x95, 0x5f, 0x90, 0x1f, 0x4e, 0x7d, 0xd9, 0x1a, 0x7b, 0xa3, 0x63, 0x56, 0x34, 0xf1, 0xa4, - 0x99, 0x80, 0x48, 0x00, 0x2f, 0x17, 0xd1, 0x66, 0x9c, 0xa7, 0x92, 0x9a, 0xd7, 0x76, 0x81, 0x98, 0x01, 0x02, 0x9d, - 0x6a, 0x49, 0xa5, 0x78, 0x73, 0x3e, 0x48, 0x71, 0x10, 0x80, 0xb2, 0x63, 0x36, 0xb4, 0xa5, 0xa0, 0x1e, 0x32, 0xb4, - 0xd9, 0x5c, 0xdb, 0x5a, 0xee, 0xd4, 0xd9, 0xac, 0x45, 0x6d, 0x99, 0x3f, 0xdc, 0xe6, 0x17, 0x11, 0xe3, 0xa2, 0xee, - 0x13, 0x09, 0xd5, 0x14, 0x23, 0xd0, 0x79, 0x02, 0xf2, 0x7a, 0x38, 0xe1, 0xcd, 0x7d, 0xbf, 0x6f, 0xe9, 0x9a, 0x64, - 0xf1, 0xa2, 0xc0, 0xb9, 0x2f, 0x53, 0x78, 0x99, 0x70, 0x02, 0x97, 0x78, 0xa8, 0x33, 0x1f, 0x67, 0x5b, 0x9d, 0x29, - 0x46, 0xa0, 0xa4, 0x16, 0x91, 0x4d, 0x7a, 0x43, 0x90, 0x9a, 0xf1, 0x32, 0x10, 0x6a, 0x47, 0xa9, 0x01, 0xc9, 0xfb, - 0xba, 0x32, 0x5e, 0x4b, 0xb6, 0x2e, 0x42, 0xd9, 0x6c, 0xc7, 0xb5, 0xbb, 0x9c, 0x4e, 0x77, 0x37, 0x2b, 0xe4, 0x0e, - 0x28, 0x9d, 0x0d, 0x97, 0x11, 0xdf, 0xd0, 0xec, 0x40, 0x81, 0xd0, 0x6e, 0xdf, 0x66, 0x65, 0xcc, 0xc2, 0xe2, 0x75, - 0x43, 0x8e, 0x4a, 0xfe, 0x50, 0xde, 0x9d, 0xf5, 0x6e, 0xc3, 0x53, 0xdb, 0xc1, 0x7a, 0x50, 0x28, 0xfb, 0xd8, 0xa7, - 0x46, 0xe1, 0x0f, 0xdc, 0x2a, 0x91, 0x75, 0x08, 0xeb, 0xec, 0xc2, 0x3b, 0x2a, 0xd3, 0x31, 0x6d, 0x3b, 0x9b, 0x87, - 0xcd, 0x46, 0x41, 0xba, 0x2c, 0xe1, 0x78, 0x6d, 0xa5, 0xee, 0xd4, 0xc3, 0x73, 0x37, 0x4a, 0xdf, 0x97, 0x58, 0x5e, - 0xb6, 0x51, 0xf7, 0x76, 0x12, 0x4b, 0xf8, 0xcc, 0x3a, 0x71, 0x09, 0xee, 0x80, 0xb9, 0xca, 0x4e, 0x44, 0x2d, 0x90, - 0xd4, 0x7f, 0xe1, 0xe5, 0x8f, 0x06, 0xe3, 0x92, 0x93, 0xab, 0x5e, 0x4d, 0x20, 0x31, 0x13, 0x32, 0x47, 0xab, 0x77, - 0x03, 0x9a, 0x82, 0xae, 0x6b, 0x91, 0x03, 0x02, 0x4f, 0x6c, 0x7a, 0xf9, 0xed, 0x08, 0xe2, 0xec, 0x2e, 0x27, 0x34, - 0xac, 0xe1, 0x59, 0x76, 0xb1, 0x92, 0xb1, 0x6b, 0x8f, 0xa7, 0xc7, 0x2e, 0x95, 0x96, 0x4d, 0x18, 0xf3, 0xdb, 0xba, - 0xde, 0x28, 0x9e, 0x22, 0xa6, 0x5d, 0x9c, 0xca, 0x18, 0xae, 0x56, 0x9f, 0xe3, 0x79, 0x51, 0x05, 0x49, 0x5c, 0x12, - 0xa5, 0x37, 0xd6, 0x6f, 0xb9, 0x1c, 0x55, 0x15, 0xcb, 0xd9, 0xf9, 0x6d, 0xca, 0xab, 0xdf, 0x83, 0x7f, 0x7c, 0x95, - 0xb1, 0x08, 0xaa, 0x8c, 0xc8, 0x8c, 0x7d, 0x74, 0x11, 0x2d, 0xf4, 0xb3, 0xb6, 0x74, 0x15, 0x5d, 0xaf, 0xcc, 0x6b, - 0x88, 0x20, 0x70, 0xab, 0xea, 0x14, 0x52, 0x66, 0xd1, 0x98, 0x67, 0x15, 0xb3, 0x6b, 0x3d, 0xc6, 0x31, 0x67, 0x03, - 0xe1, 0x26, 0x93, 0x13, 0x24, 0x27, 0xe1, 0x33, 0x95, 0xd9, 0x96, 0x11, 0xf5, 0xc8, 0x6b, 0xa4, 0x8b, 0x9a, 0x35, - 0xe7, 0x6d, 0xd7, 0x59, 0xbc, 0x60, 0x71, 0xde, 0xaf, 0x6e, 0x44, 0x42, 0x80, 0x70, 0x11, 0xfe, 0x1c, 0xc0, 0xff, - 0x6d, 0x33, 0xc5, 0xfd, 0xdd, 0xfc, 0x92, 0x77, 0x4d, 0x1b, 0x07, 0xe0, 0x80, 0x82, 0xc5, 0xc9, 0xe0, 0x02, 0xc9, - 0x08, 0x43, 0xbd, 0x42, 0xb4, 0xc1, 0x52, 0x31, 0xce, 0x2d, 0x3d, 0x8f, 0xec, 0x68, 0xd0, 0xa7, 0xe5, 0xc4, 0x5c, - 0x79, 0x83, 0x31, 0x5b, 0xa3, 0x12, 0x42, 0xed, 0x08, 0x31, 0x85, 0xc9, 0x74, 0x56, 0x16, 0x25, 0x7f, 0x15, 0x26, - 0xb4, 0x82, 0x49, 0x4a, 0x9b, 0x51, 0x63, 0x88, 0x8d, 0x8a, 0x50, 0xbd, 0xe7, 0x94, 0x35, 0x04, 0x73, 0x7b, 0x42, - 0xfa, 0x35, 0x44, 0xd7, 0x3f, 0xd6, 0xcf, 0x13, 0x4e, 0x6a, 0xdb, 0xf9, 0xba, 0xd0, 0x82, 0x83, 0x6b, 0x2a, 0xaa, - 0x72, 0x35, 0x0c, 0x51, 0x40, 0xa1, 0xd4, 0x91, 0x3a, 0xd4, 0x12, 0x59, 0x9b, 0x55, 0x3a, 0xd9, 0x61, 0xb4, 0x9c, - 0x4c, 0x89, 0x2b, 0x48, 0x6b, 0x5d, 0x39, 0x57, 0xbe, 0xd1, 0x97, 0x6d, 0xd0, 0x1b, 0x8d, 0x44, 0x2e, 0x3b, 0x8f, - 0x3f, 0xdf, 0xfa, 0x1c, 0xa0, 0xd6, 0xff, 0x6a, 0xed, 0x72, 0xc9, 0x02, 0x76, 0xb1, 0xab, 0x23, 0xf1, 0x7e, 0xde, - 0x0a, 0xb8, 0xbe, 0x10, 0x08, 0x75, 0xdd, 0x85, 0x72, 0xd2, 0x15, 0xab, 0xa2, 0x5f, 0xbe, 0x47, 0xd1, 0xac, 0xb7, - 0x11, 0x94, 0x4d, 0x90, 0xd6, 0xbb, 0x3a, 0x0e, 0x29, 0x21, 0x51, 0x59, 0x4c, 0x75, 0x61, 0x8d, 0x1e, 0xe8, 0x0e, - 0x5b, 0x45, 0x34, 0xa7, 0xe9, 0x26, 0xfb, 0xfe, 0x50, 0xa1, 0x04, 0x22, 0xfc, 0xbf, 0x7b, 0xd3, 0x33, 0xd0, 0x20, - 0x49, 0x5d, 0x80, 0x4a, 0x49, 0xfb, 0x85, 0xd3, 0xfe, 0x50, 0x65, 0x0b, 0x80, 0xc2, 0x1e, 0x6f, 0x14, 0x6d, 0xcb, - 0xef, 0x66, 0x3d, 0x28, 0xd1, 0xfa, 0x3f, 0x2a, 0x43, 0x16, 0x10, 0x6d, 0x47, 0xd7, 0x6a, 0xe9, 0x95, 0x4f, 0x52, - 0x0c, 0x47, 0x13, 0x62, 0xfb, 0x9d, 0xbe, 0x7c, 0x87, 0xea, 0xc2, 0x5a, 0xe2, 0xdc, 0x4b, 0x6a, 0x4b, 0x16, 0xb0, - 0x9f, 0x31, 0x62, 0xba, 0x51, 0xc1, 0x2f, 0x1f, 0x75, 0xb9, 0x9a, 0x85, 0xab, 0x21, 0x60, 0x66, 0x5f, 0x5d, 0xf1, - 0x20, 0x58, 0xc0, 0xd4, 0xb0, 0x30, 0x63, 0xc7, 0x51, 0x9f, 0x39, 0x96, 0xb2, 0xcf, 0x7d, 0x46, 0xd7, 0x37, 0xc7, - 0xfe, 0x11, 0xeb, 0xf6, 0x5b, 0xec, 0x8a, 0x71, 0x3c, 0xb0, 0xaf, 0x2e, 0xb2, 0x81, 0x69, 0x42, 0x92, 0xf5, 0xcb, - 0x29, 0x90, 0xaa, 0xd5, 0x83, 0x98, 0xab, 0x3a, 0x01, 0x8c, 0xf6, 0x5d, 0x51, 0xf0, 0x88, 0x1c, 0x7f, 0x22, 0x8d, - 0x0e, 0x98, 0xe2, 0x0e, 0x84, 0x30, 0x74, 0x47, 0xbc, 0xd9, 0x5b, 0x81, 0x60, 0x44, 0xbb, 0x20, 0xfc, 0x8d, 0xf3, - 0x12, 0x5b, 0xd0, 0x36, 0x5a, 0x2f, 0x02, 0x68, 0x88, 0x44, 0xf2, 0x63, 0xe4, 0xf9, 0x70, 0x76, 0xee, 0x41, 0x31, - 0xdc, 0xa4, 0x2e, 0x88, 0xeb, 0xe9, 0x05, 0xdb, 0x65, 0x42, 0x32, 0x51, 0xe8, 0xd0, 0x14, 0x58, 0x59, 0x3b, 0x71, - 0x3a, 0xc0, 0x87, 0xf7, 0xf7, 0xf0, 0xc0, 0x76, 0x54, 0xfc, 0x40, 0x02, 0xb7, 0x2f, 0xac, 0xe0, 0x50, 0x67, 0xc1, - 0x0c, 0x3a, 0xe0, 0x91, 0xde, 0xa7, 0x46, 0x8c, 0x66, 0xd6, 0x3b, 0x40, 0x14, 0x11, 0x65, 0xb6, 0x4d, 0x6e, 0x87, - 0xbb, 0xe3, 0x29, 0x10, 0x20, 0x63, 0x5a, 0x15, 0x96, 0x61, 0x26, 0xb0, 0xc4, 0x7c, 0x33, 0xbe, 0x68, 0xd1, 0x8f, - 0xfd, 0x3e, 0xaa, 0xe4, 0xa2, 0x52, 0x83, 0xb1, 0x8d, 0x79, 0x63, 0x8b, 0x9e, 0xe0, 0x1b, 0x8d, 0x74, 0xf4, 0x0c, - 0x63, 0xb9, 0x84, 0x39, 0x58, 0xe9, 0x1c, 0xf5, 0x23, 0x58, 0x51, 0x05, 0x88, 0xb3, 0x1f, 0xa7, 0x48, 0x0d, 0x98, - 0x25, 0x3f, 0xa4, 0x45, 0x4d, 0x4e, 0x03, 0x7e, 0xcd, 0x40, 0xcf, 0x1e, 0x55, 0xc6, 0x3d, 0x79, 0x09, 0x5c, 0x9a, - 0xde, 0x7a, 0xda, 0x77, 0x6f, 0xc0, 0x31, 0x16, 0xe4, 0x0d, 0xe6, 0xec, 0x4e, 0x30, 0xc5, 0x8a, 0x6d, 0x5d, 0x2d, - 0xf3, 0x6a, 0xfd, 0x40, 0x67, 0x25, 0x18, 0x4e, 0x93, 0x48, 0xe2, 0x04, 0x4c, 0xa3, 0x18, 0x7f, 0x60, 0xbb, 0xbc, - 0xdb, 0xea, 0x13, 0xbf, 0x0d, 0x7f, 0x1d, 0x29, 0x55, 0x9f, 0x7f, 0x12, 0x0b, 0x33, 0x99, 0xd8, 0x6f, 0xe4, 0xe8, - 0x0c, 0x32, 0x2b, 0xf0, 0x55, 0x3d, 0xe3, 0x59, 0xf2, 0x5c, 0x79, 0xca, 0xcd, 0x8a, 0x2d, 0xb3, 0xe0, 0xe7, 0x51, - 0x49, 0x8d, 0xbd, 0x19, 0xd5, 0xa9, 0x56, 0x8c, 0x51, 0x9d, 0x9e, 0x1c, 0x08, 0x97, 0x29, 0xc0, 0x2a, 0x3b, 0x80, - 0xc6, 0xf3, 0xeb, 0xd2, 0x23, 0x11, 0xd9, 0x2a, 0xa6, 0x1e, 0x83, 0x97, 0x8a, 0xa0, 0x77, 0x10, 0x85, 0x18, 0x1c, - 0x49, 0xdf, 0x68, 0xf5, 0xc5, 0x9f, 0xf8, 0x7d, 0xaf, 0x97, 0x70, 0x17, 0xec, 0x7c, 0x53, 0x63, 0xe9, 0x2c, 0x41, - 0x63, 0xf6, 0x3f, 0x87, 0xac, 0x45, 0x58, 0xe4, 0x34, 0xd3, 0x10, 0x34, 0x41, 0xf1, 0x47, 0xd0, 0xc0, 0x66, 0x4d, - 0xd7, 0x7a, 0x13, 0x94, 0x51, 0x48, 0x82, 0xff, 0x57, 0x19, 0x2f, 0x87, 0x2a, 0x27, 0x93, 0xa8, 0x05, 0xf7, 0x89, - 0x9b, 0x6a, 0x68, 0x05, 0xea, 0xec, 0xe1, 0x29, 0xf4, 0x64, 0x2c, 0xa2, 0x67, 0x58, 0xc4, 0x46, 0x9b, 0xc0, 0x78, - 0x24, 0xf3, 0xb0, 0x2e, 0xa2, 0xdd, 0x72, 0x36, 0xc5, 0x57, 0x76, 0xcc, 0xdb, 0x6e, 0x1f, 0xbb, 0x09, 0x95, 0x78, - 0xfa, 0x7d, 0x57, 0xcc, 0xbe, 0xc7, 0xbe, 0x94, 0xd2, 0x3d, 0x70, 0x58, 0x4a, 0xeb, 0x22, 0x28, 0x9c, 0x3a, 0xd8, - 0x02, 0x9a, 0xec, 0xe4, 0x6c, 0x1a, 0x25, 0x58, 0x9c, 0xb9, 0x49, 0xc0, 0xaf, 0x74, 0x12, 0x42, 0x2a, 0x1b, 0xbe, - 0x63, 0x2d, 0xf9, 0x2b, 0x90, 0x6b, 0xfe, 0xe2, 0x69, 0x20, 0x44, 0x6d, 0x23, 0x14, 0x01, 0x6b, 0xe2, 0xca, 0xbc, - 0x33, 0x08, 0xae, 0xe8, 0x2f, 0x7b, 0x0d, 0xff, 0xdc, 0x98, 0xf6, 0xad, 0x90, 0xda, 0xd0, 0xc1, 0x5a, 0x44, 0xc6, - 0xf3, 0x50, 0xf8, 0x6f, 0xf8, 0xd8, 0x73, 0x84, 0x48, 0x22, 0x17, 0xc9, 0x8f, 0x28, 0x6e, 0x31, 0xdd, 0x42, 0xb9, - 0xb5, 0x9d, 0x8f, 0x23, 0x61, 0xd0, 0x3c, 0x6a, 0xf5, 0x92, 0x94, 0xf7, 0xd4, 0x6a, 0xe6, 0x1e, 0x05, 0xb7, 0x8b, - 0xa5, 0x86, 0x17, 0x88, 0xd2, 0xd5, 0x0f, 0x0a, 0xcd, 0xe2, 0x3f, 0x66, 0xb5, 0x79, 0xea, 0xf6, 0x51, 0xc9, 0x37, - 0xc9, 0xca, 0x91, 0x05, 0x27, 0x51, 0xf8, 0x43, 0x08, 0xbc, 0xd4, 0x19, 0x4f, 0xf5, 0x36, 0x62, 0x1e, 0x0a, 0x4d, - 0x41, 0xae, 0x07, 0xed, 0x13, 0x4d, 0x8e, 0xdc, 0x90, 0x63, 0x7a, 0xd0, 0x3e, 0xac, 0x81, 0xed, 0x08, 0x71, 0x71, - 0x9f, 0x88, 0xe1, 0xb4, 0xea, 0x72, 0x02, 0xe4, 0xce, 0x79, 0xd2, 0x32, 0x04, 0x35, 0x72, 0x13, 0xd4, 0xb8, 0x73, - 0x9c, 0xda, 0x45, 0xd1, 0xed, 0x4b, 0x2e, 0x91, 0x62, 0x94, 0xe9, 0xbe, 0xf4, 0xdf, 0xab, 0xad, 0xa2, 0x01, 0x64, - 0x03, 0xbe, 0xde, 0x7b, 0xc7, 0xe8, 0x00, 0xf5, 0x72, 0xeb, 0xa6, 0x6c, 0x5e, 0x9e, 0xd3, 0x6c, 0x6b, 0xb8, 0xc7, - 0xd0, 0xfe, 0x12, 0xea, 0x9c, 0xfb, 0xac, 0xf8, 0xad, 0xbc, 0x0b, 0xc4, 0xe4, 0xe4, 0x66, 0x23, 0x4f, 0x93, 0x75, - 0x84, 0x75, 0x8f, 0xa1, 0xb9, 0x88, 0x7f, 0x69, 0xac, 0x5c, 0x10, 0x9e, 0x58, 0xc9, 0x82, 0xbf, 0x30, 0xcc, 0x60, - 0x53, 0x79, 0x4d, 0x7f, 0x87, 0x39, 0x80, 0xf7, 0xdb, 0xcd, 0x5a, 0x41, 0x3e, 0x25, 0xb5, 0xe3, 0x6b, 0xad, 0xe3, - 0x97, 0x6f, 0xd0, 0x83, 0xd4, 0xc4, 0x63, 0x51, 0x3d, 0x10, 0xb3, 0xa4, 0x37, 0x2f, 0x71, 0xf4, 0xcd, 0x4f, 0x9b, - 0x67, 0x5c, 0xe3, 0xb9, 0x08, 0xc9, 0x80, 0xb5, 0xc1, 0xa5, 0xbd, 0x37, 0x12, 0x77, 0x9f, 0x95, 0xa9, 0x45, 0x6b, - 0x63, 0x26, 0x0a, 0xb4, 0xb0, 0xee, 0x12, 0xf1, 0x7c, 0xf9, 0xa6, 0xbf, 0x76, 0xa4, 0x58, 0x9a, 0x8f, 0x64, 0x1e, - 0x55, 0x29, 0xe1, 0x8f, 0x01, 0x8d, 0x7f, 0x43, 0x5e, 0x24, 0x31, 0xd0, 0x60, 0x91, 0x1a, 0x2b, 0xef, 0x13, 0x70, - 0x88, 0xa1, 0x89, 0xa8, 0x4d, 0xb4, 0x13, 0xb8, 0xa3, 0xf1, 0x89, 0xa4, 0x3e, 0x26, 0x95, 0x34, 0x01, 0x1e, 0xdd, - 0xc5, 0xe4, 0x64, 0xec, 0x02, 0x7c, 0x81, 0xc7, 0xc7, 0xd3, 0x6f, 0xda, 0xd5, 0xd1, 0x0d, 0x52, 0x6e, 0x2a, 0xc8, - 0x26, 0x60, 0xad, 0x05, 0xe0, 0x29, 0xd7, 0x44, 0xf3, 0x8e, 0x54, 0xbf, 0x0c, 0x02, 0xf6, 0xbb, 0x8b, 0x7a, 0xee, - 0x4d, 0x63, 0x65, 0xf9, 0x38, 0xf1, 0x52, 0xd3, 0x08, 0xb1, 0x62, 0x9f, 0x71, 0xca, 0x11, 0x11, 0xef, 0xf0, 0x6b, - 0xeb, 0xcd, 0x22, 0xbd, 0x4d, 0x8a, 0x73, 0x93, 0x01, 0x86, 0x91, 0x6b, 0x84, 0x5f, 0xcc, 0xb4, 0xb3, 0x75, 0xe5, - 0xc3, 0x02, 0xc9, 0x68, 0x29, 0xfc, 0xad, 0xc8, 0xac, 0xb6, 0x59, 0x8b, 0x10, 0xff, 0x50, 0xf4, 0xb3, 0x43, 0x69, - 0x14, 0x90, 0x57, 0x5f, 0x2e, 0x2b, 0x36, 0x39, 0x05, 0x9d, 0xf6, 0xb9, 0x79, 0x67, 0x59, 0x7e, 0xfc, 0xf9, 0x8f, - 0x73, 0x3b, 0x61, 0x8b, 0x99, 0x27, 0x6e, 0xb1, 0x8c, 0xb2, 0xf2, 0xa2, 0xd5, 0x79, 0x4b, 0xd6, 0xcd, 0xec, 0xba, - 0x40, 0x09, 0xff, 0xd4, 0x8f, 0x0e, 0x67, 0xe5, 0x0c, 0x7a, 0x85, 0x56, 0x16, 0xf6, 0x28, 0x6d, 0xdf, 0xda, 0x97, - 0x03, 0x9d, 0xc6, 0x5d, 0xd8, 0x1c, 0x27, 0x48, 0x52, 0x79, 0x28, 0x3f, 0xf3, 0x14, 0x67, 0xdf, 0x59, 0x4d, 0x47, - 0x3b, 0x7a, 0xc7, 0xd1, 0xe5, 0x60, 0xb1, 0x43, 0x94, 0xac, 0x0f, 0xce, 0xb6, 0x59, 0x7c, 0x70, 0x94, 0x69, 0x3e, - 0xe3, 0x15, 0x0b, 0xa4, 0x34, 0x4f, 0x9f, 0x22, 0xe8, 0x09, 0x64, 0x62, 0x0c, 0xbd, 0x0b, 0x36, 0x4d, 0x81, 0x63, - 0xce, 0xb7, 0x89, 0xa0, 0xcd, 0x32, 0x9a, 0x45, 0xf4, 0x62, 0x64, 0x29, 0xbc, 0xf6, 0x8e, 0x7a, 0xae, 0x64, 0x5d, - 0x42, 0xab, 0x23, 0xab, 0x1f, 0x6c, 0xf7, 0x69, 0xe1, 0x07, 0xf3, 0xbb, 0xd5, 0x42, 0x7d, 0x65, 0xac, 0x7e, 0x8c, - 0xcc, 0x52, 0xe7, 0x2c, 0x67, 0xb7, 0xd3, 0xd8, 0xc0, 0xeb, 0x64, 0xb3, 0xf5, 0xeb, 0x76, 0x7f, 0xb9, 0xe4, 0xdf, - 0x66, 0xca, 0xdb, 0x24, 0x47, 0xd8, 0xef, 0x13, 0x59, 0x03, 0xb2, 0x3e, 0x6d, 0x71, 0x96, 0x92, 0x3a, 0x56, 0x49, - 0x94, 0x18, 0xdb, 0x09, 0x5c, 0x61, 0x10, 0x12, 0xcf, 0x66, 0x75, 0x25, 0x4c, 0xce, 0xab, 0x78, 0xa7, 0x30, 0x57, - 0x22, 0x59, 0x2c, 0xf2, 0x04, 0x45, 0xda, 0x37, 0xcb, 0xe5, 0xa5, 0x3c, 0x35, 0xa5, 0x1d, 0x09, 0x8d, 0xbc, 0xa4, - 0xff, 0x0c, 0xb8, 0x24, 0x44, 0x2a, 0x50, 0x89, 0xcf, 0x7d, 0x47, 0x2a, 0xd1, 0xa4, 0x8a, 0x52, 0x14, 0xd4, 0xca, - 0xf4, 0x8f, 0x98, 0x97, 0xa6, 0xb4, 0xee, 0x81, 0xc0, 0x75, 0x9b, 0x2b, 0x89, 0xa7, 0x7f, 0x99, 0xcc, 0x2e, 0x00, - 0xe7, 0x65, 0xb9, 0xc1, 0x2f, 0x63, 0xc2, 0xe5, 0xd1, 0x65, 0x4d, 0x20, 0xd8, 0xf1, 0x06, 0x7e, 0x98, 0x48, 0x10, - 0x1c, 0x57, 0x24, 0x22, 0x16, 0x9c, 0xa1, 0x88, 0xa7, 0x60, 0x00, 0x48, 0xce, 0xbf, 0x4f, 0x9f, 0x17, 0x34, 0x7f, - 0x40, 0x54, 0xe1, 0xa8, 0x02, 0xc4, 0x01, 0x09, 0x06, 0x5d, 0x78, 0x27, 0x8b, 0x6c, 0x35, 0x3b, 0x5e, 0x9e, 0x93, - 0xce, 0x9d, 0x45, 0x44, 0x7a, 0x51, 0x12, 0x41, 0x9c, 0x61, 0xf1, 0x83, 0xa0, 0xc4, 0xe8, 0xf5, 0xba, 0x20, 0x8c, - 0x2e, 0x96, 0x64, 0xa3, 0xd1, 0x20, 0x20, 0xfd, 0x23, 0xc4, 0x4c, 0xb6, 0x4b, 0x39, 0x66, 0x5f, 0x7b, 0xc5, 0x39, - 0x6b, 0xcd, 0x10, 0x4a, 0x06, 0x76, 0x6f, 0x09, 0xa4, 0x3a, 0x87, 0x32, 0x9a, 0x4a, 0x53, 0x7e, 0x21, 0x47, 0x50, - 0xeb, 0xd0, 0x6b, 0x93, 0xa1, 0xdf, 0x06, 0x4f, 0x22, 0x20, 0x45, 0x0a, 0xcf, 0x4b, 0x60, 0xc1, 0x64, 0xe7, 0xb6, - 0x64, 0x16, 0x1f, 0x3f, 0xa4, 0x38, 0xc9, 0x9c, 0xcd, 0x40, 0xff, 0x42, 0x13, 0x5c, 0x2c, 0xd2, 0x11, 0x23, 0xab, - 0xe0, 0x72, 0x58, 0xf7, 0xbf, 0xed, 0x72, 0xe8, 0xa6, 0x20, 0xb7, 0x39, 0x1b, 0x33, 0xe5, 0x78, 0xdc, 0xcd, 0x59, - 0x5f, 0xfa, 0xcb, 0x24, 0x8d, 0x34, 0x15, 0x4a, 0x67, 0xd6, 0x77, 0xf7, 0xbb, 0x7a, 0xec, 0x96, 0x47, 0xf7, 0x16, - 0x10, 0xd0, 0xc6, 0x1d, 0x39, 0x65, 0x05, 0x96, 0x84, 0x63, 0x12, 0x0e, 0x1f, 0x00, 0x73, 0xad, 0x1f, 0x44, 0x25, - 0xfd, 0x5d, 0xb2, 0x4f, 0x07, 0x22, 0x3f, 0xd7, 0x65, 0x7d, 0x96, 0xfa, 0x93, 0x69, 0xf7, 0x71, 0xec, 0xe3, 0x19, - 0xa7, 0x39, 0x42, 0x52, 0x96, 0xe4, 0xd7, 0xcb, 0xcd, 0x71, 0xb6, 0x95, 0xfc, 0x4f, 0x28, 0xce, 0x1f, 0x94, 0xd1, - 0x3a, 0x5b, 0x36, 0x7d, 0xb6, 0x60, 0x38, 0x67, 0x92, 0x96, 0xe0, 0x94, 0x4f, 0xfc, 0x4b, 0xd5, 0xe1, 0xf1, 0x69, - 0x8f, 0x58, 0x0f, 0x22, 0x49, 0xf0, 0x5f, 0x73, 0xc2, 0xe3, 0x53, 0x33, 0xe1, 0x87, 0x67, 0x88, 0x4f, 0x6f, 0x8c, - 0x8e, 0xa9, 0xd4, 0x1c, 0xcb, 0x8a, 0x4b, 0x2f, 0x2a, 0x82, 0x53, 0x5d, 0xd8, 0xe0, 0xd9, 0x9d, 0x3e, 0xa5, 0x39, - 0xcd, 0x41, 0x78, 0x92, 0x66, 0x3b, 0xb7, 0x68, 0xb1, 0xa4, 0x05, 0x94, 0x92, 0xca, 0x49, 0xb4, 0x9a, 0xc6, 0x91, - 0xad, 0x23, 0xcc, 0x0b, 0x9c, 0xdd, 0x46, 0x62, 0x84, 0xb5, 0x33, 0x9e, 0xa8, 0x91, 0x9a, 0x92, 0x9b, 0x3a, 0x22, - 0x59, 0x8f, 0xc1, 0xfc, 0x9f, 0x1f, 0x7b, 0x5c, 0x63, 0x66, 0x67, 0xe1, 0x8a, 0x72, 0xfb, 0x6a, 0xaa, 0x76, 0xb2, - 0xa5, 0x2b, 0xaf, 0x5b, 0x3b, 0xa7, 0xd2, 0xe6, 0xc2, 0x15, 0x87, 0x6e, 0xb8, 0x7a, 0x6d, 0x17, 0x24, 0xd7, 0xcf, - 0x91, 0xdf, 0x0c, 0x83, 0x25, 0x89, 0xd4, 0xcd, 0x9d, 0x27, 0x65, 0x4b, 0xa9, 0xba, 0xaf, 0xc0, 0xe2, 0xb0, 0x34, - 0x54, 0xbb, 0x0a, 0xca, 0xf2, 0x46, 0x0d, 0x61, 0x11, 0xd6, 0xd4, 0x0b, 0x0e, 0xa7, 0x74, 0x9e, 0x05, 0x35, 0xb5, - 0x38, 0x3f, 0x69, 0xd4, 0x5e, 0x52, 0xe4, 0x54, 0x40, 0xbc, 0x89, 0x22, 0x17, 0x2f, 0x51, 0xaf, 0xf2, 0xb8, 0x82, - 0xfd, 0x91, 0x92, 0xaa, 0x9d, 0x5e, 0xa8, 0xc2, 0xe9, 0x99, 0x2a, 0x9f, 0x5e, 0x9e, 0xae, 0x70, 0x98, 0x4b, 0xb5, - 0x2b, 0x91, 0x45, 0x59, 0x52, 0x96, 0xe3, 0xca, 0x95, 0xf1, 0xdc, 0x9e, 0xbb, 0x8c, 0x4c, 0xd5, 0x29, 0x06, 0x93, - 0x32, 0xa5, 0xd5, 0x63, 0xdb, 0x11, 0x43, 0xc3, 0x04, 0x82, 0x5d, 0xd6, 0xca, 0x68, 0x7d, 0xbf, 0x78, 0x62, 0x51, - 0xa8, 0x2d, 0xad, 0x4f, 0x4f, 0x92, 0x90, 0xb5, 0xbe, 0xb4, 0x09, 0x94, 0xd8, 0x79, 0x3f, 0x56, 0xd1, 0x5e, 0x3c, - 0x77, 0xcf, 0xda, 0x83, 0x08, 0xb8, 0x5e, 0xeb, 0xcb, 0x0f, 0xc7, 0xf4, 0x90, 0xbd, 0x6c, 0x91, 0xa2, 0xfc, 0x81, - 0x04, 0xce, 0x07, 0x84, 0x30, 0x13, 0x58, 0x05, 0x0b, 0xe5, 0x95, 0x04, 0x56, 0x81, 0x8f, 0x18, 0xb5, 0x98, 0x9d, - 0x96, 0xde, 0xfb, 0xa4, 0x58, 0xe3, 0x26, 0xc4, 0x0b, 0x40, 0x5e, 0x4f, 0x21, 0xb2, 0x85, 0x28, 0xd0, 0x4c, 0x11, - 0x24, 0xfc, 0x80, 0x7d, 0x78, 0x81, 0xd6, 0x8f, 0xe9, 0xc8, 0x57, 0xb3, 0x72, 0x07, 0x6d, 0x3d, 0xb6, 0xa7, 0x2a, - 0x5d, 0x35, 0x29, 0x3e, 0x4a, 0xbc, 0x93, 0x58, 0x34, 0xf0, 0xca, 0x15, 0x3b, 0xbd, 0xf3, 0x81, 0xdf, 0xb0, 0x2d, - 0x73, 0xfc, 0xf2, 0x34, 0xc7, 0x15, 0xa8, 0x1a, 0x55, 0x68, 0xbb, 0x3d, 0x40, 0xa6, 0xa6, 0x57, 0x09, 0xe2, 0xb0, - 0x69, 0x1a, 0x2e, 0x40, 0x07, 0x0e, 0x51, 0x09, 0xa4, 0x4c, 0x35, 0x0b, 0x34, 0x72, 0x8d, 0x14, 0x36, 0x5b, 0xb3, - 0xa8, 0x4d, 0xd8, 0xe7, 0xdf, 0xd0, 0xbc, 0xb6, 0x2d, 0x9f, 0x88, 0x3b, 0x54, 0xf2, 0x19, 0xbc, 0xf4, 0xe1, 0x1e, - 0xdf, 0x03, 0x76, 0xe4, 0x4a, 0xc5, 0xc8, 0x94, 0xc4, 0xf6, 0x78, 0x41, 0xb5, 0xc9, 0x3c, 0x79, 0x54, 0xa7, 0x26, - 0x6c, 0x28, 0x57, 0x38, 0x61, 0xfb, 0x11, 0xbb, 0x80, 0x77, 0x28, 0x31, 0x37, 0xd5, 0x6f, 0x0e, 0xa1, 0xab, 0x3d, - 0xf0, 0xae, 0x8c, 0x7e, 0x79, 0xf9, 0x62, 0x8b, 0xb7, 0xb9, 0x83, 0xbf, 0xa6, 0xc1, 0xb6, 0x50, 0x1c, 0xea, 0xae, - 0x80, 0xf4, 0xb2, 0x97, 0x2b, 0x45, 0x49, 0x6f, 0xcd, 0xe0, 0xa9, 0xde, 0x20, 0x5d, 0x34, 0x05, 0xea, 0x60, 0xd2, - 0x83, 0x30, 0x21, 0xc8, 0x01, 0x95, 0xd1, 0xbb, 0x2b, 0xd9, 0xe2, 0x5e, 0xf0, 0x6c, 0x08, 0xc8, 0xd0, 0x8a, 0xe4, - 0xd3, 0x28, 0x8d, 0xba, 0x64, 0x68, 0x8f, 0x4d, 0x2c, 0x13, 0x80, 0x64, 0x57, 0xaf, 0x2c, 0x91, 0x09, 0x60, 0x0b, - 0xec, 0xd9, 0x3c, 0x86, 0xe1, 0xdb, 0xed, 0xc9, 0x80, 0xb1, 0x65, 0xf6, 0xbe, 0xa7, 0x9b, 0x8f, 0x26, 0xe4, 0x1a, - 0x6a, 0x0d, 0xc7, 0x39, 0x30, 0x64, 0xaa, 0x68, 0xf0, 0xc9, 0x86, 0x68, 0xc2, 0xda, 0x5c, 0x76, 0x5d, 0x08, 0x61, - 0xd0, 0x63, 0x53, 0x58, 0x41, 0x5c, 0x3b, 0xd6, 0xb0, 0xbe, 0x58, 0x46, 0xa0, 0x69, 0x4d, 0x1f, 0xc8, 0x98, 0xb6, - 0x97, 0x08, 0x75, 0x27, 0xca, 0x37, 0xcc, 0x69, 0x16, 0xc4, 0x7d, 0xaf, 0xcb, 0xe7, 0x1a, 0x36, 0x7e, 0xa2, 0x62, - 0xae, 0xa7, 0xba, 0x85, 0x01, 0xea, 0x40, 0x5c, 0x0c, 0xf8, 0x78, 0x1b, 0x42, 0x5f, 0xf9, 0x77, 0xd8, 0xf7, 0x4a, - 0x29, 0x8f, 0x3a, 0x3e, 0x2d, 0x35, 0x72, 0xd4, 0x5e, 0xf6, 0x7f, 0xb2, 0xfa, 0x90, 0x3f, 0x56, 0xa8, 0xd0, 0x84, - 0x34, 0x34, 0x89, 0xba, 0x79, 0x02, 0xb1, 0xed, 0x7b, 0xae, 0xd0, 0x8b, 0x45, 0xa4, 0x3c, 0x02, 0xba, 0x29, 0x8f, - 0x77, 0xab, 0x19, 0x46, 0x7c, 0xab, 0xd7, 0xda, 0x68, 0x4b, 0x34, 0x8b, 0x23, 0xde, 0x45, 0x3b, 0x3b, 0x9c, 0xca, - 0x48, 0xcf, 0x4e, 0xe1, 0x38, 0x27, 0xd1, 0xbb, 0x74, 0xd8, 0x69, 0xae, 0xbe, 0x7e, 0x67, 0x43, 0x1f, 0xe2, 0x6a, - 0x21, 0x6a, 0x7b, 0xce, 0x68, 0x6e, 0x26, 0x2e, 0x10, 0x0b, 0xa0, 0xd9, 0xbb, 0x57, 0xa9, 0xa6, 0xc9, 0x98, 0x71, - 0x59, 0xcc, 0x12, 0x29, 0xc2, 0x0e, 0xe8, 0x25, 0x9a, 0x30, 0x51, 0x75, 0x9c, 0x1b, 0xb1, 0xe7, 0xa3, 0xba, 0x29, - 0x77, 0x25, 0x19, 0x94, 0x45, 0xeb, 0xb6, 0xeb, 0xe5, 0x25, 0xf4, 0x7e, 0x1e, 0x70, 0x5d, 0x1b, 0x2b, 0x38, 0x61, - 0x0b, 0x13, 0x9f, 0x25, 0x41, 0x6e, 0x8d, 0x24, 0x5b, 0x84, 0xa5, 0x7a, 0x67, 0xfe, 0x69, 0xe9, 0xd5, 0x76, 0xa4, - 0x5e, 0x38, 0xcc, 0xdc, 0x9e, 0x85, 0xe5, 0x57, 0xc0, 0xe3, 0xbc, 0xf7, 0xbc, 0x11, 0x9a, 0xf2, 0xc7, 0xab, 0x3d, - 0xa8, 0x88, 0x66, 0x63, 0x47, 0x3d, 0x91, 0x6b, 0xba, 0xa9, 0x82, 0x6b, 0x32, 0xd1, 0xea, 0x41, 0x9c, 0x59, 0xd1, - 0x76, 0x62, 0x19, 0xfc, 0x33, 0xd8, 0xe0, 0x1b, 0xd8, 0x17, 0x4b, 0x00, 0xeb, 0x37, 0xc6, 0x57, 0x21, 0x0f, 0xcb, - 0xf7, 0x74, 0x7e, 0x86, 0xb0, 0xaf, 0x30, 0x57, 0x24, 0x2c, 0x4f, 0x95, 0x5a, 0xc9, 0x41, 0xc5, 0xb4, 0x7c, 0x6e, - 0xc1, 0x27, 0xd5, 0x56, 0x29, 0x5e, 0xff, 0x55, 0x5c, 0xab, 0xd0, 0xf9, 0x79, 0xa2, 0x10, 0xe2, 0xfe, 0x23, 0x12, - 0x55, 0x94, 0x9f, 0x86, 0xdb, 0x66, 0xdf, 0xc3, 0x8f, 0x1b, 0x7e, 0xd0, 0x65, 0x81, 0xca, 0xaa, 0x71, 0x83, 0x71, - 0xb8, 0x3c, 0xcd, 0xaa, 0x11, 0x0b, 0x45, 0xf8, 0xc6, 0xa5, 0x03, 0x47, 0x6f, 0x63, 0xab, 0xe6, 0x52, 0x85, 0x2a, - 0x20, 0xf6, 0x14, 0x7a, 0xde, 0x44, 0x35, 0x52, 0x2a, 0x12, 0x08, 0x93, 0x06, 0xed, 0x12, 0x17, 0xec, 0x16, 0xab, - 0x76, 0xb5, 0xbb, 0x15, 0xf3, 0x9a, 0x4c, 0x04, 0x8c, 0xf1, 0x0e, 0xb4, 0x6e, 0x66, 0x4b, 0x06, 0x74, 0x4e, 0xec, - 0xa8, 0xc0, 0x79, 0x8c, 0x71, 0x70, 0xb8, 0xc7, 0xcd, 0xf4, 0xa4, 0x92, 0x1d, 0x66, 0xe4, 0xa1, 0x39, 0x74, 0x86, - 0x2b, 0x0f, 0xe5, 0x21, 0x2b, 0x71, 0xb6, 0xc0, 0xcb, 0x35, 0x72, 0x95, 0xe8, 0xaa, 0x25, 0x68, 0x78, 0x20, 0xb9, - 0xdb, 0x37, 0xdf, 0xbd, 0xd3, 0xbb, 0x01, 0xa7, 0xd2, 0xdf, 0x0c, 0xd8, 0x1d, 0x2c, 0x78, 0xb7, 0x3a, 0x1d, 0x4b, - 0x0c, 0x00, 0x64, 0xd7, 0xf4, 0x83, 0xb0, 0x85, 0xee, 0x74, 0x87, 0x6b, 0xc7, 0x55, 0x04, 0x6d, 0x88, 0xaa, 0x8c, - 0xa1, 0x23, 0xbb, 0x88, 0x04, 0xb2, 0xeb, 0x88, 0x15, 0xdd, 0x32, 0x16, 0xc2, 0x09, 0x3c, 0xee, 0x01, 0xf5, 0x83, - 0x23, 0xa4, 0x54, 0x44, 0x42, 0xc9, 0x85, 0xf8, 0xdb, 0x34, 0xd4, 0xac, 0xe0, 0x6e, 0xb3, 0x21, 0x76, 0x93, 0x88, - 0xfe, 0xa0, 0x2a, 0xbc, 0x39, 0x8f, 0xf2, 0xad, 0x03, 0x0a, 0x1f, 0xcd, 0xc8, 0xc0, 0x59, 0xda, 0xb7, 0xa7, 0x5d, - 0x7b, 0x37, 0xe6, 0xa5, 0xb4, 0x94, 0x0a, 0xc1, 0xcd, 0x1d, 0x3c, 0xeb, 0x1f, 0x5c, 0x49, 0x13, 0x9b, 0x9a, 0x7d, - 0x99, 0x73, 0xb4, 0x33, 0xe5, 0x79, 0x14, 0x5f, 0x6b, 0xd9, 0xf3, 0xb6, 0x79, 0x36, 0x76, 0x67, 0xb7, 0x8b, 0xfd, - 0x0c, 0x49, 0x61, 0x8b, 0x19, 0xcc, 0x35, 0x89, 0x62, 0x12, 0x18, 0x6d, 0x80, 0xbd, 0x89, 0x66, 0xd8, 0x45, 0x0b, - 0x94, 0xbd, 0x5b, 0x77, 0x6b, 0xc3, 0xf1, 0xdb, 0xcc, 0xd7, 0xaa, 0xf6, 0xc2, 0x9d, 0x12, 0x05, 0xe7, 0xc3, 0xde, - 0x39, 0xaf, 0xff, 0xa3, 0xc4, 0x9b, 0x19, 0xc6, 0x92, 0x48, 0xb4, 0x36, 0x10, 0x3c, 0x4a, 0xeb, 0xb5, 0x59, 0x96, - 0x20, 0x3b, 0xb5, 0xbc, 0xfd, 0x07, 0x1d, 0x20, 0x15, 0xe3, 0xdd, 0xe2, 0xe6, 0x0c, 0x0b, 0x8e, 0x49, 0xa9, 0x2d, - 0x37, 0xbf, 0xfe, 0x49, 0x32, 0xa5, 0xa2, 0x4d, 0xae, 0x27, 0x9a, 0xe7, 0xe2, 0xca, 0x01, 0x80, 0x40, 0x69, 0x36, - 0xac, 0x8b, 0xeb, 0xcd, 0x64, 0x73, 0xab, 0xd0, 0x11, 0x66, 0xaa, 0xc0, 0xf8, 0x9b, 0x55, 0x4a, 0x4f, 0xa9, 0x56, - 0x49, 0xc2, 0xdc, 0x4e, 0x5f, 0xab, 0x44, 0x68, 0x3f, 0x06, 0xe2, 0xdb, 0xc9, 0x77, 0xf5, 0xa7, 0x6c, 0x8b, 0x3c, - 0x8e, 0x03, 0x93, 0xb3, 0xb7, 0x76, 0x50, 0xd0, 0xa8, 0xed, 0x5c, 0x8e, 0xd7, 0x3c, 0x2b, 0xa8, 0x7d, 0xe5, 0x57, - 0xb3, 0xb5, 0xc7, 0x17, 0xee, 0x08, 0xb2, 0x02, 0xa9, 0xc7, 0xe4, 0xc1, 0x34, 0x46, 0xa5, 0xd9, 0x39, 0x2f, 0x76, - 0x58, 0x1e, 0x93, 0x64, 0xd7, 0xf8, 0xcf, 0xc8, 0xa5, 0x14, 0x48, 0xfe, 0xc4, 0xb9, 0x13, 0x2a, 0x16, 0xb3, 0x64, - 0x61, 0x6a, 0xd7, 0x24, 0x2f, 0xdf, 0xc5, 0x75, 0x3c, 0x2d, 0xc7, 0x7f, 0x56, 0x4c, 0xf4, 0x24, 0x10, 0x52, 0xeb, - 0x1d, 0x0d, 0x1e, 0x40, 0xdd, 0x3a, 0x83, 0x6f, 0x64, 0xf3, 0x50, 0x24, 0x83, 0x8c, 0xd9, 0x56, 0xdd, 0xa5, 0x1a, - 0x89, 0x7a, 0xb0, 0x0c, 0xb4, 0xdb, 0x49, 0xe0, 0x12, 0xb5, 0xf6, 0x10, 0x1c, 0x54, 0xf4, 0x3e, 0x54, 0xc1, 0x52, - 0x33, 0x58, 0xaa, 0xac, 0xd4, 0x06, 0x6b, 0x2f, 0xd5, 0xda, 0x32, 0xa3, 0x2b, 0x2f, 0x0f, 0x8e, 0x39, 0x0e, 0x00, - 0x5b, 0xcf, 0xa5, 0x0e, 0x03, 0xe8, 0x44, 0x36, 0x70, 0x03, 0x32, 0x00, 0x65, 0x2d, 0xa1, 0x72, 0xd3, 0x82, 0x73, - 0xad, 0x4d, 0x29, 0x96, 0x80, 0x44, 0x70, 0xc6, 0xfe, 0xe8, 0x51, 0xe9, 0xed, 0xc8, 0x11, 0xae, 0x5a, 0x37, 0x6d, - 0x05, 0x6b, 0xeb, 0x0c, 0x69, 0xe3, 0x31, 0xde, 0x65, 0x3f, 0x01, 0xdf, 0xc5, 0x8b, 0xd6, 0x91, 0x19, 0x6f, 0x71, - 0xa4, 0x20, 0x14, 0xba, 0xde, 0x31, 0x16, 0xa6, 0x04, 0x86, 0xd9, 0xdd, 0x15, 0x61, 0x7a, 0x7b, 0x29, 0x20, 0x58, - 0xb8, 0xb1, 0x16, 0x37, 0x0e, 0xcf, 0x6f, 0x1c, 0x26, 0x8a, 0x70, 0x68, 0xa6, 0x4a, 0xf8, 0x5c, 0xaa, 0x0c, 0x05, - 0x39, 0x35, 0x38, 0x0a, 0xdc, 0xdf, 0xbe, 0x77, 0xb4, 0x28, 0x12, 0x82, 0x2c, 0x2e, 0x43, 0x13, 0xe5, 0x75, 0xc6, - 0x05, 0xe9, 0xcb, 0xe1, 0xfe, 0x62, 0x6e, 0x87, 0xa9, 0x59, 0x99, 0xb7, 0x48, 0x7c, 0x6f, 0x5a, 0x8c, 0x11, 0xe1, - 0x7c, 0xaf, 0x5d, 0x60, 0x8b, 0xb5, 0xec, 0x6f, 0x3f, 0xee, 0x09, 0x57, 0x16, 0x0e, 0x0c, 0x5d, 0x64, 0xda, 0xab, - 0x75, 0xb7, 0x52, 0xc4, 0xf9, 0x47, 0xf4, 0xc8, 0xfc, 0xc1, 0x38, 0x8e, 0x1d, 0xdc, 0xee, 0x84, 0xda, 0xe7, 0xfc, - 0x86, 0x85, 0x3a, 0xa2, 0xd5, 0x0d, 0xd4, 0xb0, 0x06, 0x97, 0xca, 0x2c, 0x2d, 0xe6, 0x9f, 0xdd, 0xdc, 0x3c, 0x25, - 0xe0, 0x24, 0xf1, 0x05, 0x24, 0xd9, 0xe1, 0x7a, 0xf7, 0xe9, 0x2d, 0x93, 0xbe, 0x0d, 0x92, 0x12, 0xbb, 0x95, 0xca, - 0x76, 0x49, 0xd3, 0x94, 0x1d, 0xee, 0x8a, 0xaa, 0x35, 0xd8, 0x13, 0x13, 0xa5, 0xa3, 0xbe, 0x10, 0x26, 0x4d, 0xec, - 0x4b, 0x18, 0xef, 0x8b, 0x09, 0x9c, 0x37, 0x0c, 0xf1, 0xaa, 0x03, 0xa5, 0x50, 0x22, 0x65, 0x2f, 0xbb, 0xe3, 0x4d, - 0x69, 0x26, 0x1f, 0x51, 0xc5, 0x81, 0x96, 0xde, 0x5a, 0xee, 0x4a, 0x00, 0xd0, 0xbd, 0xba, 0xbc, 0xfc, 0xfd, 0xc1, - 0x7d, 0x8c, 0x95, 0xc8, 0x37, 0xef, 0xf7, 0xc3, 0xd3, 0xfd, 0x17, 0x12, 0xc1, 0x81, 0xe6, 0x71, 0x7a, 0xf9, 0x5d, - 0xa5, 0x8b, 0x5b, 0xd5, 0xf7, 0xab, 0xa0, 0x8c, 0xd4, 0xe3, 0xee, 0x2c, 0x6c, 0x09, 0x26, 0xac, 0x0d, 0x38, 0x67, - 0x3e, 0x08, 0x65, 0x2e, 0xff, 0xfa, 0x2c, 0xce, 0xdd, 0x78, 0x58, 0x78, 0x26, 0xb0, 0xb1, 0x31, 0xd4, 0x61, 0xae, - 0x3b, 0xf3, 0xe9, 0xe0, 0x19, 0xb9, 0xee, 0x1a, 0x32, 0x2c, 0x8d, 0x03, 0xbe, 0xde, 0xfa, 0xf1, 0xfe, 0x3f, 0x8f, - 0x5f, 0x06, 0xe6, 0x81, 0x99, 0xf1, 0x1c, 0x95, 0xf6, 0xb0, 0xa4, 0xc1, 0x61, 0x64, 0x3b, 0xea, 0xda, 0xbf, 0x47, - 0x23, 0x82, 0x8c, 0x10, 0x21, 0xc7, 0xa1, 0x1d, 0x43, 0x39, 0x3d, 0x8e, 0x55, 0x95, 0xf6, 0xa2, 0x37, 0x18, 0x37, - 0xb2, 0x85, 0x22, 0x60, 0x4a, 0xf4, 0xfd, 0xea, 0xac, 0x2a, 0xee, 0x4d, 0xff, 0xf2, 0xe8, 0x8b, 0xec, 0xaa, 0x51, - 0x03, 0xe1, 0x77, 0x24, 0xaa, 0xa2, 0x37, 0x96, 0xef, 0xb4, 0x05, 0x5b, 0x43, 0x0e, 0x8c, 0x1a, 0x49, 0x9b, 0x11, - 0x3b, 0x6f, 0x32, 0xe7, 0x92, 0x2f, 0xd4, 0x58, 0x7a, 0x94, 0x93, 0x65, 0x0a, 0x00, 0xd3, 0x95, 0x16, 0x11, 0x17, - 0x18, 0x82, 0x2b, 0x0e, 0xab, 0x5b, 0xc8, 0x8c, 0xf5, 0x6c, 0x77, 0x16, 0x8d, 0x26, 0x08, 0xd3, 0xfa, 0x90, 0xa8, - 0x30, 0x73, 0xca, 0xa4, 0x0c, 0x97, 0xda, 0x09, 0xc8, 0x93, 0xdf, 0xd2, 0x8a, 0x01, 0x98, 0x31, 0x91, 0x5c, 0x6e, - 0x6c, 0x22, 0xeb, 0x90, 0xcf, 0x49, 0xbf, 0x99, 0xf3, 0xe1, 0x9b, 0x18, 0x1f, 0x5c, 0x9c, 0x06, 0xeb, 0x0f, 0x50, - 0xf2, 0xdc, 0x0d, 0x97, 0xab, 0x4d, 0xda, 0x72, 0x5b, 0xd1, 0x16, 0x8c, 0x89, 0x76, 0x79, 0x61, 0x9b, 0xa8, 0x40, - 0x9f, 0x49, 0x6f, 0xb8, 0x06, 0xa2, 0x1c, 0x06, 0xf1, 0x52, 0x0e, 0xc5, 0xcd, 0xda, 0x23, 0x54, 0x69, 0x2c, 0x50, - 0x03, 0x2b, 0x7c, 0xc2, 0x30, 0xaa, 0x26, 0xd8, 0x7d, 0xff, 0xd8, 0xe0, 0xcb, 0xd5, 0xb7, 0x83, 0x35, 0x6f, 0x5a, - 0x26, 0xda, 0x21, 0x3a, 0x9c, 0x83, 0x8a, 0x87, 0xd8, 0x69, 0x92, 0xd3, 0x60, 0xea, 0x7a, 0x72, 0xb9, 0x21, 0x63, - 0x33, 0x19, 0x69, 0x7a, 0xc0, 0x1d, 0xe6, 0xb6, 0x1f, 0x1a, 0xcc, 0x21, 0x8e, 0x8d, 0xa3, 0xba, 0x71, 0x9d, 0x31, - 0x84, 0x40, 0x27, 0x48, 0xa7, 0x3b, 0xa3, 0xcb, 0x8b, 0xf2, 0xd6, 0xda, 0x34, 0x74, 0x64, 0xdf, 0x9a, 0xee, 0x38, - 0xc2, 0x88, 0x88, 0xc7, 0x4c, 0x17, 0x2c, 0x2c, 0xb5, 0xb3, 0xb8, 0x29, 0x62, 0x39, 0xb6, 0x23, 0xac, 0x06, 0x60, - 0x16, 0xd8, 0xef, 0xcc, 0x4b, 0xef, 0x35, 0x7a, 0x21, 0x7c, 0xb0, 0x91, 0xf3, 0xb2, 0x98, 0x91, 0xb9, 0xef, 0xd0, - 0x14, 0x1e, 0xb8, 0x3f, 0x55, 0xa7, 0x15, 0x1c, 0xc4, 0xda, 0x71, 0xf4, 0xf7, 0x03, 0x6a, 0x89, 0x17, 0x04, 0x21, - 0x9c, 0x8a, 0xcd, 0x96, 0x0e, 0x88, 0x7d, 0x88, 0x65, 0x6a, 0x00, 0x42, 0x50, 0x0e, 0x56, 0xbb, 0x4f, 0x3b, 0x7d, - 0x8f, 0xd0, 0xf7, 0x11, 0xf3, 0x4d, 0x80, 0xcc, 0x14, 0x94, 0x27, 0x6a, 0x9f, 0x92, 0x88, 0x9e, 0xfc, 0xa4, 0x9b, - 0x6c, 0xd6, 0xa6, 0x4e, 0x02, 0xa5, 0x23, 0x4e, 0xde, 0x62, 0x14, 0xce, 0x8b, 0x13, 0x06, 0x74, 0xbd, 0x14, 0x83, - 0x69, 0xe3, 0x8b, 0xe2, 0x95, 0x2d, 0xa7, 0x86, 0xfd, 0x38, 0xb7, 0x35, 0x27, 0x1c, 0x8e, 0x32, 0x51, 0xf6, 0x4e, - 0x95, 0x1e, 0x0a, 0xac, 0x9b, 0x06, 0xea, 0xfd, 0x84, 0x5d, 0x70, 0xb7, 0x3d, 0x3e, 0xa6, 0x72, 0x04, 0x15, 0x42, - 0x21, 0x41, 0x2d, 0x53, 0xfa, 0x23, 0xe6, 0x39, 0x35, 0x62, 0xaf, 0x3c, 0x2a, 0x65, 0x22, 0x88, 0xc7, 0x3e, 0x7b, - 0xb0, 0xc7, 0x16, 0x08, 0x87, 0x1d, 0x4e, 0x74, 0xa5, 0x80, 0x7e, 0x90, 0x36, 0x82, 0x9d, 0x8f, 0x85, 0x22, 0x59, - 0x80, 0x62, 0x68, 0x37, 0xe2, 0xa4, 0xca, 0xee, 0x92, 0xd0, 0xef, 0xc5, 0x02, 0x67, 0x76, 0x2e, 0x81, 0xe4, 0x3a, - 0x5b, 0x18, 0x64, 0x54, 0x08, 0xed, 0x16, 0x12, 0x10, 0xa6, 0x74, 0x91, 0x0f, 0xf8, 0x91, 0x5e, 0x2a, 0x97, 0x0a, - 0xc9, 0xd3, 0xa5, 0xcf, 0xe1, 0x97, 0x1d, 0xb5, 0xe2, 0xc6, 0x5b, 0x1b, 0xe5, 0x1a, 0xe5, 0x62, 0xd6, 0xfc, 0x47, - 0xec, 0x71, 0x89, 0x74, 0x6c, 0x81, 0xb5, 0xa1, 0x1b, 0x54, 0x96, 0xd2, 0xc0, 0x89, 0x07, 0x12, 0xa9, 0xdb, 0x0e, - 0x47, 0xda, 0xa2, 0xf6, 0x93, 0xbd, 0x57, 0xd7, 0xa0, 0xf4, 0xcc, 0x7a, 0x2b, 0x71, 0x68, 0x2a, 0x64, 0x91, 0x55, - 0xd5, 0x80, 0x95, 0x7c, 0x1c, 0xd2, 0x64, 0x88, 0xee, 0x92, 0xc4, 0x93, 0xcc, 0xe9, 0x37, 0x99, 0xe9, 0x45, 0xff, - 0xa3, 0x12, 0x95, 0x0f, 0x65, 0xff, 0x93, 0x1c, 0xcf, 0x3a, 0xa9, 0x1f, 0x85, 0xd3, 0x90, 0xc6, 0x26, 0x13, 0x30, - 0x80, 0xd5, 0x86, 0x39, 0x94, 0x19, 0x2d, 0x5b, 0xc5, 0xb9, 0xdb, 0x46, 0x4a, 0x6c, 0xe8, 0x27, 0x3b, 0x06, 0xec, - 0x8f, 0xbf, 0x02, 0x71, 0xc0, 0x23, 0x66, 0x1c, 0xec, 0xad, 0x98, 0xb4, 0xa9, 0x28, 0xf8, 0x5d, 0x69, 0x34, 0x81, - 0x6b, 0x3a, 0xa4, 0x69, 0x73, 0xe5, 0x18, 0x32, 0xbd, 0x6c, 0xcc, 0x84, 0x98, 0x39, 0x78, 0x46, 0x28, 0xf6, 0xdf, - 0xfd, 0x77, 0x09, 0x8e, 0x16, 0x8d, 0xf2, 0xe4, 0xb4, 0x0e, 0xe6, 0x56, 0x5d, 0x7a, 0xe7, 0x7e, 0x08, 0x69, 0x03, - 0x80, 0xca, 0x9d, 0xed, 0x59, 0x88, 0xbb, 0xdb, 0x2a, 0x44, 0x1f, 0xcc, 0x52, 0x93, 0xf2, 0xae, 0x97, 0x6c, 0x2c, - 0x61, 0x9e, 0x32, 0x2b, 0x87, 0xd6, 0x81, 0x9d, 0xfd, 0x63, 0xfa, 0x1f, 0xc9, 0xf7, 0x9b, 0xfc, 0x7c, 0xb7, 0x46, - 0x14, 0x98, 0x91, 0x57, 0xf4, 0x3e, 0x07, 0xa0, 0xde, 0x40, 0x24, 0x97, 0xe5, 0x3d, 0x5c, 0xd4, 0x3d, 0xfc, 0x65, - 0x2e, 0x1a, 0x1f, 0x78, 0xcc, 0x57, 0x94, 0xdb, 0x0f, 0x1b, 0x1e, 0x08, 0x44, 0xee, 0x02, 0x23, 0x4c, 0xff, 0x3e, - 0x39, 0xe6, 0xe3, 0xa9, 0xf0, 0xca, 0xab, 0x17, 0xb0, 0xea, 0x89, 0x0f, 0xaf, 0xcf, 0xb0, 0xb5, 0xff, 0x44, 0x66, - 0x15, 0x97, 0x60, 0x66, 0xb0, 0xa8, 0xb8, 0x5f, 0x73, 0x65, 0x07, 0x17, 0xad, 0xee, 0x3b, 0x19, 0xff, 0x7c, 0x19, - 0xee, 0xbe, 0x7e, 0xee, 0x14, 0x8d, 0x73, 0x78, 0x8f, 0x71, 0xc4, 0x35, 0x2e, 0xe1, 0xed, 0xc7, 0x67, 0x55, 0x37, - 0xf7, 0x8c, 0x7d, 0xd6, 0x74, 0x63, 0x55, 0x33, 0xb4, 0x21, 0x71, 0xfe, 0xc3, 0xd6, 0x5f, 0x2c, 0xbc, 0xd8, 0xfd, - 0xc4, 0x4e, 0x8a, 0xac, 0x0b, 0x5a, 0xb7, 0x5d, 0xab, 0xf2, 0x83, 0x01, 0x97, 0x3a, 0x1e, 0x4b, 0xb6, 0x3a, 0xbb, - 0x5f, 0x8c, 0x3f, 0x9a, 0x09, 0xb4, 0x3f, 0xfa, 0xe0, 0x66, 0x09, 0x55, 0x7b, 0x9c, 0xd1, 0xdd, 0xb7, 0x3f, 0x7b, - 0x39, 0x76, 0x59, 0x9a, 0xf8, 0xdc, 0x27, 0xc7, 0xc8, 0x13, 0xe9, 0x2d, 0xb4, 0x0a, 0xc3, 0xf4, 0xdc, 0x3d, 0x44, - 0x6a, 0x91, 0x2c, 0x3d, 0x7b, 0x0b, 0x97, 0x9c, 0xd0, 0x99, 0x7e, 0x29, 0x09, 0x75, 0xdb, 0x6b, 0xc5, 0x25, 0x62, - 0x7e, 0x8d, 0xd4, 0xc0, 0x55, 0x12, 0x3c, 0x44, 0x44, 0xa0, 0xb3, 0x17, 0xe5, 0x33, 0x45, 0x75, 0x85, 0x57, 0x7f, - 0x8d, 0xb2, 0x80, 0x57, 0x66, 0xe3, 0x61, 0xe5, 0x4c, 0x1f, 0x9d, 0xd6, 0x59, 0xae, 0xcb, 0x00, 0x72, 0x71, 0x01, - 0x4e, 0xec, 0xdf, 0x72, 0x06, 0xc3, 0xda, 0x86, 0xfb, 0x23, 0x35, 0x1a, 0xa3, 0xe4, 0x1b, 0x02, 0x30, 0x0a, 0x8a, - 0x36, 0xb3, 0xef, 0x36, 0xa4, 0x0b, 0x19, 0xd5, 0xfb, 0xfd, 0xf7, 0xfc, 0xe5, 0xd1, 0x77, 0xbe, 0x5d, 0x7a, 0xad, - 0x85, 0x49, 0x65, 0x91, 0xad, 0xa3, 0x83, 0xec, 0xae, 0x87, 0x6d, 0x90, 0xdf, 0x74, 0x9f, 0x49, 0x37, 0x2f, 0x06, - 0xd8, 0xd2, 0xf6, 0x23, 0x32, 0x8d, 0x24, 0x51, 0xc8, 0xb1, 0x96, 0x22, 0xa8, 0x65, 0x20, 0x15, 0x47, 0x0e, 0x0f, - 0x4f, 0x46, 0xbe, 0x99, 0x33, 0x0e, 0x2d, 0x69, 0x0b, 0xd8, 0x18, 0xd6, 0xdd, 0xd7, 0x52, 0x9b, 0x65, 0xd6, 0xab, - 0x47, 0x76, 0x22, 0xbc, 0xe0, 0x08, 0x4a, 0xec, 0x53, 0x48, 0x0b, 0xab, 0xb1, 0x0c, 0x6e, 0x5e, 0x4f, 0x28, 0xa0, - 0x6d, 0x2e, 0x9d, 0x53, 0xab, 0xc8, 0x57, 0xfc, 0x7c, 0x58, 0x83, 0x21, 0xf9, 0xd6, 0x4a, 0xc1, 0xc6, 0xae, 0x55, - 0xa5, 0xf1, 0x1c, 0x6f, 0x68, 0x52, 0x1c, 0x1d, 0xed, 0x51, 0x76, 0x08, 0x47, 0x63, 0x70, 0x73, 0x6f, 0xa8, 0xa4, - 0x4c, 0x63, 0xdf, 0x4b, 0xd2, 0xbf, 0xea, 0xcb, 0x50, 0x25, 0x24, 0x8a, 0xf9, 0x1f, 0x54, 0x63, 0x0e, 0x3c, 0x52, - 0x1f, 0xbd, 0xc8, 0x04, 0xa3, 0x85, 0x42, 0x74, 0x83, 0x87, 0x9d, 0x3a, 0x11, 0xcf, 0x5e, 0xa2, 0x70, 0xd2, 0xbd, - 0x24, 0x9a, 0x17, 0xfe, 0xd9, 0x6f, 0x9e, 0x7b, 0x01, 0xd0, 0x29, 0x2c, 0x9d, 0x31, 0x70, 0xca, 0x9a, 0x74, 0xa4, - 0xe0, 0xd6, 0x68, 0xa0, 0x09, 0x6c, 0xc1, 0xd3, 0xa9, 0x0c, 0xb9, 0x28, 0x67, 0x96, 0xf4, 0x64, 0x17, 0x53, 0x6a, - 0xcd, 0xf7, 0x85, 0xb2, 0xb0, 0x7e, 0xb7, 0x79, 0x94, 0x3b, 0x47, 0x66, 0x25, 0x82, 0x45, 0x9e, 0x02, 0xaf, 0x5c, - 0xde, 0x78, 0xd1, 0xe8, 0x39, 0x78, 0x99, 0x9a, 0x79, 0x0e, 0x07, 0x79, 0xe9, 0x2f, 0xbc, 0x78, 0xfb, 0x7e, 0x0f, - 0xfa, 0x1a, 0xb9, 0x0a, 0x8b, 0xa8, 0x07, 0xe4, 0xbc, 0xe3, 0xa8, 0xbb, 0xfb, 0xe0, 0x93, 0x8e, 0x97, 0x5c, 0x35, - 0x3e, 0x84, 0xbf, 0xa4, 0xd1, 0x17, 0x92, 0xa0, 0x39, 0x15, 0x52, 0x60, 0xe0, 0xaf, 0x5b, 0xd8, 0xf8, 0x3e, 0x4b, - 0xb7, 0x23, 0x26, 0x7f, 0xf5, 0xbe, 0xd2, 0x93, 0x5d, 0x8f, 0x49, 0x3d, 0x05, 0x8a, 0x3a, 0x3b, 0x5a, 0x36, 0x23, - 0xad, 0xd4, 0xbc, 0x5b, 0xb8, 0xf5, 0x81, 0x4f, 0xe9, 0xc0, 0x8e, 0x02, 0x77, 0x41, 0x2c, 0x9e, 0x71, 0x7e, 0x6d, - 0x66, 0xb7, 0x3e, 0xfb, 0x2e, 0x03, 0x8c, 0x5a, 0x4f, 0xf4, 0x41, 0x10, 0xdf, 0x67, 0x47, 0xac, 0xbb, 0x04, 0x96, - 0x60, 0x4c, 0x4f, 0xdb, 0x24, 0x9c, 0x96, 0xfb, 0x64, 0x7e, 0xc8, 0xc6, 0x04, 0x8a, 0x4a, 0x31, 0x57, 0x81, 0x4f, - 0x26, 0x40, 0xcc, 0x21, 0x25, 0xdb, 0xab, 0x33, 0xf9, 0x44, 0xcc, 0x85, 0x2a, 0x45, 0x73, 0x31, 0x02, 0x42, 0x90, - 0xc3, 0x8c, 0xed, 0x3f, 0xc2, 0x85, 0x08, 0x70, 0x87, 0x83, 0x2c, 0x73, 0xde, 0xe0, 0xaa, 0xcc, 0x2f, 0x00, 0x73, - 0x19, 0xea, 0xad, 0xc6, 0x4e, 0x8f, 0x61, 0xf9, 0x7d, 0x1a, 0x64, 0xbd, 0x22, 0x77, 0x61, 0x19, 0xc2, 0xeb, 0xa2, - 0x54, 0x8d, 0x40, 0xba, 0x3b, 0x8c, 0xd3, 0xaf, 0x20, 0x61, 0xfa, 0x59, 0x02, 0x9e, 0xa3, 0x38, 0x11, 0x0b, 0xfe, - 0xdc, 0xd0, 0xa5, 0x13, 0xe4, 0x80, 0xa1, 0x1e, 0x9e, 0x5e, 0x51, 0xf7, 0x92, 0x1d, 0xdd, 0x6d, 0x59, 0xa5, 0xec, - 0x6f, 0x27, 0xf2, 0x63, 0xd9, 0x39, 0x5e, 0xf2, 0xa6, 0xbb, 0x89, 0xdf, 0x22, 0x8e, 0x02, 0x88, 0x63, 0x55, 0x76, - 0xa1, 0x4a, 0x44, 0xbe, 0x2e, 0x9c, 0x39, 0xe5, 0x79, 0x64, 0xc9, 0xce, 0xdb, 0xdd, 0x77, 0xa6, 0xd8, 0x91, 0x66, - 0x76, 0xce, 0x7b, 0xc5, 0x4f, 0x95, 0x12, 0xd3, 0x37, 0x0e, 0xce, 0xfd, 0x9d, 0xf4, 0xfd, 0xf1, 0x70, 0x2c, 0xb1, - 0x9e, 0x5f, 0x73, 0xd5, 0xf6, 0x94, 0xaa, 0x65, 0xad, 0xbf, 0x53, 0xbe, 0xa6, 0x6c, 0xdd, 0xec, 0x67, 0xb0, 0x23, - 0xd7, 0xcc, 0x97, 0x2e, 0xa4, 0x77, 0x7d, 0x39, 0xc9, 0xae, 0x0a, 0xec, 0xd1, 0x07, 0x06, 0xd0, 0xb4, 0xae, 0x0c, - 0xc5, 0x57, 0x6a, 0x19, 0xb9, 0x4c, 0x80, 0xd7, 0xc1, 0x4f, 0x5f, 0xcc, 0x7c, 0x39, 0x66, 0xab, 0x77, 0xde, 0x1f, - 0x31, 0x2f, 0xba, 0xb3, 0xe7, 0x7a, 0x87, 0xb8, 0x18, 0xe7, 0x7d, 0x07, 0x66, 0xe9, 0xb7, 0x1e, 0xf3, 0x79, 0x7f, - 0x9d, 0x60, 0x7f, 0x64, 0x45, 0x30, 0xc8, 0xe0, 0xae, 0x7a, 0xc1, 0x71, 0x16, 0x86, 0x68, 0xda, 0x76, 0x5f, 0xd4, - 0xcc, 0x6d, 0x49, 0xd3, 0xe7, 0xbc, 0xa5, 0x12, 0xf6, 0x8b, 0x3b, 0xce, 0xac, 0xef, 0xbc, 0x83, 0xac, 0xb5, 0xea, - 0xd0, 0xaf, 0x48, 0xbd, 0x0c, 0xeb, 0x3f, 0x81, 0x62, 0xbc, 0xec, 0xb0, 0xda, 0x5a, 0x69, 0x7a, 0xae, 0xca, 0xde, - 0xe1, 0x49, 0x05, 0xa0, 0x14, 0x01, 0x9d, 0x75, 0xe3, 0xb8, 0x9b, 0x02, 0xf5, 0xc5, 0x29, 0xda, 0xf5, 0xf7, 0xd7, - 0xc0, 0x28, 0x88, 0xd4, 0xf7, 0xab, 0xbc, 0x27, 0xfd, 0x95, 0xf8, 0x58, 0x78, 0x45, 0xa1, 0xdb, 0xf2, 0xf8, 0x2f, - 0x8a, 0x94, 0xe9, 0x27, 0x21, 0xdc, 0xf9, 0xb9, 0xba, 0x85, 0x89, 0xf9, 0x74, 0xe9, 0xf9, 0x3d, 0x5a, 0x87, 0x2b, - 0x68, 0x7d, 0xe6, 0x07, 0x69, 0xcc, 0xff, 0x39, 0x56, 0x59, 0xe2, 0x1d, 0x9a, 0xe5, 0xdb, 0x04, 0xc7, 0x74, 0x78, - 0x4a, 0x3a, 0xcf, 0x71, 0x42, 0xa1, 0x1b, 0x94, 0x7a, 0xa7, 0x0e, 0x35, 0x93, 0xc0, 0x42, 0x81, 0x93, 0x7e, 0x44, - 0xf3, 0xa8, 0x38, 0x12, 0xc0, 0xc8, 0xf4, 0xfa, 0xdb, 0x5c, 0x5b, 0xe4, 0xc3, 0x5e, 0xfb, 0x65, 0xe3, 0x5e, 0x1f, - 0x05, 0xc9, 0x7f, 0xc7, 0x01, 0x12, 0x6b, 0x43, 0xf6, 0x26, 0x60, 0x19, 0x51, 0xcc, 0x51, 0xf0, 0x6d, 0x41, 0x52, - 0xa8, 0x54, 0x82, 0x0b, 0x7b, 0x84, 0x85, 0x4b, 0x2d, 0x2d, 0x63, 0x2d, 0x3c, 0x6f, 0x01, 0x3a, 0x3a, 0x7c, 0x5d, - 0x7c, 0x97, 0x9d, 0x5e, 0x0c, 0x92, 0x73, 0x8f, 0x10, 0x24, 0xa8, 0xc7, 0x45, 0x09, 0xb8, 0x6f, 0x56, 0xe3, 0x6b, - 0x41, 0x4d, 0x9a, 0xd4, 0x5d, 0x05, 0xa7, 0xbb, 0x50, 0xc0, 0x65, 0x74, 0xd6, 0x40, 0xd0, 0xf0, 0xdd, 0x91, 0x0c, - 0xb0, 0x2a, 0x48, 0x90, 0xb8, 0xe4, 0x87, 0xc4, 0x4a, 0x45, 0x77, 0x78, 0x47, 0x63, 0xbc, 0xa3, 0xb6, 0x2e, 0x3b, - 0xed, 0x6b, 0xef, 0x36, 0x0c, 0xc2, 0x88, 0xf1, 0x99, 0x81, 0x8e, 0xec, 0xed, 0x80, 0x4d, 0x9e, 0x9d, 0xb0, 0x01, - 0x8f, 0xe5, 0x8e, 0x8c, 0xd6, 0xf9, 0x35, 0xcb, 0x17, 0x7b, 0xda, 0xe7, 0x9e, 0x84, 0x8c, 0x8d, 0x23, 0x70, 0xa3, - 0x06, 0x64, 0x4a, 0x98, 0x25, 0xfc, 0xc8, 0xa1, 0xfa, 0x2c, 0x09, 0xfe, 0x2b, 0x6d, 0x40, 0x01, 0x39, 0xda, 0x93, - 0x4a, 0x92, 0x79, 0x0c, 0xb3, 0x26, 0x85, 0x0f, 0xc8, 0x50, 0xe6, 0xf8, 0x69, 0xa8, 0x29, 0xd6, 0x89, 0xa1, 0x1a, - 0x99, 0x26, 0x86, 0xef, 0x1a, 0xf3, 0x57, 0xdc, 0xfc, 0xd9, 0xab, 0xaa, 0xa7, 0x43, 0xf0, 0x10, 0x4a, 0x09, 0xca, - 0xcd, 0x4c, 0x28, 0x03, 0xe8, 0x17, 0x69, 0xb2, 0x01, 0xad, 0x1f, 0xa1, 0xc3, 0xf7, 0x9b, 0x23, 0x38, 0xb9, 0x2c, - 0x55, 0x58, 0x17, 0x3f, 0xfe, 0x4a, 0x60, 0xef, 0xdd, 0x61, 0xba, 0x51, 0xce, 0xe6, 0xd4, 0x96, 0x4c, 0x5d, 0xf0, - 0x75, 0xb9, 0x3e, 0x09, 0x5e, 0x59, 0x20, 0x35, 0x0b, 0xab, 0x75, 0xe2, 0x12, 0x59, 0xb4, 0x38, 0x4d, 0xde, 0xcd, - 0x5f, 0x9e, 0x66, 0x13, 0xaf, 0x5c, 0x0a, 0x4c, 0x7e, 0x16, 0x55, 0xe2, 0x22, 0xb3, 0x5c, 0x36, 0xfc, 0xcd, 0x01, - 0x9f, 0x67, 0x7d, 0x3d, 0xf0, 0xbb, 0xfe, 0x5c, 0xdf, 0x1e, 0xf2, 0x90, 0x50, 0x8b, 0xdb, 0x1a, 0x67, 0x4e, 0x8d, - 0x6d, 0xe6, 0xbd, 0x5d, 0xda, 0xc7, 0x71, 0xcc, 0x7c, 0x44, 0x45, 0xba, 0xa2, 0x24, 0xec, 0x4e, 0x87, 0xa4, 0x53, - 0x4c, 0x56, 0x9c, 0x39, 0xf5, 0x54, 0xb8, 0x2d, 0xce, 0x6b, 0x7c, 0xb8, 0x44, 0x74, 0x82, 0xa9, 0x03, 0x24, 0xd7, - 0xb1, 0x25, 0xb8, 0xab, 0x08, 0x5c, 0x9a, 0x5a, 0xa8, 0xa2, 0x78, 0xc6, 0x59, 0xec, 0x16, 0x52, 0xf3, 0x53, 0xf5, - 0xb8, 0xd4, 0xad, 0x2a, 0xe1, 0x95, 0x6c, 0x85, 0x29, 0x90, 0xc9, 0x8a, 0xa4, 0x39, 0x89, 0x15, 0x0e, 0xfa, 0x9e, - 0x43, 0x92, 0xbd, 0x58, 0xf6, 0xb6, 0x7f, 0xeb, 0x6a, 0xcd, 0x0a, 0xa3, 0x5d, 0xac, 0x16, 0xc5, 0x8b, 0x54, 0x6d, - 0x1f, 0xa8, 0xbb, 0xca, 0x7d, 0xc7, 0x40, 0xa3, 0x46, 0x2a, 0x5b, 0x51, 0x47, 0x6a, 0x78, 0xcc, 0x5f, 0x9b, 0xe9, - 0x88, 0x31, 0x6c, 0xd8, 0xd1, 0x41, 0xb3, 0xb9, 0x0c, 0x8a, 0xa9, 0xc5, 0x61, 0x54, 0x1a, 0xba, 0x8d, 0xc8, 0x57, - 0x28, 0xcf, 0xec, 0x1b, 0x63, 0x43, 0x2c, 0xd9, 0x53, 0xbc, 0x06, 0xc2, 0x24, 0xa5, 0xcf, 0x62, 0x8b, 0xc2, 0xa6, - 0xcd, 0xed, 0x99, 0x63, 0x03, 0x0e, 0xae, 0x92, 0x52, 0xa6, 0xab, 0xc2, 0xab, 0x40, 0x29, 0xac, 0x44, 0x67, 0x09, - 0x21, 0x63, 0x9e, 0xbd, 0xf3, 0x53, 0xd3, 0x73, 0x8f, 0x80, 0x68, 0xf6, 0x05, 0x1c, 0x05, 0x1f, 0xc4, 0x88, 0x8f, - 0x34, 0xe4, 0x1c, 0xbe, 0x72, 0x98, 0xbe, 0xb7, 0x85, 0xe4, 0x47, 0x3f, 0x1f, 0x2f, 0x94, 0x29, 0x49, 0xb5, 0x83, - 0xd0, 0x06, 0x12, 0x67, 0x80, 0x78, 0x96, 0x81, 0x25, 0x28, 0x8d, 0x01, 0x83, 0x83, 0xcf, 0x47, 0xbb, 0x22, 0xd4, - 0x12, 0xa1, 0xbb, 0x2c, 0x5d, 0x80, 0xb3, 0x6e, 0x90, 0xd1, 0x26, 0xf6, 0x70, 0x7f, 0xe1, 0x80, 0xee, 0xc4, 0xe0, - 0xc8, 0xc9, 0xec, 0xb2, 0x25, 0xc1, 0xc4, 0xbf, 0x8b, 0xa6, 0x8d, 0x25, 0x52, 0x21, 0xde, 0x58, 0x3a, 0xc0, 0x4c, - 0xa1, 0x3d, 0x55, 0xeb, 0x8e, 0x48, 0xf1, 0x1b, 0xe0, 0x41, 0x34, 0x42, 0x03, 0x47, 0xa2, 0x7e, 0x1e, 0xa3, 0x25, - 0xc6, 0x23, 0xce, 0x7f, 0x4c, 0x2d, 0x07, 0x93, 0x04, 0x72, 0x18, 0xed, 0x1e, 0x3b, 0x13, 0x8a, 0xb3, 0x9d, 0xb4, - 0x6c, 0x3d, 0xfd, 0xdc, 0xa6, 0x0f, 0x66, 0xef, 0x15, 0xde, 0x10, 0x5c, 0x28, 0xfa, 0xcb, 0x2d, 0xcf, 0x30, 0x02, - 0x0c, 0x86, 0xdd, 0x60, 0xfe, 0xfd, 0xe9, 0x24, 0x3a, 0x3c, 0xaa, 0x1f, 0xae, 0x7a, 0x3b, 0x98, 0x3a, 0x93, 0xc1, - 0xf9, 0xe4, 0x97, 0x89, 0xbb, 0xef, 0x44, 0xf2, 0xc5, 0x94, 0x79, 0x8e, 0x7c, 0xd2, 0x09, 0xcc, 0x76, 0x0d, 0xa3, - 0x9a, 0x5a, 0x02, 0x91, 0x88, 0xa9, 0xd0, 0x8d, 0x94, 0xf3, 0x72, 0x7b, 0x4b, 0xe1, 0xfb, 0x6d, 0xaa, 0x52, 0xa5, - 0x46, 0x11, 0x96, 0x9b, 0xf4, 0x83, 0x83, 0xee, 0xf7, 0xa5, 0xbc, 0x5c, 0x4e, 0x6b, 0x91, 0xc7, 0x43, 0x21, 0xea, - 0x7c, 0xa4, 0xbd, 0x7f, 0xa2, 0xf3, 0x33, 0x49, 0xc8, 0xae, 0xff, 0x54, 0x11, 0x60, 0xfc, 0x15, 0xa2, 0xae, 0x4d, - 0x32, 0xa8, 0xd4, 0x4b, 0x2b, 0xbc, 0x83, 0xaf, 0x88, 0xdc, 0x0a, 0xfa, 0x95, 0x51, 0xe5, 0xad, 0x57, 0x6d, 0x97, - 0xb3, 0x2f, 0xb0, 0x60, 0xd3, 0x9a, 0x0e, 0x5e, 0xf9, 0xeb, 0xe0, 0xa8, 0xa0, 0x37, 0x9c, 0x3a, 0x23, 0xf5, 0x10, - 0xef, 0xe7, 0x02, 0x05, 0x27, 0xc4, 0x3f, 0x0a, 0x86, 0x46, 0xe9, 0x5a, 0x6a, 0x63, 0x6c, 0x0f, 0x98, 0xaf, 0x57, - 0x95, 0x71, 0x95, 0xdd, 0x09, 0x1e, 0x3b, 0x37, 0x3e, 0x85, 0x91, 0xb4, 0x3c, 0xc0, 0x39, 0xab, 0x43, 0x07, 0xce, - 0x6b, 0xf6, 0x85, 0x6a, 0x3d, 0x14, 0x33, 0x12, 0x6d, 0x4d, 0xb0, 0x8c, 0x3c, 0x9b, 0xb5, 0xe7, 0xa9, 0x49, 0x66, - 0x35, 0xd2, 0x66, 0x7c, 0x6a, 0xfa, 0xaf, 0x01, 0xb1, 0x1e, 0x74, 0xf9, 0x6d, 0xa5, 0xfa, 0x5a, 0x21, 0xeb, 0x11, - 0xc7, 0x4a, 0x95, 0x6d, 0x83, 0x63, 0x07, 0x6e, 0x35, 0x1e, 0x0f, 0xbe, 0x17, 0xd2, 0x58, 0x9d, 0x04, 0x2e, 0x9d, - 0x50, 0xf9, 0x86, 0x2b, 0x06, 0x76, 0x12, 0xdd, 0x2c, 0x17, 0x51, 0x22, 0x45, 0xfe, 0x36, 0x70, 0x8a, 0xe1, 0x50, - 0x08, 0x0f, 0xe2, 0xdf, 0x24, 0x09, 0xf3, 0x3a, 0x52, 0x9d, 0x58, 0xed, 0xe0, 0x7a, 0x95, 0x1e, 0x05, 0x07, 0x6b, - 0xaa, 0xa4, 0x0d, 0x25, 0xea, 0x52, 0x8f, 0x61, 0x4d, 0x0f, 0x87, 0x7a, 0x71, 0xe3, 0x70, 0xe5, 0x63, 0xcd, 0xa2, - 0xf5, 0x17, 0x35, 0x1c, 0xab, 0x11, 0x36, 0x53, 0x11, 0xcd, 0xec, 0xff, 0x88, 0x2b, 0x1d, 0xb2, 0x0b, 0x80, 0xda, - 0x8f, 0xf8, 0x06, 0x55, 0x31, 0x02, 0xb4, 0x9f, 0x96, 0x6f, 0xa4, 0x3e, 0xe5, 0x19, 0x8b, 0xeb, 0x16, 0x51, 0xe4, - 0x22, 0x18, 0x6b, 0x8a, 0x0d, 0x00, 0x61, 0xd9, 0x02, 0x1b, 0x88, 0xa2, 0x59, 0x94, 0x4d, 0xdd, 0x60, 0xb7, 0x78, - 0x01, 0xd1, 0x9a, 0xc7, 0x67, 0x62, 0xcd, 0x9c, 0x1b, 0xa9, 0x2c, 0x2b, 0x7c, 0xff, 0xea, 0x8a, 0xb9, 0x42, 0x83, - 0xf7, 0xf6, 0xdc, 0xca, 0x1e, 0x9d, 0x0f, 0x76, 0x33, 0xfd, 0x0b, 0xbb, 0x0e, 0x6f, 0xd9, 0x26, 0xcc, 0x08, 0x9f, - 0xdc, 0x3e, 0xfe, 0x8a, 0x35, 0xe1, 0xfc, 0x47, 0x51, 0x31, 0x28, 0x5c, 0x41, 0xb0, 0xa8, 0x35, 0xe3, 0x94, 0xc2, - 0x63, 0x1f, 0xa8, 0xd0, 0x1e, 0x24, 0x26, 0x08, 0xa3, 0x2a, 0x53, 0x25, 0xb2, 0xe7, 0xe2, 0x57, 0x6d, 0x22, 0x83, - 0xc9, 0x38, 0x94, 0x0d, 0xdc, 0xd4, 0xae, 0x39, 0x33, 0x3b, 0x4b, 0xeb, 0xdf, 0x6b, 0x8e, 0x75, 0x58, 0xb0, 0x44, - 0x6b, 0xa8, 0x99, 0x5e, 0x56, 0x2d, 0xc2, 0x5b, 0xc3, 0x74, 0x78, 0x08, 0x52, 0xcb, 0x22, 0xe1, 0x0f, 0xdd, 0x77, - 0xd0, 0x22, 0x18, 0xa3, 0x11, 0x58, 0x19, 0xa7, 0x90, 0xeb, 0xfc, 0x38, 0x25, 0x0a, 0xd4, 0xb2, 0xde, 0x67, 0x2c, - 0x73, 0xe4, 0x35, 0x2b, 0xf3, 0x34, 0x2b, 0x7a, 0x8f, 0xb2, 0xa1, 0xe3, 0xfa, 0x73, 0x26, 0x1a, 0x49, 0x87, 0x86, - 0x3a, 0x1d, 0xe7, 0xc4, 0x95, 0x35, 0x47, 0x53, 0x24, 0xb7, 0xf5, 0x40, 0xda, 0xcd, 0x6c, 0x25, 0x4c, 0xb6, 0xd8, - 0x6c, 0x46, 0xd8, 0xee, 0x68, 0xec, 0x33, 0x4f, 0x1c, 0xd7, 0x10, 0x3d, 0xd0, 0xe6, 0xce, 0x4b, 0x6e, 0x5c, 0xfc, - 0xef, 0xa0, 0x88, 0x6e, 0x1e, 0x8e, 0x08, 0xe6, 0x72, 0x4e, 0x51, 0x3c, 0xdd, 0x1c, 0x87, 0xc0, 0x86, 0xf5, 0x9f, - 0x9b, 0xe8, 0x4a, 0x8e, 0xe7, 0xa8, 0xd2, 0x23, 0x05, 0x71, 0x62, 0x7b, 0x76, 0x0d, 0x49, 0xfb, 0x11, 0x09, 0xcf, - 0x29, 0xeb, 0x6c, 0x74, 0xae, 0x73, 0x5d, 0x7a, 0x1f, 0x7f, 0x25, 0x3d, 0x21, 0x08, 0x0c, 0xf3, 0xa7, 0xb8, 0x9f, - 0xc0, 0x8a, 0x0b, 0xab, 0x52, 0xae, 0x78, 0xe1, 0x5f, 0x73, 0xc6, 0xf7, 0xb4, 0x2a, 0x2b, 0xd9, 0x71, 0x79, 0xa5, - 0x73, 0xd6, 0x50, 0xa5, 0x63, 0xa6, 0xcb, 0x8a, 0xc5, 0xf4, 0x8e, 0xfd, 0xba, 0x36, 0x04, 0x34, 0x74, 0xe7, 0xdc, - 0x51, 0x31, 0x93, 0xe0, 0x69, 0x88, 0xa5, 0x52, 0x80, 0xae, 0xd0, 0x67, 0xe6, 0xe4, 0x9b, 0x61, 0x1e, 0x0c, 0xf9, - 0x59, 0x00, 0x08, 0x57, 0x26, 0xa8, 0xac, 0xc0, 0xb3, 0xe2, 0x5a, 0xd1, 0x79, 0x0d, 0xe6, 0x22, 0xa2, 0xde, 0x6b, - 0xa4, 0xff, 0x00, 0x09, 0x97, 0x60, 0x2f, 0x05, 0x2e, 0x06, 0x74, 0xf9, 0xcc, 0x1d, 0x5a, 0x97, 0x08, 0x31, 0xd6, - 0x80, 0xa4, 0xb6, 0xf1, 0xcb, 0xc5, 0x84, 0x7b, 0xde, 0xcf, 0x03, 0xce, 0xba, 0x7e, 0x06, 0x90, 0x07, 0xf9, 0xf3, - 0x57, 0xb7, 0x72, 0x39, 0xc8, 0x09, 0x48, 0x5c, 0x5c, 0xb8, 0xf2, 0x88, 0x76, 0x4e, 0x8b, 0xb6, 0xcc, 0xd5, 0x28, - 0xe3, 0xb6, 0x06, 0x29, 0x52, 0xb8, 0xd8, 0x48, 0xfb, 0x18, 0xb8, 0x20, 0xe9, 0x89, 0x0d, 0x85, 0x84, 0x1d, 0xbb, - 0xf6, 0x62, 0x2a, 0xb7, 0x33, 0xea, 0x06, 0xfa, 0x62, 0xeb, 0x6f, 0x34, 0xfe, 0xb4, 0xb1, 0x76, 0xa6, 0xef, 0x19, - 0x5c, 0x11, 0xa9, 0x46, 0x9f, 0x57, 0x58, 0x7d, 0xda, 0xef, 0xca, 0x1d, 0xac, 0xd6, 0x97, 0xd1, 0x57, 0x15, 0x1b, - 0xf5, 0x89, 0x0d, 0x82, 0x49, 0x92, 0x54, 0x72, 0x6b, 0x50, 0x52, 0xd0, 0x98, 0xb7, 0x51, 0x43, 0x56, 0x4a, 0x6b, - 0x26, 0x7b, 0xf1, 0xbf, 0x73, 0xc5, 0xcc, 0xc4, 0xc0, 0x8f, 0xb1, 0xa5, 0x3e, 0x79, 0xf4, 0xc4, 0x5b, 0xeb, 0xf7, - 0x9c, 0xa1, 0x63, 0xf6, 0x00, 0x81, 0x42, 0x60, 0x5e, 0xba, 0xc4, 0x9c, 0x5b, 0x33, 0x6b, 0xd6, 0xd4, 0xcb, 0x7f, - 0x66, 0x57, 0xba, 0xc0, 0xd8, 0x27, 0x82, 0xfe, 0x5c, 0xda, 0xed, 0xd4, 0x37, 0x66, 0xef, 0x06, 0x9c, 0x06, 0x98, - 0xb9, 0x78, 0x53, 0xe9, 0xdd, 0xd5, 0xe6, 0x11, 0x0b, 0x60, 0x72, 0x36, 0xfa, 0x97, 0xa6, 0x22, 0xf8, 0xcb, 0xa3, - 0xb3, 0x17, 0xeb, 0x23, 0x0a, 0x05, 0x5f, 0x46, 0x23, 0xde, 0x65, 0xf4, 0x2f, 0x1a, 0x5a, 0xff, 0x03, 0xfb, 0x60, - 0x1b, 0x97, 0x61, 0x0f, 0xed, 0xc3, 0x24, 0x76, 0x45, 0xd0, 0xd6, 0xc6, 0x82, 0x20, 0x6b, 0xea, 0x72, 0x60, 0x44, - 0x8a, 0xdf, 0x5a, 0x27, 0x9d, 0xd7, 0xb1, 0xef, 0xda, 0x89, 0xf3, 0x21, 0x11, 0x23, 0xf0, 0x5b, 0xf4, 0x7c, 0x24, - 0xa1, 0x82, 0x4b, 0x47, 0x2f, 0x13, 0x3c, 0xea, 0x12, 0x27, 0xd5, 0xae, 0x97, 0xa3, 0xf6, 0xcf, 0xfa, 0x66, 0x3f, - 0x18, 0x94, 0xae, 0x1b, 0x86, 0x6f, 0xe9, 0xb5, 0xcc, 0x91, 0x87, 0x77, 0x7d, 0xa3, 0xb5, 0x05, 0xd6, 0xba, 0x6c, - 0x0b, 0x45, 0x9d, 0xf0, 0xfa, 0x5d, 0xe3, 0xf8, 0xbf, 0x94, 0x59, 0xc1, 0x50, 0x98, 0xcc, 0x44, 0xbd, 0xd9, 0x82, - 0x74, 0x16, 0x7a, 0x7b, 0xd7, 0xbf, 0x54, 0x9a, 0x03, 0xb6, 0x98, 0x31, 0x38, 0xd5, 0x83, 0x66, 0xf0, 0x12, 0x0a, - 0x84, 0xb9, 0x77, 0x86, 0xce, 0xa0, 0xfb, 0xd5, 0x09, 0xca, 0x44, 0x31, 0xe8, 0x59, 0x0a, 0x25, 0x6d, 0x42, 0x6a, - 0xdd, 0xef, 0x0d, 0x6e, 0x7d, 0xe8, 0xdf, 0xcc, 0x28, 0xa2, 0x51, 0xef, 0x9c, 0x24, 0xa0, 0xe8, 0x15, 0x07, 0x3a, - 0x51, 0xde, 0x6c, 0x89, 0x11, 0xeb, 0x78, 0x9c, 0xe4, 0xea, 0xe0, 0xf1, 0x4a, 0xc9, 0xf1, 0xaa, 0x10, 0x7a, 0x0e, - 0x60, 0x88, 0x23, 0x70, 0x2f, 0x87, 0x05, 0x74, 0x01, 0xcf, 0xf4, 0x8e, 0x7a, 0x36, 0x73, 0xb4, 0xfb, 0x7f, 0x97, - 0x7b, 0xd4, 0x5b, 0x3c, 0xdb, 0x24, 0x0e, 0x58, 0xd6, 0x34, 0x02, 0xdf, 0xfc, 0xf4, 0xae, 0xd6, 0x63, 0xc9, 0x9b, - 0x2d, 0x95, 0x39, 0xd8, 0x10, 0x5d, 0xa7, 0x45, 0xd2, 0xa7, 0x5c, 0x1d, 0xdb, 0x14, 0x50, 0xc3, 0xfd, 0xb4, 0x73, - 0x45, 0x78, 0x9c, 0xb0, 0x86, 0x73, 0x2a, 0x1c, 0x76, 0x70, 0xb4, 0x11, 0x46, 0x37, 0xe4, 0x18, 0x4b, 0xea, 0x20, - 0xbe, 0x1d, 0xe0, 0x13, 0x7c, 0xbf, 0x30, 0xca, 0x97, 0x0e, 0xf1, 0x47, 0x06, 0x8d, 0x0e, 0x72, 0x89, 0x95, 0x3c, - 0x61, 0xea, 0xaf, 0x95, 0xda, 0xca, 0x75, 0xb9, 0xb9, 0xb7, 0x57, 0xb7, 0x92, 0x59, 0x38, 0xc9, 0x28, 0x3e, 0x92, - 0x1e, 0xd5, 0x2b, 0xf9, 0xcf, 0xed, 0xc6, 0x20, 0x99, 0xb9, 0xbd, 0x7b, 0x27, 0x30, 0x76, 0xa8, 0x74, 0xa2, 0xe0, - 0x5f, 0x22, 0xe1, 0x67, 0xa3, 0x11, 0x29, 0x28, 0x2c, 0xb9, 0x0a, 0x55, 0x68, 0x9f, 0xb9, 0xe9, 0xa5, 0xa2, 0x72, - 0x8c, 0x51, 0x31, 0x9b, 0xf1, 0x8b, 0xa1, 0x1a, 0x23, 0xf5, 0xd3, 0x9c, 0x6d, 0xbf, 0xf5, 0x44, 0xaf, 0x45, 0x73, - 0x20, 0x09, 0x1a, 0x57, 0x02, 0x14, 0xe0, 0x10, 0x13, 0x8c, 0xc9, 0x5d, 0x62, 0xd0, 0x34, 0xc3, 0xf3, 0x14, 0xea, - 0x5a, 0x8d, 0x27, 0x95, 0x6f, 0x6d, 0x97, 0x95, 0x54, 0xb6, 0x13, 0xa3, 0x79, 0x27, 0x41, 0xe2, 0xa8, 0x71, 0x8a, - 0x82, 0x55, 0xf5, 0x0c, 0x29, 0xc3, 0x12, 0x20, 0xad, 0x38, 0x87, 0x6f, 0xcf, 0x43, 0x66, 0x17, 0x96, 0xd8, 0x2b, - 0xdd, 0x2c, 0x85, 0x08, 0x6e, 0x17, 0x15, 0x09, 0xb9, 0xbe, 0x65, 0x93, 0x2c, 0x74, 0xe9, 0x5b, 0x67, 0xe8, 0x12, - 0xd2, 0x87, 0x1c, 0xf5, 0xdb, 0xbd, 0x04, 0x9c, 0x20, 0x8c, 0x8d, 0x09, 0xd9, 0x7c, 0xd4, 0x0b, 0xf2, 0x28, 0x6f, - 0x05, 0x8d, 0xab, 0xcd, 0xd2, 0xfb, 0x9f, 0x30, 0x1a, 0xca, 0x65, 0x43, 0x26, 0xb3, 0xa2, 0x83, 0xe6, 0xab, 0x65, - 0x6c, 0x0e, 0x2a, 0xc8, 0x31, 0x27, 0x01, 0x7a, 0x5c, 0x81, 0xe7, 0x96, 0x45, 0xbd, 0x49, 0xf5, 0x67, 0xc5, 0x0b, - 0x5d, 0x83, 0xdd, 0xd7, 0x0e, 0x62, 0xc7, 0x26, 0x53, 0xbb, 0x58, 0x05, 0x4a, 0xe2, 0x88, 0x6e, 0x85, 0x3e, 0x85, - 0x2a, 0x77, 0xa4, 0x10, 0xc3, 0x3a, 0xc0, 0xc2, 0x59, 0xc9, 0x4c, 0xd8, 0x3e, 0xcc, 0xe7, 0x8f, 0x51, 0x6b, 0x01, - 0xd3, 0x43, 0x08, 0xf5, 0xdd, 0x1d, 0xee, 0x28, 0x3a, 0x3a, 0x93, 0xc9, 0x5d, 0x56, 0xc8, 0xa0, 0x5f, 0xf8, 0x58, - 0xc0, 0x05, 0x57, 0xe4, 0x92, 0xb1, 0xa0, 0xe9, 0x14, 0x4c, 0xcb, 0xd4, 0xb9, 0xfc, 0xdd, 0xfb, 0x98, 0x40, 0x2d, - 0x88, 0x45, 0xd3, 0x84, 0x13, 0xd4, 0xd0, 0x1d, 0x44, 0x6b, 0xda, 0x93, 0xc7, 0x8b, 0xec, 0x19, 0xc6, 0xca, 0x09, - 0xfe, 0xd4, 0xe5, 0xba, 0xfa, 0xf2, 0x5d, 0x90, 0x4a, 0xef, 0x8d, 0x4e, 0x4b, 0xd2, 0x3b, 0xca, 0x11, 0xd1, 0xa4, - 0xe3, 0x6f, 0x1f, 0x91, 0xb7, 0x20, 0x13, 0x1b, 0x3e, 0x5c, 0xd6, 0x9a, 0xf7, 0x5f, 0x51, 0xb0, 0x4a, 0x11, 0xce, - 0x7e, 0xa2, 0x49, 0x1c, 0xb2, 0x15, 0x21, 0xed, 0x8b, 0x60, 0xa4, 0xa3, 0x82, 0xd8, 0x8a, 0xed, 0x6a, 0x6d, 0xb9, - 0x87, 0x40, 0xc4, 0x39, 0xb8, 0x42, 0x66, 0x19, 0x9c, 0x63, 0xaf, 0x7e, 0x79, 0x80, 0xe0, 0xf2, 0x14, 0xf5, 0xbf, - 0x5e, 0x16, 0x7e, 0xf4, 0x70, 0xa0, 0x75, 0x64, 0x65, 0x65, 0x4e, 0xbd, 0x54, 0x1f, 0xcb, 0x3a, 0x1e, 0xad, 0xfa, - 0x9a, 0x7e, 0xa3, 0x94, 0x46, 0x9b, 0x41, 0x8b, 0xdb, 0x94, 0x95, 0x1a, 0xc3, 0x9f, 0x59, 0x2d, 0xea, 0xa1, 0xc2, - 0x1d, 0xae, 0x0d, 0xde, 0xb3, 0x77, 0x30, 0x91, 0x22, 0xef, 0xdb, 0x3f, 0x35, 0xb8, 0x21, 0x61, 0x3a, 0xe1, 0x90, - 0x3b, 0x70, 0x05, 0xd3, 0x93, 0x4e, 0xdd, 0x35, 0xc4, 0xd7, 0x22, 0xc9, 0x8e, 0xfe, 0x1b, 0x05, 0xcf, 0x17, 0x32, - 0xd6, 0x84, 0x8c, 0x6e, 0x0b, 0x6b, 0x11, 0x69, 0xa5, 0xc1, 0xc4, 0x18, 0xc5, 0x7c, 0x4a, 0x94, 0x88, 0x65, 0xb7, - 0x25, 0x23, 0xb1, 0xcf, 0xd6, 0x96, 0xbd, 0xd5, 0x4d, 0x4b, 0x82, 0x96, 0xa5, 0x20, 0x5e, 0x2e, 0xcf, 0x44, 0x15, - 0xd0, 0xb5, 0x71, 0x03, 0x22, 0x4e, 0xef, 0xac, 0xf6, 0x16, 0x04, 0xd0, 0x3e, 0xff, 0xfb, 0x4a, 0xe9, 0xe2, 0x56, - 0x85, 0x12, 0x82, 0x1f, 0xb2, 0x4c, 0x96, 0x40, 0x19, 0xe4, 0x63, 0xcb, 0x07, 0xf7, 0x15, 0x56, 0xeb, 0xbb, 0xf5, - 0x10, 0xb1, 0x79, 0x3e, 0x84, 0xb4, 0x83, 0xe1, 0x99, 0x02, 0x4f, 0xf6, 0x2f, 0xdb, 0x87, 0x0d, 0xd0, 0xba, 0xc9, - 0x50, 0x7e, 0x57, 0xaa, 0x89, 0x32, 0x82, 0x8f, 0x5f, 0xed, 0x70, 0x61, 0x43, 0xed, 0xc0, 0x68, 0x1a, 0x76, 0xcb, - 0x3f, 0x20, 0x56, 0x48, 0xe8, 0xea, 0x08, 0x60, 0xeb, 0x32, 0x26, 0x7c, 0xc9, 0xbe, 0x41, 0x18, 0x00, 0x89, 0xdf, - 0xfe, 0xaa, 0x1d, 0x9f, 0x98, 0xeb, 0xf2, 0xfb, 0xb6, 0xbd, 0x4a, 0x44, 0xef, 0x63, 0x27, 0x66, 0x3b, 0xf6, 0x01, - 0x2b, 0x1e, 0x56, 0x8d, 0xe8, 0xd8, 0xf3, 0xa1, 0x70, 0x9f, 0xe2, 0xd1, 0xd6, 0x21, 0xfa, 0x9d, 0x28, 0xb2, 0xc5, - 0x76, 0xc9, 0xfe, 0x42, 0x4b, 0xe7, 0xd3, 0x07, 0x9a, 0x41, 0xdd, 0x1e, 0x23, 0xaf, 0x22, 0x80, 0x78, 0x0c, 0x76, - 0xe1, 0xeb, 0x32, 0xef, 0x99, 0xbc, 0x02, 0xfc, 0x9c, 0x72, 0xf2, 0x97, 0xe7, 0x8b, 0x26, 0x22, 0xe8, 0xb3, 0x2e, - 0x49, 0x02, 0x22, 0xe2, 0x71, 0x3a, 0x3b, 0x36, 0x4d, 0x7a, 0x19, 0x39, 0x3c, 0x62, 0x33, 0x2b, 0xdf, 0xb1, 0xaa, - 0x8b, 0xb3, 0x5b, 0x3e, 0xda, 0x5f, 0xe8, 0x41, 0x67, 0x90, 0xa8, 0x5d, 0x9c, 0xc9, 0x68, 0x76, 0x64, 0x1a, 0x63, - 0x43, 0xb4, 0x97, 0x8a, 0x29, 0x19, 0x66, 0x39, 0x46, 0x1d, 0xd7, 0x46, 0x4e, 0x97, 0x93, 0x25, 0x0e, 0xc3, 0x12, - 0xe3, 0x7d, 0x1a, 0x10, 0xf4, 0x72, 0x05, 0x1d, 0xec, 0xe2, 0x5c, 0x6f, 0x87, 0x1c, 0x1a, 0x10, 0x97, 0x1a, 0xef, - 0xe2, 0x5c, 0xf7, 0xa0, 0xca, 0x53, 0x64, 0xc5, 0xc3, 0x9f, 0x52, 0xbf, 0x54, 0x8e, 0xf1, 0x9e, 0x81, 0xc4, 0xd8, - 0x6f, 0x6c, 0xcf, 0xfd, 0x26, 0x28, 0x66, 0x99, 0xa2, 0x91, 0x9e, 0x17, 0xee, 0xc1, 0x6c, 0x4f, 0xdb, 0xab, 0xd1, - 0x54, 0xc1, 0xcc, 0xa2, 0x13, 0xc0, 0xe6, 0x0f, 0xc4, 0x54, 0x45, 0x57, 0x3c, 0x52, 0x08, 0xc2, 0x70, 0xb5, 0xde, - 0x91, 0xed, 0xb3, 0x42, 0x68, 0xb9, 0x63, 0x26, 0x19, 0xf8, 0xb9, 0xf1, 0x61, 0xd6, 0x35, 0xbe, 0xa8, 0x27, 0x40, - 0x33, 0x71, 0xe5, 0xc3, 0xc7, 0xc9, 0x42, 0x61, 0x82, 0x92, 0xd1, 0x4f, 0xae, 0xa6, 0x5a, 0xd2, 0x9d, 0x74, 0xd8, - 0x9b, 0x2d, 0x5f, 0x27, 0x65, 0x1d, 0x76, 0x29, 0xfb, 0x58, 0xca, 0x03, 0xed, 0x76, 0x33, 0xdb, 0xc3, 0xdf, 0x70, - 0xf3, 0x01, 0xa0, 0x8b, 0x84, 0x95, 0x49, 0x6e, 0xd1, 0x80, 0x5f, 0x7c, 0x30, 0x38, 0x19, 0xc3, 0xf6, 0xe0, 0xc5, - 0xdc, 0x61, 0x9d, 0x63, 0xff, 0xd6, 0x91, 0x9b, 0x38, 0x0a, 0xa4, 0xe4, 0xab, 0x85, 0x45, 0x15, 0xa2, 0xc3, 0x40, - 0xe3, 0xaa, 0xcf, 0x13, 0xb0, 0x90, 0x33, 0xb5, 0x26, 0xd9, 0xfc, 0x53, 0x05, 0xc4, 0xf3, 0xd9, 0x72, 0x08, 0x24, - 0xc8, 0xb7, 0xb2, 0x5a, 0x16, 0xaf, 0x09, 0x27, 0xb0, 0x3d, 0x82, 0x45, 0x63, 0x77, 0x04, 0x00, 0x5a, 0xe8, 0x20, - 0xa4, 0xd4, 0x85, 0x0b, 0x65, 0x2f, 0xd7, 0xc8, 0x86, 0xa9, 0x6b, 0x81, 0x17, 0xdf, 0x4e, 0x38, 0xfa, 0xf7, 0x47, - 0x43, 0xb2, 0x8e, 0x00, 0x2e, 0x27, 0x78, 0x1f, 0x36, 0x8d, 0x3d, 0x03, 0xce, 0x48, 0xfb, 0xa2, 0x70, 0x45, 0x3f, - 0x0c, 0xac, 0x0b, 0xf1, 0x2c, 0x38, 0x47, 0x26, 0xbb, 0x12, 0xfa, 0x45, 0xd1, 0x0c, 0x09, 0x5e, 0x30, 0x8e, 0x6d, - 0xe0, 0x73, 0x07, 0xf4, 0xd3, 0x98, 0x8b, 0xb6, 0x05, 0x1e, 0x2b, 0xaa, 0xcc, 0x29, 0x87, 0x6e, 0x10, 0xad, 0xbd, - 0xfa, 0x5c, 0xea, 0x3b, 0x9c, 0x95, 0xce, 0x8a, 0x7b, 0x97, 0x55, 0x0f, 0x05, 0x9f, 0x20, 0xc7, 0xfb, 0x57, 0x14, - 0xfb, 0x9f, 0x36, 0xe2, 0x68, 0xc1, 0xa6, 0x00, 0x0c, 0x20, 0x21, 0xd3, 0x08, 0xdb, 0x3a, 0x09, 0x3a, 0x7e, 0x28, - 0x3d, 0x46, 0x1c, 0x4a, 0x5a, 0x61, 0x70, 0x98, 0xaa, 0x6f, 0x83, 0x0c, 0x29, 0x79, 0xb9, 0x94, 0x1e, 0x86, 0x18, - 0x39, 0x20, 0x95, 0xb9, 0xf2, 0x3d, 0x7b, 0x55, 0x3c, 0x51, 0xea, 0xc4, 0x07, 0x10, 0x8b, 0xa1, 0x47, 0x46, 0x7d, - 0x20, 0x53, 0x5d, 0x80, 0x26, 0x86, 0x90, 0x51, 0x02, 0x88, 0x8d, 0xa1, 0x11, 0x02, 0x25, 0xe4, 0xd8, 0xfa, 0xc5, - 0xac, 0x0a, 0x12, 0xa1, 0x88, 0x45, 0x4b, 0xb4, 0x38, 0x62, 0x14, 0x60, 0x86, 0x34, 0xd0, 0x63, 0xee, 0x9a, 0x0e, - 0x8c, 0x0b, 0x30, 0xa6, 0xe2, 0x1e, 0x40, 0x7e, 0x33, 0x86, 0xb1, 0x88, 0xe0, 0xe5, 0xae, 0x3c, 0x4f, 0x1a, 0x35, - 0x58, 0xc3, 0x5a, 0x34, 0x17, 0xab, 0xb7, 0x81, 0x99, 0x72, 0x0c, 0xc9, 0x55, 0xab, 0x52, 0xd8, 0xe9, 0xcd, 0x7e, - 0x1f, 0xf2, 0xb9, 0x83, 0xd0, 0xd6, 0xc1, 0x99, 0x25, 0x28, 0x33, 0x12, 0xdb, 0x98, 0x50, 0x40, 0x32, 0xd0, 0x81, - 0xd4, 0x15, 0x88, 0x90, 0x90, 0x64, 0x92, 0x84, 0xe6, 0x64, 0x8a, 0x44, 0x7c, 0x71, 0xc2, 0x5c, 0x1f, 0xc4, 0xc9, - 0x12, 0xd9, 0xbc, 0x6f, 0x97, 0xc0, 0xfc, 0x81, 0x91, 0x59, 0x91, 0xab, 0xaa, 0xa0, 0x01, 0x12, 0x09, 0xa3, 0xd5, - 0x09, 0x43, 0xe7, 0xf5, 0xd9, 0xdf, 0x07, 0x8c, 0x2d, 0x4c, 0xe8, 0x40, 0x30, 0x0c, 0x65, 0x51, 0xa8, 0xe4, 0x4f, - 0x0a, 0x1c, 0x56, 0x68, 0x78, 0x7f, 0x16, 0x7c, 0xf1, 0xd4, 0x62, 0x61, 0x15, 0x1e, 0x09, 0xb9, 0x1f, 0x6a, 0x89, - 0xb3, 0x02, 0x92, 0x13, 0x84, 0x56, 0xf7, 0xef, 0x7f, 0x77, 0x54, 0x12, 0xe6, 0x45, 0x8b, 0xd2, 0xab, 0x23, 0x6e, - 0x73, 0xb5, 0xc0, 0xd0, 0xa4, 0xd9, 0x21, 0xdf, 0x3e, 0x55, 0x22, 0x6e, 0x14, 0x5c, 0xee, 0x42, 0x2c, 0x01, 0x69, - 0x33, 0x18, 0x7c, 0x69, 0x3d, 0xa5, 0x1f, 0x20, 0xf4, 0x8d, 0x7b, 0x76, 0xfa, 0x38, 0x46, 0x32, 0x26, 0x17, 0xd6, - 0xcf, 0xac, 0x6a, 0x35, 0x71, 0x44, 0x42, 0xce, 0x59, 0xe8, 0x50, 0xec, 0xab, 0x61, 0x39, 0x73, 0xc5, 0xd9, 0xc3, - 0xc3, 0x68, 0x05, 0x24, 0x1d, 0x69, 0xb8, 0x21, 0xc7, 0xb3, 0x0f, 0x50, 0xe7, 0x51, 0x30, 0x92, 0x4a, 0xe6, 0xbd, - 0x62, 0x38, 0x6f, 0x88, 0xb6, 0xd4, 0xb3, 0xd6, 0x20, 0x70, 0x4e, 0x16, 0x49, 0xc9, 0x9b, 0x20, 0xb5, 0xf2, 0xf2, - 0x64, 0x1e, 0x31, 0xc5, 0xe9, 0x54, 0x59, 0x61, 0x74, 0x72, 0xd1, 0x73, 0x64, 0x94, 0x5d, 0xb0, 0xa1, 0x9a, 0x4f, - 0x4b, 0x53, 0xee, 0x2b, 0xac, 0x94, 0xae, 0xb4, 0xc0, 0x74, 0x24, 0xc6, 0xea, 0x66, 0x8e, 0xea, 0x81, 0x41, 0xc4, - 0x7a, 0xf9, 0x06, 0x91, 0x87, 0x34, 0xbf, 0x70, 0xa4, 0x22, 0x6d, 0x09, 0xcf, 0x4a, 0x3e, 0x60, 0x36, 0x03, 0xd2, - 0xca, 0xfb, 0x04, 0x5c, 0xf9, 0x4d, 0x81, 0x82, 0xe4, 0x8b, 0xf3, 0x04, 0xcd, 0x20, 0x7e, 0x1d, 0x64, 0xb3, 0xb1, - 0x11, 0xe3, 0xf9, 0xd6, 0xe0, 0xd5, 0x10, 0x39, 0x58, 0x1d, 0xfd, 0xba, 0x1b, 0xb0, 0x75, 0xb8, 0x4d, 0xa7, 0x67, - 0x5f, 0x6a, 0x81, 0x16, 0x83, 0xe3, 0xa9, 0x98, 0xe2, 0xa4, 0x7a, 0x44, 0x2c, 0x53, 0x61, 0x1a, 0x13, 0x5d, 0x21, - 0x6b, 0x6c, 0x29, 0xd8, 0x7c, 0xcb, 0x7b, 0x5e, 0x64, 0x48, 0xb8, 0x6b, 0x44, 0x17, 0xc3, 0x18, 0x04, 0x2f, 0x2f, - 0xa5, 0x73, 0x5f, 0x1b, 0x25, 0x56, 0xcc, 0x13, 0x1f, 0x5e, 0x37, 0x49, 0xf2, 0x82, 0xb4, 0x66, 0xcf, 0x6a, 0x2c, - 0x7f, 0x78, 0xf3, 0x83, 0xa9, 0x4a, 0xac, 0xd9, 0xc9, 0x4f, 0x52, 0xb6, 0xef, 0x87, 0xa6, 0x41, 0xde, 0x56, 0x2c, - 0x7e, 0x69, 0xf2, 0x0d, 0xa2, 0x0b, 0x46, 0xc9, 0x4e, 0x17, 0x8b, 0x75, 0x03, 0xf7, 0xeb, 0x25, 0xe8, 0xca, 0x0c, - 0x83, 0x76, 0xef, 0x6b, 0xdd, 0x2f, 0x8a, 0x48, 0x8f, 0xb1, 0x0f, 0x19, 0x29, 0x5a, 0x89, 0x5a, 0xcb, 0xfc, 0x6c, - 0x5b, 0xeb, 0x08, 0x09, 0x33, 0xd1, 0x4b, 0x73, 0xb4, 0x43, 0x22, 0x56, 0x33, 0x13, 0xa1, 0xc1, 0xba, 0x19, 0x79, - 0x57, 0x53, 0xfe, 0xb4, 0x84, 0x0e, 0x8f, 0xb5, 0xae, 0xda, 0xdc, 0xcb, 0x68, 0x3a, 0x23, 0xae, 0xe7, 0x69, 0xea, - 0x9a, 0xd2, 0xd3, 0xa0, 0xc3, 0x9d, 0x14, 0xb1, 0xc5, 0xad, 0xff, 0xc0, 0x4c, 0x8b, 0x42, 0x42, 0x35, 0x94, 0xb9, - 0xbd, 0xae, 0x1e, 0x4b, 0xd5, 0x53, 0xb2, 0xfb, 0x9e, 0xe8, 0x6b, 0xac, 0xd2, 0xbe, 0x46, 0xb2, 0x6a, 0x85, 0xc7, - 0xc6, 0xb8, 0x0e, 0x9e, 0xf5, 0x1b, 0xdc, 0x24, 0x8a, 0x10, 0xc3, 0xb8, 0xf4, 0x0b, 0x1f, 0xe1, 0x5c, 0xe0, 0xf5, - 0x30, 0x6d, 0xdd, 0x0e, 0xa9, 0xa6, 0x20, 0x8e, 0xdd, 0x16, 0xce, 0xd9, 0xad, 0x39, 0x78, 0xe8, 0x8e, 0xa3, 0xbc, - 0x50, 0x8f, 0xf3, 0x0e, 0x85, 0x76, 0x28, 0x69, 0x78, 0x5c, 0xb7, 0xa3, 0xc9, 0x83, 0x23, 0x9a, 0xb8, 0x5d, 0x6e, - 0x7f, 0x26, 0x94, 0x79, 0x1a, 0x20, 0xa2, 0x31, 0xfc, 0xfb, 0x92, 0x3d, 0x19, 0xd3, 0x09, 0x49, 0x64, 0x43, 0x66, - 0x1b, 0x30, 0xf6, 0x90, 0x48, 0x8f, 0xbf, 0x22, 0xf7, 0x6f, 0x8d, 0x82, 0xe3, 0xa5, 0xb8, 0xa1, 0xa4, 0x3f, 0x2c, - 0xc2, 0x4c, 0x27, 0x31, 0x4d, 0x3c, 0x90, 0xc5, 0x55, 0x00, 0x2e, 0xd3, 0xae, 0xb0, 0x40, 0x96, 0x0b, 0x2c, 0x90, - 0xb2, 0xfa, 0x1c, 0x25, 0x91, 0xb8, 0x47, 0x42, 0x76, 0x3a, 0x79, 0x2f, 0x8e, 0x71, 0xc1, 0x73, 0x35, 0x39, 0xba, - 0xe0, 0xc5, 0x4c, 0x10, 0xb5, 0x3b, 0x8d, 0xf4, 0x22, 0x34, 0xef, 0xe5, 0xea, 0x3a, 0xd2, 0xa7, 0xd0, 0x82, 0x0a, - 0xf5, 0x0b, 0x69, 0xbf, 0x7f, 0x9d, 0xc8, 0x80, 0xa3, 0x41, 0x93, 0x0d, 0x3b, 0x24, 0xac, 0x90, 0xd7, 0x2e, 0xbe, - 0x10, 0x3a, 0x22, 0x33, 0x7a, 0x94, 0x61, 0x7a, 0x99, 0x8f, 0xd1, 0xce, 0x5b, 0x39, 0x9a, 0x2e, 0x1c, 0xfc, 0xe7, - 0xb0, 0xb7, 0x40, 0x87, 0xab, 0xe3, 0x22, 0xdd, 0x4f, 0xce, 0x5c, 0xfc, 0x0f, 0xa6, 0xab, 0xae, 0x7d, 0x36, 0x13, - 0x5f, 0xc9, 0x63, 0x44, 0x7d, 0xd5, 0x0b, 0xa7, 0x34, 0x1b, 0xd5, 0x4c, 0x1f, 0x45, 0xe4, 0x79, 0xa8, 0x72, 0x5b, - 0x30, 0x9e, 0xd6, 0x60, 0xf8, 0xe8, 0x28, 0xe1, 0x10, 0x34, 0xc1, 0x99, 0xb9, 0x1f, 0x51, 0x65, 0x64, 0x09, 0xe3, - 0xc6, 0x02, 0xcb, 0x9b, 0xe9, 0x3c, 0x8e, 0x4b, 0xa1, 0xe5, 0x33, 0xc6, 0xdf, 0xdf, 0xa2, 0xcf, 0x4f, 0x85, 0xcd, - 0x12, 0x17, 0x3f, 0xe8, 0xc4, 0x51, 0x2f, 0x5c, 0x69, 0xeb, 0x14, 0xab, 0x52, 0xd9, 0x4d, 0xed, 0x7c, 0x6c, 0x5b, - 0x5e, 0x4a, 0xc6, 0xa7, 0x14, 0xe5, 0x24, 0xd7, 0x14, 0x8a, 0xc1, 0xc0, 0x1b, 0x59, 0xf5, 0xe7, 0x0b, 0x98, 0xc9, - 0x0d, 0x78, 0xa6, 0xaf, 0x63, 0xbd, 0x03, 0x3c, 0xd8, 0x73, 0x0b, 0x33, 0x57, 0x90, 0xc8, 0xe3, 0xf1, 0x1c, 0x8f, - 0x75, 0xc0, 0xf9, 0x83, 0xdc, 0x3b, 0x0a, 0xf8, 0x6e, 0x00, 0x62, 0x76, 0xde, 0x08, 0xf0, 0x0b, 0xec, 0x70, 0xb6, - 0xc4, 0x12, 0x54, 0x29, 0xd4, 0x82, 0x1d, 0x19, 0x7c, 0x96, 0x60, 0x35, 0x13, 0x70, 0x96, 0x20, 0x28, 0xca, 0x62, - 0xbe, 0x20, 0x28, 0x71, 0x14, 0x4a, 0x66, 0x2e, 0x3f, 0x35, 0x9b, 0xa2, 0x28, 0x12, 0xe1, 0xa7, 0x76, 0x70, 0x9e, - 0x11, 0x2e, 0xf1, 0xb5, 0xa2, 0xca, 0x07, 0x06, 0x5f, 0x10, 0x68, 0x80, 0xfe, 0xcd, 0x54, 0x44, 0xfb, 0x73, 0xd2, - 0x28, 0x29, 0xdc, 0xb3, 0xb0, 0x18, 0x67, 0x9d, 0x59, 0xd2, 0x6f, 0xb2, 0xcc, 0x6b, 0xd1, 0xcc, 0xaf, 0x6c, 0xc8, - 0x5a, 0xe7, 0xbb, 0x9f, 0xf7, 0x03, 0xa5, 0x9d, 0xf5, 0xcc, 0x92, 0x7d, 0xb4, 0x67, 0x9a, 0x36, 0x0b, 0x87, 0x9e, - 0xc5, 0xd5, 0x0d, 0x53, 0x10, 0x07, 0x5e, 0x9e, 0x46, 0x2a, 0x03, 0x7f, 0x2a, 0x0a, 0x38, 0x52, 0x4e, 0xf1, 0x5b, - 0x4a, 0x78, 0x37, 0xbf, 0x20, 0x8e, 0xdd, 0x5d, 0xfd, 0x0a, 0x90, 0xb5, 0x85, 0xd5, 0xc1, 0x4d, 0x8e, 0x9b, 0xa8, - 0x21, 0xca, 0xc1, 0xdb, 0x40, 0xbe, 0x34, 0x4f, 0x5a, 0xe2, 0xa8, 0x97, 0x45, 0xab, 0xcf, 0xd3, 0xdc, 0x10, 0xf8, - 0xa9, 0x0b, 0xc7, 0xe3, 0x3c, 0xfa, 0xe6, 0xd0, 0x34, 0xf2, 0x63, 0xd2, 0xf6, 0x80, 0x81, 0xa4, 0x99, 0x68, 0xe3, - 0x23, 0x5b, 0x4e, 0x77, 0x3b, 0x0b, 0xe9, 0x7a, 0x3d, 0x0d, 0xa5, 0xb0, 0x58, 0xb8, 0x70, 0x34, 0x66, 0x9f, 0xd0, - 0xe9, 0xd6, 0x6c, 0x48, 0x74, 0x07, 0xc3, 0x95, 0x18, 0xb9, 0x0e, 0xe3, 0x9c, 0xd9, 0x70, 0x84, 0x95, 0xea, 0xb1, - 0x37, 0x6e, 0x1b, 0x12, 0x3c, 0xa1, 0xe2, 0xc8, 0x03, 0x8f, 0xf0, 0x59, 0x1d, 0x74, 0x78, 0x98, 0x07, 0x2e, 0xf9, - 0x06, 0x73, 0x75, 0x04, 0x03, 0xe5, 0x08, 0x42, 0x11, 0xf9, 0xfe, 0x0e, 0x73, 0xe1, 0xb1, 0x7c, 0x83, 0x99, 0x5a, - 0x79, 0xe1, 0x73, 0xbd, 0xe4, 0x76, 0xc0, 0xf3, 0xf6, 0x13, 0x2f, 0xe9, 0x1a, 0xc1, 0xe1, 0x47, 0x7e, 0xd5, 0x62, - 0xfd, 0x75, 0x1f, 0xf3, 0xe7, 0x41, 0xaa, 0x4b, 0xb8, 0x2a, 0x0c, 0x80, 0x3f, 0xba, 0x32, 0xee, 0x06, 0x0c, 0xeb, - 0x23, 0x44, 0x8d, 0xf0, 0x88, 0xfd, 0xe1, 0xa9, 0x17, 0x00, 0xca, 0x9d, 0x9b, 0x81, 0xc8, 0x42, 0x34, 0x3f, 0x2f, - 0x57, 0xdb, 0xe6, 0x65, 0x68, 0x4b, 0x4b, 0x37, 0x8f, 0x13, 0x49, 0xd8, 0x4c, 0x9c, 0x5a, 0xa8, 0x5e, 0x11, 0x31, - 0x45, 0xcc, 0x02, 0xad, 0x97, 0xf1, 0x7b, 0x7c, 0x67, 0x08, 0xa3, 0x36, 0x6c, 0x84, 0xd7, 0xed, 0x68, 0x6d, 0xf0, - 0x7e, 0xbf, 0xd6, 0x46, 0x21, 0xd8, 0xb7, 0xf4, 0x0b, 0x14, 0x69, 0xd8, 0xd2, 0x8e, 0xff, 0x79, 0xc0, 0x17, 0xfd, - 0x43, 0x08, 0x9b, 0xc4, 0x06, 0x05, 0x85, 0x97, 0xda, 0x64, 0x6f, 0x03, 0x25, 0x4c, 0x62, 0xad, 0xd6, 0x13, 0xf0, - 0xa2, 0x0d, 0x20, 0x15, 0xba, 0x67, 0xcc, 0xaf, 0xc8, 0xe4, 0xf9, 0x13, 0xd2, 0xb2, 0x85, 0x71, 0xca, 0x27, 0xd1, - 0x8e, 0x04, 0x3b, 0x3f, 0x45, 0x91, 0xbc, 0xe2, 0xbb, 0x44, 0x92, 0xaf, 0x4f, 0xbb, 0xf9, 0xcb, 0xdd, 0x83, 0x26, - 0x85, 0x40, 0x07, 0x8f, 0xee, 0x08, 0x19, 0x6a, 0xb5, 0x8c, 0xea, 0xf0, 0x18, 0x8b, 0x4c, 0xcf, 0x1f, 0xce, 0xea, - 0x8b, 0x0c, 0x03, 0x27, 0x96, 0xc0, 0x28, 0x95, 0x5d, 0x6e, 0xd9, 0xd8, 0x9f, 0xf4, 0xde, 0x78, 0x89, 0x52, 0x75, - 0x3c, 0xc7, 0xad, 0x1a, 0xba, 0x43, 0x57, 0xc4, 0x1b, 0x3e, 0xf0, 0xd8, 0xbf, 0xba, 0x31, 0xa8, 0x63, 0x4d, 0x9b, - 0x08, 0x5e, 0x07, 0xfd, 0xcc, 0x14, 0x9c, 0x6c, 0x7c, 0x4a, 0x74, 0x0a, 0x83, 0x04, 0x0a, 0x66, 0x28, 0xf6, 0x99, - 0x96, 0x8f, 0x4b, 0xe9, 0xce, 0x5a, 0x2a, 0xea, 0xd8, 0x38, 0x33, 0xca, 0xfa, 0xe5, 0x72, 0x69, 0xe3, 0x6d, 0x04, - 0xf4, 0x92, 0x7b, 0x79, 0x7f, 0xc5, 0x49, 0xe3, 0x18, 0x91, 0x2c, 0x38, 0x1e, 0x1e, 0xc7, 0x1c, 0xf2, 0xc6, 0xad, - 0x05, 0x1d, 0x26, 0xb4, 0x06, 0x36, 0x3b, 0x67, 0x39, 0xe5, 0x6b, 0x11, 0xce, 0xb2, 0xcb, 0x6f, 0x36, 0x40, 0x04, - 0x84, 0x9e, 0x16, 0x91, 0x04, 0x3e, 0x2b, 0x90, 0x31, 0x47, 0x4e, 0x72, 0x64, 0x79, 0xad, 0xe4, 0x11, 0x48, 0x26, - 0x46, 0x8a, 0xb7, 0xe1, 0xa6, 0x9f, 0xa2, 0x4b, 0x76, 0xb0, 0x51, 0x37, 0x08, 0xa2, 0x04, 0x3b, 0xc0, 0x5f, 0xf8, - 0xf3, 0xa1, 0xef, 0xfc, 0xe9, 0xb7, 0x5b, 0x87, 0xff, 0x27, 0xb8, 0xb4, 0x8f, 0x18, 0x3b, 0xfd, 0x25, 0x56, 0x7d, - 0xf5, 0x7f, 0x73, 0xd7, 0xd0, 0x3a, 0xf0, 0xe1, 0x03, 0x17, 0x1e, 0x7f, 0x1b, 0x96, 0xd0, 0x6a, 0x6b, 0x77, 0x58, - 0x52, 0x88, 0x13, 0xe5, 0xc4, 0x8e, 0xea, 0x3d, 0x8a, 0xf6, 0xc5, 0xd3, 0xfb, 0x23, 0x01, 0xac, 0xbf, 0x7f, 0xe3, - 0x51, 0x69, 0xa4, 0xbb, 0x5f, 0x82, 0x4c, 0x6c, 0xad, 0x4d, 0x90, 0xab, 0xd4, 0x7e, 0x7e, 0xee, 0x5b, 0xeb, 0xa8, - 0xa5, 0xab, 0x6c, 0x70, 0x7f, 0xd1, 0x55, 0x7b, 0xb0, 0xc9, 0xf2, 0x61, 0xbb, 0xb9, 0xb5, 0x4f, 0x2b, 0x57, 0x19, - 0xe1, 0x43, 0x01, 0x02, 0xec, 0x54, 0x99, 0x9c, 0x3c, 0xe3, 0xb7, 0x52, 0xf0, 0x8e, 0xa5, 0x9e, 0xf6, 0x37, 0x9b, - 0xe0, 0xef, 0x0d, 0x6b, 0xbb, 0xab, 0x47, 0xeb, 0x03, 0x08, 0xca, 0xa5, 0xd7, 0x50, 0xc1, 0x21, 0xc4, 0x4b, 0x0a, - 0x12, 0x72, 0x18, 0xce, 0x5c, 0x74, 0x92, 0x43, 0x4c, 0x1b, 0x31, 0xac, 0xab, 0xb4, 0x55, 0x71, 0xe2, 0xb5, 0x3c, - 0xb0, 0x5b, 0x18, 0xb7, 0x60, 0x61, 0x58, 0x64, 0x30, 0xf2, 0x0c, 0xec, 0x70, 0x2e, 0x1e, 0x7a, 0x35, 0x0b, 0x5e, - 0x90, 0x26, 0x5c, 0x96, 0xfa, 0x7d, 0xb0, 0x38, 0x66, 0xf5, 0x55, 0x0b, 0x7e, 0xcd, 0xc1, 0xa9, 0x29, 0x6a, 0x43, - 0x7e, 0xb5, 0x6f, 0x66, 0x84, 0xcb, 0x0b, 0xb9, 0xc7, 0x42, 0x10, 0x2a, 0xdb, 0xb8, 0x65, 0xd2, 0xc1, 0xc9, 0x50, - 0xdf, 0xa7, 0x0d, 0x61, 0x84, 0x17, 0x04, 0x32, 0x4d, 0x51, 0xca, 0xf0, 0x5b, 0xb8, 0xaf, 0x1d, 0xca, 0x06, 0xb9, - 0x99, 0x0e, 0x23, 0xe1, 0x8a, 0xec, 0x38, 0xf0, 0x2c, 0xcd, 0xa7, 0x6a, 0x7f, 0x6c, 0x5d, 0x07, 0xfd, 0xce, 0x25, - 0x44, 0xed, 0x91, 0x9a, 0xf1, 0x31, 0x9b, 0x76, 0x0a, 0xfe, 0xe6, 0x73, 0x29, 0x36, 0x10, 0x1f, 0x69, 0xb9, 0x4b, - 0xa9, 0x89, 0x63, 0xb9, 0xb4, 0xca, 0x38, 0xd4, 0xd0, 0x29, 0x0b, 0x6d, 0x23, 0x97, 0x19, 0x44, 0xda, 0x2e, 0x4e, - 0x49, 0x95, 0x49, 0x1e, 0x8b, 0x13, 0x62, 0xc8, 0x42, 0xbf, 0xc0, 0xda, 0xfe, 0x72, 0xf3, 0x4b, 0x32, 0x54, 0x21, - 0x76, 0xee, 0x10, 0xfa, 0xb0, 0xc0, 0xe6, 0xa5, 0xb4, 0x14, 0x46, 0x15, 0xa6, 0xae, 0xda, 0xea, 0xb9, 0xa5, 0x6d, - 0x48, 0x32, 0x90, 0xcc, 0xb2, 0x84, 0x8f, 0xb2, 0x81, 0x41, 0x8e, 0xff, 0x6d, 0x00, 0xd9, 0xf6, 0x20, 0xd8, 0xde, - 0x32, 0x65, 0xa9, 0xef, 0x2d, 0x7e, 0x9a, 0x84, 0x4f, 0x4c, 0x08, 0x5c, 0x06, 0x5c, 0x75, 0xfe, 0x6c, 0x76, 0x8d, - 0xff, 0x10, 0x06, 0xfe, 0x1b, 0x6e, 0xf4, 0x0d, 0xbe, 0x4a, 0x3f, 0x77, 0xc9, 0xfd, 0xc8, 0xfb, 0x91, 0x3c, 0xdb, - 0x96, 0xc6, 0x4f, 0x5c, 0xac, 0x78, 0x53, 0x7e, 0x0a, 0x7f, 0x33, 0x9a, 0xef, 0xcb, 0xfa, 0xce, 0xb6, 0xd3, 0x47, - 0x60, 0x33, 0xd8, 0x23, 0x3b, 0x74, 0xd7, 0x47, 0xa3, 0x54, 0xcc, 0x1c, 0xf1, 0xed, 0xc3, 0x9f, 0xdb, 0xda, 0x2f, - 0xce, 0x86, 0xe8, 0x3a, 0x30, 0x85, 0xd3, 0xd7, 0x01, 0xca, 0x0e, 0x59, 0x62, 0xda, 0x81, 0x4a, 0x14, 0x1d, 0x74, - 0x66, 0x5d, 0x0a, 0xb0, 0x7c, 0xe3, 0xe8, 0x67, 0x0d, 0xae, 0x95, 0xa4, 0xc3, 0x50, 0x6b, 0x11, 0x9f, 0x4d, 0xa7, - 0xf7, 0xa3, 0x58, 0x51, 0xc0, 0x02, 0xe6, 0xeb, 0x04, 0x76, 0x91, 0xde, 0xbc, 0x3c, 0x92, 0xe0, 0x9c, 0x70, 0x38, - 0x72, 0x81, 0x00, 0x2a, 0xb4, 0x5d, 0x48, 0x13, 0x7e, 0x9d, 0x3b, 0xba, 0xb6, 0x9f, 0x90, 0x5a, 0xb2, 0x1c, 0xe8, - 0xa5, 0xfa, 0xbf, 0xee, 0xee, 0x7e, 0x51, 0x1e, 0x2f, 0xec, 0xed, 0x89, 0x70, 0xcb, 0xb3, 0xaf, 0xac, 0xb0, 0xea, - 0x15, 0xf7, 0xfb, 0x24, 0x13, 0xad, 0xdd, 0x5c, 0x1f, 0xac, 0x4e, 0xd4, 0x2a, 0x78, 0xe8, 0xab, 0xf4, 0x3f, 0x33, - 0xbd, 0xdc, 0x73, 0x53, 0x1e, 0x4a, 0x84, 0x03, 0x5f, 0x34, 0x34, 0x3e, 0x43, 0x35, 0x44, 0xf1, 0x58, 0x0d, 0x38, - 0x8c, 0x49, 0x73, 0xdc, 0x27, 0x58, 0xc9, 0xd4, 0x89, 0x51, 0xb5, 0x11, 0x05, 0x24, 0x98, 0x82, 0xce, 0xa5, 0x2d, - 0xa1, 0x40, 0x05, 0xcd, 0xa2, 0x84, 0x46, 0xdf, 0xf3, 0x61, 0x45, 0x1a, 0x1d, 0xdc, 0x13, 0xc8, 0x08, 0x82, 0xca, - 0xb2, 0xf9, 0xcd, 0x76, 0x35, 0x8a, 0xc2, 0xa9, 0xef, 0x13, 0x0a, 0xca, 0x7f, 0x9c, 0xf9, 0xd2, 0x66, 0xc7, 0xdd, - 0xa3, 0x81, 0x50, 0x54, 0xeb, 0x12, 0x2f, 0x5b, 0x6d, 0xe4, 0x26, 0x37, 0x45, 0xa4, 0x09, 0xc4, 0x1e, 0xfe, 0x04, - 0x4d, 0x52, 0xc4, 0x74, 0x11, 0x37, 0x97, 0xe6, 0xe2, 0xe0, 0x4a, 0xe9, 0xea, 0x81, 0xdb, 0xd0, 0xc8, 0xab, 0x89, - 0x5e, 0xed, 0xe2, 0x0f, 0x02, 0xd1, 0x09, 0x4b, 0x26, 0xf2, 0x8a, 0x81, 0x48, 0x82, 0x81, 0x02, 0x45, 0xdb, 0x82, - 0x29, 0x0a, 0xbd, 0x6e, 0xeb, 0xc5, 0x71, 0x7e, 0x21, 0x53, 0x11, 0x64, 0x2a, 0x6d, 0x6e, 0x80, 0xab, 0x9f, 0xb6, - 0xec, 0x07, 0x1a, 0xff, 0x93, 0x9c, 0x70, 0xd3, 0x43, 0xcf, 0x42, 0x7c, 0xea, 0x3e, 0xb6, 0xde, 0x55, 0xa0, 0x30, - 0xbd, 0x78, 0x11, 0x2d, 0x90, 0xa2, 0x6e, 0xcc, 0x89, 0x25, 0x9f, 0xab, 0x16, 0xdf, 0x57, 0xe5, 0x97, 0x54, 0x50, - 0x43, 0x40, 0x98, 0x09, 0x20, 0x2b, 0xb1, 0x92, 0xcd, 0x2b, 0x72, 0xee, 0x4b, 0xb6, 0x61, 0x27, 0x78, 0x53, 0x6b, - 0x6e, 0x77, 0x46, 0x8c, 0xe0, 0xfd, 0x10, 0x01, 0x21, 0xaa, 0x15, 0x99, 0x25, 0xbf, 0x2a, 0x45, 0x9b, 0x01, 0x0f, - 0xa1, 0x20, 0x2c, 0xce, 0x5e, 0x21, 0xf3, 0x58, 0x2c, 0xf4, 0x03, 0x72, 0x8d, 0xb8, 0x87, 0x43, 0x04, 0x60, 0xd8, - 0xef, 0xee, 0x11, 0x31, 0xd2, 0xe1, 0xc2, 0x44, 0x0c, 0x03, 0x48, 0xd8, 0x06, 0x2e, 0xb3, 0xf3, 0xf1, 0xbe, 0x7b, - 0xff, 0xc7, 0x18, 0xce, 0x0d, 0xd6, 0x4a, 0xb8, 0x75, 0x74, 0xd5, 0x09, 0xf2, 0xf2, 0x3e, 0xe2, 0xd3, 0xdc, 0x8e, - 0xa8, 0x97, 0x03, 0x51, 0x69, 0x35, 0x9e, 0x6d, 0x84, 0x87, 0x65, 0x0a, 0x8f, 0x7d, 0x2e, 0x28, 0x9d, 0x79, 0x09, - 0x2e, 0x01, 0xd5, 0x07, 0x19, 0x5f, 0x79, 0x23, 0xd1, 0xab, 0xcc, 0xc6, 0x9f, 0xc7, 0xf3, 0x3d, 0x6c, 0xd3, 0x45, - 0x1b, 0xd7, 0xd3, 0xe9, 0x1d, 0x4a, 0x32, 0xc1, 0xb4, 0xbb, 0x49, 0x36, 0xec, 0xfa, 0x89, 0xc9, 0x37, 0x2a, 0xe2, - 0x06, 0xa4, 0xf6, 0xdd, 0x38, 0xd0, 0x54, 0xb0, 0xde, 0x7c, 0x4a, 0xa2, 0x81, 0xe9, 0x11, 0xc9, 0xdc, 0xac, 0xd7, - 0xf6, 0x66, 0x0d, 0x01, 0x20, 0x05, 0x8b, 0x96, 0xe0, 0xbd, 0x2b, 0x67, 0x4d, 0x93, 0x12, 0x5b, 0x00, 0x31, 0xdd, - 0x40, 0xe2, 0x38, 0xa2, 0x5a, 0xe3, 0xee, 0x9b, 0xa5, 0x87, 0xf7, 0x3b, 0x62, 0xf7, 0xee, 0x48, 0x6a, 0x7a, 0xe5, - 0x84, 0xed, 0xde, 0x91, 0x53, 0xa3, 0x1c, 0x1f, 0xd5, 0xb3, 0x1b, 0xb6, 0xb4, 0x8e, 0xe5, 0xc9, 0x8c, 0x1e, 0x05, - 0xbe, 0x64, 0xde, 0xbb, 0x7a, 0x50, 0x92, 0x70, 0xf6, 0x0b, 0x01, 0xe2, 0x68, 0xfd, 0x4b, 0xad, 0xd2, 0xa5, 0xe6, - 0x94, 0xfb, 0xbd, 0x0d, 0xfb, 0xaa, 0xb0, 0x72, 0x49, 0x2d, 0x7a, 0x39, 0x99, 0xaa, 0x9e, 0xca, 0xd7, 0x5e, 0xcb, - 0x35, 0xce, 0x86, 0x1a, 0xda, 0x43, 0xef, 0x35, 0x4d, 0xd5, 0xb2, 0x15, 0xce, 0xa2, 0x98, 0xb6, 0x77, 0xd1, 0x9d, - 0x42, 0x63, 0x1f, 0x39, 0x91, 0x38, 0x61, 0x6e, 0xfd, 0x55, 0x1e, 0x89, 0x1d, 0x1e, 0xc1, 0x16, 0xbe, 0x91, 0x74, - 0x48, 0xca, 0x41, 0xc7, 0x09, 0xb8, 0xad, 0x0c, 0x4f, 0x33, 0x10, 0xb1, 0x5a, 0x44, 0x9a, 0xcc, 0x00, 0xc6, 0x31, - 0x45, 0x5c, 0xab, 0x60, 0xa8, 0x41, 0x72, 0xae, 0x06, 0xc1, 0x4c, 0xc7, 0x82, 0x9d, 0xf9, 0x28, 0x3f, 0x41, 0x5b, - 0x1b, 0xb3, 0xb0, 0xd0, 0xb3, 0x31, 0x35, 0xbb, 0x29, 0x01, 0xac, 0x11, 0x74, 0x7b, 0x49, 0x77, 0xcf, 0x0d, 0xc2, - 0xfb, 0xe5, 0xc8, 0xe5, 0x8c, 0xc1, 0x7a, 0xec, 0xa3, 0x6c, 0x71, 0xea, 0xc1, 0x83, 0x00, 0x33, 0x82, 0xc3, 0x56, - 0xb9, 0x81, 0xf6, 0x6c, 0xe8, 0x3f, 0xf0, 0x4d, 0x34, 0xfb, 0xa2, 0xc6, 0x82, 0x83, 0x33, 0xeb, 0xb3, 0x78, 0x57, - 0xc5, 0x04, 0x59, 0xc4, 0x90, 0x24, 0x67, 0x4d, 0x31, 0x37, 0xeb, 0x62, 0x3d, 0x83, 0x40, 0xb0, 0x7c, 0x85, 0xc9, - 0x00, 0xe1, 0x60, 0x76, 0xa3, 0x21, 0x26, 0xd6, 0x93, 0x77, 0xfd, 0x08, 0x80, 0xc0, 0x00, 0xdc, 0xc5, 0xb9, 0xd0, - 0x26, 0x3a, 0x80, 0x22, 0xbf, 0x07, 0x07, 0x40, 0x12, 0x98, 0xa1, 0x48, 0x50, 0xd0, 0xab, 0xd6, 0xbe, 0xe6, 0xc5, - 0x18, 0x0a, 0x2d, 0x24, 0x04, 0xc1, 0x56, 0xee, 0x92, 0x35, 0x2a, 0xb3, 0x75, 0xd0, 0x90, 0xf0, 0xed, 0x59, 0x51, - 0x49, 0x8a, 0x90, 0x5f, 0xe7, 0x81, 0xf4, 0x4f, 0x07, 0x34, 0xf6, 0x1c, 0x25, 0xa7, 0x9b, 0x4c, 0xcc, 0x1a, 0xe2, - 0xe5, 0x69, 0x3d, 0x5b, 0x84, 0x62, 0x0f, 0xdd, 0xa0, 0xcc, 0xc9, 0xd8, 0x89, 0x2f, 0xa8, 0x11, 0x49, 0xfd, 0xe3, - 0x14, 0xd5, 0x83, 0x7a, 0x14, 0x23, 0x93, 0x71, 0x3d, 0xa1, 0x96, 0xaf, 0xb5, 0x1b, 0x81, 0x36, 0x29, 0xcf, 0xb8, - 0xc9, 0xd8, 0x52, 0xbf, 0x54, 0xa8, 0x65, 0xa7, 0xa6, 0x14, 0xec, 0xe4, 0x3c, 0x2f, 0x38, 0x7a, 0x2a, 0x76, 0xc2, - 0x38, 0x08, 0xf6, 0xa7, 0xd3, 0x6e, 0x8d, 0xf7, 0x7c, 0x82, 0x78, 0xbc, 0xea, 0xdc, 0x3e, 0x64, 0x6a, 0xd5, 0xd4, - 0x14, 0x68, 0xc6, 0xd3, 0xf4, 0xfe, 0x3f, 0x80, 0x3e, 0x0f, 0xc1, 0x9e, 0xe9, 0xa3, 0x10, 0xb7, 0x83, 0x18, 0x7f, - 0xd0, 0xc2, 0x4f, 0xf8, 0x1a, 0x25, 0x5c, 0xff, 0x2d, 0x09, 0xd0, 0xf1, 0x83, 0x56, 0x82, 0x2d, 0x49, 0x9c, 0xce, - 0x45, 0xaa, 0x3b, 0xc7, 0x0c, 0xab, 0x20, 0x17, 0x44, 0x8e, 0xe7, 0x3a, 0x8d, 0xca, 0x42, 0x96, 0x22, 0xe1, 0xc6, - 0x2f, 0x7e, 0xcd, 0x96, 0x0a, 0x3f, 0x06, 0x0e, 0x02, 0x51, 0x01, 0x24, 0xec, 0xa7, 0x97, 0xda, 0x73, 0x66, 0xe7, - 0x01, 0x43, 0x16, 0x48, 0x4b, 0x1d, 0xfb, 0x0a, 0x9d, 0x04, 0x00, 0x44, 0xc7, 0xc4, 0x18, 0xc8, 0xab, 0x1d, 0x55, - 0x7f, 0x80, 0x43, 0xef, 0xa4, 0x63, 0x6d, 0xee, 0x26, 0x10, 0x45, 0x08, 0x08, 0x90, 0x58, 0x1b, 0x0a, 0x22, 0x6b, - 0x39, 0x88, 0xa0, 0x4a, 0xec, 0x04, 0x8e, 0xd2, 0x66, 0xc1, 0x8d, 0x78, 0x44, 0x1a, 0x01, 0xf4, 0x0a, 0x2e, 0xc4, - 0x8c, 0xc0, 0x28, 0xcb, 0x48, 0xe3, 0x17, 0x58, 0x68, 0x5c, 0x04, 0xc1, 0xe7, 0x94, 0xb5, 0xde, 0x83, 0x78, 0x3e, - 0xb7, 0x8a, 0xe6, 0x63, 0x42, 0x88, 0x35, 0x00, 0x6b, 0x28, 0xf3, 0xdf, 0xb2, 0x18, 0x30, 0x1a, 0x28, 0xd9, 0xde, - 0xe3, 0xcc, 0x54, 0x2f, 0x2d, 0x57, 0x55, 0x98, 0x32, 0x8f, 0xc8, 0xa5, 0xf3, 0xae, 0x3f, 0x85, 0xf5, 0xa2, 0x76, - 0x41, 0xd3, 0x84, 0xc7, 0xea, 0xa5, 0x7a, 0xd6, 0xc8, 0x0d, 0xc5, 0x7f, 0x52, 0x9a, 0x1b, 0xe3, 0xa8, 0xfc, 0x62, - 0x5a, 0xf5, 0xc9, 0xe8, 0xb0, 0xde, 0x45, 0x76, 0xa7, 0xa2, 0x02, 0xe0, 0xb4, 0x5b, 0x61, 0x9c, 0xd3, 0x2b, 0x7f, - 0xb5, 0xc3, 0x47, 0xab, 0xcc, 0xdc, 0xa2, 0x2e, 0xb3, 0x86, 0x82, 0xf2, 0xd1, 0x54, 0x7e, 0x87, 0xab, 0xbb, 0x3c, - 0x61, 0xf4, 0xa9, 0x2c, 0x8a, 0x53, 0x77, 0x0f, 0x47, 0xfe, 0x75, 0xd8, 0x12, 0x62, 0xa7, 0xba, 0xf5, 0x17, 0x17, - 0x1e, 0x4c, 0x7d, 0xe2, 0x15, 0x6e, 0xdc, 0x42, 0x9f, 0xb1, 0xd7, 0x8c, 0xa1, 0x13, 0x02, 0xc0, 0x3b, 0x4b, 0x14, - 0x65, 0x41, 0xf8, 0xf7, 0x47, 0x9b, 0xa7, 0x45, 0x34, 0x4f, 0xfa, 0x36, 0xde, 0x4e, 0x40, 0x53, 0x60, 0x83, 0x75, - 0x20, 0x30, 0x1f, 0xd0, 0xbf, 0x19, 0x6c, 0xa3, 0xc6, 0xf7, 0xad, 0x2e, 0x8a, 0x10, 0x5b, 0x18, 0x7c, 0x69, 0xfd, - 0xa5, 0x20, 0xb2, 0x3e, 0xa9, 0x01, 0x6d, 0x3f, 0x4d, 0xd6, 0x5d, 0x61, 0x28, 0x79, 0xda, 0xad, 0x87, 0x11, 0x3b, - 0x68, 0x96, 0xf4, 0x86, 0xc9, 0x1f, 0xd2, 0x41, 0xe1, 0x26, 0x26, 0x8b, 0x44, 0xf9, 0xbb, 0x1f, 0x53, 0x92, 0xdc, - 0xf5, 0x0e, 0x67, 0x29, 0xea, 0x2a, 0x4c, 0xfd, 0x59, 0x79, 0xbf, 0x52, 0xff, 0x96, 0xde, 0xd8, 0x42, 0xc3, 0x91, - 0xb5, 0x20, 0x91, 0xd3, 0x30, 0xe4, 0x5a, 0x1d, 0xce, 0x9c, 0xb8, 0xb5, 0xce, 0x76, 0x84, 0x04, 0x1e, 0x96, 0x9c, - 0x25, 0x4c, 0xd5, 0x9b, 0x5a, 0x10, 0x1c, 0x26, 0x82, 0xc2, 0x74, 0x51, 0x9c, 0x22, 0x61, 0xf1, 0x66, 0x87, 0x16, - 0xa7, 0xcb, 0x60, 0xe7, 0xab, 0xfd, 0x44, 0x85, 0x67, 0x6c, 0x16, 0x0b, 0x50, 0x2d, 0xa2, 0xfc, 0x78, 0x31, 0xc0, - 0xee, 0x9f, 0xf0, 0xb1, 0x74, 0x12, 0xb6, 0x1e, 0x74, 0x4d, 0x6a, 0xb9, 0x54, 0x6a, 0x54, 0x5b, 0xc6, 0x35, 0xd7, - 0x50, 0x71, 0xed, 0xf0, 0xd0, 0x76, 0xf8, 0xee, 0x83, 0xf7, 0x45, 0xe2, 0x19, 0x4c, 0xe5, 0x91, 0x43, 0x10, 0x2d, - 0x6e, 0x59, 0xb7, 0x3e, 0x0c, 0x35, 0x97, 0xa7, 0xb0, 0x8f, 0x86, 0x72, 0xba, 0x88, 0x97, 0x24, 0xdf, 0x41, 0x1d, - 0x48, 0x0f, 0x1d, 0x26, 0x7a, 0x7b, 0x5f, 0x35, 0xeb, 0x0e, 0x34, 0xdf, 0xf4, 0x88, 0x40, 0x9b, 0xbb, 0x6a, 0x31, - 0xaf, 0x98, 0xba, 0x44, 0xb7, 0xa4, 0x96, 0x20, 0xee, 0xba, 0x3c, 0x6e, 0x2d, 0x5f, 0x02, 0x29, 0xa5, 0x84, 0x43, - 0xcb, 0xa5, 0xe6, 0xae, 0xf7, 0x1d, 0x87, 0x84, 0xad, 0xd0, 0x92, 0x75, 0xeb, 0x70, 0x1b, 0x6b, 0xfd, 0x29, 0x30, - 0xa9, 0x7f, 0x69, 0x45, 0x38, 0x78, 0x75, 0xc1, 0xba, 0x2d, 0x3e, 0x78, 0x61, 0x5d, 0x83, 0xae, 0x3d, 0xac, 0x44, - 0x87, 0x1d, 0x56, 0xa1, 0xd5, 0x66, 0x2d, 0x71, 0xb5, 0x12, 0xe3, 0x1b, 0xfa, 0xc3, 0x05, 0x27, 0x96, 0x9d, 0x65, - 0x48, 0xe3, 0x91, 0x93, 0xde, 0x8a, 0x3c, 0x55, 0x64, 0xbf, 0x62, 0x46, 0xc5, 0x4f, 0xd7, 0x91, 0xd6, 0x0b, 0x38, - 0x23, 0x94, 0xbd, 0xfc, 0x80, 0x8d, 0x63, 0x0e, 0xb6, 0x65, 0xd6, 0xde, 0xbb, 0x90, 0x56, 0x62, 0x87, 0x08, 0x5e, - 0x71, 0x17, 0xc3, 0x03, 0xcd, 0x0a, 0xc8, 0x98, 0x82, 0x98, 0x50, 0xf0, 0xf7, 0xba, 0x22, 0x64, 0xec, 0xf0, 0xa4, - 0x73, 0x6c, 0xd9, 0xf1, 0x09, 0x0a, 0x70, 0x64, 0x19, 0x18, 0x8f, 0x51, 0xa5, 0xa2, 0x3d, 0x9d, 0xe1, 0x18, 0xd5, - 0x2c, 0xad, 0x98, 0x5f, 0xc5, 0x02, 0x59, 0x01, 0xbb, 0x71, 0xd6, 0xb2, 0xd7, 0x16, 0xb9, 0x44, 0xf1, 0x86, 0xec, - 0x4e, 0x15, 0x99, 0x85, 0xb1, 0x4e, 0x95, 0x2c, 0xb0, 0xf4, 0xb8, 0x26, 0x94, 0xf1, 0x3f, 0x4d, 0x09, 0xca, 0xb7, - 0xfb, 0x9a, 0x4e, 0x2a, 0x34, 0x0a, 0xd7, 0x64, 0x7d, 0x9a, 0x5f, 0xd1, 0x13, 0xb9, 0xc0, 0xba, 0x24, 0x09, 0xe3, - 0x06, 0x31, 0xaa, 0xda, 0x84, 0x80, 0x6e, 0x08, 0xc5, 0x9b, 0x82, 0xd0, 0x94, 0x21, 0xb4, 0x9c, 0xe4, 0xa8, 0x1e, - 0x70, 0x96, 0xc8, 0xcd, 0xc1, 0x6b, 0x04, 0x57, 0xd1, 0x0e, 0x52, 0x54, 0x61, 0xb8, 0x8b, 0x6a, 0x90, 0xe6, 0xda, - 0x23, 0xa5, 0xe0, 0xaf, 0x09, 0xd0, 0x01, 0x08, 0xc3, 0xca, 0xdf, 0xdc, 0xa8, 0xe0, 0x15, 0xca, 0x4a, 0xe9, 0x54, - 0x73, 0x98, 0x26, 0xa6, 0xa5, 0x53, 0x46, 0x3a, 0xe1, 0x07, 0xaf, 0x11, 0xe7, 0x82, 0xa0, 0xb6, 0xab, 0xc5, 0x6a, - 0x30, 0x4c, 0xea, 0xa4, 0x2b, 0x40, 0x3e, 0x6a, 0x1a, 0x4c, 0x68, 0xb7, 0x94, 0xe8, 0x45, 0xd8, 0x2b, 0xb0, 0x9c, - 0x76, 0xb3, 0x5d, 0x03, 0x88, 0xd5, 0x5a, 0xd8, 0x41, 0x06, 0xc6, 0x32, 0xfe, 0x08, 0xc8, 0x03, 0x9f, 0x3e, 0x2f, - 0xad, 0x78, 0x64, 0xbd, 0x72, 0xf8, 0xe1, 0xe3, 0xaf, 0x29, 0x18, 0x2c, 0x15, 0x0d, 0x39, 0xbd, 0xd7, 0xe7, 0xf4, - 0x9d, 0x6c, 0x30, 0xd6, 0xa2, 0x73, 0x10, 0xf9, 0x2e, 0xb4, 0x23, 0xdd, 0x95, 0x75, 0x99, 0x91, 0xed, 0xeb, 0x81, - 0x2c, 0xf4, 0x5c, 0x5f, 0x8a, 0x20, 0xd5, 0x82, 0xc2, 0xdf, 0x01, 0x8a, 0x4b, 0x43, 0x28, 0x0d, 0xe5, 0xa0, 0x8c, - 0x14, 0x8e, 0x32, 0x19, 0xee, 0x34, 0x90, 0x02, 0x32, 0x22, 0x10, 0xcc, 0x99, 0x65, 0xed, 0x2d, 0x16, 0xd8, 0x92, - 0x9d, 0xa9, 0x5b, 0xb5, 0x6b, 0x4c, 0x98, 0x97, 0x39, 0x34, 0x7a, 0xe0, 0xd4, 0x96, 0xd3, 0xa3, 0x68, 0xa9, 0x9e, - 0x4e, 0x86, 0xa2, 0x99, 0x95, 0xa4, 0xb3, 0x97, 0xcf, 0xab, 0x86, 0x56, 0x92, 0x7e, 0x67, 0xa1, 0x06, 0xa4, 0x38, - 0x81, 0x3f, 0xbe, 0x08, 0x21, 0x5f, 0x72, 0x1f, 0xee, 0xe9, 0x2f, 0x3b, 0x0b, 0x4e, 0x2f, 0x51, 0x83, 0x9a, 0xbf, - 0x2c, 0x9c, 0xe9, 0x8d, 0x29, 0x1d, 0x94, 0x38, 0x16, 0x84, 0x3d, 0xbc, 0x97, 0xbe, 0xa8, 0x46, 0xdb, 0x45, 0x45, - 0xc1, 0x74, 0x00, 0xa8, 0x68, 0x1a, 0x0e, 0x1d, 0xd7, 0x9a, 0xa4, 0xac, 0xa4, 0xe2, 0xda, 0xcd, 0x15, 0x9f, 0x3e, - 0x76, 0x8c, 0xd4, 0xba, 0x03, 0x93, 0x78, 0x00, 0xcb, 0x3f, 0x07, 0xde, 0x8f, 0x09, 0x20, 0x5c, 0x4a, 0x79, 0x7e, - 0x71, 0x36, 0xe8, 0xf1, 0xdb, 0xad, 0xb8, 0x17, 0xde, 0xab, 0x8e, 0x31, 0x22, 0x66, 0x0b, 0x21, 0x79, 0xc8, 0x96, - 0x48, 0x6c, 0x36, 0x37, 0x4e, 0xba, 0xdb, 0x1c, 0x75, 0x78, 0x7f, 0xf0, 0x7a, 0xc9, 0x3b, 0x76, 0xa7, 0x69, 0xf0, - 0x41, 0xab, 0x53, 0x23, 0xad, 0xe9, 0x3f, 0xf8, 0xb7, 0x72, 0x91, 0x4e, 0xea, 0x1a, 0x90, 0xe8, 0x7c, 0x09, 0x09, - 0xf6, 0x07, 0x49, 0x91, 0x15, 0x5d, 0x2a, 0x65, 0x1b, 0x15, 0xeb, 0x97, 0x66, 0x39, 0x0b, 0xd7, 0x9b, 0x92, 0x7e, - 0xd9, 0xa5, 0x9b, 0x9c, 0x81, 0x75, 0xc1, 0xaa, 0xec, 0x39, 0xc7, 0xe2, 0x19, 0x32, 0xb1, 0xb0, 0xd7, 0x25, 0xca, - 0x52, 0x17, 0x36, 0x90, 0x64, 0xc7, 0xf0, 0x96, 0xf1, 0xe8, 0x4f, 0x9b, 0xc3, 0xbb, 0x9f, 0xf6, 0xed, 0x83, 0xfc, - 0x79, 0x1d, 0xed, 0x0c, 0x0a, 0x71, 0x29, 0xe9, 0xc2, 0xc3, 0x45, 0x0d, 0x2e, 0x09, 0x2d, 0xbc, 0x2d, 0x21, 0x2e, - 0x1e, 0xc3, 0x79, 0xfb, 0x0e, 0x41, 0xad, 0xac, 0xd8, 0xde, 0x71, 0xc4, 0x42, 0x3a, 0xeb, 0x95, 0x00, 0xfa, 0x2d, - 0x95, 0xb5, 0xb8, 0x23, 0xa7, 0x05, 0x94, 0x44, 0xca, 0x2e, 0xd1, 0xd3, 0xd1, 0xa9, 0xad, 0x3d, 0x9b, 0x0f, 0x6b, - 0x4b, 0xd1, 0x36, 0x12, 0x55, 0x9c, 0x43, 0x1c, 0xa3, 0x61, 0x68, 0x73, 0x6d, 0x6d, 0x8b, 0x3a, 0xcc, 0x50, 0x1d, - 0x6b, 0x08, 0x9b, 0x6e, 0x29, 0xe6, 0x5f, 0xaa, 0x1d, 0x97, 0x6e, 0x0d, 0x86, 0x09, 0xc9, 0x83, 0xa0, 0x4c, 0xc2, - 0xa5, 0xbc, 0xbd, 0xf0, 0x21, 0xdd, 0xd7, 0xeb, 0x77, 0x28, 0xff, 0x6e, 0x41, 0x5b, 0x8b, 0x6f, 0x9a, 0xff, 0x20, - 0xff, 0x2f, 0x1b, 0x30, 0x34, 0xe6, 0xf1, 0xe1, 0x58, 0xd2, 0x46, 0x19, 0x2d, 0xe5, 0x14, 0x1e, 0x3b, 0xd3, 0xf4, - 0x12, 0x4b, 0x87, 0x70, 0x77, 0x27, 0x99, 0x05, 0x87, 0x2d, 0x9b, 0x03, 0x24, 0x28, 0xc1, 0xe4, 0xcd, 0xc5, 0x68, - 0xd3, 0x63, 0xba, 0xc2, 0xe1, 0xbb, 0x15, 0x49, 0x36, 0x7b, 0x8d, 0x8b, 0x18, 0x20, 0x3d, 0x57, 0x30, 0x81, 0x02, - 0xfe, 0x30, 0x43, 0x51, 0x77, 0xe3, 0x5a, 0x4a, 0x31, 0x65, 0x8d, 0x20, 0x98, 0xe5, 0x2d, 0x9e, 0x63, 0xc8, 0xb4, - 0xad, 0x9e, 0xbb, 0x4f, 0x7a, 0xc0, 0x80, 0x13, 0x39, 0xfb, 0xd5, 0x62, 0x43, 0xa8, 0x6a, 0xdd, 0xae, 0xbd, 0x26, - 0xba, 0x42, 0x24, 0x7a, 0x72, 0xd2, 0x69, 0x40, 0x6c, 0x8b, 0x30, 0xe4, 0x50, 0xc8, 0xf8, 0xb8, 0x15, 0x39, 0x93, - 0xf0, 0x19, 0xdf, 0xb2, 0x4b, 0x16, 0x77, 0xa2, 0x99, 0x63, 0xc8, 0x67, 0x26, 0x41, 0xc4, 0xe8, 0x5a, 0x2a, 0xe7, - 0x84, 0x14, 0x5d, 0xa9, 0x47, 0xdf, 0x0f, 0xc8, 0xd2, 0x48, 0x82, 0x38, 0x3a, 0x55, 0x63, 0x9e, 0xff, 0x9d, 0x59, - 0x44, 0x67, 0xf0, 0x0f, 0xe3, 0xcc, 0xb3, 0xaf, 0x88, 0x7d, 0x96, 0x70, 0x32, 0xe9, 0xd5, 0xd6, 0x7a, 0x18, 0x44, - 0x20, 0xe0, 0xf3, 0xdd, 0xe8, 0xcd, 0x46, 0x5b, 0x37, 0x68, 0xbc, 0xa3, 0x79, 0x3a, 0xec, 0xcf, 0xc8, 0xdd, 0xa0, - 0x99, 0xd6, 0x6a, 0x53, 0xe2, 0x33, 0x08, 0x9c, 0xcb, 0x48, 0x35, 0x67, 0x19, 0x98, 0x60, 0xbf, 0x5f, 0x6c, 0x7d, - 0x01, 0xd5, 0x99, 0x11, 0x48, 0xfd, 0xae, 0x7a, 0xa9, 0x55, 0x9a, 0x31, 0xa6, 0xd3, 0x45, 0x6d, 0xaf, 0x0d, 0x1c, - 0xf8, 0x3e, 0xd9, 0xc4, 0xa4, 0xad, 0x5e, 0xe2, 0x04, 0x45, 0x77, 0x68, 0xd1, 0xf9, 0x5e, 0x35, 0xd1, 0x54, 0x66, - 0xec, 0xc9, 0xb8, 0x90, 0xed, 0xeb, 0xed, 0x7e, 0x43, 0xe6, 0xe8, 0x5a, 0xc7, 0x48, 0xc9, 0x45, 0x7d, 0x8e, 0xb8, - 0xca, 0x90, 0x7f, 0x5e, 0xc8, 0x62, 0x47, 0x1c, 0x6e, 0x7f, 0x87, 0x87, 0xd5, 0xa2, 0x2e, 0x66, 0xc7, 0x81, 0x38, - 0x46, 0xfe, 0x21, 0x72, 0x7e, 0x14, 0xb0, 0x19, 0x7e, 0x9a, 0xe1, 0x33, 0x68, 0xb3, 0x37, 0xfb, 0xc9, 0x36, 0xbf, - 0xf5, 0xd8, 0xf5, 0xef, 0x1a, 0x5e, 0xf9, 0xc6, 0x2a, 0x1c, 0x76, 0xdf, 0x76, 0x62, 0xcc, 0xfb, 0xf3, 0xd3, 0xaf, - 0x35, 0x46, 0xde, 0x10, 0xb0, 0xd9, 0xc1, 0xfb, 0x38, 0x67, 0xbf, 0xa5, 0xc3, 0x42, 0x2f, 0x6a, 0x15, 0x90, 0x51, - 0xe7, 0x3e, 0x71, 0x7d, 0x0b, 0x90, 0x56, 0x68, 0xa1, 0xd5, 0xa3, 0x5b, 0x42, 0xf7, 0x12, 0x21, 0xeb, 0x9b, 0x4b, - 0xb1, 0xe9, 0xb4, 0x67, 0x4d, 0x25, 0x25, 0x4d, 0xf1, 0x96, 0x14, 0x8a, 0xdf, 0xcf, 0xa8, 0x93, 0x07, 0xb8, 0xcf, - 0xa7, 0x8d, 0x64, 0xa6, 0xee, 0x26, 0xeb, 0xf9, 0x93, 0xd9, 0x13, 0x4a, 0xdb, 0x30, 0x9a, 0x43, 0x7e, 0xd3, 0x68, - 0x40, 0x8f, 0x47, 0x8b, 0x89, 0xd8, 0x0f, 0x02, 0x14, 0x7c, 0x1a, 0x2a, 0xa0, 0x7a, 0xa0, 0xdf, 0xf6, 0xd7, 0x01, - 0x27, 0x15, 0x31, 0x06, 0x7b, 0x03, 0x50, 0x30, 0x44, 0xb6, 0x91, 0xc5, 0x7b, 0xa1, 0x43, 0xd1, 0x27, 0x09, 0x9d, - 0xe9, 0x85, 0x12, 0x91, 0xd0, 0x23, 0x88, 0xce, 0xe9, 0xae, 0xf8, 0xc6, 0xe6, 0xc3, 0xeb, 0x58, 0xec, 0x59, 0x26, - 0xdf, 0x61, 0xb3, 0xb2, 0x0e, 0xf5, 0x35, 0x93, 0x86, 0xee, 0x45, 0xfb, 0xa8, 0x71, 0xeb, 0x45, 0x42, 0xc7, 0x5f, - 0xce, 0xeb, 0x91, 0x55, 0x6f, 0x89, 0x18, 0xa6, 0x98, 0x79, 0xcf, 0xa2, 0xde, 0xba, 0x68, 0x09, 0xd7, 0xac, 0xab, - 0x0e, 0x82, 0xa6, 0xc4, 0xd3, 0x7a, 0x70, 0x9d, 0x0b, 0xb1, 0xf8, 0xc9, 0x24, 0x5a, 0x3f, 0xf9, 0x6d, 0xdc, 0xa0, - 0xe4, 0x5c, 0x68, 0xd0, 0x85, 0x02, 0xa1, 0xf7, 0xde, 0x7b, 0x9b, 0x8f, 0xf6, 0x36, 0x35, 0xfd, 0x85, 0x79, 0xf1, - 0x47, 0x72, 0xd6, 0x6f, 0x76, 0x39, 0x70, 0x10, 0x4a, 0x9c, 0x30, 0x22, 0x5c, 0xd8, 0x34, 0x97, 0xbc, 0x94, 0x59, - 0xb9, 0x70, 0x86, 0x03, 0xd1, 0x19, 0xf1, 0x0d, 0x3f, 0xd8, 0xb6, 0x40, 0x20, 0x6e, 0xb5, 0x4c, 0x14, 0xcf, 0x88, - 0x38, 0x91, 0x65, 0x0e, 0x93, 0x9a, 0xe6, 0x72, 0xa6, 0x15, 0xbb, 0x6d, 0x05, 0x8d, 0x6f, 0x8c, 0x73, 0x2c, 0x81, - 0xde, 0xac, 0xd0, 0xce, 0xa5, 0x92, 0x8f, 0xfd, 0x8e, 0xaa, 0x9d, 0xeb, 0x2f, 0xaf, 0x65, 0x5e, 0xee, 0x3c, 0xbb, - 0x36, 0xcd, 0xcb, 0x35, 0x86, 0xce, 0x40, 0x66, 0x47, 0x75, 0x95, 0xa9, 0xbb, 0xd8, 0xe0, 0x8e, 0x42, 0x75, 0xb5, - 0x20, 0x1c, 0x80, 0x22, 0x9a, 0xe6, 0x98, 0x1b, 0xcc, 0xa2, 0xaf, 0xae, 0xf0, 0x4e, 0x07, 0x6d, 0xb5, 0xb4, 0x01, - 0x25, 0x20, 0x9c, 0x74, 0xd1, 0x61, 0x89, 0x07, 0x77, 0xa7, 0xee, 0x54, 0xd2, 0x60, 0x5c, 0x2c, 0xce, 0xc3, 0xb3, - 0x28, 0xee, 0x0a, 0xd3, 0xcc, 0x68, 0xf4, 0x03, 0x4d, 0xb4, 0xe7, 0x9b, 0xa5, 0xc4, 0x92, 0x0b, 0x76, 0xb9, 0xc7, - 0xf6, 0x03, 0x45, 0xe2, 0xa5, 0x3c, 0x56, 0x3a, 0xa5, 0xc4, 0x4e, 0x4d, 0x3b, 0x2b, 0xd3, 0x1c, 0x7a, 0x96, 0x65, - 0xe2, 0xb9, 0xf4, 0x3b, 0xaa, 0x67, 0x5b, 0x66, 0x7d, 0x53, 0xb8, 0xdb, 0x3b, 0x91, 0x12, 0x3f, 0x38, 0xd6, 0xf0, - 0xb6, 0xe8, 0x76, 0x9a, 0xbe, 0x2d, 0xdc, 0xfa, 0x05, 0x63, 0x0f, 0x8b, 0x55, 0xac, 0xbe, 0x28, 0x8e, 0x26, 0x14, - 0xd8, 0xea, 0xdf, 0xe4, 0x24, 0x4d, 0xdc, 0x4a, 0xe3, 0xaf, 0x69, 0x09, 0x53, 0x75, 0xaa, 0x7b, 0x2f, 0xb1, 0x8a, - 0xb0, 0x70, 0xff, 0x7d, 0xf5, 0x70, 0x28, 0x64, 0xb6, 0x79, 0xd6, 0x3c, 0x42, 0xba, 0x92, 0x7b, 0xc8, 0xa7, 0x4a, - 0xa6, 0xe6, 0x93, 0x93, 0xec, 0x86, 0xbb, 0x56, 0xab, 0x56, 0xc2, 0x9b, 0x66, 0xab, 0xc3, 0x75, 0xae, 0xd8, 0x68, - 0x99, 0x4d, 0x6a, 0xbb, 0x82, 0xe9, 0xdc, 0x3a, 0xf1, 0x38, 0x44, 0x22, 0x94, 0xb1, 0xbb, 0xbd, 0x51, 0x07, 0x17, - 0xb0, 0x29, 0xc1, 0x5d, 0x29, 0x38, 0x37, 0xd9, 0xe0, 0x2e, 0x88, 0xd4, 0x28, 0xae, 0x74, 0xdc, 0xdb, 0x86, 0x48, - 0xc1, 0x4e, 0x7a, 0xa4, 0x88, 0xc5, 0x69, 0xba, 0xf0, 0x34, 0xbe, 0xf2, 0x66, 0xd7, 0x34, 0x53, 0xdf, 0xa1, 0x46, - 0x8e, 0x68, 0x54, 0xee, 0x65, 0x48, 0x4c, 0x81, 0x87, 0x56, 0xe3, 0x59, 0xaa, 0x42, 0x6e, 0x30, 0xa3, 0x5b, 0xae, - 0xdb, 0xfd, 0xe2, 0xe3, 0x71, 0x39, 0x13, 0xd1, 0x85, 0xf1, 0x95, 0x1a, 0x92, 0x95, 0xec, 0x27, 0x22, 0x2f, 0x38, - 0xa6, 0xb3, 0x37, 0x45, 0x02, 0x6e, 0xe9, 0x8d, 0x8b, 0xb4, 0xa1, 0x5c, 0xcb, 0x06, 0x9d, 0x26, 0x39, 0x15, 0x54, - 0x88, 0x99, 0xb1, 0x66, 0xf1, 0xbe, 0x04, 0x09, 0x87, 0x3d, 0x85, 0x03, 0xd9, 0xd4, 0xcc, 0x6d, 0x87, 0x32, 0xd7, - 0xa1, 0x1a, 0x47, 0x62, 0xa3, 0x72, 0x08, 0x8e, 0xce, 0xdc, 0xee, 0xb1, 0xb0, 0xae, 0x60, 0x4e, 0x15, 0x59, 0x1e, - 0x9c, 0xae, 0xf6, 0x5f, 0xb8, 0x23, 0xfa, 0x62, 0x20, 0xfa, 0x9d, 0x56, 0x4d, 0xb4, 0xc0, 0x43, 0x8b, 0xeb, 0xda, - 0x42, 0x63, 0x0a, 0xe2, 0x80, 0xf4, 0x66, 0x82, 0xa2, 0xe1, 0x93, 0x66, 0x98, 0x83, 0x9e, 0xea, 0x9b, 0x9f, 0x3b, - 0x75, 0xf6, 0x65, 0x9a, 0x5e, 0x18, 0x66, 0x97, 0x06, 0xee, 0x8c, 0xa3, 0xa6, 0x18, 0x36, 0x5f, 0x8c, 0xbe, 0x89, - 0x5c, 0x9e, 0x7b, 0x56, 0x33, 0xc1, 0x34, 0x1d, 0x73, 0xe4, 0xbf, 0xc6, 0xf3, 0x7e, 0xc1, 0x71, 0x8c, 0x4a, 0x2f, - 0xbf, 0x28, 0x73, 0xa6, 0x25, 0x1b, 0xef, 0xab, 0x0b, 0xb8, 0x9e, 0x8c, 0x72, 0x24, 0x1e, 0x96, 0x59, 0x2c, 0x3f, - 0x80, 0x6f, 0x46, 0x2e, 0x41, 0x1b, 0xbb, 0x97, 0x89, 0x01, 0xc0, 0xb2, 0x5d, 0x73, 0x52, 0xbb, 0x46, 0xbe, 0x0a, - 0xb5, 0x55, 0xd7, 0xee, 0x24, 0xf3, 0x95, 0x08, 0xf6, 0x55, 0xfa, 0xe3, 0xa7, 0xa8, 0x07, 0xb5, 0xb7, 0x43, 0x92, - 0xab, 0x4d, 0xc2, 0xbe, 0x5f, 0x56, 0xa7, 0x27, 0xde, 0xbf, 0xc2, 0xe3, 0xe0, 0x02, 0x36, 0x3d, 0xf4, 0xf5, 0xb6, - 0x19, 0x89, 0x51, 0x77, 0x0d, 0xfe, 0xa0, 0xea, 0x21, 0x99, 0x1e, 0x74, 0x92, 0x47, 0x22, 0x30, 0xeb, 0xa9, 0x8e, - 0x89, 0xfc, 0x93, 0xf0, 0x73, 0xb5, 0xe7, 0xff, 0xf2, 0xf5, 0xd2, 0xcc, 0x9e, 0x21, 0xbc, 0x3b, 0xbc, 0xf9, 0xaa, - 0xd0, 0x75, 0xc6, 0xe5, 0xb1, 0x08, 0xe7, 0xce, 0xdf, 0x03, 0x70, 0xe5, 0x75, 0x79, 0xbb, 0x98, 0xef, 0x38, 0xed, - 0x2e, 0x6d, 0xde, 0xad, 0xa3, 0x86, 0x9f, 0x7f, 0xb0, 0x8d, 0x8a, 0x1f, 0xa9, 0x22, 0xfa, 0x75, 0x93, 0x05, 0x45, - 0x20, 0xe4, 0xe9, 0xeb, 0x84, 0x18, 0xff, 0x0c, 0x68, 0xfa, 0xa6, 0x50, 0xd9, 0x7f, 0xc3, 0x15, 0xa6, 0x0e, 0xe1, - 0x8f, 0xcc, 0xea, 0x60, 0x40, 0x73, 0x5b, 0xb8, 0x27, 0xfd, 0x17, 0x88, 0x35, 0x77, 0x10, 0xe0, 0x44, 0x91, 0xa4, - 0xe2, 0x87, 0x3e, 0xbc, 0x82, 0x26, 0xf7, 0x89, 0x14, 0xd4, 0x0c, 0xc5, 0x6d, 0x1b, 0xb8, 0x59, 0x0b, 0xca, 0x47, - 0x87, 0xa8, 0x73, 0xf4, 0x88, 0xdd, 0x5f, 0xda, 0x9d, 0xc9, 0xc3, 0x37, 0x94, 0xac, 0x89, 0x50, 0x31, 0x98, 0x50, - 0xfe, 0x5c, 0xf7, 0x4b, 0xde, 0xb3, 0xf2, 0x95, 0xb1, 0x28, 0xb8, 0xd8, 0x1b, 0x54, 0xfd, 0x00, 0x16, 0xd0, 0x59, - 0x24, 0xa0, 0x62, 0xb7, 0x13, 0xd6, 0xa9, 0xc6, 0xf1, 0x93, 0x58, 0x36, 0xf1, 0xc3, 0xf2, 0x0d, 0xff, 0xa5, 0x21, - 0x24, 0xa1, 0x88, 0x39, 0xa9, 0xc3, 0x60, 0x47, 0x2c, 0x6e, 0x63, 0x36, 0x0f, 0xa5, 0xe6, 0x61, 0x39, 0x71, 0xde, - 0x41, 0x0b, 0x10, 0x97, 0xa3, 0xee, 0xaa, 0xb5, 0x4b, 0xa7, 0x6b, 0x1d, 0x86, 0x93, 0xd8, 0x29, 0x56, 0x78, 0x18, - 0x5b, 0x8f, 0x1c, 0x23, 0xfc, 0x77, 0x20, 0x8f, 0x2f, 0x69, 0x7e, 0x78, 0x7b, 0x47, 0x83, 0x24, 0x1a, 0x2b, 0x15, - 0xa9, 0x78, 0x4a, 0x0f, 0x2b, 0x92, 0x21, 0x4d, 0x24, 0x7a, 0x78, 0x2f, 0xdf, 0xd2, 0x78, 0x58, 0xa5, 0x62, 0x43, - 0xc7, 0xcd, 0x56, 0x07, 0x92, 0x8f, 0xb2, 0xdd, 0x5f, 0x2f, 0xbd, 0x15, 0x9a, 0x75, 0x0a, 0x9b, 0x97, 0x1e, 0xb7, - 0xd8, 0xbb, 0x67, 0x31, 0xf5, 0x53, 0xa0, 0xc6, 0x91, 0x1c, 0x88, 0x89, 0xb1, 0xa9, 0x80, 0x3c, 0xf3, 0xe4, 0xe4, - 0xfd, 0xe0, 0xf5, 0x87, 0x63, 0x1f, 0x4f, 0xa4, 0x7c, 0xcc, 0xce, 0x70, 0xcf, 0xa7, 0x5e, 0x7e, 0xa6, 0x59, 0x1e, - 0x88, 0x9d, 0x8e, 0xe2, 0x21, 0x1f, 0xdd, 0x89, 0x50, 0x23, 0x2c, 0x27, 0x6b, 0xd5, 0x4a, 0x6b, 0x0c, 0x6a, 0x85, - 0x32, 0x97, 0xfb, 0x58, 0xdc, 0xda, 0xfd, 0x68, 0x93, 0xef, 0x7e, 0xa6, 0x88, 0xe7, 0x24, 0x02, 0xb9, 0xfe, 0x61, - 0x90, 0x96, 0x82, 0x79, 0x69, 0xa4, 0x95, 0xfa, 0x13, 0x4a, 0x39, 0xf0, 0x10, 0xf0, 0x25, 0x11, 0x97, 0x86, 0xb6, - 0xfe, 0x07, 0x4c, 0x5e, 0xd7, 0xbd, 0x6f, 0x25, 0xce, 0x9a, 0x70, 0x6e, 0x89, 0x7b, 0xac, 0xe5, 0x27, 0xb5, 0x24, - 0x0f, 0x0a, 0xa3, 0xbd, 0x9d, 0x1e, 0x1a, 0xa6, 0xc5, 0x2b, 0x16, 0xc5, 0x27, 0x7d, 0x2a, 0xbf, 0x07, 0xb5, 0xeb, - 0x2c, 0x75, 0xd9, 0x0b, 0xe5, 0x4c, 0xa9, 0xce, 0x0a, 0xbf, 0x76, 0x18, 0x5a, 0xe9, 0x48, 0x9a, 0x25, 0xce, 0xd5, - 0x7b, 0xec, 0x26, 0x4e, 0xb8, 0x21, 0x0d, 0x14, 0xa8, 0x64, 0x36, 0x1c, 0xd1, 0x53, 0x18, 0xdb, 0xfa, 0x32, 0xc3, - 0xed, 0x87, 0x32, 0xee, 0xe0, 0x68, 0xb2, 0x9a, 0x22, 0x5f, 0x27, 0x45, 0x2c, 0x14, 0x49, 0xd8, 0x85, 0x4b, 0x3b, - 0xbf, 0xc1, 0x5a, 0x69, 0x7e, 0x31, 0x5e, 0x30, 0xde, 0x65, 0x5d, 0xc9, 0x87, 0xcf, 0xba, 0x3b, 0x47, 0x04, 0xc8, - 0xa3, 0x9c, 0xd4, 0x3c, 0x82, 0xdb, 0x84, 0xa8, 0xb7, 0xb7, 0x3d, 0xb9, 0xe1, 0xcc, 0xb6, 0x45, 0x8b, 0x55, 0x2f, - 0x57, 0xb2, 0xdf, 0x9e, 0x95, 0x85, 0x82, 0xec, 0x6e, 0xe0, 0xc8, 0x9d, 0xe9, 0xc4, 0x6f, 0x18, 0x48, 0xef, 0x41, - 0x2d, 0x38, 0xba, 0x6e, 0x01, 0xa8, 0x35, 0xb4, 0x91, 0x4e, 0x5f, 0x23, 0xdb, 0xc8, 0xb8, 0xbc, 0x77, 0x1c, 0x41, - 0x71, 0xc0, 0xf8, 0xfa, 0xde, 0x31, 0x9d, 0x96, 0x80, 0xa4, 0x8f, 0x98, 0x0f, 0x03, 0x8c, 0x82, 0x18, 0x03, 0xd5, - 0xea, 0xf1, 0x01, 0x4f, 0x40, 0xc4, 0x91, 0xad, 0x0e, 0x6e, 0xdc, 0x20, 0x6f, 0x1d, 0x19, 0x07, 0x9f, 0x90, 0x6e, - 0x28, 0x61, 0x30, 0x5e, 0xfe, 0xc8, 0x40, 0x75, 0xa1, 0x8e, 0x0d, 0xae, 0x6d, 0x14, 0x34, 0xce, 0x0c, 0x10, 0x08, - 0x3e, 0xbd, 0x5d, 0xe9, 0xaf, 0xe3, 0x0f, 0x3a, 0xab, 0x37, 0x05, 0xa9, 0x95, 0xd3, 0xa3, 0x36, 0x5b, 0xe8, 0x2a, - 0xa0, 0x70, 0xa6, 0x7a, 0xc2, 0x80, 0xeb, 0x0f, 0x1b, 0x06, 0xe6, 0x3d, 0x27, 0x94, 0xd9, 0x1c, 0x09, 0x7f, 0x49, - 0xb3, 0x6f, 0xd6, 0x30, 0xcf, 0xe5, 0xd8, 0x83, 0x1d, 0x02, 0xb9, 0x7a, 0x18, 0xfb, 0x2d, 0xb6, 0x4d, 0x10, 0xe6, - 0xb0, 0xfc, 0xf8, 0x9f, 0x0a, 0xb5, 0x15, 0x4a, 0xed, 0xcd, 0x8f, 0x1c, 0xd6, 0xce, 0x73, 0x79, 0xfc, 0x4f, 0x28, - 0xf2, 0xd9, 0x3c, 0xe4, 0x79, 0xb2, 0xd8, 0x36, 0x88, 0x3f, 0x3d, 0xb2, 0x77, 0x36, 0xbb, 0xd6, 0x3e, 0xc8, 0xcf, - 0x60, 0x97, 0x7f, 0x0f, 0x09, 0xd5, 0xb0, 0x65, 0x05, 0x3f, 0x8c, 0x47, 0x04, 0x80, 0x85, 0x5e, 0xbf, 0xd9, 0x37, - 0xe4, 0x66, 0x1f, 0x90, 0x19, 0xf4, 0x39, 0xa2, 0x91, 0x67, 0xc6, 0x35, 0xec, 0xcc, 0x73, 0x3e, 0xf7, 0x0c, 0xe7, - 0x07, 0xca, 0x7a, 0xca, 0x9c, 0xe7, 0x25, 0x1b, 0xf7, 0xb6, 0x70, 0x06, 0xba, 0xd5, 0x8c, 0x5d, 0xd8, 0x82, 0xe5, - 0x3b, 0x6b, 0xc1, 0xa9, 0x1b, 0x30, 0x7b, 0x7b, 0xee, 0x4f, 0x74, 0xe0, 0xcf, 0x50, 0xde, 0xc9, 0xa8, 0xd5, 0x6f, - 0xbe, 0x75, 0x3b, 0x8d, 0x01, 0x6f, 0x84, 0xa7, 0x8a, 0xea, 0xcc, 0x39, 0x7b, 0x0a, 0x72, 0x21, 0xfe, 0xa2, 0x1b, - 0x7c, 0x42, 0xb7, 0x2a, 0x0a, 0x01, 0x5f, 0xda, 0x62, 0x44, 0xc8, 0x3a, 0xb4, 0xa4, 0x94, 0x27, 0x6d, 0x3e, 0x51, - 0x73, 0xa7, 0xe8, 0x34, 0xb7, 0x32, 0x3f, 0x9c, 0x39, 0x81, 0x0d, 0x02, 0x49, 0x48, 0x11, 0xc2, 0x3f, 0xc5, 0x8e, - 0x7b, 0x67, 0x6c, 0xb9, 0x91, 0xd0, 0xa0, 0x5d, 0x94, 0x8a, 0x18, 0x1f, 0x95, 0x4e, 0x23, 0xae, 0x7b, 0x8f, 0xf0, - 0x0f, 0xf6, 0x3f, 0xd3, 0xa8, 0x4c, 0xff, 0x9d, 0x46, 0x61, 0xfa, 0xcf, 0x69, 0x08, 0xa6, 0xff, 0x9e, 0x06, 0xbb, - 0x4b, 0xad, 0x0e, 0xec, 0xab, 0x23, 0xfb, 0xea, 0xce, 0x1e, 0xa7, 0xd9, 0x1e, 0x5a, 0x7b, 0x5f, 0x83, 0x76, 0x6c, - 0x3f, 0xf1, 0x2d, 0x39, 0xe0, 0xad, 0x63, 0x59, 0xb2, 0xf1, 0x76, 0x8a, 0xbd, 0xcf, 0xe9, 0xd2, 0xe5, 0x71, 0x1f, - 0xc5, 0x53, 0x1e, 0x87, 0xd5, 0x74, 0x56, 0x51, 0x67, 0x5a, 0xa6, 0x91, 0x3a, 0xbb, 0x7b, 0x28, 0x9e, 0x6a, 0x3e, - 0x42, 0xde, 0xad, 0x25, 0x9c, 0x81, 0xd2, 0x04, 0xf9, 0xad, 0xe7, 0x8f, 0x8d, 0x62, 0x2f, 0x1a, 0x6f, 0xbb, 0xfb, - 0x99, 0x21, 0xce, 0x5f, 0x0c, 0x91, 0x54, 0xa6, 0x15, 0x26, 0xda, 0xc1, 0xd4, 0x6d, 0xcd, 0x5a, 0xac, 0x29, 0x20, - 0xb3, 0x3d, 0x8f, 0xb2, 0x25, 0x08, 0xe1, 0xb9, 0x6d, 0xe1, 0x3f, 0x0b, 0x58, 0x75, 0xb1, 0x85, 0x5e, 0x73, 0x39, - 0xe8, 0xb4, 0x52, 0xe9, 0x3e, 0x6b, 0x10, 0xbb, 0xa1, 0x4c, 0x77, 0x84, 0x8c, 0xe1, 0x05, 0x8b, 0x2b, 0x28, 0xea, - 0x17, 0x62, 0x71, 0x17, 0xb3, 0x87, 0xe7, 0x27, 0x65, 0x1a, 0xfc, 0xbf, 0x16, 0xdb, 0x41, 0x77, 0x42, 0x53, 0xe3, - 0x92, 0x4b, 0x2a, 0xec, 0x17, 0x62, 0xdc, 0x9e, 0xdb, 0x45, 0xd7, 0xb7, 0x4e, 0x19, 0x89, 0xcf, 0xf9, 0x0c, 0xe4, - 0x7a, 0xe9, 0xa7, 0xfa, 0xf4, 0x88, 0x0b, 0xb2, 0xa8, 0xa7, 0x39, 0xc1, 0xaa, 0x10, 0x33, 0x52, 0x87, 0x9a, 0x12, - 0x9f, 0xbf, 0xfa, 0x9f, 0xf6, 0x6b, 0x49, 0x3c, 0x68, 0xa7, 0x5f, 0xf9, 0xf5, 0xb1, 0x10, 0x97, 0xf6, 0x33, 0xf1, - 0xe3, 0xad, 0x62, 0xed, 0x0f, 0xa8, 0x7a, 0x9c, 0xaa, 0xff, 0x3d, 0x6a, 0xd1, 0xaf, 0xc3, 0x65, 0xd3, 0x7f, 0x2d, - 0x89, 0x07, 0xec, 0xf5, 0xeb, 0xf3, 0x3b, 0x18, 0xfc, 0x13, 0x43, 0xf2, 0xc8, 0x76, 0x02, 0x94, 0xe3, 0x47, 0xd1, - 0xe4, 0x38, 0xe4, 0x4c, 0x53, 0xae, 0x2b, 0x3c, 0xbd, 0xea, 0x68, 0x4c, 0x95, 0x8b, 0x23, 0xe9, 0xf4, 0x7c, 0x02, - 0x13, 0xd9, 0xf0, 0x96, 0xd9, 0xa5, 0xc8, 0xde, 0xc3, 0x11, 0x64, 0xb7, 0xcd, 0x27, 0x31, 0xcb, 0x67, 0x11, 0x2d, - 0xdb, 0x35, 0xd8, 0xe8, 0x94, 0xc3, 0x54, 0x5c, 0x38, 0xc0, 0xbe, 0xb7, 0x5c, 0x18, 0xec, 0x46, 0x6a, 0x1f, 0xa2, - 0x72, 0x7a, 0x1b, 0xd1, 0x6f, 0xca, 0x71, 0xf4, 0x7e, 0x1b, 0xac, 0x96, 0xc2, 0xc3, 0x43, 0x83, 0x58, 0xb5, 0xc3, - 0x2b, 0x46, 0xfd, 0xe2, 0x3a, 0xd4, 0x6e, 0x00, 0x4e, 0x9c, 0x69, 0xd3, 0xf5, 0xe3, 0xfc, 0xc2, 0x9f, 0xea, 0xd3, - 0x95, 0xd5, 0x53, 0x0f, 0x5d, 0xc4, 0xd1, 0x19, 0x97, 0x9d, 0x83, 0x12, 0x23, 0x8c, 0x19, 0x9e, 0xbf, 0x37, 0x2b, - 0x4b, 0x28, 0x48, 0x0b, 0xbd, 0x16, 0x54, 0x19, 0xfd, 0xfb, 0x03, 0xc5, 0xb9, 0xbc, 0x7f, 0xae, 0x7b, 0xff, 0x1e, - 0x33, 0xb4, 0xcd, 0x8c, 0x7a, 0xab, 0xe0, 0x3e, 0x9f, 0x24, 0xb0, 0x48, 0x96, 0x58, 0xdb, 0xe2, 0xff, 0xea, 0x12, - 0xeb, 0x34, 0xaa, 0xbd, 0xc2, 0xd5, 0x99, 0xb6, 0xe6, 0xab, 0xfa, 0x52, 0x73, 0xaf, 0xee, 0x47, 0x3f, 0xd8, 0x30, - 0x8d, 0x4b, 0x7b, 0x5a, 0x90, 0x9b, 0x64, 0xcf, 0xa2, 0xc7, 0xe6, 0x64, 0x1c, 0x5a, 0xf5, 0x43, 0x93, 0x00, 0x51, - 0xc6, 0xa9, 0x47, 0x9a, 0xf2, 0x59, 0xee, 0xc3, 0x12, 0x2f, 0xb8, 0x10, 0xd7, 0xc3, 0xed, 0xee, 0x9e, 0x91, 0x1d, - 0xa8, 0xf2, 0x9b, 0x77, 0x87, 0xf7, 0x7d, 0xa4, 0xfc, 0x0e, 0x54, 0xb3, 0xbe, 0x59, 0xa9, 0x08, 0xd4, 0x15, 0x28, - 0x02, 0x5c, 0xbe, 0x67, 0x95, 0xe0, 0xae, 0xe6, 0x79, 0x18, 0xb1, 0x92, 0x84, 0x9a, 0x2b, 0x05, 0x87, 0xc5, 0xa6, - 0x29, 0x45, 0x61, 0xb1, 0x26, 0xfa, 0x75, 0xcd, 0xa6, 0xd3, 0x45, 0x0d, 0x9c, 0x1b, 0x98, 0xa5, 0x9b, 0x35, 0xa2, - 0x1f, 0x12, 0xf2, 0x0e, 0x9e, 0x66, 0x8b, 0x6d, 0x20, 0x86, 0x5a, 0x5c, 0x63, 0x60, 0x7b, 0xf8, 0x90, 0x07, 0xf4, - 0xa4, 0xff, 0x74, 0x0d, 0xd1, 0x23, 0xdb, 0x80, 0xc5, 0x6f, 0x26, 0x75, 0x78, 0xf7, 0x30, 0x3d, 0xe3, 0xa5, 0x4f, - 0xc6, 0x2f, 0x0e, 0x6d, 0x86, 0x9f, 0x1e, 0x51, 0x54, 0x24, 0x2a, 0x77, 0x76, 0xd9, 0xcf, 0x86, 0x4c, 0xed, 0xe9, - 0x78, 0xb2, 0xbf, 0x60, 0x6e, 0xfd, 0x60, 0x7f, 0x18, 0xc7, 0x83, 0x04, 0x35, 0x14, 0x1b, 0xfe, 0x71, 0xa3, 0x58, - 0x24, 0x3d, 0x5b, 0x6f, 0xfb, 0xe0, 0x95, 0x50, 0xce, 0x2b, 0xd7, 0x32, 0x3d, 0xd3, 0xb1, 0x83, 0x67, 0xfa, 0xc1, - 0xea, 0x32, 0x01, 0x95, 0xdf, 0x85, 0x89, 0x81, 0x73, 0x24, 0xca, 0x11, 0x19, 0xf1, 0xa2, 0xe8, 0x4b, 0x36, 0x87, - 0x56, 0x58, 0x0d, 0xba, 0xa5, 0xe8, 0xaf, 0x57, 0x76, 0x97, 0xfa, 0xae, 0xcf, 0x5e, 0xe4, 0xf6, 0xe6, 0x63, 0x19, - 0x3a, 0x14, 0x29, 0x25, 0xa7, 0xfe, 0x64, 0x0c, 0x79, 0x7d, 0x3d, 0x75, 0xa6, 0xf8, 0xcf, 0x6c, 0x90, 0xc4, 0x6c, - 0x00, 0x0a, 0x59, 0x34, 0x8f, 0x00, 0x60, 0x49, 0x5f, 0x24, 0x81, 0x37, 0xfc, 0x43, 0xac, 0x59, 0x37, 0x44, 0xcc, - 0x57, 0xfb, 0xe6, 0xe2, 0x32, 0x0b, 0x77, 0x76, 0xec, 0xd1, 0x3d, 0x79, 0x10, 0x95, 0x25, 0x99, 0x4d, 0x67, 0xed, - 0x3d, 0xa4, 0xaf, 0x0c, 0x79, 0x06, 0x99, 0x32, 0x40, 0x02, 0xa6, 0x23, 0xac, 0x33, 0x3c, 0xb9, 0xe6, 0xdc, 0x6a, - 0xb2, 0x50, 0x82, 0x43, 0x74, 0x1c, 0xdd, 0x0a, 0x49, 0xd6, 0xdc, 0x6b, 0xbe, 0xd4, 0x0f, 0x52, 0x4e, 0x3e, 0xad, - 0x98, 0x27, 0x8e, 0xe3, 0x37, 0x24, 0xa2, 0x27, 0x11, 0xe5, 0x69, 0xd7, 0x39, 0xe4, 0xb7, 0xac, 0x54, 0xcc, 0x0c, - 0x54, 0x3d, 0xf2, 0x54, 0x13, 0xac, 0xbb, 0xc5, 0x1d, 0x88, 0xa7, 0x0f, 0x44, 0x13, 0x8a, 0x93, 0xac, 0xf2, 0x5a, - 0x0f, 0xb3, 0xe1, 0x2b, 0x62, 0x73, 0x35, 0xda, 0xec, 0x58, 0xcc, 0xd8, 0x0a, 0x9a, 0x60, 0x40, 0x9d, 0x11, 0x4e, - 0xbb, 0x76, 0xf7, 0x28, 0x30, 0xb2, 0xe9, 0x94, 0x7e, 0x8c, 0xa8, 0xd0, 0x6d, 0xbe, 0x8c, 0x0a, 0x71, 0x54, 0x84, - 0x9e, 0x87, 0xa1, 0x50, 0xfa, 0x69, 0x59, 0x14, 0xf1, 0x59, 0x3f, 0xe7, 0xae, 0xc6, 0x18, 0x53, 0x34, 0x95, 0x65, - 0xd7, 0x15, 0xc8, 0x1b, 0xb1, 0x35, 0x44, 0x80, 0x3c, 0x5f, 0x35, 0xed, 0xea, 0xd7, 0x9b, 0xa8, 0xfc, 0x3b, 0x36, - 0xba, 0x8d, 0x76, 0x13, 0x78, 0x56, 0x9c, 0xb9, 0x2d, 0x80, 0x35, 0x3a, 0xd7, 0x25, 0x71, 0xe4, 0xe8, 0x71, 0xbd, - 0x1f, 0xcc, 0xfe, 0xa4, 0xb5, 0x78, 0x90, 0x6f, 0x91, 0xa9, 0x95, 0x52, 0x17, 0xea, 0xb5, 0x65, 0x1a, 0xcf, 0x07, - 0x99, 0x49, 0xf9, 0x84, 0xd1, 0xf9, 0xd2, 0x4d, 0xf3, 0xc2, 0x66, 0x81, 0xc9, 0x44, 0x25, 0x4e, 0x61, 0x3a, 0xb7, - 0x4b, 0x84, 0xa4, 0x3b, 0x82, 0x53, 0x59, 0x56, 0x14, 0x77, 0xb7, 0xad, 0xd9, 0x37, 0x93, 0xbf, 0x26, 0x3d, 0x1c, - 0xe3, 0x2e, 0xe8, 0xd8, 0x28, 0x6f, 0x26, 0xdb, 0x83, 0xc9, 0xc3, 0xea, 0x42, 0xe9, 0xb4, 0x9a, 0x6e, 0xea, 0x19, - 0xb9, 0xb9, 0x71, 0xea, 0x6a, 0xa2, 0xeb, 0x12, 0x30, 0x9e, 0x8d, 0xe2, 0x1e, 0x5b, 0xe4, 0x1a, 0x79, 0x6d, 0x2d, - 0x41, 0xb7, 0x2c, 0x14, 0x8b, 0xd1, 0xd4, 0xc0, 0x18, 0x61, 0x52, 0x11, 0x83, 0xd7, 0xe7, 0xb0, 0xc9, 0x13, 0x13, - 0xa8, 0xea, 0xdf, 0x94, 0x93, 0x25, 0xbb, 0x98, 0xa5, 0x91, 0x0c, 0xcb, 0x41, 0xd9, 0x7b, 0xa2, 0xa5, 0x8f, 0x78, - 0x2e, 0x70, 0x6d, 0xdb, 0xf6, 0x61, 0x6d, 0x6b, 0xc0, 0xc0, 0xfb, 0xa6, 0x7d, 0x07, 0xc1, 0x15, 0xbb, 0xd5, 0x9c, - 0x67, 0xf0, 0x78, 0xc0, 0xec, 0x5b, 0xf2, 0x7c, 0x5e, 0xa8, 0xb2, 0x7d, 0xa2, 0xb3, 0xfb, 0x02, 0x42, 0x31, 0xbb, - 0xd1, 0xe5, 0xd9, 0x6e, 0xbb, 0x87, 0x0c, 0x59, 0x90, 0xb1, 0x24, 0x29, 0x3c, 0xf2, 0x9d, 0x5e, 0x6d, 0x19, 0x6b, - 0x3e, 0x73, 0x19, 0xb7, 0xa4, 0x16, 0x94, 0x6a, 0x0f, 0x6d, 0x8a, 0xf2, 0x5a, 0x84, 0x49, 0x15, 0xd6, 0x6e, 0xf3, - 0x99, 0xca, 0xd1, 0x16, 0x91, 0x09, 0x1e, 0x17, 0x12, 0x3b, 0x83, 0x25, 0x82, 0x0c, 0x9d, 0x26, 0x68, 0x6a, 0x9f, - 0x44, 0xb3, 0xb8, 0xe6, 0xc1, 0xa8, 0xa6, 0xca, 0xe1, 0x75, 0x13, 0x26, 0xcc, 0xe3, 0x42, 0xda, 0x76, 0xc4, 0x24, - 0x5d, 0xc7, 0xf9, 0x6a, 0x25, 0xeb, 0x51, 0x8e, 0xcc, 0x73, 0xa5, 0xb3, 0x95, 0x2e, 0xe6, 0x41, 0x29, 0xca, 0xcb, - 0x50, 0x20, 0x91, 0x93, 0xad, 0x66, 0x6f, 0x2f, 0x8d, 0xd5, 0x40, 0xa4, 0x57, 0xd6, 0xc7, 0x23, 0x58, 0x4c, 0x17, - 0x29, 0xa5, 0x60, 0x03, 0x85, 0xb0, 0xd1, 0xd8, 0xb3, 0x56, 0xfe, 0xf9, 0xb9, 0xa6, 0x5a, 0xf5, 0x67, 0x84, 0x6d, - 0xf6, 0x8b, 0xf7, 0xe5, 0x58, 0x05, 0x18, 0x75, 0x2f, 0xb2, 0x22, 0x79, 0xab, 0xcb, 0x5b, 0x24, 0x6f, 0xbe, 0xbc, - 0x32, 0x71, 0xc2, 0xf3, 0xb5, 0xd6, 0x86, 0x09, 0x77, 0x6e, 0x55, 0xeb, 0x88, 0x2b, 0x31, 0xd7, 0x7e, 0xdf, 0xa0, - 0x9f, 0x26, 0xa2, 0xec, 0x5f, 0xcd, 0xa8, 0x90, 0x4d, 0x9f, 0x12, 0xaa, 0xcd, 0xbc, 0x8c, 0x90, 0xbb, 0x17, 0x83, - 0x49, 0xa9, 0x4e, 0x5d, 0xdd, 0xe6, 0xe3, 0x8b, 0x31, 0xb1, 0x7e, 0xf9, 0xd7, 0xb8, 0x38, 0x5f, 0x30, 0x1c, 0xba, - 0xe2, 0xce, 0x7b, 0xd6, 0x0a, 0xe5, 0x0a, 0x73, 0xc0, 0x39, 0x5a, 0xaa, 0x2a, 0x63, 0xd4, 0xb6, 0xea, 0xdc, 0x01, - 0x8f, 0x23, 0x08, 0xfc, 0x8e, 0xae, 0x1a, 0x49, 0x46, 0xa9, 0xef, 0xea, 0x18, 0xfc, 0x65, 0xa4, 0xf1, 0xe1, 0xf7, - 0x05, 0x11, 0xf4, 0xd2, 0x55, 0xe5, 0xda, 0xa3, 0x2a, 0xa2, 0xac, 0x82, 0x24, 0xe6, 0x64, 0xb9, 0x0b, 0x47, 0xb9, - 0xf1, 0xe7, 0x93, 0x5d, 0xad, 0x0d, 0x42, 0xcc, 0x62, 0xcc, 0xd9, 0x52, 0xcc, 0x59, 0x11, 0xbe, 0x7d, 0x1e, 0xfd, - 0xce, 0x55, 0x25, 0x10, 0xf9, 0x68, 0xe3, 0x51, 0x7c, 0xf9, 0x22, 0xe0, 0x69, 0x55, 0x7d, 0x20, 0x24, 0xbe, 0xb3, - 0xd3, 0x2e, 0xf9, 0x6b, 0x7f, 0xa6, 0x44, 0x32, 0x69, 0x89, 0x21, 0x70, 0x47, 0xfc, 0xce, 0x75, 0x03, 0x19, 0x80, - 0x9c, 0xd1, 0xae, 0x01, 0x73, 0x12, 0x4d, 0x43, 0x42, 0xd5, 0xb4, 0x96, 0x77, 0xf3, 0x0a, 0x7d, 0x22, 0x89, 0x7e, - 0x97, 0x37, 0xc3, 0xaf, 0xb4, 0x48, 0xe5, 0x9c, 0xbf, 0xef, 0xe2, 0x57, 0x75, 0x64, 0xe7, 0x4c, 0x63, 0xa5, 0xc0, - 0x97, 0x01, 0xb8, 0x81, 0x76, 0xc5, 0x8d, 0x38, 0xce, 0x92, 0x1e, 0xd9, 0x19, 0x3d, 0x50, 0xdb, 0x57, 0xb2, 0x68, - 0x29, 0x5e, 0x98, 0xa6, 0x10, 0xca, 0xe0, 0x22, 0x3e, 0x91, 0xb9, 0xa8, 0xb2, 0xe6, 0x55, 0x5f, 0xe0, 0x36, 0x22, - 0x66, 0x44, 0x79, 0x22, 0x92, 0x9c, 0x95, 0xba, 0xa1, 0xc1, 0xe2, 0xe8, 0xd2, 0x62, 0x4d, 0x4e, 0x90, 0xcc, 0x97, - 0x88, 0xe0, 0x5f, 0x2e, 0xd5, 0xb3, 0xfb, 0x9b, 0xb5, 0x67, 0x85, 0xb6, 0x46, 0x60, 0xb2, 0x8b, 0x5e, 0xbd, 0xe8, - 0x35, 0xb7, 0x86, 0xf2, 0x21, 0x51, 0xc8, 0xef, 0x49, 0xdd, 0x1a, 0xd6, 0x4c, 0x52, 0x30, 0xdf, 0x17, 0xb5, 0x45, - 0xeb, 0xce, 0xb1, 0x97, 0x3f, 0xea, 0x71, 0xf7, 0x54, 0x82, 0x82, 0xd0, 0x6d, 0x26, 0xb5, 0x40, 0x24, 0x59, 0x63, - 0x8b, 0x7d, 0x22, 0x7a, 0xc7, 0x74, 0xa5, 0x74, 0x71, 0x64, 0xfb, 0xe5, 0x1d, 0x32, 0x93, 0x9c, 0x5d, 0x2a, 0x31, - 0xe5, 0x3f, 0x47, 0xd9, 0xe4, 0x62, 0x67, 0x8b, 0x3e, 0x73, 0x90, 0x36, 0x53, 0x13, 0x61, 0x0a, 0xf6, 0xce, 0xcc, - 0x46, 0x08, 0x8f, 0x24, 0x93, 0xc2, 0x28, 0xb1, 0x97, 0x7c, 0x8a, 0xa7, 0x90, 0xdf, 0x2a, 0x34, 0xb4, 0xe4, 0x99, - 0xfe, 0x07, 0xeb, 0x08, 0xdf, 0x4a, 0xe0, 0x20, 0xc9, 0x3f, 0x60, 0xc1, 0x6d, 0xe9, 0x7a, 0xc7, 0x6c, 0x90, 0x84, - 0xfb, 0x67, 0x96, 0xcf, 0x76, 0x7b, 0x10, 0xbf, 0x29, 0x12, 0x82, 0x2f, 0x3a, 0xaa, 0x5d, 0xb2, 0x8c, 0x4a, 0xaa, - 0x45, 0xe5, 0x7e, 0x7c, 0xcc, 0xcb, 0x23, 0x2a, 0x2f, 0xe0, 0x97, 0xef, 0xd6, 0x1c, 0x98, 0x81, 0xaf, 0xb4, 0xd5, - 0x44, 0xc2, 0x5e, 0x18, 0xec, 0x29, 0x94, 0x2c, 0xe2, 0xc0, 0x6e, 0x36, 0xc4, 0x5c, 0xe8, 0x5a, 0x9b, 0xed, 0xc3, - 0x18, 0x6a, 0x75, 0xca, 0xf4, 0x26, 0xae, 0x6a, 0x84, 0xb9, 0x4d, 0x23, 0x8e, 0x4a, 0x66, 0xda, 0x97, 0x1b, 0x4c, - 0xd3, 0x21, 0x7b, 0x1b, 0x68, 0x2d, 0xdf, 0x1c, 0xeb, 0xca, 0x9b, 0x69, 0x8f, 0x42, 0xc0, 0x18, 0xb1, 0xe6, 0x8a, - 0x5e, 0x6b, 0x65, 0x3f, 0x48, 0xb1, 0x3f, 0xaa, 0x05, 0x22, 0xaa, 0x22, 0xa9, 0xd9, 0xb0, 0xcb, 0x5e, 0xad, 0xbd, - 0xac, 0x0b, 0xb0, 0x74, 0x6a, 0x39, 0xd6, 0xbc, 0x60, 0x30, 0x94, 0xa9, 0x5a, 0x2d, 0x73, 0x87, 0xab, 0xec, 0xa9, - 0x96, 0x97, 0xb2, 0x20, 0x61, 0x2f, 0x81, 0xe8, 0xc4, 0xf7, 0x74, 0x4f, 0x22, 0xdf, 0x99, 0xd3, 0x37, 0x66, 0x32, - 0xc4, 0xe8, 0xac, 0x58, 0x81, 0x55, 0xbd, 0x0d, 0x0c, 0x15, 0xb5, 0xc6, 0x86, 0xee, 0xf2, 0x98, 0x7d, 0x8e, 0xc3, - 0x7d, 0x61, 0xbf, 0x2d, 0xc8, 0x7d, 0xf8, 0xef, 0x59, 0x7e, 0xdb, 0xd8, 0x2c, 0xcc, 0xb2, 0xde, 0x3c, 0x46, 0x8e, - 0xf0, 0x7a, 0x4b, 0xa5, 0xca, 0x16, 0x0c, 0xd9, 0x6b, 0x58, 0xf7, 0xab, 0x99, 0xba, 0x90, 0x6e, 0x62, 0x46, 0x8c, - 0xda, 0x9d, 0x48, 0x12, 0xf4, 0x14, 0x33, 0x28, 0xa1, 0x79, 0x91, 0xd6, 0x66, 0x23, 0xf7, 0x60, 0x9d, 0x8e, 0x4c, - 0x44, 0x97, 0x60, 0x8a, 0x73, 0x36, 0xdf, 0xdf, 0x61, 0xc8, 0x61, 0x8f, 0x25, 0xaa, 0xe4, 0x41, 0xbd, 0x6f, 0x65, - 0xa5, 0xa6, 0xd8, 0x74, 0x2c, 0x23, 0x2e, 0x37, 0x80, 0x83, 0x1d, 0x6d, 0xa7, 0x86, 0x39, 0xb5, 0x73, 0x09, 0x76, - 0x72, 0x53, 0x7b, 0xb7, 0x22, 0x03, 0x4b, 0x1e, 0x08, 0x55, 0x18, 0xf0, 0x69, 0x5f, 0x11, 0x00, 0x9a, 0xe3, 0x14, - 0x89, 0x3f, 0x8c, 0xe4, 0xef, 0x77, 0x24, 0x9d, 0x84, 0xe3, 0x6e, 0x24, 0x70, 0x7a, 0x1c, 0xc0, 0x28, 0xf5, 0x64, - 0xf3, 0x03, 0x10, 0xe5, 0x22, 0x7f, 0x95, 0x18, 0x1d, 0x31, 0x44, 0x38, 0xf0, 0x53, 0x71, 0x21, 0x6d, 0xbd, 0x59, - 0x2e, 0x8e, 0x46, 0x41, 0xd7, 0xd5, 0x01, 0xf7, 0x91, 0x0a, 0x00, 0x6d, 0x36, 0xe4, 0xba, 0xbe, 0x77, 0x88, 0xd8, - 0x7d, 0x5a, 0xb8, 0x41, 0x04, 0x7e, 0x5c, 0xa6, 0xe6, 0x5b, 0x38, 0x5c, 0xd3, 0x4c, 0xbd, 0x95, 0xc7, 0xd3, 0x7d, - 0xdd, 0xed, 0x0c, 0xf0, 0x2f, 0x97, 0x38, 0x60, 0xfe, 0x3b, 0xa9, 0xe2, 0x60, 0xc4, 0x1c, 0x1d, 0xe3, 0x92, 0x66, - 0x66, 0x6a, 0xc8, 0x73, 0x73, 0xe5, 0x29, 0xca, 0x81, 0xcc, 0x27, 0xd3, 0x43, 0x76, 0x13, 0xf8, 0x35, 0x40, 0x5d, - 0x3c, 0x24, 0x54, 0x80, 0x7a, 0x82, 0xc0, 0xd5, 0x04, 0xc2, 0xb2, 0xf9, 0x73, 0x6c, 0xee, 0x99, 0x68, 0x02, 0x1a, - 0x3a, 0x50, 0xe9, 0xf4, 0xa4, 0x2c, 0x80, 0x7a, 0xa8, 0xfd, 0x10, 0x09, 0x0f, 0x7a, 0xd9, 0x74, 0xd0, 0xb8, 0x8e, - 0x46, 0x48, 0x9a, 0x50, 0x90, 0xb8, 0xc0, 0x29, 0xfa, 0x6a, 0xc9, 0xfc, 0x55, 0x22, 0xdf, 0xa8, 0x72, 0xd1, 0xe0, - 0x5f, 0xa2, 0x45, 0x56, 0xcf, 0x18, 0x99, 0x1d, 0x6d, 0xca, 0x4a, 0x65, 0xbc, 0x00, 0xf0, 0xe1, 0x10, 0x1c, 0x49, - 0x44, 0x2c, 0x93, 0x68, 0x22, 0x1b, 0x87, 0xf2, 0xa7, 0x97, 0x77, 0x0a, 0xe0, 0x7a, 0x1e, 0x09, 0x9a, 0x08, 0x7c, - 0x6c, 0x09, 0x38, 0x33, 0x83, 0x00, 0x67, 0xab, 0x4d, 0x23, 0x30, 0x11, 0x5a, 0x79, 0x6a, 0xd8, 0xc7, 0x48, 0x94, - 0xe3, 0x12, 0x61, 0xe4, 0x76, 0x4d, 0x19, 0xb9, 0x44, 0x24, 0x36, 0xe6, 0xc8, 0x73, 0xfd, 0x51, 0x0a, 0xfd, 0xcb, - 0x2c, 0x7c, 0x52, 0xa2, 0xfa, 0xd2, 0xa0, 0x78, 0xd3, 0xc6, 0x07, 0x3b, 0x18, 0xd7, 0x52, 0xcb, 0x61, 0xc2, 0x60, - 0xbe, 0xf6, 0xff, 0xc6, 0xd7, 0x4a, 0xf5, 0x95, 0xf3, 0x11, 0x5d, 0xf1, 0x18, 0x1c, 0xd6, 0x89, 0x9c, 0x5f, 0x37, - 0x4d, 0xe4, 0xf8, 0x73, 0x79, 0xb7, 0x37, 0x9e, 0xee, 0x36, 0x82, 0xca, 0xa5, 0x34, 0x67, 0x9e, 0x11, 0x7d, 0x18, - 0x58, 0xbe, 0x58, 0xa3, 0xca, 0x34, 0xbe, 0x74, 0x40, 0xb9, 0xe2, 0xf0, 0xf4, 0x24, 0x10, 0x2f, 0x07, 0x7b, 0x8a, - 0x03, 0x62, 0x45, 0x89, 0xb2, 0x67, 0x2a, 0x22, 0x8d, 0x43, 0x60, 0xbd, 0x11, 0x19, 0x19, 0x02, 0x52, 0x86, 0xed, - 0x9a, 0xf5, 0xaf, 0x58, 0x51, 0x7c, 0x0e, 0xc9, 0x26, 0xcb, 0x66, 0x7c, 0x8a, 0x1d, 0x8d, 0x57, 0x22, 0xa9, 0x68, - 0xd9, 0xf4, 0xa7, 0x6d, 0x47, 0xf6, 0x5e, 0x82, 0x43, 0xe2, 0x00, 0xa7, 0xf4, 0xce, 0x9f, 0xcb, 0x3b, 0xab, 0x23, - 0xdf, 0x83, 0xfe, 0x95, 0x97, 0xfc, 0x95, 0xef, 0xc1, 0x9e, 0xf2, 0x92, 0xa7, 0x7c, 0x0f, 0xf8, 0x94, 0x17, 0x89, - 0xe2, 0x34, 0x7d, 0xe5, 0x70, 0x1e, 0x8c, 0x11, 0x43, 0xb9, 0x3c, 0x91, 0xad, 0xe4, 0xe0, 0x17, 0xef, 0x13, 0xee, - 0xb3, 0x81, 0x94, 0x3c, 0x66, 0xa6, 0x58, 0x89, 0x4a, 0x56, 0x96, 0x49, 0x01, 0x7c, 0xea, 0xdb, 0xc5, 0x99, 0xed, - 0x17, 0xfc, 0xe1, 0x97, 0x48, 0x1a, 0x03, 0x71, 0xa7, 0x04, 0x5d, 0xbb, 0xd3, 0xd7, 0x9e, 0xdb, 0x8a, 0x08, 0xca, - 0x72, 0xc4, 0xe8, 0x44, 0xa5, 0x1d, 0x67, 0x89, 0xde, 0xbd, 0x55, 0x18, 0x08, 0xfa, 0x76, 0xa1, 0x8f, 0xc8, 0x61, - 0xfd, 0xfd, 0x17, 0x20, 0x64, 0x5c, 0x12, 0x88, 0xc0, 0x3e, 0xf6, 0xea, 0x39, 0xd4, 0xda, 0xf3, 0xa4, 0x8a, 0x06, - 0x5c, 0x93, 0x83, 0x71, 0x8b, 0x90, 0xa4, 0xa7, 0xff, 0x88, 0x1f, 0x92, 0xb3, 0x74, 0xd1, 0x3c, 0x0b, 0xf7, 0x18, - 0x2d, 0x07, 0x34, 0x27, 0x41, 0xd5, 0xcc, 0x72, 0x45, 0x34, 0x9a, 0xd3, 0x9e, 0x79, 0xe0, 0x64, 0xa9, 0xb6, 0xae, - 0xc2, 0x9d, 0xf7, 0xf8, 0x19, 0x9f, 0xd1, 0x71, 0x9a, 0x1e, 0x19, 0xb0, 0x2f, 0x72, 0x7a, 0x1f, 0x5c, 0xe1, 0x58, - 0x6b, 0x30, 0x3d, 0x91, 0x6c, 0x2d, 0xae, 0xaf, 0xc6, 0xf8, 0x82, 0xb4, 0xca, 0xfb, 0x52, 0x44, 0xc3, 0x4f, 0xc9, - 0xc4, 0x66, 0xa4, 0xa5, 0x21, 0x5f, 0x5b, 0x6a, 0xb4, 0x59, 0xb1, 0x04, 0x4b, 0x6e, 0xbf, 0x75, 0x85, 0x4d, 0xdf, - 0x64, 0x2e, 0x92, 0x6c, 0x54, 0xdd, 0x14, 0x69, 0x53, 0xe0, 0x53, 0x92, 0x15, 0xc1, 0x23, 0x50, 0x64, 0xee, 0x48, - 0x72, 0xbc, 0x74, 0xd4, 0x72, 0xaa, 0x4a, 0x88, 0xc2, 0x67, 0x15, 0x56, 0xb5, 0x14, 0x1d, 0x2f, 0x0e, 0x44, 0x08, - 0x39, 0x8c, 0x4b, 0xa7, 0xa6, 0xd1, 0x75, 0xad, 0xf6, 0x16, 0xf2, 0x1c, 0x7c, 0xf9, 0x69, 0x88, 0x25, 0x2c, 0x59, - 0x8d, 0x31, 0xe0, 0xcc, 0xb3, 0x1b, 0x7a, 0xe4, 0xb9, 0xbc, 0x1f, 0x80, 0xa3, 0x17, 0xbb, 0x16, 0x8a, 0xb9, 0xeb, - 0x33, 0x12, 0x09, 0x24, 0x32, 0x5f, 0x00, 0x70, 0x00, 0xc0, 0x55, 0x2f, 0xab, 0x3a, 0x80, 0x41, 0x2b, 0x55, 0xa0, - 0x67, 0x0a, 0x6e, 0x81, 0xcc, 0xd0, 0x72, 0x50, 0xf9, 0x23, 0x0a, 0x7c, 0xed, 0x90, 0x2c, 0x26, 0xb2, 0x34, 0x94, - 0xac, 0x63, 0x42, 0x3b, 0x1f, 0xc6, 0xd3, 0x4b, 0x14, 0xee, 0x22, 0xa5, 0xa3, 0xb6, 0xe8, 0xa7, 0x67, 0x8f, 0x7a, - 0x5a, 0x38, 0x2d, 0x22, 0x2f, 0xc7, 0xc6, 0xbf, 0xe5, 0xed, 0xba, 0x5c, 0x7f, 0x64, 0x2b, 0x9a, 0x82, 0x36, 0x04, - 0x9f, 0x3d, 0x5b, 0xf5, 0x8c, 0xbe, 0x42, 0x4e, 0x8b, 0xe5, 0xd0, 0xeb, 0xb7, 0x59, 0x6d, 0x0e, 0x1f, 0x9e, 0xd1, - 0x03, 0xd1, 0xa5, 0xbb, 0xd7, 0x48, 0xa0, 0xb9, 0x44, 0xb0, 0x18, 0x9e, 0xe3, 0xd2, 0x6e, 0x72, 0x28, 0x29, 0x0a, - 0x62, 0x15, 0xf8, 0x80, 0xde, 0xde, 0xc1, 0x90, 0xc1, 0xae, 0xdb, 0x18, 0xc0, 0xd5, 0x40, 0xf3, 0xac, 0xc5, 0x61, - 0xaf, 0x4f, 0xc0, 0xc6, 0xd2, 0xf9, 0x6a, 0xdb, 0x45, 0xb1, 0xd7, 0x5c, 0x91, 0xee, 0xda, 0x0a, 0x81, 0x3f, 0x17, - 0x9f, 0xfc, 0xed, 0x79, 0xd1, 0xfe, 0xd6, 0x7f, 0x29, 0xbd, 0x77, 0xaa, 0xf6, 0x7b, 0xa3, 0x01, 0xf5, 0xc7, 0xa9, - 0x65, 0xa9, 0x2c, 0x87, 0x59, 0xe9, 0xf9, 0x68, 0x54, 0x8b, 0xdb, 0x6b, 0x8a, 0x88, 0x8f, 0x92, 0xe0, 0x66, 0x53, - 0x2b, 0x0f, 0xee, 0x9d, 0xed, 0x85, 0xbe, 0x87, 0x81, 0xea, 0x5e, 0x0b, 0x4d, 0x77, 0x2e, 0x25, 0xa8, 0xc9, 0xc8, - 0x68, 0xa6, 0xd9, 0x98, 0xb7, 0xbe, 0xf9, 0x61, 0xaa, 0x5f, 0xd0, 0xa7, 0x52, 0x72, 0x20, 0x3b, 0xab, 0x8b, 0x52, - 0xb1, 0x2a, 0x09, 0xc1, 0xe2, 0xfa, 0xbb, 0x38, 0x24, 0x30, 0x70, 0xad, 0xba, 0x0c, 0x18, 0x89, 0x7d, 0xb1, 0xf8, - 0xa8, 0xe8, 0xf8, 0xad, 0x1d, 0x64, 0x70, 0xb3, 0xcb, 0xbc, 0x0c, 0x33, 0xfc, 0x20, 0xac, 0xd3, 0x9a, 0x82, 0x40, - 0x4d, 0x9d, 0xbc, 0x4a, 0x82, 0x62, 0xf9, 0x66, 0x4f, 0x1b, 0x7b, 0x61, 0x6c, 0x03, 0xe8, 0xd9, 0xa6, 0x91, 0x18, - 0x4c, 0xfc, 0x93, 0x63, 0xf7, 0x57, 0xa1, 0xd2, 0xaa, 0x6b, 0x51, 0x7b, 0x51, 0x1e, 0x84, 0x0e, 0xa1, 0x43, 0x51, - 0x2b, 0xb7, 0x75, 0x58, 0x9f, 0xd7, 0xb2, 0x3c, 0xe9, 0x9f, 0x78, 0xbb, 0x48, 0xd7, 0xc5, 0x1d, 0x0c, 0x35, 0x12, - 0xc8, 0x8e, 0x2a, 0x36, 0x69, 0xdc, 0x51, 0xa9, 0xb2, 0xdc, 0x7d, 0xd8, 0xa0, 0x5e, 0x5b, 0x44, 0x90, 0xa9, 0x3e, - 0xae, 0x08, 0x35, 0x86, 0x3d, 0xa1, 0x34, 0x05, 0x4c, 0x65, 0x95, 0xc5, 0x53, 0x73, 0x77, 0x7e, 0xc8, 0x99, 0xd2, - 0x70, 0xc0, 0xc7, 0xb0, 0x98, 0x0d, 0xfc, 0xfb, 0x21, 0xd2, 0xc0, 0x4d, 0xad, 0x67, 0xa1, 0x4c, 0x20, 0xad, 0x50, - 0xcc, 0x47, 0x32, 0x0a, 0x13, 0x7c, 0xcf, 0x19, 0x14, 0x39, 0x29, 0xd9, 0x68, 0xfc, 0x66, 0xdd, 0x63, 0xe8, 0x38, - 0x33, 0x3e, 0xcc, 0xd3, 0x15, 0x7b, 0xa5, 0xc0, 0xd5, 0x21, 0x14, 0x5c, 0x8e, 0xa3, 0x1a, 0xd7, 0x05, 0xd9, 0x40, - 0x49, 0x5e, 0x78, 0x8f, 0x24, 0xa4, 0x2e, 0xf4, 0x94, 0x6a, 0x47, 0x21, 0x19, 0x96, 0x60, 0x7a, 0xdc, 0x9d, 0xb1, - 0x8d, 0x2b, 0x69, 0xdb, 0xd9, 0x69, 0xa1, 0x6e, 0xcf, 0xc0, 0x83, 0x5d, 0xd5, 0x3b, 0x28, 0x47, 0x56, 0x06, 0x1a, - 0x8c, 0x80, 0xb6, 0x2c, 0x49, 0xaa, 0x89, 0xd8, 0x68, 0x14, 0x46, 0x0d, 0xa5, 0xb5, 0x92, 0x9d, 0x9c, 0xdf, 0xeb, - 0xaa, 0x98, 0x26, 0xeb, 0x50, 0x1c, 0xf4, 0xc4, 0x24, 0xa5, 0x79, 0x5d, 0xb6, 0x78, 0x7f, 0xa0, 0xf6, 0x8b, 0x54, - 0x7b, 0x62, 0x6f, 0x6e, 0x24, 0x4a, 0xb3, 0xef, 0x29, 0x94, 0x87, 0x46, 0xe7, 0xb5, 0xd1, 0x79, 0x79, 0x1d, 0xa5, - 0xff, 0x9b, 0xa8, 0x65, 0xca, 0xc6, 0x98, 0xa2, 0x0e, 0x68, 0x3e, 0x31, 0x82, 0xf6, 0xfd, 0x4b, 0xa1, 0x8e, 0x50, - 0x34, 0x4c, 0x3d, 0xce, 0xb0, 0x18, 0xe9, 0x06, 0xcf, 0x97, 0x84, 0x04, 0xf7, 0xee, 0xc0, 0xc0, 0x23, 0xc2, 0x3c, - 0x91, 0x31, 0x9d, 0x20, 0x0c, 0x51, 0x59, 0x27, 0x67, 0xde, 0xe7, 0xe6, 0xdf, 0x6e, 0x4a, 0xdb, 0x6e, 0xfa, 0x0d, - 0x26, 0xe7, 0xfd, 0x94, 0xde, 0x7b, 0x79, 0xb4, 0x69, 0x7f, 0x31, 0xb2, 0x5b, 0xf0, 0xc2, 0xe2, 0x3d, 0x16, 0xf6, - 0x2f, 0x65, 0x3e, 0x73, 0xac, 0xf4, 0x36, 0x63, 0x20, 0x83, 0x67, 0xd6, 0x58, 0xfe, 0x4a, 0xd0, 0x8e, 0x42, 0xa0, - 0x9d, 0xd8, 0x09, 0x59, 0x05, 0x09, 0x88, 0xc4, 0x58, 0xdb, 0xce, 0xc1, 0x40, 0x3b, 0xd6, 0x99, 0x5b, 0xb4, 0xf4, - 0xdd, 0x53, 0x4e, 0x4a, 0x00, 0xca, 0x4b, 0xe5, 0x9f, 0x5d, 0x9c, 0x1a, 0xfb, 0x38, 0xc1, 0xd8, 0x0a, 0xec, 0x43, - 0x02, 0xa9, 0x2a, 0x26, 0x74, 0x9a, 0x22, 0xa0, 0x8b, 0x63, 0x13, 0x7f, 0x6e, 0xdc, 0x9d, 0xc1, 0xea, 0x69, 0xbe, - 0x64, 0x9b, 0xdd, 0x4b, 0x8c, 0xa9, 0xcd, 0x3a, 0xdb, 0x16, 0xf3, 0x8c, 0xdc, 0x95, 0xc5, 0xda, 0x04, 0x52, 0xb6, - 0xe4, 0xca, 0xb5, 0x45, 0xc8, 0x84, 0x21, 0xeb, 0x1a, 0x42, 0x52, 0x20, 0xf8, 0x2d, 0x25, 0x81, 0xd5, 0xfb, 0xa5, - 0xae, 0xd4, 0xb3, 0x88, 0x76, 0x99, 0xa0, 0x1d, 0x1c, 0x39, 0xd2, 0x79, 0xe1, 0xff, 0xb7, 0x12, 0x42, 0x38, 0xd3, - 0x86, 0x6e, 0x4b, 0x68, 0x92, 0xe2, 0xe8, 0x2a, 0x5a, 0x40, 0xbe, 0xeb, 0xf5, 0x2f, 0x8d, 0xcd, 0xfb, 0x0e, 0x9e, - 0x0d, 0x22, 0x81, 0x8d, 0xa8, 0xa9, 0x51, 0x0d, 0xab, 0xad, 0x6e, 0xda, 0x6e, 0x1e, 0xdd, 0xde, 0xc8, 0xc7, 0x50, - 0xe1, 0xe8, 0xe7, 0x40, 0x89, 0xe3, 0xde, 0x34, 0xa5, 0x4d, 0x54, 0xfe, 0x17, 0xaa, 0x05, 0x4e, 0xe1, 0x93, 0x1b, - 0x9c, 0x0a, 0x4e, 0xbb, 0xa7, 0x86, 0xe2, 0x7e, 0xbf, 0x54, 0xd1, 0xf5, 0x71, 0x73, 0x95, 0x01, 0x9a, 0xf0, 0x08, - 0x72, 0x39, 0xf2, 0xfd, 0xbc, 0xae, 0xfc, 0x22, 0xbf, 0xf4, 0xed, 0x6b, 0x47, 0xd8, 0x42, 0x8d, 0xb4, 0xd0, 0xe3, - 0x24, 0xbf, 0x2c, 0x6f, 0x92, 0xee, 0x90, 0x81, 0xeb, 0x2f, 0x6b, 0xec, 0x1d, 0xaa, 0xf2, 0xd8, 0x6d, 0x8f, 0x14, - 0x08, 0xd3, 0x49, 0x97, 0xca, 0x5d, 0x29, 0x25, 0x62, 0xd4, 0x86, 0xb3, 0x4e, 0xd5, 0xa2, 0xb6, 0xb0, 0x9e, 0x2d, - 0x74, 0x93, 0x0a, 0x08, 0xd5, 0xf7, 0x94, 0x87, 0x63, 0x60, 0xd8, 0x3b, 0x5f, 0x1e, 0x27, 0x0b, 0xe7, 0x53, 0x5d, - 0x2b, 0xe7, 0xa9, 0xb6, 0xeb, 0xbe, 0xce, 0x50, 0x60, 0x6c, 0xe9, 0x1d, 0xbb, 0x0c, 0xe7, 0xb7, 0xea, 0x0a, 0x4f, - 0x96, 0x11, 0x3c, 0x4b, 0x7d, 0x42, 0xf0, 0x55, 0xf2, 0x48, 0xe1, 0xc1, 0xd1, 0xcd, 0x59, 0x40, 0x07, 0xd3, 0x49, - 0xe0, 0xc1, 0xf1, 0xb6, 0x56, 0xc9, 0xfa, 0xe0, 0xe5, 0x98, 0x10, 0x06, 0x94, 0xac, 0x0f, 0xb6, 0xdd, 0x58, 0xb9, - 0x44, 0xe3, 0xf5, 0x23, 0x0b, 0x2d, 0xba, 0x7e, 0xd0, 0xa6, 0xe7, 0x01, 0x53, 0x39, 0xaa, 0xae, 0xe7, 0x29, 0x67, - 0x87, 0x98, 0x27, 0x8c, 0x74, 0x62, 0xd0, 0xc8, 0x0e, 0x98, 0x47, 0xa9, 0xf9, 0xa9, 0x75, 0x9b, 0x6f, 0xf6, 0xe1, - 0x33, 0x61, 0xac, 0xd5, 0x46, 0x91, 0xcf, 0x53, 0x68, 0xcf, 0x8e, 0xbc, 0xdf, 0xa8, 0x21, 0x23, 0x6b, 0xd3, 0x15, - 0x90, 0x8c, 0x05, 0x7f, 0x36, 0x43, 0x58, 0xd4, 0x4a, 0xc6, 0x69, 0x62, 0x9f, 0x4d, 0x37, 0x91, 0xae, 0xf2, 0x55, - 0x04, 0x78, 0xbf, 0xe1, 0x4c, 0x9a, 0xc7, 0x96, 0x5b, 0x8c, 0x98, 0xbc, 0xd4, 0x84, 0xda, 0xa2, 0x89, 0x28, 0x01, - 0xa0, 0xd7, 0xc3, 0x3e, 0x02, 0x95, 0xbe, 0x43, 0x38, 0x37, 0x4f, 0x6c, 0x69, 0x93, 0x9a, 0x0b, 0x0a, 0xc3, 0x1d, - 0x3b, 0xd9, 0x8b, 0x4d, 0x26, 0xf6, 0x0c, 0xe6, 0xa1, 0xc5, 0x5a, 0x76, 0xf3, 0x47, 0xb1, 0xe3, 0x07, 0x34, 0x90, - 0xf9, 0x01, 0x0b, 0x92, 0x3f, 0x96, 0x0e, 0x71, 0x2e, 0x04, 0xc5, 0x43, 0x5a, 0xc9, 0x22, 0x16, 0xa4, 0xdb, 0xf1, - 0x22, 0xce, 0x65, 0x4e, 0x6e, 0x01, 0x41, 0x75, 0x20, 0x16, 0xb2, 0xdc, 0x40, 0x1a, 0x6f, 0x70, 0xe1, 0xbc, 0xc9, - 0x89, 0x24, 0xb0, 0xf5, 0x4c, 0x24, 0x93, 0x45, 0x39, 0x16, 0x81, 0xdf, 0x7c, 0xec, 0xfe, 0x66, 0x3e, 0x36, 0x1b, - 0x7b, 0xda, 0x2c, 0xdf, 0x2c, 0xc2, 0xcc, 0xda, 0xaa, 0xc2, 0x84, 0x25, 0x92, 0x71, 0xc2, 0x5b, 0x7b, 0xf8, 0xca, - 0xad, 0xe1, 0x33, 0xf8, 0xdd, 0xcc, 0x16, 0x73, 0x69, 0x3b, 0x5b, 0x24, 0xe9, 0x20, 0x4c, 0x37, 0xe1, 0x1f, 0x62, - 0x64, 0xba, 0xd8, 0xac, 0xe8, 0x47, 0x83, 0x44, 0xf1, 0x76, 0xe3, 0xe5, 0xe1, 0xb7, 0x08, 0x0e, 0x76, 0x0b, 0xb2, - 0xb9, 0xfb, 0x72, 0xa4, 0xe2, 0x21, 0x2b, 0xaa, 0x1a, 0x63, 0x84, 0x52, 0x88, 0x63, 0x88, 0xba, 0xdc, 0xbe, 0x6a, - 0xcb, 0x43, 0xba, 0xfa, 0x5a, 0x64, 0x14, 0xde, 0xca, 0x7f, 0x63, 0xbe, 0xe3, 0x9f, 0x31, 0x95, 0xd4, 0x79, 0x0e, - 0xf0, 0xb5, 0xdf, 0xc1, 0x20, 0x21, 0x2a, 0x22, 0x7f, 0x2d, 0x11, 0x20, 0x66, 0xbd, 0xc4, 0x00, 0xee, 0xbc, 0xba, - 0x95, 0x93, 0x90, 0xbe, 0x60, 0xe8, 0x6d, 0x8b, 0x85, 0x79, 0x3c, 0x92, 0x7c, 0x87, 0xb1, 0x88, 0x9d, 0xf5, 0xc1, - 0x8c, 0x9d, 0xba, 0xe6, 0xc3, 0x74, 0xf6, 0x1f, 0x23, 0x2c, 0x70, 0x04, 0x43, 0xad, 0x85, 0x9f, 0xae, 0x02, 0xb8, - 0xd3, 0x7f, 0x08, 0x52, 0xe0, 0x36, 0x7a, 0xe2, 0x67, 0xba, 0x17, 0xd8, 0x04, 0xa7, 0x62, 0xaf, 0x88, 0xed, 0x39, - 0xd0, 0xab, 0x55, 0x0d, 0xa5, 0xbb, 0x73, 0x3a, 0x08, 0x53, 0x2c, 0x0a, 0x63, 0xbd, 0x8e, 0x12, 0x9b, 0x55, 0xcb, - 0x69, 0xc2, 0x90, 0xed, 0x2a, 0xd4, 0x9e, 0xe4, 0xc2, 0xa2, 0x84, 0x23, 0x37, 0x89, 0x37, 0xd5, 0x3a, 0xa0, 0x7e, - 0xeb, 0xd7, 0x26, 0xb8, 0xf5, 0x82, 0xa5, 0x63, 0x41, 0xa1, 0xa5, 0x88, 0xc1, 0x23, 0x44, 0x06, 0xaf, 0xcb, 0x15, - 0xe2, 0xf4, 0x22, 0xfd, 0xbe, 0x75, 0x57, 0x4a, 0x4b, 0x77, 0xb3, 0x88, 0xd9, 0xcf, 0xe9, 0xaf, 0x86, 0x97, 0xd7, - 0x9c, 0x91, 0x71, 0xd1, 0xb4, 0xe8, 0xa9, 0xd7, 0xb8, 0xdc, 0x80, 0xd9, 0x43, 0xab, 0x63, 0x86, 0xfd, 0x33, 0x2d, - 0x2d, 0xc6, 0xf8, 0x9d, 0x28, 0xa6, 0xdd, 0xef, 0x3e, 0x75, 0xe2, 0x9e, 0x5e, 0xe8, 0xa0, 0xf7, 0x96, 0x78, 0xdb, - 0xe9, 0x9d, 0xae, 0x3e, 0x9b, 0x8e, 0x41, 0xf4, 0x8d, 0x32, 0x7d, 0x37, 0x0b, 0x5d, 0x2e, 0x63, 0xd6, 0x68, 0x93, - 0xf6, 0xe5, 0x72, 0xfa, 0xa5, 0x97, 0xb9, 0xf1, 0x6f, 0xe1, 0x7a, 0x32, 0x24, 0x92, 0x96, 0x2a, 0x95, 0x2a, 0x9c, - 0x74, 0x81, 0xc4, 0x9a, 0x89, 0x5a, 0xae, 0x51, 0x67, 0x1c, 0x0f, 0x97, 0x0e, 0xcb, 0xef, 0x9b, 0x0f, 0x2a, 0xbd, - 0x7c, 0x1f, 0x88, 0x7d, 0x76, 0x25, 0x19, 0x50, 0x4e, 0xe1, 0x8c, 0xec, 0xfe, 0x73, 0x58, 0xed, 0x0a, 0xa0, 0x66, - 0x18, 0xbd, 0x5c, 0x1a, 0x76, 0x50, 0x94, 0x7e, 0x3a, 0xe9, 0xa6, 0x20, 0xac, 0xaf, 0xce, 0xc2, 0xeb, 0x5a, 0x92, - 0xe8, 0x12, 0x7f, 0x25, 0xdd, 0x4f, 0x38, 0xc9, 0xbe, 0x43, 0x7d, 0x55, 0x97, 0x00, 0xd0, 0x21, 0x5e, 0xa9, 0x40, - 0x9a, 0x79, 0x4b, 0xba, 0x4a, 0x64, 0x5d, 0x7c, 0x48, 0x01, 0x5c, 0x59, 0x6f, 0x9f, 0x66, 0x21, 0x5d, 0x6b, 0x89, - 0x9d, 0x84, 0x6e, 0xb8, 0x9f, 0x30, 0x02, 0x24, 0xd8, 0xf1, 0x00, 0x9a, 0xbc, 0x13, 0x9e, 0x63, 0xbd, 0x9a, 0x58, - 0x83, 0x20, 0xa2, 0x7b, 0x2f, 0xc1, 0x6e, 0x4e, 0xf3, 0xac, 0xb0, 0x09, 0xd1, 0xec, 0xc8, 0x7d, 0x3f, 0x39, 0xf0, - 0x7a, 0x61, 0x53, 0xb1, 0x51, 0x99, 0x3a, 0xb9, 0xc5, 0x38, 0xc0, 0x3e, 0x2d, 0x05, 0xd4, 0x70, 0x15, 0xa5, 0x2c, - 0xa7, 0x29, 0xa1, 0xc5, 0x38, 0xe0, 0xf4, 0x25, 0x07, 0xff, 0x27, 0x82, 0x26, 0x64, 0x1d, 0x7e, 0xfc, 0xb1, 0x05, - 0x7f, 0x24, 0xad, 0x69, 0x56, 0x44, 0xab, 0x3d, 0xc5, 0x1a, 0x34, 0x2f, 0x93, 0x8f, 0x0d, 0x03, 0xd8, 0xbc, 0x16, - 0xb2, 0xfa, 0x89, 0x9b, 0x56, 0x3c, 0x50, 0x7e, 0xca, 0x41, 0xed, 0xa9, 0x35, 0xf6, 0x42, 0xb2, 0xd3, 0xac, 0xa8, - 0x88, 0xe2, 0x7a, 0xb2, 0x5d, 0x17, 0xef, 0xbe, 0x48, 0x54, 0xfc, 0xe9, 0x06, 0x62, 0x48, 0x40, 0x02, 0x83, 0x15, - 0xd4, 0x90, 0xd0, 0x51, 0x5f, 0x6f, 0xbe, 0xbc, 0xd5, 0x20, 0xd0, 0x7c, 0xe9, 0x14, 0x10, 0x33, 0x15, 0xb3, 0xf3, - 0x21, 0xa0, 0x8a, 0xf7, 0x6f, 0x30, 0x69, 0x36, 0x7e, 0xb7, 0x8e, 0x6b, 0x5d, 0x38, 0xff, 0x51, 0xab, 0x66, 0xc0, - 0x86, 0xb8, 0xa0, 0x4a, 0xd1, 0xb0, 0xca, 0x58, 0x20, 0x1a, 0x3d, 0x7d, 0x1c, 0x59, 0x0a, 0xfb, 0xe7, 0xe6, 0xcb, - 0x67, 0xad, 0x4e, 0x6d, 0x5e, 0xcd, 0x5c, 0x4a, 0xa2, 0xe0, 0x32, 0x7d, 0xc3, 0x57, 0x00, 0x20, 0x33, 0x6b, 0x10, - 0x14, 0x34, 0xf8, 0x1a, 0x7c, 0x6e, 0x45, 0xc8, 0x38, 0xd0, 0xfd, 0x90, 0xf1, 0x87, 0x9b, 0xf6, 0x8a, 0xde, 0xd2, - 0xca, 0x7c, 0x4b, 0xaf, 0xf7, 0xb4, 0xd5, 0xf5, 0x4b, 0x8b, 0x19, 0x75, 0xa9, 0x5a, 0x9e, 0x7e, 0xde, 0xee, 0x7b, - 0xe2, 0xd6, 0xda, 0x9f, 0x8a, 0x32, 0xb6, 0x27, 0xe5, 0xa0, 0x31, 0x37, 0xfe, 0x05, 0xea, 0x35, 0x0d, 0x8d, 0x8a, - 0x42, 0x79, 0x5b, 0xf7, 0xad, 0x50, 0xe6, 0xed, 0x89, 0x8c, 0x23, 0xa9, 0x3b, 0x86, 0xbc, 0x2f, 0x6d, 0xe3, 0xf3, - 0x9a, 0x22, 0x50, 0xf8, 0x95, 0xe9, 0x94, 0x02, 0x5d, 0x13, 0x2e, 0x11, 0x3c, 0xb4, 0xbc, 0x2e, 0xdd, 0x98, 0x41, - 0xe5, 0xe8, 0x03, 0xbd, 0xa5, 0x0d, 0xc1, 0x8f, 0x8b, 0xf0, 0x8b, 0x9d, 0xd0, 0x4c, 0xae, 0x02, 0x35, 0x13, 0x55, - 0xf6, 0x90, 0xac, 0x0c, 0x96, 0x13, 0xa9, 0x49, 0xdf, 0xd4, 0x99, 0x40, 0x83, 0xa9, 0x57, 0x3e, 0xeb, 0x82, 0xa1, - 0x8b, 0x5d, 0x69, 0x61, 0x60, 0x11, 0x26, 0x5f, 0x84, 0x5f, 0x1f, 0x7d, 0x2d, 0x8d, 0x16, 0x18, 0x02, 0x84, 0xe6, - 0x5e, 0x5e, 0x34, 0x0a, 0xb6, 0xbf, 0xbb, 0x69, 0xaf, 0x57, 0x78, 0xf0, 0xed, 0x83, 0x79, 0x89, 0xc5, 0x81, 0x9e, - 0x9b, 0xfc, 0x71, 0x27, 0xed, 0x44, 0x41, 0x48, 0x6d, 0x2e, 0x70, 0x08, 0x50, 0xd5, 0xec, 0x21, 0xce, 0x56, 0x29, - 0x3b, 0x71, 0x04, 0x64, 0xf9, 0x6d, 0x04, 0xbe, 0x7c, 0xb7, 0xc6, 0xde, 0x63, 0x91, 0xb9, 0x28, 0xed, 0xf1, 0xb7, - 0xbb, 0x0b, 0xab, 0xbb, 0x79, 0x78, 0x2c, 0x28, 0xec, 0xfc, 0xe1, 0x3c, 0xee, 0xeb, 0xba, 0x7b, 0x00, 0x98, 0x81, - 0xf0, 0x71, 0x21, 0x1c, 0x02, 0xd1, 0x4c, 0x37, 0xeb, 0xf6, 0xa3, 0x4a, 0xaa, 0x8a, 0xa7, 0x00, 0x27, 0x1c, 0x02, - 0xef, 0x4c, 0x3d, 0x36, 0x4b, 0xb0, 0xd9, 0x0e, 0xc0, 0x10, 0x4a, 0xd3, 0x1c, 0x37, 0xe5, 0x06, 0xc8, 0x77, 0x11, - 0xc3, 0x14, 0xf7, 0x62, 0x8f, 0x86, 0x0f, 0x28, 0x8a, 0x68, 0xe9, 0xbc, 0x20, 0xdf, 0x76, 0x11, 0xcb, 0x9d, 0x27, - 0xa3, 0x0c, 0x3e, 0x11, 0xf9, 0x16, 0x29, 0x64, 0xee, 0x47, 0x9a, 0xc2, 0x6a, 0x9b, 0xd6, 0x8f, 0x01, 0x91, 0x5b, - 0x5a, 0x37, 0x26, 0x5a, 0x03, 0x17, 0x7a, 0x13, 0xf9, 0x02, 0x5a, 0xdb, 0x2a, 0x76, 0x9f, 0x5f, 0x89, 0x64, 0xf0, - 0x40, 0x98, 0x7f, 0xe3, 0xe1, 0xad, 0xd1, 0x31, 0xa5, 0x66, 0x76, 0x49, 0xfb, 0xe3, 0xbd, 0xb5, 0x97, 0xad, 0xfb, - 0xd6, 0xbb, 0x6a, 0x4d, 0x9e, 0xd3, 0x21, 0x95, 0xd8, 0x49, 0x05, 0x50, 0x04, 0x1f, 0x5b, 0x3e, 0x3f, 0x07, 0xa8, - 0x13, 0x05, 0x5c, 0xa8, 0x72, 0xe2, 0xcc, 0x38, 0xcc, 0xf2, 0x2b, 0x69, 0x73, 0x70, 0xfb, 0x79, 0x93, 0x62, 0x20, - 0x84, 0x42, 0x07, 0x64, 0xea, 0x0d, 0x4e, 0x6a, 0x6b, 0xda, 0x02, 0x8b, 0x39, 0x2c, 0x10, 0x39, 0x82, 0x00, 0xe4, - 0x10, 0xe9, 0x5a, 0xa5, 0xfb, 0x78, 0xd0, 0x0d, 0x28, 0x6f, 0x04, 0x66, 0xa4, 0x3f, 0x80, 0xd8, 0xb1, 0xb6, 0x73, - 0x95, 0x88, 0x30, 0x89, 0x34, 0x16, 0x1e, 0xfe, 0x25, 0x53, 0x52, 0x3e, 0x62, 0xb1, 0x1b, 0x82, 0x69, 0x31, 0xaf, - 0x48, 0x0e, 0x29, 0x48, 0x17, 0xea, 0xea, 0x5b, 0x8e, 0xc9, 0x39, 0xcd, 0x32, 0x14, 0xa6, 0x48, 0x18, 0x39, 0x9b, - 0x36, 0x13, 0x59, 0x40, 0x33, 0x56, 0x45, 0xa0, 0x5c, 0x91, 0xf5, 0xa8, 0x92, 0x3f, 0x72, 0xfe, 0x4d, 0x58, 0x05, - 0x97, 0x63, 0xc7, 0xba, 0x61, 0x9d, 0x9d, 0x17, 0x95, 0x69, 0x99, 0x7c, 0x5b, 0x96, 0x24, 0x5e, 0xc2, 0x63, 0x21, - 0xde, 0x2f, 0xfa, 0x6d, 0xf5, 0x14, 0xfa, 0xe5, 0xae, 0x1d, 0x42, 0x85, 0x54, 0x0c, 0x6a, 0x09, 0x13, 0x45, 0x8b, - 0xd2, 0xf8, 0xbd, 0x00, 0x5b, 0x1e, 0x03, 0xda, 0x58, 0xfa, 0xc1, 0x4a, 0x5c, 0x95, 0x23, 0x6a, 0x59, 0xbd, 0x95, - 0xa2, 0x93, 0xcb, 0xca, 0x32, 0xda, 0x22, 0x92, 0x80, 0x00, 0xe7, 0x2b, 0x65, 0x35, 0xbf, 0xe4, 0x3a, 0xac, 0x5b, - 0xbf, 0xb2, 0x54, 0x2a, 0x4c, 0xd1, 0x62, 0xb0, 0x8c, 0x08, 0xe3, 0x36, 0xd7, 0xba, 0x38, 0x7e, 0xd7, 0xfc, 0x0d, - 0xe8, 0xb7, 0x70, 0x97, 0xbb, 0x6a, 0x05, 0x6e, 0x5e, 0x44, 0x74, 0x41, 0x2e, 0x03, 0xb9, 0x0b, 0xaa, 0x37, 0x68, - 0xc1, 0x96, 0xac, 0xb7, 0xe6, 0x32, 0x2f, 0x0f, 0x7d, 0x15, 0x83, 0x3c, 0x7d, 0xa8, 0x68, 0x75, 0xa8, 0xf5, 0x71, - 0x6f, 0xff, 0x69, 0xaf, 0xda, 0x69, 0x40, 0x07, 0xe4, 0xbe, 0xd6, 0xf1, 0x75, 0x97, 0xff, 0xf9, 0x87, 0xdb, 0x22, - 0x91, 0xfb, 0x25, 0x75, 0x03, 0x1d, 0x82, 0xd2, 0x81, 0x60, 0x3b, 0x5e, 0x5a, 0x7e, 0x72, 0xd0, 0x0b, 0x6b, 0x42, - 0x2d, 0xbc, 0x29, 0x4f, 0x83, 0x11, 0x21, 0x94, 0x92, 0x58, 0xe7, 0xb4, 0xd9, 0xc3, 0x82, 0x3e, 0xdc, 0xe1, 0xac, - 0x36, 0xa6, 0x3f, 0x21, 0xaa, 0x4c, 0xb4, 0x07, 0x76, 0x17, 0x4d, 0x6c, 0x78, 0xd8, 0x0f, 0x4a, 0x52, 0x42, 0xb5, - 0xaf, 0xe8, 0x03, 0x65, 0x62, 0x8e, 0x2f, 0x3b, 0x14, 0xfc, 0x55, 0x6a, 0x89, 0x4d, 0x0c, 0xf6, 0x1d, 0x87, 0x25, - 0x51, 0x31, 0x80, 0xcd, 0x65, 0x8c, 0x59, 0x5f, 0x60, 0x8b, 0xd8, 0x9f, 0x56, 0x03, 0x65, 0xbf, 0x5b, 0xf7, 0x7d, - 0x67, 0x05, 0x50, 0xe6, 0x9a, 0x9f, 0xf4, 0x7b, 0xe4, 0x7b, 0xb0, 0xa8, 0x5f, 0x87, 0xa0, 0x45, 0xd7, 0xb5, 0x35, - 0x71, 0xe6, 0xb3, 0x74, 0xcf, 0x0d, 0x17, 0xfe, 0xbe, 0x2a, 0x90, 0x09, 0xd2, 0x74, 0xa8, 0x62, 0x33, 0x2e, 0xca, - 0x28, 0xb6, 0x0c, 0xf7, 0xc2, 0xef, 0xa4, 0x20, 0x42, 0x84, 0x8c, 0x61, 0x5a, 0x22, 0xe8, 0xd4, 0x7c, 0x9e, 0x36, - 0x02, 0xd5, 0x35, 0x29, 0x73, 0x4f, 0x97, 0x3b, 0xe2, 0x41, 0x89, 0x1e, 0x59, 0x02, 0xf4, 0x7f, 0xab, 0xe7, 0x1a, - 0xb7, 0x9c, 0x11, 0xa4, 0x59, 0x10, 0x19, 0x9c, 0xc1, 0x71, 0x8e, 0x1b, 0x2d, 0x24, 0x48, 0x14, 0x77, 0x27, 0xa1, - 0x4f, 0xda, 0x38, 0x35, 0xf8, 0x05, 0xb9, 0x28, 0x37, 0x2a, 0x00, 0xb5, 0x7b, 0x88, 0x16, 0x05, 0x73, 0x66, 0xc8, - 0x8e, 0xbc, 0x87, 0x18, 0x1e, 0xda, 0x52, 0x69, 0x1e, 0x73, 0x72, 0x02, 0x51, 0x73, 0x99, 0x27, 0x35, 0xf6, 0x0a, - 0xfa, 0x06, 0x14, 0xa7, 0xd0, 0xc6, 0x98, 0x38, 0x5d, 0x9e, 0xfa, 0x54, 0x0d, 0x44, 0xe9, 0xd9, 0x7c, 0x5d, 0xac, - 0x23, 0x76, 0xc0, 0x2e, 0x34, 0x63, 0x0c, 0x7e, 0x23, 0x94, 0x02, 0x0e, 0x32, 0x9f, 0x08, 0x3a, 0xf2, 0x83, 0x81, - 0x93, 0x19, 0xe3, 0x5d, 0xd6, 0x84, 0x03, 0x3d, 0x94, 0x52, 0x7d, 0x01, 0x9b, 0x21, 0x04, 0xe8, 0xaf, 0xc4, 0x7b, - 0x67, 0xad, 0x9e, 0x51, 0x89, 0x17, 0x13, 0x39, 0x28, 0xc2, 0x84, 0x87, 0x48, 0x8d, 0x28, 0x74, 0x24, 0xda, 0x43, - 0x05, 0xb3, 0xec, 0x6c, 0x5b, 0x53, 0xde, 0x17, 0x75, 0xea, 0x34, 0x07, 0xbf, 0xbe, 0x17, 0x6f, 0xe4, 0xea, 0x31, - 0xa0, 0xc7, 0xbe, 0x6e, 0x09, 0xd9, 0xbd, 0x53, 0x40, 0x80, 0x7c, 0xb1, 0x43, 0xc6, 0x84, 0xe8, 0x58, 0xd3, 0x92, - 0xaa, 0xd9, 0x47, 0x8b, 0xd0, 0x5f, 0xae, 0x8f, 0x33, 0x2c, 0x13, 0x42, 0x6d, 0x61, 0x02, 0x88, 0xd0, 0x93, 0x4e, - 0x09, 0x96, 0xe4, 0x3e, 0x78, 0xd9, 0xb0, 0xc3, 0xc1, 0x76, 0x55, 0x0c, 0x4f, 0x0e, 0x3f, 0x0f, 0x81, 0xed, 0x98, - 0x80, 0x4e, 0xb3, 0x14, 0x0a, 0xb1, 0xe1, 0x3e, 0x56, 0x33, 0x49, 0x05, 0x31, 0x4d, 0x54, 0x3e, 0xe0, 0x0f, 0x6a, - 0x23, 0x6e, 0xd2, 0x8e, 0xe2, 0xdd, 0x08, 0x7b, 0x89, 0x43, 0x37, 0x84, 0xeb, 0x80, 0xa8, 0xd1, 0x3e, 0x97, 0x35, - 0x37, 0xa2, 0xcd, 0x33, 0x32, 0x70, 0x89, 0xd4, 0x5f, 0xa1, 0x75, 0x50, 0x69, 0x41, 0x3d, 0x8b, 0xdf, 0x02, 0x3c, - 0xb7, 0x86, 0x96, 0xfb, 0x15, 0x92, 0xb8, 0x53, 0x8c, 0x66, 0xb4, 0x47, 0x78, 0x99, 0xee, 0x10, 0xe0, 0xde, 0x6a, - 0xdd, 0x69, 0xba, 0x1e, 0xa0, 0x8c, 0x9d, 0xb8, 0xe9, 0xb6, 0xca, 0x49, 0x1a, 0x03, 0x6a, 0xcc, 0xbf, 0x47, 0xef, - 0x07, 0xdf, 0x73, 0xa4, 0xe3, 0x76, 0x59, 0xe8, 0x5a, 0xa1, 0xf9, 0xf4, 0x39, 0xd9, 0x69, 0xe9, 0x16, 0xf7, 0x26, - 0x11, 0xea, 0xf0, 0x11, 0x5e, 0x30, 0x17, 0x4a, 0x77, 0x5c, 0xd4, 0xbd, 0xf9, 0xc9, 0xc2, 0x4d, 0x51, 0x53, 0x98, - 0x42, 0xc9, 0x66, 0xc3, 0x2b, 0x89, 0x59, 0xa0, 0xb9, 0x5c, 0x29, 0x84, 0x96, 0xf7, 0x40, 0xed, 0x35, 0x24, 0x6e, - 0xad, 0xd7, 0x16, 0x6e, 0xd3, 0x45, 0x6b, 0x35, 0x59, 0xd0, 0xc6, 0x48, 0xca, 0x98, 0x39, 0x74, 0x56, 0x64, 0xba, - 0x2a, 0x0a, 0x86, 0x35, 0xb5, 0x5e, 0x5d, 0x3b, 0x7e, 0x7e, 0x69, 0x7a, 0x08, 0x13, 0x0e, 0xac, 0x56, 0xd0, 0x3b, - 0xec, 0x34, 0x7f, 0x7a, 0xe1, 0x6a, 0x0b, 0x83, 0x44, 0x01, 0x01, 0x5d, 0x72, 0xf4, 0x3e, 0x96, 0x9e, 0xa2, 0x20, - 0x52, 0xa7, 0xab, 0xae, 0x32, 0x12, 0x82, 0x95, 0x8a, 0xff, 0x76, 0x60, 0x42, 0x8e, 0x70, 0x8e, 0xc8, 0xed, 0x75, - 0x25, 0xe7, 0xc7, 0x03, 0xd2, 0xd3, 0x11, 0x91, 0xd0, 0xd3, 0x1b, 0x43, 0x70, 0x39, 0x68, 0xec, 0xef, 0x02, 0xae, - 0xf0, 0x01, 0x86, 0xaf, 0x87, 0xae, 0x94, 0x1b, 0x2c, 0xec, 0xfb, 0x02, 0x69, 0xca, 0x45, 0x04, 0x07, 0xaa, 0x1d, - 0xf9, 0x9c, 0x1d, 0xf9, 0xad, 0x79, 0x15, 0x38, 0x37, 0x27, 0xbb, 0x46, 0x11, 0xca, 0x14, 0xbb, 0xb7, 0x03, 0x23, - 0x51, 0x92, 0xf0, 0xbb, 0x43, 0x42, 0x6b, 0xad, 0xf3, 0x3b, 0xee, 0x07, 0xbc, 0x28, 0x22, 0xf9, 0x07, 0xb1, 0x79, - 0x4f, 0x93, 0xf3, 0xf2, 0x1a, 0x5b, 0xb7, 0x15, 0x23, 0x00, 0xcd, 0x4d, 0xe6, 0x6d, 0x95, 0xc1, 0x0d, 0x56, 0x06, - 0x79, 0xb2, 0x24, 0x18, 0xcf, 0x52, 0x0d, 0xe6, 0xd9, 0xb1, 0x93, 0x96, 0x05, 0x0b, 0x81, 0x22, 0xd7, 0xd4, 0x66, - 0x75, 0x12, 0x57, 0xb4, 0x63, 0xf7, 0x5b, 0xb6, 0xc0, 0x09, 0x48, 0x3d, 0x71, 0xb2, 0xb4, 0x0d, 0x3e, 0x50, 0x48, - 0x76, 0x67, 0x19, 0x06, 0xd9, 0x85, 0xff, 0x2a, 0xe8, 0x07, 0x54, 0x57, 0x21, 0x54, 0xa4, 0x4d, 0x6c, 0x95, 0x94, - 0x22, 0x6b, 0x84, 0xd6, 0xd9, 0x16, 0x64, 0xc5, 0xd9, 0x1e, 0xf1, 0xa8, 0x99, 0xc0, 0x83, 0xc9, 0x6d, 0x91, 0xcd, - 0x19, 0xee, 0x89, 0x40, 0xc7, 0xa6, 0x50, 0x66, 0xda, 0x84, 0x6d, 0xdc, 0x93, 0xcd, 0xda, 0xbb, 0xad, 0xa8, 0x19, - 0x34, 0xa2, 0x6f, 0x69, 0x9a, 0xfd, 0x7b, 0x7d, 0xf0, 0x59, 0x89, 0xbe, 0x91, 0x43, 0x4c, 0xd7, 0x6d, 0xa4, 0x49, - 0x95, 0x5a, 0xe2, 0xd7, 0x6d, 0x3e, 0xbd, 0xa7, 0xa1, 0x1c, 0x52, 0x00, 0x27, 0x94, 0x02, 0x33, 0xe4, 0x73, 0x0c, - 0xc1, 0x9d, 0x82, 0x6d, 0x24, 0xcb, 0xad, 0xc8, 0x65, 0xd6, 0x58, 0xdd, 0xf1, 0x0f, 0x16, 0x80, 0x42, 0x5f, 0xde, - 0xa1, 0xa0, 0x1f, 0x6b, 0xbd, 0x4f, 0xd4, 0x91, 0x12, 0x93, 0xe2, 0xd3, 0xa5, 0x9b, 0xac, 0x02, 0x6a, 0xae, 0x5e, - 0x17, 0x0d, 0xe8, 0x35, 0x61, 0x00, 0xa1, 0x47, 0x74, 0xd8, 0x42, 0x18, 0xfd, 0xd1, 0x14, 0xc2, 0x7a, 0x5f, 0xc5, - 0x6d, 0xb7, 0x29, 0xba, 0xa7, 0xb3, 0x3b, 0x46, 0x6a, 0x90, 0x99, 0x56, 0x34, 0xc7, 0x70, 0x7a, 0xc0, 0x9d, 0xe2, - 0xb1, 0x63, 0x81, 0xcd, 0x26, 0xd5, 0x63, 0x8c, 0x01, 0x8e, 0xcc, 0x58, 0x6c, 0x53, 0x69, 0xad, 0x8c, 0x91, 0xda, - 0x16, 0xfd, 0xb2, 0xe6, 0x4e, 0x51, 0xdc, 0xfe, 0x08, 0x80, 0x79, 0x6e, 0x32, 0xad, 0xa3, 0x98, 0xa2, 0x46, 0x49, - 0xdb, 0xc5, 0xf1, 0x52, 0x54, 0x5e, 0x7c, 0x22, 0x70, 0x6f, 0x84, 0xca, 0x95, 0xa3, 0x03, 0xab, 0x33, 0xa5, 0x1f, - 0x6e, 0xf1, 0x98, 0x39, 0x89, 0x78, 0x01, 0xa3, 0xcf, 0x98, 0x0d, 0xe7, 0x0b, 0xef, 0x88, 0xb9, 0x45, 0x4e, 0xe1, - 0x5d, 0xf1, 0x56, 0xf8, 0xa5, 0x0b, 0xa8, 0xee, 0x41, 0x9c, 0xee, 0x54, 0xd6, 0x7a, 0x9d, 0x11, 0x21, 0xe1, 0x3b, - 0x92, 0xec, 0x95, 0x8c, 0x9d, 0xf8, 0x2c, 0x32, 0x3d, 0x38, 0x86, 0x85, 0x67, 0x8c, 0xe4, 0xf6, 0x99, 0x3a, 0x9a, - 0xb3, 0xc7, 0x3a, 0xd7, 0x45, 0x77, 0x5e, 0x7b, 0x6f, 0x2b, 0xd2, 0x53, 0x33, 0x9b, 0x4e, 0xbc, 0x69, 0x80, 0x3a, - 0x1f, 0xbc, 0xf6, 0x48, 0xe7, 0x7c, 0x07, 0x47, 0x71, 0x28, 0x5c, 0xb7, 0x6a, 0xf4, 0xd9, 0xf5, 0x1e, 0x72, 0x35, - 0x6c, 0xba, 0x8b, 0xc7, 0x65, 0x8f, 0x26, 0x7f, 0xb1, 0x22, 0x10, 0xfb, 0x18, 0x1e, 0x9f, 0xd3, 0xe0, 0xd6, 0xda, - 0xce, 0xb4, 0xd5, 0x36, 0x02, 0xd5, 0xa6, 0xa9, 0x05, 0x7e, 0xd2, 0xd5, 0x71, 0x3e, 0x71, 0xbc, 0xbc, 0x6b, 0xe0, - 0x4b, 0xfc, 0x02, 0x84, 0x55, 0xe9, 0xf5, 0xee, 0xf1, 0x1d, 0x67, 0x99, 0x2d, 0x73, 0xaf, 0x01, 0x59, 0x0e, 0x73, - 0x9d, 0xc5, 0xf1, 0xae, 0x3a, 0x22, 0x95, 0xda, 0xbe, 0xf2, 0xbf, 0x33, 0xe3, 0x42, 0x97, 0x1d, 0x41, 0x1c, 0xc8, - 0x15, 0x39, 0x53, 0x2a, 0xac, 0xc2, 0x69, 0x69, 0x4d, 0x43, 0xe3, 0x3a, 0x14, 0x04, 0x64, 0xf8, 0x7f, 0x20, 0x1c, - 0x44, 0xe6, 0xad, 0x13, 0x92, 0xaa, 0x6a, 0x03, 0x6b, 0xb4, 0x17, 0x7b, 0x01, 0x52, 0x78, 0x28, 0x92, 0xad, 0x2f, - 0xda, 0xaf, 0x4b, 0x64, 0x21, 0x03, 0xc1, 0x28, 0x93, 0x24, 0xc0, 0xd6, 0xd1, 0xad, 0x9e, 0xee, 0x92, 0x5e, 0x26, - 0xa0, 0xef, 0xf4, 0x3c, 0xfe, 0x10, 0x87, 0xa2, 0xac, 0x39, 0x7f, 0x6e, 0x49, 0xb6, 0xf3, 0xe8, 0xae, 0x6a, 0xac, - 0x43, 0x2c, 0x36, 0x97, 0x1c, 0x1d, 0xe7, 0x45, 0x81, 0xb3, 0x0c, 0x7d, 0x07, 0x8c, 0x85, 0x77, 0x36, 0x0c, 0xd5, - 0x5c, 0x48, 0x35, 0x7d, 0xc5, 0xa7, 0x70, 0x1d, 0x1e, 0x52, 0x4a, 0xdb, 0x16, 0xeb, 0xc1, 0x72, 0x88, 0x97, 0xdc, - 0x50, 0xa1, 0x71, 0xb5, 0x34, 0x9b, 0xd4, 0x73, 0x98, 0xc6, 0x8a, 0x2f, 0xd0, 0xa4, 0xdc, 0x45, 0xc5, 0x53, 0x07, - 0x53, 0x87, 0x6e, 0x52, 0x88, 0x7e, 0x3a, 0x32, 0x27, 0x92, 0x34, 0xe9, 0xc7, 0xb6, 0x51, 0x05, 0x01, 0xd0, 0xd1, - 0x5a, 0x16, 0xb4, 0xfb, 0xde, 0xaf, 0x7e, 0x65, 0xa3, 0x4d, 0x8f, 0x1a, 0x92, 0xb9, 0xd6, 0xe1, 0xd6, 0xd7, 0x72, - 0x7c, 0x77, 0x45, 0x18, 0xcd, 0xdb, 0x03, 0xab, 0xc2, 0xb9, 0x88, 0x14, 0xe3, 0x16, 0xad, 0x20, 0x61, 0x1e, 0x20, - 0xc7, 0xbb, 0x61, 0xda, 0x9f, 0x2b, 0x93, 0xa3, 0xf3, 0x3c, 0x3c, 0x6f, 0xae, 0x58, 0x68, 0x45, 0x2f, 0xce, 0xb1, - 0xdf, 0xb8, 0xf7, 0xbd, 0x8c, 0xa9, 0xe7, 0x61, 0xe3, 0xdd, 0x28, 0x4f, 0x4f, 0x30, 0x3a, 0x3f, 0x44, 0x37, 0x77, - 0xa4, 0xaf, 0xec, 0x02, 0xf4, 0x7a, 0x4f, 0x8e, 0xef, 0x67, 0xdf, 0x8b, 0x8e, 0x33, 0xb8, 0x30, 0xd2, 0x28, 0xce, - 0x17, 0x84, 0x96, 0x98, 0xa3, 0x34, 0xe3, 0x45, 0x3d, 0x11, 0x8e, 0x78, 0x79, 0x0a, 0x76, 0x2c, 0xec, 0xa6, 0x3f, - 0x17, 0xbe, 0xb0, 0xf0, 0xd7, 0xe9, 0x4c, 0xe0, 0x71, 0xff, 0x6f, 0x93, 0xfd, 0x82, 0x44, 0x22, 0x7a, 0x18, 0x47, - 0x7a, 0x6c, 0xcb, 0x42, 0xef, 0x99, 0xd8, 0x22, 0xf5, 0xfa, 0xfd, 0x84, 0x50, 0xea, 0x86, 0x52, 0xea, 0x0e, 0xca, - 0x64, 0x59, 0x02, 0x1b, 0x37, 0x85, 0x10, 0x72, 0xfc, 0x33, 0x6e, 0x9e, 0x22, 0x7c, 0xd6, 0x88, 0xd2, 0xac, 0xa6, - 0xa6, 0xe0, 0xce, 0x60, 0x00, 0x56, 0xe2, 0x04, 0x07, 0x88, 0xf2, 0xa1, 0x2e, 0xbc, 0xc2, 0xc4, 0x6a, 0x55, 0x56, - 0x02, 0xb5, 0xc2, 0x50, 0x82, 0x08, 0x4e, 0x68, 0x2f, 0x22, 0xac, 0xeb, 0x98, 0x94, 0x7b, 0xb0, 0x45, 0x3b, 0xb7, - 0xf0, 0xba, 0xdb, 0xc2, 0xca, 0xc3, 0x7b, 0x35, 0xeb, 0xb1, 0x2b, 0xbb, 0xe3, 0x01, 0x72, 0x94, 0x9c, 0xfd, 0x04, - 0x88, 0xe0, 0x41, 0x12, 0xd8, 0xea, 0xad, 0x3d, 0x6c, 0xed, 0x0e, 0xa1, 0xdf, 0x16, 0xf8, 0x74, 0x07, 0xcc, 0x46, - 0x69, 0x37, 0xfb, 0xfc, 0xa7, 0x0e, 0x0e, 0x4b, 0x6f, 0x02, 0x7c, 0x9d, 0xea, 0x4e, 0xd6, 0x74, 0x1b, 0xb8, 0xc7, - 0x3f, 0x7b, 0xe8, 0x8a, 0x44, 0x3a, 0x62, 0x16, 0xb7, 0x38, 0xaa, 0xcb, 0xce, 0xea, 0xae, 0x91, 0x73, 0x5b, 0x12, - 0x57, 0xa5, 0x84, 0xec, 0x72, 0x44, 0xa5, 0x24, 0x7b, 0x44, 0x19, 0x9c, 0xf6, 0xf6, 0xf2, 0xdc, 0x98, 0x7b, 0x18, - 0x67, 0x01, 0xa8, 0x09, 0x58, 0x2e, 0xc8, 0xc6, 0x3b, 0x01, 0x80, 0x51, 0x5a, 0x35, 0x75, 0x46, 0xef, 0xe2, 0x56, - 0x5d, 0x6f, 0x1e, 0x64, 0x46, 0x33, 0x51, 0x33, 0xb9, 0x3b, 0xa0, 0x8a, 0xd1, 0xc2, 0x20, 0xfb, 0xa5, 0x54, 0x7c, - 0x5a, 0x95, 0x68, 0xa5, 0x43, 0xcd, 0x68, 0xbf, 0xfb, 0x34, 0xd0, 0x51, 0x22, 0xb6, 0x5c, 0x4c, 0xbb, 0xf2, 0x76, - 0x98, 0x78, 0x1a, 0xd8, 0x2a, 0x33, 0x22, 0x4d, 0xd9, 0xc2, 0xcb, 0x11, 0x49, 0x7e, 0xd4, 0x5d, 0xb3, 0x6a, 0x52, - 0x1b, 0x67, 0x2d, 0x3c, 0xdd, 0x52, 0xe4, 0x14, 0x0a, 0x2e, 0xda, 0xee, 0x83, 0x0c, 0x82, 0x69, 0xd3, 0xc6, 0x59, - 0x6f, 0xbb, 0x2f, 0xa2, 0x8e, 0x57, 0x74, 0x5c, 0x24, 0x6c, 0x6e, 0xf7, 0x14, 0x65, 0x07, 0x89, 0xf2, 0x24, 0x26, - 0xd3, 0x91, 0x03, 0x95, 0xb4, 0xa1, 0xd4, 0xd2, 0x7b, 0xc9, 0x8a, 0x8b, 0xb8, 0xf8, 0xbf, 0xca, 0xb2, 0xad, 0x2f, - 0xbe, 0x48, 0xb0, 0xa0, 0x83, 0x39, 0xa2, 0xc0, 0x3c, 0x97, 0xd2, 0x41, 0x89, 0x44, 0x11, 0xf9, 0x49, 0xc1, 0xec, - 0xaa, 0x64, 0x0d, 0x3e, 0x68, 0xa5, 0x3b, 0x93, 0x49, 0x43, 0x22, 0xe5, 0x9a, 0xd4, 0xda, 0x16, 0x1b, 0x19, 0xf1, - 0xcc, 0x0f, 0x56, 0x89, 0x30, 0x12, 0x0f, 0x32, 0x25, 0x96, 0xc2, 0xb3, 0x85, 0x94, 0xf8, 0x22, 0x67, 0x9f, 0xeb, - 0xc5, 0x6e, 0xb4, 0xc8, 0x62, 0x7e, 0x98, 0xf9, 0xe5, 0x70, 0xb3, 0x5b, 0x11, 0xa3, 0xde, 0x9a, 0xb3, 0x3c, 0x2b, - 0x99, 0x8d, 0x6b, 0x47, 0x8e, 0xb9, 0x04, 0x1a, 0x29, 0x04, 0x0a, 0xe9, 0x93, 0x81, 0x53, 0x8b, 0xcb, 0x81, 0x0d, - 0x1a, 0xdf, 0xf1, 0xc9, 0xb3, 0xa5, 0xbb, 0x8b, 0xa1, 0x61, 0xdb, 0x21, 0x11, 0x44, 0x68, 0xbc, 0x21, 0xd1, 0x32, - 0x34, 0x3f, 0x78, 0x3a, 0xef, 0xcc, 0xf4, 0xea, 0x8e, 0xa4, 0x67, 0x69, 0xe1, 0x11, 0xe0, 0x7c, 0x52, 0x91, 0xe6, - 0xd6, 0x3e, 0xc9, 0x21, 0xeb, 0xfe, 0x45, 0xb3, 0x7e, 0x45, 0x00, 0x77, 0x92, 0x80, 0x10, 0xa0, 0xe1, 0x75, 0x6b, - 0x21, 0x8c, 0x25, 0xcc, 0x38, 0x84, 0xee, 0x2a, 0xf8, 0x6f, 0x12, 0xa6, 0xe7, 0xa5, 0x09, 0x8d, 0x2f, 0x4a, 0xc5, - 0x60, 0x27, 0x0b, 0x84, 0x5b, 0x40, 0x14, 0x04, 0x81, 0x20, 0x63, 0x16, 0x8a, 0xa9, 0x84, 0x76, 0xa0, 0x15, 0x14, - 0x48, 0x80, 0x89, 0x37, 0x4e, 0x85, 0x41, 0x55, 0x6d, 0xc5, 0xd3, 0x1c, 0xb3, 0xe1, 0xa4, 0x61, 0x50, 0x58, 0x7f, - 0x02, 0x5d, 0x9c, 0x62, 0x92, 0x0c, 0xfb, 0xbb, 0x78, 0xe3, 0xc9, 0xba, 0x9d, 0x89, 0x52, 0x29, 0xf6, 0x59, 0x93, - 0x27, 0x34, 0xc3, 0x79, 0x21, 0xea, 0xcb, 0xba, 0xb4, 0xee, 0x83, 0xd5, 0x74, 0x07, 0x4f, 0x9e, 0x75, 0xa4, 0xb7, - 0x71, 0x60, 0xb9, 0x83, 0x44, 0x80, 0x45, 0xda, 0x03, 0xcd, 0xc8, 0x32, 0x64, 0xa8, 0x02, 0xac, 0x35, 0xe6, 0x4e, - 0x0d, 0x6d, 0x0f, 0xe5, 0x46, 0x72, 0x6d, 0x12, 0xac, 0x1e, 0x96, 0xbe, 0xbc, 0xba, 0x6e, 0x73, 0x63, 0x00, 0xbb, - 0xef, 0xd8, 0xb2, 0xa0, 0xcb, 0x11, 0x19, 0x8e, 0x27, 0xb7, 0x09, 0xd5, 0x03, 0x14, 0x8a, 0x6a, 0xaa, 0x69, 0xed, - 0x1f, 0x7e, 0xe6, 0x9d, 0x38, 0xd4, 0x39, 0x21, 0x36, 0x2a, 0x8f, 0xd0, 0x31, 0x8f, 0x7d, 0xa2, 0xcf, 0x25, 0xef, - 0x69, 0xbe, 0x41, 0xea, 0xc8, 0xc5, 0xd5, 0x79, 0x92, 0xa8, 0x1b, 0x63, 0xb5, 0x15, 0x5b, 0x84, 0x01, 0x16, 0x73, - 0x0c, 0x87, 0xe8, 0x54, 0x70, 0xb4, 0x24, 0xbd, 0x8d, 0xa5, 0xea, 0xe5, 0xf6, 0xdb, 0xaa, 0x4b, 0x6b, 0xa7, 0x09, - 0x83, 0xe8, 0xf4, 0x90, 0x01, 0x07, 0x42, 0xc6, 0xda, 0x3e, 0x58, 0xc6, 0x71, 0x46, 0xeb, 0x32, 0x68, 0x04, 0x63, - 0xe8, 0x00, 0xe5, 0xac, 0x7a, 0x1c, 0xec, 0x04, 0x62, 0x79, 0x48, 0x6f, 0x9a, 0xcc, 0x00, 0xd9, 0x22, 0x97, 0x5f, - 0x6a, 0xa2, 0x9d, 0x85, 0x8e, 0x2d, 0xfb, 0x1e, 0xd0, 0xae, 0x03, 0x47, 0x5f, 0x07, 0x1c, 0x75, 0xe2, 0x45, 0x2d, - 0x85, 0x36, 0xc7, 0xc0, 0xb9, 0xb0, 0x38, 0xd5, 0xf3, 0x6c, 0x68, 0xc7, 0xbd, 0x03, 0xbc, 0x98, 0xd2, 0xf5, 0x02, - 0xfc, 0x76, 0x70, 0x19, 0xf8, 0xc4, 0x83, 0xdb, 0xea, 0xb0, 0x63, 0x67, 0x92, 0xc6, 0x79, 0x34, 0x75, 0x73, 0xce, - 0xb9, 0xd0, 0xe5, 0xdc, 0xff, 0x9e, 0x6e, 0xfd, 0xfe, 0x8a, 0xf1, 0x69, 0xad, 0x3d, 0x61, 0xb9, 0xca, 0x69, 0x97, - 0x45, 0x2c, 0x59, 0x71, 0x8e, 0xbe, 0x10, 0xc8, 0xd7, 0xeb, 0xfc, 0x7e, 0xa1, 0x41, 0xe7, 0xd4, 0x41, 0x74, 0x8e, - 0x71, 0xb2, 0xd3, 0x83, 0xc9, 0x7b, 0x65, 0x71, 0x68, 0xac, 0x52, 0x66, 0xf1, 0x7d, 0xe3, 0x96, 0xde, 0x9e, 0x50, - 0x76, 0x29, 0x85, 0x14, 0xca, 0xb2, 0xe1, 0xb6, 0xc7, 0x81, 0xa6, 0xed, 0x36, 0x92, 0xdd, 0xd6, 0xb7, 0xef, 0x34, - 0x89, 0x48, 0xd2, 0xdd, 0x05, 0x51, 0x78, 0x86, 0xd0, 0x18, 0x50, 0xb0, 0x37, 0xa7, 0xd6, 0xe5, 0x6b, 0x2f, 0x2b, - 0xf1, 0x8a, 0x78, 0x57, 0x0c, 0xc6, 0xca, 0x09, 0x1d, 0x2c, 0xd2, 0x34, 0x50, 0xc7, 0x4e, 0x92, 0xb8, 0x55, 0x49, - 0xfc, 0xd0, 0xf2, 0x2f, 0xa4, 0xb9, 0x51, 0x79, 0x2a, 0xe2, 0xeb, 0x10, 0x7d, 0xe6, 0xb8, 0x54, 0xf7, 0x46, 0x35, - 0x83, 0x72, 0xcc, 0x93, 0x79, 0xc3, 0x5c, 0xa6, 0xdb, 0x29, 0x32, 0x4f, 0xf6, 0xbc, 0xb9, 0x99, 0x51, 0xa2, 0x44, - 0xa4, 0x2e, 0xf4, 0x32, 0xd7, 0x56, 0xa1, 0x23, 0x8d, 0xd8, 0xb4, 0x56, 0xb3, 0x89, 0x3d, 0x0e, 0x67, 0x3f, 0x59, - 0xd9, 0x13, 0xbc, 0xeb, 0x3d, 0xef, 0xec, 0xc3, 0xe6, 0x82, 0xeb, 0xd0, 0x88, 0x21, 0x33, 0x60, 0xa6, 0x59, 0x3a, - 0x53, 0x20, 0x8b, 0xb8, 0xaf, 0xee, 0x48, 0x94, 0x31, 0xfd, 0x13, 0xab, 0x75, 0x7d, 0xad, 0x54, 0x1d, 0x93, 0x1f, - 0xbe, 0xa3, 0x6b, 0x38, 0x77, 0x50, 0x94, 0x18, 0x4e, 0x34, 0xed, 0xe6, 0x52, 0x03, 0x10, 0x7e, 0x67, 0x87, 0x51, - 0x58, 0xc1, 0xb6, 0xa8, 0xb7, 0xea, 0x2a, 0x60, 0xa0, 0x86, 0x79, 0x32, 0xf6, 0x46, 0x11, 0x19, 0xf5, 0x1b, 0x76, - 0x23, 0xaf, 0x2c, 0xba, 0x65, 0x8d, 0xcf, 0x56, 0x39, 0xa5, 0xfe, 0x48, 0x6a, 0xe5, 0x0e, 0x0b, 0xe4, 0x86, 0xeb, - 0x42, 0x21, 0xa9, 0x37, 0x1c, 0x9b, 0x6d, 0x6b, 0xe6, 0x99, 0x06, 0xba, 0x6d, 0x4d, 0xef, 0x13, 0x3b, 0x70, 0xc3, - 0x6d, 0xdd, 0x30, 0x55, 0x6d, 0x3b, 0x8f, 0x5f, 0xef, 0xd3, 0x22, 0xac, 0x09, 0x6d, 0x18, 0xc6, 0x1a, 0xd8, 0xb6, - 0x45, 0x31, 0x17, 0x83, 0x98, 0xf6, 0xd8, 0x62, 0xdf, 0x81, 0x6c, 0xdf, 0xfd, 0xb5, 0x4a, 0x42, 0x4e, 0xae, 0xd2, - 0xf9, 0x35, 0xf9, 0x49, 0x27, 0x8b, 0x44, 0x66, 0x76, 0x91, 0xbf, 0xc6, 0x95, 0xfd, 0xa3, 0x95, 0xdd, 0xab, 0x95, - 0x2e, 0x52, 0x40, 0x14, 0xa6, 0xc2, 0x73, 0x08, 0x4c, 0x97, 0xac, 0xfc, 0x1f, 0xe8, 0x38, 0x27, 0x63, 0x4a, 0x68, - 0x6f, 0x34, 0x9a, 0x40, 0x37, 0x24, 0x14, 0x43, 0x0b, 0xcb, 0xe9, 0x79, 0xa9, 0x41, 0x57, 0x3b, 0x5c, 0x47, 0x96, - 0xfb, 0x22, 0xc0, 0x4f, 0x14, 0x50, 0x67, 0x6a, 0x82, 0xdd, 0x4f, 0x02, 0x63, 0x69, 0xd6, 0x59, 0xfa, 0x45, 0x87, - 0xd3, 0x15, 0x75, 0xf7, 0xf4, 0x2b, 0x86, 0x44, 0x77, 0xf8, 0x95, 0x42, 0xeb, 0x13, 0x33, 0x73, 0x81, 0x46, 0x3a, - 0x6e, 0x60, 0x10, 0x2e, 0x6a, 0x0b, 0xfe, 0x80, 0x5c, 0xc5, 0x4d, 0xe1, 0x6e, 0x72, 0x00, 0x97, 0xca, 0x6d, 0xcb, - 0xb3, 0x4a, 0x13, 0x98, 0x7d, 0x92, 0x32, 0x3a, 0x71, 0x8c, 0xba, 0x6f, 0x77, 0x3f, 0x4a, 0x52, 0xde, 0x3e, 0x7d, - 0xf3, 0x7a, 0x95, 0x35, 0xca, 0xde, 0x33, 0xb3, 0xd4, 0x55, 0xfc, 0xa9, 0x49, 0xee, 0x6a, 0xee, 0x3b, 0xe9, 0x56, - 0x20, 0x30, 0xca, 0x79, 0x85, 0xe5, 0xce, 0xb2, 0x90, 0xc3, 0xe6, 0x5e, 0xba, 0x4f, 0x4b, 0x9a, 0xec, 0x44, 0x55, - 0x62, 0x8c, 0x49, 0xa1, 0xfd, 0xf2, 0x74, 0xee, 0x8f, 0x0e, 0xdf, 0xa3, 0xa3, 0xbe, 0x4b, 0xd3, 0x72, 0xda, 0x8a, - 0xed, 0xf2, 0xc4, 0x0e, 0xa6, 0xe1, 0x9a, 0x30, 0x2d, 0x03, 0x84, 0xee, 0xea, 0x03, 0xe8, 0x5f, 0xe2, 0x1f, 0xfa, - 0xf1, 0x9c, 0xa2, 0x0f, 0xd0, 0x83, 0xd9, 0x9a, 0xca, 0x25, 0x6a, 0x50, 0x22, 0xb2, 0x4d, 0xbb, 0x34, 0x01, 0x53, - 0xe4, 0x20, 0xdd, 0x42, 0x06, 0xa2, 0x64, 0x21, 0x98, 0x41, 0xe5, 0x17, 0xf1, 0x3a, 0xf1, 0x75, 0xbe, 0x5a, 0xf0, - 0x92, 0x9e, 0x70, 0x55, 0xc8, 0xd5, 0x0d, 0xa3, 0xc5, 0xbc, 0x3a, 0xed, 0xa4, 0xda, 0x38, 0x34, 0xa8, 0x51, 0x87, - 0x48, 0xd7, 0xf1, 0xfe, 0x6f, 0x36, 0x52, 0x37, 0x18, 0xfd, 0xe4, 0x24, 0xe0, 0xfb, 0xc6, 0x48, 0xa5, 0xb3, 0x87, - 0x38, 0xb5, 0x16, 0x3c, 0x5e, 0x28, 0x7b, 0x34, 0xea, 0x11, 0xb5, 0xc6, 0x5e, 0x0e, 0x32, 0xad, 0x0d, 0x27, 0x85, - 0xd2, 0x79, 0xb8, 0x94, 0x77, 0x49, 0xe1, 0xd2, 0x1b, 0x95, 0x88, 0xf2, 0x00, 0x76, 0xc2, 0x96, 0x8a, 0x1b, 0x95, - 0xb4, 0x80, 0xea, 0x99, 0x9e, 0x0c, 0x89, 0xe9, 0x9c, 0x44, 0x8c, 0x19, 0x9e, 0xd2, 0xcd, 0x38, 0x44, 0x6b, 0x68, - 0x86, 0x3d, 0xbd, 0x8f, 0xd5, 0x13, 0xe4, 0x80, 0x9d, 0x8d, 0xeb, 0x0c, 0x21, 0x76, 0x52, 0xe1, 0x67, 0x6a, 0x55, - 0x6c, 0x99, 0x7f, 0x24, 0xa8, 0x6d, 0xf3, 0xb6, 0x8f, 0x88, 0xf2, 0xd6, 0xd2, 0x37, 0xb9, 0xbf, 0xe2, 0xca, 0x78, - 0x25, 0x81, 0x66, 0x96, 0x97, 0xfc, 0x1c, 0xe6, 0x67, 0xbf, 0xb1, 0x03, 0x13, 0x88, 0x38, 0xdb, 0x68, 0xd4, 0x53, - 0x72, 0x34, 0xd7, 0x39, 0xef, 0x5b, 0x70, 0x46, 0xc9, 0x34, 0x10, 0x62, 0x2d, 0x8b, 0x04, 0xe2, 0xc8, 0x24, 0x71, - 0x56, 0x38, 0xeb, 0x68, 0x27, 0x8f, 0x0e, 0x7a, 0x6f, 0x22, 0xf7, 0x45, 0x4d, 0x7a, 0x06, 0xfe, 0xd8, 0x51, 0x63, - 0x31, 0x8a, 0x6e, 0x5e, 0x04, 0xea, 0xe6, 0x2c, 0x8f, 0x43, 0xbd, 0xf4, 0x66, 0xae, 0xfd, 0xd2, 0xd3, 0x5a, 0xaa, - 0x0b, 0x74, 0x71, 0xe8, 0x31, 0x6a, 0x51, 0x5e, 0x41, 0x1a, 0x4c, 0x7b, 0xa0, 0xec, 0x35, 0x4c, 0xe8, 0x01, 0xbf, - 0x54, 0x82, 0x8c, 0x06, 0xef, 0x7c, 0xb4, 0xc5, 0xc5, 0x74, 0x92, 0xf3, 0x66, 0x01, 0x05, 0xb7, 0xeb, 0x2d, 0xa9, - 0x89, 0xd0, 0x1a, 0x37, 0x28, 0x6c, 0x91, 0xf0, 0x4f, 0x34, 0x87, 0xb3, 0x2b, 0x24, 0x75, 0x88, 0x4d, 0x31, 0xc2, - 0x04, 0xb4, 0x66, 0x5c, 0x6c, 0x68, 0x61, 0x37, 0xd1, 0x03, 0x6b, 0xf3, 0x20, 0x19, 0x87, 0x3b, 0x9a, 0x69, 0x33, - 0x90, 0x6b, 0x09, 0xfe, 0x2c, 0x11, 0xbd, 0xc3, 0xae, 0x0f, 0x77, 0x64, 0xd8, 0xdc, 0x12, 0xb2, 0x52, 0x66, 0x7a, - 0x78, 0x09, 0xb4, 0xeb, 0xb7, 0x8a, 0xed, 0x50, 0xc1, 0x9f, 0x22, 0x87, 0xa4, 0x98, 0x7e, 0x9f, 0xbd, 0x3a, 0x80, - 0x18, 0xc4, 0xa9, 0xd3, 0x7d, 0x53, 0x60, 0x9d, 0x43, 0x49, 0xb1, 0x21, 0x8c, 0x71, 0xc6, 0x51, 0xbb, 0xdb, 0xd1, - 0xc6, 0x7e, 0x24, 0x86, 0x40, 0xe9, 0xf0, 0xe5, 0x8e, 0x56, 0x5e, 0xb7, 0xb3, 0x75, 0xdb, 0x6b, 0xda, 0x91, 0x0f, - 0xc9, 0x11, 0x4c, 0x8a, 0x48, 0x5a, 0x36, 0x10, 0x9a, 0x31, 0x78, 0x8b, 0xb4, 0x60, 0x6d, 0xcf, 0x80, 0x96, 0xb9, - 0x5e, 0x28, 0xb4, 0xc0, 0xb3, 0x66, 0x0c, 0x4c, 0x0a, 0x8b, 0x0e, 0x2e, 0x69, 0xef, 0x74, 0x82, 0xd9, 0x40, 0xb5, - 0x5a, 0xdb, 0x6d, 0x59, 0xdf, 0x34, 0x0a, 0x84, 0xed, 0xbb, 0x72, 0x33, 0xfd, 0xc8, 0xcf, 0xac, 0x05, 0xf0, 0x55, - 0x6c, 0xbb, 0xce, 0x83, 0x76, 0x5f, 0x5b, 0xe5, 0xde, 0xc7, 0xfe, 0x5a, 0xe2, 0xc7, 0x50, 0xc3, 0xb2, 0x74, 0xc2, - 0x74, 0x65, 0x50, 0xbc, 0xe5, 0x9a, 0xfb, 0xc2, 0xc6, 0x64, 0x7a, 0x87, 0x12, 0x9b, 0xf8, 0xba, 0xb3, 0x1b, 0xcc, - 0x2d, 0x23, 0x7a, 0x59, 0xbf, 0xd3, 0xb7, 0xb2, 0xb5, 0xeb, 0x01, 0x88, 0xa9, 0x57, 0x96, 0x8c, 0x87, 0x19, 0x5d, - 0x3c, 0x04, 0xa5, 0xc9, 0x6b, 0x54, 0x92, 0xc1, 0x67, 0xf5, 0xae, 0x85, 0x44, 0xe4, 0xdb, 0x7a, 0x95, 0x27, 0xb3, - 0x91, 0x0d, 0xc7, 0xae, 0xa7, 0xe5, 0x81, 0x90, 0x32, 0x9a, 0xfd, 0x6d, 0x93, 0xd6, 0x5c, 0x4b, 0xc3, 0x2f, 0x91, - 0xe2, 0xa2, 0xd9, 0x38, 0xca, 0x36, 0x12, 0x04, 0x5d, 0xd5, 0x42, 0xb2, 0x58, 0x78, 0x58, 0xc8, 0x50, 0xbe, 0xac, - 0x84, 0x65, 0x2f, 0xee, 0xa6, 0x13, 0xf9, 0xe6, 0xc6, 0xcd, 0x8f, 0x42, 0xdb, 0xad, 0xaf, 0xdd, 0xf5, 0x43, 0x1b, - 0x51, 0x56, 0xbf, 0xe8, 0xc1, 0x57, 0xaa, 0xb1, 0x3e, 0xb2, 0xfe, 0xff, 0xa1, 0x9f, 0xd4, 0x89, 0xe4, 0xcc, 0x69, - 0x3b, 0x60, 0x7b, 0xa6, 0x80, 0xad, 0xd0, 0xf6, 0xb0, 0xa9, 0xf4, 0xfe, 0xce, 0x25, 0x81, 0x5c, 0x88, 0xf8, 0x84, - 0x85, 0x40, 0x92, 0xe2, 0x91, 0x4e, 0x03, 0x4c, 0x2d, 0x03, 0xea, 0x11, 0xec, 0xfb, 0xc1, 0x8e, 0x7c, 0xf3, 0x92, - 0xed, 0xf2, 0xb6, 0xee, 0x27, 0x28, 0xeb, 0x3e, 0x0f, 0x81, 0x8d, 0xdb, 0xd2, 0xe5, 0x80, 0x49, 0x1c, 0xc8, 0xc4, - 0x4c, 0xfb, 0x65, 0x6a, 0x2f, 0xdf, 0x2a, 0x67, 0x9c, 0xa0, 0x5b, 0x8a, 0x5a, 0x0e, 0x29, 0x71, 0x48, 0x5b, 0x79, - 0xe7, 0x86, 0xbd, 0x91, 0x7e, 0x88, 0x73, 0x8b, 0x1e, 0x07, 0x46, 0xd4, 0x69, 0xce, 0x66, 0x21, 0x42, 0x4d, 0xae, - 0x1a, 0xe5, 0xf1, 0x03, 0x57, 0xe9, 0x5a, 0xaa, 0xee, 0x2b, 0x94, 0xcc, 0x9e, 0x08, 0x93, 0x39, 0xb4, 0x3b, 0x64, - 0x49, 0x89, 0x66, 0x1f, 0xbb, 0x75, 0x40, 0x60, 0x27, 0x60, 0x9e, 0x96, 0xc8, 0xeb, 0x94, 0x4c, 0xfc, 0xf6, 0xed, - 0x3f, 0xca, 0xeb, 0x08, 0x86, 0xbd, 0xe4, 0x30, 0xa7, 0x02, 0x11, 0xc7, 0x71, 0xfe, 0xbc, 0x91, 0x0b, 0x12, 0x63, - 0xfd, 0xf9, 0x6b, 0xac, 0x5c, 0x23, 0x81, 0x56, 0x49, 0x43, 0xe1, 0x99, 0x1b, 0x67, 0xae, 0xec, 0xd4, 0xb3, 0x8c, - 0x2b, 0x76, 0x5b, 0xf4, 0x93, 0xc8, 0xa3, 0x16, 0xcd, 0x94, 0x1e, 0xa9, 0x72, 0x91, 0x94, 0xb4, 0xca, 0xa1, 0x96, - 0x6c, 0x05, 0xca, 0x61, 0x72, 0x2c, 0xe3, 0x3a, 0x73, 0x1a, 0x9a, 0xb3, 0x2c, 0x01, 0x72, 0x8b, 0x25, 0x38, 0xc7, - 0x4c, 0x2e, 0xc3, 0x4a, 0x2a, 0x24, 0x60, 0x1c, 0x84, 0xc2, 0x4f, 0xfe, 0xb1, 0xd2, 0xfe, 0x4e, 0x86, 0x5c, 0x62, - 0xf8, 0x0b, 0x1f, 0x93, 0x9e, 0x2b, 0x1f, 0x0a, 0x66, 0xb0, 0x18, 0xa2, 0xb7, 0x8c, 0x60, 0x5b, 0xee, 0xc4, 0x5b, - 0x34, 0xcb, 0xd2, 0xb9, 0x7f, 0x81, 0x66, 0xdd, 0xac, 0xd5, 0x7d, 0x8b, 0x22, 0xaf, 0x67, 0x4c, 0x9a, 0x70, 0xd2, - 0x4a, 0xa9, 0x94, 0xa6, 0xa0, 0x23, 0x4a, 0x32, 0x01, 0xcc, 0x0c, 0x50, 0xb2, 0x93, 0x8c, 0x4a, 0x0f, 0xca, 0xc9, - 0x70, 0x62, 0x31, 0xd3, 0xe8, 0x2c, 0x06, 0xac, 0x5e, 0x35, 0x3e, 0xce, 0x27, 0x1d, 0xff, 0x03, 0x40, 0xf5, 0xb5, - 0xd7, 0x82, 0xd7, 0x3c, 0x97, 0x93, 0xae, 0xe9, 0xba, 0x3a, 0xf6, 0x3f, 0xee, 0x45, 0x57, 0x50, 0x35, 0x66, 0xbf, - 0xd8, 0x5f, 0xd2, 0x38, 0x0c, 0x13, 0x62, 0x7c, 0x70, 0x1f, 0x70, 0xd4, 0x01, 0x5b, 0xac, 0x7a, 0x72, 0x91, 0x64, - 0x96, 0xa4, 0xb7, 0xb9, 0xe8, 0x3a, 0x7e, 0x70, 0x60, 0xa8, 0x2e, 0x6d, 0xba, 0xe7, 0x91, 0x15, 0x6f, 0x8d, 0x25, - 0xc0, 0x52, 0xcc, 0x81, 0x2e, 0x18, 0x1d, 0xaf, 0x08, 0xce, 0xb6, 0x13, 0x20, 0x0a, 0x63, 0x2d, 0x8a, 0x2c, 0x4e, - 0xf8, 0x5b, 0xd2, 0x26, 0x60, 0x4b, 0xc6, 0x28, 0x8d, 0x7d, 0x0e, 0xce, 0x95, 0xf9, 0xe0, 0xb1, 0xea, 0x17, 0x75, - 0xba, 0xba, 0x0c, 0xb1, 0xcf, 0x4f, 0x72, 0x79, 0xfd, 0x1d, 0xea, 0x4b, 0xbf, 0x8d, 0xd2, 0x17, 0x78, 0x67, 0x09, - 0x39, 0xef, 0x5e, 0xff, 0x54, 0xb4, 0x38, 0x30, 0x0b, 0x5d, 0xc5, 0x16, 0xb5, 0xe0, 0xfc, 0xe9, 0x85, 0x44, 0x14, - 0x65, 0x8f, 0x09, 0x90, 0xa9, 0xa6, 0xac, 0x7e, 0x53, 0xa4, 0x40, 0xc6, 0x45, 0x55, 0x9c, 0x3c, 0x06, 0xdf, 0xce, - 0x37, 0x77, 0x94, 0xc1, 0x68, 0xc8, 0xba, 0x5f, 0xef, 0xd8, 0xc4, 0x6f, 0xc4, 0xfc, 0x8f, 0x09, 0x27, 0xbd, 0x7a, - 0x4a, 0x80, 0x4a, 0xda, 0x49, 0x2a, 0x7d, 0x50, 0xe0, 0x85, 0x89, 0x26, 0x67, 0xa8, 0x41, 0x56, 0x78, 0x02, 0x9d, - 0x01, 0xcb, 0xd8, 0x62, 0x4a, 0xd9, 0x6d, 0x9b, 0xf8, 0x19, 0x85, 0x37, 0xb6, 0xb5, 0xd5, 0x18, 0xa4, 0xa7, 0x0a, - 0xd0, 0xf6, 0x38, 0x53, 0x85, 0x67, 0xd1, 0x85, 0x73, 0x6e, 0xde, 0x39, 0x70, 0x3e, 0xac, 0xcd, 0xc3, 0x97, 0xbf, - 0x20, 0x07, 0x85, 0x5d, 0x93, 0x3a, 0xa8, 0xea, 0x9a, 0x97, 0x74, 0xc2, 0x3f, 0x61, 0x7b, 0x89, 0xc5, 0x4c, 0x5e, - 0xd2, 0x7e, 0x0a, 0x1d, 0x21, 0x6d, 0x1e, 0x3a, 0xcd, 0xf6, 0x6f, 0x8a, 0x99, 0x1c, 0x2f, 0xb6, 0x9a, 0xfd, 0xb2, - 0x31, 0xfe, 0x2d, 0x92, 0x02, 0xee, 0x2b, 0xe7, 0xc3, 0x2a, 0x32, 0x89, 0x3a, 0xae, 0x8d, 0x17, 0x94, 0x3e, 0x86, - 0xe9, 0x68, 0xb1, 0xea, 0xb2, 0x8c, 0x7b, 0xa5, 0xcc, 0x91, 0x51, 0x82, 0xc3, 0x53, 0x55, 0x44, 0x15, 0x3a, 0xaf, - 0x21, 0x2f, 0xcd, 0xfc, 0xba, 0x4a, 0x45, 0xe8, 0x43, 0x99, 0x73, 0xce, 0x5b, 0xa2, 0xee, 0x7a, 0xa2, 0xf8, 0x71, - 0x81, 0x42, 0x5b, 0x22, 0x8c, 0x7c, 0x70, 0x06, 0xa7, 0x49, 0x82, 0x47, 0x26, 0x22, 0x8f, 0x3c, 0xc5, 0xf5, 0x8b, - 0x51, 0x49, 0x2f, 0x2f, 0xe1, 0x91, 0x73, 0x97, 0xc5, 0xdd, 0x47, 0xfc, 0x5a, 0x7d, 0x89, 0x3e, 0x2c, 0xe1, 0x28, - 0x88, 0x95, 0x76, 0xbf, 0x0c, 0x9f, 0xd4, 0x81, 0xca, 0xf9, 0x3f, 0xa8, 0xbf, 0x86, 0x2c, 0xb2, 0x88, 0x26, 0xeb, - 0x0a, 0x73, 0x70, 0xd4, 0x0f, 0x8b, 0x10, 0xf9, 0x22, 0x43, 0x48, 0x16, 0xdd, 0xea, 0xe5, 0x21, 0xb4, 0x9e, 0xfc, - 0xdd, 0x32, 0xf7, 0xfb, 0xbb, 0x6a, 0x7a, 0x38, 0x8d, 0x14, 0xfc, 0x48, 0x45, 0x5f, 0x76, 0x75, 0x7b, 0x12, 0xdf, - 0xf5, 0x7c, 0x0f, 0x01, 0xb3, 0x8f, 0x34, 0x44, 0xf2, 0x66, 0xd9, 0x3a, 0xf4, 0x4d, 0x6c, 0x71, 0x45, 0x6b, 0xd0, - 0xa5, 0xd4, 0xf4, 0x51, 0x81, 0x33, 0xbc, 0x12, 0x74, 0x90, 0xe1, 0x68, 0xb9, 0xf2, 0xa6, 0x42, 0xb0, 0x38, 0xa9, - 0xda, 0x6e, 0x8b, 0x32, 0xdb, 0x33, 0x38, 0x89, 0x16, 0x51, 0x93, 0x99, 0xfc, 0x3e, 0x7d, 0x14, 0xab, 0xdc, 0x28, - 0x82, 0x3b, 0xfa, 0xc2, 0x2a, 0xad, 0xbd, 0x34, 0xe4, 0x97, 0x5a, 0xb2, 0x85, 0x06, 0x54, 0x4a, 0x79, 0xa1, 0x6a, - 0x5c, 0x2e, 0x85, 0x2b, 0x63, 0x6b, 0xf4, 0x30, 0xd3, 0xaa, 0x78, 0x15, 0x57, 0x48, 0xc7, 0xd7, 0x88, 0x45, 0xe8, - 0xb2, 0x0c, 0x12, 0x1e, 0xce, 0x72, 0x2e, 0x79, 0x72, 0x0d, 0x56, 0x3c, 0xb7, 0x60, 0x0e, 0x66, 0x5d, 0xab, 0x27, - 0xd5, 0xd8, 0x80, 0x91, 0x14, 0xf9, 0x2a, 0xa6, 0x73, 0xd5, 0x01, 0x75, 0x5c, 0x43, 0x60, 0x16, 0xee, 0x23, 0x3f, - 0x4a, 0x49, 0xaf, 0x94, 0x91, 0x33, 0xdc, 0x56, 0x49, 0x36, 0xe3, 0x64, 0x24, 0xdc, 0xd1, 0xc6, 0xce, 0x45, 0x01, - 0x3f, 0x0a, 0x39, 0x53, 0x02, 0x1a, 0xd2, 0x10, 0x49, 0x2e, 0x76, 0xcf, 0x13, 0xab, 0x21, 0xd2, 0x93, 0x05, 0x05, - 0x10, 0x79, 0x58, 0xfb, 0x60, 0x49, 0x79, 0x34, 0xb5, 0x80, 0x89, 0x79, 0xae, 0xfc, 0xa8, 0xbd, 0x85, 0xaf, 0xd6, - 0xa1, 0x04, 0xcc, 0xe1, 0xcb, 0x24, 0xd6, 0x4a, 0x9b, 0xf1, 0xb8, 0x2c, 0x8f, 0xca, 0x5b, 0xcb, 0x6a, 0xba, 0xa2, - 0x7a, 0xd0, 0x98, 0x1e, 0xae, 0x53, 0x62, 0x6c, 0x2c, 0xb3, 0x4e, 0x5c, 0x2a, 0xe6, 0xbf, 0x4f, 0x5f, 0xaa, 0x8b, - 0xaa, 0x96, 0x6f, 0x23, 0xae, 0x67, 0x8c, 0x6a, 0x51, 0xc3, 0x03, 0xe6, 0x5f, 0x96, 0x31, 0x2c, 0xd7, 0x04, 0xb3, - 0x5c, 0x13, 0xbd, 0xad, 0x86, 0xa0, 0xed, 0x78, 0x14, 0x95, 0xa0, 0x1b, 0x31, 0xa0, 0x91, 0x52, 0x23, 0x60, 0x9b, - 0x14, 0x62, 0xf0, 0x1b, 0xb0, 0x3f, 0x76, 0x08, 0x48, 0x05, 0x47, 0xf0, 0x80, 0x70, 0xc9, 0x71, 0xf9, 0x61, 0xd2, - 0xdd, 0x42, 0x02, 0xa9, 0x78, 0x39, 0x2b, 0x9f, 0x96, 0x08, 0x46, 0x31, 0x28, 0x8b, 0xd0, 0x0c, 0x91, 0x52, 0x37, - 0x2b, 0x32, 0xea, 0xe0, 0x8d, 0xc1, 0x37, 0x22, 0x06, 0xbc, 0x52, 0x50, 0xc8, 0x63, 0x4e, 0x4e, 0x96, 0xcb, 0xd7, - 0xb9, 0x4b, 0x7f, 0x47, 0x4f, 0xe5, 0x38, 0x75, 0x47, 0xd0, 0xa6, 0x8f, 0x62, 0x9c, 0x8b, 0x4a, 0x82, 0xeb, 0xe5, - 0xb4, 0xf7, 0x98, 0xd1, 0x7c, 0xe1, 0xea, 0x69, 0x3c, 0x68, 0x8b, 0xdf, 0x8f, 0x39, 0xfb, 0xf0, 0x29, 0x35, 0xba, - 0x80, 0x02, 0x0f, 0x3b, 0x75, 0xdb, 0xc8, 0x29, 0x46, 0x80, 0xbf, 0xad, 0xaf, 0xc7, 0xa3, 0xcd, 0x96, 0xb9, 0x20, - 0x35, 0xec, 0x1b, 0x7c, 0x39, 0x18, 0x7f, 0x45, 0xb4, 0xc3, 0xd7, 0x64, 0xdd, 0x43, 0x83, 0xee, 0x5e, 0xd6, 0xf0, - 0x05, 0x0b, 0x74, 0x7e, 0x89, 0x21, 0x6f, 0xd9, 0x81, 0xe5, 0x3e, 0xcf, 0xf5, 0x04, 0x99, 0xc6, 0xc3, 0x78, 0x0d, - 0xc8, 0x35, 0x9e, 0xe5, 0xbd, 0x1b, 0xf5, 0x7b, 0xb6, 0x9c, 0x77, 0xc4, 0xd6, 0xd4, 0xbb, 0x6c, 0x03, 0x8c, 0xa3, - 0xea, 0x7f, 0xdf, 0x54, 0x22, 0x18, 0x99, 0xa1, 0x7d, 0x5a, 0xeb, 0xa3, 0xca, 0xd3, 0xff, 0x37, 0xb3, 0x75, 0x61, - 0x65, 0x98, 0x43, 0x30, 0xe3, 0x2b, 0x7c, 0x9a, 0x71, 0x1e, 0x44, 0x78, 0x20, 0xed, 0x5e, 0x66, 0x37, 0xd6, 0x9c, - 0xd1, 0x8f, 0xd0, 0x9d, 0x92, 0xec, 0x02, 0xc7, 0xf1, 0x6f, 0x83, 0x9e, 0x0a, 0xb5, 0x1f, 0xd5, 0x81, 0xc5, 0xdf, - 0x05, 0xa9, 0x09, 0xc9, 0x50, 0x80, 0x03, 0xb9, 0x6a, 0xd9, 0x7b, 0xba, 0x9d, 0x5d, 0x4c, 0x13, 0xc4, 0xa5, 0xb3, - 0xd5, 0x97, 0xd7, 0xad, 0x17, 0x68, 0xdf, 0xec, 0xfd, 0x68, 0x63, 0xa6, 0x98, 0xc7, 0xeb, 0xbb, 0xa6, 0xe3, 0x37, - 0x14, 0x86, 0xd6, 0xf8, 0x2a, 0x62, 0xba, 0x6f, 0x68, 0xde, 0xcb, 0xb5, 0x37, 0xed, 0x3d, 0x7e, 0xb1, 0xd7, 0xea, - 0x2c, 0xb0, 0xf1, 0x46, 0x01, 0x57, 0x26, 0x2e, 0x67, 0x94, 0xe4, 0xc3, 0x0d, 0x82, 0xeb, 0xf8, 0xd1, 0xaa, 0x19, - 0xee, 0x7a, 0x7c, 0xa3, 0x13, 0x96, 0x61, 0x60, 0xba, 0x85, 0xeb, 0x40, 0x8c, 0x61, 0x6c, 0x11, 0x42, 0x91, 0xfa, - 0x91, 0xc6, 0x30, 0x0a, 0xc6, 0xcf, 0x4f, 0xd6, 0x98, 0xd9, 0xf1, 0x1f, 0x51, 0x00, 0xae, 0x5d, 0x84, 0x23, 0x30, - 0xcc, 0x2c, 0xa8, 0x50, 0xe1, 0x42, 0x1f, 0x89, 0x2b, 0x9b, 0xb2, 0xa7, 0xf0, 0x02, 0xf2, 0x25, 0xa6, 0xfd, 0x51, - 0xd7, 0xf9, 0x83, 0x13, 0xf9, 0x49, 0xed, 0xee, 0xf7, 0x4a, 0xb7, 0x17, 0xe1, 0x32, 0xd3, 0x75, 0xc4, 0x00, 0xc9, - 0x63, 0x30, 0xc1, 0x68, 0x31, 0x64, 0xc7, 0x4d, 0xed, 0x59, 0x9d, 0xce, 0xc9, 0xf1, 0xe0, 0x7f, 0xad, 0x82, 0xd9, - 0xf8, 0x28, 0xde, 0x56, 0x8d, 0x9c, 0xed, 0x49, 0xba, 0xf9, 0x63, 0xa5, 0xc9, 0xec, 0xff, 0x61, 0x7e, 0x9d, 0x05, - 0x0b, 0xe6, 0x8b, 0x45, 0x8b, 0xac, 0x21, 0x6a, 0x80, 0x1f, 0xee, 0x34, 0xa6, 0x7c, 0x46, 0x19, 0x61, 0xab, 0x5a, - 0x2b, 0x6d, 0x68, 0x80, 0xe6, 0x94, 0x9d, 0x20, 0x45, 0x09, 0x24, 0xef, 0x58, 0x85, 0x91, 0xf9, 0xc0, 0x30, 0x78, - 0xec, 0x7d, 0x6a, 0xdd, 0x9a, 0xa2, 0xae, 0xf0, 0x3e, 0xd1, 0xd8, 0x8d, 0x59, 0x29, 0xf5, 0x73, 0x2b, 0xf4, 0x1f, - 0xd1, 0x0b, 0x11, 0x58, 0x22, 0x3f, 0x04, 0xf5, 0x93, 0xa0, 0x96, 0xf5, 0x27, 0x95, 0xb7, 0x7c, 0x6e, 0xcf, 0x2e, - 0xb6, 0xe5, 0xd3, 0x5c, 0x67, 0x20, 0xb1, 0x33, 0xbe, 0xa9, 0x2f, 0xbe, 0x48, 0xb5, 0x96, 0x5b, 0xba, 0xe5, 0xd1, - 0x34, 0xc4, 0xe8, 0x00, 0x80, 0x94, 0x01, 0xe3, 0x27, 0xf8, 0x81, 0x3a, 0xe3, 0x9f, 0xcf, 0x6f, 0xea, 0x9c, 0xea, - 0xaf, 0xde, 0x48, 0xe8, 0x2d, 0x2d, 0x01, 0xdf, 0x85, 0xfc, 0xdf, 0xfe, 0x95, 0x6e, 0x1d, 0x63, 0x45, 0x60, 0x76, - 0x70, 0x75, 0x92, 0x9d, 0xe9, 0x69, 0x6b, 0xe2, 0x2a, 0x06, 0xef, 0x87, 0x68, 0x9d, 0xfb, 0x91, 0xc0, 0x68, 0x0a, - 0x6f, 0xb3, 0xd8, 0xb4, 0x55, 0xae, 0x57, 0x33, 0x61, 0xb6, 0x8d, 0x2e, 0x91, 0x1a, 0x82, 0xeb, 0x7d, 0x2c, 0xa3, - 0x8b, 0x27, 0x83, 0xb3, 0xba, 0xbe, 0x64, 0x2a, 0xc0, 0x85, 0x14, 0xf5, 0x27, 0xca, 0xb2, 0xdd, 0xa3, 0x2e, 0x35, - 0xdd, 0x1f, 0xb4, 0x76, 0xcf, 0xa5, 0xc5, 0x36, 0x5d, 0x36, 0x7d, 0x6a, 0x3d, 0x10, 0xc1, 0xbe, 0xa5, 0x1b, 0xf6, - 0x02, 0x00, 0x1d, 0xe0, 0x85, 0x6a, 0x13, 0x5d, 0x57, 0xfd, 0x63, 0x0f, 0x48, 0x6b, 0x7c, 0x8f, 0x4d, 0xaa, 0xdc, - 0xc8, 0xa4, 0xda, 0x45, 0x82, 0xb2, 0xc3, 0xf8, 0xf8, 0x0e, 0x7b, 0xad, 0x87, 0x17, 0x6a, 0x55, 0x0a, 0x6b, 0xcb, - 0xdc, 0x9b, 0x31, 0xa9, 0x69, 0xeb, 0x0f, 0x5e, 0x0b, 0xeb, 0x86, 0x2e, 0x85, 0xcb, 0xe2, 0x51, 0xab, 0x03, 0x90, - 0x93, 0x0d, 0x84, 0x70, 0xc4, 0xd3, 0x3f, 0x92, 0x9c, 0x02, 0xbc, 0x0e, 0xdc, 0x15, 0xc7, 0xec, 0xb2, 0x1d, 0x77, - 0xc3, 0x96, 0x5b, 0xf8, 0xb3, 0x5b, 0x20, 0xc5, 0xba, 0xea, 0xdc, 0xb0, 0x83, 0xd7, 0x65, 0x8a, 0xa0, 0x54, 0x48, - 0x40, 0x38, 0x5c, 0xce, 0x2e, 0x05, 0xa1, 0x24, 0x60, 0xac, 0x0a, 0xf7, 0x87, 0xb2, 0xb7, 0xdd, 0x6e, 0xd8, 0x92, - 0x47, 0x92, 0x61, 0xa0, 0x6a, 0x3d, 0xa6, 0xf5, 0xaf, 0x76, 0x3a, 0x81, 0x4a, 0xd6, 0x6c, 0x7a, 0xa4, 0x7f, 0x58, - 0x8f, 0xf4, 0x52, 0xf0, 0x48, 0xc4, 0xe2, 0x1d, 0x19, 0xa3, 0xab, 0x1f, 0x2f, 0x90, 0xd9, 0x3b, 0x2e, 0x7e, 0x98, - 0xc3, 0xda, 0xb0, 0xcb, 0x80, 0x27, 0x98, 0x49, 0x83, 0x7a, 0xd5, 0x55, 0xf4, 0x54, 0x90, 0x0e, 0x8b, 0x86, 0x81, - 0x85, 0x53, 0xea, 0x57, 0xe9, 0x2d, 0x6f, 0x74, 0x16, 0x34, 0x86, 0x12, 0x2d, 0x65, 0xa1, 0x2c, 0x37, 0x93, 0x87, - 0x0d, 0x25, 0x2b, 0xae, 0xa9, 0x6d, 0x67, 0xab, 0x68, 0xd1, 0x0a, 0xc2, 0x1f, 0xd7, 0x30, 0x23, 0xea, 0x2f, 0x64, - 0x9a, 0x75, 0x3b, 0xfc, 0x0c, 0x69, 0xb5, 0xa4, 0x76, 0x6e, 0x81, 0xf6, 0x82, 0x06, 0xfc, 0x1a, 0x82, 0xd6, 0x92, - 0x52, 0x13, 0x9f, 0xd6, 0xb9, 0xe0, 0xf1, 0x86, 0xe1, 0xd3, 0x26, 0xa9, 0x97, 0xd9, 0xc6, 0xd5, 0x0d, 0x4f, 0x73, - 0x29, 0x3a, 0x18, 0x74, 0x90, 0x90, 0x52, 0x73, 0xa8, 0xc8, 0xdf, 0x5d, 0xac, 0x0b, 0xa7, 0x09, 0xc9, 0x66, 0x2a, - 0x59, 0x4e, 0x4a, 0xf6, 0x8c, 0x10, 0x47, 0x3f, 0x20, 0x65, 0xf2, 0x08, 0x35, 0xc9, 0xab, 0x17, 0x90, 0xc9, 0xeb, - 0x51, 0x4b, 0x8a, 0x0b, 0x6d, 0x32, 0xb1, 0x14, 0x70, 0x32, 0x8e, 0x20, 0x13, 0xac, 0xa7, 0x64, 0x75, 0x0d, 0x90, - 0xf4, 0x92, 0x3c, 0x35, 0xb0, 0x60, 0x6a, 0xef, 0x94, 0x02, 0x8b, 0x14, 0x80, 0xa1, 0x9d, 0x34, 0x2a, 0x4b, 0xf2, - 0x58, 0x76, 0xdf, 0x96, 0x65, 0x4f, 0xa1, 0xa0, 0x60, 0xc4, 0xd9, 0x63, 0x9f, 0x9d, 0x05, 0x82, 0xf2, 0x70, 0x06, - 0x65, 0xfa, 0x9c, 0x60, 0x23, 0xcf, 0x11, 0x2c, 0xf2, 0x62, 0x40, 0x8e, 0x2a, 0x5e, 0xd6, 0x08, 0xff, 0xd5, 0x02, - 0xb9, 0xc0, 0xe0, 0xe1, 0x9e, 0x74, 0x7a, 0xad, 0xdf, 0x94, 0x53, 0x50, 0x30, 0xfa, 0x94, 0xd5, 0xcd, 0x38, 0x37, - 0xd4, 0x32, 0x9a, 0x31, 0xf5, 0x67, 0xee, 0xe2, 0x49, 0xbe, 0x55, 0x32, 0xa3, 0x22, 0x93, 0x89, 0x17, 0x7e, 0x00, - 0x3b, 0x3f, 0x2f, 0x26, 0x06, 0x85, 0x27, 0x2e, 0xea, 0x98, 0x11, 0x87, 0xb8, 0x2a, 0x27, 0xbf, 0x2d, 0xc0, 0xa8, - 0xc1, 0x60, 0x72, 0x8b, 0x7a, 0x4d, 0xa9, 0xf7, 0x50, 0x9f, 0x19, 0x0c, 0xb5, 0x71, 0xac, 0x57, 0x56, 0x82, 0x0d, - 0x0d, 0x2f, 0xf9, 0x54, 0xcd, 0x3a, 0x8c, 0x15, 0x7e, 0xa5, 0x02, 0xcc, 0x05, 0xa6, 0x79, 0x1a, 0x87, 0x80, 0x95, - 0x96, 0x6a, 0x18, 0x7d, 0x75, 0xee, 0x10, 0x4a, 0xdd, 0xe8, 0x05, 0x6c, 0x00, 0xc3, 0x21, 0xa2, 0x2d, 0x7a, 0x79, - 0xe1, 0x2b, 0x0d, 0x52, 0xb5, 0x23, 0x4b, 0x5e, 0x1d, 0x72, 0x22, 0x8f, 0x27, 0xe2, 0x7f, 0x26, 0x0c, 0x49, 0x9b, - 0x1b, 0x88, 0xb7, 0x94, 0xdd, 0xd4, 0x71, 0x9a, 0x39, 0x48, 0xef, 0xe9, 0x60, 0xaf, 0x95, 0xaf, 0x6c, 0x93, 0x19, - 0x7a, 0x35, 0x1a, 0x87, 0x82, 0xb4, 0xbc, 0x98, 0x2d, 0x32, 0x69, 0x12, 0xdd, 0x96, 0x16, 0x03, 0x7a, 0x88, 0xec, - 0xcc, 0x43, 0xb1, 0xe2, 0x7d, 0x3d, 0x99, 0x16, 0x14, 0x1d, 0xc2, 0x2d, 0xe4, 0x26, 0x1a, 0xf5, 0x13, 0x5d, 0xb5, - 0x2b, 0x94, 0xd9, 0x7e, 0x26, 0x74, 0x80, 0x97, 0x16, 0x27, 0x00, 0xec, 0xd1, 0x34, 0x2e, 0xb8, 0x6d, 0x09, 0xc3, - 0xd4, 0x86, 0x6a, 0x2e, 0x3b, 0xdd, 0xd6, 0x99, 0x5c, 0x0b, 0x14, 0x83, 0x00, 0x3a, 0xcf, 0x37, 0xef, 0x4f, 0x5e, - 0xfe, 0x0c, 0xc7, 0xb1, 0x83, 0xd1, 0xc9, 0x8c, 0xaa, 0xb8, 0x4d, 0xa2, 0xde, 0x6f, 0xe9, 0xa6, 0x81, 0xbc, 0xef, - 0x41, 0x35, 0x7b, 0xd6, 0xef, 0x4e, 0xd7, 0xc6, 0x3b, 0xf5, 0x9b, 0xd9, 0x00, 0xa0, 0xbc, 0x48, 0x9a, 0x0f, 0x70, - 0xdc, 0xe0, 0xe7, 0x19, 0xab, 0x15, 0x6a, 0x24, 0x22, 0x88, 0x02, 0x12, 0xa6, 0xfe, 0x59, 0x38, 0xbc, 0xc7, 0x77, - 0x2c, 0x3b, 0x51, 0x70, 0x48, 0xea, 0xab, 0xc1, 0xd1, 0x83, 0x6e, 0x4c, 0x05, 0xc3, 0x1a, 0xe3, 0x84, 0x9b, 0x6f, - 0xb1, 0xef, 0x5a, 0x2b, 0x8a, 0xeb, 0xc2, 0x3e, 0xf7, 0x9d, 0xa2, 0x9e, 0x7d, 0x76, 0x43, 0x8f, 0xf3, 0xe0, 0x15, - 0x53, 0x56, 0x29, 0xd6, 0x5d, 0x8e, 0x3c, 0x3e, 0x01, 0x52, 0xf3, 0x5d, 0xc9, 0xdf, 0x60, 0xac, 0x20, 0x0a, 0xbc, - 0x5f, 0x6d, 0x8a, 0x74, 0x39, 0xb1, 0x22, 0x0a, 0x83, 0x20, 0xf3, 0x2a, 0x42, 0xbc, 0xa2, 0x92, 0xdf, 0xb7, 0x03, - 0x38, 0x81, 0x3c, 0x1c, 0xb6, 0x09, 0xbe, 0xdf, 0xd1, 0x40, 0xa8, 0x18, 0x37, 0xd2, 0x76, 0x4b, 0x4e, 0x37, 0x8c, - 0x7b, 0x3a, 0x69, 0xf6, 0x26, 0x91, 0x9b, 0x44, 0x0d, 0x47, 0x11, 0xcb, 0xd7, 0x64, 0x77, 0x45, 0x81, 0x42, 0x80, - 0xc8, 0x2e, 0xf9, 0x1c, 0x96, 0x9a, 0xca, 0xf5, 0xb5, 0xe4, 0x17, 0x48, 0x82, 0x8c, 0xdb, 0x40, 0xea, 0x9f, 0x14, - 0xa1, 0xec, 0x1c, 0xb5, 0x61, 0xc7, 0x8f, 0x26, 0xaa, 0x0e, 0x76, 0xa7, 0x55, 0x9b, 0x1d, 0x8d, 0x60, 0xdf, 0x6b, - 0x85, 0x96, 0x83, 0xd6, 0x59, 0x9f, 0x9a, 0xdc, 0x10, 0x3f, 0x3e, 0xe7, 0x72, 0x80, 0x00, 0x3a, 0x59, 0xa0, 0xc2, - 0xfd, 0xd0, 0x51, 0xdf, 0xae, 0x0e, 0x69, 0x02, 0x45, 0xe5, 0xa0, 0xb8, 0xe3, 0x38, 0x85, 0x5d, 0x91, 0x1d, 0xfd, - 0x42, 0x34, 0x4e, 0xd8, 0xe1, 0x23, 0x6b, 0x9a, 0x3f, 0xc4, 0x09, 0xca, 0x17, 0xf3, 0x50, 0x70, 0x89, 0x3a, 0x1b, - 0x52, 0x46, 0x00, 0x74, 0x47, 0xbb, 0xf5, 0x90, 0x7e, 0x5c, 0xdb, 0x14, 0x7b, 0xee, 0x09, 0xfa, 0xbc, 0x6f, 0x60, - 0xdc, 0x11, 0xd8, 0xd1, 0x40, 0x12, 0xda, 0x47, 0x95, 0xfa, 0x33, 0x8f, 0xc5, 0x98, 0xd9, 0xa7, 0xdb, 0x66, 0x82, - 0xca, 0x9d, 0xec, 0x52, 0x09, 0xd2, 0xe0, 0x0d, 0xf2, 0x70, 0xd8, 0xd7, 0xfd, 0x5e, 0x6a, 0xda, 0xe6, 0xc9, 0xed, - 0x2b, 0xab, 0xd5, 0x94, 0xef, 0x76, 0x99, 0x40, 0x7c, 0x71, 0x0e, 0x65, 0xbc, 0xe7, 0x81, 0xaa, 0xef, 0x1b, 0x59, - 0x43, 0xc0, 0x7d, 0xb3, 0x30, 0xcc, 0x09, 0x3a, 0xc2, 0x20, 0x69, 0xe6, 0xc1, 0x9f, 0x00, 0x6d, 0xde, 0xcb, 0xeb, - 0x55, 0x88, 0x73, 0x40, 0x77, 0xf8, 0xf2, 0x84, 0xb5, 0x8e, 0xd8, 0xe3, 0x83, 0x79, 0xc6, 0x28, 0x37, 0xbc, 0x44, - 0xc7, 0x88, 0xdb, 0xde, 0x95, 0x17, 0x32, 0x5d, 0x3e, 0xfb, 0x96, 0x04, 0xbe, 0x31, 0x52, 0x81, 0x14, 0x68, 0xc4, - 0xb1, 0x0f, 0x36, 0xdf, 0x87, 0x43, 0xb3, 0x5f, 0xe8, 0x8d, 0xc2, 0xf4, 0x72, 0xfc, 0xe5, 0xc6, 0xfc, 0x16, 0x8e, - 0xb8, 0xda, 0x2a, 0xc4, 0xc3, 0x5e, 0x8e, 0xb9, 0xd0, 0x9a, 0x07, 0xbf, 0x30, 0x27, 0xcb, 0x42, 0xe2, 0xdd, 0x45, - 0x7d, 0xc3, 0x7a, 0xcd, 0x96, 0x3d, 0x93, 0x59, 0x13, 0x0f, 0x92, 0xf5, 0xb4, 0xf2, 0x70, 0x7a, 0x2a, 0xcf, 0xb1, - 0xd9, 0x0b, 0x0b, 0xb2, 0xa1, 0xab, 0xa7, 0xb6, 0x5c, 0xf7, 0xd6, 0x34, 0x24, 0x2f, 0xf1, 0x8b, 0xab, 0x68, 0x01, - 0x4a, 0x4c, 0xd4, 0xce, 0xac, 0x5d, 0x90, 0x0a, 0xf6, 0x7a, 0x59, 0x40, 0x83, 0x63, 0xe5, 0xd8, 0x96, 0xd0, 0x53, - 0x91, 0x19, 0x9f, 0x55, 0x29, 0x20, 0x7d, 0x4d, 0xd4, 0xed, 0x45, 0x54, 0x5a, 0x42, 0x82, 0xc0, 0xc7, 0x4f, 0x92, - 0x52, 0xec, 0xcb, 0x0d, 0x20, 0x30, 0x54, 0xbc, 0xef, 0x02, 0xbe, 0xbf, 0xa9, 0x48, 0x64, 0x72, 0xb0, 0x92, 0xf7, - 0x44, 0x97, 0x14, 0xf8, 0x9f, 0x9f, 0xef, 0xac, 0x54, 0x2a, 0x72, 0x39, 0x86, 0x11, 0xc5, 0x5e, 0x33, 0x45, 0x61, - 0x6e, 0x1a, 0xa1, 0x20, 0x50, 0xcb, 0x3f, 0x5c, 0x7f, 0xa1, 0xbf, 0xa4, 0x04, 0xa7, 0x96, 0x40, 0x5c, 0x5e, 0x9d, - 0x87, 0x04, 0x67, 0xf5, 0x16, 0x79, 0xac, 0x20, 0xd8, 0x63, 0xae, 0x35, 0x3b, 0xcc, 0x81, 0x64, 0x57, 0x0b, 0x8c, - 0xb6, 0x44, 0x29, 0xf5, 0x02, 0x62, 0x97, 0x4c, 0xf7, 0x75, 0x45, 0x91, 0xee, 0x51, 0xf4, 0x98, 0xca, 0x68, 0x39, - 0x3e, 0xd1, 0xd8, 0xdf, 0x18, 0xaa, 0x96, 0xfa, 0x2a, 0x7b, 0xc2, 0xd7, 0xbb, 0xc3, 0x17, 0x1b, 0x3f, 0x12, 0xfe, - 0x3e, 0x57, 0x4c, 0x3f, 0x67, 0xf7, 0xa3, 0x5d, 0xc2, 0x68, 0xa0, 0x7a, 0xae, 0x39, 0x6e, 0x2c, 0x37, 0x5e, 0x6e, - 0x5f, 0x74, 0xc5, 0x56, 0x99, 0x9f, 0xbb, 0x05, 0xb9, 0x26, 0xdd, 0x6b, 0x32, 0xcf, 0x49, 0x6e, 0xf0, 0xce, 0xf4, - 0x20, 0x9d, 0x08, 0xae, 0xfd, 0xcb, 0xf3, 0xaf, 0x3b, 0x5c, 0x85, 0x6d, 0x5b, 0x91, 0x57, 0x66, 0x40, 0x39, 0xb4, - 0xdb, 0x04, 0xd4, 0x97, 0x6e, 0xd2, 0x1d, 0xd1, 0x36, 0xb6, 0xf0, 0x12, 0xe2, 0x35, 0x50, 0xdc, 0xd2, 0xc4, 0x57, - 0x67, 0xa3, 0x90, 0xa6, 0x64, 0xb2, 0x07, 0x84, 0x62, 0xc2, 0x02, 0xfd, 0xd3, 0x71, 0xd2, 0xac, 0x0a, 0x5a, 0xef, - 0x95, 0xaa, 0x8e, 0x95, 0xd3, 0xd5, 0x57, 0x61, 0x66, 0xa3, 0x19, 0xf1, 0x20, 0x27, 0x1b, 0x87, 0x28, 0x77, 0x9d, - 0xe9, 0xe8, 0x50, 0x3c, 0xa6, 0xdc, 0x49, 0x9d, 0x5c, 0x9c, 0xb3, 0x23, 0x09, 0xc5, 0x7f, 0xeb, 0x9c, 0x08, 0x85, - 0x6f, 0x61, 0x2b, 0x02, 0xf9, 0xda, 0xb4, 0xfc, 0xaf, 0x1d, 0xf5, 0x39, 0xe1, 0x8e, 0x76, 0xe5, 0x6a, 0xc6, 0x29, - 0xb2, 0xe1, 0x40, 0xe6, 0xe3, 0x46, 0x05, 0xaf, 0x3c, 0x55, 0x65, 0xbf, 0x8d, 0x98, 0xf4, 0x89, 0x3d, 0x9b, 0x1c, - 0x26, 0xa5, 0xa3, 0xf6, 0x13, 0x5c, 0x16, 0x1d, 0x4c, 0xc3, 0xa2, 0x0d, 0x11, 0x20, 0x6a, 0xb5, 0xd1, 0x0e, 0x8b, - 0x88, 0x04, 0x8d, 0x2f, 0x56, 0x2f, 0xe3, 0x81, 0x8f, 0xe6, 0x18, 0xc5, 0x3e, 0x6d, 0x6b, 0x49, 0xf6, 0xbd, 0x31, - 0x46, 0xca, 0x40, 0x7d, 0xa2, 0x73, 0xa0, 0x4c, 0x2c, 0xf2, 0x31, 0xc9, 0x4b, 0x2d, 0x56, 0xb8, 0x4b, 0x5e, 0x47, - 0x25, 0x60, 0x45, 0xf2, 0x57, 0x70, 0x19, 0x25, 0x08, 0x46, 0x8f, 0xa2, 0x2f, 0xfd, 0x12, 0xdc, 0x72, 0xdf, 0x1f, - 0x32, 0x05, 0x76, 0x8a, 0xb1, 0x8f, 0x18, 0xbd, 0x94, 0x22, 0xf3, 0x21, 0x12, 0x8f, 0xdf, 0xb3, 0x04, 0x29, 0x28, - 0x7d, 0x69, 0x1b, 0x60, 0x70, 0x13, 0xe8, 0xb2, 0x6e, 0x6a, 0x9c, 0x01, 0x72, 0x22, 0x57, 0xd4, 0x76, 0xdc, 0xf3, - 0xc9, 0x0e, 0x05, 0x6d, 0x0d, 0x32, 0x66, 0x7a, 0xa1, 0x59, 0xa2, 0xc0, 0xf0, 0xfd, 0x56, 0xe3, 0x28, 0x18, 0xb0, - 0x6b, 0xac, 0x47, 0xbf, 0x52, 0xd2, 0x21, 0x53, 0xfa, 0x91, 0x16, 0xce, 0xe5, 0x4c, 0xa6, 0x7a, 0xf3, 0x7b, 0x21, - 0x05, 0x10, 0x17, 0x6f, 0x25, 0xa2, 0xb7, 0x64, 0x7f, 0x1d, 0x14, 0xa0, 0x60, 0x1a, 0x19, 0x23, 0xfd, 0x5f, 0x2c, - 0x0b, 0x72, 0x3b, 0x0a, 0x6b, 0x86, 0x04, 0x06, 0x15, 0x1f, 0x77, 0x68, 0x8e, 0xbf, 0x0e, 0xff, 0x6b, 0x03, 0x50, - 0x57, 0xee, 0xbc, 0xa1, 0xac, 0xf9, 0x01, 0x29, 0x45, 0x66, 0x2f, 0xdf, 0xbd, 0x6a, 0x85, 0x3a, 0x68, 0xb1, 0xcd, - 0x75, 0x9e, 0xd7, 0x16, 0xbf, 0x9e, 0x42, 0xb7, 0x37, 0xf9, 0xcd, 0x6c, 0x57, 0x5d, 0x3d, 0x36, 0x6a, 0xd4, 0x1b, - 0x04, 0xa3, 0xb7, 0x37, 0xc3, 0x6e, 0x9d, 0x0f, 0x67, 0x25, 0xa0, 0x95, 0xcd, 0x5e, 0xfd, 0x9b, 0x08, 0x0a, 0x7d, - 0xad, 0x9f, 0x47, 0xba, 0xca, 0xb8, 0x7c, 0x96, 0x80, 0x97, 0xc6, 0x87, 0x46, 0x95, 0x6a, 0x59, 0x58, 0xb2, 0x26, - 0x11, 0x08, 0x0e, 0x7f, 0xd0, 0xac, 0x67, 0xda, 0x8f, 0xea, 0x36, 0xdf, 0xd4, 0x75, 0x15, 0x41, 0xfb, 0x11, 0xd6, - 0x74, 0xa5, 0xff, 0x37, 0x71, 0x78, 0x38, 0x45, 0xff, 0xa3, 0xf9, 0x83, 0x82, 0xed, 0xdd, 0x66, 0x53, 0x42, 0x85, - 0x6b, 0xe6, 0x5e, 0x3d, 0xc5, 0x33, 0x45, 0x62, 0x17, 0xa5, 0x67, 0x55, 0xdb, 0xc1, 0xb2, 0xa1, 0xb6, 0xd7, 0x90, - 0xb0, 0x45, 0x90, 0x6a, 0x0a, 0xc6, 0xcd, 0xd3, 0x3b, 0xdc, 0x1d, 0x71, 0xcc, 0xa0, 0x1c, 0x1a, 0x45, 0x99, 0xdf, - 0x0e, 0x93, 0xe6, 0x54, 0x6d, 0x6f, 0x51, 0xe0, 0x47, 0x00, 0x9f, 0x2b, 0x6a, 0x07, 0xf2, 0xf4, 0x61, 0x94, 0xaf, - 0x27, 0xb9, 0xef, 0xc4, 0x11, 0x09, 0xd6, 0x0e, 0x6c, 0x79, 0xc9, 0xab, 0xd3, 0x95, 0xd5, 0x3d, 0x89, 0xaf, 0x3b, - 0xc6, 0xf9, 0x21, 0x71, 0xed, 0x47, 0x4f, 0x53, 0x0e, 0xdb, 0xa2, 0x9e, 0xe0, 0xb0, 0x38, 0xb4, 0xdd, 0x10, 0xdd, - 0x76, 0x96, 0x46, 0xef, 0x00, 0x6d, 0xb1, 0xc9, 0x8b, 0x27, 0x9d, 0x63, 0x5c, 0x1f, 0x2e, 0x27, 0x69, 0xd9, 0x3f, - 0x95, 0x1a, 0xa2, 0xbe, 0xa5, 0x74, 0x8f, 0xd4, 0x1d, 0x1d, 0x6c, 0xcd, 0xde, 0x3f, 0x16, 0xcd, 0x43, 0xe4, 0xb5, - 0x1c, 0x36, 0x6d, 0x52, 0xce, 0x87, 0x2f, 0x1b, 0x7d, 0x59, 0x5e, 0x6d, 0x4a, 0xb6, 0x41, 0xea, 0x4c, 0xb4, 0x79, - 0x0c, 0xa8, 0x6f, 0x0d, 0xbd, 0x0a, 0xbe, 0x60, 0xcd, 0x16, 0xfa, 0xe6, 0xbc, 0x5b, 0x60, 0x2c, 0xc1, 0x67, 0x0c, - 0x6d, 0x73, 0xee, 0xbe, 0x93, 0xee, 0xb3, 0x1c, 0xa6, 0x5c, 0x54, 0x4e, 0x51, 0x22, 0x89, 0xba, 0xff, 0x2f, 0xaf, - 0xf7, 0x52, 0x46, 0x7a, 0x79, 0x42, 0x87, 0x9d, 0xc2, 0xc3, 0x25, 0xab, 0x80, 0x62, 0xac, 0xad, 0xf4, 0xbc, 0x72, - 0x0a, 0x52, 0xa3, 0xa3, 0xb8, 0xd0, 0x7f, 0xf8, 0xca, 0x5d, 0xef, 0x36, 0xd6, 0xf4, 0x63, 0xca, 0x92, 0xbf, 0xf6, - 0x8d, 0x04, 0x6d, 0x5d, 0x11, 0x99, 0xfc, 0x9f, 0x48, 0x4c, 0x8e, 0x2c, 0xc4, 0xa3, 0x03, 0x68, 0x60, 0xa7, 0x4e, - 0xb6, 0xa0, 0xc5, 0x24, 0x09, 0x88, 0x2e, 0xd1, 0x1c, 0x4e, 0x00, 0x6d, 0xd2, 0x12, 0x4c, 0xc8, 0x6f, 0xf4, 0xbe, - 0xcb, 0x98, 0x27, 0xfc, 0x65, 0x1e, 0x4e, 0xa0, 0xfb, 0xe0, 0xd0, 0xa2, 0x09, 0x58, 0x45, 0x92, 0x86, 0xb5, 0xb6, - 0x9d, 0x0f, 0x27, 0xdb, 0x09, 0x49, 0xaa, 0xf7, 0xfb, 0xdc, 0x90, 0x42, 0xc8, 0xed, 0x28, 0x45, 0x4d, 0xe7, 0x7c, - 0xd5, 0xea, 0xcd, 0x21, 0xd6, 0xc5, 0x0c, 0x75, 0xcf, 0x40, 0x49, 0xdb, 0xce, 0x16, 0xe8, 0xf6, 0x09, 0xff, 0xf8, - 0xcb, 0x40, 0x13, 0x14, 0xcd, 0x1a, 0xb0, 0xa4, 0x00, 0xdc, 0xc6, 0x9c, 0xef, 0x35, 0x4f, 0xa9, 0xa2, 0xba, 0x83, - 0x30, 0x77, 0xd8, 0x90, 0x62, 0x54, 0xf7, 0xe1, 0x84, 0x05, 0x41, 0xbc, 0xf6, 0x44, 0x0e, 0x22, 0x3d, 0xa8, 0x4f, - 0x3a, 0x10, 0x32, 0xeb, 0x81, 0xb3, 0x86, 0x55, 0xd2, 0xad, 0xae, 0x59, 0xd7, 0x19, 0x7f, 0xf2, 0x43, 0xd6, 0xd9, - 0x40, 0xff, 0x64, 0xa3, 0xa4, 0x73, 0x5d, 0x44, 0x04, 0x4f, 0xe2, 0x65, 0x0e, 0x94, 0xe7, 0x3d, 0x4d, 0x39, 0xb5, - 0xfc, 0xf8, 0xef, 0x5b, 0x32, 0x87, 0xfa, 0x92, 0x35, 0xf9, 0x7b, 0xa7, 0x3f, 0x59, 0x44, 0x5e, 0x31, 0x35, 0x5f, - 0x2d, 0x26, 0x2b, 0x2f, 0x32, 0xce, 0x29, 0x91, 0x0a, 0x4e, 0xad, 0xe8, 0x7c, 0x22, 0x97, 0xd8, 0xc6, 0x1f, 0x04, - 0x32, 0x67, 0x8f, 0xec, 0x3d, 0x3b, 0xa8, 0x18, 0x2d, 0xa1, 0x20, 0x66, 0x51, 0x35, 0xf0, 0xed, 0xc1, 0x9b, 0x31, - 0xb3, 0xe7, 0xa4, 0x40, 0x8b, 0x51, 0x60, 0xcb, 0x85, 0x18, 0x0d, 0xf1, 0xaa, 0x64, 0xae, 0x24, 0xe1, 0xcf, 0x96, - 0x99, 0x12, 0x3f, 0x64, 0xa5, 0x0e, 0xee, 0xbc, 0x58, 0xb9, 0x64, 0xb9, 0x7c, 0x7e, 0xfd, 0x08, 0xec, 0x7a, 0xef, - 0x11, 0x31, 0xe3, 0xf5, 0x93, 0x05, 0xbb, 0x56, 0x80, 0x12, 0x19, 0xdd, 0x30, 0xee, 0x22, 0xa1, 0x46, 0xd9, 0x61, - 0x74, 0x05, 0x2a, 0x8e, 0x75, 0x2a, 0x0a, 0x00, 0xfe, 0x78, 0x3d, 0x54, 0x2e, 0x70, 0x7f, 0x3c, 0x11, 0x80, 0x32, - 0xca, 0xf4, 0x9d, 0xc9, 0x18, 0x10, 0x1d, 0x35, 0x13, 0xf8, 0x37, 0x61, 0xac, 0x9e, 0xfb, 0xec, 0xf8, 0x28, 0xee, - 0x65, 0x23, 0x0c, 0x34, 0x96, 0x65, 0x93, 0xcd, 0xba, 0x75, 0x5b, 0xe1, 0x4f, 0xc5, 0x0a, 0xa4, 0x29, 0x40, 0xf3, - 0x31, 0x6d, 0x04, 0x9c, 0x81, 0x31, 0xfb, 0x32, 0x81, 0x9a, 0x2a, 0x18, 0x47, 0x5f, 0x5b, 0x36, 0x3c, 0x1f, 0xd5, - 0xdd, 0x0f, 0x2e, 0x73, 0x81, 0x50, 0x16, 0x0b, 0x6c, 0x7b, 0xa1, 0x4e, 0xfc, 0x56, 0x90, 0x79, 0x7c, 0x5f, 0x0d, - 0x8b, 0x36, 0x1d, 0x2d, 0x2b, 0x2b, 0xac, 0x0f, 0x7a, 0xb4, 0x47, 0xb0, 0x1a, 0x29, 0x5a, 0xcf, 0x71, 0xb7, 0x02, - 0x1b, 0xd1, 0xe3, 0xd4, 0x60, 0xf5, 0x83, 0x49, 0x81, 0xe4, 0x60, 0xc8, 0xb6, 0x23, 0x96, 0x1a, 0x18, 0x82, 0x9a, - 0x97, 0xa7, 0x00, 0x6b, 0xa4, 0x76, 0xd3, 0xd2, 0x68, 0xf2, 0xaf, 0xda, 0xa2, 0xdf, 0xfa, 0x37, 0xb3, 0xde, 0x35, - 0x42, 0x24, 0xdb, 0xc3, 0xf9, 0xec, 0x0c, 0x2d, 0x98, 0x41, 0xa3, 0x22, 0xb4, 0x87, 0x50, 0x6a, 0x4e, 0x23, 0x31, - 0xa8, 0x85, 0x10, 0xd9, 0x9f, 0xb8, 0xb7, 0x9c, 0xf0, 0x3c, 0xe0, 0x1e, 0x9e, 0x95, 0x34, 0xe9, 0x34, 0x5f, 0x2a, - 0x23, 0xb8, 0x2b, 0x70, 0x8a, 0x12, 0xcc, 0x16, 0xf4, 0x4f, 0x7e, 0x7b, 0x57, 0x8a, 0x18, 0xae, 0x0b, 0x08, 0xa5, - 0xcf, 0x9e, 0x11, 0x45, 0xbb, 0xc8, 0x88, 0x56, 0x25, 0x4b, 0x70, 0x81, 0xec, 0x23, 0xdb, 0xcf, 0x46, 0x16, 0xcc, - 0x1a, 0xf6, 0x53, 0xdd, 0x88, 0xf6, 0x21, 0x30, 0x23, 0x36, 0xc7, 0x5e, 0x4f, 0x9e, 0x40, 0x43, 0xf4, 0xb0, 0x64, - 0x5a, 0x17, 0xb4, 0x74, 0x95, 0x62, 0xa5, 0x42, 0x37, 0xf1, 0xa8, 0x1f, 0xa9, 0x51, 0xab, 0xe5, 0xed, 0x10, 0x7d, - 0x04, 0x6b, 0x5e, 0xef, 0x9f, 0xe2, 0x5d, 0x43, 0x81, 0x98, 0x85, 0x3b, 0x56, 0xd6, 0x58, 0xd9, 0x63, 0x61, 0xe2, - 0xf0, 0x8d, 0x10, 0x0b, 0x4f, 0x85, 0xde, 0x4f, 0xf3, 0xbf, 0x36, 0x78, 0xf5, 0xb5, 0x50, 0xd6, 0x04, 0xe5, 0x87, - 0xc1, 0xc2, 0x99, 0x0b, 0x7c, 0x8c, 0xb1, 0xd3, 0xe1, 0x37, 0x8a, 0x68, 0x83, 0x44, 0x4b, 0x8a, 0x61, 0x0b, 0xb7, - 0x57, 0x12, 0x57, 0x49, 0x15, 0x1c, 0x45, 0x18, 0x5f, 0x70, 0xeb, 0xf1, 0x4b, 0xd6, 0x18, 0x13, 0x8e, 0xce, 0x39, - 0x28, 0x5b, 0x11, 0x12, 0xcc, 0x02, 0x9b, 0xf4, 0x70, 0x83, 0x65, 0x5a, 0x21, 0x25, 0x08, 0x31, 0xc9, 0x74, 0x3f, - 0x86, 0xa1, 0x12, 0x5b, 0x05, 0x41, 0x46, 0x65, 0x76, 0xe8, 0xc4, 0x19, 0x6d, 0x71, 0x98, 0x62, 0x8d, 0xf0, 0xa9, - 0xa6, 0x17, 0x21, 0x4a, 0x22, 0xef, 0x99, 0x5d, 0x63, 0x98, 0x40, 0x2b, 0x32, 0x55, 0x32, 0xfa, 0x2a, 0x06, 0xdc, - 0xfa, 0x6b, 0xed, 0x43, 0xc1, 0x3a, 0xb8, 0x86, 0x5e, 0xaa, 0xe2, 0xaf, 0x4e, 0xa1, 0x55, 0xea, 0x92, 0x54, 0x49, - 0x4f, 0xa6, 0x90, 0xe6, 0xbc, 0x82, 0x1e, 0xce, 0x79, 0x88, 0xb7, 0x02, 0xde, 0x2a, 0xf8, 0x04, 0x5a, 0xd2, 0x08, - 0xf7, 0x2d, 0xbb, 0xda, 0x3e, 0x2b, 0x91, 0xed, 0xe7, 0xe6, 0x64, 0xc4, 0xb9, 0x0e, 0x34, 0x7a, 0x0e, 0x0b, 0x2f, - 0x83, 0x16, 0x7d, 0xa7, 0x06, 0xee, 0x4a, 0x44, 0xdf, 0xfa, 0x43, 0x0b, 0x8a, 0x35, 0xab, 0x54, 0xc0, 0x9e, 0xa9, - 0xf7, 0x23, 0x21, 0xf1, 0x58, 0xfe, 0xb1, 0xa7, 0xc7, 0x24, 0x51, 0xb5, 0x3c, 0x81, 0x91, 0x08, 0x51, 0x93, 0x41, - 0xd6, 0xfa, 0x04, 0x83, 0xae, 0x59, 0xae, 0x52, 0x73, 0x85, 0x30, 0x87, 0x32, 0xdd, 0xd5, 0xda, 0x2e, 0x00, 0x4e, - 0x5f, 0xad, 0xe7, 0x2b, 0xd0, 0x69, 0x61, 0x06, 0x28, 0x71, 0xa6, 0x47, 0x75, 0xc6, 0xc1, 0xa9, 0x6e, 0x11, 0xff, - 0xeb, 0x95, 0x4a, 0x58, 0x7b, 0xf0, 0x70, 0x50, 0xf1, 0xa4, 0x82, 0xfc, 0x6c, 0xa0, 0x29, 0x0d, 0x03, 0x52, 0x70, - 0x4e, 0x62, 0x57, 0x2c, 0xa7, 0x8b, 0x47, 0x5e, 0x19, 0x23, 0x9c, 0xc0, 0xba, 0xd3, 0xa7, 0xd3, 0x41, 0x31, 0x2e, - 0xd1, 0x52, 0x17, 0x35, 0xe7, 0xd6, 0x49, 0x5a, 0xee, 0x40, 0xf1, 0x57, 0x96, 0xa8, 0x6b, 0x91, 0x4e, 0x96, 0x2d, - 0xae, 0xea, 0xab, 0x31, 0xed, 0x82, 0x08, 0x2b, 0x6a, 0xe4, 0xd6, 0x42, 0x9d, 0xed, 0x77, 0x5e, 0xde, 0x50, 0x8c, - 0xe3, 0x39, 0xbf, 0xd6, 0xca, 0xc3, 0xb3, 0x96, 0x52, 0x2f, 0xde, 0x32, 0x47, 0xd3, 0x89, 0x35, 0x5f, 0x6a, 0x84, - 0x67, 0xe2, 0x2e, 0x22, 0xc3, 0x68, 0x80, 0xe9, 0xdb, 0xaa, 0x45, 0x2c, 0xa4, 0x1d, 0x40, 0x3f, 0x17, 0xd4, 0x39, - 0x00, 0x0c, 0x45, 0x28, 0x3b, 0x00, 0xae, 0x42, 0xb5, 0x5e, 0xcf, 0x2b, 0x6d, 0x6c, 0xf6, 0x27, 0x72, 0x42, 0x10, - 0x56, 0xbc, 0xa4, 0x50, 0x0a, 0x99, 0x40, 0x5e, 0xe2, 0x52, 0x95, 0xdc, 0x4e, 0xcb, 0x66, 0xd3, 0xb9, 0xc3, 0x37, - 0xd2, 0x00, 0x44, 0x4d, 0x5a, 0x66, 0xb2, 0x81, 0x0d, 0x55, 0xca, 0x94, 0xa7, 0x49, 0xad, 0x06, 0x5c, 0xf3, 0xc1, - 0x35, 0x70, 0x24, 0xe0, 0xec, 0xc0, 0xb5, 0x20, 0x0e, 0xbb, 0x66, 0xc8, 0x35, 0x75, 0x4e, 0x79, 0x8c, 0xfe, 0x6b, - 0xab, 0x35, 0xb6, 0x5f, 0x7d, 0x2d, 0x4d, 0xde, 0x4f, 0xc7, 0x48, 0x2b, 0x03, 0x52, 0x3b, 0xf9, 0xbf, 0x36, 0xa4, - 0x9c, 0xfd, 0x58, 0x88, 0xb5, 0xff, 0x9b, 0x91, 0x39, 0x9f, 0x57, 0xcf, 0x0e, 0x13, 0x37, 0x18, 0x53, 0x21, 0x8e, - 0x71, 0x12, 0x5e, 0x6c, 0x87, 0x57, 0x8d, 0x41, 0xed, 0xd7, 0x0b, 0x18, 0x72, 0xdc, 0xb1, 0xf7, 0x1e, 0x18, 0xce, - 0xbe, 0xd8, 0x5b, 0x34, 0x56, 0x87, 0xb4, 0x28, 0x96, 0x7d, 0x00, 0xe9, 0x67, 0xf9, 0xfe, 0x7f, 0xdc, 0xdc, 0xa5, - 0x41, 0x2d, 0x23, 0x2f, 0x71, 0xc9, 0x42, 0xb3, 0xfc, 0x5e, 0x52, 0xac, 0x4f, 0x1b, 0xe1, 0x12, 0xcd, 0x95, 0xd5, - 0xff, 0x82, 0x65, 0xcb, 0xea, 0x2e, 0xe5, 0xe1, 0xde, 0x81, 0x09, 0x8d, 0x6f, 0x6e, 0x7c, 0x4c, 0x9d, 0x35, 0x95, - 0x6e, 0xc6, 0xbb, 0x38, 0xc4, 0xae, 0xb7, 0x8d, 0x2a, 0xb6, 0x8b, 0x8c, 0xa9, 0x68, 0x6a, 0xf5, 0xd1, 0x0c, 0x22, - 0x37, 0xb4, 0xa0, 0xfd, 0x5b, 0x4c, 0x3a, 0x58, 0x3c, 0x28, 0xc3, 0xa5, 0xd1, 0xf2, 0xba, 0x10, 0x3b, 0x0a, 0x2e, - 0xc9, 0x48, 0x4a, 0x12, 0x64, 0x48, 0xf7, 0x1d, 0x17, 0x0f, 0x9a, 0x42, 0xd5, 0x88, 0xdb, 0x95, 0x64, 0xbf, 0xe2, - 0xfe, 0xa5, 0x7e, 0xdc, 0x30, 0xea, 0xca, 0x39, 0x50, 0x89, 0xcf, 0x9a, 0x6c, 0x4e, 0x88, 0x8e, 0xda, 0x36, 0xeb, - 0x28, 0xca, 0x91, 0x5f, 0x29, 0x25, 0xea, 0x5f, 0xd1, 0x1b, 0x48, 0xb6, 0x08, 0x60, 0x60, 0x1b, 0x80, 0xd5, 0x6f, - 0xd6, 0x2c, 0xd5, 0x32, 0x40, 0xe3, 0x57, 0xb0, 0x6b, 0x3e, 0x3e, 0x75, 0x37, 0xfa, 0x05, 0xd1, 0xd8, 0x5a, 0xd1, - 0x04, 0x97, 0xdd, 0x0b, 0xab, 0x37, 0xe2, 0xf7, 0xd4, 0xdb, 0x23, 0x88, 0x0d, 0xe4, 0xd3, 0x74, 0xbf, 0x4b, 0x4d, - 0x1f, 0x90, 0xf4, 0x3d, 0x18, 0x63, 0x1f, 0x83, 0x5d, 0x51, 0x4f, 0xad, 0xde, 0x54, 0x95, 0x43, 0x20, 0xf7, 0x74, - 0x35, 0x2a, 0xe6, 0xf1, 0x57, 0xb4, 0x5b, 0x6b, 0xd9, 0x61, 0x78, 0x95, 0x2f, 0xa0, 0x6c, 0xd1, 0xae, 0x29, 0x22, - 0xc9, 0x65, 0x8c, 0x4b, 0x15, 0x80, 0x12, 0x58, 0x90, 0x93, 0x1a, 0xbb, 0x3a, 0xdd, 0xb2, 0x79, 0xf9, 0x3a, 0x9a, - 0x90, 0x6f, 0xfd, 0xb4, 0xf2, 0xb9, 0x19, 0x1c, 0x55, 0xd4, 0x21, 0x02, 0xd3, 0x40, 0x1d, 0x16, 0x70, 0x18, 0xa9, - 0xf3, 0x52, 0x04, 0x0e, 0x78, 0x37, 0xe8, 0x73, 0xcd, 0x40, 0x51, 0x70, 0x88, 0xbc, 0x8b, 0x1a, 0x2c, 0xf0, 0x1c, - 0x3c, 0x49, 0xb4, 0x71, 0x74, 0xf8, 0xef, 0x82, 0x8e, 0xa2, 0x43, 0xb2, 0x94, 0xf5, 0xbd, 0x32, 0x15, 0xc9, 0x49, - 0xea, 0x22, 0xe9, 0xfc, 0x54, 0x9e, 0xa9, 0x4d, 0x6e, 0xcd, 0x5f, 0x24, 0x9f, 0xc6, 0xc9, 0xd8, 0x0b, 0xd8, 0xaf, - 0x61, 0xc4, 0xae, 0xf3, 0x17, 0x36, 0x9f, 0xf6, 0xcc, 0xb2, 0x46, 0xab, 0x33, 0xe0, 0x81, 0xa4, 0x13, 0x61, 0x29, - 0xbb, 0x64, 0x2e, 0x65, 0x00, 0x28, 0xd7, 0xc6, 0xcb, 0xbb, 0x21, 0xc4, 0xe7, 0xe2, 0xfa, 0x8e, 0x48, 0xa8, 0x4c, - 0x35, 0x33, 0xe3, 0xb9, 0x47, 0x11, 0x21, 0x2c, 0xd5, 0xce, 0x2c, 0x6e, 0xb3, 0xed, 0xed, 0x6c, 0x78, 0x5e, 0xb3, - 0xfd, 0xb1, 0xc0, 0x14, 0xf5, 0xa0, 0xbf, 0x8b, 0x8b, 0xa4, 0xca, 0x20, 0x44, 0xcc, 0xe0, 0x03, 0xae, 0x86, 0xb0, - 0x4b, 0xa5, 0xa2, 0x3f, 0xdb, 0x25, 0x8a, 0x9f, 0x5e, 0xa5, 0xaa, 0xc2, 0xe5, 0x48, 0xc8, 0xc4, 0x96, 0xda, 0x80, - 0x25, 0x02, 0x3c, 0xf2, 0xe4, 0x16, 0xb7, 0x65, 0xb9, 0x1b, 0x11, 0x9c, 0x16, 0x2d, 0x9d, 0x9c, 0xb0, 0x4c, 0xe8, - 0x3b, 0xd9, 0xf5, 0xae, 0x29, 0xc2, 0xec, 0x7e, 0x93, 0x6e, 0x7f, 0x94, 0xd2, 0x57, 0x95, 0xc6, 0x1d, 0xb8, 0xc6, - 0x12, 0xb8, 0xf0, 0x18, 0xd1, 0x6a, 0x68, 0x54, 0x9f, 0x7a, 0x44, 0xf1, 0xa8, 0xd6, 0x24, 0xc7, 0x41, 0xeb, 0x30, - 0x71, 0xa5, 0xa5, 0x81, 0xe2, 0x42, 0xec, 0xac, 0x43, 0x76, 0x3a, 0x0b, 0xf9, 0x92, 0x73, 0xb3, 0x75, 0x92, 0xc8, - 0x17, 0xb5, 0x0f, 0x45, 0x33, 0x12, 0x73, 0xf5, 0x5d, 0x7e, 0xce, 0xd1, 0x8f, 0x77, 0x57, 0xf9, 0x8a, 0xb7, 0x8e, - 0x73, 0x92, 0xcc, 0x27, 0xf1, 0xa2, 0xe5, 0x9f, 0xcb, 0xd2, 0x46, 0x0b, 0x4f, 0xe2, 0xd1, 0x0f, 0xa7, 0x8a, 0xfa, - 0x35, 0x12, 0x9a, 0x75, 0x52, 0xeb, 0x59, 0x79, 0x25, 0xe5, 0x7c, 0xb7, 0x47, 0x8a, 0x25, 0x62, 0x8e, 0x71, 0xb9, - 0xe4, 0x69, 0x55, 0x2d, 0x1d, 0x7d, 0x7f, 0x86, 0xe7, 0x52, 0x76, 0x02, 0x60, 0x22, 0xa9, 0x8f, 0xb0, 0xa2, 0xbd, - 0x8c, 0x1a, 0x21, 0xf6, 0x82, 0xd1, 0xb2, 0x84, 0x17, 0xfb, 0xcd, 0xad, 0x07, 0x21, 0x5b, 0x92, 0xee, 0xee, 0x2d, - 0x08, 0x5f, 0xf0, 0xd3, 0x03, 0xa7, 0x75, 0xa4, 0x26, 0x2f, 0xce, 0x42, 0x94, 0x78, 0x89, 0x74, 0x18, 0xb5, 0xb5, - 0x9c, 0x9b, 0xb0, 0x92, 0x34, 0x86, 0xdc, 0x1a, 0x65, 0xd5, 0xb0, 0xa5, 0x18, 0x73, 0x20, 0xe3, 0x91, 0x79, 0x06, - 0xfa, 0x1e, 0xe0, 0x4d, 0x6e, 0x6d, 0x49, 0xb2, 0xee, 0x9e, 0xca, 0xc8, 0xbc, 0xe8, 0xb3, 0xe4, 0xfc, 0xb8, 0x95, - 0xd8, 0x50, 0xdc, 0x49, 0xb9, 0x62, 0x3d, 0x71, 0x90, 0x5d, 0x9a, 0xbc, 0x2f, 0x51, 0x44, 0xc9, 0x4a, 0xa7, 0xff, - 0x39, 0x37, 0x1c, 0x77, 0x3a, 0x34, 0xd1, 0xea, 0xd8, 0x76, 0x68, 0x25, 0xe6, 0xe1, 0xd7, 0xe5, 0x9a, 0xaa, 0x05, - 0xb4, 0x80, 0x39, 0x22, 0x4a, 0xdd, 0x0c, 0x71, 0x93, 0xa4, 0xe3, 0x05, 0xc2, 0xdf, 0x6e, 0x33, 0x13, 0x5f, 0x76, - 0x7f, 0x97, 0x23, 0x34, 0x35, 0x94, 0xe4, 0x01, 0x14, 0x97, 0x6f, 0xc2, 0x9b, 0x31, 0x15, 0xf1, 0x0d, 0xfb, 0xcc, - 0x59, 0x6a, 0x0f, 0x5e, 0xa0, 0x4d, 0x4f, 0x82, 0xd5, 0x89, 0x1b, 0x40, 0x89, 0x4c, 0x10, 0x20, 0xbb, 0xc7, 0x00, - 0x96, 0x06, 0xd9, 0x8b, 0x26, 0xd3, 0x00, 0x22, 0x5b, 0x8c, 0xad, 0x61, 0x8e, 0xcd, 0x15, 0xa0, 0x05, 0x3b, 0xf3, - 0x4b, 0xa0, 0x6c, 0x60, 0x87, 0x77, 0xf4, 0x3f, 0x79, 0x43, 0x0c, 0x31, 0xa6, 0xa9, 0x4d, 0x3b, 0xeb, 0x55, 0x90, - 0xbd, 0xeb, 0x63, 0x16, 0x07, 0xe4, 0xc0, 0x75, 0x43, 0x69, 0xec, 0x8c, 0xd5, 0x35, 0x0d, 0x68, 0xa5, 0xa8, 0xae, - 0x08, 0x84, 0x24, 0x10, 0xf3, 0xf2, 0x50, 0x48, 0x4d, 0x42, 0xb5, 0x74, 0xd3, 0xa9, 0x6d, 0x82, 0xc2, 0xec, 0x78, - 0x6a, 0xf2, 0xd0, 0x4b, 0xe0, 0xed, 0xdb, 0x5b, 0x8b, 0x01, 0x47, 0xe1, 0x4a, 0x96, 0x32, 0xea, 0x57, 0xe6, 0xcd, - 0x7a, 0x58, 0xcb, 0x5f, 0x1c, 0xd0, 0x6e, 0x57, 0x8e, 0x19, 0xd5, 0x4e, 0xf5, 0x42, 0x70, 0x7a, 0x67, 0x80, 0x46, - 0x44, 0x02, 0x6c, 0xe0, 0x47, 0xfd, 0x8e, 0x54, 0x2c, 0x51, 0xd6, 0x56, 0x5e, 0xcd, 0xfa, 0x03, 0x16, 0x22, 0x8d, - 0x2b, 0x6c, 0x9c, 0xb3, 0x68, 0x55, 0x23, 0x99, 0x90, 0xa0, 0x07, 0x32, 0xb2, 0x73, 0x56, 0x93, 0xe0, 0xeb, 0x94, - 0x06, 0x5f, 0x70, 0x7a, 0xfc, 0xb5, 0x0e, 0x50, 0x8e, 0x7f, 0x71, 0xf6, 0xba, 0x57, 0xe1, 0x88, 0xeb, 0x11, 0xf3, - 0x45, 0x9d, 0x97, 0x3f, 0xdc, 0x19, 0x39, 0xfd, 0x7b, 0xcb, 0x0c, 0x40, 0x95, 0xbf, 0x58, 0x26, 0x80, 0x54, 0x1e, - 0xdc, 0x79, 0x23, 0x3a, 0x4b, 0x76, 0x14, 0x8d, 0x59, 0x3b, 0x69, 0x09, 0x3b, 0x98, 0x15, 0x47, 0x10, 0x2a, 0xfe, - 0xc5, 0x08, 0x20, 0x71, 0x14, 0xb4, 0xec, 0x68, 0xd0, 0x8a, 0xf6, 0x40, 0x9d, 0x93, 0x12, 0x61, 0x63, 0x5e, 0x88, - 0x0d, 0xf9, 0xfa, 0xe6, 0x04, 0x07, 0x59, 0x43, 0x12, 0x3c, 0xa8, 0xb7, 0x6f, 0x8a, 0x6c, 0x97, 0x1d, 0xa6, 0xde, - 0xf4, 0xf8, 0x3d, 0x97, 0x80, 0x90, 0x16, 0x0f, 0x91, 0x8f, 0xdd, 0x48, 0xcc, 0x6e, 0x3d, 0xde, 0x76, 0xc4, 0xa2, - 0x6f, 0x27, 0xa2, 0x54, 0xea, 0xb8, 0x36, 0x0f, 0x51, 0x10, 0x56, 0x18, 0x4a, 0x70, 0xf9, 0x55, 0x40, 0x6c, 0xa2, - 0xa0, 0xb1, 0x8f, 0xe5, 0x4c, 0x39, 0x6c, 0xb2, 0x0f, 0xe7, 0x2f, 0x75, 0xad, 0xff, 0x08, 0xb5, 0xce, 0x9e, 0xc0, - 0xaf, 0x18, 0xd8, 0x7b, 0x28, 0x83, 0x75, 0x4a, 0xdc, 0xb5, 0xe0, 0xa1, 0x0c, 0xca, 0x7d, 0x18, 0x48, 0x08, 0xc5, - 0xf5, 0x71, 0xd8, 0x14, 0xbb, 0x96, 0x18, 0x01, 0x3e, 0x4a, 0x66, 0xa5, 0x36, 0x1d, 0xc3, 0x95, 0x30, 0xe0, 0xf2, - 0x52, 0x8f, 0xe7, 0xa3, 0x9b, 0xdd, 0x95, 0x46, 0x1a, 0xfa, 0x6e, 0xe0, 0x78, 0xb9, 0x39, 0x4c, 0x95, 0x45, 0x5b, - 0x37, 0x25, 0x2c, 0x75, 0x81, 0xc8, 0x8c, 0x10, 0x31, 0xb7, 0x6c, 0xd2, 0x90, 0x38, 0xdb, 0xe9, 0x04, 0x7d, 0x6c, - 0x60, 0x38, 0x83, 0xd9, 0x54, 0xb5, 0xb5, 0x7b, 0x53, 0x58, 0xff, 0xcc, 0xb2, 0x0d, 0xfc, 0x7c, 0x39, 0x23, 0x21, - 0xa0, 0x61, 0xa1, 0x17, 0x11, 0xc2, 0x7a, 0x38, 0xca, 0xb3, 0x97, 0xd8, 0x70, 0x21, 0x43, 0x87, 0xe3, 0x87, 0x63, - 0xb3, 0x17, 0x34, 0xc7, 0xcf, 0xa7, 0xc7, 0xc6, 0xbe, 0x56, 0xd3, 0x24, 0x0b, 0x2e, 0x65, 0xe1, 0x74, 0xfd, 0xc8, - 0x11, 0xc5, 0x67, 0xda, 0x75, 0xdf, 0xc1, 0xe6, 0x33, 0x29, 0x73, 0x52, 0xe9, 0x26, 0x02, 0x95, 0x81, 0x4c, 0xde, - 0xed, 0x05, 0xc0, 0xb6, 0x01, 0xfa, 0xa2, 0xb9, 0xc8, 0x4c, 0x65, 0x9f, 0x74, 0x5e, 0x1e, 0x22, 0x65, 0x7b, 0x78, - 0x73, 0x58, 0x86, 0x80, 0xd7, 0xa7, 0x35, 0xfb, 0x37, 0x3c, 0x0d, 0xd2, 0x75, 0xb4, 0x31, 0x2a, 0x92, 0xe6, 0x82, - 0xc9, 0x35, 0x2a, 0xa6, 0xc1, 0x43, 0x38, 0x69, 0xc0, 0xa9, 0x52, 0x4e, 0xb8, 0x20, 0x79, 0x81, 0x49, 0x2a, 0xf6, - 0x04, 0x5a, 0xdb, 0x40, 0x44, 0x45, 0x0d, 0x3f, 0xba, 0x8c, 0x8b, 0x47, 0x69, 0x67, 0x4f, 0xa2, 0xa2, 0xfe, 0xda, - 0x7b, 0xd2, 0x0a, 0x61, 0x9f, 0x53, 0xdd, 0xf5, 0x1a, 0x8f, 0xcd, 0x08, 0x8a, 0x5e, 0xd3, 0xd4, 0xff, 0x65, 0x18, - 0x84, 0xbb, 0xcb, 0x76, 0x0e, 0x82, 0x82, 0x1c, 0x21, 0xc0, 0x4f, 0x5e, 0xd0, 0x97, 0x00, 0x6b, 0xe8, 0x88, 0x03, - 0x79, 0x7e, 0x6d, 0x8f, 0xa4, 0x73, 0xf5, 0xd5, 0xb9, 0xef, 0x7f, 0xc5, 0xd1, 0x1a, 0xef, 0x9f, 0x61, 0xec, 0x1f, - 0x9f, 0x29, 0x6d, 0xce, 0x1e, 0x33, 0xf1, 0xe8, 0x44, 0xf6, 0xb7, 0x8d, 0x49, 0x8a, 0xb7, 0xc7, 0x4a, 0x81, 0x7f, - 0xf8, 0x40, 0xf2, 0x36, 0x0b, 0xe7, 0x46, 0x12, 0xf3, 0xdb, 0xd9, 0xaa, 0x93, 0x9f, 0x1c, 0xd7, 0xca, 0x7d, 0xd6, - 0x24, 0x7f, 0xcc, 0xa5, 0x1d, 0xf0, 0x9d, 0xab, 0xce, 0xce, 0xad, 0xe4, 0xd6, 0x38, 0xe7, 0xf8, 0xcd, 0xb7, 0xbb, - 0x55, 0xea, 0xcd, 0xff, 0x95, 0xd5, 0xe2, 0x3a, 0x75, 0xc3, 0x25, 0xde, 0x40, 0x41, 0x50, 0xb8, 0xc3, 0x3a, 0xbd, - 0xcc, 0x5d, 0xe3, 0x0e, 0xa3, 0xc1, 0xda, 0xfa, 0xaa, 0xc8, 0x3c, 0x32, 0x17, 0x31, 0xce, 0x67, 0xe2, 0x65, 0x35, - 0x65, 0xdb, 0xa0, 0xdf, 0x35, 0x15, 0xe6, 0x3f, 0xbf, 0x86, 0x3a, 0xdb, 0xb1, 0xf9, 0x53, 0xe5, 0xdf, 0x80, 0x6b, - 0xe8, 0x50, 0x8e, 0xa2, 0xe0, 0xc4, 0x75, 0xcd, 0xb4, 0x4d, 0xce, 0xb5, 0x70, 0x5c, 0xbb, 0x1c, 0x78, 0xb5, 0x49, - 0x9c, 0x41, 0x94, 0x56, 0xc6, 0x3d, 0xa7, 0x4f, 0xbb, 0xfc, 0xce, 0xb8, 0x63, 0xd8, 0x75, 0x30, 0x0a, 0x82, 0x01, - 0x25, 0x16, 0x6d, 0x50, 0x77, 0x32, 0xba, 0x9a, 0xd8, 0xb3, 0x06, 0x62, 0x09, 0xac, 0x68, 0x7e, 0xab, 0x04, 0xa0, - 0xa5, 0x1d, 0x78, 0x59, 0xaf, 0x12, 0xc9, 0x92, 0xd5, 0x37, 0x0e, 0xe6, 0x7f, 0x88, 0x50, 0x04, 0xe7, 0xdb, 0x38, - 0xc4, 0x8b, 0x4a, 0x91, 0x98, 0x53, 0xec, 0xd1, 0x9b, 0xec, 0xa3, 0x5e, 0x82, 0x34, 0xff, 0x06, 0x18, 0x20, 0x60, - 0xc3, 0x71, 0x2c, 0x10, 0x94, 0xcc, 0xcf, 0xf1, 0xe5, 0xce, 0x5e, 0xbe, 0xf9, 0x04, 0x53, 0xfb, 0x37, 0x9e, 0xdb, - 0xc8, 0xfd, 0xdb, 0x50, 0xc9, 0xed, 0xcf, 0x2c, 0xee, 0xff, 0x2c, 0x9e, 0xdd, 0xbf, 0xe5, 0x1f, 0xbf, 0x6e, 0x5a, - 0xe0, 0x9d, 0xce, 0xfb, 0x48, 0x02, 0x35, 0x3f, 0x5f, 0x67, 0xa4, 0x60, 0x18, 0x11, 0x7c, 0xed, 0xf8, 0x30, 0xa2, - 0xfb, 0xad, 0x67, 0x03, 0x6b, 0x62, 0x1f, 0xe3, 0x16, 0xd5, 0xeb, 0x79, 0x81, 0xed, 0x6a, 0x5c, 0xcb, 0xf4, 0xb2, - 0xd0, 0x9a, 0xa7, 0xca, 0x2e, 0x15, 0x1a, 0x09, 0x07, 0x5b, 0xc0, 0x3b, 0xb8, 0xeb, 0xca, 0x9d, 0xbd, 0xb4, 0x66, - 0x36, 0xe5, 0x49, 0x82, 0x9c, 0x0e, 0x5c, 0x34, 0x7d, 0xf5, 0xd4, 0xb6, 0xc4, 0x18, 0xfe, 0x9c, 0x37, 0xd5, 0x18, - 0x15, 0x3d, 0x46, 0x23, 0x19, 0xb1, 0x72, 0x56, 0x46, 0xcb, 0x8b, 0x61, 0x68, 0x4b, 0xc6, 0xc5, 0xac, 0xb2, 0xa0, - 0x0c, 0xb8, 0x07, 0x42, 0xd6, 0x0b, 0xfa, 0xd6, 0x4e, 0x91, 0x0f, 0xd5, 0x27, 0x1c, 0xb0, 0x79, 0x3c, 0xc1, 0x71, - 0xe9, 0xa3, 0x7a, 0x40, 0x9a, 0xc4, 0x55, 0xb8, 0x86, 0xb3, 0xc9, 0xaa, 0x8a, 0xe7, 0xcd, 0x4f, 0xdb, 0x00, 0x73, - 0x5a, 0xb0, 0x7f, 0x73, 0x5b, 0xa2, 0xdc, 0x4f, 0x82, 0xda, 0x2e, 0x1a, 0x55, 0x8d, 0xb2, 0x00, 0xa2, 0x4c, 0x9f, - 0xde, 0x40, 0x02, 0xd1, 0x39, 0xd5, 0x8b, 0xe6, 0xdb, 0xd4, 0x76, 0x38, 0x37, 0x45, 0xa0, 0x16, 0x2e, 0x8d, 0xd1, - 0x6c, 0xa6, 0x70, 0xc2, 0x7b, 0x97, 0xf6, 0x3c, 0x5d, 0x20, 0x4f, 0xb6, 0x80, 0x49, 0xdf, 0x0b, 0x3c, 0x6b, 0x00, - 0x0f, 0x08, 0xf4, 0x28, 0xaa, 0xd0, 0xc0, 0x9a, 0x82, 0x1d, 0x8c, 0x8a, 0x34, 0x0e, 0x80, 0x64, 0x9f, 0x46, 0xdc, - 0x80, 0x83, 0x73, 0x34, 0x86, 0x8e, 0x6d, 0xcf, 0xe4, 0x95, 0x14, 0x82, 0xa0, 0xca, 0x66, 0x89, 0xcd, 0x68, 0xb2, - 0x17, 0x95, 0x6f, 0x70, 0xb3, 0x73, 0x27, 0x18, 0xfb, 0x9d, 0xce, 0x00, 0xa6, 0xac, 0xa2, 0x77, 0x48, 0xcd, 0x88, - 0x17, 0x3a, 0x29, 0x9a, 0x1c, 0x88, 0x48, 0x46, 0xcc, 0x75, 0xe3, 0xb7, 0x7f, 0x1e, 0xe5, 0x66, 0x63, 0x5b, 0x6c, - 0x56, 0x3c, 0x23, 0x58, 0xef, 0xe0, 0xea, 0x2c, 0xbc, 0xd6, 0x33, 0xb2, 0x50, 0xf8, 0xc7, 0x30, 0xb9, 0x53, 0xdf, - 0xf7, 0xc4, 0x88, 0xe6, 0xf2, 0x7f, 0x97, 0xb1, 0xab, 0xca, 0x69, 0x34, 0x86, 0x86, 0x48, 0x46, 0x36, 0x01, 0x48, - 0xe6, 0x59, 0xd3, 0x31, 0x9a, 0x8d, 0xd5, 0xb6, 0x73, 0x9a, 0x66, 0x3f, 0x7e, 0xe5, 0xf4, 0xd7, 0x06, 0xc7, 0x03, - 0xe4, 0xe7, 0xce, 0x8d, 0x72, 0xf6, 0x03, 0x5b, 0xcc, 0xa1, 0xc7, 0xb9, 0x5c, 0xd5, 0x37, 0x8a, 0x5c, 0x8d, 0x90, - 0x8b, 0x41, 0xdf, 0x0d, 0x2a, 0x1e, 0x10, 0x40, 0x7f, 0x02, 0x5f, 0x79, 0x79, 0xfe, 0x5f, 0xa3, 0xb9, 0xe3, 0x91, - 0x60, 0x63, 0xe5, 0x32, 0x9c, 0xc4, 0xcb, 0x61, 0x3c, 0xe0, 0xe8, 0x39, 0x91, 0xf8, 0xb4, 0x22, 0xe9, 0x11, 0x89, - 0x0c, 0xe3, 0x91, 0x59, 0x1a, 0x52, 0x9c, 0x61, 0x84, 0xe2, 0x2f, 0xab, 0xdf, 0xae, 0xbb, 0x6f, 0x20, 0xc5, 0xbf, - 0x71, 0x5d, 0x1d, 0xcf, 0x8d, 0x2a, 0x33, 0xe9, 0x65, 0x73, 0xdc, 0x92, 0xb3, 0x9a, 0x56, 0x33, 0x9f, 0xb5, 0x4b, - 0xa6, 0xed, 0xe6, 0xb1, 0x9c, 0x19, 0x3f, 0x4f, 0x13, 0xc9, 0xe0, 0x6f, 0xce, 0x61, 0x80, 0x16, 0x06, 0xda, 0x4b, - 0xec, 0xd4, 0xa0, 0xd3, 0xd5, 0x9b, 0x0d, 0x31, 0xda, 0xae, 0xd6, 0xe9, 0x07, 0x5c, 0x2f, 0xe8, 0x18, 0x76, 0xd6, - 0x74, 0xf2, 0x9c, 0x10, 0xbb, 0x28, 0xf8, 0xf1, 0xfb, 0xae, 0xa0, 0xd4, 0x34, 0xa0, 0x5f, 0xe7, 0xe5, 0xe5, 0xae, - 0x76, 0x91, 0x81, 0x9a, 0x09, 0xe8, 0x90, 0xdd, 0x30, 0xe6, 0x58, 0x17, 0x63, 0x0f, 0xd2, 0x85, 0x71, 0x6b, 0xf6, - 0x41, 0x68, 0x8c, 0xb2, 0x70, 0x65, 0x4c, 0x2e, 0x0a, 0x5f, 0x93, 0x93, 0x6b, 0xb8, 0xa0, 0x25, 0xb4, 0xcf, 0xbd, - 0x77, 0x0e, 0xd3, 0x3d, 0xc2, 0x51, 0x5b, 0x7a, 0x91, 0x16, 0xea, 0xcd, 0x42, 0x79, 0x56, 0x80, 0x16, 0x2c, 0x52, - 0x4f, 0xab, 0xe5, 0xc8, 0xe5, 0x5d, 0x3f, 0x3a, 0x3d, 0x75, 0xab, 0xb5, 0xdc, 0x63, 0x4a, 0x03, 0xe1, 0x1d, 0xad, - 0xec, 0xbf, 0xe2, 0x25, 0x47, 0x2a, 0x6c, 0xd5, 0x2c, 0x93, 0xaf, 0xc8, 0xf5, 0x3f, 0x6a, 0x7a, 0x13, 0xef, 0x13, - 0xae, 0x0a, 0x84, 0x3b, 0x12, 0xa1, 0x33, 0x9e, 0x32, 0xeb, 0x68, 0x1d, 0xaf, 0xa9, 0x13, 0x3b, 0x1e, 0x1e, 0x17, - 0x28, 0x86, 0xdf, 0x9a, 0xd1, 0x80, 0xe7, 0xbe, 0x78, 0x11, 0xec, 0x5e, 0xfb, 0x2e, 0x39, 0x33, 0x8b, 0x6c, 0x7f, - 0xd5, 0x6a, 0xdc, 0x85, 0xd8, 0xb4, 0xca, 0xdc, 0x15, 0xfb, 0xec, 0x30, 0x9c, 0x6b, 0xc6, 0x17, 0x07, 0xb7, 0x7b, - 0x23, 0x77, 0x07, 0x6f, 0x9e, 0x12, 0x47, 0xd7, 0x02, 0x1e, 0x97, 0x9b, 0xbc, 0x5b, 0x55, 0xba, 0x5f, 0x1b, 0xf5, - 0x6a, 0x5f, 0x23, 0xfb, 0x92, 0x80, 0xe4, 0x71, 0x3d, 0xa4, 0x88, 0xe3, 0xa9, 0xc8, 0xd6, 0x84, 0xb1, 0x0e, 0x0a, - 0x1e, 0x6a, 0x3d, 0xb7, 0xed, 0xa4, 0xf6, 0x83, 0x72, 0xb7, 0x2e, 0xca, 0xca, 0xc3, 0xe1, 0xb7, 0xcd, 0x8f, 0x07, - 0xee, 0x25, 0x85, 0xe2, 0xa1, 0xfa, 0x2a, 0x02, 0x03, 0xee, 0x57, 0xd4, 0x9a, 0xcc, 0x8a, 0xe3, 0x27, 0xec, 0x94, - 0xca, 0x14, 0xa3, 0x83, 0x9b, 0xb6, 0x3b, 0x4d, 0x03, 0x18, 0x1d, 0xd3, 0x75, 0xb2, 0x33, 0xf5, 0xf8, 0x84, 0x88, - 0x1c, 0x53, 0xfb, 0x9f, 0xca, 0x8b, 0xd3, 0x01, 0xde, 0x07, 0xfb, 0xaf, 0x98, 0x40, 0x6c, 0xad, 0xbb, 0x49, 0x9d, - 0x86, 0x48, 0xc1, 0x87, 0x35, 0x6d, 0xfc, 0x5f, 0x7c, 0x2e, 0x8c, 0x26, 0xa2, 0x77, 0xea, 0xad, 0x2b, 0x25, 0xb0, - 0x5d, 0xed, 0x52, 0xe8, 0xb6, 0xb7, 0xba, 0x89, 0x71, 0x59, 0xf0, 0x86, 0x4e, 0xef, 0xc8, 0xfa, 0x49, 0xd0, 0x86, - 0xdc, 0x3b, 0x75, 0x19, 0x71, 0x88, 0x91, 0x94, 0xb3, 0x8b, 0xb1, 0xd4, 0x86, 0xd0, 0xc5, 0x16, 0x65, 0x4d, 0xee, - 0xfa, 0xfb, 0x53, 0x74, 0x18, 0x5a, 0x22, 0x8d, 0xf2, 0xbc, 0x03, 0xb6, 0x5e, 0xdd, 0x29, 0xaa, 0xb8, 0x1d, 0xae, - 0x6c, 0x5d, 0x02, 0xbd, 0x4e, 0x0c, 0xbe, 0xd8, 0x51, 0x83, 0x02, 0xde, 0x08, 0xdd, 0x64, 0xd2, 0x35, 0xc4, 0x70, - 0x36, 0xce, 0x3e, 0xa6, 0x1c, 0xf3, 0x73, 0xbf, 0x34, 0x5f, 0x56, 0x52, 0x3b, 0x41, 0x4c, 0x18, 0x90, 0xeb, 0x59, - 0x71, 0xa4, 0xfa, 0xf6, 0xf4, 0xaf, 0x4d, 0xe1, 0xff, 0x8e, 0x0d, 0xdf, 0xea, 0x30, 0x22, 0x19, 0xf5, 0x0a, 0x3b, - 0x04, 0x3a, 0x83, 0xba, 0xa4, 0x30, 0xe9, 0x43, 0x40, 0x9d, 0xb8, 0xc6, 0xf5, 0x54, 0x1e, 0x21, 0xf4, 0x4d, 0x1a, - 0x54, 0xce, 0x6d, 0x3b, 0xd4, 0x5b, 0xdf, 0x13, 0x51, 0x02, 0x84, 0x47, 0xa3, 0x00, 0x5a, 0x64, 0x32, 0xb8, 0x37, - 0x38, 0x80, 0xb0, 0x2e, 0xa5, 0x9c, 0xd1, 0x5a, 0xd2, 0x75, 0x68, 0x3e, 0x6e, 0xb1, 0xbe, 0xd5, 0x09, 0x39, 0x82, - 0x54, 0xea, 0xe9, 0x53, 0x35, 0x5d, 0xa4, 0x97, 0x98, 0x2d, 0x9d, 0xf2, 0x79, 0x80, 0xd8, 0x86, 0x5e, 0x58, 0x74, - 0x9f, 0xcf, 0xe5, 0x21, 0x40, 0xa6, 0xb9, 0x04, 0x24, 0x5c, 0x52, 0x50, 0x3f, 0x02, 0x93, 0x72, 0xf9, 0x1f, 0x15, - 0xd2, 0xeb, 0xdc, 0x1d, 0xbe, 0x7a, 0xbd, 0x58, 0xd5, 0x1a, 0x59, 0xbf, 0xf1, 0x03, 0x5d, 0xe5, 0xf5, 0xaa, 0xd6, - 0x9e, 0x2f, 0xd8, 0x8c, 0x0e, 0xd2, 0x8d, 0xf4, 0x3f, 0xf9, 0x07, 0x63, 0xa9, 0xb3, 0x23, 0xfa, 0x16, 0x57, 0xe2, - 0xba, 0xaf, 0xa7, 0xf7, 0x50, 0x5e, 0x3c, 0x49, 0x93, 0x65, 0xca, 0x6a, 0xd3, 0xfa, 0xb0, 0x53, 0x04, 0x42, 0xd4, - 0xd1, 0xcb, 0xb8, 0xe4, 0xc0, 0x45, 0x59, 0xba, 0x5e, 0x80, 0x7f, 0xf6, 0x0f, 0xa3, 0x13, 0x68, 0xa0, 0xd8, 0xb0, - 0xfb, 0x7e, 0x47, 0x65, 0xe7, 0x42, 0x0e, 0x4d, 0xf4, 0xbe, 0xda, 0x29, 0x93, 0x33, 0x75, 0x67, 0x9f, 0x93, 0xe8, - 0x86, 0x3a, 0x90, 0x57, 0x06, 0x1c, 0xa7, 0x5e, 0xec, 0xf7, 0x60, 0x98, 0x15, 0xbe, 0xec, 0x59, 0xb7, 0xfd, 0x09, - 0x83, 0x29, 0xc8, 0x5a, 0xee, 0x2c, 0x8a, 0xe5, 0x5d, 0xc8, 0xab, 0xa8, 0xb1, 0x5c, 0x4c, 0xac, 0x10, 0xca, 0x02, - 0xb6, 0x9c, 0xdc, 0x8f, 0x42, 0x90, 0x7b, 0x9c, 0xe3, 0xcd, 0xce, 0x39, 0x52, 0xee, 0x12, 0xcc, 0xee, 0xb0, 0xc5, - 0x69, 0x22, 0xf5, 0xba, 0x8d, 0xe0, 0x52, 0x62, 0x4a, 0x54, 0x51, 0xe4, 0xa6, 0x98, 0xa8, 0xe2, 0xa8, 0x6b, 0x7b, - 0xa3, 0x6d, 0x23, 0x65, 0x90, 0xc8, 0x30, 0x23, 0xa4, 0xa7, 0xf9, 0xe1, 0xee, 0xcd, 0x3e, 0x99, 0x32, 0x06, 0x11, - 0xd0, 0xa8, 0x7a, 0x06, 0x10, 0x7a, 0xbe, 0xac, 0x5d, 0xf2, 0x58, 0x56, 0x30, 0x92, 0xbe, 0x02, 0x1a, 0x2e, 0x9a, - 0x74, 0xc3, 0x2f, 0xc1, 0x49, 0xac, 0x78, 0x9a, 0x00, 0x45, 0xa3, 0xad, 0xf2, 0x6c, 0x88, 0xaf, 0x3c, 0x0e, 0x3a, - 0x51, 0x4f, 0x1a, 0x14, 0xc1, 0x60, 0x9a, 0x8d, 0x24, 0xdc, 0x52, 0x93, 0x41, 0xac, 0x0c, 0xc4, 0xd1, 0xbf, 0xb4, - 0x52, 0xa6, 0x54, 0xbb, 0x5a, 0x30, 0x32, 0xa3, 0x07, 0xd3, 0xdf, 0x85, 0xa8, 0x61, 0xd5, 0x08, 0xfd, 0x45, 0xa6, - 0x4e, 0x75, 0xca, 0xc8, 0x4b, 0x8c, 0xd3, 0xc4, 0xc0, 0x18, 0x72, 0xa0, 0x71, 0xc0, 0x76, 0x03, 0x79, 0x5a, 0x73, - 0xb6, 0x8c, 0x9a, 0x49, 0xf7, 0xba, 0x76, 0xf4, 0x69, 0x6e, 0xe9, 0xfa, 0xcf, 0x65, 0xb6, 0x61, 0xc7, 0x9c, 0xbf, - 0xf4, 0xd3, 0x6e, 0xfa, 0x30, 0xc6, 0xbc, 0x19, 0x07, 0xc3, 0x0c, 0xae, 0xbf, 0x48, 0x8b, 0x47, 0x45, 0x83, 0x2c, - 0x5f, 0x6a, 0x8c, 0x23, 0xed, 0xef, 0x07, 0xaa, 0xb7, 0xbb, 0x8d, 0x49, 0xd2, 0x00, 0x28, 0x47, 0x68, 0x44, 0x70, - 0xec, 0x8a, 0xff, 0x38, 0xaa, 0xfc, 0xef, 0xee, 0x7a, 0x8b, 0x1e, 0x84, 0x2f, 0xf6, 0xa6, 0x4f, 0xa3, 0x80, 0x39, - 0x6b, 0xdd, 0xae, 0x3e, 0x8d, 0xa9, 0x21, 0xfd, 0x35, 0x01, 0xe3, 0xc6, 0xb1, 0xfa, 0xc7, 0x34, 0x25, 0xbf, 0xd7, - 0x63, 0x12, 0x5f, 0x2c, 0xfa, 0xca, 0x1a, 0x55, 0xea, 0xd1, 0x65, 0x38, 0x6d, 0xc9, 0x68, 0x4f, 0xca, 0xb7, 0xba, - 0xc3, 0xd3, 0xb6, 0x4b, 0x6a, 0x36, 0xef, 0x89, 0xf9, 0xec, 0xba, 0xda, 0x56, 0xe2, 0x88, 0xf4, 0x20, 0x5f, 0x4f, - 0x19, 0xa5, 0xa3, 0x4f, 0xd1, 0xde, 0xef, 0x8e, 0x03, 0x99, 0xa7, 0xc7, 0xa1, 0x56, 0xd7, 0xae, 0xec, 0xf8, 0x56, - 0x9c, 0x98, 0xd4, 0x58, 0x86, 0xec, 0xd7, 0xb8, 0x11, 0x0d, 0x3a, 0xee, 0x7d, 0xd5, 0x7a, 0xdd, 0xd4, 0x98, 0x0e, - 0x4e, 0x31, 0x04, 0xcd, 0x57, 0x5d, 0x12, 0x55, 0xc4, 0x82, 0x37, 0xc4, 0x07, 0x71, 0x01, 0x80, 0x9c, 0x93, 0x16, - 0xb5, 0xec, 0x18, 0x4b, 0xa2, 0x7c, 0x57, 0x81, 0x5a, 0xf2, 0xec, 0xa2, 0xa2, 0x53, 0x77, 0xa2, 0x57, 0xa7, 0x5e, - 0xa5, 0x39, 0x8d, 0xd0, 0xf5, 0xf0, 0x99, 0xe7, 0xa8, 0x64, 0x59, 0xf7, 0xae, 0x42, 0x5f, 0xb1, 0xd7, 0x5e, 0x49, - 0xc9, 0x3b, 0x52, 0x1a, 0x0a, 0x19, 0xc5, 0x1a, 0x34, 0xb6, 0xce, 0x5d, 0x62, 0x49, 0x27, 0xcb, 0xa3, 0x86, 0xc2, - 0x17, 0x73, 0x1f, 0xb7, 0xc6, 0x51, 0x39, 0xe6, 0x1c, 0xc0, 0x9e, 0x54, 0xe9, 0x64, 0xaa, 0x1c, 0xc0, 0xaf, 0x69, - 0x16, 0x11, 0x83, 0x94, 0xda, 0xe9, 0xb8, 0x8b, 0xb3, 0x64, 0x3b, 0x61, 0xd0, 0xb1, 0xe8, 0x39, 0x7a, 0x20, 0xd2, - 0x79, 0x1c, 0x44, 0xf7, 0x91, 0xc7, 0x0d, 0x32, 0x0c, 0xb6, 0x67, 0x2d, 0x79, 0x94, 0xb9, 0xe2, 0x28, 0xbb, 0x12, - 0x53, 0xcb, 0xb3, 0xa9, 0xdb, 0x33, 0xba, 0x62, 0xad, 0xac, 0xe9, 0xee, 0x88, 0x4c, 0x05, 0xf7, 0x7d, 0x7b, 0x86, - 0x4f, 0x47, 0x46, 0x8e, 0x33, 0x89, 0xa3, 0x3a, 0x84, 0xb9, 0x71, 0x22, 0x78, 0x82, 0xd1, 0xb2, 0x25, 0xf3, 0x94, - 0x53, 0x0a, 0xb5, 0xf7, 0xbf, 0x34, 0x1e, 0xa1, 0x6a, 0xae, 0x61, 0x7a, 0xcb, 0xd0, 0x1d, 0xc2, 0x76, 0xfd, 0x43, - 0x74, 0x32, 0xa2, 0x05, 0xef, 0x2f, 0x92, 0x0a, 0xc6, 0x5a, 0x5a, 0x95, 0xb6, 0xbe, 0xdd, 0x43, 0x02, 0x96, 0xa7, - 0x56, 0x9d, 0xa1, 0x80, 0x15, 0xa6, 0xcf, 0xf9, 0x9b, 0xb9, 0xc6, 0x21, 0x77, 0x2d, 0x11, 0x10, 0x1b, 0x81, 0xdd, - 0xd0, 0x09, 0x12, 0x18, 0xaa, 0x10, 0xfb, 0xac, 0x55, 0xf1, 0x9c, 0x37, 0x85, 0x1e, 0xf0, 0x23, 0x9f, 0xc4, 0x92, - 0xfa, 0x09, 0x92, 0xfc, 0x09, 0x97, 0x84, 0xd0, 0xa7, 0xfc, 0x22, 0xf6, 0xaa, 0xc9, 0x4d, 0xad, 0x34, 0xdb, 0x0e, - 0xc5, 0xcf, 0xfc, 0x62, 0xdc, 0xdd, 0x68, 0x88, 0x21, 0x62, 0x85, 0x11, 0x0a, 0xc6, 0x9c, 0xa0, 0x6e, 0xf2, 0x57, - 0xa4, 0xf8, 0x74, 0xce, 0xe6, 0x5b, 0xf8, 0x4e, 0xdb, 0xe9, 0x1d, 0x14, 0x0a, 0x31, 0xea, 0x0c, 0x2d, 0x61, 0xd8, - 0xc3, 0x93, 0xf9, 0xec, 0xc2, 0x9c, 0x84, 0x24, 0x15, 0x2d, 0x4a, 0x38, 0x43, 0xfc, 0x06, 0xc0, 0x04, 0x9a, 0xac, - 0x44, 0xa9, 0xa8, 0x81, 0x3d, 0x82, 0x5f, 0xb8, 0xd9, 0xe6, 0xf3, 0x56, 0xe4, 0xe1, 0x40, 0x1a, 0xe5, 0x0a, 0x6d, - 0x20, 0xa6, 0x7a, 0x6e, 0x23, 0xb1, 0x18, 0x19, 0x45, 0x6b, 0xc9, 0x97, 0x5a, 0x42, 0x5d, 0xec, 0x3c, 0x08, 0xd6, - 0x55, 0x77, 0x95, 0x9d, 0xa1, 0x59, 0x31, 0x83, 0x03, 0x39, 0x2e, 0xd0, 0x30, 0x44, 0xba, 0x31, 0xd9, 0xa6, 0x98, - 0x65, 0x23, 0x7c, 0x5f, 0xc5, 0xbc, 0xc9, 0x6b, 0x21, 0xf2, 0x5a, 0x9d, 0x49, 0xb0, 0x86, 0x09, 0x79, 0x6a, 0x60, - 0x96, 0x24, 0xa4, 0x61, 0x09, 0xcb, 0x13, 0x3e, 0x43, 0xbd, 0x64, 0x98, 0x66, 0x64, 0xfa, 0xe0, 0x49, 0xbf, 0x65, - 0xfd, 0x89, 0x37, 0xf2, 0xf3, 0x46, 0x13, 0x78, 0x51, 0x09, 0x55, 0x2e, 0xb6, 0x19, 0x22, 0xba, 0xd5, 0x52, 0xc3, - 0x73, 0xea, 0x96, 0x27, 0x40, 0xe2, 0x49, 0x9f, 0x19, 0x7e, 0xb4, 0xcd, 0x08, 0x81, 0x54, 0xe9, 0xad, 0x8b, 0x90, - 0xd9, 0x27, 0x65, 0xe5, 0xe1, 0xf0, 0xe4, 0xd2, 0x69, 0x09, 0x95, 0xc0, 0xf5, 0x9b, 0xd7, 0x05, 0x54, 0x81, 0x99, - 0xa1, 0x58, 0x63, 0x53, 0x3d, 0x1b, 0x6f, 0x90, 0x66, 0x30, 0x2e, 0x22, 0xa1, 0x42, 0xe6, 0xce, 0x25, 0x9a, 0xba, - 0x5e, 0xcc, 0x19, 0xcb, 0xcb, 0x3e, 0xec, 0xf9, 0xd2, 0x53, 0xcc, 0x2e, 0xbc, 0xd6, 0x2f, 0x99, 0xe3, 0xf6, 0x59, - 0x48, 0xb3, 0xdc, 0x9d, 0x22, 0x35, 0x7b, 0xac, 0x92, 0x9a, 0x07, 0xb0, 0xae, 0xb3, 0x2b, 0x3b, 0xd3, 0xa5, 0x1c, - 0x61, 0x7f, 0x82, 0x3b, 0x80, 0x63, 0x04, 0x43, 0x12, 0x70, 0x1b, 0xf9, 0x8d, 0x5b, 0x30, 0xf2, 0xcd, 0xc7, 0x41, - 0x1b, 0x82, 0xc8, 0x04, 0x89, 0x10, 0x31, 0x91, 0xc7, 0xf0, 0xf3, 0x01, 0xce, 0xbe, 0xba, 0x4c, 0x34, 0x51, 0xbc, - 0x11, 0x8a, 0x69, 0x78, 0x0d, 0x77, 0xeb, 0xc0, 0x8c, 0xce, 0x7b, 0x3a, 0x45, 0x57, 0xd0, 0x24, 0xa6, 0x56, 0x4f, - 0x9b, 0xf7, 0xdc, 0x23, 0xc2, 0x2f, 0x74, 0x51, 0xdc, 0xdd, 0xc1, 0x7a, 0xbd, 0x80, 0x25, 0x13, 0xf9, 0x96, 0x33, - 0xf3, 0x66, 0xca, 0x1e, 0x92, 0x63, 0x9f, 0x3e, 0x3c, 0x6e, 0x17, 0xfb, 0xe4, 0x39, 0x2e, 0xb2, 0x5e, 0x52, 0x85, - 0x3d, 0x29, 0xff, 0x9b, 0x32, 0xe6, 0x44, 0x04, 0x35, 0x95, 0xe9, 0xda, 0xa2, 0xe3, 0xcf, 0x2a, 0x9a, 0x2c, 0x8d, - 0x60, 0x6b, 0x54, 0x91, 0x7e, 0x69, 0x94, 0x52, 0x1d, 0x51, 0x0f, 0x43, 0x9b, 0x48, 0xb1, 0xd0, 0x28, 0x70, 0x74, - 0xa9, 0x4d, 0xf0, 0x6c, 0x15, 0xf4, 0x48, 0x7c, 0xa4, 0x9d, 0xd8, 0xe6, 0xfc, 0x7c, 0x4f, 0xf1, 0x4d, 0xf2, 0x5b, - 0xfa, 0x5b, 0x70, 0x93, 0x42, 0x93, 0xc5, 0xb5, 0xbc, 0xb5, 0x72, 0x8b, 0xdf, 0xe5, 0x63, 0x5f, 0xa3, 0x8b, 0x83, - 0x51, 0x3a, 0x99, 0xf3, 0x5e, 0x78, 0xc8, 0xb5, 0x93, 0x57, 0x62, 0xaf, 0x66, 0x2b, 0xc5, 0x95, 0x60, 0xe1, 0xc1, - 0xa9, 0x2b, 0x99, 0x8a, 0x56, 0x10, 0xc8, 0xbc, 0x71, 0xdb, 0xaf, 0x7f, 0x20, 0xa3, 0x6d, 0x08, 0x19, 0xcc, 0xda, - 0xea, 0x25, 0xa6, 0xf3, 0xbe, 0x45, 0xbe, 0x64, 0x6f, 0x6c, 0x59, 0xf7, 0x10, 0x88, 0xfe, 0xe4, 0x78, 0x37, 0x64, - 0x05, 0x16, 0x0a, 0xfb, 0x12, 0xd0, 0x93, 0xa8, 0xaa, 0xd4, 0x5e, 0xea, 0x50, 0xae, 0xab, 0x19, 0x2a, 0x54, 0xcb, - 0xeb, 0x1f, 0x40, 0x22, 0x8e, 0x52, 0x06, 0xed, 0xe9, 0xa2, 0x2a, 0x23, 0x82, 0xc0, 0xb8, 0x08, 0x0d, 0x2b, 0xc4, - 0x14, 0x76, 0x59, 0xc5, 0x38, 0x4e, 0x57, 0xf7, 0xf5, 0x8b, 0x53, 0x88, 0xbd, 0xee, 0x86, 0xac, 0x12, 0x74, 0xee, - 0xba, 0xec, 0xd3, 0x1c, 0xfa, 0x99, 0xae, 0x7f, 0x04, 0x37, 0x39, 0x87, 0x35, 0x29, 0x38, 0x35, 0xf5, 0x39, 0x8b, - 0x25, 0xdf, 0x08, 0x15, 0x4e, 0x5b, 0x32, 0xda, 0xb1, 0x63, 0x56, 0xe5, 0xc7, 0x2e, 0x4b, 0x69, 0x60, 0x48, 0xa2, - 0xba, 0x36, 0xe8, 0x18, 0xb4, 0x24, 0x72, 0xf3, 0xea, 0x70, 0x49, 0x7b, 0x43, 0xc8, 0x0f, 0x37, 0xa7, 0xfb, 0x94, - 0xd0, 0xc6, 0x6a, 0xf1, 0xca, 0xc5, 0x97, 0x44, 0xa4, 0xbc, 0xe0, 0x1e, 0x01, 0xeb, 0x77, 0x22, 0xfc, 0xbb, 0xe8, - 0xc1, 0x81, 0x47, 0x00, 0x8b, 0xf0, 0x56, 0xdc, 0x57, 0xde, 0x26, 0x94, 0x56, 0xa0, 0x2e, 0xd7, 0xa6, 0x51, 0x82, - 0x37, 0xa4, 0xff, 0xf0, 0xc8, 0xbe, 0xcc, 0x13, 0xb6, 0x51, 0x21, 0xf1, 0x0e, 0xbf, 0xf3, 0x77, 0x4f, 0xc7, 0x9c, - 0x00, 0xbb, 0xa5, 0xd3, 0xbc, 0x6a, 0x0b, 0x90, 0x16, 0x5d, 0x0c, 0x62, 0x9c, 0x82, 0xe5, 0x95, 0x00, 0xe9, 0x87, - 0x57, 0x61, 0xa1, 0xeb, 0xf9, 0x7b, 0x4d, 0xf7, 0xca, 0x5e, 0x87, 0x69, 0xf2, 0x65, 0xef, 0x88, 0x46, 0xd0, 0xcb, - 0xd5, 0xc9, 0xe5, 0xfb, 0x94, 0x72, 0xe1, 0x5f, 0xd2, 0xd5, 0xcf, 0x54, 0x89, 0xe6, 0xaa, 0x6f, 0xaa, 0xf8, 0x94, - 0xab, 0xf1, 0x09, 0xa4, 0xda, 0x9c, 0x57, 0x13, 0xe6, 0xca, 0x55, 0x9f, 0xdc, 0x77, 0x17, 0x98, 0x56, 0x6f, 0xfd, - 0xdb, 0xfd, 0x30, 0xd0, 0x9f, 0xdd, 0xdf, 0x1c, 0x7c, 0x9d, 0x5d, 0x74, 0x76, 0x3a, 0xf6, 0x2f, 0xe4, 0xc7, 0x11, - 0xba, 0xac, 0x87, 0xa2, 0x26, 0x72, 0xc2, 0x7b, 0xea, 0xa8, 0x61, 0x2f, 0xb7, 0x94, 0x79, 0x31, 0x7d, 0x2f, 0x59, - 0x05, 0x94, 0xdf, 0xb7, 0xd9, 0xa5, 0xd5, 0x84, 0xe2, 0x02, 0x92, 0x2e, 0x73, 0x9a, 0x95, 0x6e, 0xa4, 0x50, 0xb3, - 0xc9, 0x5e, 0x46, 0x56, 0xe9, 0xb5, 0x12, 0xec, 0x57, 0x8b, 0x60, 0x58, 0x56, 0xe9, 0x2a, 0x8f, 0x3a, 0x6c, 0xd6, - 0xae, 0xad, 0xd3, 0x7f, 0xb9, 0xb9, 0x9c, 0x09, 0xa2, 0xec, 0xa0, 0x56, 0xf2, 0x8c, 0x2b, 0x7d, 0xce, 0xb5, 0x52, - 0x77, 0x3a, 0xde, 0xab, 0x3f, 0x57, 0xcd, 0x27, 0x4b, 0x4b, 0xf7, 0xbd, 0x0e, 0xff, 0xd9, 0x95, 0xb5, 0x14, 0x41, - 0x16, 0x43, 0xea, 0x3d, 0x63, 0x67, 0x25, 0x53, 0x42, 0x01, 0xc4, 0x2f, 0x3c, 0xae, 0x5d, 0x07, 0xcd, 0xbb, 0xd2, - 0xed, 0xa7, 0xab, 0xd6, 0xaa, 0x90, 0xf2, 0x78, 0x63, 0x19, 0x51, 0x98, 0xb8, 0xaa, 0x95, 0x61, 0x9a, 0x37, 0x7f, - 0xef, 0x9e, 0xf4, 0x57, 0xc5, 0xcb, 0x6a, 0x22, 0x8a, 0x98, 0xae, 0x79, 0xbc, 0xb1, 0x7a, 0x37, 0x87, 0xb5, 0x79, - 0xf1, 0x5c, 0x8d, 0x2f, 0x5a, 0xff, 0x5c, 0x75, 0x6c, 0x0d, 0x63, 0x52, 0x39, 0xcf, 0x3b, 0xbf, 0x29, 0x29, 0x8d, - 0xb4, 0x8c, 0x36, 0x4e, 0x8a, 0x99, 0x0a, 0x2f, 0x57, 0xef, 0x54, 0x27, 0xaa, 0x10, 0x19, 0x1c, 0x3c, 0x23, 0xb8, - 0xbf, 0xfd, 0xf3, 0x51, 0x59, 0xb7, 0xb6, 0x8d, 0xe5, 0x8d, 0xbc, 0x92, 0x68, 0xfc, 0x2e, 0x96, 0xcb, 0x16, 0xe6, - 0x5b, 0xfb, 0xa6, 0x29, 0x97, 0xb5, 0x89, 0xa4, 0x8e, 0xd2, 0x27, 0xc5, 0x65, 0xa4, 0x2a, 0xbd, 0x4f, 0x40, 0xa2, - 0x97, 0x46, 0xfa, 0x0c, 0x23, 0xa5, 0x1e, 0xc9, 0x8e, 0x10, 0x21, 0x40, 0x80, 0x66, 0xe7, 0xaa, 0xbd, 0x4c, 0x97, - 0x0c, 0xce, 0xc8, 0xa4, 0x40, 0x9f, 0x61, 0x76, 0x35, 0x17, 0x09, 0xc1, 0x19, 0xa1, 0x03, 0xe9, 0x26, 0x63, 0x25, - 0xf8, 0x67, 0xa4, 0x1a, 0x35, 0x6d, 0xa6, 0xae, 0xb1, 0xf3, 0xb5, 0xb0, 0xe6, 0x87, 0x0e, 0xd9, 0xc5, 0x89, 0x45, - 0x89, 0xbe, 0x70, 0x24, 0x66, 0xe9, 0x49, 0x5d, 0x69, 0x0d, 0xdd, 0x85, 0x5b, 0x5c, 0xef, 0x5c, 0x76, 0xc9, 0x2f, - 0xe3, 0x4d, 0x2b, 0xd2, 0x1c, 0x53, 0x74, 0xf9, 0x26, 0x58, 0x0b, 0x70, 0xa0, 0xcc, 0xcb, 0x57, 0x3d, 0x02, 0x57, - 0x7e, 0x80, 0x8b, 0xe8, 0x65, 0x3e, 0x82, 0x08, 0xce, 0x4d, 0x95, 0x16, 0x5a, 0x98, 0x3d, 0x02, 0x3c, 0xd6, 0x6b, - 0xfe, 0x14, 0xfa, 0x99, 0x29, 0x5e, 0x0a, 0x27, 0xcf, 0x5a, 0xa3, 0x76, 0x0f, 0x31, 0xf8, 0x94, 0xac, 0xd6, 0xc4, - 0x22, 0xa7, 0x71, 0x9d, 0x53, 0x8f, 0x8f, 0x66, 0xcb, 0x7c, 0x90, 0x98, 0x15, 0xc0, 0xe4, 0x34, 0xae, 0x51, 0xe2, - 0x6d, 0xa6, 0xaa, 0x76, 0x46, 0x39, 0x8d, 0x2f, 0xc4, 0x90, 0x4c, 0x52, 0x31, 0xdf, 0x3e, 0x90, 0x51, 0x86, 0xc4, - 0x45, 0xc9, 0xad, 0xd5, 0x14, 0xa7, 0xad, 0x79, 0x43, 0x52, 0x7e, 0xc1, 0x28, 0xeb, 0xe6, 0xef, 0x52, 0x5f, 0xef, - 0xfe, 0x28, 0xa6, 0x4b, 0x8f, 0xab, 0xc3, 0x9b, 0x79, 0x75, 0x34, 0x91, 0x9e, 0xe6, 0xd4, 0x20, 0xf1, 0x5b, 0x0b, - 0xfe, 0x98, 0x1f, 0x2f, 0x35, 0xa6, 0x1a, 0x9a, 0xf8, 0xc8, 0x66, 0x8b, 0x2e, 0x2b, 0xbc, 0x71, 0x6e, 0x85, 0x2f, - 0xb5, 0x29, 0x16, 0xe3, 0xb3, 0xcf, 0x3b, 0x0d, 0xae, 0xa3, 0x78, 0x0f, 0x87, 0xd4, 0xd5, 0x8b, 0xa2, 0xa5, 0x3f, - 0x36, 0xfb, 0x3c, 0x8e, 0xf8, 0xc3, 0x9b, 0xfd, 0xb0, 0x04, 0xe6, 0xee, 0xd0, 0x4a, 0x8b, 0x03, 0x69, 0x2b, 0x39, - 0x5a, 0xef, 0xda, 0x7e, 0x8a, 0xd6, 0x44, 0x56, 0x63, 0x53, 0x41, 0xa9, 0x5e, 0x90, 0xff, 0xef, 0x6d, 0x6c, 0x55, - 0x32, 0x55, 0x3a, 0xe8, 0x3d, 0x24, 0xbd, 0x34, 0xf4, 0x15, 0x7d, 0xee, 0xe9, 0xb1, 0xde, 0xa9, 0x44, 0xbc, 0x8b, - 0xcb, 0x9c, 0x61, 0x36, 0x1b, 0xe6, 0xe6, 0x11, 0xbd, 0x95, 0x5e, 0xb1, 0xdb, 0x98, 0xf4, 0x34, 0x88, 0x65, 0x79, - 0x99, 0x53, 0xf7, 0x39, 0x09, 0x24, 0xfe, 0x39, 0x3c, 0x00, 0xff, 0xa4, 0x6b, 0xd0, 0x1c, 0x49, 0xe5, 0x72, 0x53, - 0xaf, 0x43, 0xbc, 0x6b, 0x77, 0x3c, 0x16, 0xe9, 0xeb, 0x26, 0x1a, 0xdf, 0xd0, 0x0d, 0xa5, 0xa8, 0xa9, 0x8c, 0x3a, - 0x8e, 0x0c, 0x97, 0x8c, 0xbc, 0x59, 0x91, 0x6b, 0xbf, 0x02, 0x79, 0x55, 0x00, 0x21, 0x48, 0x6b, 0x11, 0x4d, 0x4c, - 0xf6, 0x57, 0x43, 0xcd, 0x51, 0x9a, 0xd9, 0x26, 0x7f, 0xda, 0xc4, 0xee, 0xba, 0x05, 0xdc, 0xad, 0x1c, 0xa2, 0x8b, - 0xed, 0x31, 0x0f, 0x79, 0x04, 0xa3, 0x2d, 0x24, 0x0a, 0x59, 0x15, 0xa2, 0x85, 0xd3, 0xfc, 0x49, 0x3e, 0x55, 0x9e, - 0x02, 0x3c, 0x44, 0x41, 0x13, 0x96, 0xb2, 0x9b, 0xee, 0x4b, 0xb2, 0x74, 0xf4, 0x3c, 0x82, 0x0f, 0x50, 0x09, 0x0e, - 0xd0, 0x45, 0xce, 0xeb, 0xee, 0xc5, 0xb6, 0x11, 0xd9, 0xc8, 0xd6, 0x75, 0x4f, 0x07, 0x59, 0x6e, 0x2d, 0x2d, 0xfc, - 0xef, 0x8f, 0xbd, 0xaf, 0xee, 0x82, 0x1d, 0x60, 0x28, 0xef, 0x3e, 0x84, 0x16, 0xee, 0x38, 0xd4, 0xea, 0xc5, 0x8a, - 0x12, 0x05, 0x4f, 0x22, 0xf3, 0xc7, 0x4a, 0x76, 0xba, 0xc7, 0x56, 0x24, 0xde, 0x53, 0x37, 0xa8, 0xdb, 0xe5, 0x56, - 0x5d, 0x35, 0x7b, 0xb9, 0x2a, 0xec, 0x3f, 0x1b, 0xfa, 0xd1, 0x54, 0xc1, 0x07, 0x4c, 0x2f, 0x6e, 0x23, 0x2e, 0x0a, - 0x85, 0x35, 0x72, 0xfe, 0x01, 0x8c, 0xca, 0x9a, 0x17, 0x6e, 0x52, 0x2c, 0x83, 0xcb, 0xd0, 0x28, 0xee, 0xc4, 0x2d, - 0x86, 0x1a, 0x0f, 0x06, 0x3d, 0x0b, 0x4b, 0x90, 0x46, 0xf7, 0xe9, 0x3d, 0xce, 0x70, 0x12, 0xa4, 0xd5, 0xe7, 0xcd, - 0x09, 0x72, 0x8d, 0x77, 0x52, 0x6b, 0x44, 0x22, 0xcd, 0x1e, 0x47, 0x65, 0x6d, 0xf8, 0x18, 0xa6, 0xd1, 0x39, 0xa0, - 0xa8, 0x4d, 0x85, 0xad, 0x76, 0x8a, 0x50, 0xaa, 0xe3, 0x20, 0xb0, 0x69, 0xe9, 0xe3, 0x24, 0x2d, 0xe2, 0x40, 0x4f, - 0x25, 0x78, 0x5e, 0xd2, 0xfc, 0x96, 0x8a, 0xbc, 0x9f, 0x77, 0x82, 0x66, 0xfa, 0xbd, 0x82, 0x48, 0x79, 0xac, 0x44, - 0x1a, 0x46, 0x1d, 0x0c, 0x76, 0x6c, 0xc3, 0xab, 0x03, 0x18, 0xcf, 0x91, 0x4a, 0x46, 0x0d, 0x5c, 0xb9, 0xe2, 0xee, - 0x4b, 0x9b, 0x32, 0xe5, 0xda, 0x2a, 0xfc, 0xc8, 0x7c, 0xc9, 0x10, 0x2b, 0x5f, 0x35, 0x43, 0x89, 0xab, 0xd4, 0xb0, - 0xf6, 0x8b, 0xa9, 0x9b, 0x58, 0x5b, 0xc8, 0xe7, 0x8b, 0xbf, 0x46, 0x87, 0xb0, 0x0f, 0x20, 0xab, 0x9f, 0x2e, 0xc4, - 0x94, 0x5c, 0xc2, 0x04, 0x39, 0x57, 0x8c, 0x89, 0x77, 0x93, 0xc9, 0xa5, 0x3f, 0xcd, 0x16, 0xd8, 0x67, 0xd3, 0x4a, - 0xba, 0x5f, 0x92, 0x42, 0xfc, 0x1e, 0x0f, 0x1a, 0xd2, 0x13, 0x84, 0x98, 0x3d, 0x05, 0x8f, 0x6e, 0x56, 0x6e, 0xd4, - 0x1b, 0x49, 0xd0, 0x8e, 0xad, 0xd8, 0x02, 0x24, 0x38, 0xa0, 0x9e, 0xa8, 0xf1, 0x7d, 0xf0, 0x52, 0xe5, 0x97, 0x2f, - 0x0f, 0x11, 0x6a, 0x06, 0xe3, 0x89, 0xa4, 0x19, 0x3b, 0x54, 0x24, 0xf3, 0x15, 0x34, 0xf3, 0xe1, 0xae, 0xa7, 0x23, - 0xde, 0xec, 0xd0, 0x2b, 0x6d, 0xdc, 0xba, 0x27, 0xba, 0xb8, 0x22, 0x61, 0x68, 0xf5, 0xf1, 0xa0, 0xf2, 0xfe, 0x7c, - 0x39, 0x94, 0x57, 0xb6, 0xf2, 0x83, 0x70, 0x98, 0xb5, 0x3b, 0x78, 0xbe, 0x8e, 0x8c, 0x0f, 0x33, 0x92, 0xb3, 0x0c, - 0x16, 0x81, 0x07, 0x73, 0x96, 0xa2, 0x85, 0x6f, 0xca, 0x32, 0x1b, 0x64, 0x6a, 0xb4, 0x80, 0xc5, 0x8b, 0xfc, 0x1b, - 0x1b, 0x5f, 0x96, 0xd9, 0x58, 0xc1, 0xec, 0x75, 0x20, 0x3b, 0x25, 0x90, 0x98, 0xa3, 0xda, 0x9d, 0x0d, 0xa8, 0xa2, - 0x87, 0x27, 0x00, 0x57, 0xf0, 0x87, 0xc7, 0x2c, 0xd0, 0x39, 0x35, 0xce, 0xd7, 0xb0, 0x56, 0x1e, 0x35, 0x36, 0x59, - 0xd7, 0x44, 0x50, 0xa4, 0x16, 0xab, 0xd0, 0x4b, 0x92, 0x48, 0x1d, 0xaa, 0xfc, 0x8f, 0x2f, 0x9c, 0x53, 0x73, 0xef, - 0x68, 0xeb, 0x31, 0xd7, 0x13, 0xd2, 0x56, 0x51, 0x93, 0x33, 0x3d, 0x2e, 0xa1, 0xa0, 0xfc, 0x9c, 0x0a, 0x95, 0xe2, - 0xcb, 0x74, 0xe7, 0x66, 0x55, 0xc1, 0x00, 0x6a, 0x06, 0x30, 0xfa, 0x51, 0x40, 0x46, 0x6a, 0xfc, 0x78, 0xa2, 0x5e, - 0xf7, 0x31, 0x37, 0x74, 0xd0, 0xe2, 0x4c, 0x37, 0xb0, 0x47, 0xb2, 0x1d, 0x8e, 0x6a, 0x80, 0xf2, 0x21, 0x9e, 0x04, - 0x9e, 0x22, 0x9a, 0xa4, 0x59, 0x5f, 0xf1, 0xb7, 0xe9, 0xdc, 0xf6, 0x64, 0x1d, 0x00, 0x2d, 0x2c, 0x98, 0x41, 0xb3, - 0x49, 0xdf, 0x4b, 0xd0, 0x80, 0x1f, 0xc6, 0xce, 0x30, 0xdf, 0x3b, 0xa1, 0xf6, 0xce, 0x0e, 0xbd, 0x9e, 0x7d, 0xe5, - 0x9c, 0x70, 0x3e, 0x53, 0x2f, 0xc6, 0x51, 0xd8, 0x45, 0x9d, 0xc5, 0x93, 0x3f, 0x7c, 0xa6, 0xc2, 0x78, 0x4c, 0xc4, - 0x45, 0x2c, 0x35, 0xb8, 0x20, 0x89, 0x2d, 0x9b, 0xcd, 0x32, 0x0e, 0x7e, 0x26, 0xc3, 0x41, 0xc6, 0x04, 0x2f, 0x27, - 0xf4, 0xfe, 0x96, 0x48, 0x08, 0xb2, 0x21, 0x94, 0x4c, 0xd3, 0x90, 0x1a, 0xaf, 0x36, 0x97, 0x71, 0x99, 0xd1, 0x25, - 0xe3, 0xff, 0x66, 0x17, 0x14, 0xea, 0xb5, 0xa2, 0xe0, 0xfb, 0x2d, 0xdc, 0xf6, 0x1a, 0x9d, 0xb1, 0x67, 0xc8, 0xf4, - 0xa1, 0x39, 0x4c, 0x19, 0x29, 0x0c, 0x77, 0xed, 0x29, 0x48, 0x90, 0x99, 0x97, 0xe1, 0xfd, 0x86, 0xfd, 0x36, 0x60, - 0x0a, 0x1e, 0xdf, 0xfb, 0x66, 0x05, 0xd8, 0x1c, 0x69, 0xa8, 0x7b, 0xee, 0x29, 0xa0, 0x1c, 0xe6, 0xc2, 0xc3, 0x1c, - 0xba, 0x42, 0xb5, 0x0f, 0xb9, 0xab, 0xa7, 0x7a, 0x15, 0x0b, 0xcb, 0xc1, 0xa6, 0x6e, 0x54, 0x9b, 0x84, 0xea, 0xb8, - 0x5c, 0x03, 0xd2, 0x9e, 0xd0, 0x0c, 0xb4, 0x1e, 0x46, 0x54, 0xeb, 0x64, 0x97, 0xde, 0x4a, 0x30, 0xba, 0x24, 0x91, - 0x06, 0x26, 0xcb, 0x9c, 0xd4, 0x00, 0xa6, 0x45, 0x98, 0x03, 0xbf, 0x23, 0x39, 0xae, 0x91, 0x80, 0xce, 0x71, 0xd8, - 0x35, 0xac, 0x26, 0xa5, 0xf3, 0x5c, 0xb5, 0x24, 0x15, 0xa4, 0x22, 0x42, 0x25, 0x53, 0x25, 0xa5, 0x63, 0xc2, 0x39, - 0xae, 0x06, 0x24, 0xc3, 0x94, 0x0a, 0x6a, 0x6f, 0xa3, 0x52, 0x1a, 0xcb, 0x59, 0x18, 0x3e, 0x71, 0xf9, 0x33, 0xaa, - 0xf9, 0xb2, 0x65, 0x23, 0x89, 0xec, 0x35, 0xd3, 0xc5, 0x82, 0x3b, 0xf3, 0x27, 0x70, 0x07, 0xbe, 0xfb, 0x8a, 0x9a, - 0xf2, 0xbe, 0x3c, 0x18, 0x25, 0x26, 0x32, 0x7e, 0x4d, 0xf5, 0x15, 0xcc, 0x65, 0x3e, 0x43, 0x28, 0xd3, 0x6f, 0x3d, - 0x56, 0x67, 0x0b, 0x61, 0x53, 0x49, 0xec, 0xfe, 0xfd, 0xe4, 0x87, 0x02, 0x5e, 0xf0, 0x43, 0x8f, 0xcf, 0x56, 0x13, - 0x04, 0x89, 0x45, 0xb3, 0x0a, 0x7b, 0x8b, 0x9c, 0x18, 0x40, 0x54, 0xf6, 0x68, 0x6e, 0x2f, 0xa9, 0xa1, 0x23, 0x52, - 0x8f, 0x3b, 0x27, 0xac, 0xec, 0x6d, 0x4b, 0x9e, 0xbd, 0x5a, 0xd5, 0x53, 0xaa, 0x63, 0xc2, 0x80, 0x9b, 0xbf, 0xf1, - 0x75, 0x6e, 0xeb, 0xbb, 0x1b, 0x30, 0xd8, 0x12, 0xed, 0xc7, 0x91, 0x22, 0x80, 0x9d, 0x60, 0x8a, 0x43, 0xce, 0xf9, - 0xf1, 0xa6, 0x7a, 0xf9, 0xbf, 0x27, 0x47, 0x15, 0xae, 0xcf, 0x11, 0xb8, 0xc4, 0xe8, 0x74, 0x33, 0x76, 0xee, 0xee, - 0xa8, 0xf4, 0x0d, 0x1f, 0x80, 0x5d, 0x67, 0x10, 0xf4, 0x90, 0x7b, 0x12, 0xde, 0x52, 0x2a, 0x9c, 0xf6, 0x4d, 0x67, - 0xa4, 0xc7, 0xa2, 0xe5, 0x43, 0x78, 0x6c, 0x77, 0x10, 0xac, 0x67, 0xcb, 0xb2, 0xa0, 0xa9, 0x04, 0x68, 0xa6, 0x18, - 0xe0, 0xc8, 0x43, 0xec, 0x1c, 0xc9, 0xac, 0x1c, 0xe3, 0x6e, 0x8e, 0xf7, 0x32, 0x88, 0x0e, 0xd1, 0x11, 0x4f, 0xa5, - 0x25, 0xb2, 0x8c, 0x6d, 0xa9, 0xc2, 0xb5, 0x4f, 0x71, 0x5a, 0xd8, 0xa2, 0xab, 0xca, 0x44, 0xbf, 0xfc, 0x08, 0xc4, - 0xd3, 0x37, 0x7a, 0x5e, 0xbb, 0xd9, 0x24, 0xb2, 0x37, 0x74, 0xb5, 0xfc, 0x92, 0x5b, 0x94, 0x56, 0xae, 0xc6, 0x00, - 0x2b, 0xf6, 0x3a, 0xef, 0x09, 0x84, 0x33, 0x25, 0x0e, 0xb7, 0xf9, 0x9d, 0x61, 0xb6, 0xb4, 0xb1, 0xba, 0x19, 0x9d, - 0x62, 0xdc, 0xd6, 0xdb, 0xfd, 0x40, 0x67, 0x37, 0x24, 0x7c, 0x78, 0xe3, 0xfb, 0xd0, 0x03, 0xa9, 0x24, 0xb8, 0xe2, - 0xee, 0xca, 0x7b, 0x0b, 0xc2, 0xec, 0x81, 0x9c, 0x3e, 0x7a, 0x42, 0x82, 0x5e, 0xc0, 0xfe, 0x7c, 0x1e, 0x1e, 0xf3, - 0x92, 0x38, 0x36, 0xca, 0xc7, 0x1f, 0xd6, 0x58, 0xe1, 0x96, 0xe8, 0x70, 0x89, 0x48, 0xdf, 0xc3, 0xe0, 0xc5, 0x13, - 0x86, 0xa4, 0xea, 0x7f, 0xbc, 0x91, 0x50, 0xc5, 0x33, 0x85, 0xce, 0xed, 0xb4, 0x39, 0x27, 0x88, 0xe5, 0xce, 0x55, - 0x66, 0xaf, 0x1d, 0x85, 0xbd, 0xe3, 0xea, 0x96, 0x74, 0x5f, 0xf6, 0x95, 0x9a, 0x5b, 0x8d, 0x48, 0xb0, 0x91, 0xe1, - 0x79, 0x6e, 0xf5, 0x22, 0xb3, 0x43, 0xd6, 0x45, 0x0e, 0xb0, 0xe9, 0x4c, 0x16, 0x47, 0xed, 0xcd, 0xe8, 0x8b, 0xea, - 0x8a, 0xed, 0xaa, 0x6a, 0x95, 0xc6, 0x25, 0x1d, 0xb4, 0xe6, 0x54, 0xc9, 0x0f, 0xc0, 0x36, 0x22, 0x7f, 0xa7, 0x47, - 0x9d, 0xa9, 0x87, 0x4a, 0x39, 0xad, 0x75, 0x20, 0x8c, 0x87, 0x91, 0xde, 0xcf, 0xc0, 0x40, 0x51, 0x09, 0x6c, 0xb7, - 0x43, 0xe7, 0xa7, 0x5b, 0x93, 0x92, 0x91, 0x53, 0x50, 0x52, 0x56, 0x03, 0xd3, 0x44, 0x91, 0x75, 0x9e, 0x63, 0xf6, - 0x77, 0xc7, 0xd3, 0x9f, 0x3b, 0x0e, 0x1a, 0x31, 0xb3, 0x0b, 0x63, 0xff, 0xb8, 0x77, 0x4d, 0x36, 0xa4, 0x70, 0xea, - 0xc0, 0x24, 0xce, 0x92, 0xb4, 0xfe, 0x7d, 0xad, 0x99, 0xfe, 0xba, 0xe9, 0x7a, 0x09, 0x1f, 0xe8, 0xe1, 0xd8, 0x6e, - 0xb5, 0xf9, 0xa1, 0x7c, 0x60, 0x25, 0xbe, 0xf0, 0xdb, 0x35, 0x1d, 0xbe, 0x0c, 0x3d, 0xf7, 0x39, 0xcc, 0x61, 0x6d, - 0xc5, 0xde, 0x48, 0xa6, 0x05, 0x81, 0xde, 0x6e, 0x77, 0x12, 0xc6, 0x80, 0xfb, 0x7a, 0x8e, 0xa8, 0x7c, 0xe6, 0x72, - 0xf4, 0x4c, 0xa2, 0x04, 0xa6, 0xa3, 0xc1, 0xa3, 0x16, 0xa0, 0xe2, 0x13, 0x8b, 0xd3, 0xe1, 0x01, 0x36, 0x38, 0xb8, - 0x3b, 0x8c, 0xd1, 0x8f, 0x75, 0xf7, 0x6d, 0xea, 0xb3, 0x6c, 0xf8, 0x1a, 0x8e, 0x45, 0x5d, 0xfe, 0x70, 0x55, 0x1b, - 0xc7, 0xa2, 0xc7, 0xea, 0x2a, 0x3e, 0x1a, 0x17, 0xf5, 0x06, 0x43, 0xac, 0xce, 0x03, 0x1c, 0x55, 0xa4, 0x6c, 0xce, - 0x6c, 0xa1, 0x24, 0x81, 0xea, 0xad, 0xd5, 0xfc, 0x32, 0xb0, 0x5b, 0x83, 0x0d, 0xd1, 0xfc, 0x6c, 0xbd, 0x87, 0xef, - 0xe2, 0x27, 0x9f, 0x6d, 0xc9, 0x7c, 0x9b, 0x9d, 0x00, 0x77, 0x96, 0x5d, 0x79, 0x92, 0xd5, 0x8a, 0x77, 0x5b, 0x5f, - 0xbc, 0xef, 0x5f, 0x58, 0x2f, 0x84, 0x84, 0xf3, 0x4b, 0x7a, 0xbb, 0x96, 0x43, 0x1a, 0xc4, 0xf6, 0xaf, 0x26, 0x90, - 0x7f, 0x4a, 0x33, 0x77, 0xfe, 0x58, 0x19, 0x82, 0x63, 0x84, 0x1a, 0x6f, 0x09, 0x16, 0x5c, 0x7a, 0x45, 0x4a, 0xb1, - 0xcd, 0x6a, 0xa7, 0x95, 0x8c, 0xb5, 0xe6, 0xbe, 0xd2, 0x96, 0xb4, 0xca, 0x9d, 0x55, 0x40, 0x5c, 0x5d, 0x9a, 0xf8, - 0x50, 0x60, 0x35, 0x7b, 0x52, 0x96, 0xa4, 0x50, 0x1a, 0x2f, 0xfe, 0x91, 0x78, 0x47, 0x40, 0xe5, 0xea, 0x25, 0x42, - 0x30, 0xae, 0xbf, 0xef, 0xec, 0x2c, 0x3b, 0xcd, 0x1e, 0x32, 0xd5, 0x23, 0x2f, 0x2f, 0xc3, 0x39, 0x8a, 0x52, 0xa5, - 0xf1, 0x1d, 0x9c, 0x71, 0x23, 0x46, 0xbd, 0x7b, 0xf6, 0x14, 0x21, 0xef, 0xc8, 0x6f, 0x64, 0x92, 0xc3, 0x30, 0xef, - 0xbe, 0x3a, 0x19, 0x91, 0xe6, 0xf6, 0x0e, 0xe8, 0x62, 0x93, 0x29, 0xeb, 0x2c, 0xd8, 0x92, 0x0a, 0x12, 0x09, 0xd1, - 0xed, 0x90, 0x90, 0xbd, 0xb4, 0x6f, 0x48, 0x51, 0x54, 0xa7, 0x7a, 0xc8, 0x50, 0x4f, 0x3b, 0x7e, 0x5c, 0x47, 0x4c, - 0xc7, 0xda, 0x22, 0x1d, 0x91, 0x0c, 0x20, 0x18, 0x33, 0x5e, 0x42, 0xa6, 0x5a, 0x33, 0xbc, 0x56, 0x13, 0x4f, 0x19, - 0xdd, 0x59, 0x0f, 0x0c, 0x13, 0xa9, 0x20, 0x76, 0xde, 0xd7, 0x24, 0x52, 0x76, 0xeb, 0xc5, 0x67, 0xa5, 0x0c, 0xcb, - 0x7b, 0x78, 0xd6, 0xb5, 0xa7, 0x6c, 0x52, 0x06, 0x24, 0x96, 0xfb, 0x95, 0x8d, 0x5f, 0xeb, 0xe8, 0x4a, 0x9e, 0xd1, - 0xce, 0x03, 0x00, 0xa6, 0x96, 0xf8, 0x7d, 0xea, 0x32, 0x5f, 0xba, 0xd5, 0x8b, 0xed, 0x35, 0xba, 0x05, 0xb8, 0xf6, - 0xa8, 0x66, 0x9e, 0xf6, 0x16, 0xbb, 0xa7, 0x42, 0x07, 0x74, 0xd5, 0x30, 0x5b, 0xfc, 0xe5, 0x8d, 0x0f, 0xb7, 0xc4, - 0xbd, 0x3a, 0x95, 0xe8, 0x63, 0x7e, 0x2d, 0x2e, 0xfc, 0xa7, 0xdc, 0x91, 0x80, 0xd1, 0x31, 0x3e, 0x29, 0xa4, 0x0d, - 0xab, 0x22, 0x64, 0x42, 0x75, 0xbf, 0x38, 0x4d, 0xe0, 0x00, 0x03, 0xd3, 0xb9, 0xc9, 0x62, 0x96, 0xee, 0xae, 0x9c, - 0xea, 0x3e, 0x18, 0xc0, 0xaa, 0x76, 0xda, 0x9c, 0x7a, 0xea, 0x6e, 0x43, 0xeb, 0x18, 0x17, 0xdf, 0x42, 0x4d, 0x86, - 0xb0, 0xb5, 0x5e, 0xa8, 0x48, 0xd3, 0xbc, 0xc5, 0xca, 0x9f, 0x64, 0xdb, 0x1b, 0x60, 0xe8, 0x42, 0x62, 0x6b, 0x3e, - 0x28, 0x41, 0x7c, 0x50, 0x17, 0xc2, 0xbe, 0xa3, 0x81, 0x68, 0x71, 0x86, 0x75, 0x93, 0x2a, 0xd3, 0x7e, 0x46, 0x8e, - 0x26, 0xd4, 0xfa, 0x3e, 0xf6, 0xcf, 0xba, 0x73, 0xfa, 0x57, 0x24, 0xb5, 0x4c, 0xd3, 0x1c, 0xc9, 0xe8, 0x44, 0xd8, - 0xd8, 0x60, 0x20, 0x8d, 0x11, 0x2f, 0x3d, 0xfd, 0x9c, 0xbb, 0x75, 0xcd, 0x28, 0xb0, 0x7e, 0x83, 0xf1, 0x7a, 0xe0, - 0xe4, 0x9a, 0x5c, 0x04, 0x7a, 0x26, 0x46, 0x59, 0x0f, 0xa9, 0x67, 0x5e, 0x2f, 0xd5, 0xfb, 0x9c, 0x8b, 0x09, 0x42, - 0x85, 0xd7, 0x1c, 0x87, 0xf4, 0x13, 0xc0, 0xe3, 0x26, 0x5b, 0x24, 0x3f, 0x6a, 0x70, 0x1e, 0xf6, 0x49, 0xac, 0x2c, - 0x0e, 0x2f, 0x68, 0x7a, 0xf6, 0xbc, 0x0a, 0xf3, 0x03, 0xf9, 0xd3, 0xb9, 0x32, 0xc0, 0x18, 0xc9, 0xdd, 0xc4, 0xae, - 0x08, 0x4d, 0x01, 0x1c, 0x2a, 0xb5, 0x8e, 0x83, 0x68, 0x80, 0x39, 0xec, 0xfb, 0x72, 0x4b, 0x94, 0x91, 0x02, 0x58, - 0x9d, 0xe1, 0x0c, 0x60, 0x07, 0x25, 0xd9, 0x31, 0xd6, 0x62, 0x64, 0x01, 0x8f, 0x86, 0xab, 0x89, 0xd3, 0xa2, 0xda, - 0x8b, 0x8b, 0x31, 0x31, 0xf0, 0x18, 0xd1, 0x32, 0x69, 0xdc, 0x0c, 0xa6, 0xb9, 0x21, 0xe8, 0x66, 0x87, 0xce, 0xdc, - 0xdc, 0xb6, 0xb3, 0x08, 0x4e, 0x6f, 0x7f, 0x06, 0xce, 0x0f, 0xe2, 0xbe, 0x76, 0x45, 0xc4, 0xfd, 0x2b, 0x19, 0x70, - 0x25, 0x85, 0xe7, 0x6c, 0x82, 0xa0, 0x1f, 0xad, 0x7d, 0xa6, 0x41, 0x3c, 0x63, 0xcf, 0xa5, 0x4e, 0x05, 0x0c, 0xfe, - 0xa2, 0x11, 0xaf, 0x53, 0x4f, 0x4c, 0x87, 0x45, 0xf4, 0x3d, 0xd1, 0x6c, 0xa0, 0x31, 0x32, 0xdd, 0x6d, 0xef, 0x9a, - 0x21, 0x44, 0x9f, 0x98, 0x52, 0x96, 0x08, 0x80, 0xf3, 0x2f, 0x2b, 0x84, 0xfb, 0xb7, 0x82, 0x84, 0x05, 0x92, 0xe7, - 0x6a, 0xd7, 0xc4, 0x0d, 0xb0, 0x56, 0xcb, 0x19, 0x77, 0x24, 0x82, 0xd9, 0x98, 0xcb, 0x4c, 0xf4, 0x48, 0x12, 0x67, - 0x90, 0xca, 0x66, 0x5b, 0xc3, 0xdc, 0xdb, 0x06, 0x33, 0x21, 0xca, 0x11, 0x0c, 0xde, 0xbd, 0x85, 0x0d, 0x26, 0xb5, - 0x29, 0x25, 0x4e, 0x43, 0x35, 0x24, 0xf9, 0xb2, 0x17, 0xdb, 0xd5, 0x9d, 0x74, 0x1b, 0x68, 0x32, 0x7f, 0xf7, 0xc5, - 0xc1, 0x7d, 0x64, 0xfb, 0xbc, 0x55, 0xec, 0x85, 0x49, 0xb5, 0x7c, 0xda, 0xba, 0x74, 0xae, 0xbd, 0xb8, 0x46, 0x2f, - 0x4d, 0x5f, 0xb5, 0xdf, 0x58, 0x9f, 0xe7, 0x20, 0x47, 0x45, 0x9f, 0xf7, 0x97, 0x0b, 0x08, 0x9a, 0xba, 0x8c, 0x3b, - 0x01, 0x2e, 0x18, 0x51, 0x7a, 0xae, 0x33, 0x02, 0x5b, 0xc2, 0x3c, 0x2d, 0x9b, 0x2b, 0xbc, 0x3c, 0x3f, 0x38, 0x4d, - 0xa8, 0x54, 0xe8, 0x35, 0xbf, 0xaf, 0xde, 0xab, 0xb5, 0xc7, 0xe5, 0x61, 0xff, 0xbd, 0x48, 0xce, 0x40, 0x91, 0x76, - 0x46, 0x7e, 0xb4, 0xac, 0x83, 0x78, 0xdb, 0x9a, 0xbe, 0xbd, 0x96, 0x3f, 0x4c, 0x48, 0xa6, 0xca, 0x6d, 0x08, 0x16, - 0x93, 0xbe, 0xdf, 0x65, 0xf0, 0x93, 0x6c, 0x45, 0x4a, 0x0c, 0x34, 0x8a, 0x5d, 0xc6, 0x3c, 0xd9, 0xa4, 0x5e, 0x37, - 0x15, 0xdd, 0xf8, 0x50, 0xcf, 0x76, 0x18, 0x6f, 0xe0, 0xb1, 0x9e, 0x7c, 0x34, 0x77, 0xaa, 0xee, 0x5a, 0xf8, 0xba, - 0xba, 0x13, 0xda, 0xed, 0xed, 0xeb, 0x45, 0x69, 0x5e, 0x77, 0x27, 0xda, 0x3a, 0x45, 0xcf, 0xeb, 0xff, 0xeb, 0x39, - 0xe3, 0xe0, 0x6d, 0x0a, 0xef, 0x05, 0xf8, 0x76, 0x7c, 0xf6, 0x3c, 0x03, 0x8a, 0x96, 0x59, 0xb4, 0x32, 0xb9, 0xc6, - 0x39, 0x0e, 0x18, 0x55, 0xa8, 0xf3, 0x9a, 0xa9, 0x36, 0x4e, 0x6c, 0x58, 0xef, 0x78, 0x79, 0x55, 0x00, 0x71, 0x87, - 0x6b, 0x59, 0x6e, 0xe2, 0xc2, 0xfc, 0xe6, 0x99, 0x12, 0x92, 0xcd, 0x63, 0x6d, 0xd5, 0xe9, 0x77, 0x49, 0x49, 0x0e, - 0x03, 0x6e, 0x73, 0xe9, 0xc3, 0x4d, 0xe5, 0xa1, 0x0b, 0xdd, 0x2e, 0xca, 0x09, 0x22, 0x95, 0xba, 0x13, 0xa8, 0x70, - 0x6c, 0x8b, 0x15, 0x75, 0xa9, 0xed, 0x1b, 0xdf, 0x17, 0xfc, 0xb2, 0x10, 0x7c, 0x63, 0x27, 0x36, 0x31, 0x5b, 0xa9, - 0x66, 0x24, 0xe1, 0x67, 0x10, 0xcc, 0x71, 0xe5, 0x99, 0xda, 0xed, 0xf0, 0x7f, 0x14, 0x4d, 0x45, 0x0a, 0xe8, 0x12, - 0x87, 0x08, 0x99, 0x99, 0x63, 0x8a, 0x1e, 0xac, 0x10, 0x3a, 0x8b, 0x94, 0x0f, 0x76, 0x73, 0xf0, 0x7d, 0xeb, 0xe7, - 0xb6, 0xae, 0xda, 0xe5, 0x5e, 0xd1, 0xd3, 0x34, 0x25, 0x5a, 0x52, 0xa8, 0xa4, 0x91, 0xb5, 0x43, 0x7d, 0xad, 0xaf, - 0xdd, 0x48, 0x41, 0x2d, 0xb2, 0x20, 0x7a, 0x9d, 0xaf, 0x0d, 0x20, 0x4d, 0x2a, 0xfe, 0xc2, 0xbf, 0x7f, 0x16, 0x89, - 0x37, 0xb5, 0x88, 0x86, 0xfa, 0x3a, 0x6d, 0x5d, 0x7d, 0x15, 0x8f, 0x0d, 0xd7, 0x56, 0xfd, 0x18, 0xe5, 0xe6, 0x46, - 0xca, 0xfb, 0x89, 0xf9, 0xf3, 0xaf, 0x36, 0x0d, 0x8d, 0xc0, 0x49, 0xf3, 0xe6, 0x76, 0xee, 0x30, 0xe7, 0x9e, 0x23, - 0x35, 0x1c, 0xb2, 0x6f, 0x40, 0x6e, 0x91, 0x2f, 0xb5, 0x6b, 0x22, 0x71, 0x81, 0xb0, 0x89, 0x60, 0x43, 0xdc, 0x47, - 0xc6, 0x8c, 0x6e, 0x5d, 0xe3, 0xe0, 0xdd, 0xa5, 0x4c, 0x9d, 0x96, 0x6a, 0x2e, 0xa7, 0x42, 0x99, 0x49, 0x2a, 0xfa, - 0xd5, 0x46, 0x7f, 0x76, 0xe5, 0x94, 0xb8, 0x0e, 0x2a, 0xbf, 0x8d, 0x38, 0x75, 0x1b, 0xcd, 0xb4, 0xbf, 0x95, 0xaf, - 0x7a, 0x5c, 0xd4, 0x5f, 0xd2, 0xe3, 0xbd, 0xb5, 0x47, 0x6e, 0x4d, 0x2d, 0x3d, 0xe2, 0xfe, 0x6a, 0xbb, 0xaf, 0xf2, - 0x39, 0x0e, 0x22, 0x54, 0x3b, 0x21, 0xc6, 0xa5, 0x88, 0x02, 0x0e, 0xe0, 0x15, 0xf1, 0x5f, 0x90, 0xeb, 0xf1, 0xac, - 0x4e, 0xd1, 0x8f, 0x3d, 0xd0, 0xde, 0x6d, 0x9e, 0x03, 0x4e, 0xa9, 0x72, 0xca, 0xbe, 0x23, 0x6b, 0xb3, 0x2c, 0xd2, - 0xae, 0x77, 0x66, 0xb3, 0xa8, 0x58, 0x11, 0x00, 0xc8, 0xde, 0xe9, 0x53, 0x97, 0x75, 0x28, 0xb7, 0x1b, 0x08, 0xb7, - 0x4a, 0x66, 0xc2, 0x4c, 0x14, 0xfe, 0xba, 0x63, 0xc0, 0x0b, 0x21, 0xce, 0x0d, 0x5f, 0x79, 0x49, 0xe3, 0x44, 0x45, - 0x6c, 0x88, 0x1f, 0x94, 0x07, 0xc7, 0xe1, 0xd6, 0xfe, 0xb0, 0x6d, 0x64, 0x22, 0x87, 0xe8, 0x60, 0x35, 0x4a, 0xf7, - 0xc6, 0x77, 0x44, 0x76, 0x3f, 0xde, 0x5f, 0x6b, 0x89, 0x40, 0x4b, 0xcb, 0xf7, 0x6a, 0x57, 0x13, 0xce, 0x9f, 0xde, - 0x76, 0x15, 0x9b, 0x94, 0x19, 0xc5, 0xb7, 0x54, 0xb6, 0xaf, 0xbe, 0xff, 0x8a, 0x7e, 0x16, 0x25, 0x99, 0xc2, 0xd7, - 0xb2, 0x85, 0xe7, 0xd6, 0x32, 0x23, 0x0d, 0x00, 0x55, 0x24, 0x46, 0x73, 0xc9, 0xd3, 0x2e, 0xe9, 0x30, 0x10, 0x6d, - 0xfc, 0x58, 0x6c, 0x9a, 0x45, 0xa8, 0x28, 0x7b, 0xc0, 0x66, 0xa3, 0x1b, 0x32, 0x08, 0x4f, 0xd0, 0x8b, 0x7f, 0xa5, - 0x03, 0x2f, 0x2a, 0xe7, 0xca, 0xd2, 0xad, 0x2f, 0x6f, 0xeb, 0x6f, 0xd2, 0xf5, 0xa4, 0xd6, 0xbb, 0x32, 0x5c, 0x2c, - 0x68, 0x46, 0xbe, 0xf2, 0x5f, 0x0d, 0xe0, 0x75, 0x48, 0xd3, 0x19, 0x0b, 0x7f, 0x62, 0xea, 0x1e, 0x79, 0x5b, 0x99, - 0xf7, 0xdb, 0x65, 0x73, 0x3e, 0x68, 0x1f, 0xbc, 0xa4, 0xaa, 0x3f, 0xe0, 0xf8, 0xc8, 0x79, 0xb8, 0xbf, 0x8a, 0x69, - 0x6e, 0x45, 0xc1, 0x80, 0xe7, 0xa3, 0x15, 0x4d, 0xba, 0xab, 0x47, 0x2b, 0x22, 0x8c, 0x25, 0x4e, 0x2d, 0x6e, 0x75, - 0x21, 0x93, 0xa3, 0xdc, 0x42, 0xdf, 0xc9, 0xcb, 0xdc, 0xe2, 0x3a, 0xda, 0xcb, 0xcc, 0xf4, 0x94, 0x55, 0xf7, 0x1b, - 0xc2, 0xa8, 0x8f, 0xcc, 0x2e, 0x5a, 0x05, 0xa7, 0x95, 0x46, 0xb8, 0xa1, 0x5e, 0x6b, 0x8a, 0x05, 0xce, 0x8d, 0x82, - 0x5a, 0xd5, 0x3b, 0x4f, 0xbb, 0xc6, 0x41, 0xb6, 0x99, 0xd3, 0x8a, 0xd0, 0xed, 0x57, 0xb8, 0xa7, 0xb0, 0xae, 0xf3, - 0xe0, 0x6a, 0x4e, 0x34, 0x38, 0x8d, 0xdb, 0x6d, 0xb3, 0x88, 0x16, 0xb2, 0x8b, 0x15, 0xfd, 0x7a, 0x00, 0xfe, 0x8b, - 0x1d, 0x8a, 0x0f, 0x5b, 0xa9, 0xb1, 0x15, 0x23, 0x2b, 0x34, 0xf5, 0x76, 0x8e, 0x08, 0xff, 0xc2, 0xb7, 0xe4, 0x76, - 0x5b, 0xaa, 0x08, 0x35, 0x75, 0xb3, 0x6a, 0x7b, 0xed, 0x64, 0xbf, 0x34, 0x49, 0xfb, 0x61, 0x9e, 0x9e, 0x10, 0x2a, - 0x51, 0x7b, 0x73, 0x68, 0x88, 0x25, 0xd7, 0x46, 0x9c, 0x1b, 0x4c, 0x48, 0xe3, 0xbf, 0xbf, 0x11, 0x90, 0x13, 0x29, - 0xe9, 0x70, 0x39, 0xf6, 0x2c, 0xc5, 0x48, 0xa2, 0xf9, 0xc8, 0xe0, 0x75, 0x0a, 0x8b, 0xb4, 0x95, 0x27, 0xd7, 0x2d, - 0x75, 0x43, 0xdd, 0x35, 0x7d, 0x92, 0xaa, 0xe3, 0xbc, 0x38, 0xc2, 0xdd, 0xa9, 0x82, 0x46, 0xf5, 0xe6, 0xe4, 0x0c, - 0x49, 0xdb, 0x99, 0x17, 0x42, 0xf2, 0x41, 0xbc, 0x96, 0x44, 0x8a, 0xed, 0x27, 0x59, 0xea, 0x3e, 0xbe, 0x39, 0x88, - 0x0a, 0x84, 0x8b, 0x70, 0x8c, 0xc4, 0xfe, 0x14, 0x63, 0x8a, 0xee, 0x2c, 0x4a, 0x82, 0x4d, 0xd5, 0xc9, 0x19, 0x3a, - 0xd3, 0x7c, 0x02, 0x81, 0x65, 0x37, 0xc8, 0xe8, 0xa0, 0x2e, 0x62, 0x7e, 0xf4, 0xed, 0x10, 0x37, 0xbf, 0xe5, 0xe0, - 0x1a, 0x6d, 0xcf, 0x8c, 0x33, 0xa5, 0xb6, 0xf8, 0xa7, 0x39, 0x5c, 0x9f, 0xc0, 0xec, 0xee, 0x50, 0xc2, 0x89, 0x38, - 0x92, 0x50, 0xaf, 0x3f, 0x57, 0x3f, 0x6c, 0x22, 0x85, 0xce, 0x09, 0xad, 0x0d, 0xb4, 0xf8, 0x34, 0xa7, 0xab, 0x05, - 0x1f, 0xc6, 0x61, 0xc7, 0x90, 0xa9, 0x92, 0xfc, 0x2e, 0xfa, 0xdc, 0xcf, 0x05, 0x18, 0xde, 0x43, 0x5c, 0xe7, 0x7b, - 0x67, 0x47, 0xcd, 0xc2, 0x2d, 0x84, 0xed, 0x4f, 0xa3, 0x84, 0x1c, 0xf4, 0x6b, 0xe5, 0xe7, 0x88, 0x5f, 0x7d, 0xa4, - 0x67, 0xb2, 0xe1, 0x87, 0x43, 0xb4, 0xb8, 0x96, 0xb0, 0x24, 0xc3, 0xe8, 0xfd, 0x8b, 0x57, 0x18, 0xf6, 0x12, 0x18, - 0x3c, 0x83, 0xbd, 0x05, 0x02, 0xe0, 0xf6, 0xe8, 0x27, 0x0c, 0xb5, 0x54, 0x0a, 0xc2, 0xb9, 0xe4, 0x21, 0x41, 0x62, - 0x5c, 0xca, 0xd5, 0xda, 0xa4, 0x4f, 0xc0, 0x5a, 0x3b, 0x4e, 0x1d, 0x34, 0x26, 0x3d, 0xcf, 0x92, 0xe6, 0xcb, 0x98, - 0x3f, 0x0b, 0x14, 0x2c, 0x3f, 0x34, 0x35, 0xdd, 0x83, 0xa0, 0xea, 0xca, 0x18, 0x6b, 0xba, 0xa3, 0x1d, 0x04, 0xef, - 0xaf, 0xd5, 0x33, 0xa2, 0xfc, 0xdd, 0x1a, 0x93, 0x1d, 0x04, 0x85, 0x82, 0x2d, 0x6e, 0xc8, 0xa1, 0x10, 0x62, 0x57, - 0xe3, 0xce, 0xbe, 0x8b, 0x4e, 0x65, 0xa9, 0x99, 0xdc, 0x6e, 0x94, 0x4d, 0x33, 0x4c, 0x98, 0x62, 0x87, 0x56, 0xf2, - 0x05, 0x45, 0x89, 0x5d, 0xbb, 0x5a, 0x94, 0x33, 0xbf, 0xdb, 0xfa, 0x38, 0xb6, 0x50, 0x58, 0xf5, 0x39, 0x98, 0xe5, - 0xc4, 0xb4, 0x6d, 0x97, 0x81, 0xdc, 0xd9, 0x1b, 0x64, 0xaa, 0x29, 0x1b, 0x43, 0x98, 0x77, 0xcc, 0x47, 0xe6, 0xf0, - 0x3d, 0xb2, 0x3b, 0x0f, 0x99, 0xbb, 0xc9, 0x65, 0x2f, 0x3f, 0xeb, 0xf5, 0xcf, 0x1c, 0xa0, 0x90, 0xc6, 0xc0, 0xb1, - 0x79, 0xde, 0x10, 0x6b, 0x99, 0x98, 0x2e, 0x3b, 0x56, 0xba, 0x83, 0x41, 0xc1, 0xeb, 0x1c, 0x28, 0x54, 0xd2, 0x94, - 0x38, 0x71, 0x3d, 0x84, 0x35, 0xa2, 0x1c, 0xde, 0x3b, 0x31, 0xd7, 0xc9, 0x44, 0xb2, 0xf1, 0xaf, 0xf6, 0x3e, 0x5c, - 0xb4, 0x01, 0xfa, 0x78, 0x66, 0xa3, 0x16, 0x16, 0x89, 0x38, 0x85, 0x21, 0x3f, 0xaa, 0x79, 0xac, 0x49, 0xe8, 0x03, - 0x27, 0x03, 0xa9, 0xa0, 0x97, 0x0a, 0xfc, 0x6f, 0x91, 0x9c, 0xb1, 0x72, 0x4a, 0x01, 0x2a, 0xa2, 0xb5, 0x6b, 0xfe, - 0x75, 0xef, 0x7a, 0x4c, 0x82, 0x7a, 0xb5, 0x00, 0x6e, 0x2d, 0x25, 0x92, 0x9f, 0xfb, 0xdb, 0x30, 0x3a, 0xcc, 0x8c, - 0x93, 0xce, 0xf3, 0xea, 0x57, 0x4f, 0x2e, 0x22, 0x99, 0xa2, 0x2d, 0x04, 0x4f, 0x5d, 0x0c, 0x4c, 0xe4, 0x21, 0x9e, - 0x9b, 0x76, 0xd0, 0xa5, 0xc6, 0xa1, 0xfc, 0xcb, 0xae, 0xe3, 0x68, 0x6c, 0x16, 0xe3, 0x04, 0x42, 0x95, 0xea, 0xf2, - 0x3c, 0x73, 0x5d, 0xd6, 0x8b, 0x3d, 0x69, 0xa2, 0xae, 0xac, 0xf4, 0x5b, 0xa8, 0x98, 0x37, 0xba, 0x3a, 0x45, 0x6d, - 0x31, 0xad, 0x93, 0x97, 0x6d, 0x56, 0x66, 0xd5, 0x04, 0x6f, 0x43, 0xb6, 0x11, 0x4e, 0x76, 0xc1, 0x7e, 0x3a, 0xc7, - 0x4b, 0x77, 0x0d, 0x8d, 0x12, 0xbc, 0x84, 0x54, 0xd1, 0xdf, 0x99, 0x16, 0x0e, 0x24, 0x5a, 0x51, 0xb2, 0xf6, 0xa5, - 0xff, 0x66, 0x37, 0x9c, 0xe4, 0x5c, 0x47, 0xef, 0x50, 0x7b, 0x1c, 0x8a, 0x66, 0x3c, 0x26, 0x6b, 0x9c, 0xe7, 0x74, - 0x29, 0x70, 0xc9, 0x92, 0x72, 0xee, 0x05, 0xbb, 0x2b, 0x90, 0xf2, 0xfa, 0xcb, 0x16, 0x09, 0x99, 0x70, 0xfb, 0x3c, - 0x19, 0xb8, 0x8c, 0x09, 0xd2, 0x83, 0xde, 0xf5, 0x03, 0xd5, 0x58, 0xe0, 0xee, 0x97, 0x39, 0xe7, 0x7f, 0xae, 0x48, - 0x92, 0x86, 0x78, 0x68, 0x11, 0x1c, 0xa6, 0xda, 0xaf, 0xc0, 0xad, 0x63, 0xc0, 0xb5, 0x59, 0x99, 0x3e, 0xf8, 0xf5, - 0xf8, 0x40, 0x34, 0x02, 0xff, 0xf9, 0xf8, 0x2b, 0xe2, 0xd0, 0x83, 0x67, 0x2b, 0x42, 0xb2, 0xae, 0x87, 0x8b, 0x34, - 0xff, 0xd5, 0xee, 0x13, 0x80, 0x45, 0xb8, 0x91, 0x74, 0x2c, 0x01, 0x1d, 0xdf, 0x0d, 0x0b, 0xcc, 0x53, 0x60, 0x97, - 0xd1, 0x1f, 0xb3, 0x87, 0x95, 0x6b, 0x1c, 0x2a, 0x4e, 0xb4, 0x85, 0x71, 0xb8, 0x24, 0x58, 0xde, 0xd2, 0xb9, 0x8a, - 0x40, 0x06, 0x07, 0xa4, 0x5e, 0xde, 0x19, 0xc7, 0x23, 0xf7, 0x91, 0x15, 0x1c, 0xf8, 0x66, 0x58, 0xb6, 0x47, 0x06, - 0x1c, 0xea, 0x88, 0x1e, 0xd0, 0xe1, 0xd6, 0x20, 0x43, 0x4d, 0x14, 0x63, 0x0b, 0x3e, 0x3e, 0xaa, 0xc7, 0x0c, 0xf2, - 0x5c, 0x0e, 0xf8, 0xfa, 0xc0, 0xa0, 0xe2, 0x30, 0x81, 0xfc, 0x5d, 0x08, 0x83, 0x3a, 0xec, 0xad, 0x05, 0x80, 0xd2, - 0x27, 0x88, 0xa1, 0x13, 0x87, 0xd4, 0x1b, 0xd0, 0xe4, 0x7b, 0x90, 0xd2, 0x08, 0xfe, 0xa2, 0x22, 0x33, 0x1a, 0x3d, - 0x15, 0xb3, 0x50, 0x18, 0x45, 0x2b, 0x64, 0xa8, 0x4d, 0x88, 0x34, 0x75, 0xf7, 0x96, 0x11, 0xf9, 0xb1, 0x3d, 0xf0, - 0x65, 0x69, 0xaf, 0x45, 0x22, 0x55, 0xce, 0x78, 0x1f, 0x40, 0xa9, 0x39, 0xb8, 0x0a, 0xd4, 0x3d, 0x53, 0x7d, 0x4e, - 0xc5, 0xda, 0xcc, 0xb2, 0x58, 0x78, 0x20, 0x1f, 0xe2, 0x62, 0x7c, 0x15, 0x5d, 0xbe, 0xad, 0x28, 0x9e, 0xc5, 0xdf, - 0xfd, 0xba, 0xe9, 0x43, 0x0a, 0xff, 0x52, 0xf0, 0xd5, 0x59, 0x73, 0xe5, 0x84, 0x75, 0x9e, 0x20, 0x5d, 0x37, 0x18, - 0x74, 0x5b, 0x4b, 0x2c, 0x4f, 0xce, 0xf4, 0xeb, 0x76, 0x31, 0xa5, 0x6a, 0xaa, 0xde, 0xce, 0x03, 0x08, 0xa4, 0xf6, - 0x9d, 0x49, 0x67, 0xd0, 0x2c, 0x24, 0xcb, 0x0c, 0x13, 0xfc, 0xb9, 0xc3, 0x6e, 0x50, 0x91, 0x06, 0x5e, 0xb6, 0x96, - 0x5e, 0xe1, 0x73, 0x3c, 0xae, 0xe8, 0x25, 0xa7, 0xf1, 0xb7, 0x77, 0xa4, 0x3c, 0x6d, 0xfd, 0x54, 0x2e, 0xe7, 0x65, - 0xd1, 0x97, 0xa6, 0x5f, 0xd1, 0x6f, 0x52, 0xb7, 0x3c, 0xee, 0x22, 0x02, 0xe9, 0xff, 0x2a, 0xd7, 0x35, 0x8d, 0xbe, - 0x0a, 0x7b, 0xb1, 0x8b, 0x60, 0xf4, 0xec, 0xb6, 0x6e, 0x0e, 0x39, 0x53, 0x5a, 0x94, 0x1a, 0x0c, 0x4d, 0x3a, 0xfe, - 0x32, 0x0a, 0x4b, 0xd7, 0x94, 0x76, 0xee, 0xa7, 0x3b, 0xbd, 0x54, 0x47, 0x26, 0xfe, 0x6d, 0x2f, 0x7f, 0xc8, 0x3a, - 0x6a, 0x44, 0x17, 0xfe, 0x0f, 0xfe, 0x3c, 0xa2, 0x9c, 0x2f, 0x75, 0x4a, 0xa5, 0x1d, 0xd4, 0x47, 0x55, 0x72, 0x3c, - 0x1d, 0x07, 0xca, 0x68, 0x14, 0xcf, 0xd4, 0xf1, 0xcc, 0x69, 0x26, 0xe8, 0x89, 0x6e, 0x90, 0xac, 0xe5, 0x00, 0x2d, - 0x80, 0x9a, 0x92, 0x11, 0xa7, 0xea, 0x04, 0x37, 0x13, 0xa7, 0xd7, 0x45, 0x27, 0x48, 0x4e, 0x0b, 0xc7, 0xe8, 0x73, - 0x59, 0x0c, 0x51, 0x29, 0xeb, 0xdb, 0xab, 0x23, 0xaa, 0x1e, 0x65, 0xdb, 0xd2, 0xb7, 0x8a, 0x8d, 0x76, 0xa8, 0x83, - 0x15, 0x73, 0x60, 0x97, 0x97, 0xcc, 0xd4, 0x72, 0xe6, 0x60, 0xe6, 0xa7, 0x67, 0xc0, 0x9e, 0x03, 0x66, 0xe7, 0x0c, - 0x31, 0x47, 0x11, 0xaa, 0xc4, 0xd2, 0x18, 0x14, 0x17, 0x76, 0x92, 0x48, 0x7d, 0x3e, 0xef, 0x8e, 0x52, 0x15, 0x73, - 0x6a, 0x2a, 0xaf, 0x07, 0xb0, 0x2d, 0xb1, 0xf2, 0x57, 0x34, 0xa1, 0x1f, 0xe9, 0x16, 0x23, 0xfc, 0x8d, 0x8a, 0xe3, - 0xfc, 0x7e, 0x7e, 0x9b, 0x9a, 0x29, 0x01, 0x13, 0x43, 0x4e, 0x5d, 0x9d, 0x60, 0x5d, 0xa5, 0x98, 0x96, 0xc5, 0x99, - 0x96, 0xe7, 0x7c, 0x36, 0xb6, 0x25, 0xd6, 0x42, 0x38, 0x5b, 0xde, 0xf6, 0xc6, 0x5d, 0x5e, 0x30, 0x26, 0x92, 0x24, - 0x96, 0x6d, 0x5e, 0x4d, 0x07, 0x20, 0xc1, 0x1d, 0x62, 0x9b, 0x7e, 0xc1, 0xb7, 0xa2, 0x88, 0x07, 0xb0, 0x9b, 0xcc, - 0xce, 0x62, 0xab, 0x4c, 0x07, 0xe3, 0xe0, 0x96, 0xff, 0xd5, 0xb6, 0x86, 0x02, 0x21, 0x11, 0x9f, 0x08, 0x70, 0x49, - 0x74, 0x36, 0x83, 0x3a, 0x85, 0x0c, 0x37, 0xf1, 0x9d, 0xa2, 0xc9, 0x77, 0xb4, 0xfa, 0x8e, 0x88, 0xec, 0xdb, 0xab, - 0x88, 0x28, 0x4a, 0xb9, 0x3c, 0x6a, 0xc5, 0x49, 0x8e, 0x68, 0x4e, 0xc6, 0x97, 0x8e, 0xa4, 0x9d, 0x34, 0xe3, 0x4a, - 0x4d, 0x6f, 0x8f, 0xdf, 0x65, 0x10, 0xe9, 0x57, 0xe7, 0xb9, 0x15, 0xc7, 0x79, 0x21, 0x0a, 0xca, 0x07, 0xdc, 0x86, - 0x51, 0x8d, 0x56, 0xbe, 0x99, 0xf3, 0x80, 0x76, 0x66, 0x78, 0x38, 0x9d, 0xb5, 0x6f, 0xb6, 0x2d, 0xf8, 0x72, 0x1c, - 0x0e, 0x63, 0xd3, 0xbe, 0x7f, 0xfe, 0xae, 0x7e, 0x6f, 0xc6, 0x87, 0x57, 0xde, 0x49, 0xea, 0x1d, 0x0f, 0x60, 0xea, - 0xda, 0x98, 0xad, 0x73, 0x70, 0x9e, 0xc6, 0xd8, 0x22, 0xfa, 0x5f, 0xda, 0xc6, 0x67, 0xa5, 0x7f, 0x02, 0xee, 0xc1, - 0x9d, 0x64, 0x59, 0xfa, 0xc5, 0x99, 0x46, 0x8b, 0xfc, 0x89, 0xe5, 0x49, 0xad, 0x1e, 0x74, 0x5c, 0x9a, 0x5c, 0xbc, - 0x42, 0xba, 0x3c, 0x4b, 0xbf, 0x9c, 0x2d, 0xf4, 0x8f, 0xd3, 0x55, 0x00, 0xff, 0x8f, 0x73, 0xa4, 0xb8, 0x3f, 0xa6, - 0xd9, 0x8b, 0x74, 0xe3, 0xfb, 0xb3, 0x9b, 0xd5, 0xeb, 0x82, 0x3d, 0x3a, 0x4f, 0xb6, 0x6c, 0x5d, 0x0b, 0xad, 0xa9, - 0x1b, 0x17, 0xd4, 0x9d, 0xdd, 0x66, 0xed, 0x1b, 0xeb, 0x53, 0x6b, 0xe8, 0xbb, 0x98, 0x48, 0x3f, 0x7f, 0x44, 0x3f, - 0x5d, 0x7b, 0x8a, 0x0b, 0xc3, 0x7e, 0xa7, 0xba, 0x1e, 0x35, 0x33, 0x9d, 0x0a, 0x12, 0x9a, 0x97, 0x3c, 0xdd, 0x37, - 0x39, 0xaf, 0xe5, 0xf8, 0x72, 0xf4, 0x34, 0xa2, 0xa6, 0x7d, 0x47, 0x19, 0xdd, 0x4b, 0x82, 0x31, 0xea, 0x2a, 0x35, - 0x30, 0xfa, 0xe2, 0x55, 0x05, 0x06, 0x01, 0xaa, 0xf3, 0xfa, 0x40, 0x8a, 0xc0, 0xe0, 0xc3, 0x21, 0x8f, 0xe5, 0x06, - 0x03, 0x27, 0x4b, 0xeb, 0x20, 0xf5, 0xf2, 0x20, 0x1c, 0xa9, 0xea, 0xe2, 0x6d, 0x26, 0xa0, 0xc0, 0xeb, 0xa9, 0xfe, - 0x1b, 0xdd, 0x9c, 0x1b, 0xe7, 0x69, 0xc6, 0x87, 0x73, 0x43, 0xe9, 0x52, 0x71, 0xf1, 0xda, 0xae, 0x62, 0x1c, 0x16, - 0xd5, 0x56, 0x25, 0x53, 0x32, 0x65, 0x0e, 0x13, 0xf3, 0x33, 0x41, 0x7a, 0xde, 0xa8, 0x43, 0xee, 0x97, 0x4f, 0xf2, - 0x9a, 0x2e, 0x71, 0x65, 0x92, 0x8d, 0x42, 0xf8, 0x3f, 0x34, 0x55, 0x6b, 0x0e, 0xa4, 0x46, 0xe0, 0x72, 0x70, 0xb5, - 0x54, 0xde, 0xb6, 0xb4, 0x9f, 0x3f, 0x2e, 0xdf, 0xa7, 0xb7, 0x95, 0x24, 0xf9, 0x2f, 0x4d, 0xd8, 0x98, 0xf3, 0xc9, - 0x28, 0xb4, 0x29, 0xc4, 0x0d, 0x4c, 0x45, 0x3b, 0xc6, 0x4f, 0x0a, 0x2f, 0x08, 0xea, 0xf3, 0x0e, 0x45, 0x03, 0xb0, - 0x79, 0x95, 0x8a, 0xdc, 0x19, 0x68, 0x59, 0xa2, 0x6c, 0xdd, 0xe8, 0x6b, 0xc3, 0xf7, 0x38, 0x78, 0xd5, 0x70, 0xeb, - 0xde, 0xcb, 0xa6, 0x0a, 0x94, 0x4d, 0x5b, 0x59, 0xbc, 0x0a, 0x25, 0xcf, 0xd4, 0x4b, 0x9d, 0x2b, 0x69, 0x17, 0x0e, - 0x7e, 0xa6, 0xe2, 0xe8, 0x57, 0x12, 0x81, 0x5d, 0x39, 0xc8, 0x00, 0xc7, 0xed, 0x36, 0xc7, 0x19, 0x02, 0x11, 0x94, - 0x85, 0x56, 0x20, 0xd4, 0x22, 0x55, 0xa7, 0xbe, 0x33, 0x62, 0x35, 0x01, 0xe4, 0x8a, 0xbd, 0x8b, 0x56, 0xc8, 0x9f, - 0x65, 0x06, 0x3a, 0xb0, 0xa3, 0x3d, 0x37, 0x2e, 0xbe, 0x3e, 0x25, 0xe8, 0xd7, 0x12, 0x7b, 0x67, 0x54, 0xc7, 0xc8, - 0x69, 0x3e, 0x3f, 0x58, 0x26, 0xc6, 0x6d, 0x31, 0xde, 0xb6, 0x91, 0x39, 0x81, 0x29, 0x50, 0x89, 0x99, 0xd6, 0xaa, - 0x65, 0x04, 0x39, 0x4c, 0xb2, 0x13, 0x8f, 0x34, 0x19, 0x2b, 0x96, 0xf7, 0x40, 0x60, 0xce, 0x30, 0x6e, 0xd3, 0x98, - 0x55, 0x2b, 0xa4, 0x60, 0x04, 0xc3, 0xd0, 0xf8, 0x60, 0x31, 0x12, 0xe6, 0x95, 0x80, 0x0c, 0x1c, 0x29, 0x52, 0x10, - 0xdf, 0xed, 0x68, 0x7e, 0x30, 0xa5, 0x47, 0x9c, 0xa8, 0x70, 0x8f, 0xca, 0x29, 0xdd, 0x60, 0xa8, 0xe7, 0x82, 0x05, - 0x4c, 0x31, 0xc5, 0x46, 0x72, 0xa0, 0x32, 0xdc, 0xaa, 0x90, 0xb1, 0x5c, 0xf7, 0xb6, 0x3f, 0xbd, 0x97, 0x34, 0x6c, - 0xfa, 0x4a, 0x48, 0x1a, 0xd4, 0x5a, 0x71, 0xe1, 0x03, 0x76, 0xd1, 0xb3, 0xf7, 0x4d, 0x76, 0xc8, 0x34, 0x91, 0x31, - 0xda, 0x4b, 0xa2, 0x7c, 0x69, 0x7f, 0xac, 0x15, 0x5b, 0x63, 0x80, 0xab, 0xde, 0xe9, 0xfa, 0x84, 0x9c, 0xf2, 0x4e, - 0x8b, 0x82, 0x0c, 0x32, 0x2c, 0x23, 0xfa, 0xf0, 0x9f, 0x2e, 0xf2, 0xcd, 0x58, 0x3f, 0x4b, 0xa8, 0x53, 0x93, 0xd6, - 0x2f, 0x7a, 0xb3, 0xcd, 0xce, 0xc9, 0x6c, 0x01, 0xa0, 0xf0, 0x5f, 0xad, 0x3f, 0xb1, 0x35, 0x22, 0xd4, 0x50, 0x04, - 0x2f, 0x01, 0x57, 0x1c, 0xf0, 0xa8, 0xf6, 0x34, 0x42, 0xe1, 0x20, 0x09, 0x4d, 0x99, 0xb3, 0xdd, 0xdf, 0x10, 0xb4, - 0x71, 0x4d, 0x41, 0x87, 0x3e, 0x85, 0xa6, 0xff, 0xea, 0xb3, 0x5f, 0xa0, 0x5a, 0x45, 0xd1, 0x26, 0x76, 0x4d, 0xb1, - 0x38, 0xa4, 0x70, 0x93, 0x6b, 0x87, 0x77, 0x89, 0x10, 0xe0, 0xec, 0x5f, 0xcc, 0x29, 0x4e, 0x16, 0xd6, 0x9d, 0x4d, - 0x08, 0x96, 0x0a, 0x46, 0x52, 0xa2, 0x43, 0x19, 0x73, 0x9d, 0x39, 0x1e, 0x56, 0xe3, 0x97, 0x2e, 0xe8, 0xe1, 0x10, - 0x5e, 0xc7, 0xf8, 0xfc, 0xe1, 0x79, 0xc7, 0x3b, 0x56, 0x68, 0x99, 0xb5, 0x84, 0x29, 0xa4, 0x87, 0x7c, 0x0f, 0x83, - 0xca, 0x63, 0xcf, 0x05, 0xd3, 0xea, 0xfe, 0xa1, 0x54, 0x68, 0xe7, 0x39, 0xa8, 0xa9, 0x17, 0xc0, 0xc4, 0xc2, 0x4d, - 0x29, 0x0d, 0xbb, 0x92, 0x40, 0x6a, 0x53, 0x04, 0x30, 0xfe, 0xe4, 0x13, 0x22, 0x1e, 0xc4, 0x41, 0xa9, 0x96, 0xd0, - 0xf1, 0xe6, 0x68, 0xa3, 0x56, 0x77, 0xb1, 0x30, 0xbe, 0x05, 0x2b, 0x80, 0xb6, 0xc4, 0x86, 0xe1, 0x61, 0xf1, 0xa9, - 0x94, 0x37, 0x21, 0x01, 0xb5, 0xab, 0x20, 0x85, 0x95, 0x83, 0xb5, 0x1f, 0x4c, 0x80, 0xaa, 0x5d, 0x93, 0x28, 0xfd, - 0xb6, 0x52, 0x44, 0x0a, 0x8b, 0x42, 0x35, 0x8f, 0xec, 0xde, 0x96, 0x75, 0xda, 0x50, 0x35, 0x4f, 0x91, 0x2e, 0x95, - 0xda, 0x2e, 0x71, 0x6d, 0xff, 0xa7, 0x99, 0x42, 0xe6, 0x3e, 0x3b, 0x61, 0xf5, 0xb6, 0xf6, 0x14, 0xea, 0x64, 0x54, - 0x4f, 0xf1, 0xf2, 0x51, 0xb5, 0xc2, 0xdf, 0x56, 0xe6, 0xa0, 0x01, 0x0f, 0xc6, 0x45, 0xfa, 0x67, 0xef, 0xc3, 0x35, - 0xe4, 0x9e, 0xbc, 0x6f, 0x55, 0xa1, 0x48, 0x8e, 0x07, 0x33, 0xec, 0x2f, 0x3a, 0x81, 0xe3, 0x09, 0xdb, 0x36, 0x09, - 0x58, 0xeb, 0xf8, 0x1e, 0x49, 0x41, 0x8a, 0xfc, 0x36, 0xd6, 0x86, 0xc4, 0xdc, 0xf0, 0xa3, 0x44, 0x71, 0x4b, 0x29, - 0x5d, 0x25, 0x4f, 0x4e, 0x6d, 0xbb, 0x82, 0x52, 0x13, 0x47, 0xe0, 0xd8, 0xfa, 0xca, 0x11, 0xff, 0x6c, 0xfb, 0x6a, - 0x97, 0x2b, 0x89, 0x43, 0xb1, 0xc8, 0x4f, 0x75, 0x3f, 0x29, 0x0f, 0x93, 0x01, 0xac, 0x26, 0xd4, 0x19, 0x0b, 0x47, - 0x95, 0x24, 0x80, 0xc0, 0x04, 0xa8, 0x25, 0x3c, 0x17, 0x6a, 0x91, 0xdb, 0x30, 0xa9, 0xd9, 0x56, 0xce, 0x55, 0xfb, - 0x64, 0x6b, 0x6a, 0xcd, 0xc0, 0xcd, 0xc5, 0xc6, 0x71, 0x75, 0x67, 0x07, 0xb2, 0xd2, 0x43, 0x02, 0x9d, 0x7b, 0x53, - 0x62, 0x41, 0x53, 0xe0, 0xc3, 0xd1, 0xee, 0xbe, 0x03, 0x10, 0x45, 0x23, 0x46, 0xff, 0x59, 0xc1, 0xe4, 0xa4, 0xdf, - 0xe8, 0x06, 0x7c, 0x4b, 0x95, 0x79, 0x41, 0xd9, 0xe0, 0x72, 0x77, 0x7e, 0x63, 0xd5, 0x03, 0xcf, 0x4c, 0x98, 0x93, - 0x72, 0xed, 0xc1, 0x46, 0x66, 0x89, 0x9a, 0x70, 0xfd, 0x7f, 0x35, 0xd7, 0x90, 0x1c, 0x80, 0x5c, 0x8c, 0x7d, 0xab, - 0xac, 0xc0, 0xd5, 0x2c, 0x74, 0x40, 0x61, 0x1f, 0x0c, 0x9c, 0x0a, 0x1b, 0x76, 0x03, 0x6e, 0x7e, 0x90, 0xa6, 0x95, - 0xef, 0x12, 0xe8, 0xfe, 0xa7, 0x58, 0x63, 0xdf, 0xbb, 0x25, 0x6b, 0xd8, 0xe8, 0x4d, 0x41, 0xd3, 0xe8, 0x5e, 0x33, - 0x59, 0xd3, 0xd9, 0xca, 0x0c, 0x55, 0x23, 0xaf, 0xd6, 0x8f, 0x45, 0xdc, 0x1a, 0x9e, 0x9f, 0xc9, 0x79, 0xbd, 0x8f, - 0xe9, 0xa5, 0x6e, 0x3c, 0xf6, 0x45, 0xdd, 0xe1, 0xab, 0x1b, 0xd1, 0x86, 0xb3, 0xa2, 0x88, 0x9d, 0x0f, 0xeb, 0x9e, - 0x8a, 0xb4, 0x5b, 0x47, 0xbb, 0x78, 0x5b, 0x30, 0xa7, 0x64, 0x54, 0x67, 0xd0, 0x14, 0xba, 0x0a, 0xc7, 0xba, 0x7e, - 0xbe, 0xb8, 0x02, 0xeb, 0x8e, 0x96, 0x55, 0x82, 0x37, 0x26, 0x5d, 0xd4, 0x61, 0xd7, 0xf7, 0x8c, 0x0f, 0x89, 0xaa, - 0x8f, 0x46, 0xeb, 0x34, 0xf7, 0x05, 0x34, 0xa0, 0xe5, 0x0b, 0x3a, 0xb4, 0x21, 0xab, 0xd1, 0x5d, 0x69, 0xf2, 0xa4, - 0x56, 0xd5, 0x6f, 0x79, 0x0c, 0xde, 0xb1, 0x7c, 0x35, 0x56, 0x9d, 0x8e, 0x7f, 0x19, 0xbe, 0xbc, 0xac, 0xee, 0x90, - 0xf4, 0xb9, 0x97, 0x01, 0x60, 0xda, 0xe6, 0x93, 0x41, 0xbf, 0x2f, 0x02, 0x91, 0x91, 0xdf, 0x62, 0x3c, 0x7b, 0x29, - 0x4b, 0x00, 0x1d, 0x57, 0x05, 0xbd, 0x33, 0x4d, 0x7a, 0x79, 0x4f, 0x24, 0xe2, 0xc6, 0xc0, 0x78, 0x83, 0x42, 0x15, - 0x52, 0xef, 0x34, 0x81, 0xb8, 0x47, 0x1d, 0x13, 0xe9, 0x45, 0xd5, 0xf7, 0xab, 0x04, 0x07, 0xcf, 0xa2, 0xd5, 0x6e, - 0xff, 0xb3, 0x68, 0x0a, 0xe4, 0xc4, 0xc1, 0x44, 0x5d, 0xe1, 0x84, 0xc7, 0x3f, 0x9e, 0x68, 0xbf, 0x64, 0x47, 0xaa, - 0xe9, 0x30, 0x5f, 0xc5, 0x57, 0x76, 0xaa, 0x5a, 0xf1, 0xcb, 0xbc, 0xef, 0x67, 0x8b, 0xb4, 0xf1, 0x32, 0xd2, 0xab, - 0xd9, 0x5e, 0xed, 0x6c, 0xa2, 0xba, 0x53, 0x58, 0x1e, 0x35, 0x59, 0x51, 0x1d, 0x13, 0xab, 0x56, 0x5f, 0x1d, 0x7a, - 0xe5, 0xed, 0x65, 0xf6, 0x9b, 0x25, 0x61, 0xe6, 0xec, 0x69, 0xe1, 0xde, 0xec, 0x6c, 0xc9, 0x83, 0xee, 0xe7, 0xe0, - 0xbf, 0xc7, 0x46, 0x8a, 0x2d, 0x53, 0xbb, 0x28, 0x47, 0x02, 0x00, 0x0e, 0x12, 0xbf, 0x3a, 0xbd, 0xf9, 0x7b, 0x2d, - 0x2a, 0x75, 0xb3, 0xda, 0x69, 0x71, 0xe9, 0x1f, 0x23, 0x4a, 0x4b, 0xe3, 0x38, 0xe5, 0x08, 0xa2, 0x71, 0x6d, 0x7e, - 0xc1, 0x24, 0x73, 0xdf, 0x62, 0xb5, 0x12, 0x6b, 0xc9, 0x09, 0x14, 0x18, 0xb9, 0xd7, 0x35, 0xcf, 0x5d, 0xab, 0x53, - 0x58, 0xa6, 0xb6, 0xe6, 0xb0, 0xb5, 0xc3, 0xbe, 0x83, 0xaa, 0xaf, 0xa9, 0xc3, 0x55, 0x16, 0xbe, 0xad, 0x78, 0x21, - 0x5f, 0x4a, 0x79, 0x72, 0xea, 0xe6, 0x8d, 0x60, 0x29, 0x3e, 0x0a, 0x54, 0x73, 0x46, 0xf0, 0xa2, 0x56, 0x5f, 0x59, - 0xc4, 0x4a, 0x7e, 0x28, 0x09, 0xbd, 0xd8, 0x3d, 0x17, 0xd9, 0x80, 0xab, 0xb2, 0xfe, 0xbe, 0xfa, 0xdc, 0x23, 0x95, - 0x7d, 0x74, 0x61, 0x95, 0xda, 0x8e, 0x63, 0x6e, 0xa3, 0xa6, 0x2a, 0x78, 0xf3, 0xde, 0x35, 0xd8, 0x35, 0xb0, 0x3c, - 0x19, 0xcb, 0x25, 0x46, 0x06, 0x3e, 0xd6, 0xd6, 0x53, 0x7d, 0x65, 0x5e, 0x3d, 0x5a, 0xc9, 0x58, 0x48, 0xca, 0x2b, - 0x04, 0xa2, 0xd7, 0x7f, 0x96, 0x2b, 0x35, 0xac, 0xd5, 0xd9, 0x0a, 0x25, 0x1a, 0x31, 0xda, 0xbb, 0x54, 0x4e, 0x76, - 0x4d, 0x8f, 0x8c, 0xe9, 0xf3, 0xee, 0x47, 0xd5, 0xd2, 0x92, 0xd9, 0x86, 0x16, 0xff, 0x54, 0x64, 0x2c, 0xa9, 0x88, - 0x6d, 0xc5, 0x16, 0x7b, 0x16, 0x77, 0x01, 0x4c, 0x3e, 0x5d, 0x30, 0x77, 0x9f, 0x50, 0x0e, 0xc6, 0xea, 0x57, 0xaa, - 0x2a, 0x37, 0x3e, 0x4f, 0xbc, 0xbe, 0x6f, 0x60, 0x26, 0x91, 0x45, 0x1e, 0x05, 0x36, 0x2b, 0xeb, 0x69, 0x4f, 0x6f, - 0x73, 0x52, 0xa3, 0x5f, 0x18, 0x85, 0x56, 0x79, 0xc0, 0xe7, 0x9a, 0x79, 0xf2, 0xe6, 0x7d, 0xa7, 0x1b, 0x41, 0x86, - 0xa3, 0x8d, 0xb4, 0x41, 0xdb, 0x6d, 0x48, 0x7a, 0x8b, 0xf8, 0x0f, 0x29, 0xd3, 0x5f, 0x94, 0xf9, 0xea, 0xfb, 0xe1, - 0x7c, 0x5d, 0x4e, 0x50, 0x35, 0x7b, 0xc0, 0xe1, 0xd1, 0x58, 0x02, 0x2c, 0x20, 0x8e, 0x3e, 0x12, 0xb2, 0xb6, 0x26, - 0x28, 0x27, 0x3c, 0x52, 0xe5, 0x6c, 0x94, 0x77, 0x26, 0x7a, 0x42, 0xab, 0xca, 0xd9, 0x00, 0x5b, 0xd0, 0x8d, 0x5d, - 0xf2, 0x6d, 0x2c, 0x3c, 0x5d, 0xee, 0x77, 0x8e, 0xed, 0x81, 0x2b, 0xd7, 0x5c, 0xc0, 0x17, 0xde, 0x03, 0x77, 0xa1, - 0x5a, 0x40, 0x6b, 0x10, 0xff, 0x51, 0x54, 0xd9, 0xdd, 0xe6, 0xdc, 0x48, 0x24, 0x59, 0x28, 0x13, 0x2a, 0x6b, 0xf1, - 0x73, 0x83, 0x9c, 0xeb, 0x71, 0xe0, 0x1c, 0x29, 0x01, 0x82, 0x63, 0xc4, 0x24, 0xf6, 0xa6, 0x34, 0x54, 0x70, 0x8e, - 0x3e, 0x79, 0x2d, 0xbf, 0x60, 0xca, 0xd0, 0x05, 0x3a, 0x3d, 0xcf, 0x42, 0xc1, 0x7e, 0x60, 0x5d, 0x38, 0x3a, 0x69, - 0x39, 0xeb, 0x9f, 0x1d, 0x18, 0x01, 0xf2, 0x58, 0x79, 0x99, 0x24, 0x6c, 0x2d, 0x5a, 0xbd, 0xc9, 0xfb, 0x71, 0xa5, - 0x10, 0x2d, 0x16, 0xa8, 0xba, 0xfd, 0x02, 0x17, 0xa7, 0x25, 0x95, 0xac, 0x14, 0xb7, 0x0a, 0x15, 0x88, 0xd6, 0x9b, - 0x50, 0xf5, 0x3a, 0x7d, 0x6d, 0xdb, 0x51, 0x79, 0x69, 0x28, 0x36, 0x31, 0x04, 0x86, 0x58, 0x1f, 0x7e, 0xaa, 0xb6, - 0xe1, 0xb6, 0xb3, 0x2e, 0xee, 0x73, 0xdb, 0x7e, 0x0d, 0x5f, 0x8f, 0xc4, 0x9b, 0xca, 0xdb, 0xa6, 0x78, 0x58, 0x20, - 0xe2, 0x44, 0xd7, 0x6b, 0x0d, 0x9b, 0x93, 0x4f, 0x7f, 0x55, 0xa7, 0x4c, 0x8e, 0xe8, 0x63, 0x0f, 0x21, 0xe6, 0x42, - 0x44, 0x85, 0x48, 0xbf, 0x6f, 0x47, 0xe7, 0xca, 0x3d, 0x23, 0x44, 0xe7, 0xd8, 0x88, 0x75, 0x6c, 0x27, 0x81, 0xa7, - 0xb6, 0x14, 0xc4, 0x09, 0xdc, 0x7d, 0x27, 0x16, 0x7c, 0xf2, 0x85, 0x34, 0xe7, 0xe1, 0xf9, 0xcb, 0xdf, 0xfe, 0x4a, - 0x56, 0xea, 0xb9, 0xee, 0x2c, 0xba, 0xa6, 0xbb, 0xa4, 0x52, 0x97, 0xcf, 0x71, 0x17, 0xb3, 0xf0, 0x26, 0x6b, 0xff, - 0x7a, 0x78, 0x4b, 0x37, 0x6d, 0x48, 0x91, 0x4c, 0x51, 0xee, 0xfe, 0x4d, 0x3c, 0x35, 0x22, 0xc3, 0x5f, 0xf0, 0x8c, - 0xb1, 0xee, 0xcb, 0xaa, 0xf9, 0x60, 0xac, 0x04, 0xec, 0x3d, 0x27, 0x23, 0x73, 0x51, 0x70, 0xa3, 0x28, 0x44, 0x2b, - 0xd6, 0x83, 0xed, 0x40, 0x53, 0xf9, 0x80, 0xf1, 0x0f, 0x53, 0x6a, 0xb9, 0x8b, 0xcd, 0xf5, 0xfd, 0xd8, 0xf4, 0x38, - 0x26, 0x25, 0x23, 0x9d, 0x39, 0x1a, 0xa8, 0x15, 0xd8, 0xf6, 0x58, 0x7e, 0x39, 0x44, 0xe7, 0xb4, 0x2d, 0xb0, 0x4d, - 0xcb, 0xc7, 0x37, 0x87, 0x6c, 0x2e, 0x5f, 0x9a, 0xf1, 0x5e, 0xba, 0x79, 0xf2, 0x62, 0x99, 0xde, 0x0a, 0x7b, 0xc2, - 0x40, 0x14, 0x51, 0x05, 0x9d, 0x84, 0x22, 0xec, 0xb4, 0x5b, 0x7b, 0x82, 0x94, 0x16, 0x83, 0xf0, 0x13, 0x5c, 0x9f, - 0xb4, 0xaf, 0x45, 0x6d, 0x6a, 0x1d, 0x35, 0x41, 0xed, 0x72, 0x9e, 0x06, 0x48, 0x47, 0xc5, 0x73, 0x0b, 0xa1, 0xcf, - 0x28, 0xd0, 0x16, 0x34, 0x59, 0x29, 0xd2, 0x08, 0x43, 0x91, 0x73, 0x63, 0xaa, 0x26, 0x73, 0xb1, 0x5c, 0xf8, 0xb3, - 0x46, 0x9b, 0x34, 0xc4, 0x24, 0xe4, 0xda, 0x96, 0x5d, 0xe6, 0xeb, 0x04, 0xeb, 0x2b, 0x6b, 0x7f, 0x3d, 0xf9, 0x5b, - 0x41, 0x32, 0x05, 0xec, 0x47, 0x16, 0xaf, 0xdb, 0x97, 0xb8, 0x02, 0xde, 0xd4, 0x40, 0x51, 0x03, 0xca, 0xac, 0x3a, - 0xad, 0xdb, 0xf0, 0x80, 0x32, 0xfb, 0xcd, 0x40, 0x95, 0x9a, 0x5c, 0x59, 0xc5, 0xb7, 0xba, 0x8d, 0xb8, 0x5e, 0xb2, - 0x81, 0xb4, 0xf1, 0x76, 0xca, 0xad, 0xd3, 0x54, 0xb9, 0x12, 0xe7, 0x41, 0x25, 0xa9, 0x71, 0x0f, 0x30, 0x98, 0xe6, - 0xe9, 0x3b, 0x34, 0xe6, 0xdf, 0x8a, 0x83, 0x49, 0x5f, 0x18, 0x24, 0xab, 0xb4, 0x63, 0x01, 0x20, 0x40, 0xb7, 0x5d, - 0x72, 0xd3, 0xe4, 0x08, 0x46, 0xe4, 0x1f, 0xd0, 0xbb, 0xe0, 0x88, 0xec, 0x1d, 0xd8, 0x9d, 0xe9, 0xc3, 0xc0, 0xcc, - 0xbb, 0x9a, 0x92, 0x5d, 0x8a, 0xc2, 0x37, 0xd1, 0x37, 0xdb, 0xc5, 0x4a, 0x00, 0xdc, 0x30, 0xbb, 0xcc, 0x17, 0xaa, - 0x4c, 0xe6, 0x62, 0xab, 0xf2, 0x90, 0x9b, 0xa9, 0x4c, 0x71, 0x55, 0x13, 0x3c, 0x08, 0x82, 0x80, 0x82, 0xbc, 0x81, - 0x5c, 0xc7, 0x17, 0x0d, 0x20, 0xe8, 0x41, 0x58, 0x0c, 0x13, 0xcf, 0x8d, 0xb2, 0xbb, 0x3e, 0xaa, 0x98, 0xc2, 0xf8, - 0x54, 0x4a, 0x72, 0x72, 0xee, 0xf5, 0xc9, 0x64, 0xd8, 0x6a, 0x36, 0xec, 0xe4, 0x24, 0x21, 0xb4, 0x24, 0xb6, 0x90, - 0x53, 0xea, 0xf6, 0xae, 0x0e, 0xbd, 0x3c, 0x96, 0x05, 0x8c, 0xb6, 0x11, 0xac, 0x3b, 0x1c, 0xed, 0x3d, 0x25, 0xc2, - 0x8b, 0x65, 0x63, 0xbe, 0x13, 0xf1, 0x45, 0xaa, 0x8f, 0x81, 0x06, 0xcc, 0x9b, 0x3f, 0x07, 0xb2, 0x9a, 0xe0, 0x6f, - 0xc2, 0x8b, 0x65, 0x71, 0x9f, 0x39, 0x21, 0x2a, 0x36, 0x8b, 0xfb, 0x67, 0x1b, 0x14, 0x98, 0xae, 0x09, 0xdd, 0x40, - 0xaa, 0x81, 0x45, 0xc3, 0x1d, 0x3d, 0x58, 0xb4, 0x3f, 0xa2, 0xab, 0x62, 0x59, 0x61, 0xf4, 0xe8, 0xc1, 0x51, 0x3d, - 0x95, 0x1d, 0x4b, 0x6b, 0xa4, 0x39, 0xe2, 0x37, 0xcf, 0x11, 0x2d, 0xea, 0x36, 0xc6, 0x44, 0x63, 0x69, 0xe6, 0x1f, - 0x44, 0x79, 0xb4, 0xaf, 0x41, 0xd8, 0x3f, 0x83, 0x4d, 0xe2, 0x63, 0xc6, 0x20, 0x6f, 0x8e, 0x06, 0xf6, 0x72, 0x40, - 0x1d, 0x07, 0xcb, 0x93, 0x92, 0x82, 0x9b, 0x8b, 0x95, 0x2a, 0xcd, 0x32, 0x8a, 0x3d, 0xaf, 0x13, 0x59, 0xcb, 0x1e, - 0xe1, 0x24, 0x23, 0x26, 0xfa, 0x3c, 0x50, 0x90, 0x77, 0x5a, 0x2f, 0xff, 0xd3, 0x0a, 0xcc, 0x3a, 0x74, 0x32, 0xd6, - 0x64, 0x94, 0x2c, 0x84, 0x08, 0x6d, 0x08, 0xb7, 0x36, 0x24, 0xd7, 0x22, 0xb4, 0x1d, 0x99, 0x43, 0x1f, 0xe6, 0x4b, - 0xc1, 0x19, 0x5e, 0x82, 0x9e, 0x76, 0xb9, 0x7d, 0x71, 0xfa, 0xcd, 0x85, 0x72, 0x67, 0x83, 0x83, 0x08, 0xa4, 0xe8, - 0x5c, 0x9f, 0x1e, 0x8a, 0x17, 0x85, 0x83, 0x88, 0xb8, 0x39, 0xbc, 0x1e, 0xac, 0x3e, 0x26, 0x74, 0x56, 0x75, 0x4f, - 0x7b, 0xff, 0x85, 0x0b, 0xdf, 0xb5, 0xb5, 0x22, 0x8a, 0xd3, 0x1b, 0xb6, 0x1e, 0xa5, 0x79, 0x26, 0xad, 0x1e, 0xbb, - 0x62, 0xe0, 0x51, 0xa6, 0x22, 0xc7, 0x6f, 0xd6, 0x63, 0x8c, 0x6d, 0x08, 0x28, 0x43, 0xaa, 0xb7, 0x18, 0x02, 0x20, - 0x63, 0x9e, 0x8e, 0xfd, 0x71, 0xce, 0x26, 0xc8, 0x7b, 0x8d, 0x31, 0x17, 0xf1, 0x76, 0xed, 0x4f, 0xe0, 0xa1, 0x50, - 0x36, 0x12, 0xd7, 0xf2, 0x28, 0xc5, 0xb9, 0x07, 0x15, 0x9f, 0x46, 0xc4, 0xd6, 0x61, 0xea, 0x7c, 0x42, 0x18, 0xb2, - 0x07, 0x31, 0x66, 0x17, 0x26, 0x74, 0x7a, 0x89, 0xbe, 0x32, 0xbd, 0x0d, 0xa8, 0xbe, 0x15, 0x5b, 0x24, 0x9a, 0x97, - 0x44, 0xa2, 0xe8, 0xec, 0x84, 0xd8, 0x6c, 0x45, 0x8e, 0x1a, 0xab, 0xbd, 0x83, 0xc1, 0xe5, 0x33, 0x4e, 0x6b, 0xeb, - 0x0a, 0x30, 0xf9, 0x63, 0x98, 0x0a, 0x06, 0x9c, 0x1b, 0x4e, 0x2c, 0x79, 0x37, 0xa2, 0x1f, 0x7d, 0x20, 0xe3, 0xb7, - 0xd2, 0x22, 0xd8, 0xa3, 0x81, 0x18, 0xa9, 0x8a, 0x61, 0x05, 0xd3, 0x47, 0x21, 0xc1, 0x53, 0x17, 0x8e, 0xaa, 0x3a, - 0xf4, 0x0b, 0x22, 0xaa, 0x9d, 0x0b, 0xbb, 0x56, 0x0c, 0x98, 0x68, 0xcc, 0x1c, 0x1a, 0x2d, 0x5c, 0xc0, 0xf3, 0x74, - 0xfc, 0x7e, 0xe2, 0x7e, 0x76, 0xfe, 0xa0, 0x19, 0xf4, 0xbf, 0x26, 0xa3, 0xce, 0xf1, 0xd3, 0xfb, 0xdb, 0xf6, 0x69, - 0xbf, 0xb6, 0x33, 0xf7, 0x07, 0xea, 0xfb, 0x4f, 0xfc, 0xcb, 0x24, 0x80, 0xfc, 0x52, 0xc7, 0x6e, 0xc3, 0xf5, 0x53, - 0xe2, 0x35, 0x78, 0xb8, 0x7e, 0x72, 0x89, 0x50, 0xef, 0x00, 0xed, 0x8d, 0x4a, 0xdb, 0x86, 0x4b, 0x4c, 0xe2, 0x91, - 0xf2, 0x64, 0x35, 0x56, 0x64, 0x49, 0xad, 0x60, 0x65, 0x92, 0x6f, 0xe4, 0xae, 0xcf, 0x2e, 0xc1, 0x3d, 0xbe, 0x15, - 0xd9, 0x53, 0xae, 0x3e, 0x00, 0x17, 0xa5, 0xf3, 0x57, 0xcc, 0x3b, 0xff, 0x13, 0x55, 0xd6, 0x1d, 0xd4, 0x0c, 0xb5, - 0x96, 0x44, 0xad, 0x9a, 0x59, 0x5d, 0xb0, 0xb7, 0x04, 0xb4, 0xa6, 0x56, 0x1f, 0xca, 0xcd, 0x21, 0x7f, 0x6c, 0xb1, - 0x2e, 0x8c, 0x13, 0x4d, 0x93, 0x01, 0x79, 0x6a, 0x7e, 0xe9, 0x12, 0x43, 0x92, 0x41, 0xfd, 0xbf, 0xbe, 0x7b, 0x77, - 0x74, 0xd0, 0x4c, 0x5a, 0xde, 0x85, 0x3d, 0xde, 0xab, 0xa2, 0x62, 0x49, 0xe7, 0x1b, 0x7d, 0x7c, 0x90, 0x3c, 0xc9, - 0xc3, 0xf6, 0x79, 0xea, 0xcf, 0x0e, 0xfc, 0xd8, 0x80, 0xbe, 0xe3, 0x6d, 0xd3, 0x8e, 0xd2, 0xc7, 0x21, 0x04, 0x2c, - 0xd5, 0x2e, 0x68, 0x56, 0xc3, 0x23, 0x34, 0x58, 0xb7, 0x49, 0x55, 0x38, 0x8a, 0xa7, 0x1c, 0x1f, 0xfe, 0x03, 0xd0, - 0x41, 0x02, 0x3c, 0x6a, 0x2e, 0xcb, 0xc3, 0xb4, 0x03, 0x6b, 0x23, 0x6c, 0xf7, 0x26, 0x44, 0x2f, 0x16, 0x47, 0x6b, - 0xa7, 0x36, 0x61, 0x11, 0x69, 0xbc, 0x2b, 0x09, 0x5d, 0xdd, 0x07, 0xbd, 0x1e, 0x75, 0x9a, 0x35, 0x09, 0xa1, 0x9d, - 0x6c, 0xeb, 0xb8, 0x7a, 0xd0, 0xab, 0xac, 0xcf, 0x5f, 0x30, 0xfd, 0x58, 0xdf, 0xe3, 0x23, 0x86, 0xf5, 0x1b, 0xde, - 0x1f, 0x5c, 0x4a, 0x70, 0xb1, 0x69, 0xec, 0x7c, 0x33, 0x27, 0x0e, 0xbb, 0x59, 0x0a, 0x0b, 0x09, 0xa6, 0x97, 0x48, - 0x1b, 0xc6, 0x6a, 0x70, 0x7c, 0x11, 0x1f, 0xeb, 0xf9, 0x62, 0x40, 0x20, 0x52, 0xd9, 0x29, 0xf2, 0xc2, 0x00, 0x13, - 0xf5, 0xed, 0xcd, 0x87, 0xd4, 0xff, 0x10, 0xdf, 0xec, 0x03, 0xa9, 0x93, 0xe4, 0xd1, 0x8b, 0x45, 0x51, 0x24, 0x54, - 0xf4, 0x14, 0xff, 0xe2, 0x10, 0xca, 0xf0, 0x32, 0xd1, 0xd9, 0xa4, 0xe8, 0xf6, 0xce, 0x2d, 0x5f, 0x24, 0xbc, 0x71, - 0xe5, 0x72, 0xe9, 0x61, 0x60, 0xda, 0x02, 0x36, 0x50, 0x41, 0xc6, 0x31, 0x4b, 0xf1, 0x63, 0xe4, 0x2a, 0x43, 0x94, - 0xdd, 0xea, 0x31, 0xd4, 0x70, 0x11, 0x98, 0x3b, 0x94, 0x49, 0xc2, 0x68, 0xa1, 0x9e, 0xdb, 0xc0, 0xd3, 0x73, 0x66, - 0xe7, 0xe9, 0xdc, 0xde, 0xab, 0x62, 0xc7, 0x84, 0x89, 0x0c, 0x8a, 0xe8, 0xb1, 0xc2, 0x86, 0x5a, 0xcd, 0x97, 0x99, - 0x53, 0x6c, 0x7a, 0xe4, 0x0f, 0x43, 0x2d, 0x37, 0xe9, 0x96, 0x1d, 0xbd, 0xd2, 0x47, 0xfd, 0xd1, 0xa2, 0x13, 0x0c, - 0xd1, 0xe2, 0xee, 0xac, 0x8d, 0x72, 0xc4, 0x28, 0x6c, 0xde, 0x17, 0x80, 0xd9, 0xb7, 0x6e, 0x4b, 0xba, 0xfa, 0xc4, - 0xd5, 0xf7, 0xc2, 0xdc, 0xf3, 0x00, 0x62, 0x24, 0xcf, 0xe5, 0xc8, 0x45, 0x91, 0x03, 0x92, 0xbc, 0xab, 0x23, 0x2d, - 0x91, 0x8a, 0x10, 0x4e, 0x67, 0x1c, 0x0c, 0x8b, 0xd3, 0xb9, 0x6a, 0xea, 0xbb, 0x2c, 0x10, 0x09, 0x65, 0xb2, 0x9f, - 0xa2, 0x67, 0x7b, 0xa3, 0x71, 0x47, 0x87, 0xb5, 0x76, 0xeb, 0x20, 0x14, 0xae, 0x4c, 0xb5, 0x99, 0x70, 0xf7, 0x8c, - 0xfe, 0xeb, 0x8d, 0x97, 0x14, 0xab, 0x8e, 0x7b, 0xef, 0x53, 0x7d, 0xf9, 0x6b, 0x5e, 0x00, 0xf5, 0xfb, 0x81, 0xb3, - 0x21, 0x7f, 0xcb, 0x7d, 0xb0, 0x98, 0x32, 0x40, 0x80, 0x8f, 0x68, 0x86, 0x3a, 0xed, 0xab, 0xd9, 0x8d, 0x6f, 0x88, - 0xd9, 0xb3, 0xda, 0xd0, 0x77, 0x7e, 0xf8, 0xae, 0xae, 0xa0, 0xc1, 0x45, 0x65, 0xf4, 0x7f, 0x9e, 0x2a, 0x20, 0x98, - 0x0a, 0xfe, 0x3e, 0x6e, 0x87, 0xe3, 0x5b, 0xf0, 0x1c, 0x46, 0x7d, 0x1c, 0x69, 0xa2, 0x7b, 0x27, 0xee, 0x52, 0xaf, - 0x32, 0x4d, 0x32, 0xaf, 0x68, 0x97, 0x35, 0x2e, 0x58, 0xd6, 0x35, 0x5d, 0x5b, 0x76, 0xb0, 0x66, 0x5f, 0x02, 0x20, - 0x23, 0xdb, 0x9b, 0xaa, 0xa6, 0xf0, 0xeb, 0x4b, 0xb1, 0x08, 0x24, 0xf0, 0x9d, 0xb2, 0xbf, 0xba, 0x76, 0x7d, 0xd3, - 0xae, 0x16, 0xf1, 0xc1, 0xc0, 0x81, 0x50, 0xae, 0xf3, 0x86, 0x7b, 0x59, 0xa1, 0xcd, 0xf3, 0x25, 0xe7, 0xc6, 0xcb, - 0x88, 0x4a, 0x43, 0x21, 0x89, 0xda, 0x40, 0x9f, 0x8e, 0x3d, 0x0d, 0x10, 0x1e, 0x12, 0x4b, 0x1d, 0x64, 0x65, 0xfa, - 0x47, 0xd2, 0xde, 0x9b, 0x1b, 0xc3, 0xeb, 0xe1, 0x16, 0x97, 0x19, 0x45, 0x14, 0x76, 0x0c, 0x3c, 0x72, 0x2b, 0x56, - 0x7b, 0xb7, 0xfe, 0xe1, 0xc1, 0xd3, 0xbb, 0xab, 0x8f, 0x9f, 0x16, 0xb7, 0x43, 0xaa, 0xd5, 0x4f, 0xa7, 0xd6, 0xb2, - 0xe6, 0x93, 0x76, 0x98, 0xf7, 0x8e, 0x15, 0xbb, 0x84, 0x13, 0x69, 0x07, 0x31, 0x56, 0x6e, 0x26, 0x55, 0xa7, 0x09, - 0x70, 0x20, 0x35, 0x75, 0x9f, 0x3d, 0x73, 0xcd, 0x94, 0x3c, 0x36, 0xe8, 0x25, 0x51, 0x57, 0xa5, 0x11, 0x58, 0xa6, - 0xfd, 0xe3, 0xf1, 0xd2, 0x4b, 0x3d, 0x4d, 0xb0, 0x89, 0x6e, 0x18, 0x88, 0xc3, 0xdf, 0xb1, 0xc1, 0xaf, 0x67, 0xf7, - 0x64, 0x49, 0xa0, 0x70, 0x69, 0xeb, 0x86, 0x32, 0x0d, 0xda, 0x52, 0x21, 0x38, 0x2e, 0x5e, 0xdc, 0x2a, 0xc6, 0x93, - 0xac, 0xa9, 0x16, 0xc5, 0x43, 0x24, 0x1a, 0x70, 0x19, 0x5b, 0xca, 0x4d, 0xbe, 0x8d, 0x01, 0x0e, 0xd2, 0x11, 0xca, - 0xf5, 0xb2, 0x0a, 0xb0, 0xdb, 0xf0, 0xd7, 0xe3, 0x69, 0x1e, 0x80, 0x98, 0x1e, 0x1b, 0xf6, 0x74, 0x6f, 0xa3, 0xc9, - 0xad, 0xb9, 0x93, 0x12, 0x3f, 0x4a, 0xd9, 0x62, 0x4b, 0x0c, 0x83, 0x73, 0xa5, 0x13, 0x20, 0xa0, 0xe5, 0x6e, 0x09, - 0x20, 0xb5, 0x2c, 0x39, 0x89, 0x83, 0x85, 0x13, 0xd9, 0xde, 0x62, 0xbc, 0xdd, 0x93, 0x9e, 0x1a, 0xcf, 0xdc, 0x46, - 0xc6, 0xa4, 0xac, 0x7c, 0xbf, 0x20, 0x93, 0xf7, 0x79, 0x06, 0x16, 0xcd, 0x65, 0xf4, 0xf4, 0x5d, 0x71, 0x2a, 0x7e, - 0x98, 0x45, 0xe7, 0xe1, 0x69, 0xd4, 0xcd, 0x61, 0x96, 0x78, 0xc0, 0x4e, 0x38, 0xd3, 0x6a, 0x60, 0xac, 0x5d, 0xda, - 0x8e, 0xb4, 0x3b, 0xfb, 0x02, 0x29, 0x61, 0xcd, 0x6e, 0x76, 0x82, 0x63, 0x46, 0x5c, 0x0e, 0xba, 0xd7, 0x1b, 0x30, - 0xac, 0x6c, 0x17, 0x73, 0x73, 0x4f, 0xee, 0xa4, 0xd5, 0x53, 0x81, 0x9c, 0x81, 0x2c, 0x59, 0xd7, 0xf0, 0xbe, 0x40, - 0xb5, 0xbe, 0x78, 0x70, 0xf0, 0x76, 0x6f, 0x19, 0x77, 0x4d, 0x19, 0x65, 0x3b, 0xa2, 0x08, 0x7e, 0x65, 0x40, 0xba, - 0x56, 0xf6, 0x23, 0x77, 0x37, 0x4b, 0x1d, 0xa4, 0x14, 0xfa, 0x74, 0x3d, 0x5d, 0x1b, 0x09, 0x6f, 0x66, 0xaa, 0xe3, - 0x08, 0xf9, 0x44, 0x87, 0x41, 0x59, 0x49, 0x8a, 0xfe, 0x9f, 0xb1, 0xdf, 0x81, 0x82, 0x7a, 0xe0, 0xd7, 0xbf, 0x0b, - 0x12, 0x1c, 0xd8, 0x9d, 0xa0, 0xb5, 0xe2, 0x63, 0x09, 0xb2, 0x5b, 0x85, 0xb9, 0xa0, 0x44, 0xad, 0x7f, 0xcf, 0xcd, - 0xf5, 0xfa, 0xfb, 0x4b, 0x56, 0xaa, 0x75, 0x27, 0xdb, 0xb6, 0xf5, 0x4d, 0xae, 0x19, 0x3b, 0x62, 0x5f, 0x0e, 0x7c, - 0x70, 0x9a, 0xc9, 0xb5, 0x80, 0xa4, 0x21, 0xd3, 0xe7, 0x6e, 0x8d, 0xba, 0x91, 0x8c, 0xdc, 0x01, 0x09, 0x44, 0x08, - 0x34, 0x18, 0x94, 0x75, 0xbb, 0x2f, 0xc6, 0xe1, 0xbc, 0xb3, 0x78, 0xff, 0x73, 0x41, 0x97, 0xe8, 0xb0, 0xae, 0xce, - 0x62, 0xc9, 0x7f, 0xbf, 0x53, 0x8c, 0x64, 0x7b, 0xb4, 0xbd, 0x7f, 0x31, 0x9a, 0xe2, 0x4a, 0xa6, 0xfd, 0x83, 0xbf, - 0xbf, 0xe8, 0x2d, 0xbc, 0xd9, 0xd1, 0xc1, 0xea, 0x3e, 0x4f, 0xb9, 0x79, 0xd2, 0x17, 0x33, 0xf9, 0xae, 0x8c, 0x4c, - 0x6e, 0x10, 0x18, 0x75, 0x67, 0x75, 0xa9, 0xcb, 0xc3, 0xc8, 0xc5, 0x7a, 0xb8, 0x19, 0x4e, 0xe1, 0x36, 0x13, 0x59, - 0xb5, 0x50, 0x05, 0xe0, 0x11, 0x3a, 0x29, 0x51, 0x24, 0x49, 0x62, 0x80, 0xe8, 0xde, 0xc6, 0x3c, 0x80, 0x17, 0x35, - 0x9f, 0x35, 0xd4, 0x76, 0x46, 0x36, 0xc7, 0x01, 0xad, 0xcd, 0x1c, 0xd3, 0xb2, 0x29, 0x41, 0xe7, 0xee, 0x74, 0x84, - 0x0e, 0xbd, 0xa5, 0xf5, 0x54, 0x97, 0x8a, 0x7d, 0xd3, 0xb3, 0xb6, 0x8e, 0xc8, 0x27, 0x71, 0x6b, 0x75, 0x90, 0xe6, - 0x2a, 0xa7, 0xe2, 0x66, 0xaa, 0x9e, 0xa3, 0x77, 0x16, 0x8e, 0x40, 0xdf, 0x5a, 0x1e, 0xac, 0x71, 0x11, 0x6c, 0x8a, - 0xee, 0x2c, 0x15, 0x55, 0xc5, 0x96, 0xfb, 0x9d, 0x4c, 0xa7, 0xed, 0x9d, 0x01, 0xb2, 0x4e, 0x98, 0xee, 0x1e, 0x12, - 0x48, 0x3c, 0x7a, 0x17, 0x60, 0xb0, 0x67, 0x52, 0x4c, 0xab, 0xea, 0xbc, 0x62, 0x82, 0x87, 0xa5, 0x3c, 0xf3, 0xbd, - 0xd9, 0xb3, 0xc3, 0xa8, 0x61, 0x3c, 0x76, 0xf8, 0x05, 0x25, 0x05, 0xb3, 0x37, 0xd1, 0xcd, 0xdf, 0xcb, 0xd7, 0xf5, - 0x09, 0xb7, 0x46, 0x0e, 0xb9, 0x75, 0x07, 0xd7, 0xef, 0xf4, 0x7d, 0xe6, 0x62, 0x56, 0xdf, 0x7e, 0x36, 0x2e, 0x66, - 0x46, 0xc9, 0x77, 0x6a, 0xa4, 0x3d, 0x24, 0xde, 0x6b, 0x00, 0xb6, 0x00, 0xca, 0x92, 0x09, 0xe8, 0x60, 0xb5, 0x2e, - 0x97, 0x4e, 0xd7, 0x29, 0x69, 0xaa, 0x3d, 0xf3, 0x6a, 0xbb, 0xb1, 0xcd, 0x85, 0x67, 0x4c, 0xb6, 0x58, 0x9b, 0x4e, - 0x5b, 0xc2, 0xe4, 0xb5, 0xae, 0xdf, 0xe8, 0xfa, 0x97, 0x15, 0x81, 0x9a, 0xa9, 0x5c, 0x71, 0x5f, 0x2b, 0x6b, 0x08, - 0x3e, 0x85, 0x45, 0x98, 0x0a, 0xf0, 0xac, 0x3a, 0x81, 0xaa, 0xf5, 0x43, 0xdb, 0xfb, 0x1b, 0x16, 0xdb, 0xb3, 0x9d, - 0x76, 0x01, 0x14, 0x9e, 0x25, 0xee, 0x9c, 0x2b, 0x77, 0x74, 0xe3, 0x74, 0x13, 0x53, 0xf6, 0xe3, 0x17, 0xa8, 0x93, - 0x83, 0x99, 0xdb, 0x0b, 0x1a, 0x4b, 0xc0, 0x93, 0x22, 0x13, 0xc4, 0xe4, 0xe7, 0x40, 0x08, 0x6d, 0xa4, 0xd2, 0x99, - 0x86, 0xc7, 0x68, 0xf7, 0x5a, 0x29, 0x0b, 0xa6, 0x76, 0xef, 0xc9, 0x6d, 0xd8, 0x74, 0x04, 0xaa, 0xb3, 0xef, 0xa4, - 0xdc, 0xa8, 0x97, 0x30, 0x02, 0x3a, 0xdd, 0x6b, 0xf5, 0xe3, 0x9f, 0x93, 0xb9, 0x86, 0x7d, 0x64, 0xc7, 0x1b, 0xd1, - 0x0d, 0x40, 0x0e, 0x87, 0x4b, 0x28, 0x65, 0xed, 0x93, 0xea, 0xdf, 0xfb, 0xb2, 0xd1, 0xf0, 0x09, 0xc3, 0x38, 0x49, - 0x54, 0x71, 0xda, 0xe6, 0xd6, 0x40, 0xe9, 0x4f, 0xee, 0x9d, 0x12, 0xa6, 0x20, 0x10, 0x4d, 0xb2, 0x72, 0x3e, 0x05, - 0x2c, 0x3c, 0xe5, 0x81, 0x4a, 0x98, 0x46, 0x2c, 0xd1, 0x0e, 0xad, 0x34, 0x1b, 0x5d, 0x82, 0x19, 0x06, 0x5c, 0xfb, - 0x0b, 0x8d, 0xd6, 0x9d, 0xec, 0xad, 0xa3, 0x06, 0x6f, 0xd0, 0xd2, 0xe8, 0x77, 0x43, 0x93, 0x00, 0x84, 0x9c, 0x1e, - 0xdc, 0xf7, 0x2c, 0x46, 0xc7, 0x15, 0x9d, 0x47, 0x0f, 0x64, 0x22, 0xd4, 0x94, 0xeb, 0x4e, 0x0e, 0x80, 0x39, 0xdd, - 0x72, 0x69, 0xa8, 0xc7, 0x60, 0x9a, 0x5e, 0x40, 0x54, 0xc0, 0x8a, 0x0e, 0xa0, 0xd3, 0xd8, 0x0d, 0x65, 0x79, 0xc3, - 0x0c, 0x05, 0x08, 0x82, 0xec, 0x1b, 0x84, 0xfd, 0xa9, 0x3a, 0xe6, 0x6a, 0x86, 0x5d, 0x86, 0x19, 0x1c, 0x87, 0x86, - 0xf6, 0x14, 0xfc, 0x04, 0x6c, 0xa2, 0x09, 0x08, 0x50, 0x6e, 0x12, 0x62, 0x0f, 0x6a, 0xfe, 0x2b, 0x0f, 0x49, 0x7b, - 0xdd, 0x34, 0xf5, 0x09, 0xa6, 0x38, 0x2c, 0x83, 0x75, 0x5b, 0xb6, 0x57, 0xb7, 0xaa, 0x8c, 0xe3, 0x1a, 0x60, 0x6c, - 0xe9, 0x1c, 0x47, 0x61, 0x1a, 0xe2, 0x7f, 0x0d, 0xa8, 0x0b, 0x73, 0xab, 0x76, 0x13, 0xfa, 0x66, 0x49, 0x53, 0x3e, - 0x9a, 0xdc, 0x1f, 0x1b, 0x9a, 0x13, 0xfd, 0xbe, 0xc0, 0x8c, 0x6b, 0x89, 0x4b, 0x16, 0x7a, 0xda, 0x06, 0x65, 0xa7, - 0x6b, 0x5c, 0x65, 0xfc, 0x6a, 0xf4, 0xcb, 0xb7, 0xab, 0x57, 0x31, 0xc4, 0x8c, 0x28, 0x60, 0x6b, 0xde, 0x59, 0xc7, - 0x27, 0xda, 0x7d, 0x37, 0xe6, 0x97, 0xa7, 0xa8, 0x71, 0xa3, 0x94, 0x58, 0x2c, 0x92, 0xf7, 0x15, 0x6e, 0x6b, 0x3e, - 0xd8, 0x5e, 0xf9, 0xf8, 0xeb, 0x79, 0x28, 0x04, 0x4f, 0xa8, 0x92, 0x20, 0xd1, 0x40, 0x37, 0xad, 0xd7, 0x82, 0x96, - 0xde, 0x97, 0x94, 0x66, 0x9e, 0xfb, 0xcb, 0xa6, 0x5d, 0x02, 0x42, 0x55, 0x03, 0x39, 0x3f, 0x45, 0x93, 0x2f, 0xa6, - 0xd3, 0x31, 0x82, 0x4f, 0x9a, 0x9c, 0x23, 0x0c, 0xa7, 0xdd, 0x7e, 0x97, 0x9f, 0xfe, 0x26, 0x47, 0x07, 0x9e, 0xfb, - 0x49, 0xea, 0xdb, 0xa1, 0xf0, 0xe9, 0x77, 0xbd, 0x18, 0x7d, 0xf5, 0x8d, 0x90, 0xbe, 0xed, 0xc4, 0xc6, 0x41, 0x90, - 0x37, 0xf2, 0x42, 0x84, 0x08, 0x76, 0x49, 0x20, 0xcc, 0x65, 0xfd, 0x46, 0xbc, 0x85, 0xaf, 0xe8, 0x2d, 0x35, 0x47, - 0x4f, 0xa3, 0x03, 0x3d, 0x9c, 0xb0, 0xbe, 0x8b, 0x0f, 0xa3, 0x2f, 0xb0, 0xe6, 0xe1, 0xb3, 0x00, 0x90, 0x8e, 0x61, - 0x15, 0xc0, 0xda, 0x60, 0xee, 0x18, 0x6e, 0xeb, 0xf4, 0xc4, 0x5a, 0xe6, 0x00, 0xbb, 0xdc, 0xc9, 0x71, 0x43, 0x77, - 0x0e, 0x41, 0xc1, 0xbc, 0x1d, 0x58, 0x23, 0xff, 0xcf, 0xb4, 0xa1, 0x3b, 0xab, 0x98, 0x58, 0x06, 0x22, 0xcd, 0x11, - 0x09, 0x0d, 0x5f, 0x77, 0x2f, 0x02, 0x07, 0xf0, 0x11, 0x83, 0xaf, 0x41, 0xc5, 0xf3, 0xdc, 0xe4, 0x57, 0xf5, 0xf3, - 0x4b, 0xc4, 0xde, 0x14, 0xaf, 0xeb, 0xa9, 0xbb, 0x2b, 0x0f, 0x7f, 0xa7, 0x14, 0x00, 0xbd, 0x54, 0x76, 0x15, 0x98, - 0xc9, 0xc1, 0x26, 0x32, 0xfc, 0x5c, 0x2f, 0xa1, 0x32, 0x6d, 0xf6, 0x84, 0x10, 0x2e, 0x48, 0x39, 0xb9, 0x1e, 0x2f, - 0x46, 0x7e, 0x02, 0x2a, 0x02, 0x6d, 0x02, 0xc8, 0xb2, 0x3f, 0x82, 0x45, 0xca, 0x01, 0x81, 0x78, 0x17, 0x17, 0x7d, - 0xea, 0x2d, 0x0d, 0x92, 0x98, 0xdd, 0x4b, 0x11, 0x30, 0x88, 0xcb, 0x84, 0x12, 0x34, 0x6c, 0x4d, 0xd9, 0xb7, 0x10, - 0xb9, 0x23, 0x74, 0xd8, 0x11, 0x66, 0x06, 0x5d, 0x25, 0xf2, 0x1f, 0x1d, 0x2d, 0xa9, 0x82, 0x87, 0xe9, 0xc9, 0xb3, - 0x15, 0xcd, 0x86, 0x93, 0x06, 0x12, 0x12, 0xf8, 0x50, 0x88, 0x03, 0x1b, 0x6f, 0x48, 0xa2, 0x60, 0x3d, 0x48, 0xfe, - 0x74, 0xd9, 0xf2, 0xba, 0xf3, 0x2c, 0x3b, 0xbe, 0x63, 0x68, 0x0e, 0x79, 0x8c, 0x44, 0x11, 0x94, 0xc2, 0xef, 0xa0, - 0xa4, 0x45, 0xa6, 0x12, 0x50, 0xae, 0x15, 0xd9, 0xe1, 0xa9, 0x2a, 0x31, 0x01, 0x5a, 0xa0, 0x07, 0xd1, 0xbd, 0xcb, - 0x42, 0xd3, 0x74, 0xf0, 0xda, 0xa1, 0x61, 0x2c, 0x83, 0xa9, 0x0e, 0x2e, 0x5b, 0xa1, 0x38, 0x32, 0xe9, 0x90, 0x51, - 0x70, 0x72, 0xeb, 0xac, 0xcb, 0x26, 0x37, 0xbf, 0xbd, 0x57, 0x74, 0x74, 0x0c, 0x64, 0x75, 0x9e, 0xde, 0x3c, 0xcf, - 0x66, 0x08, 0x06, 0xe9, 0xe3, 0x69, 0x57, 0xf1, 0x72, 0x9a, 0x81, 0x69, 0xd5, 0xf6, 0x6d, 0x19, 0x2e, 0x37, 0xb1, - 0xe4, 0xaa, 0xdb, 0x87, 0xb9, 0xcc, 0x67, 0xa7, 0x93, 0xec, 0xb7, 0xd6, 0xe0, 0xc8, 0x69, 0x66, 0xfd, 0x46, 0xf9, - 0x3c, 0x3f, 0x32, 0x95, 0x6f, 0x0e, 0x93, 0x44, 0x6a, 0xd7, 0x50, 0xad, 0xc2, 0x0c, 0x3f, 0x19, 0x44, 0xbd, 0x06, - 0x54, 0x1b, 0xad, 0x18, 0x6e, 0xe0, 0xc5, 0xe6, 0xc9, 0xd2, 0x75, 0xcc, 0x8c, 0xab, 0xc0, 0x2c, 0x26, 0x95, 0x18, - 0xdf, 0x8b, 0x04, 0x19, 0xb4, 0xa7, 0xfb, 0x54, 0x34, 0xd6, 0x97, 0x40, 0x27, 0x8b, 0x68, 0x03, 0x06, 0xe6, 0x10, - 0xea, 0x58, 0xa0, 0xb1, 0x71, 0x98, 0x45, 0x6d, 0x2b, 0x33, 0x9a, 0x2a, 0x83, 0x61, 0x0c, 0xb5, 0x01, 0x5c, 0xdd, - 0xaa, 0x85, 0x94, 0x8c, 0xb2, 0xee, 0x32, 0x1a, 0x28, 0xa1, 0x63, 0x19, 0x2b, 0x3c, 0x52, 0x32, 0x5c, 0x19, 0x71, - 0x1a, 0xe0, 0xcb, 0xd3, 0xff, 0xf7, 0x27, 0x32, 0x6a, 0xe9, 0xee, 0x48, 0xde, 0xb9, 0xec, 0xe8, 0x4a, 0x33, 0x9e, - 0xa7, 0xcb, 0xe9, 0x8b, 0xd4, 0x6d, 0xa9, 0x96, 0xf9, 0xc3, 0xe8, 0x18, 0x85, 0xaf, 0xed, 0xdb, 0x6d, 0x25, 0x1a, - 0xce, 0x30, 0x62, 0xae, 0x7c, 0xe3, 0x16, 0xf5, 0x5a, 0x8a, 0xee, 0xb7, 0x8c, 0x9c, 0x4a, 0x75, 0xc7, 0x1b, 0x97, - 0x1a, 0x5e, 0x29, 0xfd, 0x87, 0x79, 0x5e, 0xcc, 0xb1, 0xdd, 0xf6, 0x71, 0xb5, 0xb2, 0xcb, 0x89, 0xce, 0x9b, 0xe7, - 0x24, 0xe1, 0x6d, 0x8f, 0x63, 0x2b, 0x91, 0xe2, 0xb1, 0x34, 0x7f, 0x57, 0x4d, 0xb6, 0x9b, 0x5f, 0x7d, 0x2e, 0xc8, - 0x5a, 0x4c, 0xba, 0xd5, 0x56, 0xa5, 0x35, 0xf3, 0xe0, 0xdd, 0x9e, 0x39, 0xd2, 0x53, 0x12, 0x34, 0xdc, 0x2e, 0xe4, - 0xd3, 0x20, 0xd2, 0x5b, 0x66, 0x74, 0x58, 0x93, 0x57, 0xbe, 0xb1, 0x09, 0x0e, 0xe1, 0x78, 0x6b, 0x34, 0x0f, 0x93, - 0x9d, 0x4e, 0xea, 0xc5, 0xff, 0x33, 0x5b, 0xf8, 0x36, 0x75, 0xf2, 0x57, 0x5c, 0xe9, 0x20, 0xc5, 0xc5, 0x14, 0x1f, - 0x8e, 0x11, 0xcc, 0x97, 0xf4, 0x1d, 0x0a, 0x8f, 0xa6, 0x9c, 0x06, 0x06, 0x21, 0x66, 0xcf, 0xbe, 0x73, 0xf7, 0x76, - 0xbc, 0x25, 0xce, 0xa8, 0x2c, 0x6b, 0x8a, 0x25, 0x18, 0xa4, 0x79, 0x1d, 0x10, 0x00, 0x57, 0x2e, 0x88, 0x5d, 0x81, - 0xc8, 0x96, 0x17, 0xd1, 0xe2, 0xdd, 0x2f, 0x4b, 0xa3, 0xb8, 0x29, 0xf1, 0x99, 0xec, 0xf6, 0x44, 0x30, 0xc0, 0x2d, - 0xc8, 0x0e, 0xc7, 0x0e, 0x16, 0xc4, 0x1c, 0x09, 0xde, 0x15, 0x65, 0x58, 0x92, 0x3a, 0x50, 0x2c, 0x5a, 0xd4, 0x05, - 0x13, 0x13, 0x29, 0x64, 0x6b, 0xab, 0x84, 0x00, 0x69, 0xa2, 0xf6, 0x12, 0x58, 0xd4, 0x34, 0x7b, 0xa2, 0xea, 0x62, - 0x92, 0xbb, 0x21, 0xf7, 0x34, 0x1e, 0xfc, 0x3c, 0x94, 0xcc, 0xb1, 0x37, 0x89, 0x90, 0x7f, 0xbd, 0xd9, 0xfa, 0x05, - 0xf6, 0x0e, 0x7e, 0xd1, 0x10, 0xbe, 0x9a, 0xc2, 0x1a, 0x92, 0x30, 0xab, 0x5c, 0x78, 0xab, 0x24, 0x40, 0x81, 0xb2, - 0xac, 0x4f, 0x8b, 0x03, 0x46, 0x1f, 0x0a, 0xca, 0x16, 0xcb, 0x39, 0x89, 0xd9, 0x71, 0x11, 0x5b, 0x72, 0x2f, 0xfa, - 0xfc, 0xfc, 0x65, 0x1c, 0xef, 0x11, 0x81, 0xca, 0xad, 0xf2, 0xfe, 0x48, 0xc9, 0x01, 0x03, 0x33, 0xfd, 0x29, 0x8d, - 0xe8, 0xdc, 0x7f, 0x3f, 0xd5, 0x0f, 0x39, 0xf0, 0x4b, 0xe0, 0x38, 0xd0, 0xa7, 0x2c, 0x5a, 0xce, 0x06, 0xaa, 0x7b, - 0x9c, 0x53, 0xfb, 0x58, 0x5c, 0x22, 0xae, 0x4c, 0x42, 0xa0, 0xbb, 0x5c, 0x48, 0x82, 0xc5, 0xa7, 0x60, 0x48, 0x36, - 0x01, 0xd3, 0x58, 0x61, 0x73, 0xad, 0x79, 0x77, 0x80, 0x2e, 0x36, 0x58, 0xc1, 0x2b, 0x1c, 0x0c, 0xbd, 0xb6, 0x66, - 0x4e, 0x6b, 0x35, 0xbd, 0x13, 0x25, 0x89, 0x6c, 0xb2, 0xdb, 0x8f, 0x23, 0x7b, 0x43, 0x1a, 0x22, 0xfc, 0xb9, 0x51, - 0x5a, 0x14, 0x8a, 0xe6, 0x6a, 0x85, 0x88, 0x7d, 0xaf, 0x52, 0x4e, 0x32, 0xa9, 0x5a, 0x6a, 0x72, 0x5b, 0x29, 0x21, - 0xd6, 0x85, 0x7f, 0x14, 0xd4, 0xcd, 0xa8, 0x3f, 0x25, 0x37, 0xd0, 0x37, 0xe2, 0x4d, 0x02, 0x6f, 0xac, 0xf5, 0x21, - 0x28, 0x9a, 0x68, 0xfc, 0x08, 0x8a, 0xc5, 0xc1, 0x04, 0x4f, 0x3c, 0x97, 0x61, 0x09, 0x48, 0xa7, 0x78, 0xe8, 0xc5, - 0x84, 0x8b, 0x40, 0x0b, 0xce, 0x59, 0xbe, 0x7b, 0xa7, 0x79, 0xa0, 0xd3, 0x7a, 0x21, 0x89, 0xd9, 0x5e, 0x75, 0xba, - 0xf4, 0x8a, 0x81, 0xf3, 0xeb, 0x4c, 0x59, 0x22, 0xee, 0x49, 0x5e, 0x6e, 0x37, 0x96, 0xd1, 0xc6, 0x22, 0xe6, 0x74, - 0xa6, 0x82, 0x3f, 0x9b, 0x7a, 0x5b, 0x27, 0x16, 0xbf, 0x1d, 0x4f, 0xad, 0x8c, 0xd7, 0x01, 0xee, 0x12, 0x6f, 0xca, - 0xa0, 0x54, 0xc4, 0xeb, 0x41, 0x84, 0x48, 0x90, 0x12, 0x9d, 0x46, 0x86, 0xd2, 0x63, 0x3f, 0x48, 0xcc, 0x06, 0xd4, - 0x88, 0x1d, 0xd8, 0x39, 0xca, 0x6e, 0x85, 0x9f, 0xfb, 0xbb, 0xf5, 0xf0, 0x7b, 0x95, 0x3e, 0xe9, 0x2d, 0xcc, 0x4a, - 0xf3, 0xa4, 0x1a, 0x56, 0x60, 0xd9, 0x71, 0xfb, 0x97, 0x67, 0xae, 0xc2, 0xe0, 0xdc, 0x56, 0xc3, 0x9d, 0x3e, 0x97, - 0xef, 0x2f, 0xe0, 0xef, 0x4f, 0xbf, 0xaf, 0xf9, 0x02, 0xb3, 0x8e, 0x94, 0x50, 0xd7, 0x6e, 0x23, 0x22, 0xee, 0xc5, - 0xab, 0xab, 0x14, 0x5a, 0x80, 0x2c, 0xbf, 0x80, 0x67, 0xc7, 0xb7, 0x46, 0xba, 0x4f, 0x8e, 0x54, 0x20, 0x11, 0xf2, - 0x56, 0x41, 0x58, 0x09, 0x38, 0x52, 0xd8, 0x2c, 0xb2, 0xa0, 0x4f, 0x25, 0x74, 0x0d, 0x3f, 0x25, 0xbe, 0xbc, 0x9a, - 0x2b, 0x7e, 0x0c, 0xe9, 0x04, 0x74, 0xd8, 0x9d, 0x0f, 0x22, 0xb0, 0x41, 0xce, 0x7a, 0xc9, 0x68, 0xde, 0xc9, 0x67, - 0xa3, 0xc8, 0xb4, 0x63, 0xa5, 0xfd, 0xda, 0xa8, 0xdb, 0x3e, 0x1e, 0xdf, 0x29, 0x06, 0x3c, 0x38, 0x6c, 0x6e, 0x37, - 0x69, 0x20, 0x6f, 0xd5, 0xde, 0xfb, 0x7a, 0xc7, 0xb5, 0x5d, 0x90, 0x7c, 0xb2, 0xb4, 0x83, 0x28, 0xa4, 0xdb, 0x8d, - 0x9c, 0x2a, 0xea, 0x17, 0x45, 0xfb, 0x22, 0x2d, 0xef, 0xee, 0x12, 0x8f, 0x7b, 0xf5, 0x24, 0x4e, 0x2e, 0x8e, 0x73, - 0x4d, 0x25, 0xe2, 0xc8, 0x97, 0xa8, 0x2f, 0x4f, 0xd1, 0x66, 0x5a, 0x53, 0x83, 0xab, 0x5c, 0xab, 0xa6, 0x44, 0x5e, - 0x8a, 0x9e, 0xd9, 0xcd, 0xe2, 0xaf, 0xb8, 0xa6, 0x42, 0x33, 0xe0, 0xfc, 0x59, 0xfb, 0xe6, 0xcf, 0x04, 0x0f, 0x2e, - 0x8b, 0x7f, 0x94, 0xfe, 0x97, 0x53, 0x4f, 0x64, 0xf9, 0x05, 0xfe, 0x6a, 0xbc, 0x59, 0xbc, 0xf9, 0xef, 0x2e, 0x72, - 0x9f, 0x2f, 0xd8, 0x51, 0xb0, 0xde, 0x5e, 0x8e, 0x2f, 0x72, 0x7d, 0x39, 0x49, 0x7c, 0x83, 0x30, 0x80, 0xd3, 0x21, - 0x2d, 0xeb, 0x9d, 0xd6, 0x04, 0x9f, 0x81, 0x80, 0x90, 0x6c, 0xe7, 0xec, 0xc4, 0xd6, 0x1f, 0x49, 0xb4, 0x19, 0xcc, - 0xe4, 0x65, 0x90, 0xec, 0x6b, 0x24, 0x00, 0x72, 0x6a, 0x33, 0xd2, 0x71, 0x3e, 0x6d, 0x02, 0x6d, 0x32, 0x49, 0xdd, - 0x6e, 0x01, 0x5c, 0x80, 0x54, 0x94, 0xaf, 0xd6, 0x4d, 0x14, 0x35, 0xf3, 0x2a, 0x14, 0x5f, 0xed, 0xf5, 0x0b, 0xb4, - 0x53, 0x4d, 0x7b, 0x35, 0xd7, 0x81, 0xc0, 0x7a, 0xd5, 0x21, 0x42, 0x4b, 0xb6, 0x82, 0x1e, 0x7f, 0x4f, 0x7c, 0xb7, - 0xf9, 0x80, 0x7a, 0x83, 0xe5, 0x6e, 0xaf, 0x39, 0x9d, 0xda, 0xcd, 0x90, 0x1a, 0xf4, 0x19, 0x54, 0x51, 0xb0, 0x04, - 0xbc, 0xfd, 0xcc, 0xee, 0x66, 0x4b, 0x45, 0x36, 0xb7, 0xf8, 0xe2, 0x60, 0x5b, 0x24, 0x90, 0x8e, 0x23, 0x60, 0x4d, - 0x66, 0xa4, 0x24, 0xb3, 0x53, 0x9a, 0x32, 0x0a, 0x40, 0x06, 0xf0, 0x62, 0x12, 0xf6, 0x98, 0xf4, 0xdf, 0x87, 0x57, - 0x69, 0xfd, 0xd5, 0xfb, 0x62, 0xe4, 0x3d, 0xff, 0x68, 0x7a, 0xe0, 0xf4, 0x7b, 0x6b, 0x97, 0xb3, 0xd7, 0xa9, 0x47, - 0x8d, 0x25, 0xdf, 0x38, 0x80, 0xff, 0x84, 0xa7, 0xce, 0xea, 0x30, 0xdf, 0x8e, 0x9c, 0x52, 0xe5, 0xca, 0xbd, 0x0a, - 0xee, 0xf7, 0x07, 0xe1, 0xfe, 0xff, 0x55, 0xed, 0x66, 0xf8, 0xf9, 0xdf, 0xd6, 0xf0, 0x7f, 0xd9, 0x75, 0x58, 0x6b, - 0xee, 0x7f, 0x6b, 0x70, 0xe9, 0x77, 0x14, 0xd4, 0x75, 0xed, 0xdf, 0x79, 0x10, 0x68, 0x05, 0x5e, 0x17, 0x77, 0x26, - 0x2b, 0x3d, 0x4d, 0xe9, 0xc1, 0x20, 0x3a, 0xf8, 0xff, 0xb3, 0x6c, 0x8e, 0xbd, 0x38, 0x61, 0xb2, 0xb2, 0xfd, 0x7e, - 0x1a, 0x0b, 0xb0, 0x9c, 0x44, 0x69, 0xe3, 0x80, 0xf7, 0x95, 0x1f, 0xd7, 0xe8, 0xe7, 0x80, 0x4e, 0xac, 0x53, 0x40, - 0xdf, 0xd5, 0xf4, 0x09, 0xe2, 0xb1, 0x87, 0xd7, 0x90, 0x7b, 0x47, 0x70, 0x5f, 0x6b, 0x1c, 0x2e, 0x28, 0x3f, 0x14, - 0x77, 0x72, 0x31, 0x95, 0xfc, 0x52, 0xfa, 0xbd, 0x66, 0xf7, 0x45, 0x29, 0x37, 0xc4, 0x50, 0x93, 0x5b, 0x7f, 0x13, - 0x21, 0xdd, 0x2b, 0x92, 0xc8, 0x6a, 0x51, 0x77, 0xae, 0x92, 0x4e, 0x9c, 0xdd, 0xb3, 0xad, 0xca, 0x0c, 0xc0, 0x8b, - 0x2a, 0x97, 0x92, 0xb7, 0xeb, 0x40, 0x19, 0xd3, 0x7b, 0xec, 0x7c, 0x1d, 0x0d, 0xa8, 0xa5, 0xf4, 0x55, 0xde, 0xf0, - 0xef, 0xfc, 0x02, 0xf3, 0xae, 0xc6, 0xba, 0xf1, 0xc4, 0x3e, 0x1a, 0xda, 0x4d, 0xe3, 0x3e, 0x42, 0x40, 0x1d, 0x6e, - 0xc8, 0xa9, 0x46, 0xa2, 0x6b, 0x3e, 0xcb, 0xc3, 0x88, 0xb2, 0x91, 0xb7, 0xe0, 0x4c, 0x9c, 0xb3, 0x4e, 0x41, 0x86, - 0x99, 0xa1, 0x61, 0x05, 0x4d, 0x6f, 0x31, 0xc6, 0xf6, 0xf2, 0x8e, 0xef, 0x8e, 0xb2, 0xb5, 0xfd, 0xfa, 0xcb, 0x02, - 0x81, 0x74, 0x5c, 0x04, 0xef, 0x14, 0x5f, 0xe0, 0x91, 0x34, 0x32, 0xf5, 0x60, 0xdf, 0x5f, 0xd2, 0x8b, 0xb0, 0xff, - 0xd6, 0x9c, 0x26, 0x97, 0x2f, 0xe7, 0x4c, 0x69, 0x51, 0xe7, 0x6c, 0xf1, 0xe2, 0xb6, 0x71, 0xff, 0xd3, 0xe4, 0xda, - 0x98, 0xf5, 0xe7, 0x9c, 0x14, 0x15, 0x4e, 0xb4, 0xce, 0xe6, 0x62, 0xef, 0xbd, 0xe7, 0xbc, 0x1e, 0x2c, 0xbb, 0x07, - 0x67, 0x32, 0x62, 0xeb, 0xad, 0x2e, 0xbc, 0x64, 0xdf, 0x26, 0x6e, 0x9b, 0x0a, 0xae, 0x29, 0x1e, 0xbc, 0x7a, 0x99, - 0xde, 0x5d, 0x9d, 0x2c, 0x59, 0xac, 0x59, 0x7e, 0x34, 0xa0, 0x9b, 0x7d, 0x58, 0xb7, 0x8d, 0xc6, 0xf1, 0x9a, 0x4a, - 0x6c, 0x9b, 0x58, 0xc6, 0xac, 0xa6, 0x13, 0xc1, 0xfd, 0x5f, 0x36, 0xb8, 0x76, 0xa6, 0x0e, 0xc5, 0xb5, 0x19, 0x85, - 0x52, 0xf0, 0xa3, 0x04, 0x24, 0x5c, 0x32, 0x96, 0x0c, 0x9c, 0xe0, 0xdb, 0x39, 0x9d, 0x4c, 0x99, 0xa6, 0xe1, 0x74, - 0xf3, 0xc3, 0x69, 0x07, 0xdf, 0x76, 0x12, 0x23, 0x20, 0xb9, 0x1f, 0x19, 0xb9, 0xc1, 0x64, 0x49, 0xa8, 0x11, 0x77, - 0xeb, 0xe4, 0x17, 0x74, 0xcc, 0x64, 0x89, 0xa7, 0x52, 0x93, 0x87, 0xf3, 0xf1, 0x09, 0xfb, 0xf9, 0x67, 0xeb, 0x6f, - 0xd6, 0x37, 0xed, 0x2a, 0xdc, 0x28, 0xeb, 0xd4, 0x7e, 0x86, 0x3d, 0xab, 0x12, 0x42, 0xde, 0x94, 0xf7, 0xf6, 0x96, - 0xda, 0xa7, 0xdf, 0x37, 0x22, 0xb8, 0xfa, 0xce, 0xd0, 0xea, 0xcf, 0x29, 0x82, 0xe5, 0x6e, 0xd7, 0x4a, 0xa5, 0xc9, - 0xea, 0x89, 0xef, 0xfd, 0x1a, 0x6f, 0x45, 0xce, 0x83, 0x97, 0xec, 0x8d, 0x38, 0x7f, 0x2c, 0x8a, 0xef, 0x9e, 0x3f, - 0x22, 0x16, 0x97, 0x77, 0x73, 0x0c, 0xb1, 0xc9, 0xe5, 0x21, 0x95, 0xc4, 0x34, 0xf8, 0x04, 0x6a, 0x3b, 0xab, 0xa1, - 0x44, 0x57, 0x52, 0xab, 0x2b, 0xbe, 0x94, 0x02, 0x96, 0xca, 0xa8, 0x92, 0xa1, 0xae, 0x0e, 0xa7, 0x8e, 0xd2, 0xf2, - 0xc3, 0xab, 0x0a, 0x2e, 0x95, 0x79, 0x68, 0x69, 0x0c, 0xbf, 0xf4, 0xe9, 0x05, 0x63, 0x18, 0xd9, 0x66, 0x03, 0x97, - 0xa7, 0xe8, 0x44, 0xef, 0xe0, 0x0b, 0xa1, 0xe3, 0x43, 0x33, 0xf9, 0x02, 0x8d, 0xd7, 0x50, 0x92, 0xe1, 0x90, 0x73, - 0x55, 0xdc, 0xa2, 0x96, 0xb8, 0x7f, 0x45, 0xd6, 0x53, 0x4d, 0x69, 0xd1, 0x9e, 0x96, 0xa1, 0xa0, 0xb4, 0x4e, 0x72, - 0x5d, 0x61, 0x7a, 0x99, 0x74, 0x52, 0x4f, 0x6b, 0x70, 0x2b, 0x77, 0x8e, 0x44, 0x66, 0xf7, 0x4d, 0xd3, 0x91, 0x42, - 0x6e, 0x57, 0x40, 0xd2, 0xae, 0x3f, 0x8f, 0x55, 0xc8, 0x3e, 0x24, 0x4d, 0x2d, 0xe9, 0xfe, 0xcc, 0x0e, 0x84, 0x96, - 0xf7, 0xdd, 0xd8, 0xa9, 0x23, 0xdd, 0x83, 0x60, 0xec, 0xfc, 0x56, 0x69, 0x37, 0xcd, 0x49, 0xbc, 0x71, 0xf1, 0x6b, - 0x8f, 0x02, 0xb2, 0xa5, 0x19, 0x7c, 0x6d, 0x4d, 0x40, 0xbb, 0x7c, 0x03, 0x6b, 0x2d, 0x76, 0x30, 0xde, 0xe7, 0x6d, - 0xe8, 0xa1, 0x0f, 0x6c, 0x94, 0x6a, 0x1e, 0x7e, 0xa3, 0x54, 0xfd, 0x8e, 0x9c, 0x42, 0xd5, 0x73, 0xfe, 0xba, 0x24, - 0x8e, 0x8d, 0xac, 0xb6, 0x8b, 0x23, 0x06, 0x1b, 0x18, 0xe3, 0x50, 0x5f, 0x20, 0x62, 0xde, 0x31, 0x32, 0x40, 0x87, - 0xa4, 0x43, 0x59, 0x27, 0xd3, 0x44, 0x42, 0xcc, 0x03, 0x12, 0xec, 0x1d, 0x40, 0x3d, 0x80, 0xff, 0xc9, 0xa4, 0x45, - 0xfe, 0xa9, 0x5d, 0xe5, 0xdc, 0x31, 0xc7, 0x5f, 0x6a, 0x76, 0xcd, 0x46, 0x99, 0xd5, 0xd4, 0xe0, 0x7e, 0xd1, 0x14, - 0x11, 0xd5, 0xf2, 0x5a, 0x36, 0x4a, 0x67, 0x8e, 0xa4, 0xf8, 0x8b, 0xd9, 0xd2, 0x93, 0xfe, 0xf6, 0xbe, 0x94, 0x3e, - 0x7b, 0xf7, 0xfc, 0xce, 0x22, 0x67, 0xaa, 0xdd, 0xfd, 0x14, 0x87, 0x4f, 0x7d, 0xb2, 0xe4, 0x5f, 0x3f, 0xfe, 0x8b, - 0x7f, 0x41, 0x6f, 0xf8, 0x0b, 0xd6, 0xa5, 0x11, 0xac, 0x5d, 0xf6, 0xf5, 0x25, 0xd8, 0xf1, 0xa1, 0xd1, 0xa7, 0x0c, - 0x2c, 0x05, 0x77, 0x41, 0x4b, 0xf0, 0x10, 0x60, 0xb2, 0xd5, 0x6a, 0xfd, 0x40, 0xdc, 0x3f, 0xbb, 0xae, 0x2b, 0x5f, - 0x2c, 0xdc, 0x57, 0xdb, 0xf7, 0x45, 0xaa, 0xd5, 0xe7, 0xdd, 0x4e, 0x26, 0xc7, 0xbb, 0xff, 0x42, 0x0d, 0xfa, 0x46, - 0x84, 0xc2, 0x33, 0x3b, 0x3d, 0x5d, 0x0d, 0x8b, 0xd7, 0x55, 0xbf, 0x98, 0xaa, 0xb6, 0xb8, 0xa9, 0xa6, 0xc5, 0x8b, - 0xea, 0xf4, 0xe0, 0xff, 0xae, 0x78, 0xc9, 0x33, 0x61, 0x98, 0x0f, 0x34, 0xc8, 0xd9, 0xe3, 0x97, 0xa1, 0x96, 0x1b, - 0x1f, 0x28, 0x76, 0xab, 0xa2, 0x70, 0xda, 0xa5, 0xef, 0x7f, 0xdc, 0x67, 0xf0, 0x46, 0x0a, 0x7a, 0x19, 0xd3, 0x1e, - 0x2d, 0x69, 0xd0, 0x4c, 0x22, 0x48, 0xec, 0xeb, 0x4e, 0x7b, 0x27, 0x1d, 0x48, 0x18, 0xf4, 0xeb, 0x6d, 0xcb, 0x35, - 0x1e, 0x45, 0x98, 0x30, 0x79, 0xcb, 0x40, 0x1c, 0x0a, 0xbe, 0x42, 0x35, 0x22, 0xda, 0x3b, 0x61, 0x9b, 0x24, 0x82, - 0x20, 0x86, 0x2e, 0x75, 0x52, 0x07, 0xbb, 0x4c, 0x73, 0xeb, 0x3c, 0x96, 0x00, 0x69, 0xc5, 0x9a, 0xf2, 0x53, 0x5f, - 0xb4, 0x62, 0x92, 0x8a, 0xda, 0x5c, 0x98, 0x2a, 0xa1, 0x9b, 0x11, 0x62, 0x7d, 0xcb, 0x05, 0xdf, 0xe6, 0x75, 0x2d, - 0x02, 0x2d, 0x37, 0x6b, 0x06, 0xe4, 0x8c, 0x2e, 0xe4, 0x8d, 0xb9, 0x90, 0x2d, 0x96, 0x69, 0xbd, 0x30, 0x4e, 0x35, - 0x6d, 0xda, 0x88, 0xc8, 0x5e, 0xfd, 0xfa, 0x16, 0x88, 0xec, 0x43, 0x5f, 0xd4, 0x99, 0xde, 0xd4, 0xad, 0xb0, 0x89, - 0x41, 0xa6, 0xa1, 0x2a, 0x51, 0x1a, 0xa2, 0x11, 0x17, 0xf1, 0x68, 0x57, 0x89, 0xb0, 0xf1, 0x93, 0xfc, 0x9a, 0x49, - 0x0a, 0x3a, 0x80, 0x58, 0xa0, 0xe2, 0xba, 0xf6, 0x02, 0xe2, 0x90, 0x95, 0xde, 0x37, 0xfd, 0x53, 0x6e, 0xee, 0x8c, - 0x72, 0x33, 0xf4, 0x93, 0x26, 0x57, 0x70, 0x09, 0x31, 0xea, 0x21, 0x8a, 0xc8, 0x47, 0xb1, 0xef, 0x50, 0x27, 0x90, - 0x02, 0x4e, 0x14, 0x67, 0xd0, 0x38, 0x53, 0x81, 0x03, 0xf6, 0x81, 0x16, 0x71, 0x0c, 0x45, 0xf6, 0xa3, 0xae, 0x3a, - 0xd7, 0x23, 0x93, 0x54, 0x77, 0xd2, 0x6f, 0xfe, 0x73, 0x55, 0x65, 0xb0, 0x97, 0x57, 0xab, 0x6c, 0x3e, 0x28, 0xf9, - 0x07, 0xf6, 0x37, 0x73, 0x85, 0x8a, 0xb5, 0xf3, 0x36, 0x9c, 0xd1, 0xe6, 0x88, 0xb1, 0x85, 0xe5, 0x71, 0x6e, 0xa9, - 0x27, 0x70, 0xad, 0xbf, 0x03, 0xcf, 0x70, 0xf6, 0x2d, 0x61, 0x64, 0x5e, 0x4e, 0x26, 0x0b, 0xdd, 0xcc, 0x6e, 0x77, - 0x79, 0xe4, 0x6c, 0x98, 0xd4, 0x9e, 0x2c, 0xea, 0xd7, 0x00, 0xe3, 0x47, 0xbc, 0xe6, 0xc1, 0x9e, 0x81, 0xeb, 0x91, - 0x48, 0xc1, 0x66, 0x80, 0x77, 0x32, 0x76, 0xc4, 0xca, 0x89, 0xb3, 0x34, 0x06, 0x9d, 0x0b, 0x57, 0xa5, 0xe9, 0xef, - 0x2d, 0x51, 0x4a, 0x00, 0x98, 0x41, 0xe8, 0xfd, 0xdc, 0x36, 0xf7, 0xad, 0xa8, 0x4d, 0x49, 0x1a, 0xe2, 0x0c, 0xa2, - 0x72, 0xa0, 0x62, 0x17, 0x34, 0x1d, 0xed, 0x5b, 0x2a, 0xc7, 0xc9, 0x0c, 0x12, 0xa6, 0x5e, 0x19, 0x77, 0xc5, 0x5f, - 0xfa, 0xac, 0x56, 0xff, 0xfc, 0xc8, 0xf4, 0x54, 0xff, 0x88, 0xec, 0xf6, 0x55, 0xf1, 0x3c, 0x57, 0x7e, 0x62, 0x4a, - 0xcd, 0xd5, 0x76, 0x27, 0x43, 0xbc, 0xb1, 0xf4, 0x56, 0xcc, 0x1c, 0xb0, 0xde, 0x1a, 0x9e, 0xd7, 0xbb, 0x5e, 0xcc, - 0x1d, 0xf5, 0x4b, 0xba, 0xaf, 0xcf, 0xff, 0x26, 0x03, 0xfb, 0x0d, 0x93, 0x9c, 0xfb, 0x9a, 0xf6, 0x3c, 0xa1, 0xaf, - 0x16, 0xf3, 0x9a, 0x26, 0x36, 0xf6, 0x99, 0x67, 0xde, 0xd2, 0x34, 0xc8, 0x9e, 0xee, 0xeb, 0x95, 0xd6, 0x99, 0x39, - 0xc7, 0x87, 0x83, 0xe6, 0xf3, 0x27, 0xdd, 0x1b, 0x07, 0xdd, 0x15, 0x28, 0x2e, 0xdd, 0x27, 0xdf, 0x51, 0xf8, 0xc2, - 0x5c, 0x30, 0xed, 0x5c, 0x22, 0xe4, 0xc1, 0xcd, 0xf2, 0x04, 0xa4, 0xbc, 0xcc, 0x27, 0x90, 0x34, 0xcf, 0xcf, 0x97, - 0x98, 0x95, 0x22, 0xc1, 0xcd, 0x84, 0x59, 0x4f, 0x9b, 0x81, 0xe9, 0x66, 0x37, 0x9b, 0x77, 0xf5, 0xe4, 0x49, 0xe7, - 0xb5, 0x83, 0xa6, 0xce, 0xbf, 0xb2, 0xd9, 0xa7, 0x2f, 0x2a, 0xf5, 0x34, 0xad, 0xdc, 0xf5, 0x24, 0x7f, 0xaf, 0x44, - 0x99, 0x05, 0xf0, 0x5e, 0x4a, 0xe4, 0x29, 0x9e, 0xee, 0xe4, 0xa4, 0x89, 0x6a, 0x80, 0x14, 0xab, 0xbb, 0x13, 0xc3, - 0x46, 0xd5, 0x42, 0xa7, 0x1c, 0x3d, 0xe3, 0xd5, 0xcf, 0xd8, 0x23, 0xbe, 0x88, 0xd8, 0x89, 0x8d, 0xc2, 0x8f, 0x8a, - 0xa1, 0xc2, 0xfa, 0xb4, 0x2e, 0x83, 0x57, 0x86, 0xd5, 0x65, 0x2c, 0x06, 0xe4, 0xe7, 0xa6, 0x5c, 0x48, 0xa1, 0xe5, - 0xe7, 0xe8, 0x3e, 0x34, 0x35, 0x50, 0x6f, 0x7c, 0x1e, 0xef, 0xf2, 0xd9, 0xa4, 0xfe, 0x0d, 0x04, 0x7c, 0x90, 0x01, - 0xb5, 0x2c, 0x74, 0x5a, 0xcf, 0x9e, 0xe2, 0xc7, 0x4f, 0xfb, 0xdf, 0x58, 0xf2, 0xf1, 0xc7, 0xff, 0x14, 0xcf, 0x1e, - 0xfb, 0xa8, 0x52, 0x68, 0x12, 0xbc, 0xa7, 0xb0, 0x6f, 0xb3, 0xff, 0xef, 0x91, 0x67, 0xd1, 0xc4, 0x8b, 0xe1, 0x51, - 0x9d, 0x5d, 0x20, 0x4a, 0x6a, 0x7d, 0xe8, 0x8b, 0xd8, 0x71, 0xdf, 0xf7, 0x60, 0x59, 0xba, 0x47, 0xdc, 0xe4, 0xc1, - 0xf5, 0x49, 0xec, 0xf6, 0x95, 0x89, 0x54, 0x6a, 0xfc, 0x8c, 0x5c, 0xc0, 0x58, 0x27, 0xed, 0x31, 0x5c, 0xda, 0xd2, - 0x48, 0xc1, 0xa6, 0x14, 0x67, 0x52, 0x80, 0xfb, 0x4c, 0x94, 0xbe, 0xb3, 0x8f, 0x20, 0xa9, 0xf7, 0x2f, 0x4d, 0x60, - 0x49, 0x5e, 0x97, 0x05, 0x12, 0x9f, 0x8f, 0x2b, 0xf7, 0xf9, 0x24, 0x20, 0x2e, 0x8a, 0x0b, 0x68, 0x0b, 0xc4, 0x18, - 0x15, 0xb9, 0x14, 0x3d, 0x64, 0x69, 0x2a, 0x26, 0xaa, 0x43, 0x7a, 0xc1, 0x6e, 0xdf, 0x0d, 0x94, 0x32, 0x2d, 0x74, - 0xfc, 0xd5, 0x89, 0x18, 0x28, 0x5d, 0x9e, 0xed, 0x6d, 0x61, 0x40, 0x2e, 0x17, 0x13, 0x82, 0x34, 0xbe, 0x9e, 0xc2, - 0xb2, 0xf3, 0x11, 0x5d, 0x25, 0x00, 0x29, 0xbc, 0x5b, 0xc4, 0xcd, 0xa0, 0xa0, 0xa4, 0x81, 0xaa, 0xa9, 0x8d, 0x1e, - 0x08, 0xb1, 0xec, 0x4c, 0xa9, 0xdc, 0x8a, 0x0a, 0x04, 0x01, 0x22, 0x1b, 0x7b, 0x90, 0xc8, 0xe9, 0x61, 0x7a, 0xb8, - 0xa3, 0x2d, 0x4a, 0xa6, 0x68, 0x04, 0x35, 0xda, 0xf4, 0x90, 0xa4, 0x07, 0xaf, 0x9b, 0x89, 0xc1, 0x89, 0xb3, 0xe1, - 0x17, 0xbc, 0xd7, 0x93, 0x7b, 0xbb, 0x36, 0xb2, 0xcf, 0x25, 0xe9, 0x10, 0x73, 0x78, 0xd8, 0xd5, 0xd3, 0xcd, 0x71, - 0xbb, 0xa7, 0x9c, 0x7b, 0x89, 0x9d, 0x80, 0xf6, 0xf6, 0xd4, 0x7d, 0x67, 0x25, 0x6a, 0x5d, 0xf0, 0x08, 0x29, 0xd7, - 0x49, 0xd7, 0x93, 0xef, 0x2f, 0xef, 0x6a, 0x53, 0x2a, 0x9b, 0x88, 0x54, 0x34, 0x99, 0x2a, 0x10, 0x53, 0x82, 0x34, - 0x96, 0x51, 0x2f, 0xb7, 0x73, 0xc4, 0x9e, 0x0e, 0xa3, 0xb8, 0x85, 0x37, 0xb3, 0x55, 0xf6, 0x26, 0xad, 0xaf, 0xb0, - 0x82, 0x69, 0x8a, 0x6a, 0xfe, 0xfb, 0x59, 0x56, 0xb4, 0x33, 0x10, 0x41, 0xa8, 0xe7, 0xb6, 0x25, 0xbb, 0x80, 0x46, - 0x39, 0x7f, 0xdb, 0x40, 0x9b, 0x0e, 0xfb, 0x20, 0xe4, 0x39, 0x32, 0xef, 0xe5, 0x5b, 0x22, 0xc4, 0x40, 0x4a, 0x90, - 0x81, 0xaf, 0x5d, 0x44, 0xd4, 0x1c, 0x16, 0xcd, 0x6d, 0xe0, 0xf0, 0x21, 0x5c, 0x91, 0x99, 0x60, 0x32, 0xc5, 0xdd, - 0x85, 0x38, 0xed, 0xb8, 0xc3, 0x3d, 0x3b, 0xea, 0x59, 0x93, 0x3b, 0x65, 0x1a, 0x69, 0x26, 0x79, 0x7a, 0xb7, 0x4a, - 0xa3, 0x6c, 0xe9, 0xc8, 0xc5, 0x26, 0x92, 0x4b, 0xb9, 0x85, 0x88, 0xdb, 0xb2, 0x76, 0xfa, 0xf6, 0xfb, 0xb2, 0x79, - 0x74, 0x2f, 0xbe, 0xf5, 0x3e, 0xec, 0xdc, 0xaa, 0xb7, 0x35, 0xdb, 0xd6, 0x4f, 0x4b, 0x81, 0x52, 0x06, 0xdc, 0x99, - 0xae, 0x64, 0x26, 0x55, 0x57, 0xbe, 0x68, 0xdb, 0x21, 0x5f, 0x98, 0xc0, 0xf4, 0x34, 0xbc, 0xcd, 0x6a, 0x9d, 0x50, - 0x94, 0xd2, 0x07, 0x62, 0x91, 0xf8, 0x30, 0x00, 0xc6, 0x07, 0xaf, 0x89, 0x5c, 0xf0, 0x33, 0xfc, 0x5c, 0x2a, 0xfd, - 0xae, 0xc9, 0x52, 0x14, 0x80, 0x3e, 0x88, 0xf6, 0xec, 0x34, 0xaa, 0xf9, 0x2a, 0x9b, 0xe9, 0xe4, 0x20, 0xa6, 0x7f, - 0xfc, 0xff, 0x5c, 0x05, 0xea, 0xb7, 0x23, 0x3d, 0x84, 0xf7, 0x9b, 0x04, 0xae, 0xd5, 0xc2, 0x98, 0x9e, 0xc4, 0xa8, - 0x7b, 0x58, 0x12, 0xe1, 0x40, 0x00, 0x5f, 0x45, 0x4d, 0xdc, 0x48, 0xe3, 0xad, 0xa2, 0xa7, 0xa8, 0x6f, 0xc3, 0x5b, - 0x77, 0xb2, 0x4f, 0xc6, 0xe1, 0x7e, 0x8e, 0xb9, 0x17, 0x25, 0xcb, 0x32, 0x88, 0x86, 0x41, 0xd1, 0x2d, 0x0c, 0xac, - 0x90, 0x9f, 0x2f, 0xe0, 0xcb, 0x30, 0xe7, 0x33, 0xa3, 0x64, 0xb4, 0x42, 0xf4, 0x2a, 0xa4, 0x0e, 0x12, 0xef, 0x66, - 0x98, 0x0d, 0x7a, 0x06, 0xc5, 0xfe, 0x60, 0xea, 0x54, 0x2a, 0x68, 0xaf, 0xaa, 0xd2, 0x64, 0x57, 0x92, 0x5b, 0x7b, - 0x15, 0x1d, 0xfd, 0x14, 0x44, 0x8e, 0x97, 0xa2, 0xc5, 0x17, 0x1e, 0x0b, 0xfb, 0x5d, 0xdc, 0x1c, 0xc7, 0x00, 0x3c, - 0x7f, 0xfa, 0xa9, 0x17, 0xb7, 0x22, 0x3b, 0xfd, 0x5b, 0xe2, 0xd2, 0x77, 0x8f, 0xa6, 0xf1, 0xff, 0x29, 0x64, 0x7f, - 0xe0, 0xb7, 0x08, 0xac, 0x3f, 0xed, 0x31, 0x38, 0xb8, 0x84, 0xeb, 0x2d, 0x62, 0xf3, 0x05, 0x2c, 0xcb, 0xdb, 0xad, - 0x79, 0x20, 0x24, 0xee, 0x0b, 0x63, 0x66, 0x4f, 0xca, 0x6a, 0x94, 0x08, 0xff, 0xba, 0x8f, 0x61, 0xff, 0x35, 0x71, - 0x09, 0xc2, 0x70, 0x6e, 0x5c, 0xe8, 0xef, 0xb4, 0xce, 0x9e, 0xe2, 0xfb, 0xa7, 0xfe, 0x66, 0xc9, 0xfb, 0x1f, 0xff, - 0x53, 0x9c, 0x79, 0x67, 0x5c, 0xa3, 0xb7, 0x4f, 0x6f, 0x6e, 0x22, 0x46, 0x4d, 0x5e, 0xcb, 0x0a, 0x67, 0x3f, 0x8b, - 0x9c, 0xcd, 0x84, 0x57, 0x27, 0x72, 0x81, 0x86, 0x91, 0x8f, 0x7b, 0x5e, 0xa2, 0x17, 0xec, 0xba, 0xa3, 0x58, 0x9a, - 0x68, 0xcb, 0x22, 0x54, 0xe8, 0xa7, 0x06, 0x49, 0x82, 0xf9, 0xfe, 0x27, 0x31, 0x3b, 0x6a, 0xab, 0x61, 0x66, 0x15, - 0x0f, 0xf1, 0x5d, 0x5a, 0x99, 0xa4, 0x9c, 0x57, 0xf5, 0x4e, 0x25, 0xca, 0xe6, 0x47, 0x64, 0x87, 0xc5, 0x60, 0xcc, - 0x4a, 0x08, 0xfb, 0x9d, 0x21, 0x32, 0x72, 0xd4, 0x97, 0x38, 0x49, 0xfc, 0x56, 0x47, 0x48, 0xbc, 0xb3, 0x34, 0x48, - 0x5f, 0x4b, 0x80, 0x7c, 0x2d, 0xbb, 0x3e, 0xf6, 0x62, 0x4a, 0x27, 0x1c, 0xee, 0x24, 0x7d, 0xeb, 0x3d, 0xf2, 0x8d, - 0x30, 0x6f, 0x95, 0xc6, 0x31, 0x20, 0xec, 0x5c, 0x03, 0x46, 0x46, 0xec, 0x40, 0x0e, 0x31, 0x17, 0x3b, 0x40, 0x30, - 0xeb, 0x6a, 0x9c, 0x03, 0xbf, 0xf7, 0x0e, 0xa5, 0xf4, 0x62, 0x2d, 0xb5, 0x4f, 0x72, 0x7e, 0x90, 0xc3, 0x31, 0x27, - 0x30, 0xde, 0x93, 0x39, 0x1d, 0x68, 0x1e, 0x93, 0x52, 0x2b, 0x91, 0x8a, 0x06, 0xe4, 0x57, 0xc9, 0xe0, 0x9e, 0xed, - 0xc9, 0x88, 0x93, 0x7f, 0xa1, 0x94, 0xfc, 0xe1, 0xc6, 0x3d, 0x9a, 0x09, 0xce, 0xcb, 0x03, 0x76, 0xb1, 0x59, 0x94, - 0x40, 0x3b, 0x53, 0xcd, 0x93, 0xb3, 0x05, 0x73, 0x69, 0x49, 0x49, 0xcb, 0xc2, 0x27, 0x64, 0x46, 0x6e, 0xfe, 0xc5, - 0xeb, 0x9b, 0xfe, 0x91, 0x61, 0x05, 0xc1, 0x5e, 0xeb, 0xaf, 0xf5, 0x7e, 0x4f, 0xa7, 0x83, 0x43, 0xd0, 0x9d, 0x03, - 0xb4, 0x4a, 0xe3, 0x61, 0x7f, 0xc6, 0x26, 0x80, 0x4c, 0x10, 0x3f, 0xdc, 0xb0, 0xee, 0xee, 0x07, 0x04, 0x66, 0x3f, - 0xf1, 0x8b, 0xe3, 0x94, 0x11, 0xf0, 0xad, 0xdd, 0xa2, 0x12, 0x22, 0x87, 0xff, 0xe7, 0xbe, 0x92, 0xc5, 0xea, 0x36, - 0x39, 0xd2, 0xec, 0xd7, 0xad, 0x33, 0xc0, 0x38, 0xfa, 0xe5, 0x3a, 0xa1, 0x12, 0x46, 0x66, 0x87, 0xa6, 0xd8, 0x15, - 0xce, 0x1e, 0xe1, 0x64, 0xc6, 0x7e, 0x0a, 0x8d, 0x48, 0xe3, 0x60, 0x25, 0x47, 0x5a, 0x80, 0x8b, 0xe5, 0x70, 0x68, - 0x98, 0x84, 0x0e, 0xb0, 0xc5, 0x45, 0x8e, 0xfb, 0xe1, 0xf9, 0x4c, 0xb2, 0xc3, 0x4b, 0x02, 0xe8, 0xc0, 0xb9, 0x88, - 0x89, 0x20, 0x07, 0x2d, 0x06, 0xa1, 0x1b, 0x72, 0xb0, 0x16, 0xaa, 0x61, 0x72, 0x04, 0xcf, 0xbe, 0xfe, 0x31, 0xfa, - 0x49, 0xc3, 0xe0, 0x25, 0x24, 0xc3, 0x28, 0x01, 0xe4, 0x98, 0xac, 0xf4, 0x1b, 0xf7, 0x76, 0x7b, 0xeb, 0xae, 0x0b, - 0x89, 0x3b, 0xfb, 0x69, 0xd7, 0x72, 0x31, 0x91, 0x7a, 0xf5, 0xd1, 0xc0, 0xb0, 0x73, 0xc0, 0x16, 0x78, 0x15, 0x44, - 0x67, 0xa2, 0xc7, 0x3d, 0xdc, 0x9f, 0x42, 0xaf, 0x30, 0x47, 0x60, 0x02, 0x7c, 0x63, 0xb2, 0x3b, 0x79, 0x84, 0xab, - 0xdb, 0x7d, 0xb4, 0xe7, 0xb1, 0x35, 0x8e, 0x0a, 0xa1, 0x34, 0xe2, 0x2d, 0xd3, 0x9d, 0x64, 0xc2, 0x3a, 0xac, 0xfe, - 0xa1, 0x29, 0xae, 0xd2, 0x77, 0xd2, 0x34, 0x82, 0x13, 0xb1, 0xfb, 0x36, 0xdc, 0x6a, 0xe0, 0x04, 0x47, 0x2e, 0x7a, - 0xf8, 0x8e, 0x08, 0x43, 0x0b, 0x7c, 0xc0, 0x49, 0xc5, 0x6c, 0x3c, 0x26, 0x06, 0x4e, 0xe3, 0x24, 0x57, 0x66, 0x39, - 0x37, 0x39, 0x24, 0xae, 0x58, 0xae, 0xb0, 0x9e, 0x5e, 0xb3, 0x6c, 0x93, 0x09, 0xf0, 0xde, 0x4f, 0xdd, 0x7b, 0x26, - 0xa4, 0x5c, 0x35, 0x6a, 0xcb, 0xdd, 0x59, 0xf1, 0x69, 0xb4, 0x92, 0xc9, 0xc9, 0x26, 0xfe, 0x30, 0xc0, 0x9d, 0xdd, - 0x12, 0xdd, 0xa9, 0xee, 0x2e, 0xb9, 0x0b, 0x8d, 0x27, 0xcc, 0x9c, 0xc2, 0x3e, 0x58, 0x4b, 0x75, 0x1e, 0x86, 0xd6, - 0xe3, 0xef, 0x9a, 0x99, 0x80, 0xc8, 0x4e, 0xa6, 0xb3, 0xf8, 0xa1, 0x1b, 0x90, 0xd2, 0x12, 0x47, 0x17, 0x25, 0xab, - 0x3f, 0xad, 0x7b, 0x93, 0x2a, 0xee, 0xd0, 0xf6, 0xf5, 0x8d, 0x1c, 0xef, 0x24, 0x2b, 0xb1, 0x04, 0xd5, 0x48, 0x7e, - 0x91, 0xa4, 0x81, 0x1d, 0x90, 0x0e, 0xb9, 0x46, 0xc3, 0x4c, 0x3d, 0x9b, 0x07, 0xaf, 0x23, 0xdd, 0x06, 0xab, 0x74, - 0x66, 0xf7, 0xf2, 0x03, 0x69, 0x85, 0xa6, 0x8c, 0x49, 0x31, 0xc9, 0xc7, 0x8b, 0x2e, 0x4e, 0x9c, 0xa2, 0x96, 0x7c, - 0x72, 0xe5, 0xa4, 0xe7, 0xb5, 0x3a, 0xe4, 0xea, 0x65, 0x0f, 0x31, 0x90, 0x24, 0xb3, 0x78, 0xa1, 0x7a, 0x72, 0x43, - 0xbc, 0x46, 0x03, 0x9c, 0xb6, 0xc7, 0xee, 0x2e, 0x1e, 0xe5, 0xad, 0x7f, 0xaa, 0xb7, 0x15, 0x5a, 0xfe, 0x94, 0x97, - 0xf7, 0x6a, 0xfd, 0x6d, 0x14, 0x21, 0xbf, 0x8b, 0x1f, 0x76, 0xeb, 0x9f, 0xb6, 0xab, 0x52, 0xa1, 0x53, 0xf9, 0x35, - 0x69, 0x8b, 0x05, 0xc0, 0x9f, 0xd7, 0xa6, 0x29, 0x24, 0x23, 0x8c, 0xa8, 0x4f, 0x10, 0x61, 0xaa, 0x13, 0xc6, 0xb7, - 0xa2, 0x86, 0xbc, 0x15, 0xad, 0x48, 0xaf, 0x19, 0x4d, 0xe3, 0xec, 0xe7, 0x8e, 0x11, 0x76, 0x32, 0x1c, 0xb1, 0x5b, - 0x92, 0x72, 0xfd, 0x14, 0xe9, 0x29, 0x24, 0x8e, 0x45, 0x70, 0x99, 0x50, 0x69, 0x29, 0xc7, 0x04, 0xd0, 0xad, 0xb6, - 0x86, 0x2c, 0x86, 0xd4, 0xa0, 0x8c, 0x59, 0xdd, 0x3c, 0x22, 0x70, 0xd4, 0xa0, 0x87, 0x8e, 0xa4, 0x70, 0x42, 0xb3, - 0x9d, 0x3e, 0x3e, 0x7f, 0xc6, 0xb4, 0x55, 0xdb, 0x20, 0x12, 0x03, 0xd0, 0xed, 0xee, 0x48, 0x0c, 0x41, 0xda, 0xdf, - 0x11, 0xd9, 0x5a, 0x2d, 0xca, 0xe8, 0xc8, 0x86, 0x6e, 0xa7, 0xc8, 0xfc, 0x5a, 0xcd, 0x15, 0xd9, 0xd4, 0xed, 0x06, - 0x65, 0x14, 0x19, 0xa4, 0xbc, 0xa3, 0xb4, 0xe5, 0x62, 0x19, 0x1d, 0xdd, 0xa2, 0x88, 0x50, 0x71, 0x1b, 0x14, 0x69, - 0xfa, 0x83, 0x14, 0x39, 0x0d, 0x11, 0xa7, 0x00, 0xef, 0x4e, 0x2d, 0x89, 0xda, 0x2d, 0x15, 0x0d, 0x9e, 0x42, 0x2f, - 0x83, 0x79, 0x77, 0xe1, 0x40, 0x42, 0x68, 0x73, 0x83, 0x53, 0x10, 0x6d, 0x41, 0xa7, 0x22, 0xbc, 0x15, 0xe9, 0x41, - 0x6a, 0x20, 0x00, 0xaf, 0xce, 0x7d, 0x1c, 0x1c, 0x00, 0xf4, 0xc9, 0x2a, 0xe8, 0x7c, 0x7f, 0xb4, 0xc8, 0x21, 0x96, - 0x66, 0x47, 0xea, 0x29, 0xe2, 0x52, 0x9a, 0x4f, 0xc4, 0xed, 0x82, 0x1c, 0x44, 0x9a, 0x56, 0xfc, 0x87, 0x5c, 0xd8, - 0xa4, 0x9d, 0x0f, 0x33, 0x04, 0x5f, 0x6a, 0xe2, 0x89, 0xd4, 0x7d, 0x8e, 0xc5, 0x94, 0x91, 0xc9, 0xd7, 0xba, 0x0b, - 0xab, 0x1d, 0xcc, 0x01, 0x31, 0x9e, 0x54, 0xf2, 0xd3, 0x29, 0xb2, 0xb3, 0xc9, 0x62, 0xa5, 0xa1, 0x02, 0x5a, 0x3a, - 0xa4, 0xcb, 0x65, 0xab, 0xc7, 0x01, 0x77, 0xfc, 0xa8, 0x09, 0x1f, 0x0d, 0x71, 0x5d, 0xfa, 0xf4, 0x2a, 0x48, 0x43, - 0xf8, 0x60, 0x29, 0xa4, 0x65, 0xd5, 0xb8, 0xf7, 0x66, 0x92, 0xda, 0xbf, 0xdb, 0x2c, 0xad, 0x69, 0xb0, 0xc3, 0xb6, - 0xe8, 0x19, 0x44, 0xe1, 0xeb, 0xaf, 0xa7, 0xd5, 0x47, 0xe7, 0x36, 0x2d, 0x88, 0xd0, 0x57, 0x05, 0x4e, 0x2c, 0xa7, - 0xbf, 0x2c, 0xe9, 0xe6, 0x96, 0xd0, 0x47, 0x2c, 0x7f, 0x94, 0x29, 0xc7, 0x67, 0x86, 0x17, 0x6b, 0xe8, 0x7e, 0x07, - 0x5a, 0x44, 0x8d, 0xb3, 0x59, 0x16, 0x8d, 0x6c, 0x09, 0xaf, 0xa9, 0x98, 0x98, 0xab, 0x1f, 0x0d, 0x19, 0x6b, 0x64, - 0x82, 0xc8, 0xa2, 0x1f, 0x3f, 0xea, 0xd2, 0x11, 0xe7, 0x61, 0x10, 0x27, 0x20, 0xcd, 0xbc, 0x64, 0xe4, 0x4d, 0x14, - 0xfc, 0xd6, 0x73, 0x60, 0x9b, 0xf7, 0x5b, 0xfb, 0xcc, 0x6e, 0xc4, 0x47, 0xfa, 0xda, 0xeb, 0x1d, 0x08, 0x25, 0x21, - 0x46, 0xe5, 0x9e, 0x8f, 0x8b, 0x25, 0x7b, 0x1a, 0x78, 0x53, 0x96, 0x2b, 0x06, 0xb7, 0xf8, 0x0d, 0xe8, 0x41, 0x0d, - 0xef, 0x20, 0xb4, 0x8f, 0x9c, 0x76, 0x84, 0x07, 0x68, 0x54, 0x0f, 0xd7, 0x72, 0x44, 0x17, 0x10, 0x64, 0x4e, 0xd0, - 0xa3, 0x81, 0x32, 0x50, 0xf0, 0x95, 0x64, 0xd0, 0x55, 0x66, 0xbb, 0xcc, 0xd6, 0xd0, 0x8c, 0x09, 0x10, 0xa9, 0xce, - 0x9f, 0x46, 0x70, 0x09, 0x5d, 0xc2, 0xa5, 0xa2, 0x0e, 0x64, 0xd4, 0xca, 0x70, 0x30, 0x0a, 0x68, 0xfa, 0x54, 0x1a, - 0xbf, 0x1a, 0x5d, 0x0a, 0xc0, 0xb1, 0xc6, 0xe7, 0x49, 0x06, 0x9f, 0x6d, 0x5c, 0xb1, 0xb8, 0x0c, 0x9a, 0x03, 0x83, - 0x6b, 0x5f, 0xdb, 0xab, 0xae, 0xc1, 0xce, 0xeb, 0xef, 0xa2, 0x33, 0x86, 0x3d, 0xa3, 0x10, 0x2b, 0x80, 0x0e, 0x90, - 0x28, 0xd7, 0xc0, 0xd9, 0x7b, 0xee, 0x7c, 0x6c, 0x23, 0x57, 0xd0, 0x85, 0x0e, 0x08, 0xae, 0x35, 0xb8, 0xdc, 0x3f, - 0x02, 0x5c, 0x68, 0x68, 0xe7, 0x59, 0x60, 0x45, 0x2e, 0x33, 0x50, 0x23, 0xfe, 0x4d, 0xee, 0x60, 0x59, 0x8d, 0x74, - 0x11, 0x8f, 0x15, 0xb5, 0xed, 0x64, 0x81, 0x4e, 0xb0, 0x4d, 0x0d, 0xb1, 0x03, 0x14, 0xbc, 0x50, 0x7e, 0xc2, 0xa9, - 0x47, 0x4b, 0x37, 0xa8, 0x2c, 0xf8, 0x1c, 0x98, 0xc5, 0xef, 0xa4, 0xde, 0xc2, 0xfd, 0x27, 0x47, 0x76, 0x10, 0x40, - 0xbc, 0x35, 0x2b, 0x84, 0x30, 0xf1, 0x72, 0x6c, 0x13, 0x76, 0x94, 0x81, 0x60, 0x37, 0x9a, 0x08, 0xd9, 0x08, 0x73, - 0x1b, 0xef, 0xa2, 0xf5, 0x7a, 0x1f, 0xbb, 0xbf, 0x18, 0x85, 0xc1, 0x76, 0x81, 0x61, 0xfc, 0x58, 0x8c, 0x22, 0xd4, - 0xf6, 0xf2, 0x5b, 0x91, 0x8c, 0xe4, 0x67, 0x15, 0xcc, 0x45, 0xdc, 0x0e, 0x6c, 0x5d, 0x99, 0x5a, 0x3f, 0x20, 0x2a, - 0xef, 0xf7, 0x92, 0x41, 0xbb, 0x85, 0x8f, 0x6f, 0x46, 0x76, 0xe2, 0x2b, 0xc7, 0xf5, 0xac, 0xfa, 0xfc, 0xfe, 0x39, - 0x22, 0x6b, 0x1e, 0x6f, 0xdd, 0x19, 0x8d, 0xce, 0x6a, 0x2d, 0x87, 0x8d, 0xda, 0xc0, 0x30, 0x21, 0xac, 0xf0, 0xfd, - 0xbc, 0x5c, 0xfb, 0x80, 0x30, 0xfc, 0xba, 0xe1, 0x37, 0x9e, 0x2d, 0xb0, 0x97, 0x1e, 0x1c, 0x2d, 0x6f, 0x5d, 0x57, - 0xd7, 0xd3, 0x4a, 0x34, 0x1e, 0x61, 0x12, 0xe2, 0x75, 0xde, 0x30, 0xa5, 0x03, 0x99, 0xe5, 0xf0, 0xa4, 0x7f, 0x70, - 0x4d, 0x67, 0x3e, 0xc4, 0x88, 0xf6, 0x17, 0x80, 0x7c, 0xd1, 0x94, 0x8f, 0x48, 0x9e, 0xd1, 0xe4, 0x06, 0x9b, 0x46, - 0xfa, 0x85, 0x33, 0xa5, 0x3a, 0x10, 0xdc, 0x77, 0x00, 0x00, 0x03, 0x75, 0x58, 0xf0, 0xfb, 0xd8, 0x56, 0xe2, 0xba, - 0x06, 0x63, 0x30, 0x30, 0xfd, 0x47, 0xbf, 0xa8, 0xf3, 0xa3, 0xcf, 0x50, 0x4d, 0xac, 0xf9, 0x52, 0x23, 0x32, 0xbb, - 0x92, 0x15, 0xd9, 0x4d, 0x90, 0x1f, 0xe7, 0xcb, 0x82, 0xdc, 0x84, 0xb8, 0x09, 0x41, 0xc5, 0x3d, 0xf1, 0xb5, 0xa8, - 0x02, 0x7d, 0x03, 0x94, 0x7f, 0x38, 0xeb, 0x40, 0xd0, 0x5f, 0x04, 0xc6, 0x9a, 0x1c, 0x84, 0xf3, 0xcf, 0x2d, 0x33, - 0x91, 0x3f, 0x8f, 0xc2, 0x65, 0xc9, 0x5f, 0xdd, 0xb2, 0x8d, 0xcc, 0xb8, 0xf1, 0x6d, 0x54, 0x99, 0x14, 0xf2, 0xba, - 0xf6, 0xac, 0x33, 0xbe, 0x90, 0x6a, 0x15, 0xc8, 0xd5, 0x45, 0xcc, 0x8c, 0x69, 0x0b, 0x39, 0xfd, 0x59, 0xfb, 0x5a, - 0xe5, 0x7f, 0xc6, 0x1d, 0x1c, 0xb3, 0xf0, 0xcf, 0xc7, 0x6d, 0x63, 0x0a, 0x88, 0xca, 0x1e, 0xf6, 0x45, 0xe5, 0x59, - 0xa7, 0xcb, 0x02, 0xd8, 0x26, 0x88, 0x2b, 0x19, 0xa1, 0xcc, 0x61, 0xa3, 0xf6, 0xfe, 0xbb, 0x7d, 0x1d, 0xcf, 0xac, - 0xb6, 0x1f, 0xd1, 0x4f, 0xfc, 0x11, 0xf3, 0x6f, 0x17, 0xf6, 0x65, 0x62, 0x9c, 0xbe, 0xce, 0x33, 0xd5, 0x9f, 0xba, - 0x49, 0x5d, 0xf0, 0xac, 0x4e, 0x40, 0x05, 0x09, 0xab, 0xe0, 0x67, 0xb0, 0x67, 0xff, 0xa3, 0xc2, 0xd5, 0x90, 0x4f, - 0xcb, 0x67, 0x67, 0xf6, 0x1a, 0xba, 0x56, 0x50, 0x75, 0xb8, 0x01, 0x22, 0x87, 0xc5, 0xad, 0xea, 0x62, 0xc7, 0x99, - 0xf9, 0x2f, 0x0b, 0xd8, 0xf8, 0x5a, 0x08, 0x4e, 0xd7, 0x1f, 0x5d, 0xbe, 0x44, 0xdb, 0x93, 0xb3, 0x89, 0x19, 0xc6, - 0x97, 0x34, 0xc4, 0x83, 0x7b, 0x4a, 0x87, 0x1f, 0x19, 0x93, 0x4f, 0xf1, 0xc7, 0xa7, 0xfd, 0x64, 0x2e, 0xf9, 0xf1, - 0xe3, 0x5f, 0xfa, 0xab, 0x7e, 0xcd, 0x33, 0xbf, 0x50, 0x67, 0xb2, 0xc3, 0x7b, 0x45, 0xd1, 0xf3, 0x8b, 0xb9, 0x18, - 0x11, 0x5b, 0x31, 0xfe, 0x30, 0x0b, 0x7d, 0xfa, 0xed, 0xed, 0xc3, 0x3d, 0x78, 0x33, 0x28, 0x69, 0xc6, 0x41, 0x9d, - 0x9b, 0xeb, 0x1c, 0x5b, 0x69, 0xca, 0x60, 0x12, 0xec, 0x0d, 0x2c, 0x91, 0x41, 0xda, 0x9d, 0x08, 0x11, 0xa8, 0x0c, - 0x4a, 0x05, 0x43, 0x69, 0x8e, 0xa3, 0xae, 0x83, 0x70, 0x20, 0x28, 0x97, 0x11, 0x5d, 0xd5, 0x2a, 0xce, 0x46, 0x07, - 0x0b, 0x01, 0x67, 0x10, 0x61, 0x08, 0xf0, 0xbd, 0x9a, 0x28, 0x81, 0x29, 0x24, 0x0d, 0x21, 0xfe, 0x54, 0x3a, 0x8e, - 0xa2, 0xb8, 0xae, 0xc2, 0xd7, 0xfb, 0x17, 0xd9, 0x38, 0xf9, 0x28, 0x81, 0xa2, 0xbc, 0x03, 0x81, 0x9a, 0x22, 0x05, - 0x9b, 0x8b, 0xcc, 0xe5, 0x88, 0x85, 0xf3, 0xa1, 0xa0, 0x17, 0x12, 0x56, 0x4b, 0x07, 0x3a, 0x1d, 0x7b, 0x38, 0x24, - 0xb4, 0x2a, 0xd8, 0x84, 0xa1, 0xc9, 0x6d, 0x7e, 0xad, 0x02, 0xca, 0xc9, 0x64, 0x17, 0xb7, 0xc0, 0x37, 0xbf, 0x3e, - 0x47, 0x77, 0x2d, 0x74, 0x9e, 0xf9, 0x9e, 0xf1, 0xf7, 0xef, 0x6f, 0x8e, 0xbf, 0xc2, 0xa3, 0x19, 0xab, 0x26, 0xac, - 0xff, 0xf5, 0x4d, 0x48, 0x08, 0xa5, 0x40, 0x15, 0x01, 0x42, 0xa9, 0xac, 0x81, 0x75, 0x1d, 0x32, 0x73, 0x68, 0xe8, - 0xfa, 0x47, 0x06, 0x39, 0x82, 0x1d, 0x36, 0xf6, 0x6d, 0x58, 0xf8, 0x5a, 0xa9, 0x83, 0xbd, 0x81, 0xa9, 0xb5, 0xb0, - 0x4f, 0x5b, 0xa0, 0xce, 0xe6, 0x9c, 0x39, 0x82, 0xa0, 0x5b, 0x66, 0x66, 0xaa, 0xd2, 0x59, 0x9e, 0x69, 0x7e, 0x46, - 0x7b, 0xc5, 0x7e, 0x5d, 0x02, 0x17, 0x64, 0xe9, 0x6c, 0x6e, 0x6d, 0x45, 0x81, 0xbb, 0x92, 0x2a, 0x9f, 0xb1, 0x75, - 0x3c, 0x04, 0xc2, 0xcf, 0x13, 0x63, 0xbb, 0xc6, 0xe7, 0xc1, 0xd6, 0x27, 0xf9, 0x80, 0x96, 0xae, 0x0f, 0x5d, 0x72, - 0xad, 0x8f, 0x11, 0xcc, 0x88, 0xa9, 0xfc, 0xf0, 0x86, 0xfa, 0x6e, 0x38, 0x70, 0x74, 0x9f, 0xe2, 0xa7, 0x4f, 0x3b, - 0xe9, 0x92, 0x4f, 0x3f, 0xfe, 0x4b, 0x5e, 0xd9, 0x75, 0x08, 0x55, 0x2e, 0x53, 0xf0, 0x63, 0x9f, 0xaf, 0xab, 0xc9, - 0xf6, 0xa6, 0xe2, 0x38, 0x10, 0x3f, 0xaa, 0x34, 0x99, 0xe8, 0x17, 0x77, 0x99, 0xc1, 0xf1, 0x3c, 0x44, 0x56, 0x7b, - 0xe2, 0x5c, 0xd7, 0x93, 0x39, 0x97, 0x6d, 0x70, 0xa1, 0x11, 0x32, 0x75, 0x79, 0xe6, 0x65, 0x9f, 0x13, 0x58, 0xd4, - 0x4c, 0xca, 0xee, 0x6b, 0x8c, 0xc7, 0xd7, 0x96, 0xd3, 0xf4, 0x2c, 0xa4, 0x50, 0x37, 0x1d, 0x2e, 0x68, 0x08, 0x15, - 0xd0, 0xe0, 0xe7, 0x6f, 0x4a, 0xd9, 0x98, 0xb8, 0x19, 0xc9, 0x7f, 0xf0, 0xc8, 0xa4, 0x99, 0x32, 0x1e, 0xe9, 0xb3, - 0x5a, 0xb3, 0x3c, 0xe8, 0x88, 0x2d, 0x65, 0xd9, 0xc7, 0xf8, 0x3a, 0xb5, 0x90, 0xfd, 0x35, 0xfd, 0x3e, 0xdd, 0x62, - 0x94, 0x5a, 0xca, 0x93, 0x8e, 0x84, 0xda, 0xfa, 0xb2, 0x1f, 0x44, 0xa4, 0x2e, 0xf0, 0x50, 0x13, 0xb1, 0x5e, 0xc6, - 0x74, 0x30, 0x98, 0x2a, 0xda, 0x6f, 0x4f, 0x77, 0xab, 0xd3, 0x37, 0x9b, 0x6a, 0x11, 0xe2, 0xfa, 0x40, 0xea, 0x63, - 0x58, 0x4d, 0x94, 0x9d, 0x1d, 0x7a, 0x09, 0x07, 0xc1, 0x03, 0xa3, 0x73, 0x05, 0x37, 0x19, 0x2e, 0x62, 0xd6, 0x99, - 0x07, 0xdc, 0x25, 0xe5, 0x70, 0x82, 0x38, 0xaf, 0xd0, 0xd5, 0xba, 0x0b, 0xe3, 0x5a, 0xbe, 0xc9, 0xbb, 0xd3, 0xa9, - 0xa4, 0x4e, 0x79, 0xb8, 0x01, 0x6d, 0xa4, 0x36, 0xbd, 0x53, 0x6c, 0x1f, 0xb8, 0x55, 0xfb, 0xef, 0x37, 0x20, 0x93, - 0xbd, 0xcf, 0x1f, 0x38, 0xa0, 0x21, 0x08, 0xd9, 0xe3, 0xe5, 0xf8, 0x02, 0x9d, 0x45, 0xdd, 0x5a, 0x77, 0x75, 0xda, - 0x5d, 0x6f, 0xa1, 0x2a, 0xeb, 0x23, 0x2e, 0x98, 0x9c, 0xa1, 0xc3, 0xb6, 0x95, 0x42, 0x3f, 0x86, 0x9e, 0xc4, 0xbc, - 0xbc, 0xb2, 0x36, 0xac, 0x93, 0x13, 0x7b, 0xc1, 0xd5, 0xbe, 0xf9, 0x83, 0xf8, 0x0c, 0x30, 0x8b, 0xb9, 0xe9, 0xcd, - 0xb3, 0xea, 0x0b, 0x31, 0x44, 0xc6, 0x35, 0x1c, 0x61, 0x02, 0x3e, 0xa0, 0xfa, 0x0f, 0x0e, 0x2d, 0x86, 0xab, 0xe3, - 0x52, 0x83, 0xe9, 0xf8, 0xc1, 0x17, 0xd5, 0x11, 0x12, 0xd3, 0x8e, 0xc7, 0x06, 0xac, 0x31, 0xd4, 0xa0, 0x83, 0x5b, - 0xd3, 0x28, 0x40, 0x10, 0xdb, 0xd7, 0xcf, 0x0d, 0x6e, 0xbf, 0x7b, 0xd7, 0xbb, 0x22, 0xe1, 0xdc, 0xbe, 0x6c, 0x80, - 0x39, 0x61, 0x30, 0x3a, 0x9d, 0xad, 0x6b, 0xa2, 0x2f, 0xea, 0xf7, 0x85, 0x2d, 0xf4, 0x40, 0x6e, 0x4c, 0x78, 0x04, - 0x0b, 0x15, 0x77, 0x90, 0x33, 0xa8, 0x80, 0xfb, 0x0b, 0x7a, 0xc0, 0x82, 0x94, 0xf1, 0x89, 0x78, 0x87, 0xd6, 0x31, - 0x42, 0x0d, 0x2c, 0x38, 0x56, 0x1a, 0x86, 0x03, 0x06, 0xc1, 0xf1, 0x59, 0xd6, 0x88, 0xbc, 0x53, 0x23, 0xf8, 0x2b, - 0x1a, 0x45, 0xeb, 0x58, 0x4a, 0x0a, 0x15, 0xac, 0xe9, 0xec, 0x6b, 0x45, 0xc4, 0xab, 0x29, 0xe8, 0x04, 0x18, 0xd2, - 0x9e, 0x38, 0xfb, 0x74, 0x17, 0xc9, 0xa2, 0x7a, 0xcf, 0x2e, 0x12, 0xe1, 0x2e, 0x03, 0x52, 0xc4, 0x81, 0x4f, 0x87, - 0xd5, 0x74, 0x55, 0x6e, 0xee, 0xa1, 0xad, 0xbd, 0x8b, 0x1d, 0x9d, 0x06, 0xc1, 0xe4, 0xd8, 0xb3, 0xe1, 0x46, 0x2f, - 0x0a, 0x0e, 0x5b, 0x49, 0xd9, 0xaf, 0x22, 0x9c, 0x70, 0xeb, 0xb9, 0x16, 0x2a, 0x1d, 0x34, 0x17, 0x7f, 0xba, 0x42, - 0x2f, 0x21, 0xd4, 0xf6, 0x4c, 0x23, 0x4e, 0x2f, 0xc1, 0xd8, 0x6e, 0xfe, 0x53, 0xb7, 0x0c, 0xda, 0xdc, 0xda, 0xbb, - 0xf4, 0xd6, 0x86, 0xb3, 0x49, 0x65, 0x56, 0x0e, 0xba, 0x17, 0xa5, 0xbb, 0x1c, 0xe3, 0x0c, 0x46, 0xf1, 0x49, 0x3e, - 0xd3, 0xaa, 0xf4, 0xd8, 0xef, 0x36, 0x78, 0xc4, 0x3e, 0xda, 0xc6, 0xd8, 0x21, 0x16, 0x58, 0xe4, 0x78, 0x76, 0x02, - 0x35, 0x0e, 0x8d, 0x78, 0x4d, 0x11, 0x5a, 0x52, 0x7b, 0x87, 0x8f, 0x3e, 0xf6, 0xd6, 0xca, 0x77, 0xe4, 0xc5, 0x5a, - 0x04, 0x50, 0x83, 0x9a, 0x56, 0x09, 0xdd, 0xa5, 0x9b, 0x67, 0xbc, 0x06, 0x2c, 0x3a, 0x0a, 0x87, 0x28, 0xdf, 0x39, - 0x57, 0xd0, 0x8e, 0xb6, 0x48, 0x64, 0x1d, 0xa3, 0xa9, 0x14, 0xb9, 0xfe, 0xc3, 0x32, 0x0d, 0x9a, 0x1f, 0xdb, 0x57, - 0x90, 0xbd, 0x39, 0x1f, 0xf3, 0x3f, 0x9e, 0xb3, 0x2f, 0xd9, 0x5e, 0x17, 0x00, 0xae, 0x9f, 0xfd, 0x63, 0x62, 0xf2, - 0x67, 0x16, 0x86, 0xf9, 0x0f, 0xf5, 0x09, 0x6f, 0x02, 0xff, 0x04, 0xcf, 0x59, 0x62, 0xbc, 0x97, 0xe2, 0x3c, 0xc5, - 0x33, 0x97, 0x40, 0x6f, 0x4b, 0xbe, 0x6c, 0x01, 0xbc, 0xb8, 0xd4, 0xbc, 0x5d, 0x70, 0x36, 0x46, 0x14, 0xa8, 0xbe, - 0xd5, 0x93, 0x5c, 0x0e, 0xba, 0x51, 0x8a, 0xb8, 0xe9, 0xb7, 0x0a, 0x34, 0xa3, 0x55, 0x62, 0x76, 0x19, 0x7a, 0xb1, - 0x74, 0x9c, 0xab, 0xf0, 0x33, 0x19, 0x6c, 0x83, 0x7d, 0x22, 0xc2, 0x65, 0xd2, 0x63, 0x84, 0xbf, 0x4d, 0x91, 0x7c, - 0xab, 0xc3, 0xf5, 0x83, 0xc6, 0xbf, 0xee, 0xfd, 0xfa, 0xd5, 0xe3, 0x8b, 0x9b, 0x86, 0xb0, 0x7a, 0xa0, 0x7c, 0x72, - 0xb6, 0xde, 0xed, 0x4c, 0x0f, 0x03, 0xc5, 0x43, 0x61, 0x34, 0x3a, 0xc6, 0x49, 0x61, 0x36, 0x9b, 0x75, 0xfd, 0xd0, - 0xf5, 0x1f, 0x39, 0x1d, 0x48, 0xb0, 0x0c, 0xe5, 0xde, 0x9d, 0x81, 0x79, 0xbd, 0x35, 0x90, 0xb5, 0x5c, 0xe5, 0xc0, - 0x9d, 0x9e, 0xa9, 0xde, 0x8e, 0x14, 0x8e, 0x78, 0xa4, 0x15, 0xee, 0xcc, 0x5e, 0x66, 0x03, 0xba, 0x8b, 0x73, 0x45, - 0x77, 0xce, 0x29, 0x59, 0x44, 0x96, 0x9f, 0xf4, 0x8e, 0xde, 0xec, 0xf8, 0xd8, 0xbd, 0x2b, 0x09, 0x2c, 0xff, 0x6f, - 0xd4, 0xa1, 0x7a, 0x48, 0x8c, 0x14, 0x9e, 0x45, 0xb1, 0xb1, 0x2a, 0x86, 0xef, 0xf0, 0x5b, 0xc9, 0x53, 0xed, 0x15, - 0xc3, 0x02, 0xdf, 0x35, 0xcc, 0xdd, 0x3a, 0x12, 0xbc, 0x4c, 0xc7, 0x80, 0x47, 0x62, 0xc0, 0x6f, 0x36, 0x8f, 0x08, - 0x5d, 0x27, 0x7b, 0x1c, 0x3f, 0x05, 0xe1, 0xc6, 0x15, 0x94, 0x33, 0x23, 0x7c, 0x83, 0x91, 0x83, 0xa7, 0x98, 0x3f, - 0xde, 0xdc, 0x41, 0xf5, 0xf1, 0xc3, 0xbe, 0x58, 0x7b, 0xf0, 0xd7, 0x02, 0xac, 0x81, 0x3c, 0xda, 0x50, 0x3d, 0x4b, - 0xf5, 0xce, 0xfd, 0x35, 0x4f, 0x0b, 0x7e, 0x46, 0x6e, 0x74, 0x5b, 0x9c, 0x23, 0x5f, 0xe2, 0xed, 0xb6, 0x13, 0x6f, - 0x77, 0x7d, 0x6b, 0x7e, 0xd4, 0x08, 0x10, 0x36, 0xbf, 0x2d, 0xdb, 0xfa, 0xc3, 0xc5, 0xed, 0x97, 0xf6, 0xce, 0x60, - 0x07, 0xb8, 0xc4, 0x80, 0x8d, 0xae, 0x8b, 0xd8, 0xe6, 0x8c, 0x1b, 0x63, 0x17, 0x71, 0xd8, 0x00, 0xa4, 0x8a, 0x98, - 0x08, 0x4d, 0xe5, 0x28, 0x04, 0x83, 0xa1, 0x37, 0x7d, 0x1f, 0xef, 0x33, 0x0f, 0xb0, 0x01, 0x9b, 0x4c, 0x6d, 0x42, - 0xd8, 0x98, 0x54, 0xb7, 0x7e, 0x1d, 0xa1, 0x2c, 0xc6, 0xc6, 0xd2, 0x9a, 0x2b, 0x0b, 0x42, 0x9f, 0xb7, 0xfe, 0x56, - 0xc3, 0x36, 0xd7, 0xf8, 0xb7, 0x58, 0x44, 0xfc, 0x98, 0x72, 0xd8, 0x5f, 0xc2, 0xa7, 0x0b, 0xc7, 0xe8, 0xe8, 0x93, - 0xc6, 0x99, 0x71, 0xaa, 0xae, 0x95, 0xfe, 0x56, 0xc6, 0x43, 0x1f, 0xdf, 0xdd, 0x98, 0x2a, 0x3b, 0xf4, 0x12, 0x2c, - 0x3a, 0x0a, 0xe3, 0x21, 0x9e, 0x06, 0x75, 0x1d, 0x47, 0x32, 0x98, 0xba, 0xc7, 0x99, 0xbe, 0xda, 0xce, 0xa2, 0xb8, - 0x8c, 0xd8, 0x79, 0x5f, 0x5a, 0x2d, 0xe3, 0xa0, 0x5a, 0xb8, 0x88, 0x8e, 0x19, 0xd4, 0x22, 0xe2, 0x9d, 0x7a, 0xf1, - 0x24, 0xf9, 0x98, 0xd3, 0x71, 0xa0, 0x74, 0x2d, 0x69, 0x8f, 0x05, 0x34, 0x44, 0x66, 0x14, 0x5e, 0xfa, 0xa9, 0x9b, - 0xfd, 0xd3, 0xf8, 0x7f, 0x5d, 0x6e, 0xb6, 0xdb, 0x63, 0xbb, 0x12, 0x85, 0x39, 0x4d, 0x0e, 0x81, 0xb6, 0xe0, 0x3b, - 0x6e, 0xf5, 0x31, 0x47, 0xc6, 0x78, 0xad, 0x4b, 0xfa, 0xa5, 0xad, 0x3a, 0x8f, 0xda, 0x35, 0x5a, 0xbf, 0xc0, 0x51, - 0x21, 0xb4, 0xd3, 0x6c, 0xb4, 0x8b, 0x0f, 0x7c, 0xde, 0x3c, 0x98, 0x86, 0x26, 0x14, 0x53, 0x4b, 0xf5, 0x90, 0x39, - 0x2a, 0x9f, 0xe3, 0xf4, 0x1e, 0x80, 0x8a, 0x48, 0x7b, 0xf7, 0x7e, 0xa6, 0xde, 0x5f, 0x6b, 0x86, 0xee, 0xa3, 0x56, - 0xca, 0x48, 0xf8, 0x6d, 0x87, 0x90, 0xb0, 0x0a, 0x49, 0x18, 0x3b, 0x27, 0xca, 0x59, 0xd6, 0x36, 0x86, 0x96, 0xf7, - 0x87, 0x83, 0xe7, 0x89, 0x56, 0xcb, 0xb8, 0xc5, 0x23, 0x72, 0xbb, 0xf7, 0x99, 0x48, 0xf5, 0xa2, 0xea, 0xf2, 0x08, - 0x82, 0x45, 0x27, 0x32, 0xd2, 0x5f, 0x8c, 0xda, 0x71, 0x02, 0xfd, 0x7b, 0xf9, 0x53, 0x50, 0x52, 0xd4, 0x0a, 0xa7, - 0x8c, 0x75, 0x13, 0x9d, 0x68, 0x29, 0xc2, 0xc8, 0xa6, 0xaf, 0x82, 0xff, 0x04, 0x37, 0x58, 0x79, 0x77, 0xcf, 0x33, - 0xa2, 0x6a, 0xe1, 0x11, 0x45, 0x32, 0x26, 0xee, 0x7e, 0x0e, 0xb3, 0x84, 0x5e, 0x7a, 0x77, 0xad, 0x75, 0xea, 0x9c, - 0x2e, 0xde, 0x04, 0x51, 0x0a, 0xa2, 0xbb, 0xcf, 0xf1, 0x13, 0xe3, 0x00, 0xe9, 0x06, 0xf8, 0xe7, 0x04, 0xc9, 0x29, - 0x4f, 0x54, 0x5e, 0x06, 0xd3, 0x36, 0xa4, 0x60, 0xf8, 0x58, 0xef, 0xc1, 0x8d, 0x37, 0x7c, 0xb9, 0x9c, 0xfa, 0xe6, - 0xcd, 0x23, 0x57, 0x3d, 0xc4, 0xd3, 0x38, 0xef, 0x6c, 0x5a, 0x26, 0xf8, 0x48, 0x12, 0xff, 0xac, 0x4d, 0xec, 0xb6, - 0x6c, 0xd2, 0xf3, 0xa6, 0xdb, 0xc2, 0xd9, 0xbd, 0x65, 0x0e, 0xb2, 0xd8, 0xf4, 0x05, 0x20, 0xe5, 0x80, 0xd6, 0xc5, - 0x2e, 0x0a, 0x05, 0x71, 0x1a, 0xe0, 0x02, 0x30, 0x42, 0x4b, 0x2c, 0x56, 0xe0, 0x89, 0xc6, 0xd3, 0x2c, 0xa7, 0xc5, - 0x36, 0x78, 0x37, 0x82, 0x67, 0x89, 0x5c, 0x4a, 0xd3, 0x90, 0x36, 0xb5, 0x94, 0xf0, 0xcc, 0xa9, 0xf5, 0x6d, 0x9a, - 0x6e, 0x6a, 0x93, 0xd9, 0x7c, 0xec, 0x8a, 0x15, 0x6d, 0xe8, 0xe0, 0x0e, 0x26, 0xd1, 0x16, 0x42, 0x36, 0x6a, 0x20, - 0xdb, 0xec, 0x4f, 0x59, 0xb2, 0xd3, 0x54, 0xa1, 0x27, 0xb5, 0x6e, 0x89, 0x16, 0x47, 0xa6, 0xde, 0xcd, 0x02, 0x49, - 0xb0, 0x85, 0x86, 0x63, 0x61, 0x45, 0xd3, 0xe3, 0x7b, 0xee, 0xa3, 0x63, 0x60, 0xa1, 0x96, 0x9e, 0xc6, 0x1c, 0xbd, - 0x33, 0x88, 0x69, 0xd6, 0x32, 0xb2, 0x65, 0xe3, 0xf3, 0x1e}; +const uint8_t INDEX_BR[] PROGMEM = { + 0x5b, 0x05, 0x7b, 0x53, 0xc1, 0xb6, 0x69, 0x3d, 0x41, 0xeb, 0x04, 0x30, 0xf6, 0xd6, 0x77, 0x35, 0xdb, 0xa3, 0x08, + 0x36, 0x0e, 0x04, 0x80, 0x90, 0x4f, 0xf1, 0xb2, 0x21, 0xa4, 0x82, 0xee, 0x00, 0xaa, 0x20, 0x7f, 0x3b, 0xff, 0x00, + 0xaa, 0x9a, 0x73, 0x74, 0x8c, 0xe1, 0xa6, 0x1f, 0xa0, 0xa2, 0x59, 0xf5, 0xaa, 0x92, 0x79, 0x50, 0x43, 0x1f, 0xe8, + 0x3c, 0x52, 0x68, 0x2c, 0xf6, 0x36, 0x31, 0x90, 0x4e, 0x2b, 0x91, 0x69, 0x38, 0xb4, 0x61, 0xa7, 0xbb, 0x57, 0x79, + 0x3b, 0x6d, 0x62, 0x85, 0x9f, 0x24, 0x24, 0xda, 0x45, 0xc1, 0xe2, 0x85, 0x44, 0x50, 0x6c, 0x8c, 0x1e, 0xab, 0xbb, + 0x7b, 0x1e, 0x30, 0x98, 0x59, 0xe5, 0xb9, 0xd1, 0x34, 0x03, 0x0b, 0x79, 0x37, 0x8c, 0x4b, 0x68, 0x2c, 0xbe, 0x21, + 0xcc, 0x30, 0xc4, 0x9c, 0x4d, 0x34, 0xd6, 0x01, 0xc1, 0xe1, 0x66, 0x48, 0x3c, 0x94, 0xf4, 0x3c, 0x5b, 0x12, 0xfd, + 0x15, 0xb4, 0x05, 0xdb, 0xaf, 0xc1, 0x59, 0x5d, 0x9f, 0xc5, 0x8d, 0xaf, 0xf7, 0xc6, 0x5f, 0x58, 0xfb, 0xc3, 0x74, + 0x45, 0x97, 0x23, 0xac, 0x2e, 0x4a, 0xb9, 0xab, 0xd7, 0x5b, 0xe5, 0x85, 0x6f, 0x21, 0xba, 0x7e, 0xa3, 0x57, 0xa5, + 0xb3, 0x24, 0x7e, 0x60, 0x30, 0x0e, 0x15, 0x1f, 0x04, 0x5e, 0xba, 0x06, 0x04, 0xff, 0x02, 0x26, 0x2d, 0x03, 0x6c, + 0x97, 0x1b, 0x23, 0x84, 0x28, 0x25, 0xb4, 0xe2, 0xca, 0xbd, 0xc8, 0xc3, 0x96, 0x4a, 0xef, 0xed, 0xe7, 0x65, 0x4f, + 0xb2, 0x2d, 0x6c, 0x02, 0x91, 0x04, 0x76, 0xae, 0xba, 0x67, 0x9c, 0xe3, 0x38, 0xd6, 0x96, 0x61, 0x0c, 0xd3, 0x80, + 0xe4, 0x4a, 0x43, 0x2e, 0x92, 0xff, 0xa7, 0xdb, 0xd2, 0xec, 0xf5, 0xf5, 0x90, 0x4a, 0x22, 0x74, 0x92, 0x40, 0x80, + 0xed, 0x2b, 0xb5, 0xbc, 0xb6, 0xe0, 0x71, 0xda, 0x35, 0x3b, 0xe9, 0xec, 0xeb, 0xac, 0xbe, 0x6a, 0x2f, 0xf0, 0xde, + 0x96, 0xf7, 0x43, 0x51, 0x4d, 0xce, 0xbb, 0xd3, 0x70, 0xc2, 0x08, 0x2c, 0xf0, 0xc8, 0xac, 0x25, 0x82, 0x67, 0xeb, + 0xcd, 0xf5, 0x7d, 0x7d, 0xb7, 0x8b, 0xca, 0x2a, 0x15, 0x66, 0x68, 0xf3, 0x6e, 0xb6, 0xda, 0x5b, 0x81, 0x7b, 0x2e, + 0xe6, 0xc1, 0xdc, 0x5e, 0x0a, 0x7a, 0xda, 0x4a, 0x2c, 0x68, 0xa4, 0xd0, 0x92, 0xe7, 0xb2, 0xb3, 0xef, 0xab, 0xda, + 0xd7, 0xef, 0x89, 0xe7, 0x22, 0xd0, 0x93, 0xe5, 0x08, 0xcc, 0xea, 0x82, 0xdb, 0xde, 0x1a, 0xdd, 0x49, 0x47, 0x26, + 0x23, 0xc1, 0x16, 0x7b, 0x2a, 0x99, 0x23, 0xe9, 0x4c, 0xf8, 0x65, 0xaa, 0xfe, 0xe9, 0x6a, 0x41, 0x0d, 0x8f, 0xfb, + 0x48, 0x9a, 0x49, 0x4e, 0x0b, 0x2e, 0x91, 0xfc, 0x76, 0x6e, 0x55, 0xee, 0xb4, 0xbb, 0x3c, 0x63, 0xc1, 0x95, 0x5a, + 0xf8, 0x37, 0x35, 0xb1, 0xaa, 0xcd, 0xa9, 0x99, 0x2f, 0x3d, 0x52, 0xd0, 0x01, 0xd9, 0x06, 0x27, 0x41, 0x92, 0xdd, + 0x6d, 0x4a, 0xee, 0xad, 0xa6, 0x33, 0xe1, 0xff, 0xeb, 0x6b, 0x5a, 0xff, 0xfd, 0xf3, 0x05, 0x0a, 0xbb, 0xc4, 0x55, + 0x1d, 0x28, 0x69, 0x66, 0x7f, 0x4f, 0x49, 0xce, 0xb2, 0xec, 0x8a, 0x0a, 0x15, 0x2d, 0x63, 0x1b, 0x6f, 0x28, 0x00, + 0xf5, 0x44, 0x47, 0xd6, 0xf5, 0xb5, 0xd7, 0x6f, 0xff, 0xf5, 0x0b, 0x3d, 0xd9, 0x1d, 0x42, 0xe9, 0xb3, 0x32, 0xa5, + 0xf6, 0xa3, 0x1b, 0xc3, 0x58, 0x8a, 0x7c, 0x24, 0xc7, 0x03, 0xbc, 0x92, 0xd5, 0x4f, 0xbf, 0xfc, 0xfa, 0x3d, 0x3b, + 0x6d, 0x8c, 0xc5, 0xdb, 0x9d, 0x77, 0x97, 0xd2, 0x5e, 0x82, 0x85, 0x53, 0x9a, 0xaf, 0xb6, 0x09, 0x45, 0x51, 0x25, + 0x90, 0x44, 0x85, 0xa4, 0xc6, 0x23, 0x18, 0xfb, 0xbb, 0x56, 0xef, 0xe9, 0x3c, 0x13, 0x62, 0xf0, 0xaf, 0x6b, 0xe9, + 0xa2, 0xa7, 0x26, 0x32, 0xa1, 0x8d, 0x5d, 0x56, 0x22, 0xa0, 0xe8, 0xb8, 0x06, 0xc1, 0x07, 0xb4, 0x7e, 0xf5, 0xbe, + 0xae, 0xff, 0xfa, 0x95, 0xa7, 0xb8, 0xe2, 0x34, 0x6a, 0xc9, 0x3c, 0xee, 0xb3, 0x45, 0x67, 0xae, 0x93, 0x6c, 0x20, + 0xbc, 0x42, 0xc5, 0xe1, 0x91, 0x52, 0xb9, 0x8c, 0x62, 0x0d, 0x46, 0xbb, 0x46, 0x72, 0x69, 0x26, 0xe0, 0xac, 0x67, + 0xec, 0xb5, 0x51, 0x5f, 0x9d, 0xae, 0x5d, 0x25, 0x15, 0x72, 0xf0, 0xc2, 0x2f, 0x67, 0xe6, 0x68, 0x08, 0xac, 0xdd, + 0xcb, 0xd5, 0xe3, 0x03, 0x9d, 0x49, 0x4d, 0xa1, 0xcd, 0x81, 0xbf, 0x09, 0xd9, 0xdd, 0x2d, 0xe1, 0x7b, 0x7f, 0x9a, + 0x7d, 0xfd, 0x92, 0xd9, 0x26, 0x19, 0x8d, 0x9d, 0x2b, 0x6d, 0x38, 0x99, 0x2b, 0x2d, 0xb5, 0xfa, 0xed, 0xe3, 0xb0, + 0x11, 0x2c, 0x17, 0x79, 0xe0, 0x24, 0xb1, 0x86, 0x68, 0x15, 0xb3, 0x7f, 0x4b, 0xf3, 0xeb, 0xd7, 0xc3, 0xdd, 0x24, + 0x64, 0x69, 0x0f, 0x4e, 0xae, 0xdb, 0xc7, 0x71, 0x4e, 0xaa, 0x64, 0x18, 0xec, 0xd1, 0x7b, 0x59, 0xa8, 0x31, 0x05, + 0x80, 0x2b, 0xcb, 0x0c, 0x91, 0x02, 0x85, 0x0d, 0x16, 0x1d, 0x1b, 0xa6, 0x6e, 0x48, 0x13, 0x04, 0xa1, 0xc5, 0xff, + 0x33, 0xa7, 0xdf, 0xb4, 0x67, 0x98, 0xb0, 0x60, 0xdb, 0x52, 0xfa, 0xaf, 0x26, 0xbf, 0x98, 0xed, 0xc1, 0x7b, 0x18, + 0x2e, 0x02, 0x9e, 0x60, 0x3c, 0xef, 0xff, 0xef, 0xad, 0xb4, 0xdc, 0xfe, 0x88, 0x74, 0x45, 0x88, 0xec, 0x01, 0xc8, + 0x71, 0x86, 0x23, 0xeb, 0xf7, 0x9d, 0x99, 0x55, 0xe0, 0x34, 0x40, 0xb2, 0xc7, 0x99, 0x95, 0xb4, 0xd6, 0x62, 0x53, + 0x71, 0xef, 0x7d, 0xef, 0x32, 0xbf, 0x8b, 0xce, 0xf8, 0x61, 0x58, 0x61, 0x32, 0x1b, 0x69, 0x87, 0x65, 0xbb, 0xb2, + 0x9c, 0x06, 0x00, 0xc1, 0xfb, 0xde, 0xfb, 0x51, 0xf8, 0xff, 0x47, 0x16, 0xe7, 0x47, 0x64, 0x81, 0x8a, 0xcc, 0x2a, + 0xce, 0xc9, 0x2c, 0x60, 0x46, 0x55, 0x00, 0x67, 0x54, 0x00, 0xfb, 0xe8, 0x80, 0x1c, 0x0b, 0x82, 0x46, 0xd3, 0x64, + 0xb3, 0x8f, 0x86, 0x6c, 0x79, 0xbf, 0xd2, 0x62, 0x05, 0x51, 0xae, 0x67, 0x64, 0x5b, 0xf2, 0xbb, 0x1d, 0x28, 0x6b, + 0x96, 0xd2, 0x4a, 0x47, 0xff, 0xeb, 0x96, 0xeb, 0x89, 0x6e, 0x15, 0x9f, 0x68, 0xa7, 0xdc, 0x30, 0x8c, 0xfc, 0x9f, + 0xc0, 0x23, 0xe1, 0x0c, 0x4e, 0xc3, 0x69, 0xa8, 0xc2, 0xd5, 0xa0, 0xa6, 0x5b, 0xc7, 0x8e, 0xb3, 0xe9, 0x34, 0x54, + 0xfd, 0x31, 0xfc, 0x1e, 0x4a, 0x0b, 0x83, 0xa9, 0x33, 0x4d, 0xd3, 0x7f, 0x77, 0x8d, 0x72, 0x55, 0x71, 0x4d, 0x74, + 0xe3, 0xaa, 0x55, 0x19, 0xf8, 0x9b, 0xa6, 0x69, 0xf8, 0x87, 0xe4, 0x6e, 0x5f, 0xac, 0xf9, 0x3d, 0xda, 0x61, 0xa0, + 0x50, 0xca, 0x2e, 0x93, 0x38, 0x3e, 0xe4, 0x5b, 0x96, 0x25, 0xd9, 0xf0, 0x75, 0x2c, 0xad, 0x37, 0x37, 0x2a, 0x15, + 0x48, 0xe8, 0xbd, 0xf6, 0x19, 0xb5, 0x55, 0xf0, 0x10, 0x5d, 0x14, 0x49, 0xa4, 0xa7, 0xff, 0xa7, 0xaa, 0x7a, 0xbc, + 0x43, 0xa6, 0x66, 0xdd, 0xd8, 0xc4, 0x05, 0xf2, 0xe9, 0x1b, 0x34, 0x4f, 0x12, 0x1a, 0x1b, 0xac, 0xf3, 0x32, 0x32, + 0xad, 0x2b, 0xeb, 0xd8, 0x29, 0x4e, 0xfe, 0x6f, 0x80, 0xa1, 0x0d, 0xad, 0x4a, 0xc2, 0xb6, 0x83, 0xa0, 0xff, 0x50, + 0x68, 0x62, 0xad, 0x71, 0x00, 0x77, 0x5a, 0x66, 0xb4, 0x05, 0x9d, 0x01, 0x51, 0x9c, 0xbb, 0xf8, 0xd3, 0x64, 0x82, + 0x69, 0xb6, 0x87, 0x82, 0xef, 0x73, 0x14, 0x62, 0x0c, 0x22, 0xcb, 0x73, 0xdb, 0xb3, 0x0f, 0x4c, 0xfe, 0x77, 0x60, + 0x45, 0xff, 0x14, 0xea, 0x9f, 0xb0, 0x02, 0xa0, 0x6e, 0xbd, 0xe4, 0xd7, 0x0a, 0xbc, 0xe7, 0xf7, 0x00, 0x44, 0x26, + 0xc2, 0x96, 0xe5, 0x37, 0xda, 0x32, 0xca, 0xef, 0x42, 0xb4, 0xdd, 0xe2, 0x70, 0xf0, 0xe0, 0xc1, 0x93, 0xd4, 0xed, + 0x18, 0xbf, 0x54, 0xdd, 0xb0, 0x5b, 0x86, 0x3e, 0x46, 0x7f, 0xbe, 0x1b, 0x61, 0x83, 0x52, 0xe1, 0x6a, 0x62, 0x7a, + 0xa6, 0x7e, 0x6f, 0xc4, 0x5b, 0x63, 0x55, 0x1a, 0xb8, 0xa5, 0x87, 0xd9, 0x84, 0xd4, 0xcf, 0xd7, 0xd4, 0x62, 0x26, + 0x28, 0x13, 0x41, 0x44, 0xca, 0x76, 0xf6, 0x21, 0x63, 0x4b, 0xae, 0xaf, 0xe7, 0xc7, 0x4d, 0x79, 0x5d, 0x8f, 0xc3, + 0x04, 0x0d, 0xc9, 0x06, 0x39, 0xa0, 0xd8, 0xde, 0x87, 0xb3, 0xd7, 0x4b, 0x65, 0x4e, 0xa3, 0xa6, 0xff, 0x79, 0xab, + 0x0c, 0xed, 0xb4, 0x01, 0x69, 0xdc, 0xa6, 0x15, 0x98, 0x98, 0x82, 0xc8, 0x86, 0x4d, 0x06, 0x77, 0xbd, 0x39, 0x6c, + 0x73, 0x52, 0x73, 0x48, 0xd6, 0xe4, 0x8a, 0x4a, 0x83, 0x9a, 0xf5, 0xc9, 0xeb, 0xa5, 0x2e, 0xa9, 0x70, 0x4b, 0x9d, + 0xb9, 0xbe, 0xc8, 0xe4, 0x9e, 0x17, 0xf2, 0xca, 0x95, 0x97, 0xd3, 0x14, 0xd8, 0x9b, 0xef, 0xb1, 0xaf, 0x13, 0x9a, + 0xf5, 0x3d, 0x8f, 0x74, 0xe3, 0x5d, 0x47, 0x07, 0x26, 0xd2, 0x60, 0xa2, 0xef, 0x11, 0x34, 0x2f, 0x6e, 0xb3, 0xfe, + 0xf0, 0xa3, 0x42, 0x7d, 0xfb, 0x47, 0x5c, 0x75, 0x98, 0x0f, 0xe6, 0x0f, 0x4e, 0xe5, 0x67, 0x1a, 0x4f, 0x93, 0x47, + 0x5f, 0x04, 0x7c, 0xff, 0x7a, 0xf9, 0x79, 0x6b, 0x46, 0x47, 0xc6, 0x0c, 0xd5, 0x90, 0x30, 0xd5, 0xfc, 0xde, 0x8b, + 0xd5, 0x65, 0x7f, 0x87, 0x2d, 0x9a, 0xd5, 0xe4, 0x3f, 0xf9, 0xed, 0x07, 0xfb, 0xa2, 0xb6, 0xd3, 0xe1, 0xbf, 0xbd, + 0x40, 0x78, 0x7a, 0x67, 0x24, 0x0b, 0x6b, 0x0e, 0xed, 0xcf, 0x7a, 0x6a, 0x7c, 0xdb, 0x36, 0x61, 0x5b, 0xc3, 0x7c, + 0x5d, 0xfc, 0xf6, 0x1c, 0xc2, 0xa9, 0xba, 0x12, 0x15, 0x35, 0x11, 0x87, 0x41, 0x13, 0xa5, 0xe5, 0x73, 0x07, 0xfa, + 0xc6, 0xe3, 0x96, 0x43, 0x01, 0x76, 0x4b, 0x53, 0x28, 0xad, 0x09, 0x7e, 0x88, 0x0f, 0x26, 0x90, 0x04, 0xfd, 0x2a, + 0x0d, 0x4c, 0xcd, 0x5c, 0xbf, 0x10, 0xd6, 0x47, 0xaf, 0xe2, 0x12, 0x80, 0x00, 0x59, 0xaa, 0x9b, 0x18, 0x58, 0x96, + 0xc8, 0x80, 0x67, 0xc2, 0xb9, 0x4e, 0x5d, 0x86, 0x1e, 0x79, 0xf5, 0xcf, 0xb0, 0x81, 0x1f, 0x9e, 0x4f, 0x34, 0x1d, + 0x7c, 0xf2, 0x4a, 0x4d, 0xbd, 0x42, 0x06, 0xbc, 0x73, 0x56, 0xbc, 0x9d, 0x43, 0xa9, 0xe6, 0x44, 0x0c, 0xcd, 0xcd, + 0xe4, 0x4e, 0xde, 0xb3, 0x0e, 0x25, 0x35, 0xb6, 0xb6, 0xf6, 0xcc, 0xae, 0x6f, 0x91, 0x82, 0x59, 0xa1, 0xdc, 0x8b, + 0xaa, 0x4f, 0x64, 0x26, 0xd0, 0xa5, 0xe7, 0x38, 0xf3, 0xf5, 0xcd, 0x4f, 0x05, 0x62, 0x8c, 0x38, 0xc3, 0x96, 0x13, + 0x68, 0xb2, 0xe4, 0xd9, 0xcf, 0x4a, 0x5f, 0x44, 0x57, 0xf6, 0x49, 0x47, 0xae, 0x16, 0x81, 0xa1, 0xa7, 0x2d, 0xd8, + 0xb3, 0x35, 0x74, 0x6a, 0xc2, 0xbc, 0xc0, 0x7d, 0xae, 0xf0, 0x88, 0xe4, 0xd0, 0x28, 0x7c, 0x22, 0x98, 0x95, 0xa3, + 0x2a, 0x81, 0x16, 0x0b, 0xc7, 0x4a, 0xf3, 0x07, 0xb8, 0xa1, 0x56, 0xbf, 0xdf, 0x36, 0x6b, 0xa3, 0x84, 0x8b, 0xbf, + 0x24, 0x99, 0xc1, 0x09, 0x7e, 0xff, 0x99, 0x8c, 0x1c, 0xd1, 0x43, 0x7c, 0xb1, 0x46, 0x9d, 0x2e, 0x65, 0x92, 0xa9, + 0xa0, 0xd0, 0x45, 0x92, 0x47, 0x37, 0x9c, 0x3c, 0x5f, 0xf1, 0xf3, 0x0d, 0x1e, 0x37, 0xeb, 0x3d, 0xb6, 0x7c, 0x33, + 0x35, 0xaf, 0xf3, 0x08, 0x54, 0x33, 0x56, 0x02, 0x4f, 0x18, 0xda, 0xc0, 0xbb, 0xc5, 0x4a, 0x42, 0xd7, 0xef, 0xbd, + 0xa4, 0xec, 0x61, 0x77, 0x1b, 0xa2, 0x57, 0x47, 0x00, 0xee, 0x8b, 0xd3, 0x56, 0xd4, 0xbd, 0x01, 0xa2, 0x8f, 0xee, + 0xef, 0xb1, 0xac, 0xe1, 0x03, 0x87, 0x8d, 0x2b, 0x3c, 0x8e, 0x15, 0x84, 0x96, 0xb4, 0xfe, 0x56, 0xd5, 0x1e, 0xc0, + 0x83, 0x66, 0x79, 0x15, 0x8a, 0x60, 0xb7, 0x15, 0x21, 0x3b, 0xce, 0x44, 0x71, 0x9f, 0x6f, 0xe0, 0x70, 0xde, 0xb8, + 0x7a, 0x74, 0x43, 0xcd, 0x4d, 0x7a, 0x90, 0xd2, 0x4b, 0x9b, 0xc8, 0x6a, 0xa2, 0xc6, 0xdf, 0x1a, 0x55, 0x85, 0x34, + 0xdd, 0x1d, 0x1a, 0x7c, 0x88, 0x7c, 0x81, 0x3d, 0xd8, 0x12, 0xf4, 0x32, 0x8d, 0xc6, 0xc1, 0x56, 0x0d, 0xe5, 0x8d, + 0x75, 0x00, 0x03, 0x61, 0x93, 0xa0, 0x44, 0x06, 0x5b, 0x67, 0x8b, 0x58, 0xf5, 0x9c, 0xb0, 0x79, 0x7f, 0xbd, 0x2e, + 0xb1, 0x17, 0xb3, 0x85, 0xcd, 0x54, 0x5f, 0xc8, 0x38, 0xeb, 0xa7, 0xcd, 0xfe, 0xbf, 0x2d, 0x80, 0x83, 0x12, 0xc3, + 0x0b, 0x02, 0x41, 0x44, 0xd5, 0x07, 0xe5, 0xcd, 0xb0, 0x24, 0x2c, 0x0a, 0x6c, 0x1b, 0x1f, 0xb9, 0x7b, 0x48, 0x9e, + 0x55, 0x42, 0x7c, 0x2b, 0x63, 0xd3, 0xd1, 0x76, 0x18, 0x61, 0xa8, 0x86, 0x2d, 0x11, 0x5a, 0x41, 0x04, 0x6c, 0xea, + 0xcf, 0x34, 0xf6, 0x71, 0xe7, 0xda, 0x41, 0xba, 0x28, 0xcb, 0x2c, 0x1c, 0x47, 0x50, 0xa7, 0x83, 0x41, 0xad, 0x84, + 0x9e, 0xec, 0x1e, 0xfc, 0xc6, 0xc6, 0xb8, 0xa0, 0xb8, 0xa1, 0x70, 0xeb, 0x5a, 0x9f, 0x46, 0x06, 0xa6, 0xf8, 0x72, + 0xa5, 0xff, 0xfe, 0x80, 0x1e, 0x07, 0xbb, 0xd4, 0x48, 0xf9, 0x6c, 0xd6, 0x13, 0xf8, 0xee, 0x86, 0x06, 0x67, 0x78, + 0x38, 0xf2, 0x83, 0xc3, 0x3b, 0x25, 0xf0, 0xa0, 0x60, 0x56, 0xbe, 0x7d, 0x10, 0x8a, 0xd4, 0x17, 0x81, 0x0e, 0x17, + 0x5f, 0x53, 0xaf, 0x87, 0x23, 0xe4, 0x56, 0xe4, 0xb1, 0xc0, 0x9d, 0xc8, 0x38, 0x25, 0x47, 0x18, 0x18, 0x27, 0x57, + 0xdf, 0x84, 0xcd, 0x7c, 0xdb, 0x31, 0xff, 0xc2, 0xe5, 0x83, 0x03, 0xd1, 0xac, 0x9f, 0x2d, 0xd8, 0xa5, 0xa4, 0x40, + 0xe0, 0x1e, 0xe9, 0x18, 0x3d, 0x85, 0xa9, 0x1b, 0x9c, 0xa6, 0x14, 0x51, 0x9a, 0x88, 0xd9, 0x42, 0x70, 0x6c, 0x6b, + 0x63, 0x2e, 0xfd, 0x46, 0xd9, 0xd5, 0xb4, 0xd9, 0x8f, 0x2c, 0xf8, 0x42, 0xf9, 0xb6, 0x27, 0xb8, 0x69, 0xc5, 0xed, + 0x5c, 0xea, 0xff, 0x76, 0x9d, 0x49, 0x1b, 0x5a, 0xf7, 0xaa, 0x2d, 0x04, 0x36, 0x45, 0x05, 0xa8, 0x99, 0x5e, 0x24, + 0x53, 0x3b, 0x89, 0xd9, 0x0f, 0x4d, 0x24, 0x27, 0x44, 0x2b, 0xfb, 0x3b, 0xd9, 0x8b, 0x36, 0xe9, 0x18, 0x4a, 0x30, + 0xfc, 0xc8, 0xa5, 0xf4, 0xd5, 0xd5, 0x72, 0x2d, 0x3b, 0x5f, 0xc3, 0x4e, 0x98, 0x0c, 0x08, 0xb2, 0xff, 0x59, 0x68, + 0x6b, 0xc0, 0xe4, 0x52, 0x8f, 0x29, 0x78, 0x74, 0x6d, 0xbe, 0xfb, 0x13, 0x8a, 0x25, 0x0b, 0x31, 0xe5, 0xd0, 0xae, + 0xbf, 0x1e, 0x13, 0x23, 0xa0, 0x2c, 0x89, 0x10, 0x6e, 0xa5, 0x1c, 0xa8, 0x7f, 0xbf, 0x62, 0x52, 0xb0, 0xa5, 0xf6, + 0x46, 0x9c, 0x5d, 0xbd, 0xac, 0x81, 0xc4, 0x46, 0xf3, 0x61, 0x62, 0x47, 0x08, 0x27, 0x4d, 0xed, 0x4b, 0x45, 0x91, + 0x48, 0xcf, 0x52, 0xc4, 0x20, 0xe3, 0x8a, 0xe9, 0x12, 0x2d, 0xac, 0x99, 0xb0, 0x1c, 0x1b, 0x91, 0xa4, 0xcc, 0x6d, + 0x11, 0x3f, 0xbe, 0xe9, 0x06, 0x24, 0x40, 0x3d, 0x62, 0x90, 0x0f, 0xbe, 0x25, 0x20, 0xd7, 0x25, 0x09, 0xca, 0xb5, + 0xcf, 0x25, 0x64, 0x42, 0x3b, 0x19, 0x09, 0x13, 0xf3, 0x46, 0x90, 0x72, 0xf7, 0x74, 0x4a, 0xd7, 0x00, 0x4b, 0x39, + 0x59, 0xcd, 0x21, 0x62, 0xe4, 0x78, 0x5d, 0x75, 0xb5, 0x80, 0x58, 0x0a, 0xb7, 0xa3, 0xed, 0xc8, 0xe4, 0x5c, 0xdc, + 0xa1, 0xf3, 0xce, 0x99, 0x5f, 0x18, 0xa7, 0x1c, 0x9c, 0x1e, 0xe6, 0x2e, 0x20, 0x20, 0xa7, 0xae, 0xfa, 0xc1, 0x19, + 0x19, 0xa4, 0xb8, 0x9a, 0x77, 0x5a, 0x24, 0x9a, 0x11, 0xf9, 0xac, 0x18, 0xaa, 0xdb, 0x2a, 0x37, 0xc2, 0x62, 0xad, + 0x5c, 0x82, 0x29, 0x72, 0x72, 0x1b, 0x7c, 0xb3, 0x83, 0xc7, 0xcd, 0x13, 0x16, 0xc0, 0x59, 0x8f, 0xe5, 0x62, 0xc2, + 0xa1, 0xea, 0x36, 0x7e, 0x0d, 0x64, 0x0a, 0xbc, 0x72, 0xd4, 0x59, 0x92, 0xe3, 0x0b, 0x0d, 0xaa, 0x81, 0xbf, 0xf6, + 0x91, 0xe7, 0x41, 0x6e, 0x50, 0x35, 0xd5, 0x34, 0x8b, 0x42, 0x4f, 0x31, 0xcf, 0x84, 0xcc, 0x5f, 0x35, 0x8a, 0x4e, + 0xc2, 0x8c, 0xa7, 0xc9, 0x96, 0x3a, 0xdd, 0xa7, 0x32, 0xa1, 0x80, 0xd8, 0x43, 0xe0, 0x14, 0xb8, 0xf7, 0xa6, 0xc2, + 0x3c, 0x9d, 0x92, 0x49, 0x1c, 0x9e, 0xcc, 0xb3, 0x59, 0x03, 0x66, 0xc0, 0x8d, 0x12, 0xe8, 0xe6, 0x8c, 0xfc, 0x70, + 0x0b, 0xb7, 0x55, 0x71, 0x1e, 0x93, 0x15, 0x68, 0xc9, 0x4d, 0x04, 0xc9, 0xf0, 0xca, 0xb8, 0x80, 0xd2, 0x7b, 0x13, + 0x67, 0xc6, 0xdd, 0xe2, 0xab, 0x8a, 0x4f, 0xc0, 0x79, 0xdc, 0x97, 0xdb, 0x8a, 0x53, 0x9a, 0x2a, 0x1c, 0x80, 0x92, + 0x17, 0xc4, 0x63, 0xe1, 0x9b, 0xd3, 0x2b, 0x99, 0x61, 0xe0, 0x62, 0x46, 0x35, 0x15, 0xdd, 0x85, 0x74, 0xc2, 0x74, + 0x90, 0xf0, 0x96, 0x34, 0x06, 0x77, 0x40, 0xf1, 0xbe, 0x00, 0x14, 0x11, 0x8e, 0xc2, 0x77, 0x76, 0x4c, 0x47, 0xab, + 0x92, 0xf0, 0x68, 0x99, 0x2d, 0xda, 0x79, 0xf9, 0x46, 0x25, 0xab, 0x1c, 0x70, 0x34, 0x00, 0x6c, 0x5e, 0x7f, 0x48, + 0x7c, 0x06, 0x81, 0x1c, 0x1f, 0x27, 0x76, 0x3e, 0x34, 0x4d, 0x95, 0xc2, 0x9f, 0x8d, 0xf6, 0x26, 0x2c, 0x70, 0xc7, + 0x29, 0x13, 0x3a, 0x1e, 0x1b, 0xd1, 0x0d, 0x41, 0xe7, 0x5f, 0xb0, 0x03, 0xb6, 0xda, 0x66, 0x7b, 0xbf, 0x7a, 0xbd, + 0x2c, 0x4e, 0x0e, 0x98, 0xe4, 0x9d, 0xcd, 0xbd, 0xb7, 0xdb, 0xf9, 0x2f, 0x27, 0x1f, 0x99, 0xb0, 0x40, 0xe1, 0x55, + 0x4e, 0x59, 0x64, 0x24, 0x3a, 0xa0, 0xc4, 0x2b, 0x4d, 0xe7, 0x62, 0x74, 0x2d, 0x12, 0xaf, 0x4a, 0xb1, 0x2b, 0x24, + 0xa9, 0x61, 0xe6, 0x0d, 0x38, 0xc8, 0x66, 0x9d, 0xa6, 0x46, 0x41, 0x11, 0xb2, 0xcc, 0xc5, 0xc6, 0x2c, 0xb1, 0x58, + 0xf3, 0x96, 0x33, 0x6d, 0x4e, 0x61, 0x44, 0xe0, 0xe4, 0x80, 0xa8, 0xfe, 0xac, 0xd6, 0xd8, 0xe0, 0xd6, 0xf3, 0x6a, + 0x18, 0x61, 0xe0, 0xdd, 0x50, 0x92, 0xf2, 0xc4, 0x18, 0x2b, 0x21, 0xc9, 0xa9, 0x23, 0x8e, 0xfd, 0xc8, 0xf2, 0x15, + 0xdf, 0xef, 0xb9, 0xc6, 0x14, 0x97, 0x07, 0x13, 0x63, 0x16, 0x43, 0xa6, 0x76, 0x83, 0xca, 0x22, 0xa9, 0x9f, 0x8e, + 0x6a, 0x59, 0x39, 0x93, 0x7b, 0x0c, 0xf7, 0x51, 0xe7, 0x92, 0xbc, 0x7b, 0x74, 0x05, 0x01, 0xd9, 0x5d, 0x82, 0xd5, + 0x27, 0x87, 0x24, 0x8a, 0x9c, 0xb0, 0x9f, 0xeb, 0x5f, 0x56, 0x23, 0x7f, 0x95, 0x63, 0x29, 0x5f, 0x0f, 0x79, 0x4b, + 0x19, 0x62, 0x2a, 0xad, 0xe5, 0x9e, 0x53, 0x90, 0x71, 0xe9, 0xb2, 0x6c, 0xf1, 0x40, 0x2c, 0x21, 0x7c, 0xb0, 0x98, + 0x7d, 0xde, 0x2e, 0x1c, 0xc8, 0xa4, 0x50, 0x7e, 0xdf, 0xe5, 0xf2, 0xfc, 0xf0, 0xc9, 0x46, 0x2d, 0xc6, 0x18, 0xa7, + 0x54, 0x5b, 0xdf, 0x38, 0xa8, 0x15, 0xa3, 0x0d, 0x3c, 0xbf, 0xb0, 0xdd, 0x6e, 0x6f, 0xd9, 0x2b, 0x20, 0x2b, 0x6b, + 0x2b, 0x70, 0x53, 0x27, 0x9d, 0x1f, 0x36, 0xc2, 0x49, 0x13, 0xca, 0x40, 0x7a, 0x39, 0x43, 0x2d, 0x90, 0x44, 0x37, + 0x45, 0x2d, 0x8c, 0x16, 0xeb, 0x5b, 0x8e, 0xbe, 0xf5, 0x6b, 0x18, 0x32, 0x4a, 0xe9, 0x98, 0xa6, 0xc3, 0xbd, 0x2e, + 0xd9, 0x77, 0x11, 0x44, 0x8b, 0x6c, 0xd6, 0x6c, 0xc3, 0x2f, 0x52, 0xae, 0xbd, 0x10, 0xde, 0x92, 0xe6, 0x28, 0xf2, + 0xce, 0x11, 0xa9, 0xa5, 0x70, 0xaa, 0xa9, 0xc7, 0x24, 0x1c, 0xbb, 0x04, 0x5a, 0x29, 0x98, 0xee, 0xe1, 0xc5, 0x4e, + 0xb6, 0xa1, 0xc2, 0x22, 0x2d, 0x04, 0x69, 0x14, 0x73, 0xf8, 0xfd, 0x20, 0x11, 0x59, 0x06, 0xd8, 0x79, 0xd4, 0xe7, + 0xc0, 0x1e, 0x0e, 0xe3, 0xd1, 0x55, 0x11, 0xfb, 0xee, 0x0f, 0x13, 0x14, 0x62, 0x9d, 0xa6, 0x09, 0x0a, 0xf7, 0x7c, + 0x84, 0x8e, 0xcd, 0x31, 0x3f, 0x9d, 0x85, 0xb6, 0x7d, 0xb3, 0x7a, 0x28, 0xbc, 0xfc, 0x2e, 0xc5, 0x3e, 0xa5, 0xb7, + 0xf3, 0x2f, 0xd3, 0x39, 0xc5, 0x3c, 0xb3, 0xeb, 0x14, 0x53, 0xa1, 0x89, 0xcd, 0x85, 0x97, 0x28, 0x12, 0xe7, 0xc3, + 0x4b, 0x69, 0xe0, 0xcd, 0xd0, 0x29, 0x91, 0x60, 0xdc, 0x08, 0x4f, 0x62, 0x14, 0x61, 0x0d, 0x98, 0xee, 0xe6, 0x3d, + 0x3b, 0xa9, 0x38, 0x77, 0xca, 0x92, 0x2b, 0xba, 0xfb, 0xb9, 0x41, 0x00, 0x40, 0xc5, 0xce, 0xe3, 0x0b, 0x9f, 0x2c, + 0xaf, 0xe5, 0xf4, 0x1c, 0x57, 0x86, 0x10, 0x5a, 0x1a, 0x71, 0x42, 0xb0, 0x91, 0x4a, 0x60, 0x5b, 0x61, 0xb9, 0x53, + 0x25, 0x4a, 0x06, 0x7d, 0x60, 0x8c, 0xec, 0x0e, 0x8a, 0x13, 0xd9, 0x10, 0xda, 0x9a, 0x8e, 0x08, 0x62, 0xe6, 0x7f, + 0x1f, 0xe4, 0x0c, 0xf0, 0xf8, 0xad, 0x64, 0x48, 0x85, 0x00, 0xcd, 0x1c, 0x2f, 0x2f, 0x03, 0x76, 0x31, 0xc4, 0x95, + 0xb2, 0xb8, 0x00, 0xc4, 0x66, 0x1f, 0x9b, 0x71, 0x90, 0xfb, 0x41, 0xea, 0x1c, 0xd6, 0x65, 0x07, 0xa2, 0xd2, 0x0b, + 0xe1, 0xf9, 0x35, 0x0d, 0xd5, 0xa4, 0x09, 0xe3, 0x75, 0xcc, 0x20, 0x66, 0x45, 0x69, 0x23, 0x05, 0x61, 0x95, 0x82, + 0x43, 0x60, 0x8e, 0x34, 0xcb, 0x84, 0xfa, 0xd2, 0x22, 0xc1, 0x1b, 0x0a, 0x01, 0xdb, 0xf1, 0x5a, 0xa2, 0x01, 0x1c, + 0x18, 0xb3, 0x61, 0x87, 0xa4, 0x95, 0x05, 0xf5, 0x40, 0xf9, 0x59, 0x5f, 0x78, 0x3c, 0x23, 0x99, 0xf0, 0xc1, 0x03, + 0x47, 0xf3, 0xa5, 0xa8, 0xe7, 0xe6, 0x44, 0x4b, 0xda, 0xe4, 0x10, 0x7f, 0x22, 0xaa, 0xb5, 0x68, 0xc5, 0x03, 0x5f, + 0x01, 0xa8, 0x90, 0xa6, 0x82, 0x4a, 0x64, 0x49, 0x59, 0x54, 0x64, 0x1e, 0x4c, 0xcc, 0xb5, 0x05, 0x56, 0xd6, 0xa8, + 0x77, 0xfd, 0x08, 0x7e, 0xa6, 0x84, 0x4a, 0xad, 0x3b, 0xc4, 0x3f, 0x65, 0xfc, 0x35, 0x84, 0x14, 0x99, 0x9f, 0x19, + 0xb9, 0xcb, 0x63, 0x9e, 0x3d, 0xb2, 0xfa, 0xb7, 0x7d, 0x1b, 0x8e, 0x2e, 0xdc, 0x63, 0x92, 0xab, 0xf7, 0x48, 0x64, + 0x64, 0x33, 0x01, 0x41, 0xb7, 0xf1, 0x7a, 0x38, 0x4a, 0xc5, 0x1f, 0x9b, 0x14, 0x6f, 0xab, 0x0a, 0xa2, 0xf6, 0xa2, + 0x85, 0x54, 0x93, 0x9e, 0x03, 0x69, 0xd0, 0x9c, 0x34, 0x6a, 0xd0, 0xb5, 0x07, 0x2a, 0x54, 0x04, 0xe5, 0x8f, 0x0e, + 0x27, 0x26, 0xca, 0xf0, 0x14, 0xee, 0x2f, 0x4c, 0x46, 0x98, 0x39, 0x02, 0x55, 0xed, 0xa2, 0xe5, 0xf3, 0x16, 0x63, + 0x02, 0x79, 0xef, 0xfe, 0x0d, 0xf3, 0x23, 0xaa, 0x61, 0xb3, 0xe5, 0xbf, 0xf9, 0x33, 0x4f, 0x29, 0x2a, 0x27, 0xc2, + 0x54, 0x48, 0xa8, 0xb1, 0xb3, 0xa4, 0xd0, 0xa3, 0x8b, 0x58, 0xc3, 0x2c, 0x3f, 0x59, 0x73, 0x75, 0x63, 0x08, 0x19, + 0x23, 0x10, 0x9c, 0x21, 0xc4, 0xa8, 0xf2, 0x44, 0x39, 0x78, 0x9b, 0x00, 0xb8, 0x04, 0xf5, 0x18, 0x2c, 0x73, 0xfb, + 0x12, 0xa1, 0xb9, 0x9c, 0xf7, 0x1f, 0x71, 0x29, 0x19, 0x29, 0x7e, 0x96, 0x97, 0x59, 0xf7, 0x52, 0x79, 0x2a, 0x6e, + 0x5d, 0xd1, 0x56, 0xdc, 0x06, 0x0f, 0x98, 0x82, 0x3e, 0xca, 0x4a, 0x6d, 0xf4, 0x69, 0x16, 0x35, 0xbb, 0x64, 0xdb, + 0x63, 0x77, 0x63, 0x79, 0x52, 0x70, 0x27, 0xbc, 0x84, 0x69, 0x19, 0x4a, 0xdd, 0x36, 0x5e, 0x8a, 0x7d, 0x38, 0xc7, + 0x79, 0xf9, 0x2d, 0x53, 0xbc, 0xff, 0x8e, 0xe2, 0xd3, 0xd7, 0x2c, 0xcd, 0x30, 0x3f, 0x3a, 0x2a, 0x94, 0xc0, 0xcc, + 0x7a, 0xac, 0xe6, 0x51, 0x12, 0x6b, 0x28, 0x40, 0x87, 0x05, 0x43, 0x7b, 0xbc, 0xde, 0x82, 0x78, 0xa8, 0xb2, 0x1e, + 0x2c, 0xbc, 0x27, 0x33, 0x74, 0xb5, 0xa4, 0x0d, 0xad, 0x6b, 0xa2, 0xa2, 0x4f, 0xef, 0x91, 0xc5, 0xdd, 0xfa, 0x38, + 0x4e, 0x9a, 0x18, 0x15, 0x97, 0xa2, 0xdd, 0x59, 0x37, 0x5e, 0x84, 0x99, 0x78, 0x8c, 0x9c, 0x11, 0x19, 0x6b, 0xe9, + 0x8c, 0x96, 0xdc, 0xba, 0x04, 0x99, 0x4f, 0x06, 0x7a, 0x27, 0x50, 0x7e, 0xfe, 0x28, 0x07, 0x8e, 0x08, 0x00, 0xb5, + 0xdb, 0x16, 0x84, 0x2c, 0x38, 0xf0, 0xbf, 0x2c, 0xb7, 0x7d, 0x9f, 0xbc, 0xb3, 0x7c, 0x31, 0x2b, 0xe0, 0x7c, 0x63, + 0xa3, 0xbd, 0x11, 0xb7, 0xb3, 0x91, 0x0d, 0x1d, 0x4f, 0x24, 0xd4, 0x1f, 0x66, 0xe6, 0xd9, 0x31, 0x1f, 0x18, 0x09, + 0xce, 0x46, 0x47, 0x60, 0xbb, 0x2a, 0x73, 0xfd, 0x37, 0x49, 0xde, 0x59, 0x12, 0x23, 0x5c, 0x51, 0x81, 0xac, 0x1e, + 0x64, 0x41, 0xb0, 0xb8, 0xa5, 0x2b, 0xba, 0xde, 0xe7, 0x15, 0x89, 0x36, 0x91, 0x29, 0xb9, 0x1e, 0x20, 0xa0, 0xab, + 0x57, 0x3d, 0x3e, 0x55, 0xf7, 0xc6, 0xfb, 0x52, 0xe3, 0x85, 0xf6, 0xf7, 0xb5, 0x9d, 0x3a, 0xdc, 0xbc, 0xe7, 0x7a, + 0x9e, 0xf6, 0x8f, 0x12, 0x75, 0x7a, 0x2d, 0x32, 0x9e, 0x87, 0xfb, 0x35, 0x94, 0xd3, 0x48, 0x35, 0x69, 0x25, 0xa1, + 0xb8, 0x11, 0xcb, 0xbc, 0xe3, 0x96, 0x07, 0xbc, 0x0a, 0xbf, 0x69, 0xb5, 0x10, 0xef, 0x7d, 0x64, 0x58, 0x9e, 0x7a, + 0x77, 0x34, 0x61, 0xf6, 0x50, 0x2b, 0xbb, 0x29, 0x26, 0x60, 0x3f, 0xad, 0xfe, 0xc9, 0xae, 0xca, 0x17, 0x17, 0xf3, + 0x3f, 0xbb, 0xae, 0xb2, 0x91, 0xf1, 0x64, 0x9a, 0xf5, 0xdd, 0xf3, 0xf9, 0x87, 0x3f, 0x7b, 0x1a, 0x4e, 0xe6, 0xc3, + 0x2c, 0xda, 0x7f, 0x29, 0xbf, 0x2c, 0x1a, 0x42, 0x5b, 0xfe, 0xe8, 0x2c, 0xf5, 0xcc, 0x42, 0xef, 0x85, 0x00, 0x3e, + 0x2d, 0xda, 0x1d, 0x1c, 0xd5, 0x74, 0x3d, 0x8c, 0xf7, 0x41, 0x0b, 0xb7, 0x2e, 0x77, 0x20, 0xce, 0x6c, 0xc4, 0x49, + 0x7e, 0x51, 0xb3, 0xeb, 0x5d, 0x36, 0xb3, 0x69, 0x97, 0xbf, 0x23, 0x08, 0x9f, 0x4d, 0x90, 0xd1, 0x3a, 0xd6, 0x36, + 0xa9, 0xbc, 0x0a, 0x2c, 0xff, 0x8d, 0xe4, 0xd3, 0xb9, 0x36, 0x8c, 0x6e, 0x05, 0xfb, 0xf9, 0xa7, 0xf0, 0x6d, 0xd5, + 0x77, 0xc7, 0x9d, 0xff, 0x7c, 0xba, 0x5f, 0xfd, 0x3b, 0xd5, 0x93, 0xb9, 0x59, 0xf4, 0xde, 0xf3, 0xe0, 0xfb, 0xd3, + 0xa0, 0xdb, 0xb6, 0x7a, 0xb2, 0x7d, 0xfc, 0x7f, 0x17, 0xef, 0xff, 0x27, 0xfa, 0xfa, 0x15, 0x7b, 0x64, 0x3e, 0xf4, + 0xe2, 0xf8, 0x6c, 0xea, 0xe2, 0xf2, 0xff, 0x5c, 0xab, 0xdb, 0x3b, 0xcf, 0x6a, 0xb4, 0x6b, 0x6e, 0xb9, 0xee, 0xb5, + 0xed, 0x32, 0xaa, 0x9c, 0xc0, 0xad, 0xff, 0x7a, 0xea, 0x2b, 0x08, 0xf2, 0x79, 0xe3, 0xe5, 0x7e, 0xf6, 0xf0, 0xb6, + 0x26, 0xb3, 0xcf, 0x96, 0x7b, 0x27, 0x2f, 0xfc, 0xbc, 0x1e, 0x6c, 0xfb, 0x54, 0xea, 0x28, 0xd5, 0xac, 0xf8, 0x61, + 0x4d, 0x72, 0xb6, 0x2b, 0xe7, 0xfc, 0xd3, 0xf2, 0x79, 0xfd, 0xff, 0xc5, 0xf3, 0x6f, 0x76, 0xba, 0x47, 0xd8, 0x6f, + 0x61, 0x5f, 0x63, 0x3f, 0xab, 0x4f, 0xe6, 0x70, 0xf5, 0x29, 0xde, 0xba, 0xee, 0x6d, 0xb5, 0x6b, 0xee, 0xe2, 0x8a, + 0x39, 0x75, 0xc9, 0x95, 0xb3, 0x7a, 0x2a, 0x88, 0x0b, 0x62, 0x11, 0x48, 0x7c, 0x57, 0xff, 0x1d, 0xdc, 0xd5, 0x43, + 0xef, 0x95, 0x8b, 0x6d, 0xcf, 0x6d, 0x02, 0xec, 0x9a, 0xc8, 0x8c, 0x11, 0x2b, 0x62, 0x1b, 0xed, 0x28, 0xf0, 0x01, + 0x8b, 0xb6, 0xcf, 0x9f, 0x12, 0x9f, 0xf5, 0xbb, 0x90, 0x6b, 0x70, 0x7d, 0x7f, 0xfd, 0x5a, 0x3c, 0x93, 0x3f, 0x08, + 0x29, 0xfa, 0xf9, 0xc0, 0x53, 0xfd, 0x8b, 0x54, 0x98, 0x42, 0x54, 0x27, 0x2c, 0x6b, 0x86, 0x7d, 0x65, 0xdf, 0x47, + 0x8b, 0x43, 0x05, 0x6a, 0x3d, 0xde, 0x27, 0x44, 0x3e, 0xaa, 0x48, 0x77, 0xf9, 0x77, 0x2a, 0x82, 0xc0, 0x88, 0x28, + 0x30, 0x34, 0xc8, 0xa7, 0x9d, 0x03, 0x7f, 0x81, 0xe5, 0xfe, 0xa2, 0xb8, 0x7a, 0xb7, 0x4b, 0x4a, 0x35, 0x5c, 0xcd, + 0x1b, 0xeb, 0x14, 0x20, 0x25, 0x36, 0x11, 0x01, 0xc3, 0x7f, 0x72, 0xe5, 0x0b, 0xb6, 0x5e, 0xe7, 0x69, 0x3e, 0x19, + 0x55, 0xa7, 0x26, 0x37, 0x5b, 0x0b, 0x23, 0x5d, 0x0b, 0xaf, 0x3a, 0x3a, 0xe1, 0x94, 0x63, 0xcc, 0x57, 0x94, 0x36, + 0x1e, 0x71, 0xa7, 0xfe, 0xf6, 0x2a, 0xfe, 0xdc, 0x80, 0x84, 0x72, 0xcb, 0x6c, 0x70, 0x95, 0x99, 0xbd, 0x56, 0x70, + 0xa3, 0x24, 0x4c, 0xf1, 0x12, 0xf2, 0x8c, 0xdf, 0x73, 0xb1, 0x32, 0x05, 0xb6, 0x69, 0x7a, 0xff, 0xc7, 0xf6, 0x24, + 0x28, 0x04, 0x3a, 0xf1, 0x52, 0x80, 0x04, 0xaa, 0xbe, 0x21, 0xc8, 0x37, 0x3d, 0xe2, 0xa0, 0xad, 0xa9, 0x8d, 0xf3, + 0x4c, 0xb3, 0x68, 0x33, 0xde, 0xd5, 0x95, 0x92, 0xb9, 0x9e, 0x11, 0x8d, 0xbc, 0xb6, 0xed, 0xf5, 0x66, 0xcc, 0xec, + 0x7a, 0x38, 0x07, 0x74, 0xbe, 0x0e, 0xa0, 0x9f, 0x55, 0x07, 0x96, 0x2a, 0x4e, 0x7f, 0xb9, 0x03, 0x32, 0xb0, 0xa4, + 0x43, 0x0f, 0x53, 0x0a, 0x9f, 0xa5, 0xf4, 0x1f, 0x01, 0x3b, 0x05, 0x0e, 0x4b, 0x39, 0x16, 0xd9, 0x8d, 0xd9, 0xcc, + 0xda, 0xd6, 0xe4, 0xa4, 0x33, 0x17, 0x51, 0xf6, 0x7c, 0x6d, 0x57, 0xff, 0x5d, 0xac, 0xfa, 0x78, 0xc9, 0xc6, 0x29, + 0x20, 0x05, 0x05, 0x05, 0xb1, 0xc7, 0xf2, 0xf3, 0xd0, 0x2f, 0x19, 0x91, 0x41, 0x34, 0xbd, 0x1a, 0x74, 0xfa, 0x79, + 0xd2, 0x5f, 0x58, 0x94, 0xd4, 0x4a, 0xe8, 0x0f, 0xb8, 0xe1, 0x03, 0x77, 0xe7, 0x8c, 0x38, 0x37, 0x84, 0xfc, 0x34, + 0xf5, 0x23, 0xe6, 0x6e, 0xe6, 0x64, 0x16, 0x3f, 0x07, 0x72, 0xd2, 0x82, 0xd5, 0xf8, 0x13, 0x36, 0x82, 0xdc, 0x37, + 0x7e, 0x69, 0xa9, 0x02, 0x47, 0x97, 0x2b, 0xe9, 0xe9, 0xd2, 0xc9, 0x62, 0xa1, 0x75, 0x70, 0x77, 0x8a, 0xe0, 0x8b, + 0xb7, 0xc2, 0x3a, 0xff, 0xe5, 0x72, 0xeb, 0xae, 0x38, 0x1b, 0x36, 0xa2, 0x7e, 0x76, 0xbf, 0xba, 0x75, 0x1a, 0xbe, + 0x47, 0xbf, 0x8b, 0x57, 0xdf, 0xf5, 0x78, 0x21, 0x47, 0xb7, 0x6e, 0x0d, 0x56, 0xf3, 0x74, 0x05, 0x45, 0x33, 0xb0, + 0x2f, 0x5e, 0x94, 0x83, 0x2f, 0x60, 0x34, 0xee, 0x78, 0x11, 0x6c, 0x0a, 0xed, 0xf3, 0xce, 0xf3, 0xe5, 0x15, 0x55, + 0x93, 0x85, 0xf4, 0x76, 0xcd, 0xc6, 0xf0, 0xfe, 0xba, 0xbd, 0xf9, 0x59, 0xfc, 0x54, 0x7c, 0x85, 0x46, 0xe8, 0xb7, + 0x0b, 0x40, 0xba, 0xfa, 0x92, 0x15, 0x8f, 0x3e, 0x6f, 0x85, 0x58, 0xcd, 0xf7, 0x8e, 0x67, 0xb1, 0x42, 0xe0, 0xe3, + 0x5b, 0xd1, 0xeb, 0x25, 0x3c, 0xb3, 0x9a, 0x75, 0x82, 0xb9, 0x03, 0x88, 0x50, 0x44, 0x1a, 0x34, 0x11, 0xe4, 0xbb, + 0xb3, 0x61, 0x2e, 0x54, 0x67, 0x35, 0x2f, 0xff, 0xbc, 0xbc, 0xa2, 0x1e, 0x51, 0x2f, 0x7e, 0x73, 0xbd, 0x81, 0x44, + 0xab, 0xae, 0x85, 0x1a, 0xbf, 0x4b, 0x8d, 0x53, 0xe6, 0x41, 0x03, 0x24, 0x69, 0xe8, 0x50, 0xcb, 0xfb, 0x10, 0x8f, + 0x8b, 0xed, 0x6b, 0x34, 0x7e, 0xdf, 0xc4, 0x5a, 0x11, 0x15, 0x79, 0x4f, 0x81, 0x2c, 0x0e, 0x94, 0x50, 0x5a, 0x5e, + 0xc8, 0xdf, 0x15, 0xa6, 0x5a, 0x64, 0xce, 0xc3, 0xc4, 0x59, 0xa0, 0xfe, 0x7a, 0xf4, 0xd4, 0xfb, 0x52, 0x07, 0x7c, + 0x63, 0x61, 0x03, 0xd7, 0x73, 0x43, 0x8d, 0x60, 0x1c, 0xa4, 0x48, 0x35, 0xa8, 0x0d, 0x33, 0x6a, 0x30, 0x79, 0x4d, + 0xc7, 0x96, 0x62, 0xaf, 0xa4, 0x3f, 0xe4, 0x99, 0x2e, 0xac, 0xf2, 0x6d, 0xd5, 0x23, 0x3b, 0xbd, 0x8d, 0x0b, 0xfe, + 0x59, 0xf3, 0xde, 0x7c, 0x8d, 0x78, 0xba, 0x6c, 0x48, 0xb0, 0xa4, 0xe7, 0xc9, 0x71, 0xeb, 0xfc, 0xa2, 0xba, 0x9e, + 0xab, 0x78, 0x04, 0x99, 0x12, 0x2e, 0x09, 0xb9, 0x8e, 0x73, 0xbd, 0x97, 0x30, 0x10, 0x21, 0x5f, 0xd7, 0x67, 0x09, + 0x50, 0xda, 0xd6, 0x97, 0x50, 0x0b, 0x1f, 0x4a, 0xb3, 0xaf, 0xdd, 0x12, 0x8e, 0xcc, 0x7d, 0x57, 0xec, 0x5d, 0x1d, + 0x39, 0x5d, 0x38, 0x24, 0x15, 0xa0, 0xef, 0xb9, 0xe8, 0xf0, 0x8d, 0xb1, 0xb0, 0x48, 0xc4, 0xa6, 0x37, 0xd1, 0x8d, + 0x66, 0xdd, 0xe0, 0x57, 0x27, 0x9d, 0x06, 0x5f, 0x1b, 0x38, 0x15, 0xb1, 0xa6, 0x00, 0x3b, 0xf4, 0xb8, 0xb1, 0x3b, + 0x40, 0x88, 0x6f, 0x5a, 0xed, 0x84, 0xce, 0xd6, 0x8d, 0x23, 0x14, 0x04, 0x03, 0xea, 0x45, 0xd4, 0x8a, 0xf2, 0xfb, + 0x4a, 0x27, 0x11, 0xf5, 0x06, 0xbf, 0x7b, 0x7d, 0xef, 0xe5, 0xa9, 0x2a, 0xbe, 0xde, 0xab, 0x07, 0x7a, 0xb2, 0x1d, + 0x90, 0xd8, 0x34, 0x15, 0x6b, 0x40, 0x93, 0x67, 0x4e, 0x81, 0xb8, 0xc1, 0x3c, 0xf7, 0x61, 0x3f, 0xc6, 0x7c, 0x8d, + 0x40, 0x8d, 0x4e, 0x84, 0x6a, 0x49, 0xa4, 0x2f, 0x57, 0x2a, 0x63, 0xdd, 0x2c, 0xe2, 0xd9, 0x45, 0x93, 0xf7, 0x7f, + 0x6f, 0x1c, 0x5c, 0xd7, 0x54, 0x50, 0x6e, 0xda, 0x33, 0xff, 0xeb, 0x9a, 0xc2, 0x06, 0xc0, 0x03, 0x7c, 0x5d, 0x42, + 0x72, 0x65, 0xc0, 0x87, 0x6f, 0x0a, 0x75, 0x5e, 0xdd, 0xe6, 0x2d, 0x64, 0x65, 0x40, 0xe4, 0xb4, 0x7d, 0x80, 0xf0, + 0x36, 0x60, 0x0c, 0x23, 0x2e, 0x40, 0xf4, 0xd1, 0x31, 0xdd, 0xaa, 0x69, 0x20, 0xee, 0xca, 0x56, 0x1f, 0xcf, 0x04, + 0xbc, 0x12, 0x7e, 0x63, 0x18, 0xc7, 0x10, 0xe2, 0x33, 0x8e, 0xed, 0xf1, 0x25, 0x54, 0x0e, 0x34, 0xca, 0x83, 0x55, + 0x79, 0xfc, 0x39, 0xf7, 0xfe, 0xea, 0xab, 0x66, 0x64, 0xd3, 0x80, 0xb9, 0xd1, 0xb4, 0xa1, 0x63, 0xc5, 0xba, 0xe4, + 0x6f, 0xbd, 0x43, 0x63, 0xb0, 0x2f, 0x5b, 0x5f, 0xc2, 0xfd, 0x4e, 0x46, 0xc3, 0x0d, 0x8c, 0xc0, 0x18, 0x0c, 0x54, + 0x95, 0x52, 0x90, 0xfe, 0xe2, 0xa5, 0x9d, 0x8b, 0x92, 0xf7, 0xa4, 0x93, 0xbd, 0x11, 0xca, 0x83, 0x42, 0x8b, 0x81, + 0x8b, 0x7e, 0x53, 0x6b, 0x25, 0xee, 0x63, 0xf9, 0xae, 0x8f, 0xd6, 0x54, 0xba, 0x99, 0x11, 0xd9, 0x52, 0x87, 0x51, + 0xdc, 0x9c, 0x3b, 0x69, 0xe6, 0xa1, 0x53, 0x60, 0x91, 0xe6, 0x66, 0x79, 0x00, 0xe2, 0x5b, 0xd4, 0xc8, 0xe6, 0x94, + 0xff, 0x89, 0x47, 0xdd, 0x40, 0x88, 0xc8, 0xb2, 0xbe, 0x6b, 0x8a, 0x33, 0x28, 0x94, 0xe4, 0x06, 0x85, 0xf0, 0xde, + 0xc8, 0xa0, 0x40, 0xc9, 0x52, 0xd9, 0x48, 0xfa, 0xfd, 0x27, 0x1e, 0x54, 0xe8, 0xe9, 0xce, 0x91, 0x64, 0xeb, 0x36, + 0x0b, 0x6b, 0x28, 0x8d, 0x32, 0x31, 0xbb, 0xd9, 0xc9, 0xb7, 0x05, 0x05, 0x45, 0x49, 0x39, 0x51, 0xa4, 0x19, 0x0e, + 0x77, 0xfa, 0x5f, 0xee, 0x51, 0xde, 0xb1, 0x40, 0xb9, 0xcd, 0x9c, 0x96, 0x00, 0x01, 0x44, 0xfd, 0x5c, 0x40, 0x34, + 0x51, 0xa4, 0x14, 0x72, 0x79, 0x23, 0x2f, 0xf3, 0xd1, 0xad, 0x79, 0xca, 0x41, 0xfb, 0xca, 0xfe, 0x94, 0x30, 0xe7, + 0xb6, 0x92, 0x3e, 0x92, 0x31, 0x31, 0x52, 0x17, 0xdc, 0xd0, 0x81, 0x61, 0xbd, 0x77, 0xe8, 0xe5, 0x53, 0x63, 0xc2, + 0xef, 0x2f, 0x82, 0x22, 0x88, 0x42, 0x00, 0x80, 0x69, 0x59, 0xb6, 0xa4, 0xf0, 0x49, 0x12, 0x05, 0x90, 0xf5, 0xb8, + 0xf4, 0xc0, 0xb5, 0x24, 0x30, 0x3c, 0xaa, 0x09, 0x68, 0xde, 0x2e, 0x50, 0x38, 0xa0, 0x85, 0x95, 0xeb, 0xb0, 0x76, + 0x42, 0xaa, 0x26, 0x45, 0xab, 0x9b, 0xd5, 0x92, 0x94, 0x67, 0x06, 0x4c, 0x15, 0x91, 0xa7, 0xf5, 0x3f, 0x64, 0xbe, + 0xb4, 0x40, 0xf4, 0xc6, 0x7c, 0x16, 0x5c, 0x3f, 0x56, 0x3b, 0x8e, 0x5e, 0x37, 0x4c, 0x6b, 0x37, 0x48, 0x02, 0x44, + 0x3e, 0x95, 0xd5, 0xd5, 0x2b, 0x15, 0xa4, 0xa1, 0xc6, 0x8f, 0x7c, 0xaf, 0x14, 0xe4, 0x4a, 0xe9, 0xa5, 0xa0, 0x00, + 0xdd, 0x78, 0xe9, 0x88, 0xa7, 0x6c, 0xe9, 0xc5, 0xa6, 0xb0, 0x71, 0xc2, 0xd8, 0xeb, 0xd9, 0x8a, 0x93, 0x7a, 0xec, + 0xaa, 0x4e, 0xb2, 0x04, 0x5d, 0x5c, 0x4b, 0x5e, 0xc5, 0x91, 0xe9, 0xd2, 0xd4, 0x31, 0xf5, 0xef, 0x1a, 0xed, 0x89, + 0x15, 0xba, 0xff, 0x2d, 0x91, 0x3b, 0xaf, 0x4c, 0xd3, 0x02, 0x41, 0xd6, 0x82, 0x90, 0xe0, 0x7c, 0x27, 0x44, 0x1e, + 0x95, 0xc7, 0xa4, 0x65, 0xee, 0xf1, 0xb5, 0x6e, 0xc6, 0x53, 0xda, 0x03, 0x51, 0x3e, 0xcc, 0x71, 0x97, 0x12, 0xe6, + 0x9e, 0x3d, 0xb0, 0x32, 0x4c, 0x4c, 0xec, 0x83, 0x1e, 0x3d, 0xae, 0x59, 0x01, 0xc1, 0x30, 0xfd, 0xda, 0xa5, 0xdd, + 0xed, 0xfa, 0x61, 0x0b, 0xe0, 0x5d, 0x2e, 0x84, 0xfa, 0xb9, 0x3a, 0x71, 0x53, 0x78, 0x75, 0x83, 0xb6, 0x8a, 0xd5, + 0x1a, 0x54, 0xb4, 0xdc, 0xa1, 0x6d, 0xeb, 0xcf, 0x69, 0x06, 0x1f, 0x3b, 0x39, 0x10, 0x6a, 0x3a, 0x22, 0x98, 0x89, + 0x72, 0x24, 0x0d, 0x9e, 0xb8, 0xea, 0x6c, 0x91, 0xaa, 0x77, 0x73, 0x02, 0x64, 0x48, 0xea, 0x0b, 0x32, 0x84, 0x36, + 0x20, 0x74, 0xac, 0xa9, 0xf2, 0xb5, 0x41, 0xed, 0xd6, 0x13, 0x63, 0x6f, 0xdf, 0x84, 0x16, 0x45, 0x85, 0xbe, 0x2d, + 0x16, 0xbb, 0x64, 0x8c, 0xbe, 0xe0, 0x6f, 0xcc, 0x7e, 0x92, 0xd1, 0xc3, 0x67, 0xb5, 0xd1, 0x45, 0x3b, 0x88, 0x5d, + 0x60, 0xfc, 0xa3, 0xc9, 0xdb, 0x9a, 0x55, 0x5c, 0x7e, 0x75, 0x41, 0x55, 0xab, 0xd9, 0x62, 0xfa, 0xb3, 0xae, 0x70, + 0x89, 0x64, 0xa2, 0xc4, 0x0c, 0x7f, 0x10, 0x68, 0xf5, 0x7d, 0xe0, 0xdc, 0xe7, 0xb9, 0x9e, 0xa0, 0xff, 0xe2, 0xa5, + 0x77, 0x28, 0xa3, 0x42, 0xc8, 0xc7, 0x91, 0x2f, 0xa4, 0x88, 0x55, 0xba, 0x7b, 0xb4, 0xd1, 0x12, 0x39, 0x0b, 0x64, + 0xcd, 0x6a, 0xca, 0x34, 0xd4, 0x85, 0x63, 0x8b, 0x2e, 0xd3, 0x6c, 0x17, 0xd0, 0x32, 0xac, 0xa4, 0x63, 0xeb, 0x9d, + 0x05, 0x84, 0x22, 0x22, 0x80, 0x29, 0x69, 0xf0, 0x9f, 0x5d, 0x69, 0x8b, 0xc5, 0xdc, 0xb4, 0x94, 0x7d, 0x2e, 0x23, + 0x31, 0xd7, 0x13, 0xb2, 0x1b, 0xb8, 0x5e, 0xdc, 0x08, 0x4d, 0x6b, 0x84, 0xe4, 0x24, 0xd1, 0xa3, 0x5e, 0xa8, 0x37, + 0x55, 0x59, 0x34, 0x7a, 0x40, 0x54, 0x03, 0xd7, 0xbb, 0x69, 0x27, 0x52, 0x12, 0x2c, 0x15, 0xdd, 0x07, 0x6e, 0xdd, + 0xad, 0x75, 0x98, 0x70, 0x85, 0x9c, 0x97, 0x50, 0x23, 0x86, 0x84, 0xfb, 0x80, 0x3d, 0x94, 0x4c, 0x00, 0x98, 0x82, + 0x13, 0x68, 0x09, 0xb0, 0xed, 0x56, 0x50, 0x02, 0x06, 0xac, 0xcc, 0x34, 0xa2, 0x30, 0xf3, 0xd0, 0x15, 0x26, 0xe4, + 0x38, 0x37, 0x8f, 0x3a, 0x58, 0x90, 0x2a, 0x44, 0xdb, 0xef, 0x4d, 0x0f, 0xe6, 0x38, 0x33, 0xce, 0x91, 0x0b, 0x80, + 0xe3, 0x2d, 0x28, 0xd5, 0x30, 0x34, 0x6c, 0xff, 0xaa, 0xc9, 0x2a, 0x67, 0x44, 0x62, 0xd5, 0x2b, 0x9b, 0xfd, 0x2a, + 0xfe, 0x18, 0x0a, 0x2a, 0x69, 0x3a, 0xbe, 0x49, 0x4c, 0x3d, 0x5b, 0x5e, 0x7d, 0x65, 0x78, 0xd2, 0xb3, 0x7d, 0xc0, + 0x15, 0x8f, 0xc0, 0xba, 0x29, 0xf9, 0x51, 0x27, 0x83, 0x06, 0xe0, 0xa8, 0x45, 0x3b, 0x54, 0x9d, 0x62, 0x10, 0x30, + 0xe2, 0x74, 0x5a, 0x96, 0xfc, 0x25, 0x8a, 0x0d, 0x34, 0xf1, 0x18, 0x2f, 0x58, 0x3a, 0xb1, 0xbd, 0xa3, 0xf9, 0xaa, + 0x44, 0x23, 0xcb, 0xac, 0x0d, 0x92, 0xfc, 0x36, 0xbd, 0xd6, 0x2a, 0x23, 0xed, 0x6d, 0xd9, 0x21, 0xfe, 0x11, 0xc8, + 0x82, 0x31, 0xa3, 0x22, 0x51, 0x31, 0x45, 0xc6, 0xa5, 0xf1, 0x56, 0xb2, 0x00, 0x5d, 0xa6, 0x67, 0x6b, 0xf3, 0x8a, + 0xbc, 0x7d, 0x12, 0xcd, 0x7d, 0x30, 0x55, 0x61, 0xff, 0x72, 0x34, 0x5b, 0x1e, 0xab, 0xf0, 0x8f, 0x55, 0x75, 0x04, + 0x9a, 0xb6, 0xab, 0xa7, 0x40, 0x8e, 0x4e, 0xd5, 0xc5, 0x21, 0x39, 0xf6, 0xc2, 0x8c, 0x43, 0x12, 0x72, 0xb2, 0x78, + 0x1b, 0xac, 0x4f, 0x32, 0xb4, 0x46, 0x80, 0x2f, 0x17, 0x61, 0xd5, 0x2b, 0xcd, 0x1e, 0x65, 0xb2, 0x1a, 0x59, 0x2b, + 0x28, 0x4d, 0x10, 0x45, 0xf3, 0x14, 0x09, 0x03, 0xcf, 0x72, 0xa2, 0x30, 0x61, 0x38, 0x25, 0xec, 0x43, 0xa2, 0x8b, + 0xf6, 0x0f, 0x33, 0xcb, 0x87, 0x12, 0xb0, 0xa5, 0x79, 0x12, 0x20, 0x46, 0x80, 0x51, 0xa5, 0x58, 0xd1, 0x3f, 0x38, + 0x4f, 0x1c, 0x0f, 0x73, 0x49, 0x22, 0x3f, 0xe3, 0xfd, 0x91, 0x79, 0xd3, 0xcd, 0xcb, 0x23, 0xdb, 0x90, 0x26, 0x66, + 0xaa, 0xa7, 0x70, 0x8d, 0xd8, 0x6e, 0xbb, 0x80, 0x2d, 0x54, 0xba, 0x41, 0xb5, 0x2f, 0x8a, 0x20, 0xf4, 0x2f, 0x75, + 0x90, 0xd6, 0xfc, 0x37, 0x47, 0x1b, 0x4c, 0x8c, 0xde, 0x64, 0x07, 0x8c, 0xfb, 0x66, 0xaa, 0xba, 0x96, 0x40, 0xc7, + 0xa6, 0x2a, 0xfc, 0x76, 0x70, 0x09, 0x89, 0xb9, 0x32, 0x16, 0xbd, 0xd5, 0x19, 0x59, 0xe5, 0xfe, 0xdf, 0x36, 0x1d, + 0x41, 0xb7, 0x7f, 0x9d, 0x5d, 0xcd, 0xce, 0x03, 0x64, 0x91, 0x07, 0x8e, 0x88, 0xa5, 0x7a, 0x6a, 0xf3, 0x68, 0x58, + 0x58, 0xaa, 0x2b, 0xc7, 0xfb, 0xb8, 0x92, 0x36, 0x9f, 0x97, 0x86, 0x03, 0x22, 0x72, 0x30, 0xbd, 0x35, 0xf0, 0x5b, + 0x24, 0x32, 0xaf, 0x6a, 0x1c, 0xd1, 0xa9, 0x8b, 0x71, 0x31, 0xae, 0x15, 0x94, 0x46, 0x7e, 0xdc, 0x49, 0x3f, 0x46, + 0x47, 0x4b, 0x1f, 0x9f, 0x6e, 0xad, 0x8a, 0xee, 0xd5, 0x2f, 0x72, 0x28, 0xe6, 0x65, 0x19, 0x1d, 0x08, 0x19, 0x24, + 0x7b, 0x4f, 0xbe, 0xf3, 0x9e, 0xb8, 0xcc, 0x45, 0x4f, 0x8d, 0x0a, 0x0e, 0xbd, 0xbd, 0x8d, 0x2c, 0x53, 0x39, 0x72, + 0x07, 0xcc, 0xce, 0xf8, 0xda, 0xde, 0x40, 0x6c, 0xef, 0x85, 0xc8, 0xad, 0xf0, 0x48, 0x61, 0xfa, 0x71, 0x65, 0x84, + 0xab, 0x31, 0xe9, 0x50, 0x99, 0x4c, 0xf3, 0xc2, 0x2e, 0x57, 0x59, 0xd0, 0x61, 0x19, 0x54, 0x33, 0x99, 0x99, 0x66, + 0xb2, 0x69, 0xa4, 0xe1, 0x0a, 0xc5, 0x34, 0x06, 0x2e, 0x97, 0x2a, 0x52, 0xf6, 0xbc, 0x92, 0xa5, 0xe7, 0x38, 0x0b, + 0x1d, 0xa6, 0x4d, 0x07, 0xcf, 0x53, 0xe2, 0x92, 0x70, 0x84, 0x35, 0x13, 0x4c, 0x93, 0xac, 0xb4, 0x40, 0xb9, 0xa8, + 0xa4, 0x18, 0xba, 0x3e, 0xaf, 0x24, 0x65, 0xee, 0x68, 0x19, 0x4f, 0x69, 0xf4, 0x8c, 0xf2, 0x15, 0xb5, 0x66, 0xfe, + 0xc9, 0xf2, 0xef, 0x20, 0x85, 0xd6, 0x57, 0x40, 0x05, 0xa6, 0x14, 0xac, 0x04, 0xf9, 0xfb, 0xc5, 0x8d, 0x56, 0x11, + 0x97, 0x82, 0xf3, 0x2a, 0xe6, 0x65, 0x53, 0x0d, 0x69, 0xbe, 0xfe, 0xe4, 0x7f, 0xa6, 0x93, 0x83, 0x4a, 0x1c, 0x6e, + 0x00, 0x33, 0x86, 0x5c, 0x2c, 0xe8, 0x4f, 0xa5, 0x57, 0x5f, 0xa9, 0x97, 0xa2, 0x46, 0x5d, 0xe8, 0xee, 0x96, 0xdc, + 0x5a, 0xcf, 0x46, 0x9a, 0x68, 0x56, 0x2a, 0xdf, 0x0f, 0x92, 0x66, 0x86, 0x1a, 0xe1, 0x62, 0x2f, 0x36, 0x60, 0xdc, + 0x1a, 0xa7, 0x50, 0x7b, 0x2f, 0x59, 0xc2, 0x67, 0x8b, 0xcb, 0x41, 0x95, 0xc2, 0x18, 0xdf, 0x81, 0xb9, 0x21, 0xf7, + 0xc1, 0x93, 0xde, 0x7e, 0xbb, 0xf3, 0x53, 0xbc, 0x0c, 0xec, 0x12, 0x11, 0x0f, 0xa2, 0xdf, 0xdc, 0x2a, 0x6d, 0xaf, + 0x37, 0x16, 0x36, 0x57, 0xc5, 0x0f, 0x2a, 0x55, 0xe0, 0xce, 0x2b, 0x77, 0x61, 0x50, 0x1e, 0x41, 0x0e, 0xfa, 0x4d, + 0xe3, 0xe6, 0x7e, 0x27, 0x54, 0x61, 0xd8, 0xa5, 0x87, 0x49, 0x59, 0xe7, 0x4b, 0x7a, 0x18, 0x33, 0xc4, 0xce, 0xcc, + 0x32, 0xa9, 0xd0, 0xae, 0x65, 0x41, 0xe3, 0xa7, 0xe0, 0x8f, 0x28, 0xa3, 0x48, 0x2b, 0x26, 0xb0, 0x0f, 0x32, 0x01, + 0xc7, 0x07, 0xc1, 0xa8, 0x2e, 0xe2, 0x13, 0x9c, 0xee, 0xce, 0x0b, 0x0e, 0x54, 0x32, 0xb4, 0x48, 0xb0, 0xc4, 0x1e, + 0xf1, 0xb0, 0xa9, 0x1f, 0xec, 0x9d, 0xda, 0x55, 0x38, 0x6f, 0x16, 0xeb, 0x31, 0x48, 0xf5, 0xfc, 0xb6, 0xf9, 0x84, + 0x03, 0xfc, 0x51, 0x9d, 0xea, 0xf1, 0x4d, 0x1d, 0xaf, 0x71, 0x08, 0xab, 0x43, 0xe5, 0x16, 0x7f, 0x52, 0x90, 0xce, + 0xb8, 0xa0, 0x87, 0xfd, 0x2b, 0x69, 0xf1, 0x05, 0x65, 0x37, 0x01, 0x1b, 0xbd, 0xf5, 0xa0, 0x04, 0xa1, 0xf3, 0xfe, + 0xe1, 0xd1, 0x7d, 0x16, 0x14, 0x6b, 0x44, 0x1d, 0x35, 0xf1, 0x6e, 0xb4, 0x9b, 0x54, 0x5c, 0x10, 0xab, 0x36, 0x5b, + 0xed, 0xb0, 0x0c, 0xd1, 0xfb, 0x37, 0x19, 0x59, 0x80, 0xa2, 0xbd, 0xe9, 0x79, 0x19, 0xac, 0x56, 0x4f, 0x13, 0x12, + 0x86, 0x6f, 0x20, 0xab, 0x29, 0x6c, 0x33, 0xdd, 0xca, 0xe8, 0x73, 0x60, 0x8e, 0x9e, 0x74, 0xd6, 0xd4, 0x82, 0xb1, + 0x65, 0xd4, 0x9f, 0x29, 0x0b, 0x27, 0x1f, 0xcb, 0xe0, 0xe7, 0x85, 0x29, 0x75, 0x07, 0x0d, 0xc9, 0x62, 0xc4, 0xca, + 0x4d, 0x3c, 0x74, 0xe8, 0xaa, 0x04, 0x83, 0xf5, 0xdb, 0x7a, 0xe3, 0xac, 0xd7, 0x38, 0x20, 0xf4, 0xde, 0x0f, 0x5c, + 0x2d, 0xfc, 0x10, 0x89, 0x11, 0xde, 0x90, 0x36, 0x47, 0x9d, 0xf1, 0xe2, 0x37, 0xde, 0x1b, 0x43, 0xb9, 0xbd, 0xae, + 0xf8, 0xa3, 0x5f, 0xd7, 0x95, 0x2a, 0x74, 0x25, 0x71, 0x66, 0xee, 0x63, 0x49, 0xd1, 0x23, 0x53, 0xda, 0xc5, 0x3d, + 0x00, 0x58, 0x98, 0x8d, 0x8a, 0xd0, 0xa4, 0x91, 0xb8, 0xfc, 0x54, 0x61, 0xa5, 0x52, 0x9f, 0x50, 0x72, 0x22, 0x30, + 0x0c, 0xbe, 0xff, 0x28, 0xd2, 0x15, 0x47, 0x3f, 0xc0, 0x3f, 0x22, 0x20, 0x50, 0x6b, 0x16, 0x69, 0xa8, 0x1d, 0x90, + 0x8c, 0x9f, 0x0e, 0x17, 0xce, 0xce, 0xcc, 0x88, 0x20, 0x53, 0x77, 0x03, 0x02, 0x84, 0xe1, 0x1a, 0x81, 0x2e, 0xff, + 0x4a, 0x49, 0xdb, 0x96, 0x3b, 0xd4, 0x61, 0x90, 0x5d, 0xe8, 0x20, 0x5a, 0x2d, 0xfa, 0xa5, 0xca, 0xf8, 0x16, 0xd1, + 0xc9, 0xfa, 0xfa, 0xfd, 0xc7, 0xe5, 0x5e, 0xe4, 0x0f, 0x6e, 0x2d, 0x00, 0x98, 0x8d, 0x38, 0x1b, 0x27, 0xbc, 0x6a, + 0x1d, 0x8b, 0x8f, 0xd2, 0x35, 0x86, 0xed, 0x14, 0xb4, 0xe2, 0x41, 0xab, 0x46, 0x54, 0x8a, 0x75, 0x7e, 0xdc, 0x2b, + 0x0f, 0xed, 0x76, 0xef, 0x87, 0xc0, 0xb9, 0x60, 0x47, 0xcc, 0x13, 0xc0, 0xbc, 0xac, 0x5c, 0x15, 0x32, 0x4d, 0xb0, + 0x11, 0x07, 0x39, 0xc8, 0xb4, 0xeb, 0x1e, 0x98, 0xb2, 0x4d, 0x8b, 0xdd, 0x2d, 0x66, 0x61, 0x03, 0x19, 0x21, 0x05, + 0x9b, 0x84, 0x0f, 0xd9, 0x32, 0x09, 0xa5, 0x07, 0x0e, 0x33, 0xd0, 0xd6, 0x7a, 0x14, 0xfb, 0x35, 0x6d, 0x13, 0x5d, + 0xb2, 0xc0, 0xa5, 0x46, 0xb6, 0x6f, 0xfa, 0x84, 0x8e, 0xc5, 0xe4, 0x86, 0xef, 0x77, 0xe7, 0xd5, 0x18, 0x96, 0xed, + 0x63, 0x65, 0x2f, 0xeb, 0xaf, 0x57, 0x2b, 0x50, 0x33, 0x9d, 0xb9, 0x7c, 0xab, 0xe4, 0xdf, 0xf5, 0x61, 0xa0, 0xf6, + 0x42, 0xe1, 0xa3, 0x98, 0x40, 0x59, 0x4b, 0xea, 0x14, 0xbc, 0x35, 0xde, 0xaf, 0xda, 0x61, 0xdc, 0xbf, 0xb9, 0x0b, + 0x15, 0x37, 0xbe, 0xfe, 0xa7, 0x9b, 0xda, 0xe0, 0xe8, 0x8d, 0x70, 0x49, 0xe7, 0x7e, 0xbd, 0x82, 0x00, 0x51, 0x6f, + 0x61, 0xca, 0x3a, 0x6f, 0xaf, 0xae, 0x6b, 0xf2, 0x68, 0x4b, 0x3f, 0xee, 0x82, 0x0e, 0x9b, 0xac, 0x64, 0x6d, 0xa1, + 0x7b, 0x64, 0x35, 0xee, 0x7e, 0x46, 0x38, 0x74, 0xb0, 0x83, 0xd4, 0x2d, 0x3e, 0xf4, 0x0e, 0xd3, 0xeb, 0x94, 0x54, + 0x6f, 0xf5, 0x9b, 0xfa, 0xcb, 0x97, 0xc6, 0xb9, 0x1a, 0x35, 0xac, 0x5d, 0xd4, 0xa4, 0x64, 0x66, 0x0a, 0xa6, 0xdb, + 0x20, 0x85, 0xab, 0xbe, 0xfa, 0xca, 0xe0, 0xc8, 0xf7, 0x73, 0x42, 0x05, 0x9b, 0x10, 0xaa, 0xc7, 0x2f, 0x88, 0xae, + 0x64, 0xfe, 0x71, 0xbb, 0x32, 0x06, 0x49, 0xe8, 0xdb, 0x11, 0x6f, 0xa5, 0xa9, 0xb3, 0x43, 0x3e, 0xe6, 0x6c, 0x82, + 0x5f, 0xd2, 0x84, 0x40, 0xb3, 0xf0, 0x2f, 0x0d, 0xd8, 0xee, 0x70, 0x6c, 0x3d, 0xd0, 0xb8, 0xf8, 0x0f, 0x94, 0x1b, + 0xd1, 0x99, 0x85, 0x1d, 0xef, 0x66, 0xe6, 0x4b, 0x87, 0xc3, 0x9e, 0x61, 0x09, 0x54, 0x65, 0x18, 0xd0, 0x0f, 0xdd, + 0x90, 0xed, 0x52, 0x1d, 0x3b, 0x07, 0x09, 0xeb, 0x3d, 0x14, 0x62, 0x3f, 0x9a, 0xab, 0xcb, 0xeb, 0xe5, 0x81, 0xfb, + 0x0a, 0xc3, 0xe5, 0xc1, 0xb0, 0xf8, 0x98, 0x15, 0x52, 0x75, 0xe9, 0xba, 0x8e, 0x3d, 0xad, 0x31, 0x20, 0x1f, 0x33, + 0x0c, 0x7f, 0x0e, 0x06, 0x8b, 0x76, 0x64, 0xdb, 0x32, 0x38, 0xc3, 0xca, 0xdb, 0x32, 0x65, 0xa6, 0xec, 0x2e, 0xd8, + 0x9e, 0x1a, 0xf8, 0xb3, 0x93, 0x94, 0x11, 0x14, 0x2a, 0xd3, 0x11, 0x34, 0xfa, 0xc7, 0x57, 0x45, 0xad, 0xc8, 0x46, + 0xd6, 0xfc, 0xb6, 0x78, 0x67, 0x8c, 0x53, 0x5a, 0x97, 0xb3, 0x7a, 0x17, 0xab, 0x46, 0x1f, 0x9a, 0x44, 0x2b, 0x92, + 0xb5, 0xaf, 0xb1, 0xc7, 0xc0, 0x10, 0x46, 0xc8, 0x72, 0xb3, 0xd6, 0x66, 0x36, 0x38, 0x89, 0xe3, 0x51, 0x07, 0xd6, + 0xdb, 0x79, 0xe5, 0x15, 0x0c, 0x02, 0xe0, 0x5f, 0x43, 0xcc, 0xb3, 0x0d, 0xfd, 0xce, 0x74, 0x53, 0xd5, 0xcb, 0x25, + 0x14, 0x46, 0x7f, 0x8c, 0x49, 0x07, 0xe5, 0xa5, 0x6a, 0x2a, 0x0d, 0x92, 0x51, 0x3d, 0x16, 0xa4, 0xa3, 0xcb, 0x73, + 0xc6, 0x67, 0x1d, 0xec, 0x69, 0xd2, 0xcd, 0x00, 0x10, 0x69, 0x87, 0x32, 0x26, 0x2a, 0x84, 0x15, 0x1e, 0x19, 0xa1, + 0xca, 0x1d, 0xf8, 0x28, 0xe0, 0xf3, 0xee, 0xb4, 0x20, 0x98, 0xd5, 0x25, 0x87, 0xb7, 0x42, 0x54, 0x14, 0xb7, 0xb2, + 0x9f, 0x90, 0xcc, 0xc7, 0x66, 0x26, 0xda, 0x6b, 0xc6, 0x9a, 0x77, 0x7f, 0x0e, 0x41, 0xa3, 0x20, 0x74, 0x58, 0x44, + 0xf3, 0x43, 0x0e, 0x83, 0xe4, 0x95, 0xd5, 0xd5, 0xc9, 0xf0, 0x5b, 0x81, 0x64, 0x05, 0x42, 0x74, 0xe2, 0x12, 0x84, + 0xde, 0x7e, 0x32, 0xec, 0x82, 0x57, 0xa0, 0x70, 0x28, 0x1c, 0x2f, 0x81, 0xcd, 0x27, 0x46, 0xc7, 0x72, 0xec, 0x74, + 0xc8, 0x55, 0x85, 0x3a, 0x59, 0x45, 0xd0, 0xda, 0x92, 0x9f, 0xf4, 0x95, 0x82, 0x98, 0x64, 0xcb, 0x96, 0x20, 0xa6, + 0x26, 0xc7, 0xc7, 0x09, 0xbd, 0x3f, 0xb1, 0x48, 0x1a, 0x92, 0x84, 0xef, 0x3e, 0xc1, 0x19, 0x23, 0x18, 0x63, 0x95, + 0x12, 0x63, 0x43, 0x59, 0x66, 0x7f, 0x38, 0x7d, 0x33, 0xc1, 0x81, 0x5f, 0x42, 0x91, 0xf2, 0x2a, 0x39, 0xe1, 0x19, + 0xc3, 0x5c, 0xca, 0xf1, 0xac, 0xe8, 0x1b, 0x75, 0xf8, 0x4b, 0x84, 0x22, 0x90, 0xe0, 0x2e, 0x2f, 0x67, 0xea, 0x8b, + 0xca, 0x4c, 0x69, 0x11, 0x6e, 0xf1, 0x1c, 0x6a, 0x8f, 0x1b, 0xb2, 0x13, 0x6f, 0xba, 0xf7, 0x7a, 0x84, 0x0f, 0x54, + 0x8a, 0x70, 0xde, 0x15, 0x83, 0xe5, 0x6e, 0x2c, 0xcc, 0xa5, 0x2f, 0x26, 0x7f, 0xa0, 0xe7, 0xb3, 0xb4, 0x9c, 0xf8, + 0xaa, 0xf9, 0xe6, 0xa8, 0x8b, 0x3f, 0xe2, 0x69, 0x89, 0x6d, 0xb9, 0xbd, 0x49, 0x2f, 0x3e, 0xdf, 0xe7, 0x7f, 0xd7, + 0x78, 0xb0, 0x50, 0xfd, 0x6c, 0x96, 0xe2, 0x06, 0xab, 0x07, 0x3e, 0x04, 0xb9, 0xc8, 0x4c, 0xe5, 0xda, 0xa6, 0xc7, + 0x9a, 0x3c, 0x6c, 0xc6, 0x3a, 0xb1, 0x5a, 0xf9, 0x36, 0xd8, 0xf4, 0x6a, 0x5b, 0xab, 0x5b, 0x13, 0xfa, 0x43, 0xad, + 0x64, 0x5b, 0xfd, 0x82, 0x07, 0x75, 0x34, 0x5f, 0x76, 0x86, 0xd5, 0xc5, 0xfe, 0x94, 0xc3, 0xa4, 0xf8, 0xbb, 0xb4, + 0xa2, 0x88, 0xfb, 0x4b, 0x06, 0x35, 0x75, 0x7e, 0x8c, 0x5f, 0xac, 0x0e, 0xa1, 0xdf, 0xc7, 0x11, 0xb5, 0x54, 0xfe, + 0x87, 0x13, 0xa5, 0x93, 0x49, 0x1e, 0xed, 0xf9, 0x34, 0x2d, 0x5e, 0xd1, 0xa5, 0xdb, 0xf1, 0x32, 0xf9, 0x56, 0x14, + 0x79, 0xbc, 0x58, 0x65, 0xc0, 0xec, 0x75, 0x68, 0xfa, 0xc9, 0xd3, 0x28, 0x39, 0x16, 0x57, 0x0c, 0x6e, 0x3d, 0x0e, + 0x1e, 0x91, 0x37, 0x35, 0xec, 0x4d, 0x28, 0x58, 0xec, 0xc0, 0x20, 0x3f, 0x06, 0x87, 0xa1, 0x43, 0x3d, 0x22, 0xde, + 0x35, 0xbe, 0x9c, 0xd4, 0x47, 0x58, 0x30, 0xab, 0x89, 0xf0, 0xdb, 0x82, 0xbc, 0x47, 0x22, 0x5a, 0x9f, 0x24, 0x8d, + 0xad, 0x74, 0xe0, 0xed, 0x2b, 0x41, 0x36, 0x39, 0xd0, 0x93, 0xde, 0xc2, 0x6c, 0xe7, 0x7c, 0xb4, 0xf2, 0xf7, 0x22, + 0xf9, 0x29, 0x24, 0xd2, 0x55, 0x15, 0x34, 0x75, 0x64, 0x1f, 0x91, 0x61, 0xed, 0x4b, 0xdd, 0xaf, 0x7d, 0x2d, 0xa4, + 0x24, 0xf8, 0xff, 0x69, 0x14, 0x0b, 0xba, 0x0b, 0x98, 0x77, 0x57, 0xc3, 0x30, 0x91, 0x93, 0xd5, 0xc4, 0x65, 0x89, + 0x6e, 0xea, 0x40, 0x61, 0x0c, 0xfb, 0x6d, 0xb4, 0x38, 0x5c, 0xd8, 0x97, 0x3c, 0x50, 0xa9, 0x5b, 0x8e, 0xe7, 0xb7, + 0x32, 0xa7, 0xf2, 0x62, 0x39, 0xa8, 0x0c, 0x5b, 0x03, 0xf0, 0x0c, 0x61, 0x18, 0x10, 0x0d, 0x39, 0x2e, 0x49, 0xb8, + 0xc2, 0xb0, 0x46, 0xf6, 0x58, 0x34, 0x52, 0x86, 0xd5, 0xc5, 0x8d, 0x2c, 0x4e, 0xa6, 0x89, 0x18, 0xce, 0xa7, 0x69, + 0x71, 0x02, 0xfc, 0xc0, 0x84, 0x1b, 0xec, 0xfa, 0xaa, 0xb0, 0x1c, 0xd0, 0x6c, 0x13, 0x1a, 0x2d, 0x52, 0x93, 0x66, + 0x95, 0x74, 0x52, 0xfe, 0x2f, 0xc7, 0x34, 0xd6, 0x19, 0xe9, 0x9c, 0x30, 0x22, 0xf2, 0x0f, 0x8d, 0x52, 0x76, 0x10, + 0xb6, 0x3a, 0x3c, 0x9c, 0x4d, 0x7e, 0x40, 0xd5, 0x46, 0xf7, 0x83, 0xaf, 0x2e, 0x64, 0xb0, 0x07, 0xc1, 0x91, 0xeb, + 0xe6, 0xa8, 0x49, 0xfe, 0x97, 0xa3, 0xfc, 0x73, 0x2e, 0x4e, 0x3a, 0x92, 0xb4, 0xb1, 0x62, 0x44, 0x64, 0x63, 0xfa, + 0x83, 0x4d, 0x9b, 0xc2, 0xa1, 0x0f, 0x0b, 0x3a, 0x9e, 0xa2, 0x40, 0x1a, 0xbd, 0xaa, 0xe4, 0xa0, 0x30, 0x19, 0x20, + 0x7b, 0x25, 0x65, 0xde, 0x2f, 0xe4, 0x32, 0xc8, 0x7c, 0xab, 0x56, 0x66, 0xcb, 0x67, 0x0c, 0xc4, 0x08, 0x37, 0xc2, + 0xe0, 0x57, 0x8a, 0xa9, 0xaf, 0x59, 0xa6, 0xb8, 0x9f, 0x86, 0x90, 0x1d, 0x12, 0x86, 0x1f, 0x68, 0x53, 0x26, 0xa7, + 0x4d, 0x13, 0x2f, 0xf5, 0xd5, 0xd5, 0x30, 0x79, 0x81, 0x4c, 0xde, 0xe0, 0x3e, 0x72, 0xdd, 0x8f, 0xfa, 0x6d, 0x93, + 0x60, 0x7f, 0x95, 0xe0, 0xff, 0x0e, 0x21, 0x5b, 0x0b, 0x60, 0x06, 0x89, 0x8d, 0xbe, 0x5d, 0xf0, 0x71, 0x51, 0xe4, + 0xeb, 0x44, 0xac, 0xa8, 0x8c, 0x4b, 0xb2, 0x5b, 0x07, 0xbb, 0xd2, 0x36, 0x18, 0x6c, 0x90, 0x68, 0x68, 0x32, 0x0d, + 0x9d, 0x2c, 0xdf, 0x2c, 0x0d, 0xc9, 0xb7, 0x65, 0x9d, 0x3b, 0x14, 0x1a, 0x49, 0x0d, 0x6e, 0xd3, 0xf2, 0x39, 0xf5, + 0x94, 0x6c, 0x78, 0x6c, 0x2b, 0x79, 0x50, 0x61, 0x3a, 0x36, 0xb3, 0x79, 0xb4, 0x62, 0x3d, 0xaf, 0xd6, 0x39, 0x24, + 0x76, 0x5b, 0x56, 0x0e, 0x56, 0x64, 0x88, 0x4f, 0x5c, 0x8f, 0xd6, 0xf6, 0xa3, 0xef, 0x63, 0x44, 0x25, 0x39, 0x18, + 0x96, 0x2d, 0x95, 0xa7, 0x16, 0x27, 0x9e, 0xda, 0xfd, 0x60, 0xfa, 0xb2, 0x48, 0x85, 0x17, 0x4d, 0xe6, 0x8b, 0xd4, + 0xa4, 0x38, 0xcc, 0xc5, 0x48, 0xcc, 0x81, 0xa5, 0x7d, 0x84, 0x8c, 0xc1, 0x52, 0x7a, 0xa4, 0xb1, 0x8d, 0x91, 0xb7, + 0xe8, 0x50, 0x2e, 0x3a, 0xfb, 0x9f, 0x59, 0x7a, 0x0a, 0x43, 0xda, 0x2c, 0x8d, 0x6b, 0xb7, 0x54, 0x5e, 0xd9, 0x0f, + 0xae, 0xb2, 0x6d, 0x1b, 0x8b, 0xa0, 0x7e, 0xb2, 0xde, 0x92, 0x4c, 0x2a, 0x70, 0x30, 0x31, 0xd0, 0x43, 0x65, 0x37, + 0x5a, 0x6b, 0x7a, 0x3c, 0x4a, 0x5b, 0xa4, 0x89, 0xb0, 0x36, 0x32, 0xaa, 0xba, 0x8a, 0xb8, 0xbd, 0xd2, 0x97, 0x7c, + 0x05, 0x18, 0x6f, 0xbc, 0xb9, 0xb9, 0x46, 0xc3, 0x1d, 0x73, 0x12, 0xc5, 0x20, 0xde, 0xad, 0x8c, 0x27, 0x4d, 0xeb, + 0xf2, 0xdb, 0x72, 0xe2, 0x53, 0xbd, 0x6e, 0x31, 0x81, 0x0c, 0xce, 0x82, 0x78, 0x3d, 0x03, 0x58, 0x65, 0x57, 0x11, + 0xd5, 0x66, 0x41, 0x82, 0x60, 0x1a, 0x5c, 0xc7, 0x1a, 0xb7, 0x39, 0xca, 0x36, 0x09, 0x7a, 0xe6, 0x68, 0x2c, 0xff, + 0x9d, 0x59, 0xe0, 0xe5, 0x45, 0x81, 0xf6, 0xc4, 0x81, 0xef, 0xc6, 0x33, 0xf6, 0xfa, 0x9f, 0x8f, 0x8c, 0x01, 0x1c, + 0xd4, 0x98, 0x93, 0xd9, 0xe1, 0x55, 0xda, 0xaa, 0xf4, 0x2a, 0xa9, 0xb2, 0x3d, 0xc4, 0xab, 0xde, 0x8c, 0x24, 0x4a, + 0xa9, 0x0b, 0xb6, 0x6c, 0xe6, 0x41, 0xe2, 0x35, 0x47, 0x7f, 0xac, 0x25, 0x92, 0xbd, 0x82, 0x86, 0x91, 0x33, 0xf1, + 0x8b, 0x4f, 0x89, 0x79, 0xa7, 0x7d, 0xc5, 0xe4, 0x79, 0x83, 0x8f, 0xe0, 0x8b, 0x4a, 0x5d, 0x34, 0xde, 0x38, 0x84, + 0x3a, 0xd6, 0x30, 0x41, 0x0a, 0x30, 0x73, 0x80, 0x8b, 0x62, 0xe5, 0x93, 0x51, 0x52, 0xec, 0x9d, 0x16, 0xdb, 0xbc, + 0x16, 0x8a, 0x57, 0xfe, 0xa2, 0x94, 0xa6, 0xf6, 0xf2, 0xa9, 0x0d, 0xe5, 0xfb, 0x0d, 0x74, 0x1a, 0xeb, 0x8d, 0xe8, + 0xa3, 0x94, 0xf2, 0xec, 0x3a, 0xe1, 0x0c, 0x8f, 0xad, 0x8a, 0x59, 0x3c, 0x58, 0x35, 0xce, 0x3e, 0x84, 0x12, 0x1e, + 0x2d, 0x5b, 0x52, 0x76, 0xf3, 0x14, 0x86, 0xbf, 0xc3, 0x4a, 0xa1, 0xa8, 0x45, 0x80, 0xc0, 0xba, 0x8d, 0x7f, 0xdc, + 0x69, 0x3a, 0x6f, 0xa7, 0xb3, 0xc1, 0xc6, 0xe2, 0x68, 0xd8, 0x1e, 0xa9, 0x32, 0xf0, 0xcb, 0xc7, 0x33, 0x6b, 0x4d, + 0x0a, 0x17, 0x78, 0xa8, 0xc2, 0xf6, 0xaf, 0xa3, 0x3d, 0x69, 0xbe, 0x23, 0xe0, 0x8e, 0x41, 0x3a, 0x01, 0xdf, 0x79, + 0x08, 0x5d, 0x00, 0xed, 0x14, 0x62, 0x17, 0x21, 0x75, 0x09, 0x72, 0x97, 0xa1, 0xed, 0x5a, 0x78, 0x40, 0x4c, 0xf0, + 0xb0, 0x32, 0xc3, 0xa3, 0xca, 0x02, 0x8f, 0x2b, 0x7b, 0x78, 0x42, 0x1c, 0xe0, 0x69, 0x65, 0x85, 0x85, 0x8a, 0xea, + 0xb2, 0xba, 0xaa, 0xae, 0xab, 0xa5, 0x32, 0xf4, 0x2b, 0x96, 0x05, 0xc6, 0xbf, 0x20, 0x46, 0xb0, 0xf8, 0xa0, 0x31, + 0xe5, 0xf6, 0xc1, 0xc3, 0x47, 0x8f, 0x9f, 0x3c, 0x0d, 0x55, 0xa6, 0xf3, 0x75, 0xd6, 0xa4, 0xe6, 0x71, 0x6b, 0xa8, + 0x23, 0xef, 0x7c, 0x39, 0xf4, 0x2d, 0x03, 0xea, 0xec, 0x69, 0x1a, 0x86, 0x2f, 0x5d, 0x7e, 0x3d, 0xf1, 0x4b, 0xc5, + 0xeb, 0xc6, 0x37, 0x66, 0x7c, 0xef, 0x8b, 0x4f, 0x13, 0x5a, 0x3c, 0xbd, 0xe0, 0x82, 0x15, 0x3c, 0x98, 0x8f, 0xf3, + 0x2e, 0x0b, 0x11, 0x75, 0xaa, 0x87, 0xc2, 0x5a, 0xf1, 0xfc, 0x83, 0x0e, 0x63, 0x2f, 0x4e, 0x11, 0xd9, 0x37, 0xe7, + 0x86, 0x88, 0xa6, 0xc9, 0xbb, 0x88, 0xaa, 0x7f, 0xb0, 0x7b, 0x29, 0x1a, 0x5d, 0x52, 0xee, 0xd3, 0xdf, 0x9f, 0xad, + 0xc8, 0xbe, 0xa9, 0xe8, 0x41, 0x71, 0x70, 0x56, 0x2d, 0x4c, 0x66, 0x93, 0xa6, 0x4e, 0x36, 0xc0, 0xf7, 0x4c, 0x0a, + 0xaa, 0x92, 0xa1, 0xf6, 0xcf, 0x1e, 0xf8, 0x4f, 0x5a, 0x77, 0xe1, 0xa7, 0xb2, 0x7e, 0xbb, 0xff, 0x9a, 0xbe, 0x2d, + 0x4e, 0x58, 0x9c, 0x58, 0x94, 0x54, 0xd2, 0x99, 0xc9, 0xa2, 0x9e, 0xd7, 0x57, 0xce, 0xcd, 0x3c, 0xc9, 0x2c, 0x9f, + 0xf6, 0x56, 0xd0, 0xd9, 0x6d, 0x80, 0x98, 0x04, 0xea, 0x35, 0x3e, 0x65, 0xf5, 0x66, 0x3c, 0xfd, 0xc4, 0xb2, 0x29, + 0x85, 0x00, 0xa7, 0xc5, 0x17, 0xff, 0xdb, 0xf1, 0x2d, 0xf9, 0x6e, 0xa6, 0x97, 0xf9, 0xfd, 0x9a, 0x6c, 0xe6, 0x46, + 0x0a, 0xdc, 0xf1, 0xcb, 0xd9, 0xe8, 0xb9, 0xc6, 0x7f, 0x33, 0xc8, 0xdb, 0xe4, 0xe9, 0x52, 0xca, 0xd5, 0xc6, 0x0e, + 0x5d, 0x6e, 0xfe, 0xa9, 0x2a, 0x8f, 0x5d, 0x5b, 0xea, 0xf8, 0xe7, 0x5d, 0x1c, 0x8f, 0x5f, 0xf4, 0x3f, 0xde, 0xe7, + 0x1e, 0xef, 0xa2, 0x66, 0x51, 0xfe, 0x3d, 0x54, 0xa9, 0xe3, 0xf7, 0xa7, 0xf9, 0xd2, 0x51, 0x3e, 0x4e, 0x4d, 0xf3, + 0x41, 0x5e, 0x46, 0x2c, 0x8f, 0xd6, 0xf4, 0xf6, 0xcf, 0x9f, 0x12, 0xff, 0x6b, 0x73, 0x9d, 0xed, 0xe1, 0xfe, 0xa4, + 0x5e, 0x6c, 0x63, 0x31, 0x22, 0x66, 0x63, 0xc1, 0x0e, 0xa8, 0xde, 0x3f, 0x3d, 0x87, 0x94, 0x65, 0xfc, 0xa7, 0xc7, + 0x0b, 0x2c, 0x9d, 0xc0, 0x9a, 0xbf, 0xed, 0x98, 0x96, 0xbc, 0xcb, 0x96, 0x63, 0x0c, 0x7d, 0xc6, 0xff, 0xe6, 0x2e, + 0xee, 0xb0, 0x5a, 0x12, 0xa5, 0x18, 0x11, 0x16, 0xfa, 0xf9, 0x8d, 0x0f, 0x42, 0xf4, 0x61, 0xe5, 0xc1, 0x54, 0xaa, + 0x4d, 0xa6, 0x9c, 0x38, 0x81, 0x0f, 0xbe, 0x1d, 0x78, 0x5a, 0x81, 0x37, 0x7f, 0xdb, 0x37, 0x2d, 0xa3, 0x63, 0xf7, + 0x92, 0xbe, 0xbc, 0x9c, 0xb7, 0x4c, 0x4b, 0xbc, 0xd4, 0xc5, 0xed, 0x49, 0x13, 0x7a, 0x67, 0x41, 0x35, 0xc9, 0xc9, + 0xa7, 0xe5, 0x13, 0x0c, 0xfb, 0x45, 0x49, 0xac, 0x9a, 0x56, 0x43, 0x63, 0xd4, 0x9b, 0x26, 0x53, 0x37, 0xb8, 0xd6, + 0xa8, 0x57, 0x81, 0x7f, 0x66, 0x40, 0xee, 0x39, 0x13, 0x7b, 0xce, 0xa0, 0x97, 0x6f, 0x7e, 0x4c, 0x9a, 0xb7, 0xa6, + 0xde, 0x16, 0x5f, 0x2b, 0xa6, 0x52, 0xa2, 0xf0, 0x7d, 0x5d, 0xb8, 0x10, 0x1f, 0x0b, 0x97, 0xab, 0x07, 0xa6, 0xe9, + 0xd3, 0x29, 0xe4, 0xfb, 0x56, 0xe0, 0x9c, 0x91, 0xa3, 0xa0, 0x0d, 0x86, 0x3c, 0x62, 0xde, 0x0f, 0x21, 0xe5, 0x73, + 0x1f, 0xc6, 0xe8, 0xf7, 0xd8, 0x08, 0x28, 0x96, 0xa3, 0xec, 0x2e, 0xc4, 0x3c, 0xcf, 0x62, 0x76, 0xd0, 0xd5, 0x72, + 0xb3, 0xee, 0x98, 0x63, 0x26, 0x56, 0xfc, 0x8c, 0xeb, 0x58, 0xc1, 0x8c, 0x7c, 0xd0, 0xa2, 0x3b, 0xfa, 0x23, 0x2b, + 0xfb, 0x3a, 0x50, 0x77, 0x12, 0x5a, 0x3b, 0x4c, 0xdf, 0x66, 0x19, 0x0e, 0x28, 0x96, 0x08, 0x12, 0x85, 0xe6, 0xf7, + 0x2a, 0x31, 0xb1, 0x52, 0x9c, 0x1a, 0xcd, 0xf1, 0x86, 0xaa, 0xc4, 0x98, 0xa0, 0xe5, 0xed, 0xea, 0x8b, 0xcc, 0x74, + 0x09, 0x1b, 0x37, 0x58, 0xd2, 0x8a, 0xfd, 0xa2, 0xa4, 0x7e, 0xdf, 0x96, 0x85, 0x8a, 0x77, 0xd9, 0xd5, 0x51, 0x5d, + 0xda, 0xa1, 0xa3, 0x22, 0x66, 0xa0, 0xe8, 0xbb, 0x9d, 0x57, 0xce, 0x46, 0xf6, 0x81, 0xdb, 0x09, 0x9c, 0x05, 0x55, + 0x79, 0x9d, 0xea, 0x50, 0x0a, 0x97, 0x05, 0xe0, 0x16, 0x38, 0x3d, 0x3d, 0x09, 0xca, 0xb3, 0xae, 0xac, 0x44, 0x57, + 0x7a, 0x37, 0xe4, 0x3f, 0xd2, 0xe8, 0xc7, 0x39, 0xe2, 0xd9, 0xe7, 0xdd, 0xe9, 0x46, 0xa7, 0xf9, 0x5d, 0xfe, 0x26, + 0xe6, 0xef, 0x2a, 0xfa, 0xf2, 0x97, 0x2d, 0x6f, 0x5f, 0x07, 0xc2, 0x60, 0x69, 0x86, 0xf8, 0xda, 0x52, 0x79, 0x8d, + 0xb9, 0x0f, 0x31, 0x4d, 0xc2, 0xc6, 0xc8, 0xa3, 0x29, 0xe0, 0x3c, 0xdf, 0xbb, 0x51, 0x7a, 0x6d, 0x4b, 0x82, 0x50, + 0xe2, 0x3d, 0xdf, 0x4a, 0xbf, 0xe7, 0x71, 0x11, 0x0b, 0x32, 0xdb, 0xd0, 0xe9, 0xf9, 0xa8, 0x8e, 0x21, 0xe6, 0xc6, + 0xd3, 0x2e, 0xec, 0xa9, 0x5a, 0xab, 0x05, 0x49, 0xd2, 0xeb, 0x3c, 0xdf, 0xfd, 0xce, 0xa4, 0x8c, 0xe0, 0x51, 0x13, + 0x24, 0x7e, 0xee, 0xeb, 0x3f, 0xef, 0x4c, 0x0d, 0x7a, 0x0b, 0x78, 0x5a, 0x3a, 0xe8, 0xc9, 0x27, 0x8e, 0x5f, 0x0b, + 0xcb, 0x6d, 0xa3, 0x4b, 0xff, 0x7d, 0x9e, 0xad, 0x4b, 0x26, 0x4c, 0xba, 0x45, 0x32, 0x1f, 0x2b, 0x13, 0xe8, 0xa9, + 0x69, 0x9d, 0x90, 0xaa, 0xfe, 0x89, 0x15, 0xd4, 0x28, 0x70, 0xa0, 0x94, 0xba, 0x9a, 0xb0, 0x10, 0xdc, 0x09, 0x8f, + 0xcf, 0x4b, 0x01, 0xd1, 0xdc, 0xbd, 0x08, 0x92, 0x8b, 0xc4, 0x6b, 0x41, 0x25, 0x56, 0x65, 0xc5, 0x65, 0x55, 0x52, + 0x09, 0xa6, 0xf0, 0x03, 0x00, 0xcd, 0x7b, 0x05, 0x4c, 0x72, 0xa0, 0x47, 0x54, 0x3a, 0xf9, 0xa8, 0x11, 0x1f, 0xf0, + 0x64, 0x93, 0xfe, 0xa1, 0xa7, 0xb8, 0x24, 0x4e, 0x9c, 0xe9, 0x50, 0x82, 0xfb, 0x63, 0xd2, 0xfa, 0x53, 0xc5, 0x7c, + 0x8b, 0x89, 0x0e, 0xea, 0xf2, 0xf6, 0xfa, 0x3a, 0xab, 0x89, 0x84, 0x1a, 0x70, 0xc3, 0x9a, 0xd6, 0x94, 0xba, 0x6e, + 0x03, 0x4d, 0x1f, 0x40, 0xdf, 0xb3, 0xea, 0xf6, 0x47, 0x85, 0xe5, 0x40, 0x6e, 0x72, 0x5b, 0x8d, 0xa2, 0x8d, 0xff, + 0x38, 0xb8, 0xa9, 0xc6, 0x29, 0x70, 0x5d, 0xcd, 0x64, 0x99, 0x80, 0xab, 0x6a, 0x8a, 0x00, 0x2e, 0xab, 0xf9, 0x09, + 0xf5, 0xbd, 0xfa, 0x82, 0x8c, 0x5f, 0xea, 0xf0, 0xf5, 0x7e, 0xae, 0x20, 0xf4, 0xce, 0x4f, 0x59, 0x5b, 0x39, 0xf3, + 0x9c, 0xf7, 0xeb, 0x94, 0x83, 0xf7, 0x1b, 0xba, 0xee, 0xf0, 0xa9, 0xce, 0xbc, 0x0d, 0xd0, 0xfe, 0x29, 0x6f, 0xde, + 0xe9, 0x29, 0x62, 0xef, 0xe4, 0x6a, 0xee, 0xee, 0xff, 0x69, 0xe8, 0x79, 0x6f, 0x78, 0xaa, 0xb4, 0x95, 0xe3, 0x4a, + 0x8f, 0xde, 0xd1, 0xbf, 0x96, 0xda, 0x02, 0x87, 0xd5, 0x54, 0x0a, 0x1c, 0x54, 0x93, 0x2b, 0xb0, 0x5f, 0xcd, 0xab, + 0x5a, 0x3b, 0x00, 0x9b, 0xd5, 0x20, 0x03, 0x7b, 0xd5, 0x64, 0x0d, 0xd8, 0xaa, 0x46, 0xbb, 0x4f, 0x1e, 0xd8, 0xae, + 0x06, 0x6b, 0x60, 0x67, 0x64, 0x5e, 0xe7, 0xed, 0xfe, 0x33, 0xf1, 0xdc, 0xc0, 0x58, 0xaf, 0xdb, 0xcb, 0x3e, 0x33, + 0xef, 0x75, 0x0d, 0x4c, 0x97, 0x65, 0x5b, 0xac, 0x5a, 0x80, 0x0d, 0xfa, 0xef, 0x48, 0xd3, 0xd6, 0x0a, 0x7e, 0x23, + 0x90, 0xc0, 0xfc, 0xec, 0x2c, 0x60, 0x01, 0xa3, 0xff, 0xd0, 0xe3, 0xd8, 0xc0, 0x50, 0x4b, 0xac, 0x4f, 0xd6, 0x31, + 0x6d, 0xd3, 0xff, 0xc7, 0xc6, 0x66, 0x1b, 0x25, 0x48, 0xb7, 0xed, 0x35, 0xbe, 0xbc, 0x65, 0x47, 0x68, 0x3f, 0x52, + 0xd4, 0xa5, 0xb4, 0x0a, 0xf0, 0x57, 0x4b, 0x72, 0xf1, 0xe8, 0xb2, 0x3d, 0x13, 0xbe, 0x57, 0x67, 0xb1, 0xce, 0x94, + 0x90, 0x88, 0x1d, 0xe2, 0xea, 0xfe, 0xbf, 0x3c, 0xf5, 0x95, 0x42, 0x65, 0x11, 0x27, 0xc5, 0x47, 0x7c, 0x4c, 0xb6, + 0x0a, 0x4e, 0x11, 0xc7, 0x42, 0x8c, 0x43, 0x37, 0x4f, 0xce, 0x61, 0xd5, 0x24, 0x0a, 0xfb, 0x47, 0xc2, 0x6b, 0xd0, + 0xf0, 0x9b, 0x6c, 0x39, 0xc0, 0xce, 0x19, 0x86, 0xd0, 0x8c, 0xbe, 0xb3, 0x9c, 0x49, 0x95, 0x93, 0x57, 0x30, 0x8e, + 0xe8, 0x58, 0xfd, 0x8e, 0x94, 0x97, 0xf7, 0xa5, 0xca, 0x97, 0x43, 0x50, 0xb6, 0x1f, 0xe0, 0x1d, 0x14, 0xc5, 0xf4, + 0xb9, 0x0c, 0x16, 0xf8, 0x5e, 0x77, 0x0f, 0x0f, 0xf0, 0xc2, 0x26, 0xfc, 0x58, 0x2b, 0x4f, 0x78, 0x67, 0xab, 0x96, + 0xd1, 0x63, 0xe1, 0x60, 0x06, 0xeb, 0x20, 0xfe, 0xaf, 0x79, 0xdd, 0x32, 0x80, 0x12, 0x38, 0xe1, 0xe6, 0x4c, 0x7b, + 0x7d, 0x9d, 0x3e, 0xb0, 0x32, 0x69, 0x8a, 0x5d, 0xf4, 0x07, 0xe6, 0x2a, 0xca, 0x6b, 0xa8, 0xe2, 0x34, 0xbb, 0x91, + 0xba, 0xc0, 0xe3, 0x7b, 0xa5, 0x3b, 0x8f, 0x3b, 0x3c, 0x74, 0xed, 0x0a, 0x8a, 0x5c, 0x23, 0x06, 0xda, 0x5d, 0x00, + 0xdd, 0x2e, 0xc3, 0xc6, 0xbf, 0xea, 0x27, 0xa9, 0x08, 0x44, 0x34, 0xe3, 0x5e, 0xf8, 0x17, 0xb0, 0xad, 0x1b, 0xdd, + 0xa2, 0x94, 0x8e, 0x2e, 0x72, 0xeb, 0xad, 0xc4, 0x9d, 0xa9, 0x64, 0xa3, 0x41, 0x0d, 0x58, 0xce, 0xbd, 0xff, 0x3b, + 0xd5, 0x5c, 0x52, 0x7f, 0xc8, 0xc4, 0x41, 0xdf, 0x9a, 0xad, 0x90, 0x05, 0xff, 0x32, 0xc9, 0x7f, 0xc6, 0x3d, 0x3e, + 0xf1, 0xd5, 0xf3, 0x90, 0x36, 0xdd, 0xb4, 0x02, 0x76, 0xd7, 0x14, 0x59, 0x9f, 0xf2, 0x71, 0x11, 0x46, 0xce, 0x82, + 0x47, 0xf8, 0x03, 0x3a, 0x09, 0x71, 0xd9, 0xfb, 0xda, 0x8b, 0xbd, 0xe8, 0xb9, 0x4c, 0xfa, 0xc7, 0xac, 0x5e, 0xa4, + 0xe3, 0x3c, 0xd4, 0x66, 0xef, 0xa8, 0x5f, 0xa3, 0x0c, 0xd5, 0x9b, 0xb3, 0x9e, 0xc3, 0x36, 0x30, 0xea, 0x4e, 0x89, + 0x56, 0x11, 0xa5, 0x1b, 0x31, 0x68, 0x28, 0x39, 0x19, 0x5f, 0xe9, 0x6c, 0xbf, 0xbb, 0xbc, 0xe3, 0x56, 0x53, 0x0a, + 0x14, 0xfb, 0x46, 0xb9, 0xc6, 0x87, 0x9f, 0x25, 0x2b, 0x22, 0xcb, 0x7a, 0xc1, 0x78, 0xf6, 0x1a, 0xd6, 0x82, 0x69, + 0x8a, 0xb6, 0x50, 0x7b, 0x71, 0x71, 0xd1, 0x84, 0x6b, 0x9d, 0xdc, 0xb8, 0x3b, 0x1f, 0x16, 0x76, 0x41, 0x09, 0xb7, + 0xbd, 0xc2, 0xd3, 0xc1, 0xdc, 0x67, 0x46, 0x28, 0x89, 0x06, 0xe0, 0x04, 0x5c, 0x3a, 0x86, 0xeb, 0xc6, 0xf1, 0x5e, + 0x03, 0x78, 0x58, 0x2f, 0xe0, 0x0c, 0x50, 0xa9, 0x78, 0x45, 0x77, 0xab, 0x1e, 0xbf, 0x3b, 0x4b, 0xf3, 0xeb, 0x44, + 0x19, 0x14, 0x96, 0x83, 0x87, 0x96, 0x32, 0xcf, 0x34, 0xa8, 0x51, 0x83, 0x8d, 0x54, 0xac, 0x90, 0x17, 0xaf, 0x79, + 0xd0, 0xba, 0xea, 0x85, 0x3d, 0x41, 0x4a, 0x3f, 0x2f, 0x73, 0x0b, 0xaa, 0x81, 0x81, 0x84, 0x58, 0x36, 0x99, 0xd5, + 0x1f, 0x1d, 0x3c, 0x77, 0xaf, 0xa6, 0x9a, 0x6c, 0xb2, 0x05, 0x99, 0xf7, 0xeb, 0xef, 0xad, 0x24, 0x5b, 0x7e, 0x71, + 0x27, 0xdb, 0x5f, 0xef, 0x97, 0x42, 0xc9, 0xe8, 0xcd, 0x38, 0x3b, 0xd6, 0x83, 0x72, 0xd6, 0x81, 0x40, 0x44, 0x7e, + 0x5b, 0x1d, 0x0a, 0xc4, 0x62, 0x32, 0x82, 0x32, 0x85, 0x19, 0x61, 0xdf, 0xd0, 0x5d, 0x1e, 0xc6, 0xdb, 0xb7, 0x13, + 0xd8, 0x4c, 0x2c, 0x28, 0xc0, 0x58, 0xdc, 0x4e, 0x4e, 0x27, 0xd7, 0x50, 0x09, 0xe6, 0x31, 0xc7, 0x50, 0x09, 0xc9, + 0xbd, 0x72, 0x66, 0xfd, 0x58, 0x64, 0x15, 0x35, 0x06, 0xc9, 0x95, 0x55, 0xc0, 0xb2, 0xb7, 0x90, 0x90, 0x71, 0xc8, + 0x28, 0x72, 0x02, 0xfb, 0x45, 0x6a, 0x46, 0x41, 0x49, 0xfc, 0x6f, 0xe6, 0x9e, 0xb9, 0x99, 0x7b, 0xe5, 0xc3, 0xb2, + 0x34, 0x29, 0x49, 0x56, 0x69, 0x13, 0xf4, 0x13, 0x3a, 0x7e, 0x89, 0xd8, 0xe9, 0xb4, 0x21, 0x34, 0xb0, 0xc7, 0x38, + 0x32, 0x82, 0xa9, 0x30, 0xa1, 0x7a, 0x57, 0x6f, 0x40, 0x12, 0x78, 0x80, 0xd1, 0xce, 0x44, 0x4e, 0x68, 0xe0, 0xc3, + 0xd9, 0x68, 0xe3, 0xe6, 0xe1, 0x77, 0x4e, 0x54, 0xaa, 0x85, 0x9d, 0xe5, 0xdf, 0x5b, 0x70, 0xa5, 0xfd, 0x4d, 0x40, + 0x95, 0xc0, 0xc5, 0xe4, 0xdf, 0xbf, 0xfb, 0x71, 0xe8, 0xdf, 0x2a, 0xe7, 0x8f, 0x16, 0x8b, 0x6f, 0x23, 0x3b, 0x5c, + 0x82, 0xb5, 0xae, 0x23, 0xe7, 0x22, 0x3f, 0x33, 0x1b, 0xaa, 0xe1, 0xf7, 0x43, 0xdd, 0xee, 0xe4, 0x42, 0xa9, 0x5a, + 0x7c, 0x32, 0x72, 0xdc, 0x51, 0xc9, 0x13, 0x89, 0x86, 0x58, 0xd1, 0xf2, 0x2b, 0x26, 0x9e, 0xd1, 0xf8, 0x52, 0xf1, + 0x48, 0x16, 0xee, 0x1f, 0xb9, 0xf6, 0x92, 0xa9, 0x83, 0x6c, 0xc0, 0x64, 0x64, 0xae, 0xfc, 0x76, 0xdc, 0x68, 0x1f, + 0xe6, 0x0f, 0x7f, 0xaa, 0x4f, 0xc4, 0xde, 0xff, 0x9a, 0x51, 0x76, 0xbd, 0x2c, 0x24, 0x3f, 0x61, 0xe1, 0x09, 0x7f, + 0x1c, 0xa1, 0xe0, 0xe5, 0xf4, 0xf1, 0x82, 0x38, 0x8e, 0x9e, 0x2b, 0x76, 0x20, 0x4b, 0x25, 0x2a, 0xee, 0x22, 0x48, + 0x42, 0x14, 0xe1, 0x09, 0xa0, 0xe4, 0x7d, 0x5c, 0x89, 0x4a, 0xb3, 0x98, 0x98, 0x4f, 0x46, 0x2a, 0x00, 0x67, 0x07, + 0xd1, 0xd0, 0x4a, 0xa4, 0x27, 0xea, 0x24, 0xa2, 0x21, 0x47, 0x67, 0x83, 0xfe, 0x9d, 0x78, 0x16, 0x1b, 0xa2, 0x22, + 0x40, 0x4c, 0x41, 0xd4, 0xb1, 0x15, 0x6f, 0x94, 0x81, 0x2b, 0xea, 0xa1, 0x44, 0x82, 0xd6, 0xd4, 0x19, 0xa0, 0x29, + 0x21, 0x20, 0xc7, 0x5c, 0xee, 0xa1, 0x87, 0x19, 0xa6, 0x6d, 0xb7, 0xab, 0xa8, 0x30, 0xde, 0x1f, 0xce, 0xcb, 0xa8, + 0xd4, 0x76, 0x0a, 0x44, 0xa9, 0x7a, 0x1a, 0xc6, 0x38, 0x1d, 0x2b, 0x84, 0x77, 0x01, 0xc5, 0x25, 0xc9, 0x4a, 0x8c, + 0xfa, 0x6e, 0x34, 0x6d, 0xaa, 0x11, 0x12, 0x38, 0xe9, 0xdd, 0xf4, 0x3a, 0x40, 0x49, 0x0c, 0x26, 0x58, 0x1c, 0xc1, + 0x66, 0xf0, 0xc9, 0xb1, 0x46, 0x90, 0x94, 0x50, 0xa0, 0x54, 0x99, 0xf1, 0x47, 0xad, 0xa4, 0x20, 0xf1, 0x3e, 0xfc, + 0xfc, 0x53, 0x65, 0xf1, 0xc4, 0x0a, 0x1b, 0xef, 0x63, 0x7e, 0x5f, 0xc9, 0xab, 0x1e, 0x84, 0x89, 0x07, 0xc4, 0xb7, + 0x09, 0x1c, 0x61, 0x99, 0xca, 0x65, 0x83, 0x0c, 0x05, 0x28, 0x38, 0xd5, 0x9a, 0xb3, 0x38, 0x13, 0x9b, 0x46, 0xaa, + 0x30, 0xe8, 0x11, 0x4c, 0x91, 0xfc, 0x8b, 0xb8, 0x7f, 0xdf, 0x06, 0xc4, 0xf8, 0x14, 0x1f, 0xfa, 0xc9, 0xeb, 0x9d, + 0x85, 0x2a, 0x98, 0x10, 0xf5, 0xe2, 0x3f, 0x8f, 0x97, 0xc5, 0xae, 0x1f, 0x1f, 0x36, 0x15, 0x48, 0x20, 0xf6, 0x3c, + 0x0d, 0xce, 0x7f, 0xc6, 0x2c, 0x09, 0x03, 0x69, 0x71, 0x6f, 0x4a, 0xe0, 0x4d, 0x2f, 0x58, 0x9a, 0x4d, 0x80, 0x09, + 0x52, 0x9c, 0x8c, 0xb6, 0x16, 0xac, 0x53, 0x4f, 0x8d, 0xd2, 0x99, 0x13, 0x60, 0x52, 0xa9, 0x87, 0x90, 0x9e, 0x7a, + 0x81, 0xde, 0xb1, 0xa2, 0x1f, 0xe3, 0xad, 0x86, 0xb7, 0xec, 0x6a, 0x91, 0x0a, 0x8b, 0xd0, 0x19, 0x08, 0x2e, 0x0b, + 0x4e, 0xf1, 0xfb, 0x08, 0x75, 0x0d, 0xc3, 0x9a, 0xb1, 0xc9, 0x89, 0x1a, 0x2a, 0xc8, 0xb4, 0xee, 0xe9, 0x60, 0xef, + 0x65, 0xde, 0x24, 0xcc, 0x9c, 0x0f, 0x47, 0x94, 0x6c, 0x78, 0xe3, 0x1e, 0x4f, 0x3f, 0x20, 0xdd, 0x19, 0xa4, 0x4f, + 0x30, 0x3d, 0xa6, 0x50, 0x12, 0x41, 0x73, 0x5f, 0x5e, 0x92, 0xab, 0x47, 0x87, 0xbd, 0x52, 0x37, 0xdd, 0x2f, 0xf7, + 0x72, 0xd2, 0xb8, 0x85, 0xe9, 0x2a, 0xec, 0x76, 0xf7, 0xa3, 0x7e, 0x10, 0x38, 0xea, 0xa5, 0x9a, 0x66, 0xa0, 0x66, + 0x92, 0x62, 0x67, 0xf2, 0x56, 0xca, 0x37, 0x8e, 0xa5, 0x17, 0xd4, 0x79, 0x5a, 0x33, 0x6f, 0x72, 0x9f, 0x15, 0x8a, + 0xb2, 0xc2, 0xda, 0xa1, 0x8c, 0x61, 0xa8, 0x92, 0xe1, 0x71, 0x1a, 0xc1, 0xba, 0x28, 0x8a, 0xb6, 0xe8, 0x3a, 0x73, + 0x34, 0xa7, 0x5d, 0xa5, 0x4b, 0xb2, 0xc4, 0xf7, 0xe8, 0x47, 0x13, 0x95, 0xfd, 0x25, 0x7a, 0x91, 0x5a, 0x5a, 0x99, + 0xb6, 0x77, 0xd7, 0xd4, 0xf1, 0x3b, 0x1b, 0x85, 0x3f, 0xba, 0xc1, 0x67, 0xa6, 0xf3, 0xd1, 0x06, 0x37, 0x96, 0xee, + 0x08, 0x67, 0xb0, 0x6d, 0x63, 0x3f, 0xef, 0x03, 0x46, 0x85, 0x0f, 0xa8, 0xbe, 0x9e, 0xe6, 0x1d, 0xae, 0x1d, 0x71, + 0x53, 0x5b, 0xcf, 0xff, 0x66, 0x3a, 0x07, 0xe5, 0x07, 0x7c, 0xc0, 0xa6, 0xcf, 0xf6, 0x16, 0x2c, 0x95, 0xaf, 0x3b, + 0x01, 0x63, 0x49, 0xd5, 0x55, 0x98, 0xad, 0xd9, 0xd2, 0x60, 0x80, 0xe2, 0x22, 0x3f, 0x73, 0x2a, 0x88, 0x70, 0x89, + 0x4c, 0x70, 0x03, 0x45, 0x1f, 0x50, 0x42, 0x99, 0xb1, 0x08, 0x0f, 0xc6, 0x57, 0x98, 0x48, 0x8c, 0xf4, 0x27, 0x14, + 0xc6, 0xe3, 0x8e, 0x7f, 0x7e, 0xce, 0xcf, 0xbb, 0x66, 0xa7, 0xbd, 0xc2, 0xd8, 0xc4, 0xee, 0x59, 0xe8, 0xf8, 0x83, + 0x9c, 0xfd, 0xce, 0xfc, 0x45, 0x30, 0xad, 0xf3, 0x17, 0xc2, 0x7e, 0xe6, 0x44, 0x82, 0xbf, 0xf6, 0xd4, 0xf6, 0x06, + 0x62, 0x39, 0x11, 0xa5, 0x94, 0xfa, 0xc6, 0xbc, 0x55, 0x83, 0x05, 0x50, 0xc2, 0xec, 0xa7, 0x51, 0x7f, 0x6d, 0xe3, + 0x4f, 0x1d, 0x5a, 0x17, 0x4c, 0xbd, 0x16, 0x30, 0x64, 0x86, 0x11, 0x2d, 0x58, 0x13, 0x69, 0x64, 0xe6, 0x8f, 0x33, + 0xb9, 0x90, 0xf3, 0x3e, 0xf3, 0xe7, 0x19, 0x9f, 0x73, 0xea, 0xb7, 0xd5, 0xe6, 0x4a, 0xce, 0xd0, 0x5f, 0xc5, 0xb3, + 0xb7, 0x97, 0x18, 0xdd, 0xf5, 0x0e, 0x62, 0x24, 0xf6, 0x95, 0x3e, 0x9c, 0xfe, 0x73, 0x77, 0x8e, 0x5c, 0x06, 0x3c, + 0x9e, 0x8b, 0x15, 0x67, 0x7e, 0x80, 0xf2, 0x34, 0xb7, 0x36, 0x4e, 0x10, 0xa9, 0xc9, 0xd2, 0xb8, 0xf2, 0x7c, 0x2f, + 0xe3, 0x60, 0x41, 0x76, 0x6c, 0x87, 0x3d, 0xd3, 0xf7, 0xb4, 0xd7, 0xd7, 0x1e, 0xc8, 0x88, 0x3f, 0x97, 0xbe, 0x9f, + 0x40, 0x94, 0xab, 0xad, 0xa7, 0x2a, 0xaa, 0xe6, 0x5e, 0x1e, 0xac, 0xf3, 0x2b, 0x2f, 0xfd, 0xc9, 0xd3, 0x4e, 0xf7, + 0xe5, 0x6e, 0xdd, 0x80, 0x4c, 0x71, 0xa2, 0xf6, 0xc9, 0xc7, 0x0c, 0x11, 0xc5, 0xc5, 0x6f, 0x5c, 0x4f, 0xef, 0x30, + 0xe1, 0x7b, 0x5f, 0x20, 0xcb, 0x47, 0x2a, 0x71, 0xc1, 0x7a, 0x4e, 0x53, 0x63, 0xf9, 0x2e, 0xbb, 0xfd, 0xa2, 0x6d, + 0x83, 0x31, 0xe9, 0xd1, 0x8c, 0xcf, 0xfa, 0x6f, 0xac, 0x03, 0x00, 0x16, 0x7f, 0x97, 0xf8, 0x4a, 0xac, 0xe6, 0xb9, + 0xc9, 0x12, 0x5b, 0x71, 0xd5, 0x78, 0x5e, 0x27, 0x72, 0x90, 0xdd, 0x64, 0x87, 0x08, 0x4d, 0x11, 0x31, 0xed, 0xa5, + 0x7a, 0xbd, 0x41, 0xdf, 0x41, 0x84, 0x85, 0x8a, 0xea, 0x4c, 0x3f, 0x69, 0x0a, 0x33, 0x46, 0xa7, 0x23, 0x40, 0xe5, + 0x80, 0xa4, 0x2f, 0x0f, 0xbe, 0x7d, 0x25, 0x64, 0x05, 0xee, 0x72, 0xe7, 0xb2, 0x90, 0x02, 0xfb, 0xf0, 0xa1, 0xe9, + 0x6f, 0xcf, 0xf3, 0x3c, 0x57, 0x59, 0x3c, 0x8f, 0x7f, 0x92, 0x1c, 0x26, 0x26, 0xda, 0x1a, 0x45, 0x3c, 0xd1, 0x02, + 0x6f, 0x7f, 0xd1, 0x14, 0x09, 0x57, 0x95, 0xc2, 0x8a, 0x02, 0xbd, 0x6a, 0x74, 0x49, 0x50, 0xbc, 0x2b, 0x93, 0x40, + 0x67, 0x70, 0x5d, 0x32, 0x58, 0xb0, 0x3b, 0x15, 0xd2, 0x73, 0x6a, 0x2e, 0xd8, 0xce, 0x04, 0x78, 0x7d, 0x48, 0xe5, + 0xc6, 0x2c, 0x55, 0x48, 0x59, 0x54, 0xe7, 0x05, 0x78, 0xdb, 0xe3, 0xa0, 0xd5, 0x89, 0xc2, 0xde, 0x6b, 0x01, 0x68, + 0xc0, 0xf2, 0xb9, 0xcd, 0x03, 0x5b, 0x72, 0x80, 0xa6, 0x41, 0xd3, 0x31, 0x80, 0xec, 0xef, 0x7c, 0x95, 0xf4, 0xbf, + 0xbd, 0xe3, 0x4f, 0xeb, 0x16, 0x0c, 0x21, 0x63, 0x36, 0x4f, 0x9f, 0xb5, 0x68, 0x08, 0x14, 0x6f, 0xa3, 0x48, 0xc4, + 0x9f, 0x59, 0xab, 0x2a, 0x0d, 0x0c, 0xb9, 0x0e, 0x83, 0x5a, 0xa5, 0x9d, 0xcc, 0x99, 0x96, 0x59, 0xa9, 0x53, 0xb5, + 0xb0, 0x7b, 0x80, 0x0a, 0x3c, 0xa8, 0xde, 0x4b, 0x0d, 0x2a, 0x07, 0x18, 0x8a, 0xe2, 0xa2, 0x0c, 0x9d, 0x8a, 0x7b, + 0xfa, 0x3e, 0x4f, 0xb1, 0x09, 0xff, 0xf9, 0xb2, 0xf2, 0x8d, 0xe7, 0x20, 0x5e, 0x4a, 0xff, 0xb9, 0x53, 0x7e, 0x8c, + 0xbc, 0x86, 0xfa, 0xea, 0x2a, 0x0a, 0x73, 0x3c, 0x62, 0xbc, 0xb3, 0x31, 0x34, 0x02, 0xb1, 0x94, 0xe2, 0x09, 0xe1, + 0xc5, 0x36, 0x0a, 0x3e, 0x87, 0x0a, 0xb4, 0x19, 0x01, 0x58, 0xb8, 0xbb, 0x16, 0xfc, 0xcb, 0xd7, 0x90, 0xbf, 0x57, + 0x3c, 0xa2, 0xa9, 0x4c, 0x6e, 0x57, 0xa7, 0xec, 0x6b, 0xb8, 0xc2, 0xe8, 0xed, 0xfb, 0xbe, 0x5e, 0xe6, 0xeb, 0x4e, + 0xff, 0xe1, 0x13, 0x3e, 0x76, 0xa7, 0xfd, 0x65, 0xe7, 0x61, 0x9d, 0x91, 0x7f, 0x3c, 0x36, 0x79, 0x1b, 0xd6, 0xb4, + 0x1b, 0xec, 0x65, 0x8f, 0x89, 0xc3, 0x4c, 0x3c, 0x14, 0xe3, 0xdf, 0x16, 0x15, 0x38, 0xe6, 0x85, 0x06, 0x52, 0x6b, + 0x7f, 0x4e, 0x1f, 0xff, 0xaa, 0xb0, 0x43, 0xcc, 0x0e, 0xac, 0x04, 0x81, 0xee, 0x7b, 0x05, 0x6e, 0x29, 0x5d, 0x0a, + 0xb4, 0xf5, 0x68, 0x51, 0x2e, 0xae, 0xef, 0x01, 0x21, 0xb5, 0xb6, 0x59, 0xd5, 0x65, 0xa2, 0x71, 0x29, 0x8e, 0x57, + 0xa7, 0x3e, 0xfa, 0x03, 0x2d, 0xf6, 0xd9, 0xc5, 0x16, 0x9a, 0x5a, 0x88, 0x33, 0x71, 0x36, 0x2e, 0xb8, 0x19, 0x37, + 0xeb, 0xce, 0x81, 0x0a, 0x7d, 0x35, 0x18, 0xca, 0x92, 0xd0, 0xda, 0xc0, 0x10, 0x4c, 0x2b, 0x37, 0x58, 0x14, 0x25, + 0xdd, 0x51, 0x2f, 0x8e, 0xb6, 0x0d, 0x2e, 0xdc, 0x46, 0x8c, 0x72, 0xbc, 0x65, 0x7f, 0x81, 0x2a, 0x61, 0xfe, 0x92, + 0x59, 0xe4, 0x5d, 0x93, 0xce, 0x9f, 0x23, 0x3b, 0x10, 0xb3, 0xd4, 0x96, 0xb5, 0x5a, 0x85, 0x9b, 0x09, 0xf9, 0xa6, + 0x7b, 0x8a, 0x42, 0x81, 0x6d, 0x53, 0xb9, 0x8b, 0xff, 0x3d, 0xe2, 0x6a, 0xe7, 0x1c, 0xf9, 0x37, 0x9b, 0xe6, 0xb9, + 0x9e, 0x89, 0x03, 0xa2, 0x9c, 0xae, 0x82, 0x99, 0xc3, 0x70, 0xc7, 0x3d, 0xf5, 0xf3, 0x22, 0x3d, 0xcf, 0xa8, 0x63, + 0x25, 0xb7, 0xef, 0xd4, 0x2f, 0xfc, 0x52, 0x3c, 0xf6, 0x0b, 0x7d, 0x61, 0xcf, 0x95, 0x78, 0x4b, 0xb7, 0x4f, 0x4e, + 0xa2, 0xd5, 0xa8, 0x9c, 0x9a, 0x76, 0xe1, 0x25, 0xd4, 0x6c, 0x6f, 0x68, 0xaf, 0xcc, 0x2d, 0x7a, 0xd9, 0x1d, 0xee, + 0x57, 0x76, 0x8a, 0x22, 0x76, 0xa5, 0x60, 0x9f, 0x56, 0xd2, 0xe3, 0x4a, 0x9c, 0x73, 0xa1, 0xb3, 0x4e, 0x2d, 0xa0, + 0x28, 0xcb, 0x00, 0x2b, 0x2f, 0x15, 0xfa, 0x6d, 0xc5, 0x13, 0x94, 0x1c, 0xa6, 0x36, 0x1b, 0x47, 0xcf, 0x7a, 0x49, + 0x25, 0xf7, 0xd5, 0x06, 0xf7, 0x92, 0x91, 0xd6, 0xde, 0xe1, 0xf2, 0xce, 0x56, 0x1f, 0xf1, 0xb4, 0x87, 0xfb, 0x8f, + 0x59, 0x81, 0x7f, 0xab, 0xca, 0xfb, 0x86, 0x31, 0x14, 0x02, 0xb5, 0xce, 0xa5, 0xd4, 0xb4, 0x49, 0xb8, 0x64, 0x10, + 0xee, 0x1d, 0xac, 0x11, 0x51, 0x27, 0xb0, 0xbf, 0x46, 0xc9, 0x6a, 0x67, 0xc0, 0xe7, 0x49, 0x88, 0x98, 0x13, 0xe5, + 0xb1, 0x7f, 0x7e, 0xb7, 0xb2, 0xc9, 0x9f, 0x98, 0x43, 0x9d, 0xa1, 0x4a, 0x58, 0x87, 0xf8, 0x83, 0xb8, 0x79, 0xd5, + 0xeb, 0xdb, 0x25, 0xca, 0xdf, 0x4c, 0x4f, 0x2c, 0xcc, 0x0a, 0x2b, 0xf8, 0x4b, 0x29, 0x5f, 0xdf, 0xf1, 0x01, 0xd4, + 0x67, 0x93, 0x1f, 0xff, 0xbc, 0xa1, 0x7b, 0xd9, 0x95, 0xff, 0x72, 0x87, 0x40, 0x31, 0xed, 0xe2, 0x70, 0x8e, 0x4b, + 0x87, 0xc2, 0xec, 0x02, 0xc3, 0xe2, 0x45, 0x55, 0x1d, 0xf0, 0xe1, 0x39, 0xe2, 0xe3, 0xf3, 0x24, 0x2e, 0x88, 0x84, + 0xd2, 0xfc, 0x79, 0x50, 0x37, 0xa3, 0xe3, 0xc2, 0x86, 0x3e, 0x38, 0x9c, 0xd1, 0x00, 0x84, 0xac, 0xb1, 0xc9, 0xf6, + 0x63, 0x95, 0x52, 0x99, 0x59, 0x3a, 0x72, 0xc7, 0xc6, 0x76, 0xb5, 0xd4, 0xe3, 0xbb, 0x7e, 0x1f, 0xee, 0x64, 0xd3, + 0xb2, 0x7e, 0xca, 0x10, 0xfb, 0xa8, 0x0b, 0xc3, 0x05, 0xc8, 0xda, 0x0f, 0xb9, 0xf6, 0x62, 0x19, 0xdb, 0x80, 0x3e, + 0xc4, 0xfe, 0xa7, 0x5d, 0x9c, 0xd1, 0xad, 0xf0, 0xb1, 0x58, 0xb4, 0x3a, 0xdb, 0x90, 0x24, 0x07, 0x46, 0x73, 0x48, + 0x30, 0x6e, 0x44, 0x68, 0x1b, 0x94, 0xe0, 0xb1, 0x62, 0x0a, 0x37, 0xe2, 0xfe, 0x38, 0x58, 0x68, 0x55, 0xd1, 0x8d, + 0xb9, 0x8d, 0x6d, 0x14, 0x67, 0xf0, 0xf5, 0x80, 0x7f, 0x15, 0x65, 0x7c, 0x80, 0xbb, 0x41, 0xe4, 0xce, 0x9e, 0x97, + 0x92, 0x48, 0x2d, 0xa7, 0xdb, 0x56, 0x6c, 0xe7, 0x97, 0xd8, 0xed, 0x82, 0x3d, 0x5f, 0x16, 0xe6, 0xcc, 0xd6, 0x20, + 0x33, 0x8c, 0xbd, 0xb7, 0xc0, 0xbb, 0x6d, 0x29, 0x4c, 0x76, 0xe9, 0x1b, 0xa8, 0x84, 0x56, 0xe7, 0xa3, 0xc3, 0x78, + 0x53, 0x07, 0xae, 0xe2, 0x78, 0x1a, 0xdb, 0x56, 0x62, 0x34, 0x46, 0x1e, 0xc9, 0x30, 0x95, 0xe1, 0x10, 0x7f, 0x24, + 0xbb, 0x29, 0x37, 0xd3, 0xa5, 0xce, 0x2e, 0x0d, 0x10, 0x74, 0x85, 0x55, 0x0f, 0x85, 0x24, 0x11, 0x70, 0xcb, 0x15, + 0xc8, 0xc3, 0x70, 0x3f, 0xaf, 0xc6, 0xc8, 0xe1, 0x6c, 0x81, 0xd0, 0xf0, 0xb2, 0x51, 0x90, 0x39, 0xf1, 0xed, 0x21, + 0xf1, 0x72, 0x6a, 0x7a, 0xc7, 0x11, 0x0f, 0x86, 0xea, 0x36, 0x0f, 0x5e, 0x8e, 0xaa, 0x4e, 0x67, 0xe9, 0x91, 0x70, + 0x4b, 0xe7, 0x59, 0x49, 0xca, 0x51, 0x35, 0x05, 0x7a, 0x8e, 0x34, 0x1a, 0xca, 0x5b, 0x5b, 0x29, 0x81, 0x55, 0xd0, + 0x32, 0x39, 0xfd, 0xbc, 0x23, 0x12, 0x91, 0x70, 0x21, 0xa0, 0xf8, 0xcb, 0x28, 0xa4, 0xd1, 0x5b, 0xcd, 0xc7, 0x30, + 0xc8, 0x70, 0x9d, 0x57, 0x5c, 0x0a, 0xfe, 0xf8, 0xc5, 0x01, 0xf4, 0x50, 0x94, 0x0d, 0xdc, 0x2f, 0x16, 0xfe, 0xcc, + 0x2e, 0x46, 0xf4, 0x36, 0x9b, 0xa1, 0xba, 0xcd, 0xe8, 0x27, 0xd6, 0xe7, 0x95, 0x22, 0x76, 0xcf, 0x0e, 0xed, 0xc1, + 0x8e, 0x19, 0x59, 0x5d, 0x25, 0x1d, 0xcd, 0x04, 0x99, 0xf4, 0x32, 0xf2, 0x0c, 0x41, 0x84, 0x0e, 0xd8, 0x27, 0x87, + 0x36, 0x4a, 0x87, 0xf9, 0x0a, 0xc2, 0x3f, 0xc7, 0x7c, 0x0e, 0x89, 0x6e, 0x76, 0x09, 0x8e, 0x7a, 0x8d, 0x48, 0x3a, + 0x89, 0x50, 0x04, 0x5e, 0xc8, 0x7a, 0x22, 0x98, 0x78, 0x41, 0xef, 0x26, 0xb8, 0xe2, 0xc5, 0xd1, 0x4d, 0x07, 0xcb, + 0x61, 0x46, 0xfc, 0x1b, 0x13, 0x46, 0xee, 0x12, 0xe2, 0xdb, 0x03, 0x84, 0x3b, 0xd8, 0x29, 0x88, 0xea, 0xe5, 0x56, + 0x9b, 0x5e, 0x9c, 0xa2, 0x9e, 0xc7, 0xf9, 0x78, 0x36, 0xd6, 0x91, 0x17, 0x72, 0x38, 0x5b, 0xc4, 0x30, 0x40, 0x16, + 0xc2, 0x93, 0x9b, 0x76, 0x97, 0x10, 0x90, 0x9c, 0x4c, 0x65, 0x59, 0xde, 0xc4, 0x4d, 0x27, 0x60, 0x91, 0xe7, 0x76, + 0x69, 0x4a, 0xf1, 0xf4, 0x9f, 0xaa, 0xb1, 0x0d, 0x67, 0x8b, 0x8c, 0x63, 0xd0, 0x62, 0x95, 0xce, 0x20, 0x10, 0x17, + 0xe5, 0x46, 0x4b, 0x2f, 0x0e, 0x73, 0xb8, 0xf9, 0xf7, 0xb8, 0xbc, 0x8d, 0x09, 0x20, 0x1f, 0xbc, 0x49, 0x3a, 0x40, + 0xcf, 0xf2, 0x7c, 0xce, 0xd0, 0x4b, 0x6f, 0x73, 0x91, 0x4c, 0x84, 0xff, 0xd3, 0xc9, 0x47, 0xa2, 0x1c, 0xe9, 0x15, + 0x72, 0x9c, 0x50, 0x51, 0xb2, 0x9d, 0x10, 0xd5, 0xcb, 0xc3, 0x7f, 0x61, 0xd5, 0x11, 0x02, 0xe7, 0xdb, 0x84, 0x2f, + 0x5f, 0x6e, 0xf9, 0xc1, 0xd7, 0x97, 0xec, 0x44, 0x28, 0xe5, 0x1f, 0x18, 0x87, 0x98, 0x56, 0x32, 0xb1, 0x63, 0x40, + 0x64, 0x7a, 0x58, 0xc0, 0x72, 0xe0, 0x66, 0xe4, 0xf1, 0xe3, 0xd6, 0x38, 0xd3, 0x14, 0x9f, 0xab, 0xff, 0x9f, 0xd8, + 0x7a, 0x10, 0xd7, 0x6e, 0x2f, 0x8d, 0x48, 0x62, 0x1a, 0xa3, 0x01, 0xf3, 0x8a, 0x06, 0x68, 0x9c, 0x94, 0x01, 0xc3, + 0x5e, 0x59, 0xfa, 0x85, 0x1e, 0x63, 0x93, 0x47, 0xaa, 0x99, 0x98, 0x1f, 0x21, 0x64, 0xbb, 0x46, 0xc1, 0x44, 0x12, + 0x8c, 0xf6, 0x2d, 0x50, 0xd8, 0x81, 0x14, 0x53, 0xdd, 0x01, 0xf9, 0x9c, 0xcb, 0xc8, 0x6b, 0x20, 0x1b, 0x7d, 0xbe, + 0xb9, 0xd7, 0xaf, 0x13, 0xfb, 0xd2, 0xa3, 0x39, 0x84, 0x48, 0x23, 0xf2, 0xfb, 0xf0, 0xfe, 0x58, 0xaf, 0x99, 0x77, + 0xbd, 0xca, 0x14, 0x2f, 0xc1, 0xc8, 0x07, 0x37, 0x96, 0x90, 0x0f, 0x1a, 0xac, 0x02, 0x73, 0xf2, 0x35, 0xaa, 0xb5, + 0x43, 0xcc, 0xce, 0xf3, 0x26, 0x47, 0xde, 0x76, 0x75, 0x54, 0x51, 0x58, 0xad, 0xc0, 0xf9, 0x55, 0x03, 0xad, 0xc4, + 0x07, 0xf2, 0x2f, 0x43, 0xa2, 0x8a, 0x09, 0x61, 0x80, 0x1e, 0x19, 0xe7, 0x1f, 0x84, 0x28, 0xe8, 0x32, 0xa9, 0x5a, + 0x36, 0xfb, 0x97, 0x9a, 0xc3, 0x55, 0x60, 0x04, 0xec, 0x36, 0xa6, 0x31, 0x8d, 0xe7, 0xe3, 0x28, 0x66, 0xd6, 0xbc, + 0x2b, 0x89, 0xaf, 0x70, 0x2e, 0x08, 0x2a, 0xac, 0xe1, 0xbe, 0xcb, 0xff, 0xfd, 0x7c, 0xfc, 0x90, 0x97, 0x62, 0xe7, + 0xd7, 0xe5, 0x1a, 0xfa, 0x61, 0xff, 0x75, 0x29, 0x56, 0xbd, 0x49, 0x2d, 0x7a, 0x37, 0x9a, 0x36, 0x8e, 0xff, 0x7c, + 0x76, 0xb1, 0x91, 0x4e, 0xef, 0x78, 0xcb, 0x7b, 0xd0, 0x37, 0xa7, 0xe9, 0x69, 0x5c, 0xe0, 0xe7, 0x2c, 0x2f, 0x67, + 0xff, 0x95, 0xbb, 0x94, 0xc7, 0xf5, 0x7b, 0x76, 0xdd, 0xa1, 0x39, 0xad, 0xbd, 0xb1, 0xec, 0xdd, 0xb3, 0x2b, 0xfe, + 0x1e, 0x81, 0x2c, 0xbe, 0x08, 0xc9, 0xa4, 0x52, 0x09, 0x20, 0xd0, 0x5c, 0x0f, 0x7e, 0xf7, 0xc4, 0x28, 0xa5, 0x1e, + 0xef, 0x3f, 0x26, 0x5f, 0x95, 0x75, 0xb8, 0x3b, 0xb7, 0x40, 0xd6, 0x23, 0xfd, 0x3b, 0x4f, 0x37, 0xba, 0x5f, 0xd0, + 0xa8, 0x3a, 0x75, 0x90, 0x19, 0x8d, 0x33, 0x2d, 0x0d, 0xf9, 0xb7, 0x8d, 0xe6, 0x8c, 0xc2, 0xb7, 0x82, 0x46, 0x74, + 0x13, 0xe1, 0x1f, 0x57, 0x8d, 0x03, 0x4a, 0x0a, 0xf8, 0x61, 0x9b, 0xf6, 0x6d, 0xf7, 0x72, 0x2f, 0xa4, 0xa9, 0xf2, + 0xcb, 0x33, 0x16, 0x18, 0xb4, 0x0f, 0x74, 0x66, 0x47, 0xff, 0x7f, 0x0a, 0x68, 0xbd, 0x88, 0x51, 0xb2, 0x95, 0x3a, + 0x40, 0x5c, 0x6c, 0xe3, 0xe6, 0x0b, 0xbd, 0x71, 0x9a, 0x0b, 0x67, 0x1e, 0xf5, 0xe8, 0x24, 0xdd, 0x02, 0x18, 0xd5, + 0xfc, 0x7e, 0xc4, 0xab, 0x53, 0x57, 0x46, 0x7c, 0x54, 0xbc, 0xa3, 0xbb, 0x0b, 0xcc, 0xf6, 0xbf, 0xf2, 0x2e, 0x46, + 0x34, 0x7f, 0xf7, 0x11, 0xe8, 0x86, 0x1f, 0xb3, 0xd3, 0x37, 0x9f, 0xf9, 0xe3, 0x03, 0x3e, 0x0c, 0xed, 0x1e, 0xa3, + 0x79, 0x67, 0xdc, 0x9a, 0x27, 0x3c, 0x31, 0xc8, 0x0c, 0xe0, 0xb2, 0xcf, 0xde, 0x7b, 0x2c, 0xe3, 0xc0, 0x77, 0x20, + 0x56, 0x26, 0xf3, 0x16, 0x30, 0x29, 0x17, 0x23, 0xa4, 0x35, 0x32, 0xfa, 0x37, 0xe0, 0x45, 0xc9, 0xe8, 0x9f, 0xce, + 0x3d, 0x8a, 0x6e, 0x48, 0xf4, 0xc9, 0x93, 0x01, 0xcb, 0x3a, 0x28, 0x5a, 0x62, 0x52, 0x21, 0x3a, 0x84, 0x2c, 0x13, + 0xa0, 0xf4, 0x49, 0xa0, 0xa1, 0xf0, 0x77, 0x2d, 0x27, 0xbd, 0x9f, 0x7b, 0x66, 0x82, 0xa4, 0xc7, 0xe4, 0x28, 0x8d, + 0x4c, 0x18, 0xf9, 0x73, 0xcd, 0xcb, 0xeb, 0xeb, 0xa7, 0x76, 0x7b, 0xd0, 0x7c, 0x64, 0xbf, 0x95, 0xe6, 0xc4, 0xe4, + 0x6b, 0xad, 0x06, 0x2b, 0x79, 0x03, 0x28, 0x9b, 0x7d, 0x41, 0x2b, 0x60, 0xf1, 0x5b, 0x0d, 0x61, 0xe9, 0x99, 0x0c, + 0xb4, 0x06, 0x4e, 0xd2, 0x73, 0x36, 0xb8, 0x6e, 0x98, 0x1f, 0x91, 0x5e, 0xaf, 0x98, 0xa8, 0x32, 0xa7, 0x27, 0x7d, + 0xba, 0xb9, 0x1e, 0x7b, 0xb1, 0xd0, 0x87, 0xd4, 0x13, 0xfa, 0x93, 0x17, 0xe1, 0x6c, 0xf9, 0xb9, 0xec, 0x3f, 0x4d, + 0x20, 0x75, 0xd5, 0x18, 0x2d, 0x74, 0x7e, 0x3d, 0xbe, 0x9b, 0x35, 0x3e, 0x1a, 0xd9, 0xea, 0x6d, 0xbb, 0x73, 0x64, + 0xb9, 0x77, 0x8b, 0x59, 0x5f, 0x42, 0x3e, 0xa3, 0x58, 0x33, 0x99, 0x83, 0x9c, 0x23, 0xb4, 0xbf, 0xd6, 0x95, 0xe4, + 0xb8, 0xf6, 0x61, 0x4e, 0x41, 0x7a, 0x6c, 0x0d, 0xeb, 0x20, 0x6a, 0xbe, 0xad, 0x7d, 0x06, 0x2d, 0xbf, 0x9e, 0x7a, + 0x9d, 0x16, 0x4c, 0xf2, 0xa4, 0x73, 0x5f, 0xf7, 0x8f, 0x34, 0xe2, 0x5e, 0x7a, 0x59, 0x13, 0x45, 0xb7, 0x48, 0x40, + 0xd7, 0x2a, 0x2d, 0xf4, 0xb2, 0xe2, 0x3c, 0xad, 0xe8, 0x4f, 0x33, 0xe6, 0x51, 0xc9, 0xaa, 0x51, 0xa9, 0x9e, 0x5c, + 0x63, 0x9c, 0x29, 0xeb, 0x09, 0x20, 0x17, 0x45, 0x02, 0xc7, 0x59, 0x6f, 0xd7, 0xa7, 0x4b, 0x43, 0x07, 0xf1, 0xd1, + 0xdb, 0xb8, 0xe9, 0xbc, 0x83, 0x69, 0x2c, 0xdd, 0x9f, 0x48, 0x67, 0x19, 0xc3, 0x89, 0x2a, 0x4b, 0xf2, 0xb4, 0x1c, + 0x85, 0xba, 0xa3, 0xbb, 0x20, 0x29, 0x4b, 0xf6, 0x46, 0x3b, 0xfb, 0xe3, 0x7a, 0xf2, 0x28, 0xfb, 0x30, 0xec, 0xa1, + 0x0a, 0xdc, 0x43, 0xaa, 0xef, 0x72, 0xff, 0xba, 0xcc, 0x94, 0xa6, 0xc1, 0xfe, 0xc7, 0xd7, 0xa1, 0x03, 0x3f, 0x0e, + 0x6e, 0xc7, 0x11, 0x12, 0x28, 0xb7, 0x98, 0xa6, 0x0c, 0x5b, 0x4e, 0x30, 0xd9, 0xee, 0x0d, 0x37, 0xc5, 0xd5, 0x9e, + 0x4b, 0x14, 0x83, 0x25, 0xf7, 0xc0, 0xcb, 0x67, 0xb4, 0x7f, 0x62, 0xeb, 0x26, 0xe6, 0xa9, 0x6b, 0xe1, 0xa3, 0xd4, + 0xc2, 0x34, 0x74, 0x60, 0xb0, 0xc8, 0x59, 0x92, 0x8c, 0x04, 0xbb, 0xfc, 0xd2, 0x6a, 0x27, 0xcf, 0x72, 0x25, 0xd3, + 0xd7, 0x5e, 0x4f, 0x4c, 0x31, 0xd2, 0xb0, 0xa5, 0xed, 0x70, 0xd8, 0xc9, 0x79, 0x02, 0x22, 0x44, 0x54, 0xcf, 0x97, + 0xb8, 0xa6, 0xbe, 0x10, 0x67, 0xdd, 0xf9, 0x32, 0x56, 0xb4, 0xe7, 0x41, 0x01, 0x08, 0xad, 0x36, 0xad, 0x54, 0x17, + 0xdc, 0xd0, 0x23, 0x48, 0x77, 0xeb, 0xe5, 0x1d, 0x14, 0x55, 0xcd, 0xf4, 0x60, 0xd2, 0x8b, 0x1f, 0xe7, 0x5d, 0xe1, + 0x61, 0x16, 0x19, 0x2a, 0x80, 0x1b, 0xa3, 0xef, 0xe0, 0x72, 0x7d, 0xcf, 0x43, 0xb8, 0xb5, 0xe6, 0x4c, 0xcf, 0x4f, + 0x5b, 0x8f, 0x78, 0xf1, 0xe6, 0x61, 0x1c, 0xc2, 0x5d, 0x6c, 0x7d, 0xfa, 0x24, 0x5f, 0x3b, 0x6c, 0xe7, 0xd1, 0xa2, + 0xd0, 0xd6, 0xe5, 0xd4, 0xf6, 0xe2, 0xce, 0xe7, 0xf9, 0x27, 0xb5, 0x05, 0xca, 0x0a, 0xbc, 0xf6, 0xea, 0x3e, 0x22, + 0x14, 0x73, 0x07, 0xdf, 0xfe, 0x2f, 0x1d, 0xb5, 0xdd, 0x7c, 0xde, 0x0e, 0x67, 0x46, 0x0f, 0xcf, 0x48, 0x88, 0xba, + 0x3c, 0xd8, 0x24, 0xd7, 0xaf, 0xfe, 0xe9, 0x29, 0x7e, 0xa5, 0x9d, 0xe6, 0x5f, 0x73, 0xce, 0x0b, 0x63, 0x53, 0x3e, + 0xdb, 0x47, 0x9a, 0x30, 0xba, 0x46, 0x84, 0xcb, 0xef, 0xdb, 0xd0, 0x4a, 0x83, 0x8c, 0x48, 0x08, 0x79, 0xbd, 0x75, + 0x05, 0xb8, 0xef, 0x2f, 0xdb, 0x1d, 0xbc, 0xa5, 0x44, 0xe2, 0x8d, 0xea, 0x38, 0x6e, 0xcf, 0xc8, 0xc2, 0xf5, 0xfd, + 0x5b, 0x07, 0x82, 0x7d, 0xad, 0x7d, 0x25, 0xbf, 0xdc, 0x39, 0x7a, 0x01, 0x06, 0x94, 0x30, 0x84, 0x27, 0x51, 0xff, + 0x97, 0xd8, 0x88, 0xd4, 0x6d, 0xc6, 0x74, 0xc2, 0x84, 0xfd, 0x59, 0xd1, 0xaa, 0xad, 0xf4, 0x00, 0x28, 0xa6, 0x4e, + 0xae, 0x06, 0x51, 0x74, 0x87, 0x26, 0xe2, 0x8e, 0x39, 0x5a, 0xde, 0x13, 0x9a, 0xb5, 0x40, 0x15, 0x4e, 0x61, 0xcf, + 0xa3, 0x50, 0x9a, 0xe1, 0x19, 0xf4, 0x01, 0xf6, 0x52, 0x84, 0x9c, 0xb9, 0x24, 0x79, 0xe6, 0xc0, 0x6b, 0x13, 0x04, + 0x69, 0x74, 0xb7, 0x7a, 0x4a, 0xb1, 0x8b, 0x6c, 0xb7, 0x20, 0xe9, 0xcd, 0x22, 0x74, 0x2b, 0x56, 0x49, 0x8a, 0xbb, + 0x99, 0x8a, 0xad, 0x0e, 0x1e, 0x61, 0x8f, 0x48, 0xdf, 0x96, 0xfd, 0xbd, 0x75, 0xc0, 0x42, 0x17, 0x45, 0x4d, 0x4a, + 0xed, 0xbf, 0x29, 0x1d, 0x38, 0xa1, 0x86, 0x09, 0x05, 0x05, 0xfb, 0x6c, 0xdc, 0x62, 0xbc, 0x7b, 0x6b, 0x6d, 0x6f, + 0x21, 0xf0, 0x2a, 0x34, 0x37, 0xd5, 0x82, 0x5c, 0xe1, 0x0b, 0x64, 0xc9, 0xb5, 0x15, 0x42, 0xd7, 0x37, 0x2d, 0xbb, + 0xf0, 0xfc, 0xc2, 0xf4, 0xc7, 0x56, 0x29, 0xea, 0x52, 0x90, 0x4b, 0x38, 0xb5, 0xb2, 0x46, 0x57, 0x1f, 0xd8, 0x9a, + 0x8e, 0x51, 0xbb, 0x33, 0xce, 0x5e, 0x21, 0x90, 0xfc, 0x89, 0x4a, 0x9d, 0x53, 0x9a, 0x11, 0x18, 0x5e, 0x0f, 0x8a, + 0xd5, 0x2f, 0xb9, 0x16, 0x30, 0x0e, 0x0f, 0xf4, 0xc7, 0xa0, 0x48, 0x9e, 0x64, 0x62, 0x0e, 0x03, 0x4f, 0xe5, 0xb0, + 0x73, 0xcf, 0xe9, 0x4e, 0xe6, 0xf7, 0xbe, 0xb1, 0xb7, 0xc7, 0xae, 0xe3, 0x96, 0x31, 0x3f, 0x8c, 0x20, 0x6a, 0x25, + 0xc2, 0x48, 0x45, 0x1e, 0x31, 0x80, 0x12, 0x4e, 0xae, 0x1b, 0x70, 0xa8, 0xa9, 0x36, 0xdc, 0xa7, 0xe8, 0x08, 0xcc, + 0xa9, 0xcb, 0x34, 0xaa, 0x39, 0x55, 0x99, 0x20, 0x84, 0xcf, 0x8d, 0x5b, 0xe7, 0x78, 0x02, 0x33, 0xed, 0x80, 0xd5, + 0x26, 0xaf, 0x53, 0x1c, 0x84, 0xcc, 0xd4, 0x9d, 0x2d, 0x1a, 0x13, 0x49, 0x4d, 0xb5, 0x4b, 0xad, 0x05, 0xe3, 0x64, + 0xb3, 0x6b, 0xd4, 0x6e, 0x2b, 0x32, 0xb8, 0x88, 0x15, 0x0f, 0x64, 0x04, 0x38, 0xba, 0x96, 0x6b, 0x94, 0x27, 0x47, + 0x5a, 0x10, 0xe6, 0x26, 0x39, 0x8e, 0x98, 0xb6, 0x7f, 0xdc, 0x8d, 0xe8, 0x66, 0x9e, 0x99, 0x8a, 0xc3, 0x5f, 0xbd, + 0xe7, 0xb6, 0x5e, 0x59, 0x2a, 0xd6, 0xf3, 0x2c, 0x25, 0xeb, 0x95, 0xcf, 0x2c, 0xa5, 0x21, 0xb9, 0xb0, 0x16, 0xd8, + 0x6c, 0x9a, 0xa5, 0xd9, 0x72, 0x7a, 0xde, 0xb9, 0x45, 0x66, 0x5e, 0xf0, 0x08, 0x53, 0xde, 0xae, 0xbc, 0x44, 0x67, + 0x03, 0xf6, 0x3f, 0xfb, 0x7c, 0x09, 0x9a, 0x19, 0x2b, 0x34, 0xc7, 0xbb, 0xc2, 0x1c, 0x12, 0x59, 0x61, 0xd4, 0x8f, + 0x4b, 0xf9, 0xec, 0x5d, 0x70, 0xda, 0x6a, 0xe7, 0x46, 0x05, 0x85, 0xef, 0x4d, 0x52, 0x60, 0x22, 0x09, 0x6c, 0x72, + 0x34, 0xee, 0x83, 0xf3, 0xac, 0x9c, 0xe9, 0x97, 0x03, 0x04, 0xff, 0x89, 0x6d, 0xc6, 0x35, 0x27, 0x30, 0x77, 0x06, + 0x77, 0x4a, 0xa8, 0x6e, 0x88, 0xe1, 0xf5, 0xd9, 0x75, 0x4e, 0x56, 0x1c, 0x73, 0x4b, 0xb2, 0x10, 0xe0, 0xb5, 0x07, + 0xb7, 0xcf, 0x33, 0x6b, 0x71, 0xa7, 0xe2, 0x34, 0xd4, 0x66, 0x5f, 0xfa, 0xcc, 0xd7, 0x83, 0x5f, 0x8d, 0x1c, 0x65, + 0x5c, 0xe0, 0x66, 0xd7, 0x8b, 0x81, 0x21, 0x34, 0x9e, 0x05, 0xe8, 0x11, 0x4f, 0xe9, 0xbf, 0x80, 0x10, 0xbf, 0x1b, + 0xfc, 0x2a, 0x33, 0x83, 0xd5, 0xd7, 0x2a, 0x06, 0x89, 0x9e, 0x64, 0x42, 0x81, 0x91, 0x61, 0xe8, 0xba, 0x2a, 0x8b, + 0x84, 0x37, 0xbc, 0xd8, 0xcd, 0xee, 0xcd, 0x98, 0x3f, 0x60, 0xa8, 0x43, 0xf8, 0x25, 0xb1, 0x27, 0xe6, 0x39, 0x9c, + 0x6a, 0xe6, 0x65, 0x76, 0x56, 0x45, 0x63, 0xbd, 0x59, 0xe3, 0x89, 0x09, 0xd5, 0x87, 0x68, 0xdb, 0x37, 0xc5, 0xdc, + 0x6e, 0xf7, 0xd6, 0x87, 0xd3, 0x44, 0x8d, 0x98, 0x99, 0x9a, 0x8f, 0xfb, 0xc6, 0x0a, 0x69, 0x33, 0x52, 0x64, 0x12, + 0xaa, 0x0c, 0x56, 0xc2, 0xc8, 0x3d, 0xbd, 0x6d, 0x75, 0x74, 0x5a, 0x00, 0x4e, 0x34, 0xcb, 0xdb, 0x4a, 0x64, 0xa3, + 0xbd, 0xb6, 0x1b, 0x85, 0xa8, 0x17, 0x3d, 0x9e, 0x51, 0x28, 0x15, 0x37, 0x34, 0x70, 0x6e, 0x06, 0x02, 0x4b, 0x3f, + 0xc5, 0x4b, 0xd8, 0x8b, 0xae, 0x3d, 0x6b, 0xc2, 0xb5, 0x51, 0x7b, 0x87, 0xb4, 0xac, 0x54, 0x4b, 0xd9, 0x77, 0x8e, + 0x74, 0xe3, 0x85, 0xaa, 0x97, 0xb9, 0xd0, 0xb9, 0xda, 0x4f, 0x7c, 0x6c, 0x1b, 0x23, 0x4d, 0xed, 0x9a, 0xfe, 0x66, + 0xce, 0x36, 0xd7, 0x99, 0xac, 0x90, 0x1f, 0x2c, 0x43, 0xfe, 0x04, 0xe9, 0xb6, 0x91, 0x4d, 0xac, 0xc4, 0xfa, 0x85, + 0x1f, 0xf0, 0x0e, 0x3a, 0x67, 0x2d, 0x3b, 0xb0, 0x36, 0xdb, 0x2e, 0x58, 0x26, 0x3f, 0x58, 0xae, 0x5d, 0xe3, 0x37, + 0x7c, 0x08, 0x57, 0xb2, 0x3a, 0x97, 0x9d, 0xec, 0x3d, 0xfe, 0x45, 0xfd, 0xf2, 0xfb, 0x19, 0x3d, 0x8b, 0x0f, 0x96, + 0x35, 0xde, 0x4c, 0x9f, 0xb2, 0x32, 0xfb, 0xc5, 0xed, 0x5b, 0x8b, 0x8f, 0x37, 0x97, 0x36, 0x38, 0x8f, 0x61, 0x68, + 0xef, 0xc5, 0xdd, 0x83, 0xfa, 0xc3, 0x70, 0x56, 0x4e, 0xd0, 0x6a, 0x18, 0x19, 0xe0, 0xce, 0xd6, 0xf3, 0x05, 0xbd, + 0xc7, 0xc6, 0x4c, 0x1f, 0xee, 0xf9, 0xd0, 0xbb, 0xfc, 0xc7, 0xcb, 0x7e, 0x24, 0x9c, 0x3d, 0x3a, 0xbb, 0x40, 0xd0, + 0x5a, 0xd7, 0x56, 0x4a, 0xf5, 0x98, 0xd7, 0x2e, 0x8e, 0xd0, 0x92, 0x3d, 0x2f, 0x75, 0x34, 0xff, 0xd0, 0x2a, 0x87, + 0x0d, 0x1a, 0x63, 0xf5, 0xbe, 0xd5, 0x96, 0x46, 0x6f, 0x3f, 0x10, 0x16, 0xa6, 0xa1, 0x52, 0x81, 0x80, 0x4a, 0xff, + 0xcc, 0x26, 0x5c, 0x7b, 0x9b, 0xc9, 0x28, 0x7d, 0x8a, 0x30, 0x7b, 0xd4, 0x93, 0xc5, 0xfb, 0x8e, 0x9d, 0xac, 0xd5, + 0x1b, 0xca, 0x74, 0x58, 0x69, 0x33, 0x59, 0xa9, 0x11, 0x46, 0x0c, 0x33, 0x9b, 0xe1, 0x85, 0x2a, 0xa7, 0xc3, 0xae, + 0x04, 0x81, 0xa9, 0xda, 0x78, 0xe2, 0xdc, 0xc1, 0xf3, 0xdf, 0xb2, 0x3e, 0x40, 0x8c, 0xe9, 0xe1, 0xc4, 0xde, 0x81, + 0x2e, 0xb5, 0x8b, 0x27, 0xfc, 0xcb, 0xdf, 0x92, 0x43, 0xb0, 0x42, 0xb5, 0xf1, 0xfd, 0x00, 0xd6, 0xd7, 0x20, 0xe6, + 0x6d, 0x77, 0xe2, 0xe0, 0x8e, 0x5d, 0x59, 0x3e, 0xcd, 0xcb, 0x03, 0x88, 0x52, 0x36, 0x72, 0xb3, 0x61, 0xcd, 0xaf, + 0x66, 0x16, 0xbb, 0x36, 0x9e, 0x1f, 0xc8, 0xfa, 0xb0, 0xcd, 0x9f, 0x0b, 0x90, 0xa2, 0x28, 0xd0, 0x96, 0xbb, 0xda, + 0xa2, 0x8d, 0x80, 0x69, 0xd7, 0x3a, 0x6f, 0x6d, 0x21, 0xeb, 0xa4, 0x76, 0xca, 0xa0, 0x2b, 0x65, 0x8a, 0x9c, 0x9a, + 0x51, 0x23, 0x44, 0xc7, 0xf8, 0x41, 0x0e, 0xfd, 0x62, 0xf5, 0xdd, 0xf5, 0x3b, 0x5d, 0x80, 0xb8, 0xe2, 0x54, 0xe6, + 0x59, 0x49, 0xac, 0x0f, 0x37, 0x79, 0xcf, 0x1b, 0xf4, 0xbf, 0xd4, 0x95, 0xef, 0xcb, 0xda, 0x13, 0x24, 0x03, 0x41, + 0x3a, 0x0e, 0xfe, 0x18, 0xc0, 0xf0, 0xc7, 0x06, 0x46, 0x2f, 0x7a, 0x78, 0x1e, 0x54, 0xbf, 0x76, 0xc2, 0x77, 0x96, + 0x5f, 0xaa, 0xd0, 0xfb, 0x49, 0xf5, 0x0b, 0x58, 0x5f, 0x83, 0xa0, 0x8e, 0x44, 0xcd, 0xef, 0x69, 0x5b, 0xf7, 0x2b, + 0x8c, 0x78, 0x91, 0x0f, 0x15, 0xf9, 0xeb, 0xba, 0xfa, 0x3c, 0x87, 0x01, 0x39, 0xf6, 0x09, 0x06, 0x36, 0xfd, 0xb2, + 0x0f, 0x21, 0x78, 0x5f, 0x5f, 0xd5, 0x42, 0xe3, 0x97, 0x22, 0x4e, 0x50, 0xe1, 0x81, 0x2c, 0x74, 0x3c, 0xb5, 0x72, + 0x6b, 0x1d, 0x99, 0x68, 0x6c, 0x62, 0x14, 0x3a, 0x8b, 0x15, 0x6c, 0xcc, 0x27, 0xa3, 0xba, 0xf2, 0x86, 0x09, 0x86, + 0x5f, 0xad, 0x3f, 0x9d, 0xa5, 0x57, 0x5b, 0x85, 0xbd, 0xaa, 0xf0, 0x5f, 0x75, 0x13, 0xbe, 0xc9, 0x70, 0x58, 0x05, + 0x2f, 0x08, 0x15, 0xfc, 0x40, 0x27, 0x55, 0xa8, 0xa3, 0xd3, 0x10, 0xa1, 0x55, 0xb3, 0x82, 0x1c, 0x15, 0xda, 0xef, + 0xdb, 0xd4, 0xd6, 0x9b, 0xea, 0xec, 0xed, 0x58, 0xd5, 0x54, 0x98, 0x1f, 0x8f, 0x59, 0x4d, 0x33, 0x12, 0x95, 0x2c, + 0xbf, 0x83, 0xdd, 0x69, 0x0b, 0x6f, 0x9f, 0xc0, 0xfb, 0x9b, 0xfa, 0x31, 0xe3, 0xb3, 0x6c, 0xd2, 0x04, 0xba, 0x33, + 0xd7, 0x02, 0xb5, 0x4f, 0x4d, 0xdd, 0x91, 0xb9, 0x0e, 0xec, 0x5d, 0xcd, 0x97, 0xf8, 0x4c, 0x84, 0xbb, 0x5f, 0x93, + 0xa8, 0xcc, 0x69, 0x06, 0x6d, 0x2c, 0xa5, 0x89, 0xaa, 0xdb, 0x70, 0xca, 0xb0, 0xf7, 0x0c, 0xed, 0x02, 0x6a, 0xf4, + 0x44, 0x77, 0x62, 0x8c, 0x90, 0xc6, 0xfd, 0x22, 0xb4, 0x1f, 0xe9, 0x79, 0x2b, 0x90, 0x8e, 0xed, 0x18, 0xa6, 0x9b, + 0x06, 0xc8, 0x5a, 0xe8, 0xe3, 0x5f, 0x5f, 0xed, 0xc3, 0xd8, 0xe6, 0xfd, 0x06, 0x61, 0xa9, 0xde, 0x1e, 0x1d, 0x20, + 0xf9, 0x9e, 0x52, 0x58, 0x5c, 0xd1, 0x1a, 0xad, 0x86, 0x8d, 0x83, 0x5c, 0x61, 0x30, 0xca, 0x54, 0xe9, 0x3c, 0x62, + 0x38, 0x1a, 0xc2, 0x08, 0x85, 0x42, 0x5e, 0x7d, 0xc4, 0x9a, 0x79, 0xdc, 0x9e, 0x3d, 0x94, 0x56, 0x07, 0xbf, 0x7a, + 0xb2, 0x46, 0x7d, 0xe9, 0x5d, 0x6e, 0xc6, 0x52, 0x8b, 0x8f, 0x57, 0xbc, 0xd1, 0xeb, 0xcb, 0x84, 0x66, 0x6e, 0xd1, + 0xa0, 0x14, 0x1b, 0x12, 0xbb, 0x95, 0xdf, 0x13, 0xeb, 0xb1, 0x59, 0x21, 0x09, 0x99, 0x5f, 0x5e, 0x99, 0xca, 0x53, + 0x79, 0x7f, 0x65, 0x39, 0xc3, 0x51, 0x3c, 0x78, 0x07, 0x7e, 0xd1, 0xcb, 0x9f, 0xa4, 0xde, 0xaa, 0x6e, 0x4b, 0x1b, + 0x14, 0xb5, 0x73, 0xcb, 0x86, 0x73, 0xe1, 0x3a, 0x29, 0x54, 0xc1, 0x0d, 0x16, 0x49, 0x23, 0x6f, 0x1d, 0x2f, 0x3e, + 0xc5, 0x60, 0xca, 0xc2, 0x19, 0x94, 0xb5, 0xcc, 0x05, 0xd6, 0x68, 0x1f, 0x86, 0x67, 0x8b, 0xcc, 0x18, 0x33, 0x18, + 0xdb, 0x70, 0x6e, 0xf9, 0xac, 0xfb, 0xfa, 0x85, 0xe0, 0xfd, 0xc6, 0x48, 0x44, 0x2c, 0x1f, 0xa0, 0x0f, 0x06, 0xa4, + 0x7f, 0x59, 0x62, 0xe4, 0xc3, 0x73, 0x05, 0x7e, 0xd2, 0xb2, 0x70, 0x00, 0x36, 0x6b, 0xef, 0x30, 0x2e, 0x92, 0x79, + 0xab, 0xdb, 0x31, 0x3b, 0x04, 0x37, 0x6c, 0x8d, 0x22, 0x18, 0x15, 0xa3, 0x25, 0x18, 0xac, 0xa0, 0x21, 0xb8, 0x80, + 0xf3, 0x75, 0xc4, 0xaa, 0xc7, 0x29, 0x2e, 0x33, 0x75, 0x86, 0x7f, 0x76, 0x37, 0xcd, 0xb2, 0x1a, 0xc4, 0x07, 0xa1, + 0xc8, 0x16, 0xec, 0xc1, 0xc5, 0x63, 0xe1, 0xcf, 0x21, 0xdf, 0x45, 0x61, 0xe9, 0x1a, 0xff, 0xaf, 0x43, 0xaa, 0xf7, + 0x3d, 0xec, 0x9e, 0x60, 0x0f, 0x3a, 0xa9, 0x2d, 0x34, 0x7f, 0x85, 0x55, 0x15, 0x55, 0xf3, 0xcd, 0x08, 0x8f, 0x16, + 0x5c, 0xab, 0x23, 0xd0, 0x41, 0x20, 0xd4, 0x6a, 0x06, 0x03, 0xb4, 0xe3, 0x07, 0xf8, 0xd2, 0xf1, 0xf8, 0x25, 0x89, + 0x09, 0xcf, 0xef, 0x9b, 0x10, 0xc4, 0xe3, 0xe8, 0x71, 0xe7, 0xfa, 0x43, 0x95, 0x21, 0xb2, 0x48, 0xea, 0x7e, 0x84, + 0xb9, 0xfd, 0x34, 0x17, 0x2e, 0x16, 0x27, 0xe8, 0xb1, 0x5c, 0x71, 0xc7, 0x3d, 0xea, 0x6e, 0xda, 0x3d, 0x9f, 0xb2, + 0x27, 0x31, 0x96, 0x52, 0xc4, 0x1d, 0xad, 0xcd, 0xb8, 0x22, 0x45, 0xae, 0x36, 0x81, 0x5e, 0x8e, 0xf4, 0x1c, 0x8f, + 0x64, 0x29, 0x51, 0xc7, 0x12, 0x44, 0xad, 0xe2, 0x3b, 0x23, 0x05, 0xd5, 0x28, 0xef, 0x72, 0xf7, 0xad, 0xd3, 0xd4, + 0xdd, 0xcf, 0xee, 0xa7, 0xc1, 0xcb, 0x54, 0xe7, 0x8c, 0x77, 0x5e, 0xb4, 0x5a, 0xfb, 0x22, 0x46, 0xaf, 0x1f, 0x0b, + 0x32, 0x9c, 0xf6, 0x5d, 0x67, 0x01, 0x6a, 0x95, 0xe5, 0xbf, 0x41, 0x20, 0x53, 0x74, 0x97, 0x9e, 0x8e, 0x68, 0xae, + 0x74, 0xf9, 0x8e, 0x0e, 0x54, 0x26, 0x0a, 0x31, 0xd3, 0x68, 0xf6, 0x80, 0xce, 0x2d, 0xcf, 0x75, 0x19, 0xf5, 0x2e, + 0xa2, 0x0d, 0x0a, 0xb5, 0xcf, 0xd1, 0x5d, 0x2f, 0x3a, 0x87, 0xeb, 0x94, 0xdb, 0x47, 0xcb, 0x45, 0xe5, 0xb3, 0xf1, + 0x70, 0x61, 0x97, 0x48, 0x22, 0x1f, 0x78, 0x09, 0x31, 0x74, 0xdf, 0xce, 0x30, 0x83, 0xb3, 0xda, 0xbb, 0x5d, 0xaa, + 0x1b, 0x3e, 0x84, 0x1e, 0xc5, 0xc2, 0xb5, 0x59, 0xce, 0xff, 0x97, 0xde, 0x45, 0xf5, 0xb7, 0x3a, 0x25, 0xee, 0x17, + 0xfe, 0x5d, 0x24, 0x8a, 0x84, 0x1e, 0xd2, 0x90, 0xde, 0x9f, 0x95, 0x1d, 0x98, 0x0f, 0xed, 0xa1, 0x32, 0x35, 0x79, + 0x9e, 0x05, 0xa0, 0xf5, 0xaa, 0x50, 0x46, 0x0e, 0x46, 0x4f, 0xce, 0x3b, 0xa4, 0x10, 0x86, 0x90, 0xc3, 0x20, 0x11, + 0x73, 0x1d, 0x70, 0x73, 0xd5, 0xed, 0x2c, 0x45, 0x85, 0xee, 0x1a, 0x96, 0x12, 0xd0, 0x11, 0x1d, 0x92, 0xcc, 0x9c, + 0xd0, 0x10, 0x14, 0x28, 0xf2, 0x1e, 0x31, 0x18, 0x4d, 0xe0, 0x3f, 0x98, 0x7d, 0x14, 0xd2, 0x08, 0x08, 0xe3, 0x14, + 0xc5, 0x7b, 0x20, 0x0e, 0x94, 0xd6, 0x3d, 0x98, 0x56, 0xe1, 0xaa, 0x57, 0xda, 0xca, 0x18, 0xbe, 0xc6, 0xb9, 0x33, + 0xc8, 0x05, 0x9e, 0xea, 0x5e, 0xcc, 0x80, 0x28, 0x40, 0x29, 0x68, 0xc1, 0x49, 0x90, 0x7c, 0xa8, 0x15, 0x48, 0xc0, + 0x21, 0xae, 0x41, 0xa9, 0xb1, 0xe0, 0xd5, 0x78, 0xa3, 0x10, 0x96, 0x62, 0x24, 0x02, 0x21, 0xd9, 0x30, 0xac, 0x98, + 0x0a, 0xb4, 0xfb, 0xc5, 0xbe, 0xf7, 0xc2, 0xe3, 0x43, 0x7d, 0x23, 0xe6, 0x02, 0x09, 0xa3, 0xb3, 0x93, 0x7b, 0x81, + 0x24, 0x7f, 0xb5, 0xa7, 0x2b, 0xb3, 0xbc, 0xf0, 0x8d, 0x85, 0x73, 0xb5, 0x12, 0x10, 0xf6, 0x6f, 0x8c, 0x03, 0x01, + 0x30, 0x97, 0xce, 0x6a, 0x2d, 0x91, 0x95, 0x0b, 0x69, 0xd6, 0x63, 0x29, 0xd6, 0xdd, 0x3c, 0x54, 0x80, 0x29, 0xb5, + 0xb8, 0x20, 0x95, 0x15, 0xde, 0x68, 0x0e, 0xa6, 0xf0, 0xa6, 0x83, 0xae, 0xcd, 0x67, 0xff, 0x43, 0xee, 0x1e, 0x1e, + 0x87, 0x57, 0xaa, 0x5b, 0x82, 0x51, 0x67, 0x92, 0xc1, 0x89, 0x4c, 0xa5, 0x9e, 0x06, 0xb1, 0x93, 0xbe, 0x13, 0x20, + 0x90, 0xd0, 0x38, 0x25, 0x9d, 0x8d, 0x74, 0xe8, 0x03, 0xf7, 0x43, 0x59, 0x50, 0x7c, 0x1d, 0x75, 0x7c, 0x11, 0x45, + 0x58, 0x64, 0xa5, 0x67, 0x97, 0x57, 0x37, 0x8d, 0xce, 0xcc, 0x4b, 0xcb, 0x9c, 0xc6, 0x4f, 0x60, 0xc9, 0x0a, 0x51, + 0xf2, 0x92, 0xb4, 0xb0, 0x9c, 0xe0, 0x7a, 0xa0, 0xe9, 0xb0, 0x20, 0x73, 0xe3, 0xb8, 0xfe, 0x51, 0x31, 0x8e, 0xa9, + 0xc3, 0x9e, 0xd2, 0x9b, 0x0a, 0x3c, 0x75, 0x64, 0x15, 0x3a, 0x10, 0x9e, 0x61, 0xbc, 0xa6, 0x81, 0x37, 0xfb, 0xf5, + 0xfc, 0xdf, 0x01, 0x8d, 0xe3, 0xc3, 0x25, 0x6d, 0xb8, 0x0e, 0xab, 0x70, 0x21, 0x8e, 0xc9, 0x0f, 0x26, 0x93, 0xb8, + 0x26, 0x71, 0xe0, 0xf7, 0x61, 0x89, 0x54, 0x88, 0x0c, 0xea, 0x58, 0xb9, 0x1d, 0xfb, 0x0b, 0x40, 0x8f, 0x87, 0x4c, + 0xe7, 0x81, 0x2f, 0x58, 0xe0, 0x38, 0xa8, 0x66, 0x37, 0x87, 0x8a, 0x05, 0xc0, 0x85, 0x59, 0x29, 0x5c, 0x8c, 0xd6, + 0x28, 0xc5, 0xec, 0x19, 0x1f, 0xda, 0x55, 0x03, 0x96, 0x99, 0x77, 0x66, 0xe5, 0xdc, 0x5a, 0x48, 0xc1, 0xed, 0xfa, + 0x46, 0x4c, 0x70, 0xbb, 0x46, 0xb2, 0x2d, 0xea, 0xd7, 0xe0, 0x58, 0x5c, 0x5c, 0xd7, 0xf8, 0xac, 0xcc, 0xdc, 0x49, + 0xfb, 0xc4, 0x75, 0x94, 0x56, 0x20, 0x89, 0xe7, 0x79, 0x18, 0x89, 0x05, 0xd3, 0xe7, 0x84, 0xa8, 0xc4, 0xb0, 0xf4, + 0xb1, 0xec, 0x0c, 0x83, 0xc7, 0x1c, 0x1d, 0x79, 0x66, 0xe7, 0x1c, 0xfe, 0xc7, 0x05, 0x60, 0x59, 0x7c, 0x2a, 0xe3, + 0x5f, 0x1c, 0x8f, 0xb2, 0x27, 0xf2, 0xfe, 0x4a, 0xe2, 0x4e, 0xc5, 0x1c, 0x48, 0x23, 0x5b, 0xc6, 0xd2, 0x16, 0xc8, + 0x45, 0xc6, 0x33, 0xec, 0xfc, 0xd4, 0xfa, 0x98, 0xfd, 0xd8, 0xc7, 0xaa, 0xe1, 0xd7, 0x81, 0x6e, 0x93, 0x12, 0xf4, + 0xad, 0x94, 0xe9, 0xec, 0xbd, 0x99, 0xd2, 0xdc, 0x89, 0xab, 0x7a, 0x65, 0x6b, 0x1b, 0x6a, 0x9b, 0xc4, 0xf5, 0x5b, + 0xf3, 0x18, 0x98, 0xb6, 0x4e, 0x5c, 0x19, 0x0a, 0x6d, 0xb2, 0x3c, 0xd3, 0x20, 0x55, 0x31, 0x74, 0xf7, 0x8a, 0x0f, + 0x9d, 0xee, 0x70, 0x36, 0x5f, 0x9a, 0xf4, 0x30, 0x9e, 0xc5, 0xb5, 0x5c, 0x92, 0xc1, 0x07, 0x85, 0xc3, 0x21, 0x49, + 0xd1, 0x22, 0x97, 0x21, 0x80, 0xdc, 0xed, 0xe0, 0x6e, 0xb2, 0xdd, 0x94, 0x77, 0xcc, 0x5e, 0x9a, 0xa3, 0xcf, 0xdb, + 0x72, 0x31, 0xa1, 0x46, 0x4c, 0xd5, 0x79, 0x6b, 0xbb, 0x6e, 0x0a, 0x4a, 0x39, 0x0a, 0xa4, 0x53, 0x16, 0xa2, 0x82, + 0x9f, 0x98, 0xef, 0xff, 0xa0, 0x28, 0x37, 0x04, 0xdc, 0xf2, 0x3a, 0x7e, 0xdc, 0x69, 0x2d, 0x63, 0x58, 0x8e, 0x8c, + 0x0b, 0xd3, 0xbf, 0xa4, 0x59, 0xcd, 0x96, 0x65, 0xe2, 0x75, 0x9d, 0x3d, 0x28, 0x2e, 0xe1, 0x5c, 0xad, 0x65, 0xe1, + 0x3a, 0xd2, 0xd0, 0x84, 0xfe, 0x10, 0x0a, 0xdb, 0xa6, 0x32, 0x70, 0xa2, 0x94, 0x21, 0x3f, 0x97, 0x86, 0x29, 0x18, + 0x7e, 0x13, 0x60, 0x9d, 0x66, 0x18, 0x85, 0xb4, 0x00, 0xaa, 0x0f, 0x47, 0x93, 0x6e, 0x08, 0x3b, 0x07, 0x1d, 0x47, + 0xe9, 0xec, 0xc0, 0x7a, 0x40, 0xce, 0xf3, 0xd9, 0x5e, 0xef, 0xcd, 0xfa, 0xda, 0xf8, 0x07, 0x04, 0x3e, 0xf3, 0x2d, + 0xfa, 0xda, 0x06, 0xe2, 0x7c, 0x39, 0x23, 0xc6, 0xb6, 0x0c, 0xd8, 0x52, 0xe5, 0x10, 0xb6, 0x54, 0x0c, 0x13, 0x33, + 0x75, 0x62, 0x8a, 0x17, 0x65, 0xdd, 0x79, 0x3e, 0x04, 0x2c, 0x50, 0x7e, 0xc0, 0x91, 0x25, 0xc7, 0x74, 0x14, 0x29, + 0x3a, 0x0d, 0x14, 0x2c, 0x50, 0x7e, 0x7d, 0x5b, 0xfe, 0x61, 0x08, 0xb0, 0x1c, 0x69, 0x95, 0x81, 0x64, 0x6a, 0x63, + 0x39, 0xa9, 0xc5, 0xa9, 0x38, 0x8b, 0xca, 0x30, 0xfa, 0xdd, 0xb8, 0x78, 0xe9, 0xbd, 0x56, 0x6f, 0xe1, 0x29, 0x57, + 0xb0, 0x46, 0x13, 0xd3, 0x13, 0xb1, 0xbf, 0xe0, 0x7c, 0x30, 0xc8, 0x6f, 0x78, 0x77, 0x08, 0xa9, 0x8d, 0x62, 0x8f, + 0xda, 0x0f, 0x4c, 0x46, 0xa5, 0xd5, 0x25, 0x2f, 0xea, 0x45, 0xb6, 0x65, 0x17, 0xbb, 0x72, 0x8f, 0x81, 0xcb, 0x8b, + 0x11, 0xe8, 0xf1, 0xf6, 0x1a, 0x1c, 0x00, 0x1f, 0x2d, 0x8a, 0xab, 0x61, 0x5b, 0xa4, 0x40, 0xd8, 0xd6, 0x7b, 0xde, + 0xea, 0x53, 0x2b, 0xc8, 0x63, 0x10, 0x5a, 0x97, 0x13, 0xde, 0xb9, 0x75, 0xca, 0x90, 0x16, 0x31, 0xce, 0xb3, 0xa8, + 0xd0, 0x87, 0x49, 0x55, 0xc9, 0x86, 0x7f, 0xc0, 0x60, 0xe4, 0x16, 0x53, 0xe1, 0xdf, 0xe2, 0xaf, 0xcc, 0x0d, 0xf7, + 0x6a, 0x98, 0xce, 0xa9, 0x36, 0xef, 0xba, 0xed, 0xf0, 0xc3, 0xf0, 0xdd, 0x12, 0x7a, 0x54, 0x60, 0x9c, 0xe6, 0x89, + 0xd9, 0x1a, 0x7e, 0xa5, 0x80, 0x6f, 0x1f, 0xca, 0xb4, 0x0d, 0x37, 0xd3, 0xaa, 0xbd, 0xe9, 0xb6, 0x1b, 0x40, 0xe6, + 0xac, 0x66, 0xf9, 0xe6, 0x83, 0x3b, 0x09, 0x69, 0x11, 0xfe, 0x58, 0x26, 0xea, 0x11, 0xb6, 0x74, 0xe8, 0x04, 0x3c, + 0xd3, 0xd3, 0xaa, 0xc6, 0xf3, 0x75, 0x56, 0x22, 0x7f, 0xb4, 0x37, 0xfe, 0xe4, 0x83, 0xb7, 0xbe, 0x83, 0x1a, 0x79, + 0xa2, 0x47, 0x84, 0x0b, 0xd5, 0x25, 0xb4, 0xad, 0x1a, 0xb2, 0x28, 0x96, 0xdc, 0x06, 0xde, 0x13, 0x53, 0x84, 0xc3, + 0x4f, 0xed, 0xe9, 0x52, 0xd4, 0xfe, 0x98, 0x19, 0xfc, 0x07, 0x80, 0x44, 0xe5, 0xf2, 0xbf, 0xc3, 0xe3, 0x1d, 0x85, + 0x88, 0x78, 0x0b, 0xc9, 0x82, 0x05, 0x18, 0x79, 0xa8, 0xcc, 0x48, 0x4a, 0xca, 0xb5, 0x12, 0x80, 0xef, 0xc3, 0xd0, + 0x56, 0x5d, 0x83, 0x1c, 0x6c, 0xf0, 0xb7, 0x0c, 0xe2, 0x61, 0xd7, 0x23, 0xad, 0xf1, 0xf2, 0xf8, 0xd2, 0xa7, 0x9a, + 0xd0, 0xe2, 0xdb, 0x48, 0x59, 0xbc, 0x5c, 0x3d, 0x10, 0x1d, 0x49, 0x0c, 0x71, 0x23, 0x27, 0xc9, 0x9b, 0xc4, 0xfb, + 0x69, 0x63, 0x44, 0x72, 0x62, 0x9d, 0xbd, 0x20, 0xe5, 0x17, 0x62, 0xf3, 0xdd, 0xb8, 0x73, 0xb8, 0x73, 0xbd, 0xaf, + 0x94, 0x45, 0x5d, 0x8b, 0x7a, 0x68, 0x76, 0x1d, 0xfd, 0xd9, 0x94, 0x30, 0xa4, 0x43, 0xa2, 0x41, 0x21, 0x2d, 0x2a, + 0x0b, 0xa4, 0x81, 0x9e, 0x44, 0xf6, 0x71, 0x58, 0xcc, 0xde, 0xbd, 0x4a, 0x7d, 0x92, 0x48, 0x49, 0x6c, 0x0f, 0x58, + 0x9a, 0x4c, 0xbc, 0xb9, 0x30, 0xfb, 0xbf, 0xb2, 0xf3, 0xf2, 0x21, 0xd2, 0x98, 0xaa, 0x63, 0x64, 0xa1, 0x06, 0x4a, + 0x59, 0x0b, 0xa7, 0x2d, 0xbe, 0x14, 0x45, 0x5b, 0x85, 0x9e, 0x6a, 0x1e, 0x78, 0x5a, 0x58, 0x13, 0xc5, 0x16, 0xf4, + 0x74, 0x98, 0x96, 0x25, 0xb5, 0x09, 0x4f, 0x5f, 0x7a, 0x9e, 0xe5, 0x39, 0xdb, 0x5d, 0x9a, 0x7d, 0xeb, 0xa0, 0x5e, + 0x53, 0xcb, 0xf6, 0x53, 0x95, 0x69, 0xd0, 0x12, 0x04, 0xf5, 0x10, 0xe4, 0x56, 0x61, 0xe2, 0xc6, 0x38, 0x4f, 0x77, + 0xed, 0xd6, 0x9d, 0xf9, 0xa7, 0x5d, 0x10, 0x17, 0x12, 0x18, 0x34, 0x12, 0xad, 0x26, 0xf4, 0x63, 0xc3, 0x52, 0x18, + 0x72, 0xb6, 0x64, 0x96, 0xf3, 0x6a, 0x20, 0x3f, 0xd3, 0x56, 0x70, 0x40, 0xc2, 0xe8, 0x1c, 0x63, 0x66, 0xf0, 0x39, + 0x12, 0xc3, 0x57, 0x6d, 0xd2, 0x73, 0x24, 0xf7, 0x34, 0xc1, 0x54, 0x00, 0xf3, 0x4a, 0xc1, 0x74, 0xd6, 0x37, 0x8b, + 0x0a, 0x56, 0xfc, 0xf0, 0xe3, 0x2f, 0xa8, 0xde, 0x07, 0x05, 0x9d, 0x04, 0x57, 0xea, 0xb6, 0x9d, 0xf1, 0x6d, 0xf7, + 0x41, 0x01, 0x5e, 0xa8, 0x21, 0xf3, 0x12, 0xff, 0x57, 0x2f, 0xd6, 0xd4, 0x2f, 0xf2, 0xd9, 0x61, 0xa2, 0xef, 0x32, + 0x69, 0xe6, 0xf7, 0xa5, 0x01, 0x65, 0x7e, 0xc9, 0xe3, 0x8a, 0x69, 0xde, 0x23, 0xfe, 0xd3, 0x98, 0xdb, 0xc2, 0x84, + 0x76, 0x98, 0x3e, 0x4a, 0xd4, 0xdc, 0x3e, 0x13, 0x54, 0xfb, 0x86, 0x97, 0xea, 0x31, 0x17, 0xac, 0x63, 0x72, 0x4b, + 0x89, 0xf5, 0x95, 0xc0, 0x83, 0x2c, 0x92, 0x89, 0x7b, 0xa9, 0xf6, 0x8e, 0xf2, 0x7c, 0xa7, 0xf6, 0x34, 0x39, 0x61, + 0x5d, 0x5c, 0x5d, 0xc9, 0xd7, 0x31, 0xc2, 0x6e, 0xbd, 0x59, 0x5e, 0xab, 0x62, 0xcc, 0x28, 0xd9, 0xd4, 0x6e, 0xef, + 0x62, 0x31, 0xe3, 0x26, 0x0c, 0x45, 0xb6, 0x28, 0x97, 0x8f, 0x5c, 0x3c, 0xe4, 0xfb, 0x94, 0x5f, 0xfd, 0x67, 0x0b, + 0x71, 0xf3, 0xf9, 0xf9, 0x1b, 0x23, 0x2c, 0x08, 0x03, 0xdb, 0xad, 0x22, 0x3e, 0x9d, 0x09, 0x14, 0xc6, 0xc6, 0x04, + 0x9b, 0xd7, 0xba, 0x09, 0xbc, 0x48, 0x94, 0x91, 0x34, 0xcc, 0xcf, 0xf2, 0x10, 0xa8, 0x62, 0xe8, 0x49, 0x6b, 0x25, + 0x8a, 0xd6, 0xf7, 0x63, 0x9f, 0x01, 0x21, 0x55, 0xb2, 0xac, 0x88, 0x2b, 0x57, 0x28, 0x04, 0x22, 0x09, 0x07, 0x47, + 0x60, 0x9b, 0x26, 0x84, 0x4f, 0x0f, 0xe9, 0xa5, 0x2e, 0x73, 0xc9, 0xc5, 0x35, 0x38, 0x0a, 0x60, 0x69, 0x32, 0xe2, + 0xd7, 0xbb, 0x55, 0x5e, 0xfa, 0xa5, 0x9d, 0x6e, 0xfe, 0x9e, 0x03, 0x8e, 0x0b, 0xdd, 0x17, 0x05, 0x68, 0x0d, 0x58, + 0x56, 0x28, 0x6f, 0x1f, 0x83, 0x8b, 0xd2, 0x61, 0xf4, 0x72, 0x5c, 0x2d, 0xa2, 0xba, 0x42, 0x59, 0xbb, 0x5d, 0x11, + 0x95, 0xb7, 0xf3, 0xd7, 0x34, 0xa9, 0x45, 0x04, 0x71, 0xde, 0x47, 0x34, 0xcb, 0x44, 0x98, 0x5d, 0xdc, 0x75, 0xa8, + 0xc7, 0x90, 0xf4, 0xa1, 0x15, 0x17, 0x11, 0xf8, 0xb4, 0x02, 0x69, 0x63, 0x6e, 0x0f, 0xe9, 0xb7, 0xb6, 0xa3, 0x00, + 0xe8, 0x85, 0xb0, 0x90, 0xb9, 0x91, 0x14, 0x3c, 0x7b, 0x0f, 0x54, 0x92, 0xf4, 0xb9, 0x1a, 0xb3, 0xae, 0xc7, 0x17, + 0xaf, 0x95, 0xbe, 0x05, 0x79, 0x6f, 0x8a, 0xe0, 0xe9, 0xaa, 0xbd, 0x74, 0x21, 0xa0, 0xbd, 0xce, 0x74, 0xb6, 0x34, + 0x7b, 0x1f, 0xbc, 0x17, 0x1d, 0x78, 0x0d, 0xf5, 0x66, 0x89, 0x3c, 0x66, 0xf0, 0x65, 0x93, 0x90, 0xe4, 0xb5, 0x91, + 0x0a, 0xa2, 0xa0, 0x07, 0xae, 0x51, 0x91, 0x8c, 0x92, 0x8b, 0x6e, 0xfb, 0xb3, 0x19, 0xa4, 0x5c, 0x5e, 0x7d, 0xcd, + 0xdb, 0x9d, 0x83, 0x28, 0xa5, 0xf9, 0xeb, 0x85, 0x4f, 0xbb, 0x67, 0x74, 0xe5, 0x35, 0x81, 0x56, 0x33, 0x7a, 0x4b, + 0x8d, 0x6a, 0xa4, 0xa9, 0x48, 0x05, 0xb1, 0x77, 0x59, 0x83, 0xb5, 0xf1, 0x78, 0x30, 0x95, 0x1a, 0xbc, 0xcf, 0xf4, + 0xa4, 0x75, 0xfa, 0xf6, 0x69, 0x39, 0x84, 0x57, 0xdf, 0x6d, 0x37, 0x2a, 0xf5, 0x5c, 0x7c, 0x2f, 0xdb, 0x45, 0xa6, + 0x75, 0x9c, 0xe8, 0x64, 0xd2, 0x57, 0x69, 0xb7, 0x27, 0x55, 0x3d, 0x73, 0xe1, 0x00, 0xfd, 0xbb, 0x51, 0xa6, 0x94, + 0xa5, 0xf1, 0xda, 0x25, 0xac, 0xa7, 0xde, 0x08, 0xbb, 0x2e, 0x0a, 0xc0, 0x3f, 0x67, 0x1c, 0x68, 0xa2, 0x63, 0xc5, + 0x3a, 0xbe, 0x2e, 0x75, 0x3c, 0x94, 0xfc, 0x80, 0x6d, 0x66, 0x92, 0x77, 0x28, 0x6e, 0xde, 0x10, 0xd8, 0x9f, 0x29, + 0xd6, 0x76, 0xab, 0xc4, 0x19, 0xab, 0xd8, 0x2b, 0xb1, 0xd7, 0x1e, 0x6f, 0x98, 0x40, 0x99, 0xad, 0x2b, 0x4c, 0x99, + 0x33, 0xbf, 0xc9, 0x67, 0x2f, 0xaf, 0x6f, 0x9e, 0xfd, 0x65, 0xe7, 0x35, 0xc3, 0xb0, 0x92, 0x3d, 0x27, 0xcb, 0x21, + 0xac, 0xca, 0xf8, 0x99, 0x9e, 0x6a, 0x1e, 0xdf, 0x51, 0x6f, 0xdc, 0x9b, 0xa4, 0x07, 0xe3, 0xdb, 0x13, 0x92, 0x87, + 0x82, 0x09, 0x18, 0xe9, 0xcf, 0x47, 0xa3, 0x00, 0x9d, 0x5c, 0x76, 0x0d, 0x2e, 0x12, 0x93, 0x3f, 0xa6, 0x5e, 0xc6, + 0x22, 0x05, 0xa9, 0x3a, 0xc2, 0x5d, 0x83, 0x48, 0x8a, 0x2a, 0xe8, 0xc8, 0x8b, 0x02, 0x4c, 0x5a, 0x70, 0x60, 0x01, + 0x0a, 0x3a, 0x5f, 0x79, 0x89, 0x25, 0x7e, 0x88, 0xfe, 0xf1, 0x1f, 0x56, 0x27, 0xbd, 0x68, 0xfe, 0x31, 0xbd, 0xf0, + 0xff, 0x4f, 0xe7, 0xb3, 0x75, 0x8e, 0x0d, 0x08, 0xd6, 0xff, 0x05, 0x62, 0x17, 0x9a, 0xa0, 0x04, 0xe9, 0x01, 0x84, + 0x43, 0xfe, 0xf4, 0x4e, 0x33, 0x9c, 0xb0, 0x7c, 0xaa, 0x26, 0xc3, 0x78, 0x2a, 0xce, 0xc9, 0x84, 0xc6, 0x71, 0x1a, + 0x4d, 0x29, 0xc0, 0x33, 0x6e, 0xcc, 0x5e, 0xc3, 0xd0, 0x7b, 0xdd, 0xa3, 0x40, 0xe8, 0x24, 0xdd, 0xcc, 0x58, 0x8a, + 0x49, 0xb4, 0xac, 0x57, 0x6d, 0x9c, 0x1c, 0xf6, 0xe0, 0x0c, 0xb4, 0xcc, 0x32, 0x27, 0x5a, 0x0f, 0x16, 0x42, 0x73, + 0x6e, 0x6c, 0x30, 0xdd, 0x5b, 0x28, 0xdd, 0x11, 0x41, 0x63, 0xf7, 0x98, 0xca, 0x56, 0x44, 0x25, 0xa5, 0x88, 0x78, + 0x63, 0x20, 0x4c, 0x2f, 0x7e, 0x9d, 0x9a, 0x53, 0xdf, 0xf6, 0x51, 0xbe, 0x32, 0xa9, 0x94, 0xb5, 0x5c, 0x48, 0x83, + 0xf1, 0xea, 0xcb, 0x48, 0x08, 0xcd, 0x44, 0x48, 0x91, 0x17, 0xb2, 0x27, 0x60, 0x13, 0x23, 0xbe, 0xc7, 0xa5, 0x84, + 0x32, 0x39, 0x28, 0x55, 0x50, 0x3c, 0x3e, 0xd4, 0x8f, 0x18, 0x10, 0xba, 0x1a, 0x23, 0x89, 0xe5, 0x58, 0xe8, 0x27, + 0xd2, 0x17, 0x34, 0x71, 0x08, 0x5c, 0xe3, 0x07, 0xd1, 0x67, 0x4f, 0xc6, 0xcb, 0x5e, 0x81, 0xcd, 0x39, 0xb0, 0x89, + 0xdc, 0x1c, 0xb4, 0xee, 0x3f, 0x65, 0x02, 0x4d, 0x14, 0x59, 0xeb, 0x39, 0x4b, 0xf6, 0x2c, 0xc5, 0x3c, 0x54, 0x4b, + 0x96, 0x40, 0xa3, 0xa8, 0x88, 0xd0, 0x5f, 0x0e, 0xf6, 0x50, 0xcf, 0x2a, 0x23, 0xb6, 0x30, 0xaf, 0x4e, 0xa8, 0xb2, + 0xd5, 0x51, 0xd2, 0x2b, 0x0b, 0xf5, 0x70, 0x37, 0x80, 0xf1, 0xb5, 0x9f, 0x7b, 0xe3, 0xce, 0xfa, 0x84, 0x6d, 0xcf, + 0x37, 0xb9, 0x38, 0xfe, 0x7a, 0xe6, 0xe5, 0xe1, 0xe0, 0xb9, 0x67, 0xb1, 0xd9, 0x50, 0x09, 0x81, 0x48, 0x26, 0x82, + 0x4a, 0xf5, 0xdb, 0x6c, 0x38, 0x20, 0xb0, 0x83, 0x62, 0x2b, 0xe1, 0xa5, 0x52, 0x51, 0xee, 0xad, 0xd5, 0x58, 0x0e, + 0x1c, 0x8e, 0x21, 0x8d, 0x63, 0x97, 0x98, 0x82, 0x38, 0xd6, 0x67, 0xe9, 0x21, 0xf0, 0x6b, 0x6b, 0x34, 0x4f, 0xec, + 0x90, 0x21, 0xd3, 0xa4, 0x4a, 0x45, 0xfa, 0x39, 0x00, 0x6e, 0x23, 0xa7, 0x17, 0xe9, 0x1f, 0x50, 0x02, 0xfc, 0x2a, + 0x16, 0x7b, 0xa3, 0x32, 0x16, 0xc9, 0xaa, 0xac, 0x56, 0x0a, 0xa7, 0xe3, 0x03, 0xf0, 0xd2, 0xbf, 0x2c, 0x58, 0xa0, + 0x6a, 0xa4, 0x67, 0x0b, 0x77, 0x08, 0xd4, 0x4a, 0xdf, 0x8d, 0x10, 0xb5, 0xee, 0xd7, 0xf5, 0xa8, 0xba, 0xb9, 0x58, + 0x8c, 0x31, 0xb6, 0xdc, 0x9b, 0x4f, 0x2a, 0xb7, 0x6d, 0x31, 0xfa, 0x36, 0x77, 0x60, 0x6b, 0xd2, 0x3d, 0xfd, 0xb0, + 0x3d, 0xe5, 0xe1, 0x25, 0x7e, 0xf3, 0x6a, 0x22, 0x33, 0x79, 0x7c, 0x26, 0x74, 0xef, 0xa9, 0x42, 0xcd, 0x8d, 0x85, + 0x3c, 0xf5, 0xbb, 0xf7, 0x34, 0xe1, 0x87, 0xfa, 0xaf, 0xd4, 0x78, 0x52, 0x93, 0x93, 0xbf, 0x99, 0xc5, 0x64, 0x13, + 0x86, 0xfd, 0xb0, 0x81, 0x20, 0x10, 0x50, 0x25, 0x80, 0xed, 0x51, 0x94, 0xeb, 0x6f, 0x4a, 0xaa, 0x5b, 0xc0, 0x85, + 0xa2, 0x53, 0x51, 0xf7, 0x29, 0xe1, 0x59, 0xcf, 0xb6, 0x5b, 0x28, 0x22, 0x2e, 0xaa, 0x33, 0x71, 0xa2, 0xcd, 0xcf, + 0xd9, 0xfe, 0x51, 0x75, 0x40, 0x87, 0x2c, 0x3e, 0xea, 0x9a, 0x50, 0x10, 0x37, 0xbc, 0x50, 0x86, 0x09, 0x92, 0x08, + 0x65, 0xd3, 0x6c, 0xf7, 0x65, 0xba, 0xc6, 0xad, 0xfd, 0xb9, 0xd0, 0xf7, 0x76, 0x20, 0x12, 0x17, 0x33, 0xd1, 0xac, + 0x08, 0x57, 0xf2, 0xe0, 0x54, 0xd1, 0xe6, 0x2c, 0xc8, 0xd6, 0xec, 0xad, 0x9e, 0x93, 0x39, 0xe0, 0x28, 0xd2, 0x72, + 0xcc, 0x8f, 0x3c, 0x17, 0xcf, 0xd5, 0x67, 0x8b, 0xe4, 0x7e, 0xc9, 0xc6, 0xb6, 0xdd, 0x4b, 0xd2, 0x93, 0x1c, 0x60, + 0x22, 0x04, 0xdf, 0x94, 0x90, 0x0e, 0xc0, 0xfa, 0xda, 0xb2, 0x04, 0x99, 0xa9, 0x02, 0x22, 0x93, 0xe9, 0xfc, 0xda, + 0x93, 0x83, 0xa0, 0x33, 0x15, 0x70, 0xc0, 0x10, 0x7e, 0x06, 0x06, 0x1a, 0xdf, 0x73, 0x90, 0xa4, 0x44, 0x43, 0x32, + 0xc5, 0x3d, 0x20, 0x52, 0xc0, 0xcd, 0x37, 0x4f, 0xb6, 0x68, 0x5d, 0x19, 0xa7, 0x90, 0x5e, 0xd2, 0x7a, 0x30, 0x25, + 0x31, 0x9e, 0x49, 0xb8, 0xc5, 0xf1, 0xcf, 0x96, 0xc0, 0xeb, 0x44, 0x5e, 0xa5, 0x64, 0x4b, 0xce, 0x09, 0x0c, 0x2e, + 0x47, 0x2b, 0x36, 0xb0, 0xb8, 0x7e, 0x0a, 0x6b, 0x8c, 0x27, 0x59, 0x1e, 0x8b, 0x9b, 0xbf, 0xef, 0xbf, 0xf5, 0xc8, + 0xee, 0xb3, 0xdd, 0x9d, 0x4f, 0x4d, 0x6b, 0x05, 0x83, 0x18, 0x53, 0xb2, 0x01, 0x6a, 0x05, 0xcf, 0x6c, 0xc8, 0xd8, + 0x95, 0xe6, 0x59, 0xe0, 0xa8, 0x67, 0xbb, 0x6f, 0xcd, 0xee, 0x58, 0xbe, 0x41, 0xfc, 0x44, 0x43, 0xd8, 0x78, 0xa7, + 0x02, 0x9b, 0xa8, 0xe5, 0xf7, 0xe8, 0xb7, 0xbb, 0xb3, 0x1d, 0xda, 0xab, 0x78, 0x37, 0x8d, 0x67, 0x19, 0x53, 0x59, + 0x96, 0xbf, 0x8f, 0x9e, 0xf9, 0xd1, 0xd1, 0x12, 0x86, 0xfa, 0xc8, 0x39, 0x4e, 0xd3, 0x38, 0xe8, 0x08, 0xf5, 0x84, + 0x1d, 0x7f, 0x87, 0x88, 0xff, 0xef, 0x0c, 0xff, 0x77, 0xf0, 0xbf, 0xe7, 0xf8, 0x17, 0xa1, 0xae, 0xf3, 0xd5, 0xe6, + 0xaf, 0x28, 0xff, 0x8d, 0x8f, 0x64, 0x9d, 0xbf, 0xda, 0xdb, 0x7d, 0x61, 0x5a, 0x6f, 0x92, 0x47, 0x6b, 0x13, 0x05, + 0xf4, 0xd5, 0xe3, 0xce, 0xe9, 0x04, 0x51, 0xe6, 0xd4, 0xf9, 0x88, 0xf2, 0xfb, 0x6e, 0x70, 0xe1, 0x17, 0xe3, 0x06, + 0x96, 0xad, 0x2f, 0xff, 0xf4, 0xaf, 0x90, 0xcb, 0x7d, 0x7e, 0xce, 0xb5, 0xad, 0x68, 0x94, 0xfd, 0x7d, 0x68, 0xdc, + 0x11, 0x41, 0x0d, 0xe7, 0xfe, 0xf3, 0x44, 0xf3, 0x4f, 0x06, 0x97, 0x22, 0x47, 0x6b, 0x85, 0xc5, 0x67, 0xfe, 0x4c, + 0x2b, 0x7b, 0xdf, 0xb8, 0x75, 0x65, 0x1b, 0x5a, 0x8c, 0x36, 0xdd, 0x00, 0x83, 0x49, 0x05, 0xad, 0x95, 0xb5, 0xfb, + 0xfc, 0x97, 0x89, 0x31, 0x24, 0x3c, 0xfa, 0xd9, 0xaf, 0x81, 0xfa, 0x8d, 0x6b, 0xb3, 0x06, 0x12, 0x5b, 0xa6, 0xe7, + 0x2f, 0x05, 0xb3, 0x09, 0x0d, 0x0f, 0xf5, 0x74, 0xa9, 0xf7, 0xea, 0xb3, 0x48, 0x34, 0xc6, 0xed, 0x50, 0x5c, 0x5f, + 0x01, 0x0a, 0xa4, 0x38, 0x4f, 0x97, 0xff, 0xc7, 0x5f, 0x88, 0xa2, 0xeb, 0x12, 0x3a, 0x2a, 0xe7, 0xa4, 0xe6, 0xa7, + 0xd0, 0x4b, 0x54, 0x7a, 0xa9, 0x12, 0x75, 0x54, 0x4c, 0x3c, 0x0b, 0x82, 0xeb, 0x8a, 0x9c, 0x9b, 0x5c, 0x0d, 0xe7, + 0x64, 0xdc, 0xe7, 0xff, 0x38, 0xcb, 0x49, 0x82, 0x87, 0xc0, 0x8c, 0xef, 0xec, 0x0a, 0x61, 0x49, 0x5e, 0xc3, 0xc1, + 0xec, 0xc1, 0xb0, 0x7c, 0x52, 0x03, 0x0d, 0x86, 0xf9, 0xf3, 0x05, 0x24, 0xe0, 0x1b, 0xdf, 0x0c, 0x52, 0xa3, 0xe2, + 0xa9, 0x3d, 0xad, 0x43, 0x95, 0x36, 0x06, 0x86, 0x21, 0x11, 0xc1, 0x21, 0xe7, 0x00, 0xf1, 0x41, 0xa7, 0xb3, 0xa3, + 0x8d, 0x63, 0x26, 0xa7, 0xe4, 0xa0, 0x1f, 0xe7, 0x52, 0x15, 0xca, 0xa1, 0x96, 0xd4, 0x51, 0xd1, 0x90, 0xe3, 0x32, + 0x3a, 0xd0, 0xa2, 0xdb, 0x2b, 0xc8, 0xfa, 0x32, 0x17, 0xef, 0xb2, 0xd9, 0xea, 0x91, 0x08, 0x33, 0x89, 0x18, 0xa9, + 0xe0, 0xb4, 0x64, 0x55, 0x0c, 0xfd, 0xa2, 0x25, 0xa6, 0x36, 0xe2, 0xe9, 0xde, 0x5a, 0x3a, 0x75, 0x1e, 0x79, 0x70, + 0x65, 0x90, 0xbd, 0xe2, 0x35, 0xe0, 0xde, 0x24, 0x1b, 0x66, 0x19, 0x2b, 0xb8, 0xb0, 0xbe, 0xf6, 0x69, 0xf5, 0xc1, + 0xbe, 0x43, 0xc1, 0x79, 0xf6, 0x5e, 0x0c, 0xba, 0x19, 0xec, 0x82, 0xea, 0x8d, 0xfd, 0x3c, 0x0d, 0xf8, 0xdd, 0x03, + 0xa5, 0xa0, 0xc0, 0x31, 0xa8, 0xa7, 0x3b, 0x7f, 0x43, 0x04, 0x7e, 0x60, 0x37, 0x60, 0x9d, 0xb3, 0x6d, 0xc1, 0x95, + 0x84, 0x6a, 0x20, 0xd5, 0x65, 0x2c, 0x0b, 0x6c, 0xa7, 0x87, 0x2d, 0xae, 0x7b, 0x8e, 0x06, 0xa5, 0xba, 0x37, 0x13, + 0x94, 0x89, 0xa3, 0x65, 0xae, 0x03, 0x5b, 0x04, 0x30, 0xb2, 0x15, 0xe1, 0x36, 0x20, 0xaf, 0x2e, 0x66, 0x34, 0xf4, + 0x87, 0xb8, 0x9a, 0x04, 0x34, 0xa0, 0x91, 0x8b, 0x8e, 0x17, 0x5d, 0x2f, 0x9d, 0xd2, 0xdb, 0xe3, 0x09, 0x72, 0xb0, + 0x73, 0x16, 0x86, 0xf2, 0x7a, 0x92, 0xf3, 0xa5, 0xe7, 0xbf, 0x9e, 0x10, 0xed, 0xf5, 0x31, 0x86, 0xb3, 0x85, 0x94, + 0xc4, 0x06, 0x32, 0xb4, 0x3a, 0x8e, 0xe8, 0xe0, 0x21, 0x0f, 0xe8, 0x49, 0x69, 0x96, 0xd7, 0x4d, 0x88, 0x8a, 0xb9, + 0x08, 0x95, 0xc8, 0xcb, 0xe2, 0x9a, 0xad, 0x2b, 0x10, 0x98, 0xd9, 0x2e, 0xf8, 0x82, 0xa3, 0xd1, 0xca, 0xf0, 0x82, + 0x30, 0x27, 0x8c, 0x90, 0xc5, 0xfa, 0x27, 0xc0, 0x1b, 0xbe, 0x06, 0x45, 0xfe, 0x64, 0x5c, 0x12, 0x9e, 0x59, 0xe6, + 0x0e, 0xe1, 0x84, 0x9f, 0x2a, 0x61, 0x75, 0x17, 0x15, 0xfa, 0xc7, 0xf3, 0x52, 0x50, 0x1c, 0x35, 0x06, 0x0c, 0xfb, + 0x22, 0x04, 0x91, 0x8a, 0xd2, 0xec, 0x3b, 0x88, 0x54, 0xf7, 0x03, 0xb1, 0x1e, 0x8e, 0x68, 0xc3, 0x23, 0x11, 0xc8, + 0x1f, 0x49, 0xb5, 0xd0, 0xc6, 0x47, 0x22, 0x24, 0xbd, 0x7d, 0xf3, 0xc1, 0x79, 0xb9, 0x29, 0xaa, 0x2c, 0xa3, 0xd0, + 0x27, 0x3a, 0xa8, 0x9c, 0xea, 0xf1, 0x7a, 0x96, 0xda, 0x0a, 0xae, 0x5b, 0x2b, 0x81, 0x8a, 0x8d, 0xe9, 0x32, 0xf7, + 0x91, 0xed, 0xb5, 0x4b, 0x29, 0xf1, 0xe7, 0x79, 0xc6, 0x1a, 0x8e, 0x04, 0xec, 0xa6, 0x17, 0x86, 0xb1, 0x93, 0x1d, + 0x43, 0x47, 0x92, 0xf4, 0x82, 0xd2, 0x74, 0x8c, 0x91, 0x9b, 0xd7, 0xdd, 0x60, 0xbb, 0x8a, 0xc1, 0x57, 0x03, 0xc3, + 0x39, 0x34, 0x69, 0x38, 0x29, 0x38, 0xd7, 0xad, 0xfb, 0xeb, 0x78, 0xe9, 0x3c, 0x2f, 0xfb, 0x18, 0x96, 0x47, 0x3c, + 0xd7, 0xf6, 0x5f, 0x2f, 0xe4, 0xf9, 0x7a, 0x09, 0xcb, 0xd6, 0x5f, 0x93, 0xe4, 0x08, 0xd9, 0xcf, 0x2a, 0xa2, 0xe6, + 0x17, 0x8c, 0x43, 0xe4, 0x4f, 0x71, 0x4c, 0x15, 0xcd, 0x5c, 0x75, 0x7a, 0x54, 0x7a, 0x83, 0x5e, 0x3c, 0x3c, 0x20, + 0x38, 0x09, 0x90, 0x27, 0x4e, 0x42, 0x18, 0x30, 0xe4, 0x14, 0xd6, 0x7c, 0x05, 0x3c, 0xe6, 0x71, 0xc3, 0x53, 0x9a, + 0xab, 0x3f, 0x01, 0x34, 0xa0, 0x02, 0xea, 0xc3, 0x0e, 0x5f, 0x2c, 0xc1, 0x86, 0x46, 0x08, 0x21, 0x9f, 0x10, 0xfc, + 0x2e, 0xff, 0x4a, 0x50, 0x16, 0x3b, 0x05, 0x32, 0x5a, 0xa7, 0xda, 0x15, 0x93, 0x95, 0x36, 0xa8, 0xff, 0x96, 0x76, + 0x53, 0x5e, 0x10, 0x39, 0x88, 0x50, 0x01, 0x06, 0xb2, 0xda, 0x50, 0xe0, 0xd5, 0x65, 0x9b, 0x69, 0x06, 0x63, 0xf5, + 0x51, 0xd3, 0x66, 0xef, 0xf6, 0x4a, 0x4f, 0x65, 0x40, 0xd4, 0x06, 0x86, 0x77, 0xfd, 0xcf, 0xe1, 0x69, 0x19, 0xcf, + 0x8b, 0x41, 0x35, 0x4e, 0x87, 0xc8, 0x70, 0x9d, 0x3a, 0x56, 0xad, 0xfc, 0xcf, 0x94, 0x12, 0xe3, 0x53, 0x51, 0xe1, + 0xc0, 0xba, 0x6a, 0xa8, 0x5a, 0x10, 0xa6, 0x8d, 0xd2, 0x3f, 0x28, 0xca, 0xa0, 0x05, 0x58, 0x1a, 0xb5, 0xc6, 0x01, + 0x9b, 0x9a, 0x5e, 0x9e, 0x1b, 0xd3, 0x89, 0x57, 0xfb, 0x9b, 0xc0, 0x84, 0xbb, 0xfa, 0x31, 0x87, 0xba, 0xb6, 0x78, + 0xae, 0xef, 0xbb, 0x8f, 0xa7, 0x3c, 0x24, 0x7a, 0x26, 0x16, 0x9a, 0xb2, 0xb9, 0xce, 0xe7, 0x1d, 0x14, 0x1b, 0x5e, + 0xd8, 0xe7, 0x2b, 0x24, 0xc8, 0x01, 0x87, 0x4d, 0x71, 0x35, 0x0e, 0xcf, 0x38, 0x27, 0x2a, 0x7d, 0x2e, 0xf6, 0x83, + 0x03, 0x38, 0x3c, 0xe7, 0x4a, 0x59, 0xcb, 0xe7, 0x6f, 0xd3, 0x19, 0x4f, 0xfa, 0x12, 0x9c, 0x94, 0x32, 0xf1, 0x8a, + 0xc5, 0x9f, 0xf1, 0xf1, 0x11, 0x67, 0x78, 0x7f, 0xa3, 0xf3, 0x69, 0x7f, 0x9b, 0xae, 0x8d, 0x79, 0x0f, 0xf2, 0x46, + 0x05, 0xcf, 0x5d, 0x58, 0xc6, 0x36, 0x51, 0x40, 0xf0, 0x37, 0x3a, 0xa7, 0x69, 0x1e, 0x42, 0x3c, 0xac, 0xa2, 0x22, + 0xbf, 0xa3, 0x48, 0x96, 0x68, 0xe1, 0x6d, 0x4e, 0x8b, 0xf4, 0x6a, 0x7a, 0xde, 0xe6, 0x4b, 0x99, 0x0e, 0xed, 0xc6, + 0xd4, 0x49, 0xb4, 0xaa, 0x30, 0x21, 0x88, 0xc0, 0x9d, 0x2e, 0x91, 0x60, 0xb7, 0x26, 0xb3, 0x27, 0xfc, 0x6b, 0x4c, + 0xe3, 0x20, 0x6e, 0xd9, 0x73, 0x8b, 0x7d, 0x4f, 0xcd, 0x1c, 0xe8, 0x85, 0x9c, 0xa1, 0x38, 0x64, 0x0c, 0xfa, 0x42, + 0xae, 0x1f, 0x8f, 0xd0, 0x49, 0x05, 0xf8, 0x55, 0xc9, 0xaf, 0x7a, 0xbc, 0x96, 0x0a, 0x95, 0xea, 0x6c, 0x22, 0x47, + 0xfb, 0xb3, 0xb4, 0xf1, 0x18, 0xfb, 0xb1, 0x3c, 0x7d, 0xed, 0xe9, 0x04, 0x50, 0xb1, 0x25, 0xb7, 0xb2, 0x6f, 0xc8, + 0x43, 0x4b, 0xbf, 0x79, 0x9c, 0x61, 0xe6, 0x08, 0xd0, 0xd9, 0xaa, 0xe0, 0xa9, 0x8b, 0xd9, 0xdb, 0x5b, 0x6e, 0x2a, + 0xb6, 0xdf, 0xf0, 0x19, 0x60, 0x27, 0x89, 0x40, 0x34, 0xaa, 0xf6, 0x59, 0xa7, 0x31, 0x79, 0x2a, 0x9e, 0x42, 0x23, + 0x60, 0x29, 0x22, 0xd7, 0x94, 0x68, 0x5d, 0xcb, 0xd0, 0x45, 0x72, 0x7c, 0xbb, 0x1c, 0x82, 0x04, 0x77, 0x68, 0xd6, + 0x48, 0xe8, 0xa9, 0xba, 0x62, 0xae, 0x54, 0x95, 0x50, 0x77, 0x3a, 0x4c, 0x79, 0x6e, 0xac, 0xf0, 0x28, 0x73, 0xd1, + 0xb9, 0x8e, 0x55, 0x25, 0xc2, 0x22, 0x2e, 0xce, 0x02, 0x2f, 0x02, 0xfc, 0x08, 0x0c, 0xe2, 0x52, 0x95, 0x65, 0xa6, + 0x08, 0x49, 0x93, 0x6d, 0x81, 0xb1, 0xe2, 0xd0, 0x6f, 0xa2, 0x9a, 0x07, 0x5f, 0xff, 0x34, 0xa1, 0x28, 0xec, 0x04, + 0x44, 0xa3, 0x41, 0xb7, 0x16, 0xd0, 0xcc, 0xfc, 0x9b, 0x72, 0x78, 0x0c, 0x9d, 0x27, 0xf1, 0x86, 0x25, 0xc9, 0xa2, + 0x3f, 0xff, 0x97, 0x06, 0x61, 0xd2, 0x3b, 0x90, 0x52, 0x95, 0x40, 0xbb, 0x61, 0x6e, 0x3e, 0x89, 0x0c, 0xd9, 0xa2, + 0x5c, 0xec, 0x71, 0x94, 0x73, 0x1b, 0xd2, 0x0a, 0x66, 0x5e, 0x42, 0xc9, 0x3b, 0x5a, 0xaf, 0xbc, 0x0e, 0xab, 0x6e, + 0x79, 0x8d, 0x97, 0x38, 0xd1, 0x2f, 0x58, 0x74, 0x4d, 0xae, 0xc1, 0x6d, 0x42, 0x03, 0x32, 0x2b, 0x13, 0xd5, 0x1b, + 0x82, 0xa7, 0x90, 0xb2, 0x31, 0xe0, 0xe2, 0xdc, 0xe0, 0xd1, 0xf9, 0x9c, 0x90, 0xb2, 0x90, 0x0b, 0xcd, 0x00, 0x27, + 0x31, 0x92, 0xd1, 0xa6, 0x2e, 0xe5, 0x42, 0x9d, 0x7e, 0xe0, 0xad, 0x83, 0x1e, 0xd6, 0x66, 0x67, 0x2b, 0xf6, 0xb2, + 0x5e, 0x31, 0xb2, 0xa6, 0xea, 0x72, 0x52, 0x6e, 0x4a, 0x68, 0x68, 0x3f, 0xc6, 0x7b, 0x19, 0x87, 0x1c, 0x66, 0xd5, + 0x18, 0x89, 0x3d, 0x23, 0x39, 0xb3, 0x49, 0x92, 0x65, 0xd6, 0x65, 0x2d, 0xfd, 0x6c, 0xae, 0xfd, 0x8f, 0x6c, 0xe1, + 0x11, 0xcb, 0x38, 0xbf, 0xd2, 0x43, 0x49, 0xb8, 0xb2, 0x4e, 0x93, 0xe7, 0xe9, 0x07, 0xe1, 0xba, 0xdb, 0xd4, 0x8c, + 0x86, 0xf7, 0x80, 0x84, 0x2c, 0x6d, 0xd9, 0xaa, 0x36, 0x36, 0x36, 0xf8, 0xb9, 0xcf, 0x03, 0x0b, 0xf1, 0xa0, 0x21, + 0x19, 0xfd, 0x7c, 0x9b, 0xc7, 0x86, 0x85, 0xce, 0xe8, 0xa0, 0x94, 0x5e, 0x4b, 0x71, 0xee, 0x05, 0x4a, 0x2c, 0xf8, + 0x72, 0xaf, 0xa4, 0xc9, 0x99, 0x07, 0x7e, 0x10, 0x67, 0x46, 0x17, 0x99, 0x77, 0xbe, 0x46, 0xdd, 0x4a, 0xef, 0x95, + 0x96, 0xf4, 0x83, 0x5f, 0xfd, 0x6c, 0x95, 0x5e, 0xa7, 0x5f, 0x22, 0x73, 0xe6, 0x2b, 0x5c, 0xa2, 0x5d, 0x81, 0x1d, + 0xc6, 0x49, 0x5d, 0xf3, 0xeb, 0x0e, 0xd0, 0xfb, 0xc2, 0x9b, 0x81, 0x46, 0x89, 0xc0, 0x0b, 0x4d, 0x2e, 0x71, 0x25, + 0xbe, 0x10, 0xde, 0x14, 0x7b, 0x98, 0xc1, 0x44, 0x6c, 0x14, 0x41, 0x3c, 0x00, 0xff, 0x1c, 0xe2, 0x97, 0x31, 0xbf, + 0xd7, 0x41, 0x6d, 0xb4, 0x20, 0x34, 0x45, 0xe6, 0x26, 0x7b, 0x11, 0x5b, 0x90, 0xc3, 0x2b, 0x81, 0x04, 0xb9, 0x66, + 0x8d, 0x1d, 0xb0, 0x65, 0x5b, 0xa1, 0x6c, 0xde, 0x70, 0x6c, 0xb0, 0x3b, 0x7b, 0x69, 0x6d, 0x12, 0x84, 0xb8, 0x44, + 0xd4, 0x9a, 0x1e, 0x19, 0xe5, 0xab, 0x96, 0x82, 0x4a, 0xf4, 0xf3, 0xf4, 0xbf, 0xb1, 0x49, 0x6f, 0x17, 0x04, 0xfd, + 0x52, 0x64, 0xda, 0x2f, 0x34, 0x0c, 0x4a, 0x8b, 0xbc, 0xff, 0x43, 0x09, 0x7c, 0x1d, 0xac, 0xe9, 0x3a, 0xd5, 0x6e, + 0x7d, 0xf1, 0x4f, 0x50, 0x3d, 0x4f, 0xc6, 0x1d, 0x46, 0x2e, 0x0c, 0x68, 0x7e, 0x6f, 0x24, 0x9d, 0xb7, 0xfe, 0xcf, + 0x12, 0x02, 0x67, 0x90, 0x25, 0x14, 0xae, 0x11, 0xf9, 0x26, 0xff, 0xc0, 0x30, 0xed, 0x15, 0xc1, 0xce, 0x8e, 0xbc, + 0x37, 0xb6, 0x93, 0x75, 0x88, 0x36, 0xf4, 0x0d, 0x98, 0xb2, 0x7e, 0xa3, 0x59, 0x36, 0x40, 0x6d, 0x3b, 0xe3, 0xb6, + 0x2b, 0x69, 0x16, 0x92, 0xe1, 0x99, 0xc5, 0x20, 0xd5, 0x46, 0x7e, 0xe6, 0x95, 0x85, 0x33, 0x73, 0x77, 0xa1, 0x91, + 0x9f, 0x3d, 0x9d, 0xe1, 0xf0, 0xc6, 0x46, 0x7a, 0xe1, 0x09, 0x4b, 0x73, 0x43, 0x07, 0x00, 0x20, 0x5c, 0x2a, 0x3a, + 0xde, 0xb1, 0x54, 0xd9, 0x4a, 0xd4, 0x57, 0x82, 0xe6, 0xe0, 0x38, 0x1b, 0x5d, 0xc8, 0x27, 0x4c, 0x18, 0xe9, 0x79, + 0x0e, 0x11, 0x8f, 0x63, 0xe5, 0x32, 0x18, 0x32, 0x07, 0x3f, 0x91, 0x60, 0x47, 0xb3, 0xc3, 0x59, 0x0e, 0x57, 0xa9, + 0x5f, 0x27, 0xa8, 0x86, 0xd4, 0x58, 0x65, 0x6c, 0xc3, 0xfa, 0xff, 0x0a, 0x27, 0x2e, 0xeb, 0x79, 0x42, 0x2f, 0x3a, + 0x2c, 0xdc, 0xc2, 0x47, 0x2e, 0xf9, 0x87, 0x38, 0x38, 0xc4, 0xd9, 0x18, 0xe7, 0x19, 0x48, 0x9e, 0x36, 0x50, 0x18, + 0x79, 0x39, 0xbe, 0x54, 0x72, 0xb6, 0x1b, 0xaa, 0x4a, 0x4a, 0x97, 0x74, 0xab, 0xbd, 0x67, 0xb2, 0x1f, 0x91, 0x13, + 0x27, 0x45, 0x24, 0x99, 0x4c, 0x2a, 0xa8, 0x53, 0x1a, 0x6c, 0xfa, 0x15, 0xc0, 0x08, 0xe6, 0x5a, 0xd7, 0x34, 0x45, + 0x69, 0x99, 0x70, 0xf8, 0x1c, 0x2d, 0xd6, 0x99, 0x43, 0xd1, 0xc1, 0x60, 0x50, 0x48, 0x33, 0xb4, 0x0b, 0x3c, 0xc8, + 0xa8, 0xcc, 0x1e, 0x7f, 0x9e, 0x9f, 0x14, 0x4d, 0xd8, 0x64, 0xc5, 0x2a, 0x51, 0xa4, 0x96, 0xb1, 0xa4, 0x54, 0x75, + 0xfe, 0xed, 0x3e, 0x1a, 0x1a, 0x1d, 0x58, 0x03, 0x3a, 0x0a, 0x25, 0x9c, 0xf7, 0x50, 0x3c, 0xe9, 0x4e, 0xcd, 0xde, + 0x7e, 0xeb, 0x77, 0x57, 0x1f, 0xe2, 0x54, 0xdf, 0x25, 0x9d, 0xdc, 0x37, 0x9e, 0xb0, 0x9d, 0xb1, 0xd7, 0xba, 0xbe, + 0x63, 0x0b, 0x60, 0x97, 0x19, 0xcf, 0xc6, 0xf0, 0xbe, 0x8e, 0xbd, 0xf8, 0x82, 0x5c, 0x3d, 0x7f, 0xd6, 0x6a, 0xf9, + 0x8c, 0x5b, 0x0a, 0xa7, 0x1c, 0xa1, 0x85, 0x45, 0x40, 0x76, 0xc0, 0x28, 0x20, 0x2f, 0xa1, 0xcb, 0x18, 0xc2, 0x83, + 0x5f, 0x1b, 0x14, 0xad, 0x0e, 0x38, 0x13, 0xe8, 0x51, 0x3f, 0xe8, 0xc1, 0xdf, 0x74, 0x12, 0x6f, 0x4c, 0xbc, 0xb7, + 0x68, 0x4a, 0xbf, 0x5a, 0x69, 0x53, 0xa6, 0x3c, 0xbb, 0xe4, 0xc3, 0xd8, 0x0e, 0x55, 0x5b, 0xbb, 0x0d, 0x35, 0xc4, + 0x67, 0xb8, 0x9f, 0xb8, 0xa2, 0x78, 0x6c, 0x06, 0xea, 0x6f, 0xfc, 0xc8, 0x3b, 0x6d, 0x3f, 0x92, 0xfb, 0x10, 0x87, + 0x1e, 0xcb, 0xbe, 0x2a, 0xfb, 0x00, 0xae, 0xd9, 0xd9, 0x58, 0x89, 0x9f, 0x15, 0x61, 0xb8, 0x1c, 0x82, 0xf1, 0x67, + 0xb5, 0x0d, 0x3d, 0xa9, 0xa7, 0xac, 0x79, 0xfc, 0x3a, 0x32, 0xbf, 0xc9, 0xc2, 0xa4, 0x5e, 0xc8, 0x9a, 0x1e, 0xa7, + 0x33, 0x43, 0xe7, 0x4c, 0xe4, 0xee, 0xd9, 0xaf, 0xd1, 0xda, 0xc8, 0x48, 0xed, 0x6c, 0xd1, 0xc7, 0xdf, 0x35, 0x55, + 0x36, 0x9a, 0x34, 0xe3, 0xb1, 0x73, 0xad, 0x4b, 0x97, 0xba, 0x8c, 0x4c, 0xf7, 0x67, 0xbd, 0x58, 0x50, 0xa5, 0x55, + 0x66, 0xde, 0x27, 0x52, 0xc3, 0xb8, 0xd6, 0x6a, 0xe2, 0x9d, 0x5e, 0x7c, 0xcb, 0x8e, 0xdd, 0x74, 0x96, 0x64, 0x30, + 0x98, 0x8e, 0xdc, 0x0c, 0x1d, 0xc9, 0x08, 0x53, 0xbf, 0x7c, 0x32, 0x30, 0xeb, 0x3a, 0x7f, 0x6f, 0x5f, 0x33, 0x8e, + 0xe2, 0x5b, 0x8f, 0x15, 0xfd, 0xb6, 0x4e, 0xb7, 0xef, 0x09, 0x70, 0x6d, 0x53, 0xfb, 0xd4, 0x5b, 0xa5, 0x9c, 0x8d, + 0xe4, 0x58, 0x4e, 0xe2, 0x09, 0x14, 0x3c, 0x00, 0x49, 0x04, 0x4c, 0x9a, 0xf9, 0xc5, 0x52, 0xc9, 0x84, 0x8d, 0xba, + 0xdb, 0xef, 0x15, 0x17, 0x18, 0xb5, 0x7f, 0x94, 0xb9, 0x9a, 0x5e, 0x8e, 0x14, 0x25, 0xd3, 0x81, 0x81, 0xa6, 0x30, + 0x96, 0x3e, 0xff, 0x62, 0x5b, 0x89, 0x05, 0x95, 0x45, 0xb1, 0xb0, 0x66, 0x74, 0x00, 0x22, 0xe8, 0x63, 0x2a, 0xa8, + 0x1a, 0x7e, 0x43, 0xca, 0xe7, 0xf4, 0xeb, 0xd9, 0xf9, 0x88, 0x6d, 0xba, 0x29, 0x7d, 0x8c, 0x07, 0xab, 0xec, 0x75, + 0x7e, 0x1f, 0x9f, 0xfa, 0x42, 0x2f, 0x5e, 0x49, 0xde, 0x59, 0xf7, 0x4f, 0xf3, 0xcf, 0xe7, 0x6c, 0xfe, 0xf9, 0xac, + 0x19, 0x60, 0x98, 0xd9, 0x18, 0xf7, 0x2a, 0x7a, 0xb5, 0xc0, 0x35, 0x4e, 0x65, 0x78, 0x1a, 0xcb, 0x7f, 0x74, 0x16, + 0xae, 0x32, 0xc0, 0x99, 0x6c, 0xa0, 0x4d, 0x65, 0x10, 0x7c, 0x73, 0xc3, 0x82, 0xa6, 0x2b, 0x27, 0x26, 0x9a, 0x99, + 0x48, 0x5c, 0x82, 0x9c, 0xc4, 0x1c, 0xec, 0xc9, 0xa5, 0xea, 0x3a, 0x25, 0x33, 0x7e, 0x66, 0xda, 0x82, 0x9e, 0xa0, + 0xf0, 0x53, 0x90, 0xa9, 0x00, 0x41, 0x74, 0xbe, 0x4f, 0xf3, 0x38, 0x4a, 0x7f, 0xe7, 0x98, 0xa7, 0xfc, 0xff, 0x89, + 0x2c, 0x11, 0xa9, 0x6b, 0x19, 0xc2, 0x01, 0xbf, 0x46, 0x34, 0x75, 0xc6, 0xef, 0xc5, 0xa0, 0x7e, 0x91, 0xde, 0xaa, + 0x11, 0x38, 0x17, 0xa0, 0xae, 0x46, 0x98, 0x06, 0xf2, 0x8e, 0xf6, 0x1a, 0xf9, 0xc5, 0xa9, 0xd2, 0x2d, 0x7b, 0x5a, + 0xf2, 0x8a, 0x2c, 0x54, 0xfe, 0xc9, 0x98, 0x62, 0x56, 0x15, 0x1d, 0x47, 0x9a, 0xf7, 0x0d, 0x36, 0xc9, 0x17, 0x4e, + 0x12, 0x7a, 0xca, 0xa9, 0xb1, 0x30, 0x6e, 0x15, 0x5e, 0xda, 0x85, 0xd1, 0x07, 0x64, 0x0e, 0x34, 0x17, 0x65, 0x3f, + 0x0e, 0x71, 0x44, 0x7c, 0xa0, 0x9f, 0xf1, 0x2d, 0x64, 0xdc, 0xf6, 0x1c, 0x27, 0xc4, 0xa9, 0xfa, 0x62, 0x28, 0x5e, + 0xc6, 0x26, 0x15, 0x92, 0x1b, 0xb2, 0x18, 0xca, 0xaa, 0x85, 0xe7, 0x67, 0xf0, 0x7c, 0xe1, 0xf9, 0x69, 0x9e, 0x1b, + 0xbc, 0x25, 0x53, 0x51, 0x46, 0x62, 0xed, 0x0a, 0x3b, 0x6a, 0xf9, 0x4d, 0x5e, 0x61, 0xef, 0x73, 0x00, 0x12, 0xd5, + 0x5e, 0x15, 0x0b, 0x72, 0x01, 0x1b, 0xd0, 0xa0, 0x3a, 0x0c, 0xf2, 0x12, 0x5f, 0x0a, 0x20, 0x00, 0xa3, 0x07, 0xef, + 0xd9, 0x71, 0x3a, 0x6d, 0x0c, 0xe3, 0x2e, 0xc7, 0x04, 0x4a, 0xae, 0xd9, 0x54, 0x12, 0xf2, 0x26, 0x27, 0x9c, 0x7d, + 0x01, 0x2a, 0x84, 0x31, 0x80, 0x3c, 0x35, 0xb6, 0x58, 0xbd, 0x7e, 0x2b, 0xd5, 0xe7, 0x04, 0xa3, 0xb0, 0x97, 0x98, + 0x7d, 0xa1, 0x1b, 0x11, 0x11, 0x39, 0x8b, 0x39, 0xb9, 0xf4, 0xda, 0x55, 0xea, 0xfb, 0xd1, 0xd9, 0x27, 0x04, 0xf4, + 0xed, 0xe4, 0x5b, 0x73, 0x13, 0x0e, 0xc7, 0x97, 0x2c, 0x33, 0xd1, 0x7f, 0xae, 0x16, 0xc8, 0xb3, 0x32, 0xe7, 0x3d, + 0x57, 0xc7, 0xae, 0x89, 0x34, 0xc5, 0xa6, 0xa0, 0x53, 0x70, 0x4a, 0x10, 0x41, 0x5b, 0x70, 0x92, 0xe4, 0x90, 0x88, + 0xca, 0x40, 0x7f, 0x36, 0x15, 0x4b, 0x30, 0x5b, 0xc3, 0x52, 0x9d, 0xd7, 0x5a, 0xec, 0x9a, 0x1f, 0xb2, 0x27, 0x99, + 0x65, 0xc3, 0x45, 0xea, 0x4c, 0x27, 0xc5, 0x75, 0x64, 0x8d, 0xc2, 0xd4, 0xb8, 0x8b, 0xc5, 0xab, 0x84, 0x2b, 0xa9, + 0xdc, 0xa4, 0x4a, 0xbc, 0xd9, 0xa8, 0x19, 0x8f, 0xc6, 0xe5, 0x8f, 0x6d, 0x76, 0xf4, 0x46, 0x4a, 0xc0, 0xe3, 0x21, + 0xd5, 0xde, 0xa6, 0x33, 0x6e, 0x43, 0xfe, 0xed, 0xea, 0x69, 0x0b, 0x58, 0xfc, 0x4f, 0x7a, 0x18, 0xe2, 0xff, 0x8d, + 0x0a, 0x8a, 0xc8, 0x36, 0x42, 0x78, 0x14, 0x02, 0x84, 0xfb, 0xc2, 0xc9, 0x0b, 0x62, 0x51, 0xc4, 0xa3, 0xb0, 0xf7, + 0x3a, 0x6b, 0xe5, 0x12, 0x16, 0x7f, 0x1f, 0x74, 0xff, 0x8e, 0x42, 0xe7, 0x5c, 0xaf, 0xf1, 0xa7, 0xe2, 0xc7, 0x1f, + 0x39, 0x76, 0x74, 0x28, 0xc2, 0x4d, 0x0c, 0xad, 0x04, 0xcf, 0xb6, 0x44, 0x75, 0xac, 0x0a, 0x46, 0x84, 0x30, 0x07, + 0xa9, 0x6a, 0xc1, 0x04, 0xbb, 0xf0, 0x13, 0x2c, 0x3e, 0x10, 0x4e, 0xff, 0x1b, 0x1a, 0xb7, 0x09, 0x61, 0x36, 0x58, + 0xe5, 0xa8, 0x93, 0x27, 0xf1, 0x6a, 0x9f, 0xf9, 0x23, 0xe3, 0xd6, 0x57, 0x5f, 0xa4, 0xd5, 0x48, 0xf6, 0x14, 0x33, + 0x38, 0xbc, 0x76, 0x4b, 0x99, 0x19, 0x9f, 0x23, 0x26, 0x55, 0xf3, 0xe4, 0x45, 0x41, 0xa9, 0xa1, 0xae, 0x59, 0x9e, + 0x0b, 0xf3, 0x9c, 0xe1, 0xb9, 0xc0, 0x60, 0x2c, 0xeb, 0xb2, 0xc6, 0x19, 0x9f, 0xc6, 0x56, 0x0c, 0x8c, 0x3b, 0x1e, + 0x0e, 0x7a, 0x8e, 0x39, 0x54, 0x80, 0x5e, 0x04, 0x6e, 0x22, 0x3e, 0xe9, 0x25, 0x70, 0xea, 0xd4, 0x86, 0xf3, 0xcc, + 0x5c, 0x8e, 0x98, 0xf2, 0x0c, 0xa7, 0x98, 0xd2, 0xef, 0xdc, 0x26, 0xd2, 0x6e, 0x7d, 0xad, 0xc9, 0x47, 0xc1, 0xad, + 0x7a, 0x3a, 0xac, 0x23, 0x1a, 0x97, 0x16, 0xc1, 0x93, 0x45, 0x79, 0xd8, 0xbf, 0xf1, 0x9c, 0x5f, 0x89, 0xb4, 0x93, + 0x52, 0x25, 0x3a, 0x9f, 0x79, 0x0e, 0x42, 0x48, 0x93, 0x96, 0xd0, 0xf6, 0xb9, 0x20, 0x25, 0xc6, 0xb5, 0x53, 0x8a, + 0xd8, 0xcd, 0xc1, 0xfe, 0xd7, 0x53, 0xb9, 0x48, 0xab, 0xeb, 0x87, 0x77, 0x8b, 0x85, 0xd8, 0x4e, 0xc8, 0x79, 0x2e, + 0x64, 0xef, 0xfd, 0x6b, 0x12, 0x5e, 0x27, 0xe5, 0x97, 0xfd, 0x20, 0x71, 0xef, 0x5c, 0x6a, 0xfe, 0x5f, 0x38, 0x6c, + 0x7a, 0xf4, 0xca, 0xc1, 0x6c, 0x33, 0x01, 0x93, 0xa3, 0x52, 0x55, 0xdf, 0x8f, 0x80, 0xd4, 0xf0, 0x30, 0x40, 0x59, + 0xc5, 0xfe, 0x41, 0xbd, 0x25, 0x00, 0xb8, 0xd4, 0xb3, 0xfd, 0xb0, 0xb4, 0xbf, 0xfb, 0x61, 0xab, 0x13, 0x2e, 0x57, + 0x4a, 0xfe, 0x1b, 0x18, 0x42, 0x97, 0x86, 0xe4, 0xb0, 0x75, 0xd6, 0x03, 0x21, 0x77, 0x9e, 0x73, 0x8a, 0x51, 0x5c, + 0x4b, 0xbe, 0x60, 0xfb, 0x91, 0x94, 0xd7, 0xc9, 0x7c, 0x7e, 0xb1, 0xb5, 0x82, 0xcf, 0x3a, 0xa9, 0xbf, 0xa8, 0x44, + 0xff, 0x05, 0xec, 0x3b, 0x88, 0x0f, 0xcf, 0x13, 0xab, 0xca, 0x0f, 0x1d, 0x87, 0x23, 0xac, 0xb0, 0x95, 0x2a, 0x0d, + 0xcd, 0x23, 0xd3, 0xc7, 0x94, 0x9c, 0x9a, 0x80, 0x71, 0x48, 0x72, 0xb6, 0x56, 0x91, 0x4b, 0x92, 0x6a, 0x16, 0xee, + 0xeb, 0x06, 0x9f, 0x84, 0xe9, 0x92, 0x56, 0xe1, 0x1e, 0xa0, 0x7f, 0x0c, 0x7a, 0xfe, 0xcf, 0x4a, 0x71, 0xc0, 0xb0, + 0xea, 0x85, 0x4c, 0xfc, 0x64, 0x00, 0xd7, 0x66, 0x9e, 0xcc, 0x71, 0xe3, 0x6d, 0xd4, 0x47, 0x6d, 0x4b, 0xc0, 0x4f, + 0xa2, 0x27, 0x8f, 0x61, 0x4c, 0x16, 0x86, 0x02, 0x77, 0x2e, 0xf5, 0x73, 0xb0, 0x70, 0xc3, 0x31, 0xfa, 0x86, 0xe0, + 0x5b, 0xfe, 0xfc, 0x0e, 0xd4, 0x71, 0x8c, 0x86, 0x2e, 0x8d, 0xa4, 0xf4, 0x3b, 0x14, 0x44, 0x1a, 0x48, 0xa0, 0x79, + 0xee, 0x6b, 0x28, 0x9c, 0x4e, 0x22, 0x3b, 0xc9, 0x11, 0xd6, 0xce, 0x82, 0x59, 0xab, 0x9c, 0xbe, 0x9e, 0xed, 0x3b, + 0x0c, 0xd0, 0xb5, 0xcb, 0xe9, 0x7d, 0xae, 0xbf, 0x95, 0xa9, 0x9f, 0x2b, 0x84, 0x96, 0x65, 0x9b, 0x9d, 0x43, 0x20, + 0x94, 0x6b, 0xf5, 0x34, 0x44, 0xc1, 0x10, 0xef, 0x74, 0xac, 0x6e, 0xd0, 0x47, 0x2a, 0x5a, 0xe7, 0xab, 0x0d, 0xda, + 0x7c, 0xab, 0xf0, 0xd2, 0xf5, 0xca, 0xf6, 0x34, 0x24, 0xc5, 0x34, 0x62, 0x38, 0xf8, 0x66, 0x42, 0x67, 0xf2, 0x3e, + 0x6e, 0x90, 0x4d, 0x9c, 0x21, 0x79, 0xb8, 0x8e, 0x58, 0xba, 0x4a, 0x58, 0x54, 0xb6, 0xf0, 0x74, 0x4a, 0x3b, 0x5c, + 0xdd, 0x15, 0xe1, 0xe6, 0x4c, 0x06, 0x6a, 0xb9, 0x8e, 0xbe, 0x89, 0xc4, 0x20, 0x07, 0x6c, 0xb9, 0x4e, 0x1f, 0x1d, + 0x55, 0xaa, 0x90, 0xe9, 0x76, 0xde, 0xbc, 0x86, 0x05, 0x87, 0x2d, 0x63, 0x29, 0x0d, 0x30, 0xf0, 0x5d, 0x7b, 0x79, + 0x5f, 0x6d, 0x76, 0x2a, 0x3c, 0xe6, 0xbc, 0x4b, 0x69, 0x91, 0x57, 0xa9, 0x7f, 0x6e, 0xe3, 0xb5, 0xf9, 0xd5, 0xdc, + 0x46, 0x17, 0xbc, 0x39, 0x27, 0x3a, 0xad, 0x6f, 0x31, 0x5e, 0x76, 0x88, 0x68, 0xe7, 0x3e, 0x97, 0x79, 0xba, 0x85, + 0xd4, 0x62, 0xcc, 0x3a, 0xc7, 0x4c, 0x4f, 0x4b, 0x8b, 0xf2, 0x11, 0x63, 0x50, 0xc9, 0x9d, 0xf2, 0xcd, 0xc8, 0x53, + 0x8d, 0xc2, 0x10, 0xab, 0x6d, 0xe8, 0x19, 0xb4, 0xd2, 0x4f, 0x34, 0xfb, 0xf6, 0x76, 0xb3, 0x06, 0xa8, 0xc4, 0x62, + 0x1f, 0x99, 0x65, 0xe1, 0xe3, 0x72, 0x07, 0xa1, 0x83, 0x34, 0xb7, 0x93, 0xc3, 0x38, 0x3d, 0x46, 0x2b, 0xf4, 0xbb, + 0xf6, 0x14, 0xb3, 0x80, 0x48, 0x52, 0x2f, 0x90, 0xce, 0x01, 0x77, 0x49, 0xfd, 0x59, 0x9c, 0x19, 0x61, 0x3e, 0x7a, + 0x29, 0xa1, 0xdc, 0x25, 0x94, 0x1b, 0xaf, 0xf3, 0x24, 0x00, 0x3e, 0x89, 0xb6, 0xd7, 0x56, 0x9c, 0xe6, 0x9c, 0xd7, + 0xb6, 0x08, 0xc3, 0xae, 0xeb, 0xc5, 0x48, 0x72, 0x33, 0x7b, 0x61, 0xcc, 0x18, 0x04, 0x22, 0xa8, 0xe8, 0xe6, 0x80, + 0xc9, 0x98, 0x3a, 0xc2, 0x41, 0xe7, 0x4f, 0xb2, 0xa9, 0xa6, 0xb4, 0x98, 0xda, 0xd1, 0xff, 0xce, 0x1e, 0xfc, 0xf0, + 0x68, 0x7a, 0xfe, 0xeb, 0xdb, 0xfc, 0x1a, 0x34, 0x41, 0x0f, 0xe1, 0x7e, 0x77, 0x35, 0x53, 0xa1, 0xa0, 0xb0, 0xb2, + 0x7d, 0x69, 0x01, 0x50, 0x63, 0x2a, 0x4a, 0x57, 0xd7, 0xd6, 0xfd, 0x49, 0xc6, 0xa7, 0x35, 0x6d, 0x7c, 0x1d, 0xa8, + 0xf2, 0xb5, 0xa1, 0x6c, 0xdd, 0xe1, 0xf3, 0x50, 0xcd, 0x78, 0x0a, 0xda, 0x5c, 0x18, 0xfc, 0x0a, 0x39, 0x6e, 0x42, + 0x27, 0x43, 0x95, 0x4d, 0xb3, 0x13, 0x6f, 0x59, 0x25, 0x6b, 0x29, 0x39, 0x91, 0x12, 0xf6, 0xaa, 0xf2, 0x47, 0xdd, + 0x93, 0xd4, 0x96, 0x6a, 0x70, 0x83, 0x13, 0x94, 0x36, 0x3a, 0xfa, 0x2a, 0x6e, 0xe4, 0xa7, 0x1b, 0x40, 0x44, 0x4d, + 0x4f, 0x87, 0xf6, 0x76, 0xfe, 0x79, 0x6f, 0x8c, 0xb0, 0x49, 0x05, 0x3f, 0xca, 0xa8, 0xa9, 0x1a, 0x9e, 0xfb, 0x53, + 0xaf, 0x6c, 0x87, 0x67, 0xba, 0x9b, 0x2c, 0x6a, 0x8b, 0x3e, 0xe3, 0x02, 0xac, 0x9a, 0x68, 0xaa, 0x71, 0xa1, 0x08, + 0x63, 0x1a, 0x6f, 0xce, 0xda, 0x89, 0xb5, 0xea, 0xd5, 0xed, 0xac, 0x97, 0x1e, 0x6d, 0xb3, 0x05, 0x6a, 0xbc, 0x68, + 0xda, 0xf2, 0x2a, 0x7c, 0xb7, 0xa4, 0x9b, 0x95, 0x23, 0xc8, 0xdc, 0x04, 0xe8, 0x67, 0x3f, 0x64, 0x26, 0x7a, 0x07, + 0xe1, 0x4e, 0x2a, 0xd9, 0x93, 0x8a, 0xcd, 0x78, 0xbe, 0xbd, 0x72, 0x7e, 0x5a, 0x92, 0x6d, 0xc4, 0xda, 0x8d, 0x2a, + 0xe3, 0xb1, 0x35, 0xc8, 0xdb, 0x35, 0xd3, 0x59, 0xa2, 0xbf, 0x86, 0x7b, 0xfd, 0xf9, 0x76, 0x0d, 0x4d, 0xb7, 0xd5, + 0xdc, 0x79, 0xe9, 0xe4, 0x28, 0x29, 0x79, 0xf1, 0x03, 0x7b, 0x6c, 0xe1, 0x7c, 0xb0, 0xf1, 0x90, 0x60, 0x99, 0x8a, + 0x55, 0x9f, 0x55, 0xac, 0xf2, 0x2c, 0x11, 0x85, 0xd9, 0xd3, 0x2e, 0x80, 0xe3, 0x0f, 0x2b, 0xb9, 0x8a, 0x1f, 0x66, + 0x5a, 0xb5, 0x7c, 0x58, 0x08, 0xd5, 0xf4, 0x24, 0x10, 0x19, 0x98, 0x35, 0xf2, 0x70, 0x61, 0xea, 0x98, 0x4c, 0x4a, + 0x49, 0x20, 0x57, 0x58, 0x4d, 0xab, 0x6a, 0xd5, 0x87, 0x1f, 0x6e, 0xb8, 0x41, 0x5d, 0xf9, 0x67, 0x33, 0xae, 0xff, + 0xaf, 0x99, 0x89, 0xe5, 0xa0, 0xb1, 0xd0, 0xfa, 0x27, 0x2d, 0xcc, 0xfd, 0x08, 0xdd, 0x35, 0xc3, 0x95, 0xe9, 0x4b, + 0x14, 0xf3, 0x2b, 0x46, 0x66, 0x5b, 0xe4, 0xb5, 0x32, 0xd8, 0xc5, 0xde, 0x98, 0x49, 0x5b, 0x27, 0xc6, 0x34, 0x36, + 0x24, 0x56, 0x67, 0x51, 0x23, 0x43, 0x6a, 0x6b, 0xf3, 0x9d, 0xbe, 0xa2, 0xf9, 0x25, 0x2f, 0xf1, 0x97, 0x69, 0xc8, + 0xc2, 0x7c, 0xab, 0xe8, 0x8d, 0xf4, 0x1a, 0x7a, 0x09, 0xfe, 0x62, 0xe1, 0xde, 0x04, 0x78, 0x8e, 0x22, 0x2a, 0x46, + 0x63, 0xf0, 0x4d, 0x16, 0x07, 0x7a, 0xbf, 0xc2, 0xad, 0x20, 0xc3, 0x94, 0x15, 0xff, 0x5f, 0x03, 0xad, 0xf4, 0x2f, + 0x20, 0xf6, 0x0d, 0xbe, 0xc0, 0xca, 0x5b, 0x41, 0xb9, 0x87, 0xe9, 0xfe, 0x02, 0xdf, 0x0a, 0x71, 0x30, 0x68, 0x44, + 0x4d, 0x58, 0xeb, 0x3d, 0xc5, 0x38, 0x31, 0x3d, 0xf8, 0x67, 0x7a, 0x68, 0x25, 0x08, 0x87, 0x31, 0x86, 0x0e, 0x52, + 0x80, 0x60, 0xa5, 0x7c, 0xf5, 0xf5, 0xa1, 0x55, 0xa1, 0x64, 0xe4, 0xab, 0x66, 0x83, 0x4f, 0xb1, 0x9d, 0xa7, 0xd8, + 0x3e, 0x2b, 0x5f, 0x5a, 0x6b, 0x4d, 0x67, 0xab, 0x46, 0x7a, 0xbe, 0x0a, 0x2e, 0x30, 0xec, 0x60, 0xe0, 0xbc, 0x0a, + 0xbe, 0x22, 0x41, 0x93, 0x40, 0x58, 0x40, 0x83, 0xe7, 0x36, 0x94, 0x93, 0x0f, 0x09, 0x94, 0xba, 0x04, 0xbb, 0xcd, + 0x8f, 0x48, 0x6e, 0x03, 0x21, 0xb5, 0x18, 0x67, 0x0b, 0x7b, 0x70, 0x26, 0xcd, 0xfa, 0xb9, 0xb1, 0x1e, 0x5a, 0x89, + 0x92, 0x36, 0x5d, 0x9e, 0x0d, 0xae, 0x19, 0x29, 0xac, 0x93, 0xff, 0x2f, 0x39, 0x6e, 0xf3, 0xbd, 0x2a, 0x08, 0xae, + 0xc4, 0x49, 0x5f, 0xeb, 0x29, 0x28, 0x77, 0x3a, 0x74, 0xe0, 0x8e, 0x20, 0x4b, 0xd9, 0xf3, 0xcc, 0xd3, 0xe7, 0x76, + 0x81, 0x9d, 0x98, 0xed, 0x9e, 0x95, 0xce, 0x70, 0xc2, 0xf1, 0xfb, 0x05, 0xef, 0x2e, 0xfd, 0x39, 0xa4, 0xdc, 0xdf, + 0x57, 0x96, 0x8c, 0x77, 0xc7, 0xdd, 0xb3, 0x3f, 0xc7, 0x1b, 0xb7, 0xfc, 0x29, 0xf7, 0xc3, 0x6d, 0x24, 0xdd, 0xf0, + 0xaa, 0xf9, 0x17, 0x8f, 0x6c, 0xe5, 0x56, 0x42, 0xd0, 0x3a, 0x9d, 0xe3, 0x9b, 0xaf, 0x41, 0xa7, 0x12, 0xb6, 0xf8, + 0xf1, 0x5d, 0xf2, 0x5b, 0x63, 0x2f, 0x46, 0x61, 0x70, 0x68, 0xa6, 0x76, 0x95, 0x9c, 0xb7, 0xe0, 0xb6, 0x4c, 0xed, + 0x56, 0x81, 0x34, 0x7a, 0xe7, 0xb9, 0xfa, 0x3a, 0xfd, 0x54, 0x35, 0xff, 0x31, 0x73, 0x13, 0xf6, 0xb1, 0x42, 0x91, + 0xf8, 0x67, 0x6a, 0x74, 0x83, 0x91, 0xca, 0x03, 0x75, 0x81, 0x55, 0x4b, 0x82, 0xca, 0xdb, 0x11, 0x3f, 0xe5, 0xd7, + 0xdc, 0xe5, 0x48, 0x6c, 0x84, 0xfd, 0x69, 0x6c, 0x3e, 0x53, 0x9f, 0xed, 0x6c, 0x99, 0x65, 0xb7, 0x8f, 0x99, 0x87, + 0x47, 0xf9, 0x5b, 0xaa, 0x5b, 0xe4, 0x7b, 0xb3, 0x2c, 0x2f, 0xca, 0xec, 0xd4, 0x3e, 0x87, 0x4f, 0xb4, 0xd1, 0x24, + 0x7f, 0xe3, 0x71, 0x2f, 0xb1, 0x21, 0xd9, 0x34, 0x2f, 0x33, 0x87, 0xd8, 0xc3, 0xf3, 0x1b, 0x3f, 0x65, 0x53, 0x99, + 0x28, 0x38, 0x6d, 0x87, 0xa6, 0x03, 0xf7, 0x0d, 0xd4, 0x41, 0x15, 0x20, 0xa7, 0x2b, 0xb0, 0xd1, 0x80, 0x59, 0x6d, + 0xd4, 0x97, 0xa5, 0xb2, 0x8a, 0xb3, 0xae, 0xdb, 0x75, 0xfa, 0xc5, 0x46, 0x12, 0xb8, 0xb1, 0x47, 0x91, 0x3c, 0x9d, + 0x95, 0xae, 0xf1, 0x57, 0x79, 0xc9, 0x1c, 0xa5, 0x0f, 0xf8, 0xfc, 0x5b, 0xf0, 0x48, 0xfe, 0x52, 0x74, 0x8d, 0xab, + 0xdc, 0x66, 0x34, 0x6a, 0xcc, 0xc9, 0x78, 0x43, 0xd8, 0x58, 0x14, 0x55, 0x31, 0x35, 0xa7, 0xfc, 0x9c, 0x19, 0x8d, + 0xe4, 0x05, 0x09, 0xf2, 0xb9, 0xb7, 0xfb, 0x99, 0x5c, 0xf0, 0x2b, 0xd7, 0xa1, 0x57, 0x56, 0xa3, 0xe2, 0x4b, 0xe7, + 0xb8, 0xb7, 0xee, 0x50, 0x80, 0x0c, 0xd8, 0x43, 0x86, 0x9c, 0xf2, 0x56, 0xd3, 0xbe, 0x5e, 0x7e, 0xff, 0x82, 0x91, + 0x14, 0xab, 0xb2, 0xef, 0xc6, 0x26, 0x4c, 0x22, 0x3b, 0xc2, 0x5e, 0x35, 0xb2, 0x9b, 0x63, 0x11, 0x21, 0x21, 0x19, + 0xf7, 0x4c, 0xc8, 0xe8, 0xad, 0x5e, 0x26, 0x80, 0x73, 0xe2, 0x49, 0xe1, 0x4c, 0x4e, 0x9c, 0xc8, 0xb2, 0xb4, 0x15, + 0x5b, 0x62, 0xe1, 0x08, 0x5f, 0x6b, 0xca, 0x6c, 0xdb, 0x18, 0x2b, 0x68, 0x70, 0xcc, 0x01, 0xa2, 0x33, 0x9f, 0xf1, + 0x86, 0x09, 0xe7, 0xfc, 0xa9, 0xf2, 0xbe, 0x59, 0xa6, 0x41, 0x5f, 0x15, 0x2c, 0x6c, 0xb7, 0x9e, 0x20, 0xca, 0x34, + 0x03, 0x03, 0xf2, 0x6d, 0x85, 0x6a, 0xfe, 0x95, 0x97, 0x28, 0xf8, 0xee, 0x32, 0xf2, 0xf3, 0xe7, 0x70, 0x1b, 0x21, + 0x1a, 0x04, 0x8d, 0xed, 0x85, 0x51, 0xb2, 0xb3, 0xac, 0x86, 0x5c, 0x84, 0x93, 0xe0, 0x83, 0xdd, 0x53, 0xb8, 0x3e, + 0x87, 0xa4, 0x97, 0xe0, 0x29, 0x30, 0x4f, 0x68, 0xa4, 0xb4, 0xdf, 0xf7, 0x2e, 0x08, 0x84, 0xe6, 0x2d, 0x8f, 0x70, + 0x40, 0x32, 0x62, 0x36, 0x16, 0x1e, 0x37, 0x0b, 0x97, 0x56, 0xc1, 0xa9, 0xcb, 0x6a, 0xd4, 0x15, 0xc9, 0x25, 0x85, + 0x34, 0x63, 0xf0, 0x60, 0x74, 0x24, 0x24, 0x96, 0x85, 0x60, 0xcc, 0x86, 0xbf, 0xf5, 0x02, 0xeb, 0xa7, 0x39, 0x00, + 0xf6, 0x04, 0xf1, 0xd8, 0x84, 0xe9, 0x0d, 0x44, 0x78, 0xb6, 0x2d, 0x0f, 0x98, 0xf7, 0x05, 0x1a, 0xcf, 0xf9, 0x98, + 0x52, 0xe6, 0x7c, 0x01, 0x2e, 0x33, 0xf1, 0x62, 0x20, 0x87, 0x80, 0x7b, 0x88, 0x87, 0xfc, 0xe0, 0xb1, 0x97, 0x60, + 0x67, 0x64, 0xa5, 0xbb, 0x5d, 0xbb, 0x71, 0xcc, 0x2d, 0x45, 0x0e, 0xbc, 0xd8, 0x3f, 0x38, 0xac, 0x6b, 0xb1, 0x4a, + 0xbf, 0x69, 0xa0, 0xd2, 0xbf, 0xfa, 0xf7, 0xcd, 0xe7, 0xc8, 0xb7, 0xcf, 0xb5, 0xd4, 0xa2, 0xf8, 0x81, 0x77, 0x56, + 0x93, 0x82, 0x76, 0xff, 0xab, 0x26, 0x23, 0x5f, 0x52, 0x5a, 0x2d, 0x8b, 0x4f, 0xb5, 0x8b, 0x9e, 0xa2, 0x5a, 0x36, + 0x79, 0x6e, 0x0f, 0x49, 0x8e, 0x5e, 0x6b, 0x19, 0x56, 0xb5, 0x3d, 0xea, 0x83, 0xbd, 0xd7, 0x7b, 0x41, 0x1e, 0x52, + 0x0f, 0x89, 0xaa, 0x37, 0x5e, 0x40, 0xc5, 0x7f, 0xf5, 0x95, 0xea, 0x99, 0x5f, 0xd0, 0x90, 0x37, 0xca, 0x31, 0xbe, + 0x6c, 0x9c, 0xb6, 0xae, 0x1e, 0xc5, 0x14, 0xac, 0x14, 0x65, 0x65, 0x88, 0x1b, 0x59, 0xa1, 0x6b, 0x44, 0x5a, 0x03, + 0x7f, 0x63, 0xa3, 0x14, 0x5b, 0x4d, 0xb5, 0x91, 0xf4, 0xdf, 0x99, 0xfe, 0x0f, 0x89, 0xec, 0xff, 0x14, 0xc7, 0xfe, + 0x8f, 0x73, 0x84, 0x16, 0xf6, 0x8d, 0x65, 0x44, 0xc0, 0x15, 0x4d, 0x8a, 0xe3, 0x2b, 0x83, 0xb3, 0x44, 0x50, 0xa3, + 0x89, 0xc8, 0x6e, 0x3c, 0x51, 0x99, 0x11, 0x79, 0x6e, 0x15, 0x3c, 0x4b, 0x7b, 0x74, 0x4f, 0xee, 0xef, 0x9c, 0x40, + 0x94, 0x63, 0x52, 0x6d, 0x6f, 0xc6, 0x9c, 0xc3, 0x10, 0x17, 0x93, 0x8b, 0x0a, 0x60, 0x04, 0x37, 0x84, 0x6c, 0x2c, + 0x81, 0x8e, 0x92, 0xec, 0x47, 0x23, 0xe6, 0x00, 0x34, 0xc0, 0x7e, 0xd9, 0x20, 0xb0, 0x1c, 0xcc, 0x30, 0x43, 0x30, + 0x3a, 0xaf, 0x0e, 0xf0, 0x39, 0x66, 0x7b, 0xc7, 0x26, 0xf8, 0xb0, 0x32, 0x07, 0x3b, 0xd0, 0x20, 0x1c, 0x30, 0x8f, + 0x66, 0x79, 0x26, 0x28, 0x9a, 0xe0, 0x23, 0xea, 0x2c, 0xfb, 0x5c, 0xfc, 0x92, 0xa5, 0xad, 0xd7, 0x25, 0x87, 0x2e, + 0x16, 0x9f, 0x66, 0xd6, 0x50, 0xfa, 0x13, 0xf8, 0x5f, 0x83, 0x3b, 0xb0, 0xc7, 0x1d, 0x24, 0xc2, 0x56, 0x14, 0x4e, + 0xa5, 0xea, 0x9f, 0x5d, 0x06, 0x84, 0x92, 0x9e, 0x66, 0x48, 0xb9, 0x40, 0xeb, 0x1a, 0xe2, 0x1a, 0x6c, 0x0c, 0x86, + 0xed, 0x8c, 0x67, 0x9a, 0xdb, 0xd6, 0x33, 0xe3, 0xa4, 0x5e, 0xa3, 0x4d, 0x46, 0x87, 0x64, 0x5e, 0x44, 0x99, 0xbb, + 0xc8, 0x2f, 0x47, 0x4a, 0xad, 0xb9, 0x51, 0xac, 0x31, 0xe5, 0xa5, 0xd3, 0xec, 0xc3, 0x39, 0x82, 0xd3, 0x45, 0x50, + 0xf5, 0xc3, 0x1e, 0x9c, 0xb5, 0x31, 0xf8, 0x91, 0x62, 0x51, 0x20, 0xbd, 0x5d, 0x11, 0x52, 0xf3, 0x93, 0x1d, 0xab, + 0x59, 0x4c, 0x4b, 0x6f, 0x17, 0x1e, 0xce, 0xb7, 0xc5, 0x14, 0x64, 0x1c, 0x08, 0xf9, 0x23, 0x18, 0xd8, 0x14, 0x77, + 0x66, 0xa2, 0x2d, 0x82, 0xe0, 0x04, 0xa1, 0x8c, 0x48, 0x87, 0x6f, 0x45, 0x29, 0x2a, 0x02, 0x91, 0xfb, 0xd1, 0x7b, + 0x4c, 0xcb, 0x6a, 0x28, 0xad, 0x81, 0x3d, 0x2a, 0x2a, 0x06, 0xca, 0xeb, 0x4c, 0x68, 0x38, 0x45, 0x8b, 0x90, 0xa9, + 0x78, 0xb3, 0x00, 0x2b, 0x37, 0xf8, 0xa4, 0xc5, 0x4a, 0xcf, 0x58, 0xf6, 0x07, 0xf9, 0x4a, 0x59, 0xd1, 0x30, 0x81, + 0xee, 0x31, 0x55, 0xdb, 0x7f, 0xe3, 0xa2, 0x8d, 0xb9, 0x01, 0x7e, 0x06, 0x8c, 0xe2, 0x7a, 0x85, 0x09, 0xab, 0x15, + 0xdc, 0x01, 0x2c, 0xbd, 0x71, 0x6f, 0xd5, 0x4c, 0xc9, 0xa7, 0x5c, 0x49, 0x29, 0x13, 0xac, 0x77, 0x2a, 0x4b, 0x70, + 0xf2, 0x21, 0x04, 0x43, 0x7c, 0xf7, 0x65, 0xe6, 0xd7, 0x6b, 0x9e, 0xda, 0x84, 0x27, 0xd1, 0x9e, 0xf6, 0xd1, 0x37, + 0x6e, 0xc3, 0xab, 0x16, 0x43, 0x5c, 0x9d, 0x65, 0xe7, 0xe4, 0x4b, 0x64, 0x4d, 0xe5, 0x80, 0x1f, 0xb1, 0x1a, 0xea, + 0x12, 0xf8, 0x8c, 0x98, 0x37, 0x0c, 0xe6, 0x6f, 0x74, 0x8a, 0xc5, 0xbc, 0xa9, 0x22, 0xc5, 0xe1, 0xfe, 0x08, 0x8b, + 0x8c, 0x4b, 0x94, 0x23, 0x7d, 0xc8, 0xbf, 0x83, 0xc1, 0xa8, 0xd2, 0xcd, 0x8a, 0xfa, 0x9a, 0xf1, 0xbc, 0xed, 0x63, + 0x6b, 0x12, 0xb6, 0x00, 0x6b, 0x91, 0xf1, 0x04, 0xe8, 0xbe, 0x56, 0x6f, 0x0b, 0xd9, 0x9a, 0x68, 0x89, 0x86, 0xa6, + 0x50, 0xd4, 0x0d, 0x04, 0x13, 0x93, 0xd2, 0xee, 0xc0, 0x48, 0x82, 0xf1, 0xac, 0xa9, 0xfc, 0x82, 0xfc, 0xb8, 0x5e, + 0xc4, 0xd6, 0x98, 0x0b, 0x1d, 0x33, 0xa2, 0x49, 0x4d, 0x9a, 0x09, 0x88, 0x05, 0xf0, 0x72, 0x16, 0x3d, 0xac, 0xf3, + 0x84, 0x53, 0x73, 0xef, 0xd4, 0x11, 0x33, 0x30, 0x40, 0xa7, 0x10, 0xa9, 0x14, 0x3f, 0xbc, 0x0f, 0x52, 0x0a, 0x04, + 0xa0, 0xec, 0x98, 0x0d, 0x2d, 0x29, 0xa8, 0x4f, 0x6b, 0x97, 0x99, 0x5a, 0xdb, 0x1a, 0xfe, 0x94, 0xd9, 0xac, 0x45, + 0x55, 0xcc, 0x1f, 0x2e, 0xf3, 0x8b, 0x98, 0x71, 0xd1, 0xf0, 0x09, 0x43, 0xd5, 0x61, 0x05, 0x7a, 0x8f, 0x9b, 0xbc, + 0x5e, 0x99, 0xf0, 0x7e, 0x5e, 0xef, 0x9b, 0xfb, 0x22, 0x16, 0x5e, 0x14, 0x38, 0xf7, 0xa5, 0x82, 0x97, 0x86, 0x13, + 0xb8, 0xc4, 0x43, 0x99, 0xf9, 0x54, 0xb6, 0x95, 0x99, 0xa2, 0x04, 0x25, 0xb5, 0x88, 0x5c, 0x92, 0x0b, 0x82, 0x94, + 0x8a, 0x97, 0x81, 0x50, 0xdb, 0xb7, 0x0b, 0x90, 0xbd, 0xaf, 0x2d, 0xe3, 0xb5, 0x64, 0xe7, 0x22, 0x94, 0xcd, 0x66, + 0x5c, 0xdb, 0xcb, 0x69, 0xb7, 0xbf, 0x95, 0x41, 0x35, 0x00, 0x25, 0xb3, 0xe1, 0x32, 0xe2, 0x9b, 0x9b, 0x1d, 0x0a, + 0x08, 0xed, 0xfc, 0x6d, 0x57, 0xca, 0x2c, 0xcc, 0x41, 0xd7, 0xec, 0xa8, 0xf8, 0x17, 0xe5, 0xdd, 0x59, 0xed, 0x66, + 0x7c, 0xc9, 0x3b, 0x18, 0xdf, 0x14, 0xca, 0x01, 0x2e, 0x79, 0x21, 0xeb, 0x07, 0x6e, 0x94, 0xc8, 0x12, 0xc2, 0x32, + 0xbb, 0xa8, 0x15, 0x95, 0xc9, 0x98, 0x36, 0xbd, 0xad, 0xc8, 0x66, 0x23, 0x63, 0x5d, 0x96, 0x68, 0x79, 0x6e, 0xc5, + 0xc9, 0xab, 0x87, 0x3f, 0x52, 0xe5, 0xf4, 0x7d, 0x89, 0xfa, 0xd4, 0x07, 0x77, 0x6f, 0x2b, 0xb3, 0x84, 0x4f, 0x4d, + 0x13, 0x45, 0x70, 0x07, 0xcc, 0x55, 0xb6, 0x22, 0x6a, 0x61, 0x48, 0xfd, 0x17, 0x5e, 0xfa, 0xc6, 0x13, 0xaa, 0xb6, + 0x73, 0xd5, 0xab, 0x39, 0x24, 0x66, 0x8c, 0xe7, 0x68, 0xf5, 0x01, 0xb2, 0x81, 0xae, 0xcd, 0xbe, 0x02, 0x02, 0xaf, + 0x99, 0xfc, 0xf2, 0xdb, 0x61, 0xcc, 0xd9, 0x6d, 0x5e, 0x68, 0x64, 0x2b, 0x67, 0xd9, 0xc1, 0x8d, 0xb4, 0x55, 0x7b, + 0x3c, 0xd3, 0x4d, 0x5c, 0x69, 0x99, 0x8c, 0x31, 0xbf, 0xad, 0xea, 0xab, 0x05, 0xdf, 0x99, 0xdb, 0xce, 0x4a, 0xa6, + 0x91, 0xab, 0xd5, 0x57, 0x78, 0x5e, 0x34, 0x41, 0x27, 0x2e, 0x31, 0x53, 0xab, 0xea, 0xb7, 0xaa, 0x1c, 0x15, 0x15, + 0xcb, 0xb9, 0xd5, 0xa6, 0xca, 0x6b, 0xb7, 0xa8, 0xdf, 0x9f, 0x8d, 0x09, 0x41, 0x65, 0x8a, 0xcc, 0x58, 0xa2, 0x8b, + 0x78, 0xa1, 0x9f, 0xd3, 0xba, 0xa8, 0xe8, 0xf1, 0xca, 0xaa, 0x86, 0x18, 0x02, 0xb7, 0xda, 0xc9, 0x20, 0x65, 0x16, + 0x89, 0x79, 0x16, 0x31, 0xdb, 0xeb, 0xd1, 0xb6, 0x39, 0x1b, 0x06, 0x6e, 0xd2, 0x39, 0x81, 0x73, 0x12, 0xfe, 0xa6, + 0x32, 0xdb, 0xb0, 0xa2, 0x6e, 0x79, 0x8d, 0xae, 0xa2, 0x6e, 0xcd, 0x79, 0x3d, 0x55, 0xc5, 0x0f, 0xd4, 0x71, 0xb5, + 0x5e, 0xdd, 0x88, 0x0e, 0x41, 0x81, 0x0b, 0xeb, 0xe7, 0x00, 0xfe, 0x6f, 0xab, 0x18, 0x1e, 0xec, 0xaa, 0x0f, 0xd5, + 0xaa, 0x69, 0x63, 0xdf, 0x38, 0x20, 0xb0, 0x58, 0x15, 0x5c, 0xa0, 0x33, 0xac, 0x50, 0x2f, 0x33, 0x6d, 0x30, 0x4c, + 0x8c, 0x53, 0x4b, 0xcf, 0xa5, 0x13, 0x11, 0x7d, 0x1a, 0x5e, 0xcc, 0x34, 0x77, 0x68, 0xb3, 0x55, 0x6e, 0x11, 0x6a, + 0x47, 0xb0, 0x08, 0x26, 0xd3, 0x65, 0x1c, 0x8c, 0xfc, 0x36, 0xb4, 0xd1, 0x00, 0x13, 0x97, 0x36, 0x65, 0x21, 0xc4, + 0xca, 0x02, 0xaa, 0xf7, 0x5d, 0xb0, 0x40, 0x30, 0xb3, 0x27, 0xa4, 0x5f, 0x41, 0x54, 0xf9, 0x69, 0x7c, 0x3e, 0xa9, + 0xa4, 0xb6, 0x9d, 0xaf, 0x73, 0x0d, 0x1c, 0xaa, 0xa6, 0xa2, 0x2a, 0x57, 0xb6, 0x21, 0x72, 0x18, 0xe4, 0x3a, 0x52, + 0x42, 0x2d, 0x91, 0x2f, 0x33, 0x4a, 0x27, 0x13, 0x46, 0xcb, 0xb5, 0x29, 0x56, 0x81, 0xb4, 0xd6, 0x85, 0x77, 0xf9, + 0x1f, 0x86, 0xb2, 0x0d, 0x7a, 0x21, 0x4a, 0xe4, 0xa2, 0x67, 0xf1, 0xe7, 0x6b, 0x9d, 0x03, 0xa4, 0xfa, 0x5f, 0xad, + 0x5c, 0x2a, 0x63, 0x03, 0xa7, 0xd8, 0x95, 0x91, 0xf8, 0x20, 0xad, 0x25, 0xfa, 0x3e, 0xd7, 0x31, 0xea, 0xba, 0x07, + 0x8d, 0xeb, 0x55, 0xb1, 0x18, 0xfa, 0xc5, 0x7b, 0x12, 0xdd, 0xc2, 0x97, 0x05, 0x25, 0x1d, 0xf4, 0xd3, 0x5d, 0xdd, + 0x5f, 0xa7, 0x84, 0x44, 0x65, 0x31, 0x31, 0x84, 0x55, 0x7e, 0x66, 0x38, 0x6c, 0x15, 0xd1, 0xac, 0xb6, 0xeb, 0xec, + 0xfb, 0x03, 0x05, 0x13, 0x88, 0xa0, 0xb0, 0xf8, 0xff, 0x73, 0x1f, 0x14, 0x68, 0xe0, 0xa4, 0xce, 0x8d, 0x4a, 0x4e, + 0xfb, 0xb9, 0x76, 0x7d, 0xa8, 0xbc, 0x04, 0x40, 0x56, 0x8f, 0x37, 0xb2, 0xbe, 0xe5, 0x77, 0x2b, 0x8b, 0x17, 0x30, + 0x96, 0x3f, 0x85, 0x4d, 0x56, 0x23, 0xda, 0x8c, 0xae, 0xd5, 0x6c, 0x94, 0x4f, 0x99, 0x18, 0x8e, 0x36, 0xd0, 0xf5, + 0xbb, 0x6d, 0x6f, 0x50, 0x5d, 0x58, 0x4b, 0xec, 0x3e, 0x60, 0x5d, 0xa9, 0x80, 0xfd, 0xac, 0xa9, 0xa5, 0x3b, 0x15, + 0xfc, 0xfc, 0x56, 0x4f, 0xa5, 0x59, 0xd8, 0x3a, 0x02, 0x7a, 0xf6, 0xd5, 0x15, 0x07, 0xc0, 0x07, 0x74, 0x0d, 0x0b, + 0x3d, 0x76, 0x2c, 0xf5, 0x99, 0x45, 0x94, 0x7d, 0xe6, 0x1e, 0x5f, 0xdf, 0x0c, 0x85, 0x87, 0x9d, 0xdb, 0x6f, 0xbd, + 0x2a, 0xc6, 0xf1, 0xc2, 0xba, 0xba, 0xc8, 0x05, 0xc5, 0x13, 0x92, 0x9c, 0x5f, 0xce, 0x61, 0xa8, 0x5a, 0x49, 0xc4, + 0x5c, 0x85, 0x04, 0x41, 0xed, 0xbb, 0x22, 0xe0, 0x31, 0x39, 0x5e, 0x81, 0xbb, 0x07, 0xa6, 0xa8, 0x9b, 0x1d, 0x42, + 0xe8, 0x96, 0xb4, 0xba, 0x5b, 0x91, 0x00, 0xd0, 0x2e, 0xd8, 0xfe, 0xc6, 0x79, 0x89, 0x2d, 0x68, 0x19, 0xad, 0x17, + 0x21, 0x0c, 0x44, 0x22, 0x85, 0x31, 0x72, 0x7a, 0x38, 0x5b, 0xd7, 0xa0, 0x18, 0xfa, 0x53, 0x17, 0x38, 0xf5, 0xe3, + 0xd9, 0xb6, 0x4b, 0x85, 0x64, 0x22, 0xe8, 0xd0, 0x14, 0x58, 0x96, 0x9d, 0x38, 0xed, 0x91, 0xe4, 0xfd, 0x7d, 0x9e, + 0x92, 0x15, 0x15, 0x3f, 0x94, 0xc3, 0xcf, 0x27, 0x24, 0x38, 0xd4, 0x13, 0x30, 0x83, 0x0e, 0x78, 0xa6, 0xf7, 0xa9, + 0x13, 0x23, 0x95, 0xf5, 0x0e, 0x38, 0x8a, 0x88, 0x32, 0xd3, 0x25, 0xbb, 0xc7, 0xed, 0xf1, 0x14, 0x70, 0x23, 0x63, + 0xda, 0x65, 0x8e, 0x61, 0x26, 0x30, 0x8e, 0xf9, 0x6a, 0x7c, 0x3e, 0xa2, 0x1f, 0xc7, 0x7d, 0x44, 0xc9, 0x45, 0xa5, + 0x86, 0xc2, 0x36, 0x66, 0x8b, 0x5a, 0xf4, 0xd4, 0xbe, 0x91, 0x48, 0x47, 0xaf, 0x60, 0x2c, 0x17, 0x98, 0x06, 0x2b, + 0x9d, 0xf3, 0x8a, 0x82, 0x15, 0x4d, 0x80, 0xb8, 0x0a, 0xe3, 0x94, 0x51, 0x6b, 0xcc, 0x52, 0x18, 0x5c, 0x51, 0x93, + 0x11, 0xc1, 0xaf, 0x26, 0xf4, 0xec, 0x63, 0x31, 0xdc, 0x93, 0x97, 0xc3, 0xa1, 0x1e, 0xad, 0xa7, 0x75, 0xf7, 0x06, + 0x16, 0x63, 0xc1, 0xb2, 0xc0, 0x9c, 0x9d, 0x0e, 0x3a, 0xaf, 0xd8, 0xd6, 0xd4, 0x3a, 0x5d, 0xad, 0x1f, 0x5a, 0xd9, + 0x28, 0x96, 0xd3, 0x24, 0x92, 0x38, 0x6f, 0xa6, 0x51, 0x8c, 0x3f, 0x34, 0x5c, 0xea, 0x86, 0xfa, 0xc4, 0x6f, 0xcd, + 0x5f, 0x4b, 0xa5, 0xbf, 0xce, 0x3f, 0x8a, 0x85, 0x1d, 0x9b, 0xd8, 0x6f, 0xb4, 0x60, 0x65, 0xd1, 0xd8, 0x40, 0xa8, + 0xea, 0x0b, 0x9e, 0x25, 0x2b, 0x95, 0x27, 0xdf, 0x8d, 0xd8, 0xd2, 0x02, 0x3f, 0x8f, 0xf2, 0x6a, 0xea, 0xcd, 0x88, + 0x41, 0xb5, 0x7c, 0x8a, 0x6a, 0x77, 0x72, 0x20, 0x5c, 0x26, 0x37, 0x56, 0x95, 0x07, 0x88, 0x9e, 0x5f, 0x96, 0x1e, + 0x09, 0x73, 0xa9, 0x98, 0x92, 0x06, 0xcf, 0x89, 0xa0, 0xb7, 0x30, 0x85, 0x18, 0x1e, 0x49, 0xdf, 0xa0, 0xf2, 0xee, + 0x8f, 0xeb, 0x7d, 0xaf, 0x0b, 0xdc, 0x19, 0x3b, 0xdf, 0x74, 0x2f, 0x9d, 0x19, 0x34, 0x7a, 0xfd, 0x73, 0xa8, 0x5a, + 0x84, 0xc1, 0x4e, 0xd3, 0x85, 0xa0, 0x09, 0xea, 0x5f, 0x8c, 0x06, 0xd6, 0x32, 0x5d, 0xeb, 0xed, 0x20, 0x53, 0x21, + 0x31, 0xfe, 0x5f, 0x64, 0xbc, 0x0c, 0x98, 0x9c, 0x8c, 0xe2, 0x16, 0x3c, 0x00, 0x37, 0xd3, 0x90, 0x0b, 0x94, 0xd9, + 0xc3, 0x13, 0xa8, 0xc9, 0x58, 0x84, 0x67, 0x39, 0xe6, 0x3a, 0x75, 0x60, 0x3d, 0xb2, 0x79, 0x58, 0xa3, 0x70, 0xb5, + 0x9c, 0x4d, 0x4e, 0xc9, 0x8e, 0x59, 0x5d, 0xed, 0x63, 0x77, 0xc6, 0x25, 0x9e, 0x39, 0x1f, 0xf2, 0x6d, 0xec, 0x71, + 0xc0, 0x1c, 0x87, 0x07, 0x0e, 0x33, 0xe7, 0x21, 0x82, 0x5c, 0x37, 0xc0, 0x16, 0x60, 0xb2, 0x93, 0xb5, 0x6b, 0x94, + 0xb0, 0x78, 0x73, 0x03, 0x20, 0x8f, 0x64, 0x12, 0x42, 0x2e, 0x1b, 0x7e, 0x96, 0x5a, 0xaa, 0x8f, 0x80, 0x8f, 0xd5, + 0x87, 0x9a, 0x06, 0x42, 0xdc, 0x36, 0x42, 0x1e, 0x30, 0x26, 0xae, 0xcc, 0x2f, 0xaa, 0x09, 0x2e, 0xf8, 0x2f, 0x7b, + 0x1d, 0x7f, 0xdd, 0xac, 0xfb, 0x9e, 0x21, 0x22, 0x1d, 0xac, 0x45, 0x64, 0xbd, 0x22, 0x85, 0xff, 0x86, 0xdf, 0x03, + 0x45, 0x09, 0xc5, 0x52, 0xb1, 0xfc, 0x88, 0xea, 0x1e, 0xe3, 0x1e, 0xf2, 0xde, 0x4e, 0x7e, 0x1f, 0x09, 0x83, 0x1e, + 0x50, 0x63, 0x94, 0xa4, 0x38, 0x52, 0xab, 0x9e, 0x7b, 0x14, 0x2c, 0x85, 0xa5, 0x86, 0xe7, 0x88, 0xd2, 0xd5, 0xf7, + 0x0a, 0xb5, 0xf0, 0x1f, 0x2d, 0x6d, 0x9e, 0x86, 0x7d, 0x44, 0xf2, 0x4d, 0x46, 0xd7, 0xc8, 0x42, 0x25, 0x51, 0x78, + 0x23, 0x04, 0x9e, 0x73, 0xc6, 0x53, 0x7d, 0x84, 0x98, 0x07, 0xa2, 0xc9, 0xc8, 0xf5, 0x80, 0xde, 0xd1, 0xe6, 0xe8, + 0x45, 0x72, 0x4c, 0xdf, 0xb4, 0x0f, 0x83, 0xb0, 0x1d, 0x5b, 0x5c, 0x6a, 0x4c, 0x44, 0x6b, 0x5a, 0x75, 0xd9, 0x23, + 0x52, 0xef, 0x3c, 0x15, 0xa3, 0x04, 0x25, 0x72, 0x13, 0x15, 0xdd, 0x39, 0x4e, 0xed, 0xa2, 0xe8, 0xf6, 0x19, 0x4b, + 0xb8, 0x18, 0x55, 0x7c, 0x5f, 0x06, 0x9f, 0x44, 0x52, 0x34, 0x60, 0xd8, 0x80, 0xaf, 0xf7, 0xff, 0x60, 0xe8, 0x66, + 0x20, 0x97, 0xda, 0x30, 0x65, 0xf3, 0xe9, 0x9c, 0x66, 0x5b, 0xc3, 0x7d, 0x83, 0xd6, 0x97, 0x50, 0xcf, 0xb9, 0xcf, + 0x88, 0xdf, 0x4a, 0xcd, 0x2d, 0x26, 0xab, 0x36, 0x1b, 0x59, 0x4c, 0xd6, 0x61, 0xd5, 0x3d, 0x46, 0xa6, 0x10, 0xff, + 0x42, 0x93, 0x5c, 0x10, 0x1e, 0x55, 0xc9, 0x82, 0x7f, 0xd0, 0xcc, 0x60, 0xc3, 0x79, 0x9d, 0xfe, 0x8d, 0x32, 0x80, + 0xf7, 0x3b, 0xcb, 0x5a, 0x41, 0x35, 0x25, 0xb5, 0xe3, 0xba, 0x4b, 0xc7, 0x2f, 0x5d, 0xa0, 0x07, 0x99, 0x89, 0x67, + 0x47, 0x25, 0x21, 0x66, 0x81, 0x75, 0x2f, 0x91, 0xfa, 0xe6, 0x27, 0xe9, 0x91, 0x36, 0x78, 0xce, 0x42, 0xb4, 0xa0, + 0x17, 0x15, 0xfb, 0x7b, 0xa5, 0x34, 0xbd, 0x57, 0x76, 0x06, 0xaf, 0x8d, 0x99, 0xca, 0x41, 0xb0, 0xee, 0x12, 0x7a, + 0xb9, 0x3c, 0xc9, 0x8f, 0x6d, 0xe6, 0x92, 0xe6, 0x23, 0xe9, 0xef, 0xaa, 0x14, 0xeb, 0xc7, 0x80, 0xd6, 0xbf, 0xa6, + 0xcc, 0x92, 0x14, 0x68, 0x30, 0x58, 0x8d, 0x15, 0xdb, 0x04, 0x1c, 0x52, 0x68, 0x22, 0xa2, 0x89, 0x76, 0xdc, 0xee, + 0x68, 0x7c, 0x86, 0xd4, 0x47, 0xb8, 0x40, 0x32, 0xe0, 0x91, 0x43, 0x4c, 0x56, 0xc5, 0x2e, 0xc0, 0x17, 0xb8, 0x7d, + 0x3c, 0x83, 0x7e, 0xd8, 0x6e, 0xdd, 0x20, 0xe5, 0xa6, 0x1c, 0x17, 0x01, 0x6b, 0x08, 0x80, 0xa7, 0x5c, 0x13, 0xad, + 0x06, 0x52, 0x7d, 0x69, 0x04, 0xec, 0xbb, 0x83, 0xfa, 0x38, 0x9a, 0xa6, 0x8c, 0x65, 0xd3, 0xc4, 0x4b, 0xc9, 0x23, + 0xc4, 0x88, 0x7d, 0x85, 0x53, 0x8e, 0xc0, 0xbc, 0xc3, 0xef, 0xac, 0xd7, 0x42, 0x7a, 0x9b, 0xe8, 0x73, 0x93, 0x81, + 0x87, 0xe1, 0xc7, 0xd8, 0x7e, 0xd1, 0xd3, 0xce, 0xd6, 0x9c, 0xbf, 0x0a, 0x48, 0x46, 0x47, 0xe1, 0x5f, 0x85, 0x67, + 0xa5, 0x6d, 0x12, 0x42, 0xfc, 0x03, 0xd1, 0x75, 0x86, 0x33, 0x48, 0xb0, 0x48, 0x5f, 0x2e, 0x6a, 0x17, 0x39, 0x05, + 0x95, 0xf6, 0x99, 0xd5, 0xca, 0xb2, 0x7c, 0x7b, 0xfb, 0x8f, 0x73, 0x6b, 0x53, 0x8d, 0x0b, 0x1e, 0x72, 0x8d, 0xcb, + 0x56, 0x36, 0xfc, 0xa2, 0x8d, 0xf7, 0x96, 0x6c, 0x36, 0x72, 0xd5, 0x57, 0x2e, 0xe1, 0x9f, 0xf8, 0x51, 0x46, 0xb2, + 0xf1, 0x02, 0xac, 0x45, 0x6a, 0x79, 0xe4, 0xea, 0xa9, 0xed, 0x7b, 0xbd, 0x50, 0xac, 0x0c, 0xee, 0xfc, 0xe2, 0x38, + 0x41, 0x92, 0xca, 0x43, 0xfe, 0x9c, 0xaf, 0xe3, 0x1c, 0x3b, 0xab, 0xe9, 0x68, 0x45, 0xef, 0x48, 0x5d, 0x0e, 0x16, + 0x5b, 0x8e, 0x92, 0xf3, 0xc1, 0xb9, 0x6b, 0x86, 0x1e, 0x1c, 0x45, 0x3d, 0x9f, 0x29, 0x89, 0x05, 0x5c, 0x9a, 0xbb, + 0xa7, 0x08, 0x7a, 0x84, 0x48, 0x8c, 0xd0, 0xbb, 0xa0, 0x21, 0x18, 0xb6, 0x39, 0xdf, 0x64, 0x82, 0x36, 0x6b, 0xd1, + 0x2e, 0xe2, 0x17, 0xc3, 0xa2, 0xf0, 0xda, 0xbb, 0x7a, 0xe4, 0x8a, 0xe5, 0x12, 0x1a, 0x03, 0x59, 0x83, 0x62, 0xff, + 0x9a, 0x04, 0x3f, 0xe8, 0x9f, 0xad, 0x16, 0x1a, 0x2b, 0x53, 0xe6, 0xc7, 0x8c, 0x55, 0xea, 0x9c, 0xb5, 0xf4, 0x6e, + 0x6a, 0x17, 0x94, 0x9c, 0x6c, 0xe5, 0xfc, 0x5a, 0xcc, 0xbf, 0x1f, 0xaa, 0x9f, 0x66, 0xca, 0x3b, 0x84, 0x27, 0xcc, + 0xd7, 0x89, 0xa2, 0x80, 0xac, 0x9b, 0x25, 0xce, 0x52, 0x52, 0xc7, 0x2a, 0x89, 0x12, 0x63, 0x3b, 0x87, 0x47, 0x08, + 0x42, 0xd2, 0xd9, 0xac, 0xce, 0x8c, 0xc9, 0x95, 0x14, 0x6f, 0x87, 0x72, 0x25, 0x9c, 0xc5, 0x22, 0x4d, 0x50, 0x74, + 0xf9, 0x86, 0x5c, 0x2a, 0xf4, 0x54, 0x97, 0x76, 0x74, 0xa8, 0xf4, 0x80, 0x7f, 0x74, 0x73, 0x89, 0x99, 0x54, 0xa0, + 0x11, 0x9f, 0xc7, 0x96, 0x54, 0x22, 0x59, 0x15, 0x39, 0x0c, 0xd4, 0xca, 0xe4, 0x27, 0xdb, 0xe7, 0x32, 0x5a, 0x37, + 0x21, 0x70, 0xdd, 0xe6, 0x4a, 0xe2, 0xee, 0x5f, 0x26, 0xf3, 0x74, 0x00, 0xf6, 0xcb, 0x72, 0x9d, 0x37, 0x3a, 0xe1, + 0xf2, 0xe8, 0xec, 0x53, 0x13, 0xec, 0x78, 0x07, 0x2f, 0x26, 0x12, 0x04, 0x07, 0x89, 0x44, 0xa4, 0x82, 0x33, 0x90, + 0x78, 0x02, 0x03, 0x70, 0x72, 0xfe, 0x88, 0x9f, 0x17, 0x64, 0x79, 0x01, 0x5c, 0xe1, 0xa8, 0x02, 0x44, 0x82, 0x04, + 0x8d, 0x2e, 0xbc, 0x9b, 0x63, 0xf5, 0x9a, 0x2d, 0xb7, 0xab, 0xd2, 0x79, 0x50, 0x73, 0x24, 0x85, 0x92, 0x30, 0xe2, + 0x0c, 0x8b, 0x1f, 0x6c, 0x4a, 0x94, 0xaf, 0x1a, 0x81, 0x30, 0xb2, 0x58, 0xe2, 0x85, 0x46, 0x83, 0x00, 0x8f, 0x8f, + 0x90, 0x32, 0xd9, 0x36, 0xe3, 0x98, 0x7d, 0x4d, 0x89, 0x73, 0x86, 0xcc, 0x10, 0x4a, 0x06, 0xe6, 0x68, 0x09, 0x60, + 0x9d, 0xc5, 0x18, 0x4d, 0xa5, 0x29, 0x3e, 0x3f, 0x47, 0xad, 0xd6, 0x91, 0x57, 0x36, 0x43, 0xbd, 0x0d, 0x56, 0x4c, + 0x89, 0x00, 0xc7, 0x21, 0xa4, 0x97, 0xc0, 0x82, 0x32, 0xe6, 0xb6, 0x24, 0x97, 0x22, 0x3f, 0x24, 0x6b, 0x49, 0xd3, + 0x66, 0x60, 0x70, 0xae, 0x9b, 0x7c, 0x31, 0x1f, 0x8e, 0x92, 0x69, 0x15, 0x6c, 0x1a, 0xeb, 0xfe, 0x3d, 0x6c, 0x9a, + 0x6e, 0x72, 0xe5, 0xb6, 0x0a, 0xc6, 0x6a, 0xe6, 0x78, 0xc4, 0xe6, 0x6c, 0xc0, 0xcb, 0xef, 0x41, 0x1a, 0x2e, 0x1e, + 0x42, 0x64, 0xda, 0x4f, 0xfb, 0xa7, 0xd8, 0xbb, 0xe5, 0xf2, 0x64, 0x06, 0xce, 0xda, 0xd8, 0x1d, 0xa7, 0xa8, 0xae, + 0x25, 0x51, 0x2e, 0x09, 0x9b, 0x0f, 0x80, 0xa1, 0xd6, 0xf7, 0xa2, 0xec, 0xff, 0x2e, 0xe9, 0x89, 0xa2, 0xc2, 0x73, + 0x9d, 0xd7, 0x67, 0xa9, 0x3f, 0x80, 0x76, 0x1f, 0xc7, 0xe4, 0xce, 0x38, 0xcc, 0x11, 0x50, 0x99, 0xbd, 0x5f, 0xbf, + 0xa2, 0x83, 0xb6, 0x95, 0xea, 0x4f, 0x28, 0xce, 0x1f, 0x94, 0xd1, 0x3a, 0x5b, 0xe6, 0xfc, 0x6c, 0xc1, 0x40, 0x67, + 0x92, 0x96, 0x92, 0xca, 0x27, 0xfe, 0x87, 0xea, 0xf0, 0x31, 0xb5, 0x47, 0x8c, 0x4d, 0x24, 0x09, 0x7e, 0x92, 0x27, + 0x7c, 0x4c, 0x35, 0x13, 0xb5, 0x3d, 0x43, 0x8a, 0x7a, 0x63, 0x44, 0xa6, 0x52, 0x4d, 0x96, 0x15, 0x9b, 0x58, 0xe4, + 0x04, 0xbb, 0xba, 0xb0, 0x2e, 0x7d, 0xa2, 0x3e, 0xa5, 0xa6, 0xe6, 0x20, 0x5c, 0x18, 0x48, 0x77, 0xdb, 0x55, 0x8f, + 0x16, 0x4b, 0x5a, 0x28, 0x52, 0x12, 0x39, 0x89, 0xa4, 0x69, 0x1c, 0xa9, 0x0b, 0x60, 0x9e, 0xa3, 0xec, 0x56, 0xb2, + 0x06, 0x6b, 0x6b, 0x3c, 0x51, 0x27, 0xd5, 0x91, 0x9b, 0x3a, 0xcc, 0xac, 0xa7, 0x9a, 0xf9, 0x3f, 0x3b, 0x26, 0x52, + 0xd0, 0x71, 0xe5, 0x91, 0x27, 0x94, 0xe6, 0xcd, 0x54, 0xed, 0x64, 0x48, 0x8f, 0x3c, 0xd7, 0xdb, 0xa4, 0x63, 0x9f, + 0x0b, 0x25, 0x0e, 0xdd, 0x74, 0x39, 0xd5, 0x25, 0xf0, 0xf1, 0x55, 0xfc, 0x91, 0x50, 0x2c, 0x49, 0xa4, 0x61, 0xee, + 0x6c, 0x34, 0xb6, 0x34, 0x56, 0x97, 0x8a, 0x2c, 0x0e, 0x4b, 0x43, 0xd5, 0x55, 0x94, 0xc5, 0x1b, 0x35, 0xd8, 0x44, + 0xd4, 0x45, 0x7d, 0x0d, 0x3a, 0xa5, 0xf3, 0x1c, 0x68, 0xa9, 0xc5, 0xdd, 0x53, 0x41, 0xef, 0x27, 0x5c, 0x53, 0x01, + 0x0e, 0x26, 0x1e, 0xb9, 0x78, 0xc1, 0xe9, 0x32, 0xa7, 0x2b, 0xd8, 0x5f, 0x34, 0x52, 0x8d, 0x33, 0x0b, 0x55, 0x39, + 0x33, 0xaa, 0xda, 0x99, 0x75, 0xd3, 0x0d, 0x86, 0x39, 0x57, 0xbb, 0x1c, 0x59, 0x94, 0x25, 0x59, 0x1c, 0x57, 0xa6, + 0x89, 0xe7, 0xf6, 0xca, 0x65, 0xa4, 0xf3, 0x4a, 0xb6, 0x98, 0x8c, 0x89, 0x4b, 0x3d, 0x32, 0x3d, 0x31, 0xb2, 0x6c, + 0xa0, 0xb6, 0x4b, 0xaf, 0xa9, 0x3a, 0xf6, 0x8b, 0x3b, 0x16, 0x85, 0x97, 0xb9, 0xc6, 0xf4, 0x38, 0x09, 0x19, 0xf2, + 0xa5, 0x35, 0x50, 0x62, 0x1b, 0xfc, 0x58, 0x8e, 0xf6, 0xd3, 0x69, 0x09, 0xac, 0x49, 0x44, 0xa0, 0xea, 0xb5, 0x81, + 0xfc, 0xb8, 0x4d, 0x0f, 0xe9, 0xcb, 0x16, 0x2e, 0xca, 0x1f, 0xca, 0x61, 0x73, 0xe0, 0x10, 0x66, 0x02, 0xa3, 0x60, + 0xa1, 0xbc, 0x92, 0xc0, 0x26, 0xf0, 0x3b, 0x46, 0xcd, 0x76, 0xbb, 0xd2, 0xfb, 0x00, 0x32, 0x19, 0x37, 0x21, 0x3c, + 0x80, 0xc2, 0xeb, 0x29, 0x28, 0x57, 0x88, 0x03, 0xcd, 0x14, 0xa0, 0xc3, 0x0f, 0xe9, 0xc3, 0x13, 0x90, 0x1f, 0xd3, + 0xe1, 0x47, 0xb7, 0x72, 0x1b, 0x6d, 0x73, 0x2c, 0x4f, 0x95, 0x87, 0x6a, 0x1c, 0x21, 0x4a, 0x72, 0x61, 0xb1, 0xa8, + 0xdb, 0x2b, 0x57, 0xb4, 0xbd, 0xf1, 0x5e, 0xdf, 0xb0, 0x4d, 0x3a, 0xfe, 0x18, 0xe6, 0xb8, 0xc2, 0xa8, 0x46, 0x15, + 0x6c, 0xe9, 0x1d, 0xb0, 0xd5, 0x5d, 0x25, 0xb0, 0xc7, 0xa6, 0xb1, 0xb9, 0x00, 0x1d, 0x1a, 0xa2, 0x0c, 0xa4, 0x54, + 0x35, 0x0b, 0x64, 0x72, 0xf5, 0x29, 0xec, 0xb6, 0xa6, 0x31, 0x9b, 0x90, 0xf7, 0xbf, 0xa1, 0x79, 0x15, 0x96, 0x7c, + 0xc2, 0xfe, 0x10, 0xc9, 0x67, 0xf8, 0xd2, 0x47, 0x8d, 0xf8, 0x1e, 0xe0, 0x6a, 0x5f, 0x0a, 0x45, 0xa6, 0x38, 0xb6, + 0xc7, 0x6b, 0xd4, 0x26, 0xf3, 0xf0, 0x50, 0x47, 0x17, 0x36, 0xe4, 0x47, 0x38, 0x61, 0xfb, 0x31, 0xce, 0x93, 0x0b, + 0x8c, 0xe8, 0xbb, 0x18, 0x37, 0x07, 0xe8, 0xca, 0x00, 0xbc, 0x2d, 0xa3, 0x5e, 0x2a, 0x1f, 0xec, 0xf0, 0x16, 0x75, + 0xb3, 0xe3, 0x34, 0xd8, 0x66, 0xc4, 0xa1, 0x1c, 0x0a, 0x70, 0x97, 0xbd, 0xaa, 0x52, 0xe4, 0xf4, 0xd6, 0xf4, 0x8e, + 0xeb, 0x0d, 0xf2, 0x45, 0x13, 0x4d, 0x1d, 0x4c, 0x7a, 0x00, 0x13, 0x6a, 0x39, 0xa0, 0x31, 0x7a, 0xb5, 0x25, 0x5b, + 0x5c, 0x0b, 0x9e, 0xd9, 0x02, 0xd2, 0xbc, 0x22, 0xd5, 0x6e, 0x94, 0x46, 0x53, 0x32, 0x34, 0x69, 0x13, 0x8b, 0xd4, + 0x40, 0x32, 0xab, 0x57, 0x75, 0x22, 0x55, 0x83, 0x2d, 0x70, 0x60, 0xb3, 0x20, 0xc3, 0x37, 0xfb, 0x93, 0x01, 0x63, + 0x4b, 0xaf, 0x7d, 0x4f, 0x76, 0x1f, 0x35, 0xe4, 0x1a, 0x12, 0x19, 0xc7, 0x39, 0xd1, 0x6c, 0xaa, 0x88, 0xf8, 0x64, + 0x1d, 0x15, 0xb0, 0x36, 0x97, 0x6d, 0xe5, 0x83, 0x0a, 0x7a, 0x6c, 0xb0, 0xc9, 0x06, 0xd7, 0x8e, 0x19, 0xd6, 0x17, + 0x9b, 0x8a, 0xd4, 0x65, 0xfa, 0x40, 0xc4, 0x34, 0x83, 0x44, 0xa8, 0x3b, 0x36, 0xbe, 0xae, 0x4a, 0xbb, 0x20, 0xec, + 0xfb, 0xab, 0x74, 0xae, 0x61, 0xe3, 0x15, 0x90, 0xb9, 0xbe, 0xea, 0x00, 0x03, 0xbc, 0x02, 0x71, 0x31, 0xe0, 0xe3, + 0x2d, 0x90, 0x29, 0xf9, 0x77, 0xd4, 0x73, 0xa3, 0x94, 0x47, 0x2d, 0xef, 0x86, 0x19, 0xde, 0x6a, 0x2f, 0xf3, 0x0f, + 0x4b, 0x1f, 0xf2, 0x21, 0x41, 0x85, 0x2c, 0xa4, 0xe6, 0x49, 0xd4, 0xcd, 0x1d, 0x88, 0x6d, 0xdd, 0xe7, 0x22, 0xa3, + 0x58, 0xc4, 0xca, 0x23, 0xc0, 0x5d, 0x04, 0xbc, 0xdb, 0xac, 0x94, 0x88, 0x6f, 0x0e, 0xa5, 0x55, 0xde, 0x12, 0xcd, + 0x55, 0x60, 0xde, 0x45, 0x2b, 0x3b, 0x9c, 0xea, 0x90, 0x81, 0x9d, 0x4a, 0xed, 0x94, 0x44, 0xef, 0xb1, 0xc2, 0x5e, + 0xb3, 0x8d, 0xf5, 0x5b, 0x3b, 0xfa, 0x10, 0x56, 0x0b, 0x56, 0xdb, 0x73, 0x85, 0xe6, 0x66, 0xa2, 0x80, 0x58, 0x60, + 0xcd, 0xde, 0xbe, 0x49, 0x14, 0x42, 0xe1, 0x82, 0xcb, 0x52, 0x2a, 0x91, 0x62, 0xdb, 0x01, 0x83, 0x44, 0x13, 0x26, + 0xaa, 0x8a, 0x73, 0x23, 0xf6, 0x3c, 0x6b, 0xb0, 0xc0, 0xb3, 0x92, 0x0c, 0x8a, 0xd0, 0xba, 0xad, 0x76, 0xa9, 0x40, + 0xef, 0x67, 0x81, 0x95, 0x53, 0xe5, 0x04, 0x0e, 0xa9, 0x46, 0x1c, 0x9f, 0x05, 0x23, 0xb7, 0x4a, 0xf9, 0x16, 0x61, + 0xce, 0xe0, 0xcc, 0x7f, 0x5d, 0x7a, 0x6d, 0x7a, 0x52, 0x0a, 0x0e, 0xd3, 0xf7, 0xe7, 0x30, 0xe9, 0x15, 0x18, 0x9d, + 0xf7, 0x9e, 0xf7, 0x4a, 0x16, 0xf8, 0xeb, 0xb5, 0xbe, 0x14, 0x45, 0xb3, 0x29, 0x4f, 0x3d, 0xb9, 0x94, 0xf9, 0x96, + 0x06, 0xae, 0x53, 0x1c, 0xad, 0xee, 0xd9, 0x9b, 0x15, 0x30, 0x13, 0xcb, 0xf0, 0xef, 0xc1, 0xd6, 0xbe, 0x81, 0xf3, + 0x62, 0x09, 0x44, 0x7e, 0x63, 0x7c, 0x7d, 0xc8, 0xd3, 0xe2, 0x85, 0xcf, 0xcf, 0x08, 0x0b, 0x15, 0xe6, 0x8a, 0x84, + 0xc7, 0xa7, 0x4a, 0xab, 0x2c, 0x41, 0xc3, 0xb4, 0x7c, 0xa6, 0xc7, 0x8b, 0xfa, 0x56, 0x39, 0x7a, 0xeb, 0x2f, 0xb3, + 0xd2, 0x98, 0xcf, 0xcf, 0x93, 0x47, 0x4a, 0xbc, 0x7e, 0xf2, 0x89, 0xaa, 0xf2, 0x67, 0xc3, 0x6d, 0xbd, 0xef, 0xe1, + 0xd7, 0xde, 0x7e, 0x90, 0x65, 0x81, 0xc8, 0xaa, 0x71, 0x6d, 0xe3, 0xa8, 0xf2, 0x34, 0xed, 0x85, 0x58, 0x28, 0xc2, + 0x0f, 0x8a, 0x0e, 0x2c, 0x2f, 0x73, 0xa9, 0xe6, 0x5c, 0x85, 0x8a, 0x46, 0xec, 0x69, 0xfc, 0x7c, 0x08, 0x4b, 0x61, + 0x2a, 0x32, 0x08, 0xe3, 0x0e, 0xed, 0x92, 0x64, 0xec, 0x96, 0x32, 0x6d, 0xeb, 0x77, 0x0b, 0xe5, 0x35, 0x15, 0x13, + 0x30, 0x85, 0x77, 0x20, 0xb9, 0x99, 0x2d, 0xb6, 0xd6, 0x39, 0xa9, 0xa3, 0x02, 0xfb, 0x31, 0xa6, 0xc0, 0x61, 0xa7, + 0x9b, 0xe9, 0x73, 0x81, 0x1b, 0x9a, 0xf2, 0x50, 0x6f, 0x3a, 0xc3, 0x95, 0xd7, 0xf1, 0x43, 0x75, 0xe6, 0x6c, 0x81, + 0x96, 0x6b, 0xe4, 0x2b, 0xbe, 0xaa, 0x96, 0x20, 0xf2, 0x40, 0xf2, 0xb7, 0xaf, 0xbe, 0x7b, 0xab, 0x4b, 0x45, 0xd2, + 0x19, 0x6e, 0xd5, 0xb0, 0x3b, 0x58, 0xe8, 0x6e, 0x75, 0x26, 0x91, 0x04, 0x1a, 0x90, 0x5d, 0x1b, 0xde, 0x0b, 0x1b, + 0xe8, 0x4e, 0x3b, 0x5c, 0x3b, 0xa9, 0x22, 0x68, 0x9d, 0x5d, 0x65, 0x0c, 0x6d, 0xd9, 0x45, 0xc4, 0x2d, 0xbb, 0x0e, + 0x47, 0xd1, 0xcd, 0xb4, 0x10, 0xd6, 0xc6, 0xe3, 0x1e, 0x54, 0x6f, 0x33, 0x20, 0x25, 0x22, 0x12, 0x28, 0x17, 0xe2, + 0x6f, 0x5d, 0xa8, 0x59, 0xc6, 0xdd, 0xa6, 0x43, 0xec, 0x26, 0x89, 0xeb, 0x83, 0x66, 0xf0, 0xd6, 0xa5, 0x95, 0xd7, + 0x19, 0x52, 0xf8, 0x48, 0x45, 0x06, 0xce, 0x0d, 0x53, 0x7b, 0xda, 0x65, 0x1d, 0xc6, 0xbc, 0x54, 0xca, 0xaa, 0x08, + 0xb8, 0xd5, 0x00, 0xcf, 0xda, 0xb7, 0x70, 0x4c, 0x13, 0x1b, 0x9a, 0xa7, 0xbe, 0xcf, 0xd1, 0x76, 0x37, 0x5e, 0xb4, + 0xe2, 0xab, 0xd7, 0xd6, 0x71, 0xd9, 0x3c, 0xeb, 0x6e, 0x13, 0x56, 0xb1, 0x9f, 0x22, 0x29, 0x6c, 0x1a, 0x8b, 0xb9, + 0x26, 0x71, 0x4c, 0x02, 0xa3, 0x05, 0xb0, 0x37, 0xd1, 0x2c, 0xbb, 0x58, 0x22, 0xb5, 0x75, 0x58, 0x77, 0x73, 0xc0, + 0xe1, 0xdb, 0xce, 0x57, 0xaa, 0x76, 0x53, 0x83, 0x12, 0x39, 0xe7, 0xc3, 0xfe, 0xc2, 0xed, 0xfe, 0x50, 0xe2, 0x4d, + 0xdd, 0xc6, 0xe2, 0x48, 0x34, 0x16, 0x10, 0x5c, 0x66, 0x8c, 0xda, 0x2c, 0x8b, 0x10, 0x9d, 0x5a, 0x59, 0xff, 0x40, + 0x05, 0x48, 0x25, 0xd4, 0x6a, 0x71, 0x33, 0x81, 0x05, 0xc7, 0xa4, 0xd4, 0xc6, 0xe1, 0xc7, 0x3f, 0x89, 0xa7, 0x54, + 0xb4, 0x69, 0xd4, 0x13, 0xcd, 0x05, 0xfb, 0x72, 0x88, 0x46, 0x20, 0x77, 0x1b, 0xd6, 0x38, 0xf5, 0xa2, 0xb3, 0xb9, + 0x51, 0xe8, 0xb0, 0x32, 0x55, 0x60, 0xfc, 0xad, 0xc2, 0x6c, 0x20, 0xe7, 0x2a, 0x89, 0x95, 0xdb, 0x19, 0x78, 0x61, + 0x84, 0x0e, 0x62, 0x00, 0xbd, 0x9d, 0xfc, 0x54, 0x7f, 0x5a, 0x5d, 0x94, 0x71, 0x22, 0x4c, 0x4e, 0xdf, 0xdb, 0xc1, + 0x83, 0xda, 0x6c, 0xe7, 0x52, 0xbc, 0xe6, 0x39, 0x81, 0xf6, 0x95, 0x9f, 0xfd, 0x5e, 0xbf, 0x3f, 0x71, 0x13, 0x5a, + 0x56, 0x20, 0x75, 0x8a, 0x7f, 0xd5, 0x9d, 0x51, 0xee, 0x76, 0xce, 0xb3, 0x09, 0xcb, 0x63, 0x92, 0xec, 0x1b, 0x7f, + 0x5b, 0xb8, 0xe4, 0x68, 0xc9, 0x9f, 0x38, 0x0f, 0x8c, 0x62, 0x31, 0x4d, 0x16, 0xa6, 0x7e, 0x4d, 0xd2, 0xde, 0xc4, + 0x75, 0x6c, 0xc4, 0xf1, 0x9f, 0xe3, 0x10, 0x3d, 0x49, 0x84, 0xd4, 0x7a, 0x4b, 0x51, 0x3d, 0xaa, 0x7b, 0x27, 0xea, + 0x42, 0x36, 0x0f, 0x39, 0x5a, 0x93, 0x31, 0x9d, 0xd4, 0x5d, 0xaa, 0x91, 0x68, 0x04, 0x4b, 0xb7, 0x76, 0x3b, 0x39, + 0x3c, 0xc4, 0x4b, 0xfb, 0x28, 0x12, 0x15, 0xbd, 0x0b, 0x4d, 0x71, 0x68, 0xa3, 0x58, 0x5f, 0x59, 0x89, 0x05, 0xd6, + 0x5e, 0x2a, 0xad, 0xe6, 0x82, 0xae, 0xbc, 0x1c, 0x15, 0x3a, 0x27, 0x00, 0x5b, 0xcb, 0x39, 0x91, 0x01, 0x74, 0x62, + 0xb1, 0x70, 0x1d, 0x72, 0x03, 0xca, 0x10, 0xa1, 0x72, 0x4b, 0x8f, 0x53, 0x69, 0xd5, 0x28, 0x96, 0x80, 0xc4, 0x70, + 0xc6, 0x7c, 0xeb, 0x63, 0x36, 0x6e, 0x64, 0x0c, 0xae, 0x5a, 0x76, 0x6d, 0x19, 0x6b, 0x6b, 0x85, 0xb4, 0x0e, 0x98, + 0x5a, 0x65, 0x3f, 0x35, 0xbe, 0xf3, 0xe7, 0xbd, 0x23, 0x4d, 0x6f, 0x71, 0x24, 0x11, 0x06, 0x6d, 0xaf, 0x18, 0x0b, + 0x53, 0x84, 0xdb, 0xec, 0xf6, 0x8a, 0xd0, 0xdd, 0x5f, 0x0a, 0x7c, 0x5b, 0xb8, 0x31, 0x15, 0x37, 0x8e, 0x1e, 0x5f, + 0x14, 0x4c, 0x04, 0xe3, 0xd0, 0x54, 0x95, 0xf0, 0x6e, 0xba, 0x0a, 0x0a, 0x72, 0x2a, 0x2a, 0x1c, 0x78, 0xb0, 0x5e, + 0x66, 0xf4, 0x28, 0x12, 0x8a, 0x2d, 0xae, 0x6a, 0x4d, 0x14, 0x77, 0x19, 0x17, 0xa4, 0x2f, 0x87, 0xf9, 0xb7, 0xaa, + 0x1b, 0xba, 0x66, 0x55, 0xba, 0x45, 0xe2, 0x6b, 0x53, 0x8d, 0x46, 0x44, 0xe5, 0x7b, 0xe9, 0x03, 0xf3, 0x58, 0x4b, + 0x77, 0x3e, 0xed, 0x13, 0xae, 0x0c, 0x1c, 0x18, 0xfa, 0x48, 0xf7, 0x57, 0xeb, 0xea, 0x24, 0x1f, 0x57, 0x9f, 0x7c, + 0x0d, 0xcf, 0x1f, 0x8c, 0x9d, 0x76, 0x70, 0xcb, 0x21, 0x7d, 0xcc, 0xf9, 0x35, 0x33, 0xbd, 0x45, 0xab, 0xbd, 0x51, + 0xa3, 0x2e, 0xb0, 0x99, 0x4c, 0xd3, 0x63, 0xfe, 0xe9, 0xad, 0xe8, 0xc1, 0x05, 0x27, 0x89, 0x2f, 0x20, 0xe1, 0x86, + 0xed, 0xd5, 0xc7, 0x47, 0xaa, 0xeb, 0xd6, 0x09, 0x25, 0x76, 0x23, 0x95, 0xed, 0xa0, 0x42, 0xc8, 0x0e, 0xf7, 0xc4, + 0xd5, 0x1b, 0xec, 0x73, 0x88, 0xd3, 0xd1, 0x00, 0x29, 0x93, 0x26, 0xf6, 0x25, 0x8c, 0xf7, 0xc5, 0x1c, 0x36, 0x2b, + 0x48, 0xbc, 0xea, 0xc2, 0x29, 0x94, 0x58, 0xd9, 0xf3, 0xea, 0x78, 0x1d, 0xdd, 0xe4, 0x23, 0x9a, 0x32, 0xd0, 0xdc, + 0xbd, 0xe5, 0x2e, 0x17, 0x18, 0xdd, 0x6b, 0xf3, 0xf1, 0xdd, 0xce, 0x68, 0x4d, 0x12, 0xf9, 0xc6, 0xb7, 0xf9, 0x70, + 0xf3, 0xf8, 0x85, 0x86, 0xe2, 0x00, 0xd7, 0x71, 0xb8, 0xfd, 0xe1, 0xb2, 0x2a, 0xf7, 0xaa, 0x1f, 0xd4, 0xc0, 0x91, + 0x52, 0x4f, 0x0d, 0x67, 0x61, 0x4f, 0x30, 0xe1, 0xd4, 0x81, 0xb3, 0xe6, 0x83, 0x90, 0x73, 0xf9, 0xd7, 0x2e, 0x94, + 0x73, 0x37, 0x6e, 0x16, 0x9e, 0x06, 0x36, 0x76, 0x86, 0x3a, 0x5c, 0xea, 0xce, 0x6c, 0x49, 0x3c, 0xc3, 0x8f, 0xbb, + 0x9a, 0x08, 0x4b, 0xed, 0x81, 0xaf, 0x57, 0xbc, 0x9c, 0xfb, 0xdb, 0xe1, 0x8d, 0xe2, 0x82, 0x30, 0x33, 0xbe, 0x88, + 0x4a, 0x93, 0x2c, 0x69, 0xf8, 0x36, 0xb2, 0x19, 0x75, 0xed, 0xbb, 0x68, 0x45, 0x50, 0x32, 0x22, 0x54, 0x71, 0x68, + 0xc6, 0x50, 0x06, 0xe8, 0x58, 0x45, 0x69, 0xcf, 0xd7, 0x06, 0xb3, 0x4e, 0x36, 0x73, 0x04, 0x74, 0x44, 0xdf, 0x2f, + 0x5f, 0xd4, 0xb3, 0x7f, 0xdd, 0x1f, 0x1e, 0xbe, 0xc8, 0x55, 0x7d, 0xd4, 0x00, 0xfc, 0x8e, 0x54, 0xf5, 0xe8, 0x8d, + 0xe5, 0x57, 0x5a, 0x82, 0xad, 0x66, 0x07, 0x46, 0x9d, 0xa4, 0x8d, 0xd4, 0x86, 0xcc, 0x32, 0x67, 0x52, 0x28, 0x04, + 0x2d, 0x3d, 0x9e, 0x63, 0x31, 0x05, 0x50, 0xd2, 0xe5, 0x8a, 0x88, 0x0b, 0x06, 0x61, 0x15, 0x87, 0x31, 0x2c, 0xa4, + 0x69, 0x3d, 0xdb, 0xce, 0xa2, 0x51, 0x83, 0xd0, 0x35, 0x86, 0x44, 0x85, 0x99, 0xf5, 0x8c, 0x83, 0x5c, 0x6a, 0xbb, + 0x20, 0x4f, 0x7e, 0x73, 0x15, 0x03, 0xd0, 0x63, 0x22, 0x79, 0x5a, 0xd5, 0x44, 0x96, 0x90, 0xcf, 0xa4, 0x61, 0xd3, + 0xfb, 0xc3, 0x37, 0x31, 0x3d, 0xfa, 0xd8, 0xd5, 0xd6, 0x1f, 0xa2, 0xe4, 0xb9, 0x17, 0x29, 0x5f, 0xeb, 0xb4, 0x65, + 0x77, 0xa2, 0x4d, 0xd0, 0x44, 0xdb, 0x82, 0xb0, 0x05, 0x3a, 0xd0, 0x67, 0x3c, 0x1a, 0x2e, 0x1b, 0x51, 0x16, 0x8b, + 0x94, 0x28, 0x87, 0xfc, 0xe6, 0xec, 0x11, 0xe2, 0xb4, 0x16, 0x46, 0x03, 0xcb, 0xbd, 0x60, 0x18, 0x45, 0x17, 0xec, + 0x81, 0x4f, 0x2b, 0x52, 0x5c, 0x7d, 0xbb, 0x58, 0xf3, 0xba, 0x32, 0xd1, 0x36, 0x98, 0xf0, 0x0e, 0x1a, 0x1e, 0x61, + 0xaf, 0x71, 0x4e, 0x83, 0xae, 0xeb, 0xc9, 0xd3, 0x8a, 0x8c, 0x4d, 0x65, 0xa5, 0x1e, 0x01, 0xb7, 0xd8, 0xdb, 0x7e, + 0xd4, 0x36, 0x07, 0x7b, 0x36, 0xb6, 0xea, 0xc6, 0xb6, 0xc7, 0x10, 0xdc, 0x3a, 0x41, 0x3e, 0xdd, 0x29, 0x7d, 0x9e, + 0xe7, 0x4b, 0x6b, 0x13, 0xe8, 0xf0, 0xba, 0x35, 0xed, 0x71, 0x84, 0x11, 0x11, 0xb7, 0x99, 0x2e, 0x58, 0x58, 0x4a, + 0x6f, 0xa9, 0xae, 0x88, 0xe1, 0xd9, 0x0e, 0x59, 0x0d, 0x40, 0x2f, 0xb0, 0x3f, 0x94, 0xe7, 0x25, 0x5c, 0xe8, 0xf9, + 0xf0, 0xd1, 0x45, 0x95, 0x97, 0xa5, 0x1d, 0x66, 0x7b, 0xd6, 0xdd, 0xa0, 0xc2, 0xf5, 0xa9, 0x5a, 0x9d, 0x50, 0x20, + 0x96, 0x9e, 0xa3, 0xbf, 0xef, 0x53, 0x47, 0x3c, 0xcf, 0x08, 0x61, 0x27, 0x36, 0x9b, 0x07, 0x20, 0xf6, 0x41, 0xc7, + 0x04, 0x01, 0x42, 0xd0, 0x10, 0xab, 0x3d, 0xa0, 0x1e, 0xbf, 0x33, 0xf4, 0x7d, 0x44, 0x7a, 0x13, 0xa0, 0x32, 0x05, + 0xc5, 0x89, 0xda, 0xa7, 0x24, 0x22, 0x27, 0x3f, 0xc9, 0x2e, 0x9b, 0xb1, 0xa8, 0x93, 0xc0, 0xf9, 0x88, 0x53, 0xb0, + 0x14, 0x0a, 0xe7, 0xc5, 0x33, 0x01, 0x7c, 0x3a, 0x67, 0x8b, 0x69, 0xe1, 0x8b, 0x1c, 0x94, 0xcd, 0xa4, 0xc7, 0xf5, + 0x38, 0xb7, 0x7d, 0x4c, 0x38, 0x2a, 0xca, 0xd8, 0xd8, 0x5b, 0x75, 0x66, 0x8c, 0xf0, 0xd5, 0x44, 0xa8, 0xf7, 0x63, + 0x9c, 0xb7, 0xf7, 0x3d, 0x3e, 0xe2, 0x52, 0x6c, 0x2a, 0x84, 0xc2, 0x82, 0x9a, 0xa7, 0xf4, 0x47, 0x59, 0xe7, 0xd4, + 0xc8, 0x82, 0xf2, 0xb8, 0x82, 0x91, 0xa2, 0x4c, 0xfb, 0xec, 0xc9, 0x9e, 0x32, 0x48, 0x6c, 0xe7, 0x65, 0xa2, 0x2b, + 0x05, 0x0c, 0xa2, 0x54, 0x0a, 0x76, 0xb5, 0x2d, 0x14, 0xc9, 0x20, 0x1c, 0x43, 0xbb, 0x11, 0x47, 0x55, 0xe6, 0x90, + 0x84, 0x7c, 0xcd, 0xd7, 0x38, 0xb3, 0xdd, 0x1c, 0x52, 0x18, 0x6c, 0x51, 0x4d, 0x46, 0x81, 0xd0, 0x6e, 0x41, 0x40, + 0xe8, 0xd2, 0x85, 0xdf, 0xe0, 0x97, 0x47, 0xa9, 0x6c, 0x26, 0x38, 0x4f, 0x17, 0x6e, 0xe1, 0x97, 0x1e, 0xb5, 0x62, + 0xc7, 0x5b, 0x6b, 0xe3, 0x12, 0xe5, 0xa2, 0x65, 0xfe, 0x23, 0xf6, 0xb8, 0x80, 0x03, 0x5b, 0x60, 0x6d, 0xe8, 0x0e, + 0x95, 0x61, 0x34, 0x70, 0xe2, 0x01, 0x24, 0xb5, 0xbb, 0x61, 0x49, 0x5b, 0xd4, 0x7f, 0x32, 0xd7, 0xea, 0x1a, 0x34, + 0x81, 0x59, 0xab, 0xc5, 0x36, 0x4d, 0x85, 0x1c, 0x32, 0xaa, 0x1a, 0xb0, 0x52, 0x6d, 0x87, 0x34, 0x59, 0x22, 0x87, + 0x24, 0x71, 0x27, 0x73, 0x06, 0x55, 0x56, 0x7a, 0xd1, 0xff, 0xa8, 0x44, 0xe4, 0x43, 0x5e, 0xff, 0xa4, 0x8a, 0x67, + 0x99, 0xd4, 0x8f, 0xc2, 0xa1, 0x4a, 0x63, 0x93, 0x0d, 0x6d, 0x00, 0xa3, 0x0f, 0x73, 0xa8, 0x2c, 0x74, 0x6c, 0x95, + 0xfb, 0x6e, 0x5a, 0xc9, 0xb1, 0x21, 0x9f, 0xcc, 0x18, 0x30, 0xdf, 0x7e, 0x0b, 0x62, 0x8f, 0x5b, 0xcc, 0x38, 0xdc, + 0x4b, 0x7e, 0xbe, 0x4c, 0x44, 0xc1, 0x1f, 0x4e, 0xc3, 0x0e, 0x7c, 0xd3, 0x21, 0xa6, 0xcd, 0x15, 0x33, 0x64, 0x06, + 0xa5, 0x6d, 0x09, 0x31, 0x2d, 0x78, 0x4a, 0xa4, 0xfb, 0xf7, 0xfe, 0xc4, 0xde, 0xd3, 0x7c, 0x21, 0x3f, 0x59, 0x9d, + 0x83, 0xbe, 0x55, 0x97, 0x3e, 0x86, 0x17, 0xc6, 0x7d, 0x00, 0x50, 0xb9, 0xbd, 0x6d, 0xc5, 0x71, 0x7b, 0x5f, 0x85, + 0xf8, 0x83, 0x19, 0x66, 0x1c, 0xaf, 0x52, 0x64, 0x63, 0x81, 0xe9, 0x94, 0x59, 0xa9, 0x5b, 0x35, 0x2b, 0xfb, 0xc7, + 0xf4, 0x5f, 0x1a, 0x0d, 0xb0, 0x2f, 0x17, 0xf9, 0xf9, 0x76, 0x99, 0x28, 0xb0, 0xc2, 0x22, 0xd1, 0x7b, 0x17, 0x40, + 0xba, 0x83, 0x48, 0xc6, 0x9f, 0xf7, 0x70, 0xd1, 0xf0, 0xf0, 0x17, 0x39, 0x68, 0xd9, 0x79, 0xe5, 0x44, 0x69, 0x3e, + 0xaf, 0xd8, 0x09, 0x44, 0x9e, 0x3a, 0x45, 0x98, 0xfe, 0x7d, 0x72, 0xe5, 0xb5, 0x47, 0x4e, 0xce, 0x5e, 0x40, 0xbf, + 0x26, 0x6e, 0x9f, 0x9f, 0x65, 0x1d, 0xfe, 0xb1, 0x44, 0x85, 0xb0, 0x52, 0xe8, 0x41, 0x55, 0x08, 0x5f, 0x70, 0xe2, + 0x00, 0x4e, 0x3d, 0x7c, 0x78, 0xc6, 0xdf, 0x0e, 0x43, 0xfb, 0xf8, 0x99, 0xb3, 0x69, 0x89, 0xf1, 0x12, 0x83, 0x45, + 0xb5, 0xd4, 0x78, 0x7e, 0xff, 0x34, 0xeb, 0xe9, 0x9e, 0xb1, 0x4f, 0x8b, 0x9e, 0xac, 0x6a, 0x9a, 0x37, 0x24, 0xce, + 0x7f, 0xd8, 0xfc, 0x5a, 0x1b, 0x1f, 0xec, 0xdc, 0x56, 0x25, 0x47, 0xd6, 0x05, 0xae, 0xcb, 0xaa, 0x55, 0xd5, 0x37, + 0x03, 0xce, 0x49, 0x8f, 0xc5, 0x4b, 0x9d, 0xdd, 0x2f, 0xe8, 0x8f, 0x66, 0x3a, 0x5a, 0x1f, 0x7d, 0x70, 0x2d, 0x42, + 0xd5, 0xa4, 0x33, 0xba, 0x37, 0xbf, 0xc3, 0x39, 0xe5, 0x33, 0xd7, 0xf1, 0xb9, 0x5b, 0x0b, 0xe5, 0x09, 0x8f, 0x16, + 0x1a, 0x85, 0xa1, 0x3b, 0x77, 0x8f, 0xe0, 0x5a, 0x24, 0xcd, 0xc8, 0xde, 0xc2, 0x39, 0xd3, 0xf8, 0x4c, 0x7f, 0x36, + 0x0b, 0xf5, 0xa7, 0x3e, 0x14, 0x14, 0x11, 0xf3, 0x2b, 0xa6, 0x62, 0x28, 0x25, 0xc1, 0x43, 0x44, 0x04, 0x5a, 0x47, + 0x51, 0x3e, 0x55, 0x57, 0x57, 0xca, 0xea, 0x97, 0xb3, 0x2c, 0x28, 0x92, 0xd9, 0x14, 0x59, 0xb9, 0xe2, 0x8f, 0x4e, + 0x72, 0x96, 0xeb, 0x42, 0x40, 0xce, 0x3e, 0xc0, 0x89, 0xfd, 0x9b, 0x41, 0xe0, 0xb6, 0xb6, 0xd6, 0xfe, 0x48, 0x50, + 0x63, 0x14, 0x7c, 0x8b, 0x00, 0x8c, 0xc4, 0xd0, 0x46, 0xf9, 0xe4, 0x56, 0xba, 0x50, 0x51, 0xbd, 0x3f, 0x71, 0xf7, + 0x3f, 0xbf, 0xbb, 0xc9, 0x0d, 0x1b, 0x77, 0x69, 0x0e, 0x4d, 0xe6, 0xc9, 0x39, 0xda, 0xc8, 0xee, 0xba, 0x5f, 0x06, + 0xf9, 0x2d, 0x5f, 0x92, 0xf4, 0x74, 0x44, 0x60, 0x4b, 0xcb, 0x8f, 0x48, 0x45, 0x49, 0x22, 0x90, 0x63, 0xad, 0x00, + 0x50, 0x33, 0x21, 0x95, 0x8a, 0x1c, 0x45, 0x9e, 0x8c, 0x7a, 0x33, 0xa7, 0x24, 0x2d, 0x69, 0x37, 0xa8, 0x31, 0x2c, + 0x87, 0xaf, 0xb9, 0x36, 0x4b, 0x7d, 0xad, 0xa4, 0xec, 0xc4, 0xf6, 0x82, 0x05, 0x94, 0x38, 0xa6, 0xe0, 0x82, 0xd5, + 0x58, 0x9a, 0x36, 0xaf, 0x27, 0x18, 0xd0, 0x32, 0x97, 0x76, 0xd9, 0x12, 0xf2, 0x95, 0xfa, 0x7d, 0x58, 0x8c, 0x90, + 0x7c, 0x63, 0xa1, 0x58, 0xda, 0xaa, 0x55, 0xb9, 0xf3, 0x1c, 0x3f, 0xd0, 0xa4, 0x48, 0x1d, 0xed, 0x61, 0xfa, 0x16, + 0x8e, 0xc4, 0xe0, 0x66, 0x4e, 0xb9, 0xa4, 0x4c, 0xe3, 0xd2, 0x9f, 0xa4, 0xff, 0xaa, 0x2f, 0x43, 0x3e, 0xc1, 0x51, + 0xac, 0xfe, 0x83, 0x6a, 0xcc, 0x40, 0x40, 0xea, 0x4b, 0x10, 0x15, 0xc3, 0x68, 0xe6, 0x10, 0xdd, 0xa0, 0xf5, 0x99, + 0x3a, 0x91, 0xce, 0x5e, 0x6c, 0x70, 0xd2, 0x97, 0x73, 0xa2, 0x79, 0xe1, 0x3b, 0x8c, 0xf7, 0x81, 0x01, 0x0c, 0x0a, + 0xf3, 0x60, 0x0c, 0xec, 0xb2, 0x26, 0x6d, 0x29, 0xb8, 0x41, 0x0d, 0x34, 0x81, 0x07, 0x78, 0x3a, 0x89, 0x90, 0x8b, + 0x7c, 0x66, 0x71, 0x27, 0xbb, 0x98, 0x52, 0x6b, 0x7e, 0x2c, 0x84, 0x85, 0xfe, 0xdd, 0x62, 0x2b, 0xcb, 0x1d, 0x3c, + 0x13, 0x11, 0x54, 0x05, 0x0a, 0xbc, 0x72, 0x79, 0x43, 0xa7, 0x25, 0x70, 0xf0, 0x3e, 0xb5, 0xe2, 0x06, 0x07, 0xbe, + 0x0d, 0x2a, 0x5d, 0xb0, 0x1f, 0xb4, 0xeb, 0xdf, 0x7b, 0xae, 0xc2, 0x22, 0xea, 0x21, 0xde, 0x6a, 0xae, 0x57, 0x77, + 0xf7, 0xbe, 0xd7, 0xf1, 0x59, 0x53, 0xcb, 0x1e, 0x7f, 0xc6, 0x10, 0x0a, 0x4e, 0xd0, 0x2a, 0x15, 0x12, 0x30, 0xf0, + 0xc7, 0x2d, 0x6c, 0xfc, 0x92, 0xa5, 0xdb, 0x11, 0x4b, 0x7f, 0xfd, 0xba, 0xa2, 0xc9, 0xae, 0xba, 0xa9, 0x27, 0xa0, + 0x88, 0xbd, 0xa3, 0x55, 0x76, 0xb8, 0x4a, 0xcd, 0x7b, 0xc5, 0xbb, 0x1e, 0xf8, 0x94, 0x0e, 0xcc, 0x28, 0xb0, 0x17, + 0xc4, 0x1c, 0x18, 0xeb, 0xc7, 0x46, 0x79, 0xd7, 0x4f, 0xbe, 0x4b, 0xd1, 0x46, 0xad, 0xaf, 0xfc, 0x41, 0x10, 0xdf, + 0x67, 0x46, 0xac, 0xbd, 0x04, 0x66, 0x30, 0xba, 0xd3, 0x36, 0x1d, 0x76, 0xe5, 0x3e, 0x9e, 0x1f, 0xb2, 0xde, 0x41, + 0x40, 0xa5, 0xe8, 0x47, 0x81, 0x4b, 0x26, 0x30, 0x98, 0x83, 0x23, 0xdb, 0x8b, 0x3d, 0xf9, 0x44, 0xcc, 0x85, 0x28, + 0x45, 0x33, 0x46, 0x01, 0xc1, 0xc8, 0x61, 0x85, 0xed, 0x3f, 0xc2, 0x76, 0x01, 0x70, 0x8b, 0x87, 0x0c, 0x7b, 0x5e, + 0xe3, 0x4d, 0xbc, 0x1d, 0x35, 0xcc, 0x99, 0xd4, 0x5b, 0xd0, 0x4e, 0x8f, 0x21, 0xf9, 0x7d, 0x1a, 0x24, 0xa3, 0x22, + 0xf7, 0x28, 0x12, 0x84, 0xd7, 0x45, 0x4e, 0x5a, 0x80, 0x75, 0x77, 0xe8, 0xa6, 0x5f, 0x01, 0x62, 0xfa, 0x5e, 0x02, + 0xfe, 0x44, 0x6e, 0x22, 0x16, 0xbc, 0xdd, 0x34, 0xc4, 0x1d, 0x4c, 0x80, 0xa1, 0x11, 0x9e, 0x41, 0xd0, 0x08, 0x92, + 0x11, 0xdd, 0x6d, 0xee, 0xa7, 0xcc, 0x7f, 0x56, 0xe4, 0xc7, 0xb2, 0x31, 0xae, 0x79, 0xd3, 0xde, 0xc5, 0x6f, 0x11, + 0xa9, 0x00, 0x62, 0x67, 0xca, 0x2c, 0x54, 0x89, 0xc9, 0xd7, 0x85, 0x8d, 0x7d, 0x6e, 0x94, 0x25, 0xdb, 0xe7, 0xf5, + 0xd7, 0x66, 0xd8, 0x92, 0x66, 0xb6, 0xb7, 0x39, 0xe3, 0xb3, 0x8a, 0x89, 0x85, 0x17, 0x05, 0xce, 0xfd, 0xed, 0xd7, + 0xfd, 0xf9, 0x70, 0x95, 0x2d, 0xdb, 0x29, 0x53, 0x8f, 0x23, 0x25, 0xcb, 0x5a, 0x7f, 0xbb, 0x32, 0x93, 0xb7, 0x6e, + 0xd1, 0x13, 0xec, 0xa8, 0x35, 0xf3, 0x25, 0x47, 0xda, 0xba, 0x87, 0x93, 0xec, 0xba, 0xc0, 0x2e, 0xef, 0x04, 0xd0, + 0xb4, 0x74, 0x42, 0xf1, 0x73, 0x25, 0xb4, 0xac, 0x1d, 0xe0, 0x24, 0x7e, 0xfa, 0x62, 0xe2, 0xa5, 0x98, 0xad, 0xc1, + 0x36, 0xbf, 0x62, 0x5e, 0xc4, 0x60, 0xcf, 0x8d, 0x0a, 0xe1, 0x8c, 0xf3, 0xbe, 0x05, 0xb3, 0xf4, 0x1b, 0xaf, 0xdc, + 0xe6, 0x73, 0x82, 0xfd, 0x96, 0x16, 0xc1, 0xc0, 0xc4, 0x5d, 0xf5, 0x5a, 0xe3, 0x2c, 0x84, 0xa8, 0x6b, 0xb9, 0x2f, + 0x62, 0xe6, 0x36, 0xa7, 0xe9, 0x5d, 0xad, 0xc9, 0x8c, 0xfd, 0xe2, 0x4a, 0x33, 0xeb, 0xbb, 0xef, 0x20, 0x6b, 0xad, + 0x2a, 0xf4, 0x2b, 0x52, 0xcf, 0x64, 0xfd, 0x27, 0xb0, 0x19, 0x8b, 0x1d, 0x16, 0x4b, 0x2b, 0x75, 0xe7, 0xaa, 0xf4, + 0x03, 0x9e, 0x54, 0x00, 0x72, 0x11, 0xd0, 0x99, 0x6e, 0x3d, 0x77, 0x8b, 0x45, 0x3d, 0xea, 0xc1, 0xad, 0xbf, 0xb7, + 0x1a, 0x06, 0x41, 0xac, 0x63, 0xbf, 0x22, 0x78, 0x3c, 0x5e, 0x89, 0xdf, 0x0b, 0xaf, 0xc8, 0x0f, 0x5b, 0x1e, 0xff, + 0x7c, 0x01, 0x65, 0xfa, 0x49, 0x34, 0xed, 0xfc, 0x6c, 0xc3, 0xc2, 0xa4, 0x7c, 0x3a, 0x8f, 0xfc, 0x1e, 0xcd, 0xcd, + 0x15, 0xb4, 0xdc, 0xf3, 0x03, 0x97, 0xf2, 0x7f, 0x16, 0x29, 0x4b, 0x6a, 0x85, 0x66, 0xd9, 0x36, 0xc1, 0xd1, 0xdd, + 0x9e, 0xe2, 0xc1, 0x73, 0x9c, 0x50, 0x68, 0x6f, 0x4a, 0xbd, 0x55, 0x85, 0x9a, 0xa8, 0xb5, 0x85, 0x02, 0x65, 0xfd, + 0x88, 0xf6, 0x51, 0x71, 0xc4, 0x0d, 0x23, 0x3d, 0xea, 0x6f, 0x6a, 0x6d, 0x91, 0x5d, 0x47, 0xed, 0x97, 0xb5, 0xfb, + 0x7d, 0x12, 0x24, 0xff, 0x6d, 0x05, 0xc8, 0xac, 0x0d, 0xd5, 0x9b, 0x80, 0x69, 0x44, 0x31, 0x47, 0xc1, 0x8f, 0xd1, + 0x92, 0x42, 0xa3, 0x0c, 0x2e, 0x1c, 0x11, 0x66, 0x2d, 0xb5, 0xe4, 0x19, 0x43, 0xf0, 0xbc, 0xd1, 0xd0, 0x91, 0xf0, + 0xb5, 0xe9, 0x5d, 0x76, 0x66, 0x36, 0x4c, 0xce, 0x3d, 0xa2, 0x21, 0x9b, 0x7a, 0xaa, 0x28, 0x01, 0xf7, 0xcd, 0x72, + 0x7c, 0x75, 0x50, 0xb2, 0x26, 0xb5, 0x57, 0xc1, 0x6e, 0x1f, 0x72, 0x73, 0x19, 0xbd, 0x35, 0x54, 0x6b, 0xf8, 0xde, + 0x48, 0xd6, 0xb0, 0xca, 0x35, 0x90, 0xd8, 0xce, 0x8f, 0x30, 0x49, 0x45, 0x77, 0xf9, 0x16, 0x34, 0xde, 0x51, 0x95, + 0xcb, 0x4e, 0xeb, 0xda, 0xbb, 0x03, 0x37, 0x61, 0xd8, 0xfa, 0xd4, 0x8d, 0x8e, 0xf4, 0xfd, 0x80, 0x0d, 0x9a, 0x95, + 0x4a, 0x03, 0x4e, 0xf9, 0x05, 0x15, 0xad, 0xf3, 0xbb, 0x25, 0x5f, 0xec, 0x19, 0xee, 0x83, 0x11, 0x32, 0x26, 0x8e, + 0xc0, 0x8e, 0x1a, 0xe0, 0x29, 0x61, 0xc6, 0xe1, 0xc7, 0x9e, 0xdb, 0xd7, 0xc6, 0xa0, 0x7f, 0xa5, 0xd9, 0x50, 0x40, + 0x8d, 0xf6, 0xb8, 0x92, 0x54, 0x3a, 0x86, 0x19, 0x93, 0xc2, 0x87, 0x54, 0x28, 0x73, 0xfc, 0xbb, 0x73, 0x4d, 0xb1, + 0x66, 0x38, 0x57, 0x23, 0xd3, 0x86, 0xf3, 0xbf, 0x1a, 0xf3, 0x5b, 0x8e, 0xef, 0x20, 0xaa, 0x9e, 0x8e, 0x41, 0x87, + 0x50, 0x4a, 0x50, 0x76, 0x65, 0x42, 0x55, 0x03, 0xfd, 0xa2, 0x19, 0x6d, 0x9a, 0xd6, 0x8f, 0x91, 0xf3, 0xbf, 0x6e, + 0xbf, 0xb6, 0x93, 0x8b, 0xd6, 0x0a, 0xeb, 0xe2, 0x07, 0x3f, 0x30, 0xe4, 0xb5, 0x7b, 0x7e, 0x76, 0xab, 0x5c, 0xd9, + 0x53, 0x5b, 0x3c, 0x75, 0xc1, 0x97, 0xe9, 0xfa, 0x18, 0xbc, 0x2c, 0x20, 0x35, 0x8d, 0xaa, 0x75, 0xec, 0x13, 0x16, + 0x5a, 0xec, 0x3a, 0x6f, 0xd7, 0x2f, 0x4f, 0xaa, 0x89, 0x57, 0x2c, 0x03, 0x3a, 0x3f, 0xb3, 0x29, 0xf6, 0x91, 0x16, + 0x97, 0x0d, 0xff, 0x32, 0xa0, 0xe7, 0xd9, 0x40, 0x9e, 0xf9, 0x59, 0x7f, 0xae, 0x3f, 0xbe, 0xe5, 0x21, 0xa1, 0x14, + 0xb7, 0x35, 0x4e, 0xef, 0x1a, 0xdb, 0xcc, 0x3b, 0xb3, 0xb4, 0x8f, 0x9d, 0x66, 0x3e, 0xa2, 0x22, 0x5d, 0x70, 0x12, + 0xb6, 0xa7, 0x43, 0xba, 0x92, 0x6d, 0x16, 0x9a, 0x39, 0xf5, 0xa5, 0x71, 0x59, 0x9c, 0xd7, 0x69, 0x73, 0x31, 0xf7, + 0x82, 0xae, 0x03, 0x38, 0xd7, 0x29, 0x47, 0x70, 0x55, 0x11, 0x28, 0x9a, 0x9a, 0xb9, 0xa2, 0x78, 0x68, 0x2d, 0x76, + 0x73, 0x6b, 0xf7, 0x53, 0x8c, 0xb8, 0xd4, 0xa5, 0x2a, 0x51, 0x92, 0x6c, 0x59, 0x29, 0x90, 0xc9, 0x82, 0xac, 0x39, + 0x49, 0x15, 0x0e, 0xfa, 0x37, 0x87, 0x74, 0xf6, 0x62, 0xd8, 0x87, 0x70, 0xe6, 0x6b, 0xa9, 0x0a, 0xa3, 0x59, 0xac, + 0xe6, 0x39, 0x88, 0x54, 0x6d, 0x1f, 0x28, 0xa7, 0xca, 0x7d, 0x5b, 0x40, 0xe6, 0x46, 0xca, 0x4b, 0x51, 0x47, 0x6e, + 0x78, 0x4a, 0xbf, 0x36, 0x3d, 0x10, 0xa3, 0xd5, 0xb0, 0xa3, 0x8d, 0x66, 0xb3, 0x59, 0x14, 0x53, 0x8f, 0x43, 0x9b, + 0xd4, 0x7c, 0x1b, 0x51, 0xaf, 0x50, 0x35, 0xb3, 0x6f, 0x4c, 0x3d, 0x62, 0xc9, 0x9c, 0xe2, 0x35, 0x14, 0x26, 0xc9, + 0x3d, 0x8b, 0x2d, 0xea, 0x16, 0x6d, 0x6e, 0xce, 0x1c, 0x1b, 0x92, 0xb8, 0x8a, 0x4b, 0x99, 0xae, 0x34, 0x1e, 0x05, + 0xc2, 0x61, 0x25, 0xda, 0x4e, 0x30, 0x1b, 0xf3, 0xf4, 0x83, 0x9f, 0x92, 0x9f, 0x7b, 0x04, 0x4c, 0xb3, 0x2f, 0x60, + 0x2b, 0xe9, 0xce, 0x8c, 0xf8, 0x48, 0x41, 0xce, 0xe1, 0x2b, 0x86, 0xe9, 0x7b, 0x9b, 0xc8, 0x72, 0x1f, 0xe7, 0x53, + 0x82, 0x32, 0x39, 0xa9, 0x76, 0x68, 0xbc, 0x81, 0xd8, 0x1b, 0x20, 0x9e, 0x86, 0xb0, 0x04, 0x4f, 0x23, 0x60, 0x90, + 0xf8, 0xbc, 0x5c, 0xc5, 0x43, 0x2d, 0x6e, 0x7c, 0x97, 0x79, 0x08, 0x70, 0xb6, 0x0c, 0x43, 0x6d, 0x62, 0x92, 0xfb, + 0xb3, 0x06, 0x74, 0x27, 0xa2, 0x62, 0x49, 0x66, 0x97, 0x75, 0x15, 0x85, 0xf9, 0x77, 0x5e, 0x2f, 0x53, 0x27, 0x9c, + 0x2d, 0xde, 0xb8, 0x0d, 0x80, 0xe9, 0x42, 0x7b, 0xaa, 0x93, 0x13, 0x93, 0xe2, 0xd7, 0x50, 0x1a, 0xd6, 0x09, 0x0d, + 0x14, 0x89, 0xfa, 0x79, 0xb4, 0x9e, 0x98, 0xa2, 0x38, 0xff, 0x11, 0x91, 0x0c, 0x4c, 0x12, 0xc8, 0x60, 0xb4, 0x7b, + 0xc5, 0x9a, 0x50, 0xac, 0xfd, 0xa4, 0x65, 0xd3, 0x99, 0xfb, 0x36, 0x83, 0x98, 0xbd, 0x1f, 0x04, 0x0f, 0x04, 0xff, + 0xe5, 0x56, 0x27, 0x8c, 0xa0, 0x04, 0xc3, 0xec, 0x30, 0xff, 0x89, 0xac, 0xba, 0x2d, 0xe8, 0xa8, 0x57, 0xe4, 0xaa, + 0x77, 0xe2, 0x52, 0x67, 0x12, 0x55, 0x4f, 0x7e, 0x9e, 0xb8, 0xfb, 0x56, 0x36, 0x46, 0x0b, 0xdc, 0xe7, 0xc8, 0x27, + 0x57, 0x6e, 0x66, 0xdb, 0xc8, 0xa8, 0xa6, 0x28, 0x12, 0x8b, 0x98, 0xca, 0xbc, 0x79, 0x8e, 0xfb, 0xf0, 0xaa, 0xb9, + 0x83, 0xef, 0xb7, 0x39, 0xd8, 0xca, 0xac, 0xdc, 0xe5, 0xf2, 0x6d, 0x7a, 0x68, 0xd0, 0xfd, 0xae, 0x73, 0xa4, 0x4b, + 0xef, 0xa6, 0x72, 0x5b, 0xb7, 0x3b, 0x53, 0xe7, 0x23, 0xf5, 0xd4, 0xf1, 0xf9, 0x99, 0x74, 0x63, 0xb7, 0xfe, 0x53, + 0x35, 0xc1, 0x4f, 0xf9, 0x02, 0xb4, 0x34, 0x55, 0x7c, 0x2c, 0x28, 0xa3, 0x16, 0xdd, 0xc1, 0x57, 0x6e, 0xb9, 0x15, + 0xf4, 0x2b, 0x9f, 0xab, 0xbc, 0x70, 0x8d, 0x5c, 0x3a, 0x7b, 0xe1, 0x04, 0x36, 0xf5, 0xe0, 0x9d, 0xf1, 0x57, 0xc1, + 0x25, 0xe0, 0xda, 0x10, 0x07, 0x23, 0x25, 0x89, 0xf7, 0xd5, 0xc0, 0x1b, 0x11, 0xf1, 0x8f, 0x82, 0xa1, 0x51, 0xfa, + 0x96, 0xfa, 0x18, 0x5b, 0x0c, 0xb3, 0x3e, 0xaa, 0x94, 0xab, 0xb3, 0xb9, 0xe0, 0xd4, 0x39, 0xfa, 0x13, 0x46, 0xdc, + 0xf3, 0x00, 0xe7, 0xac, 0xae, 0x7f, 0x06, 0xe7, 0xb5, 0xfd, 0xcc, 0x38, 0x1f, 0x8a, 0xa6, 0x44, 0xeb, 0xdd, 0x78, + 0xa7, 0x3c, 0x9b, 0x2d, 0xe7, 0x67, 0x15, 0x5e, 0x0d, 0xf7, 0x19, 0x9f, 0x5e, 0xfa, 0x1d, 0x98, 0x3c, 0x0e, 0xba, + 0xf4, 0xbe, 0x72, 0x78, 0xef, 0x4e, 0xc5, 0x4a, 0x15, 0x35, 0xe2, 0xd8, 0xa1, 0x7b, 0x8d, 0xc7, 0xbd, 0x0b, 0xcc, + 0x1a, 0xab, 0x93, 0xc3, 0x43, 0x6b, 0xab, 0x7c, 0x5d, 0x65, 0x84, 0x9d, 0xc4, 0x37, 0xcb, 0xc6, 0x94, 0x48, 0xb0, + 0xbf, 0x0d, 0x94, 0x63, 0x38, 0x10, 0xe1, 0x61, 0xc2, 0x9b, 0xac, 0xc2, 0xbc, 0x96, 0x8a, 0x32, 0xab, 0x1d, 0xfe, + 0x5a, 0x71, 0x8d, 0x68, 0x07, 0x4b, 0xae, 0xa4, 0x0d, 0x66, 0xd1, 0xa5, 0xa4, 0x61, 0x75, 0xc3, 0xa1, 0x5e, 0xdf, + 0x15, 0x5c, 0xd5, 0xb6, 0x66, 0x91, 0xfc, 0x45, 0xd9, 0x8e, 0x95, 0x08, 0x9b, 0x29, 0xf3, 0x3c, 0xfb, 0x3f, 0xa2, + 0x4a, 0x87, 0xdc, 0x02, 0xa6, 0xf6, 0x43, 0xba, 0x42, 0x52, 0x8c, 0x0d, 0xda, 0x4f, 0x4a, 0x57, 0x32, 0xef, 0xf8, + 0x8d, 0xc5, 0x75, 0xcb, 0x50, 0xe4, 0x62, 0x33, 0x56, 0x17, 0x1b, 0xc0, 0xc2, 0x2a, 0x07, 0xcc, 0x46, 0x14, 0xcd, + 0xa2, 0x6c, 0xca, 0xa3, 0xed, 0x16, 0xaf, 0x5b, 0xb4, 0xfa, 0xfb, 0x33, 0xd1, 0x33, 0x5b, 0x27, 0x55, 0x9d, 0x65, + 0xbd, 0x7f, 0x65, 0xc5, 0x5c, 0xe1, 0xe1, 0x47, 0x7b, 0x6e, 0xe7, 0x88, 0xce, 0xfb, 0xbb, 0x9b, 0xfe, 0x85, 0xdd, + 0xfc, 0x7f, 0x49, 0x37, 0x61, 0x86, 0xf5, 0xe4, 0xf6, 0xd3, 0x4b, 0xac, 0x09, 0xe7, 0x3f, 0xb2, 0x89, 0x61, 0xdb, + 0x15, 0xd4, 0x16, 0x35, 0x66, 0x9c, 0x12, 0x3c, 0xf6, 0x81, 0x0a, 0xed, 0x61, 0xe2, 0x0a, 0x61, 0x54, 0x79, 0xaa, + 0x44, 0xfa, 0x5c, 0xfc, 0xb2, 0x4d, 0x64, 0xd0, 0x19, 0x87, 0xb2, 0x81, 0x9d, 0xdb, 0xb5, 0xca, 0xcc, 0xd6, 0xd2, + 0xfa, 0x8f, 0x99, 0x62, 0xf3, 0x7f, 0xc0, 0x12, 0xf5, 0x90, 0x47, 0x7e, 0x59, 0xb5, 0x08, 0xef, 0x0d, 0xe5, 0xe6, + 0x21, 0xc8, 0x2d, 0x8b, 0x0e, 0x7f, 0x60, 0x3e, 0x40, 0x8e, 0x60, 0x8c, 0x1a, 0xb0, 0x52, 0x4e, 0x21, 0x97, 0xf9, + 0x71, 0xaa, 0xc9, 0x50, 0xcb, 0x72, 0x9d, 0xb1, 0x4a, 0x23, 0xaf, 0x59, 0x99, 0xa7, 0x59, 0x91, 0x6b, 0x94, 0x0d, + 0x15, 0xd7, 0x9f, 0x91, 0xa3, 0x51, 0x1b, 0xd0, 0x10, 0xbb, 0xe3, 0x9c, 0xd8, 0x28, 0x73, 0xd4, 0x71, 0x72, 0x4b, + 0x9e, 0x59, 0x57, 0x33, 0x5b, 0x89, 0x93, 0x8b, 0x77, 0x9b, 0xb1, 0x6d, 0x77, 0x34, 0x2e, 0x99, 0x27, 0x8e, 0x73, + 0x74, 0x7d, 0xa3, 0xcd, 0x9e, 0x97, 0xec, 0xb8, 0xf8, 0x3f, 0x48, 0x0e, 0xdd, 0x3c, 0x1a, 0x11, 0xcc, 0xc5, 0x25, + 0x45, 0xa9, 0xe9, 0xe6, 0x48, 0x02, 0x1b, 0x1e, 0xff, 0xb9, 0x89, 0xae, 0xf8, 0x78, 0x6e, 0x56, 0x46, 0x14, 0x5b, + 0x9c, 0xd8, 0x9f, 0xed, 0x61, 0xd5, 0x7a, 0x44, 0xc2, 0x81, 0xb3, 0xce, 0xfa, 0x60, 0x9f, 0xeb, 0xd2, 0xff, 0xe0, + 0x07, 0x36, 0x12, 0x82, 0x8d, 0x61, 0xf5, 0xce, 0xfe, 0xa7, 0x66, 0xc5, 0x85, 0xae, 0x35, 0x3b, 0x5e, 0xf8, 0x57, + 0x5c, 0xe1, 0x2d, 0x49, 0x65, 0x25, 0x37, 0x2e, 0x77, 0x2a, 0xe3, 0x05, 0x55, 0x3a, 0x66, 0x61, 0xe8, 0x58, 0x4c, + 0xaf, 0x0e, 0x4a, 0xaf, 0x08, 0x68, 0xa8, 0xce, 0xb9, 0xab, 0x95, 0xd9, 0x04, 0x97, 0x11, 0x92, 0x4a, 0x81, 0xbb, + 0xc2, 0x90, 0xe9, 0x9d, 0x6f, 0x86, 0x7e, 0x30, 0x14, 0x66, 0x6e, 0x40, 0xd8, 0x32, 0x41, 0xa5, 0xc3, 0x9a, 0x15, + 0x7b, 0x41, 0x9b, 0x0c, 0xe6, 0x3c, 0xa2, 0xde, 0x6b, 0xa4, 0xbf, 0x73, 0xc2, 0x05, 0x38, 0x4a, 0x81, 0xc2, 0x80, + 0x2e, 0x6f, 0x3c, 0x40, 0x72, 0x89, 0x10, 0x63, 0x0d, 0x85, 0xd4, 0x26, 0x7e, 0x39, 0xbf, 0xe2, 0x9e, 0xf7, 0xb3, + 0xe3, 0xac, 0xeb, 0x5b, 0x03, 0x79, 0x98, 0x5f, 0xbf, 0xbd, 0xce, 0x7a, 0x90, 0xb3, 0x21, 0x71, 0xb1, 0xb2, 0xf3, + 0x8a, 0x76, 0x76, 0x45, 0x5b, 0xea, 0x6a, 0x54, 0xe1, 0xb6, 0x86, 0x29, 0x52, 0x54, 0xb1, 0xe1, 0x7a, 0x1b, 0xba, + 0x20, 0xe9, 0x8b, 0x35, 0x85, 0x84, 0x19, 0xbb, 0xa6, 0x30, 0x95, 0x3b, 0xa1, 0x47, 0x67, 0xc3, 0x40, 0x5f, 0x6c, + 0xfd, 0x02, 0xf4, 0xa7, 0x8d, 0x8d, 0x36, 0x7d, 0x4f, 0x54, 0x46, 0xcc, 0x29, 0xfa, 0xbc, 0xc3, 0xec, 0xd3, 0xfe, + 0x44, 0x77, 0xb0, 0x5a, 0x5f, 0xc6, 0x5f, 0x56, 0x6c, 0xd4, 0xc7, 0xd6, 0x33, 0x26, 0x89, 0x53, 0xc9, 0xed, 0x41, + 0x49, 0x41, 0x66, 0xde, 0x44, 0x0d, 0x19, 0x29, 0xad, 0x39, 0x8f, 0x20, 0xfe, 0x77, 0xae, 0x98, 0x99, 0x98, 0xf6, + 0x63, 0x5c, 0x52, 0x1f, 0x7f, 0xf7, 0xc4, 0x5b, 0xbb, 0x77, 0x9a, 0xa1, 0x63, 0xf6, 0x00, 0x81, 0x9c, 0x57, 0x5e, + 0xba, 0x60, 0x68, 0x6e, 0xad, 0x54, 0xb3, 0xa6, 0x51, 0xfe, 0xb3, 0xbb, 0x32, 0x05, 0x03, 0xfb, 0x44, 0xad, 0x3f, + 0xdb, 0xe5, 0x66, 0xea, 0x1b, 0xb3, 0x57, 0x03, 0x4e, 0x04, 0x66, 0x36, 0xdd, 0x54, 0xfa, 0xaf, 0xfb, 0xfe, 0x3b, + 0x16, 0xa0, 0xd8, 0xd9, 0xc8, 0x1f, 0x9a, 0x8a, 0xe0, 0xc6, 0x77, 0x67, 0x2f, 0x86, 0x2d, 0x0a, 0x05, 0x5f, 0x46, + 0x99, 0xee, 0x32, 0xf2, 0x07, 0x0d, 0x6d, 0xf0, 0x4b, 0x7a, 0x63, 0x1b, 0x97, 0x61, 0x1f, 0xed, 0x61, 0x12, 0xbb, + 0x60, 0x68, 0x6b, 0x62, 0x41, 0x50, 0x35, 0x75, 0xde, 0x30, 0x22, 0xa1, 0x6f, 0xad, 0x95, 0xcf, 0xeb, 0xd8, 0x33, + 0xde, 0x71, 0x3e, 0x64, 0x62, 0x04, 0x7e, 0x8b, 0xb6, 0x5b, 0x12, 0xca, 0xb8, 0x74, 0x0c, 0x32, 0xb5, 0x47, 0x6d, + 0xc7, 0xc9, 0xb4, 0xed, 0x76, 0xd4, 0xee, 0xd1, 0xdd, 0xcd, 0x6f, 0x06, 0xa5, 0xed, 0x8e, 0xf0, 0x2d, 0xbc, 0x3a, + 0x73, 0xe4, 0x7e, 0xeb, 0xee, 0x24, 0x5b, 0xa0, 0x37, 0x33, 0x15, 0x14, 0x75, 0xc2, 0xc9, 0x33, 0xd6, 0xf8, 0xbf, + 0xd0, 0x54, 0xc1, 0x10, 0x98, 0xcc, 0x44, 0xb2, 0xdb, 0x82, 0x7c, 0x16, 0xfa, 0xfb, 0x14, 0x6e, 0x15, 0xb2, 0xb4, + 0x2d, 0x66, 0x08, 0xa7, 0x7a, 0xd0, 0x0c, 0x5e, 0x42, 0x81, 0x28, 0xed, 0x9d, 0xa1, 0x32, 0xe8, 0x41, 0xa5, 0x03, + 0x99, 0x28, 0x06, 0x35, 0x4b, 0x61, 0xca, 0x9b, 0x90, 0x7a, 0xf7, 0x7b, 0xbd, 0xf5, 0x77, 0xf9, 0xde, 0x8c, 0x22, + 0x1e, 0xf5, 0xd6, 0x49, 0x02, 0x82, 0x5f, 0x71, 0x20, 0x13, 0xe5, 0xf5, 0x92, 0x18, 0xb1, 0x8e, 0xc7, 0x49, 0xae, + 0x16, 0x1d, 0xaf, 0xc4, 0x39, 0x25, 0x15, 0x42, 0xce, 0x01, 0x0c, 0x13, 0x05, 0xee, 0xe5, 0x38, 0x82, 0xf5, 0x80, + 0x67, 0x72, 0x45, 0x3d, 0x1b, 0x8b, 0xbb, 0xfd, 0xef, 0xe5, 0xd5, 0xed, 0x9a, 0xf6, 0x36, 0x49, 0x01, 0x56, 0x5d, + 0x54, 0x82, 0xef, 0xfe, 0xfc, 0x29, 0xe4, 0xb1, 0x64, 0x87, 0x5a, 0x2a, 0x73, 0x30, 0x5b, 0x74, 0x1d, 0x72, 0xd6, + 0xa7, 0xaa, 0x3a, 0x36, 0x39, 0xa0, 0x86, 0xd3, 0xb4, 0x73, 0xc1, 0x78, 0x9c, 0xb0, 0x86, 0x73, 0xc2, 0x1a, 0x76, + 0xa8, 0x68, 0x23, 0x8c, 0x6e, 0x68, 0x31, 0x96, 0xb4, 0xc6, 0x7c, 0x3b, 0x20, 0x24, 0xf8, 0x7a, 0xa1, 0x95, 0x8b, + 0x8c, 0xe3, 0x8f, 0x2d, 0x06, 0x13, 0xec, 0x12, 0x2b, 0xdd, 0x84, 0x7f, 0x0d, 0xcf, 0x95, 0xbe, 0x95, 0x27, 0x71, + 0x73, 0x6f, 0xce, 0xe1, 0x44, 0xe3, 0x51, 0x93, 0x8c, 0xfc, 0x94, 0xf5, 0xa8, 0x94, 0xe4, 0x3f, 0x37, 0x8f, 0x81, + 0x33, 0x73, 0x8b, 0x7d, 0x25, 0x30, 0x26, 0x54, 0x3a, 0x96, 0xf1, 0x2f, 0x11, 0xf5, 0xd9, 0x68, 0xc4, 0x0c, 0x0a, + 0xe3, 0x5c, 0x25, 0x56, 0xe2, 0x3e, 0xdb, 0xa2, 0x97, 0xf2, 0xae, 0x31, 0x46, 0x25, 0x4c, 0xc5, 0x2f, 0x46, 0xf6, + 0x18, 0xa9, 0xb7, 0x73, 0xb6, 0xfd, 0x5c, 0x13, 0xdd, 0x73, 0x3a, 0x90, 0x04, 0x8d, 0x4b, 0x66, 0x0a, 0x90, 0xc4, + 0x04, 0x63, 0x72, 0x07, 0x2c, 0xda, 0xa6, 0x75, 0x9e, 0xc2, 0xab, 0x56, 0xe3, 0x49, 0x65, 0x7b, 0xdf, 0x65, 0x65, + 0x2e, 0xdb, 0x8e, 0x4e, 0x5b, 0x12, 0x24, 0x8d, 0x1a, 0xa7, 0x48, 0x48, 0xd5, 0xd3, 0xac, 0x0c, 0x0b, 0x84, 0xb5, + 0xe2, 0x9c, 0xbe, 0xb9, 0x35, 0x99, 0x9d, 0x17, 0xb1, 0x57, 0x78, 0x15, 0x85, 0x08, 0x6e, 0x67, 0x13, 0x89, 0x0f, + 0x63, 0xcb, 0x3a, 0x59, 0xc8, 0xd2, 0xb7, 0x6e, 0xad, 0x4b, 0xc0, 0x0f, 0xde, 0xea, 0xb7, 0xfb, 0xf1, 0x38, 0xb4, + 0x30, 0xd6, 0x47, 0xb8, 0xf8, 0xa8, 0x17, 0x2c, 0xad, 0x7c, 0x89, 0x08, 0x4a, 0x9b, 0xa5, 0xd7, 0xbf, 0x60, 0xb1, + 0x29, 0x2f, 0x57, 0x2c, 0x34, 0x36, 0x74, 0x33, 0x0d, 0xd5, 0x32, 0x31, 0x27, 0x15, 0x55, 0x31, 0xc7, 0x00, 0x3d, + 0xee, 0x20, 0x73, 0xcb, 0x22, 0x6b, 0xd2, 0xc3, 0x59, 0x09, 0xcc, 0xd7, 0x60, 0xe7, 0x38, 0x03, 0xea, 0xd8, 0xa4, + 0xea, 0x17, 0x0b, 0xa0, 0x24, 0x6e, 0xe0, 0x5b, 0x21, 0x77, 0xa1, 0xca, 0x1e, 0x29, 0xa4, 0xb0, 0x0e, 0x2c, 0xe1, + 0xac, 0x60, 0xc5, 0xd8, 0x3e, 0x6c, 0xe6, 0x8f, 0x51, 0x6f, 0x01, 0xd3, 0x43, 0x08, 0xf3, 0xdd, 0x1d, 0xb8, 0x11, + 0x1d, 0xad, 0xc9, 0xe4, 0x1e, 0x27, 0xc8, 0xa2, 0x9f, 0xfb, 0x25, 0x31, 0x14, 0x4f, 0xc8, 0xcb, 0x51, 0x33, 0x16, + 0xb5, 0x60, 0x5a, 0xa6, 0xcd, 0x2d, 0xdf, 0x7d, 0x6d, 0x23, 0xaa, 0x47, 0xc4, 0xa5, 0x42, 0x48, 0x1d, 0x14, 0xe8, + 0x0e, 0x73, 0xa9, 0xeb, 0xc9, 0xb3, 0x45, 0xf1, 0x2c, 0x9b, 0xae, 0x12, 0xfc, 0xe9, 0xe3, 0x0d, 0xb5, 0xbd, 0x09, + 0xa8, 0xf4, 0x5e, 0x77, 0x9c, 0x93, 0xde, 0x51, 0x89, 0x88, 0x26, 0x19, 0x7f, 0xfb, 0xc8, 0xbc, 0x05, 0x91, 0x58, + 0xeb, 0xe1, 0xd2, 0xeb, 0xb7, 0xaf, 0x51, 0xb0, 0x6a, 0x22, 0x9c, 0xbd, 0xa5, 0x49, 0x1c, 0xbc, 0x14, 0x21, 0x19, + 0x8a, 0x60, 0xe4, 0xa3, 0x82, 0xd8, 0x8a, 0xad, 0x12, 0x75, 0xb5, 0x86, 0x40, 0xc4, 0x39, 0xd8, 0x20, 0xb3, 0x8c, + 0xce, 0x99, 0xd7, 0xbe, 0x3c, 0x44, 0xf1, 0xd2, 0x14, 0xf5, 0xbf, 0x5a, 0x16, 0x7e, 0xf4, 0x70, 0xe0, 0x75, 0x64, + 0xe5, 0xac, 0x77, 0xbd, 0x54, 0x6e, 0xcb, 0x3a, 0x6e, 0xad, 0x7a, 0x4f, 0x9e, 0x20, 0xa7, 0xd1, 0xa6, 0x97, 0xe2, + 0xd6, 0x21, 0xa9, 0x31, 0xbc, 0x56, 0xb5, 0xa8, 0x8f, 0x0b, 0x77, 0xd8, 0x8b, 0x5a, 0xa9, 0x77, 0x30, 0x11, 0x5d, + 0xf7, 0xed, 0x9f, 0x88, 0x6a, 0xc8, 0x98, 0x8e, 0x35, 0xe4, 0x0e, 0x6c, 0xc1, 0xf4, 0x54, 0xd2, 0x77, 0x02, 0xf1, + 0xf8, 0x48, 0xb2, 0xab, 0xff, 0x94, 0xd1, 0xfd, 0x85, 0x8c, 0x81, 0x91, 0xd1, 0x1d, 0x61, 0x2d, 0xc2, 0xbd, 0x34, + 0xe8, 0x18, 0x23, 0x94, 0x4f, 0x89, 0x66, 0x66, 0xd9, 0x6d, 0x5e, 0x90, 0xd8, 0xe7, 0x5a, 0xcd, 0xde, 0x72, 0x9d, + 0x48, 0xd0, 0xa2, 0x04, 0xe2, 0xe5, 0x96, 0x19, 0x17, 0x80, 0xae, 0x8d, 0x9b, 0x14, 0x71, 0xb8, 0xb1, 0xd9, 0xdb, + 0x00, 0xa0, 0x7d, 0xfe, 0xfd, 0x4c, 0xe9, 0xe2, 0x76, 0x41, 0x09, 0x9b, 0x1f, 0x2c, 0x26, 0x8b, 0x5b, 0x19, 0x14, + 0x62, 0x23, 0x04, 0x0f, 0x64, 0x13, 0x8d, 0xdd, 0x7a, 0x8a, 0xd8, 0x3c, 0x5f, 0x20, 0x6d, 0x51, 0x78, 0x26, 0x67, + 0x93, 0xfd, 0x8b, 0x76, 0xb0, 0x81, 0xb1, 0x6e, 0x52, 0x94, 0xdf, 0x95, 0xa6, 0xa3, 0x8c, 0xda, 0xc7, 0x2f, 0x37, + 0x5c, 0x94, 0xa5, 0x26, 0x30, 0x9a, 0x46, 0xdd, 0xf2, 0xf7, 0x89, 0x13, 0x0c, 0x5d, 0x19, 0x01, 0xca, 0xb9, 0x94, + 0x09, 0x9f, 0xb3, 0x6f, 0x90, 0x16, 0x00, 0xf2, 0x9b, 0x1f, 0xb5, 0xe3, 0x63, 0x73, 0xbd, 0xfc, 0xd2, 0xb6, 0xa5, + 0x44, 0xf4, 0x5f, 0xda, 0x2a, 0xdb, 0xb1, 0x0f, 0x54, 0xf1, 0x30, 0x6a, 0x44, 0xcb, 0x9a, 0x0f, 0x59, 0xfb, 0x14, + 0x0f, 0x9b, 0x7b, 0x6f, 0x76, 0xa6, 0xc8, 0x86, 0xda, 0x25, 0xfb, 0xcb, 0x4b, 0x3a, 0x2f, 0xaf, 0xd6, 0x0c, 0x5e, + 0xed, 0x11, 0xea, 0x2a, 0x02, 0x05, 0x8f, 0xc1, 0x01, 0xbe, 0x36, 0xfb, 0x9e, 0x2d, 0x28, 0xf0, 0xcf, 0x8e, 0x9d, + 0xbf, 0x3c, 0x9f, 0x43, 0x02, 0x59, 0x9f, 0x35, 0x49, 0x04, 0x44, 0x24, 0x74, 0x3a, 0xdb, 0x1a, 0x82, 0x3c, 0x8c, + 0x2c, 0x1e, 0xb1, 0x59, 0xc6, 0x7f, 0xb1, 0x98, 0x8b, 0xcb, 0x7b, 0x36, 0xb9, 0x9f, 0x9b, 0xb7, 0xce, 0x00, 0xa9, + 0x6d, 0x9a, 0xc9, 0x48, 0x75, 0x64, 0x1a, 0x40, 0x05, 0xed, 0x85, 0x52, 0x4a, 0x46, 0xa9, 0x1c, 0x23, 0xb6, 0x6b, + 0x23, 0xe3, 0xe2, 0x64, 0x49, 0xc3, 0xb0, 0x24, 0xf8, 0x35, 0x11, 0x04, 0xbd, 0x54, 0x44, 0xf5, 0x70, 0x51, 0xca, + 0xdb, 0x21, 0x8f, 0x06, 0xd0, 0x52, 0xe3, 0x6d, 0x92, 0xa7, 0xdd, 0x8b, 0x73, 0x17, 0x59, 0x71, 0xf3, 0xa7, 0xc4, + 0x0f, 0x95, 0x63, 0x3c, 0x29, 0x90, 0x18, 0xe7, 0x5d, 0xb9, 0xf3, 0xa0, 0x0e, 0xc4, 0x1c, 0x13, 0x3c, 0xd2, 0xb3, + 0xaa, 0x3d, 0x98, 0x19, 0x68, 0x53, 0x1a, 0x4d, 0x15, 0xb5, 0x01, 0xe5, 0xff, 0x80, 0xbe, 0xca, 0xa7, 0xe5, 0x91, + 0x6b, 0x10, 0x86, 0xd2, 0x7a, 0x4b, 0xc3, 0x4b, 0x42, 0x68, 0x71, 0xae, 0x4c, 0x32, 0x08, 0xbc, 0xf1, 0xa1, 0xd7, + 0x35, 0x7e, 0x10, 0x25, 0x40, 0x73, 0xe6, 0x27, 0x1f, 0x3e, 0x9e, 0x03, 0x14, 0xce, 0x5a, 0x32, 0xfa, 0xb3, 0xab, + 0x09, 0x4b, 0xba, 0x5d, 0x34, 0xbb, 0x11, 0xca, 0x57, 0x29, 0x58, 0x5a, 0x58, 0x8a, 0xde, 0xa2, 0x3c, 0x30, 0x6c, + 0xb7, 0xb2, 0x7d, 0xfb, 0x5f, 0x1e, 0xde, 0x2b, 0x74, 0x91, 0xb0, 0x1d, 0xe2, 0xa7, 0xa8, 0xe9, 0x2f, 0x3e, 0x9c, + 0x9e, 0x8c, 0x61, 0xbb, 0x2b, 0x61, 0xee, 0x30, 0xcf, 0xb1, 0xbf, 0x74, 0xe4, 0x86, 0xb6, 0x12, 0x31, 0xf9, 0x5a, + 0x36, 0x61, 0x11, 0x07, 0x0c, 0x64, 0xae, 0x06, 0xb9, 0x83, 0x23, 0x04, 0xa6, 0xd6, 0x7c, 0xf2, 0xff, 0x54, 0x2d, + 0x1e, 0x9f, 0x2d, 0x8b, 0x4a, 0x82, 0x7c, 0x2b, 0xed, 0xf3, 0xd8, 0x87, 0xa4, 0x1d, 0xd8, 0xf7, 0x08, 0x16, 0xbd, + 0xdd, 0x61, 0x51, 0x68, 0xa1, 0x83, 0xb8, 0xa4, 0xce, 0xa7, 0xf0, 0xea, 0xe5, 0x32, 0x85, 0xd0, 0x29, 0x0b, 0x3c, + 0x5f, 0x45, 0x38, 0xa6, 0xf7, 0xc7, 0x03, 0x95, 0x05, 0xa5, 0x5c, 0x4e, 0xf0, 0x29, 0x6f, 0xea, 0x70, 0x06, 0xd4, + 0x90, 0xf6, 0xa9, 0x70, 0xc5, 0x3f, 0x4a, 0x59, 0x17, 0x3a, 0xb3, 0x90, 0xaa, 0x30, 0xd9, 0x91, 0xf0, 0xbf, 0x54, + 0xcc, 0x90, 0xe1, 0x85, 0x50, 0xa5, 0x0d, 0x7c, 0x6d, 0x8b, 0xae, 0x94, 0x17, 0x6d, 0x0b, 0x7d, 0x2c, 0x76, 0x65, + 0x4e, 0x00, 0xba, 0x01, 0x5a, 0x7b, 0xed, 0x82, 0xbb, 0x1b, 0xee, 0x65, 0x9f, 0x15, 0xf7, 0x6e, 0xda, 0x00, 0x07, + 0x5f, 0x20, 0xa7, 0xbe, 0x7f, 0x45, 0x71, 0xfe, 0x69, 0x2b, 0x1e, 0x2d, 0xc4, 0x94, 0x80, 0x09, 0x24, 0xe4, 0x1b, + 0x3e, 0xb6, 0x66, 0xc4, 0x3e, 0x7e, 0x08, 0x37, 0x4a, 0x09, 0x2b, 0x8d, 0x3c, 0x38, 0xca, 0xed, 0x37, 0x55, 0x86, + 0xe4, 0xb6, 0x9c, 0x83, 0xc2, 0x10, 0x0b, 0x07, 0xdc, 0x65, 0xae, 0x6c, 0x7f, 0xbc, 0x4a, 0x8f, 0xc2, 0x9e, 0xb8, + 0x50, 0xb1, 0x18, 0x6a, 0x64, 0xc4, 0x2b, 0x1e, 0xaa, 0xb3, 0xd2, 0xc4, 0x00, 0x19, 0x61, 0x80, 0x8e, 0x29, 0x6d, + 0x84, 0x40, 0x09, 0x01, 0x5b, 0x7e, 0xa8, 0xa3, 0x42, 0x13, 0xa1, 0x08, 0xa1, 0x25, 0xd2, 0x1c, 0x1d, 0x64, 0x65, + 0x86, 0xa4, 0xd2, 0x63, 0x76, 0x4c, 0x07, 0x96, 0x05, 0x58, 0x52, 0x29, 0x0a, 0x20, 0x9f, 0x8c, 0x51, 0xab, 0x88, + 0x50, 0xe2, 0xae, 0xbc, 0x4c, 0x1a, 0x0e, 0x58, 0xc3, 0x5c, 0x34, 0x17, 0x4b, 0xd6, 0x75, 0x38, 0x94, 0x21, 0x4d, + 0xae, 0x5a, 0x05, 0x79, 0xa7, 0x3f, 0x4f, 0x63, 0xce, 0x57, 0x04, 0x42, 0x9b, 0xfb, 0x91, 0xcb, 0x05, 0xc2, 0x8f, + 0x74, 0x6c, 0x8c, 0x91, 0x91, 0xb4, 0x76, 0x20, 0x75, 0x51, 0x22, 0x24, 0xc4, 0x95, 0x74, 0x41, 0x73, 0x3e, 0x14, + 0x22, 0x3e, 0x3b, 0x61, 0xae, 0x0f, 0x12, 0xb3, 0x44, 0xe5, 0xdf, 0x37, 0xcb, 0x61, 0xf5, 0x42, 0xf0, 0xb0, 0xd8, + 0xae, 0xaa, 0x1c, 0x28, 0x24, 0x12, 0xd6, 0xa8, 0x13, 0xe6, 0xce, 0x1b, 0xcb, 0xdf, 0x14, 0xc1, 0x9e, 0x27, 0x64, + 0x26, 0x18, 0xa5, 0x57, 0x51, 0xae, 0x54, 0xef, 0x94, 0x39, 0x8c, 0xdc, 0xf0, 0xee, 0xa6, 0xf8, 0xc1, 0x81, 0xbc, + 0x67, 0x53, 0x7a, 0xc4, 0xdb, 0xfd, 0x50, 0x4b, 0x9c, 0x53, 0x24, 0x39, 0x41, 0x29, 0xe8, 0xfe, 0xc3, 0x6b, 0x47, + 0x25, 0x31, 0xfe, 0xd0, 0xa2, 0xf4, 0x5b, 0x8b, 0xa7, 0xb9, 0x96, 0x33, 0x6d, 0xd2, 0xcc, 0x9c, 0x6f, 0x46, 0x15, + 0x9b, 0x2b, 0x63, 0x68, 0x5d, 0x70, 0x20, 0x00, 0x37, 0x83, 0x75, 0x2a, 0xad, 0xcf, 0xf5, 0x07, 0x08, 0x7d, 0xe3, + 0x3e, 0x28, 0xb3, 0x1d, 0x3c, 0x1a, 0x63, 0xc8, 0xeb, 0x67, 0x57, 0x75, 0xd0, 0x65, 0x44, 0x82, 0x00, 0x16, 0x7a, + 0xc8, 0xe1, 0x95, 0xba, 0x9c, 0xd9, 0xca, 0xec, 0xd1, 0xe6, 0xb5, 0x1c, 0x6f, 0x1d, 0x69, 0x38, 0x2e, 0x8e, 0x67, + 0x1f, 0x2c, 0x9d, 0x47, 0xe8, 0x48, 0xca, 0x8d, 0xf7, 0x4a, 0x20, 0xdf, 0x10, 0x19, 0xa8, 0xe7, 0xa2, 0x02, 0xb0, + 0x2b, 0x8b, 0xaa, 0xe4, 0x75, 0x78, 0xe8, 0xf9, 0x38, 0x32, 0x8f, 0x18, 0xe3, 0x10, 0x55, 0x46, 0x1e, 0x9d, 0xdc, + 0x2e, 0x2d, 0x32, 0x6a, 0x2e, 0x98, 0x5a, 0xcd, 0xbb, 0xea, 0x94, 0x07, 0xb2, 0xc9, 0xd7, 0x2b, 0x2d, 0xb4, 0x1e, + 0x89, 0x15, 0xdd, 0xac, 0x8a, 0x7a, 0x58, 0x20, 0x62, 0xbd, 0xff, 0x04, 0x91, 0x47, 0x2c, 0x1f, 0x64, 0xd4, 0x22, + 0x6d, 0xae, 0xc4, 0x4a, 0x29, 0x60, 0x76, 0x81, 0x42, 0x2b, 0xef, 0x10, 0x5c, 0xf9, 0x4d, 0x85, 0x44, 0xda, 0xc5, + 0x5d, 0x07, 0xea, 0x11, 0xbf, 0x35, 0xb2, 0x59, 0x1f, 0xa8, 0xe5, 0x7c, 0x2b, 0x2a, 0x1a, 0x22, 0x23, 0xd2, 0xd1, + 0x6f, 0x38, 0x01, 0xc3, 0x82, 0x0c, 0xe9, 0xf4, 0x3c, 0xf5, 0x58, 0xa0, 0xc5, 0x50, 0xe5, 0x54, 0x8c, 0x65, 0x52, + 0xdd, 0x0a, 0x96, 0x29, 0xb3, 0x50, 0x12, 0x5d, 0x41, 0xcb, 0xec, 0x35, 0xd8, 0x7c, 0xcf, 0x6a, 0x5b, 0x64, 0x44, + 0xc2, 0x35, 0xc2, 0x1f, 0x86, 0x31, 0x00, 0xaf, 0x12, 0xa5, 0xf3, 0xc0, 0x68, 0xc5, 0x24, 0xe6, 0x71, 0x0a, 0xaf, + 0x9b, 0x2a, 0x79, 0x81, 0x5b, 0xf3, 0xd4, 0xd4, 0x58, 0x7e, 0xff, 0xfa, 0xfb, 0x41, 0x53, 0x65, 0xad, 0x40, 0x7e, + 0xb2, 0x6e, 0xfd, 0xfb, 0x2e, 0xf7, 0x20, 0x6f, 0xd3, 0xfb, 0x7e, 0x1c, 0xf2, 0x0d, 0x04, 0x82, 0x51, 0x0a, 0xd3, + 0xc5, 0xfa, 0xb4, 0xc2, 0xe8, 0x7a, 0x49, 0xbb, 0x32, 0x7d, 0x40, 0xc2, 0xfb, 0x7a, 0xfb, 0x19, 0xa1, 0xcc, 0x12, + 0xfb, 0x50, 0x10, 0xc5, 0x4a, 0x94, 0x47, 0xe6, 0x67, 0x73, 0x6f, 0x45, 0x5c, 0x30, 0x53, 0xfd, 0x62, 0xf2, 0x30, + 0x24, 0x1c, 0x98, 0x99, 0x08, 0x07, 0xd6, 0xb4, 0xf0, 0xec, 0x6a, 0xc1, 0x9f, 0x96, 0x12, 0xe0, 0x11, 0xeb, 0x2a, + 0xfd, 0xbd, 0x8c, 0xa5, 0x18, 0xb1, 0xbd, 0x9d, 0xa1, 0xf4, 0x9c, 0x59, 0x07, 0x1d, 0x5e, 0x89, 0x82, 0x2d, 0xce, + 0xf4, 0x03, 0x33, 0x39, 0x8a, 0x0b, 0xaa, 0x25, 0xfc, 0xed, 0xad, 0xe2, 0xbe, 0x54, 0x3c, 0xa7, 0xb0, 0xef, 0x49, + 0xbe, 0xf8, 0x20, 0xed, 0xbd, 0xa8, 0x82, 0x56, 0x38, 0xb5, 0xc1, 0x0d, 0xf1, 0xd1, 0x9d, 0xf2, 0x50, 0x29, 0x42, + 0x08, 0xa3, 0xe8, 0x17, 0xf5, 0x08, 0x79, 0x81, 0xd7, 0xcb, 0xb7, 0x75, 0x7d, 0x48, 0x98, 0x82, 0xb8, 0xbe, 0xdb, + 0xc2, 0x19, 0x7d, 0x6a, 0x46, 0xcd, 0xdd, 0x71, 0xf5, 0x17, 0xea, 0x16, 0xef, 0x40, 0xb4, 0xc3, 0x74, 0x0f, 0x8f, + 0xeb, 0xfa, 0x68, 0x72, 0xd4, 0x85, 0x26, 0x6e, 0x35, 0xdb, 0xaf, 0xb4, 0x64, 0x9e, 0x06, 0x30, 0x68, 0x8c, 0xfa, + 0x7d, 0xc9, 0x1e, 0x8d, 0xef, 0x78, 0x4b, 0x64, 0x43, 0xb8, 0x0d, 0xe8, 0x70, 0x70, 0xa1, 0xa7, 0xfe, 0x46, 0xf6, + 0x6b, 0xb9, 0x04, 0xc7, 0x4b, 0xf1, 0x63, 0xdd, 0xf0, 0x47, 0x99, 0xd0, 0xec, 0x24, 0xa6, 0xc1, 0xfd, 0xb6, 0xb8, + 0xb2, 0xc2, 0x65, 0x12, 0x0a, 0x0b, 0x68, 0x40, 0x60, 0x01, 0x45, 0xd0, 0xe7, 0x30, 0x49, 0x94, 0x3d, 0x9c, 0xb3, + 0xdd, 0xdb, 0x7b, 0x71, 0x4c, 0x24, 0x9d, 0xd2, 0xe4, 0xe8, 0x07, 0x5e, 0x4c, 0x67, 0x51, 0x93, 0x68, 0xa4, 0x5f, + 0x31, 0x27, 0x2f, 0x1b, 0xe9, 0xc8, 0x00, 0x31, 0x67, 0x15, 0xa2, 0x0b, 0x69, 0xdf, 0x3f, 0x23, 0x32, 0xa0, 0x62, + 0x50, 0x37, 0xc3, 0x0e, 0xb1, 0x29, 0xe7, 0xb5, 0xeb, 0x07, 0x46, 0x4b, 0x7c, 0xb1, 0x3c, 0xca, 0xb0, 0xfc, 0x31, + 0x1f, 0xa3, 0xef, 0xbc, 0x95, 0x65, 0xe8, 0xc2, 0x72, 0x7e, 0x17, 0x93, 0xa5, 0x3a, 0x5c, 0x3d, 0x09, 0xe9, 0x7e, + 0x6a, 0xcd, 0x4b, 0xff, 0xb3, 0xe9, 0x82, 0xb4, 0xcf, 0x3c, 0xa4, 0x7e, 0x92, 0xc7, 0x68, 0xf7, 0x55, 0x2f, 0xac, + 0xd3, 0x85, 0x11, 0x66, 0xfa, 0xa8, 0x9a, 0x85, 0x0f, 0x55, 0x66, 0xcb, 0xc6, 0xd3, 0x52, 0xcc, 0x1f, 0x1d, 0xc1, + 0x1a, 0x82, 0x26, 0x24, 0x1b, 0xf7, 0x25, 0xf1, 0x83, 0xea, 0x82, 0xf1, 0x60, 0x87, 0xe5, 0xf5, 0xfc, 0x66, 0xd7, + 0xbe, 0xd3, 0xf2, 0xa9, 0xe0, 0x1f, 0x3c, 0xc4, 0xca, 0x9f, 0x0a, 0x87, 0x25, 0x2e, 0xbe, 0xb0, 0x52, 0x67, 0xbd, + 0x28, 0xa4, 0xad, 0xd5, 0xac, 0xa8, 0x65, 0x37, 0x64, 0xe5, 0x55, 0xde, 0xf2, 0x52, 0x0a, 0x7e, 0x4d, 0x45, 0x4e, + 0x72, 0x9d, 0x72, 0x31, 0x18, 0x78, 0x33, 0x27, 0xfd, 0x7a, 0x42, 0x1b, 0xb9, 0x81, 0x71, 0xfa, 0x3a, 0xb6, 0x2e, + 0x90, 0x04, 0x76, 0xf5, 0x91, 0x0b, 0x4f, 0x20, 0x91, 0xd5, 0xc7, 0x73, 0x36, 0xd6, 0xcd, 0x4e, 0xbe, 0x97, 0x77, + 0x19, 0x47, 0xf0, 0x4c, 0x21, 0xde, 0x9c, 0xd7, 0x06, 0xfc, 0x23, 0xef, 0x70, 0x6e, 0xe5, 0x7d, 0x50, 0x8d, 0xa1, + 0x35, 0x6c, 0x69, 0xe0, 0xab, 0x0b, 0x8c, 0x61, 0x02, 0xd5, 0x24, 0x08, 0x8e, 0xd6, 0x62, 0xbb, 0x20, 0x38, 0x96, + 0x51, 0x78, 0xb1, 0x3a, 0xe5, 0x17, 0x66, 0x53, 0x11, 0x45, 0x26, 0xfc, 0xc2, 0x0e, 0xd5, 0x66, 0x84, 0x43, 0xfc, + 0x58, 0x11, 0xe5, 0x43, 0x8d, 0x07, 0x20, 0x0e, 0x60, 0x7a, 0xd3, 0x88, 0x68, 0x7f, 0x8d, 0x1a, 0x05, 0x35, 0x3c, + 0x73, 0x97, 0xde, 0x59, 0x23, 0x2e, 0xeb, 0x6f, 0x0a, 0xcc, 0x2b, 0xb1, 0x6c, 0xaf, 0xac, 0xcb, 0x92, 0xf3, 0x3d, + 0x68, 0xe2, 0xb8, 0xd3, 0xce, 0x92, 0xb3, 0xe4, 0x00, 0x6d, 0xbb, 0xa7, 0xcd, 0x7c, 0x42, 0x72, 0x71, 0xb5, 0xeb, + 0x14, 0xa4, 0x32, 0xaf, 0x62, 0x23, 0x95, 0xe2, 0xbc, 0x73, 0x09, 0x38, 0xdc, 0x4f, 0xf1, 0xff, 0x55, 0xa2, 0xbe, + 0x9b, 0x5f, 0x10, 0xc6, 0x76, 0x52, 0xbf, 0x1c, 0x36, 0x6d, 0x61, 0x76, 0x70, 0xdd, 0xe2, 0xa6, 0xdd, 0x10, 0x55, + 0xd9, 0x5b, 0x6b, 0xbe, 0x34, 0x0f, 0x79, 0x61, 0x39, 0xb3, 0xd0, 0xea, 0xf3, 0xb8, 0x65, 0x44, 0xf9, 0xd4, 0x85, + 0xc3, 0xb1, 0xd0, 0x90, 0xcb, 0x9b, 0x43, 0x5d, 0xe4, 0xc7, 0xa4, 0xed, 0x01, 0x03, 0x49, 0x3d, 0xd1, 0xc6, 0x87, + 0x6e, 0xe6, 0xb6, 0x3b, 0x03, 0xe9, 0x7a, 0x39, 0x0d, 0x25, 0xb3, 0x18, 0xb8, 0x70, 0x34, 0xe6, 0xa9, 0x43, 0xa7, + 0x5d, 0xb1, 0x11, 0xd6, 0x1d, 0x0c, 0x57, 0x62, 0x54, 0x75, 0x18, 0xbb, 0xa6, 0xd5, 0x39, 0x56, 0xaa, 0xc7, 0xde, + 0x67, 0x1d, 0x91, 0xe0, 0x09, 0x05, 0x47, 0x1e, 0x78, 0x86, 0xcf, 0xea, 0xa0, 0xc3, 0xa3, 0x8e, 0xc0, 0xa1, 0xba, + 0x40, 0x5f, 0x1d, 0xc6, 0x40, 0x39, 0x82, 0x50, 0x44, 0xbe, 0x7b, 0xa0, 0x0e, 0xe1, 0x6b, 0x7e, 0x82, 0x99, 0x52, + 0x7a, 0x3e, 0x66, 0x7b, 0xf0, 0xe5, 0x80, 0xfb, 0xfd, 0x17, 0x9e, 0xd2, 0x35, 0x8c, 0xc3, 0x0f, 0xbf, 0xd5, 0x62, + 0xf9, 0xfd, 0x00, 0xf3, 0xed, 0x20, 0xd5, 0x25, 0x1c, 0xe5, 0x2a, 0xc0, 0x1f, 0x6d, 0x19, 0x77, 0x0d, 0x86, 0xf5, + 0x11, 0x14, 0x11, 0x1e, 0x71, 0x30, 0xdc, 0x2c, 0x05, 0x80, 0xe2, 0x3c, 0xac, 0x80, 0xc8, 0x42, 0x34, 0x3f, 0x2f, + 0x97, 0x58, 0x57, 0x65, 0x68, 0x4b, 0x4b, 0x36, 0x8f, 0x13, 0x31, 0x6c, 0x26, 0x49, 0x25, 0x44, 0xaf, 0x88, 0x18, + 0x11, 0x33, 0x43, 0xeb, 0xa5, 0xfd, 0x9e, 0xba, 0x2a, 0x08, 0xa3, 0xd6, 0x6d, 0xb8, 0xd7, 0xf5, 0x55, 0x2f, 0x6a, + 0xb5, 0x5f, 0x6b, 0x65, 0x00, 0xfb, 0x96, 0x7c, 0x80, 0x22, 0x09, 0x5b, 0xda, 0xf1, 0x6f, 0x07, 0x72, 0xd1, 0x3f, + 0x84, 0xb0, 0x89, 0x4d, 0x90, 0x73, 0x78, 0xa9, 0x75, 0xf6, 0x36, 0x10, 0xc2, 0x24, 0xd6, 0x6a, 0x3d, 0x82, 0x17, + 0x4d, 0x00, 0xa9, 0xd0, 0x3e, 0x63, 0xf9, 0x88, 0x54, 0x9c, 0x3f, 0x1f, 0x5a, 0x36, 0xb7, 0x3f, 0xe5, 0x13, 0x2b, + 0x47, 0x9c, 0xad, 0x5f, 0x2c, 0x49, 0x56, 0xf0, 0x5d, 0x22, 0xc1, 0x37, 0x96, 0xa1, 0xfa, 0xb4, 0x0f, 0xa0, 0x49, + 0x21, 0xd0, 0xc1, 0xe5, 0x5d, 0x8d, 0x0c, 0xb5, 0x58, 0x46, 0x75, 0xb4, 0xc7, 0x22, 0xd3, 0x17, 0x2f, 0xca, 0xea, + 0xb3, 0x08, 0x0d, 0x27, 0x16, 0xc3, 0x28, 0x95, 0x5e, 0x6c, 0xd1, 0xc6, 0x9f, 0xf4, 0x3f, 0xe6, 0x06, 0xa5, 0xea, + 0x78, 0x85, 0x5b, 0x35, 0x54, 0x87, 0xae, 0xd0, 0x1b, 0xd9, 0xca, 0xb1, 0x7f, 0x79, 0x67, 0x51, 0xc7, 0x9a, 0x36, + 0x08, 0x5e, 0x07, 0xfd, 0xcd, 0x14, 0x9c, 0xec, 0xfc, 0x9a, 0xe8, 0x14, 0x06, 0x08, 0x0a, 0x66, 0x08, 0xf6, 0x19, + 0xcd, 0xa6, 0xa5, 0x74, 0x67, 0xcd, 0x89, 0x3a, 0x36, 0xce, 0x8c, 0xb2, 0x76, 0x29, 0x9e, 0xda, 0x78, 0xeb, 0x05, + 0x3d, 0xf8, 0x5a, 0xbc, 0x58, 0x71, 0x52, 0x5b, 0x46, 0xc4, 0x0b, 0x8e, 0x87, 0xeb, 0x98, 0x43, 0xb5, 0x71, 0x6b, + 0xc1, 0x84, 0x09, 0xad, 0x86, 0xcd, 0xce, 0x5a, 0x4e, 0xf9, 0x5a, 0x1e, 0x27, 0x95, 0x4b, 0x7f, 0xac, 0x90, 0x00, + 0x08, 0x1d, 0x2d, 0x22, 0x09, 0x7c, 0x56, 0x18, 0xc6, 0x1c, 0x0f, 0x92, 0x25, 0xf3, 0x63, 0x25, 0x8f, 0x00, 0x33, + 0x31, 0x5c, 0xbc, 0x0d, 0xbd, 0x7a, 0x82, 0x2e, 0xd9, 0xc1, 0x46, 0xdd, 0x20, 0x08, 0x12, 0xec, 0x00, 0x7f, 0xe1, + 0x7d, 0x17, 0x26, 0xe7, 0xfc, 0x66, 0xeb, 0xf0, 0xff, 0x04, 0x4f, 0xe6, 0x61, 0x6d, 0xbb, 0x1f, 0x6c, 0xd4, 0x97, + 0xff, 0x3f, 0xd5, 0x35, 0xb4, 0x0e, 0x7c, 0xf8, 0xc0, 0x85, 0xc7, 0xab, 0x55, 0x3d, 0x5a, 0x6d, 0xed, 0x80, 0x21, + 0x99, 0x38, 0x51, 0x56, 0xec, 0xa8, 0xde, 0xa1, 0xee, 0x1f, 0x1c, 0xee, 0x8f, 0x1c, 0xa0, 0xfe, 0xc1, 0xc4, 0xdb, + 0x48, 0x23, 0xdd, 0xfd, 0x22, 0x64, 0x62, 0x3d, 0xea, 0x20, 0x57, 0x29, 0xfd, 0xfc, 0xdc, 0xb3, 0x75, 0x84, 0xa5, + 0xab, 0x74, 0x70, 0x7f, 0xd1, 0x59, 0x7b, 0xb0, 0xc1, 0xe5, 0x8b, 0xec, 0x56, 0xad, 0x7d, 0x52, 0xba, 0xca, 0x1a, + 0x6f, 0x02, 0x10, 0x60, 0xab, 0xcc, 0x64, 0xe5, 0xe9, 0x9e, 0x52, 0xc2, 0xbb, 0xd6, 0xe6, 0xec, 0xaf, 0xd7, 0xc1, + 0x29, 0x63, 0x6d, 0x77, 0x71, 0x6b, 0xbd, 0x00, 0x41, 0x39, 0xf7, 0x1a, 0xca, 0x29, 0x84, 0x78, 0x49, 0x0d, 0x2e, + 0x87, 0xb1, 0xf1, 0x10, 0x39, 0x72, 0x88, 0x6e, 0x23, 0x82, 0x75, 0x95, 0xb6, 0x2a, 0x8e, 0xbd, 0x96, 0x27, 0x66, + 0x0b, 0xe3, 0x26, 0xa6, 0x14, 0x16, 0x15, 0x18, 0x79, 0x1a, 0x76, 0x38, 0xdb, 0x11, 0x7a, 0x34, 0x6b, 0x5b, 0x90, + 0x26, 0xec, 0x97, 0xfa, 0x7d, 0x58, 0x82, 0xb1, 0xf9, 0xaa, 0x85, 0xd0, 0x4b, 0xe0, 0x34, 0x79, 0x6f, 0xc8, 0xaf, + 0x2e, 0xf4, 0x8c, 0x70, 0x59, 0x24, 0xf7, 0x58, 0x08, 0x42, 0x65, 0x6b, 0xbb, 0x4c, 0xba, 0x99, 0x63, 0x88, 0xe7, + 0x19, 0x63, 0x68, 0xe1, 0x05, 0x81, 0x4c, 0x13, 0x94, 0x32, 0xfc, 0x16, 0xe1, 0x71, 0x86, 0xb3, 0x43, 0x6e, 0xa6, + 0xc3, 0x48, 0xb8, 0xc2, 0xed, 0x04, 0x99, 0xa5, 0xf9, 0x44, 0xe9, 0xc7, 0x54, 0x75, 0xd8, 0x67, 0x26, 0x21, 0x6a, + 0x8f, 0x58, 0x8f, 0xa7, 0x34, 0x6c, 0x67, 0xfc, 0x9c, 0xe7, 0x52, 0x6c, 0x20, 0xee, 0xae, 0xdc, 0x25, 0xd7, 0xc4, + 0x29, 0xb1, 0xb4, 0xca, 0x38, 0xa4, 0xd0, 0x8e, 0x85, 0xb6, 0xf1, 0x90, 0x1e, 0x44, 0xda, 0xae, 0x0f, 0x49, 0x95, + 0x4e, 0x1e, 0xf3, 0x23, 0x62, 0xc8, 0x4c, 0xbf, 0xc0, 0xda, 0xfe, 0x72, 0xf3, 0x21, 0x04, 0x2a, 0x12, 0x3b, 0x77, + 0x04, 0x3e, 0x0d, 0xb0, 0x79, 0x29, 0x2d, 0x85, 0x56, 0x85, 0xce, 0x55, 0x5b, 0xbd, 0x34, 0x94, 0x0d, 0x51, 0x04, + 0x92, 0x59, 0x96, 0xf0, 0x51, 0xd6, 0x30, 0xc8, 0xa9, 0xdf, 0x35, 0x20, 0xdb, 0x1e, 0x06, 0xeb, 0x7b, 0xaa, 0x2c, + 0xf5, 0xfd, 0xd9, 0x4f, 0x9f, 0xf0, 0xb1, 0x0e, 0x61, 0x95, 0x01, 0xd7, 0x6c, 0x5e, 0xe3, 0xa1, 0x77, 0x9f, 0xcc, + 0xa0, 0x7e, 0xc2, 0x91, 0xbe, 0xc1, 0xd7, 0xc8, 0xfd, 0xcc, 0xcb, 0xf2, 0xca, 0x7b, 0x49, 0x9e, 0x6d, 0x53, 0xea, + 0x27, 0x2d, 0x56, 0xbc, 0x81, 0x3f, 0x75, 0x7e, 0x68, 0xc5, 0xf7, 0x65, 0x75, 0x67, 0xdb, 0x99, 0x33, 0x2c, 0x33, + 0xd8, 0x83, 0x19, 0xba, 0xeb, 0xa3, 0x56, 0x2a, 0xa4, 0x5e, 0xe9, 0xcb, 0x07, 0xef, 0x53, 0xef, 0x53, 0x26, 0x4d, + 0x74, 0x13, 0x98, 0xa2, 0xd2, 0xd7, 0x21, 0xca, 0x0e, 0x69, 0x62, 0xda, 0xa1, 0x4a, 0x14, 0x1d, 0x5e, 0x98, 0x65, + 0x29, 0xc0, 0xf0, 0x8d, 0xe5, 0x53, 0x86, 0x6b, 0x25, 0xa9, 0x20, 0xd4, 0x1a, 0xc4, 0x67, 0x93, 0xe9, 0x7d, 0x99, + 0x1b, 0x0a, 0x58, 0xb0, 0xf8, 0x3a, 0x86, 0x5d, 0xa4, 0x7f, 0x38, 0x7e, 0x27, 0xc1, 0x39, 0xe1, 0x70, 0x64, 0x03, + 0x01, 0x94, 0x69, 0xbb, 0xe0, 0xe2, 0x7e, 0x83, 0x3d, 0xcc, 0xd2, 0x7f, 0x42, 0x6a, 0xc1, 0x69, 0xa0, 0x97, 0xe8, + 0xff, 0xba, 0x33, 0x7f, 0x2a, 0x5f, 0x2f, 0x2c, 0xe6, 0x44, 0xb8, 0xc5, 0xd9, 0x57, 0x96, 0x59, 0xe5, 0x8a, 0xfb, + 0x03, 0x23, 0x13, 0xad, 0x5d, 0x9f, 0x1f, 0xac, 0x56, 0xd4, 0x2a, 0xd4, 0xd0, 0x57, 0xee, 0x7f, 0xa6, 0x7b, 0xb9, + 0x67, 0xc6, 0x3c, 0x14, 0x73, 0x87, 0x75, 0xd1, 0xd0, 0xf8, 0x0c, 0xd1, 0x10, 0xa5, 0xc6, 0x6a, 0xc0, 0x66, 0x4c, + 0xea, 0xd7, 0x83, 0x08, 0x4b, 0xe9, 0x9c, 0x18, 0x55, 0x6a, 0x91, 0x41, 0x82, 0xc9, 0xf1, 0x5c, 0xda, 0x1c, 0x0a, + 0x44, 0xd0, 0xcc, 0x6b, 0x68, 0xf4, 0x35, 0x1e, 0x56, 0xb8, 0xd1, 0xcd, 0x1e, 0x31, 0x64, 0x04, 0x41, 0x65, 0xd9, + 0x18, 0xd9, 0x2e, 0x46, 0x51, 0x38, 0xf5, 0xb3, 0x43, 0x41, 0xf1, 0xcb, 0x99, 0x2f, 0x4d, 0x76, 0xdc, 0x3d, 0x1a, + 0x80, 0xa2, 0x58, 0x97, 0x78, 0xd9, 0x66, 0x22, 0x37, 0xb9, 0xc1, 0x94, 0x20, 0x88, 0x39, 0xfc, 0x09, 0xb2, 0xa4, + 0x88, 0xe9, 0x22, 0x6e, 0x2e, 0xcd, 0xc5, 0xa8, 0x4c, 0x76, 0xf5, 0xc0, 0x6d, 0x68, 0x54, 0xab, 0x89, 0x5e, 0x6b, + 0xdd, 0x0f, 0x0a, 0xd1, 0x09, 0x8b, 0x27, 0xf2, 0x8a, 0x85, 0x48, 0x82, 0x81, 0x00, 0x45, 0xdb, 0xc2, 0x28, 0x0a, + 0xbd, 0x16, 0xd3, 0xd9, 0x72, 0x7e, 0x2e, 0xd3, 0x50, 0x34, 0x3a, 0xe3, 0x96, 0x81, 0x55, 0x3f, 0x6d, 0x96, 0x1f, + 0x78, 0xfc, 0x4f, 0x62, 0xc2, 0xdb, 0x1e, 0x7a, 0x06, 0xe2, 0x53, 0x0f, 0x28, 0xd3, 0x5d, 0x02, 0x85, 0xe9, 0xb9, + 0x8b, 0x50, 0x22, 0x29, 0xea, 0xc6, 0x9c, 0x58, 0x72, 0x1f, 0x95, 0xf8, 0xbe, 0x1a, 0x1f, 0xc2, 0x11, 0xd5, 0x87, + 0xc4, 0x15, 0x05, 0x2c, 0xf2, 0xac, 0x64, 0xf3, 0x39, 0xcb, 0xb8, 0x0e, 0x8b, 0x35, 0x73, 0xce, 0x1b, 0x5e, 0x96, + 0xfa, 0xa0, 0x64, 0x04, 0xef, 0x07, 0x73, 0x08, 0x55, 0xae, 0xc8, 0x0c, 0xf9, 0x55, 0x89, 0xda, 0x0a, 0x58, 0xe3, + 0x0a, 0xc2, 0x6c, 0xed, 0x15, 0xaf, 0x6f, 0x8b, 0x95, 0xfe, 0x40, 0xae, 0x11, 0xf7, 0x70, 0x08, 0x00, 0x0c, 0xfb, + 0xdd, 0x09, 0x8a, 0x91, 0x0a, 0x17, 0xe6, 0x62, 0x68, 0x40, 0xc2, 0x36, 0x48, 0x99, 0xed, 0xc7, 0xf9, 0xf0, 0xee, + 0x9f, 0xd6, 0x9c, 0x1d, 0xac, 0x95, 0x70, 0xed, 0xe8, 0x2a, 0x13, 0xe4, 0xe5, 0x43, 0x94, 0x9d, 0xb9, 0x6d, 0xae, + 0x96, 0x05, 0x51, 0x69, 0x31, 0x9e, 0xad, 0xc4, 0xfd, 0x32, 0x85, 0xc7, 0xce, 0x22, 0xd8, 0x99, 0x97, 0xe0, 0x12, + 0x10, 0x7d, 0x90, 0xf1, 0x91, 0x0d, 0x12, 0xbd, 0xf2, 0x6c, 0xfc, 0x59, 0x75, 0xef, 0x51, 0x9b, 0x2a, 0x52, 0xbb, + 0x1e, 0xb8, 0x3b, 0x94, 0xa4, 0x82, 0x69, 0x77, 0x03, 0xd6, 0xcc, 0xeb, 0x89, 0xc9, 0x37, 0x0a, 0xe2, 0x06, 0x38, + 0xfb, 0x6e, 0x1c, 0x68, 0x1a, 0x58, 0x6f, 0x3e, 0xa2, 0x68, 0x10, 0x6a, 0x44, 0x9c, 0x9b, 0xf5, 0xfa, 0xa5, 0xdf, + 0x81, 0x00, 0xa4, 0x60, 0x56, 0x12, 0xbc, 0x77, 0xe5, 0xa4, 0x10, 0x84, 0xd8, 0x02, 0x88, 0xe9, 0x06, 0x12, 0xc7, + 0x11, 0xe5, 0x1a, 0xcf, 0xbe, 0x59, 0x7a, 0xf4, 0xa2, 0x23, 0x76, 0x7f, 0x09, 0xac, 0xe9, 0x65, 0x07, 0xdb, 0xb9, + 0x09, 0x49, 0x85, 0x32, 0xf4, 0xaa, 0x9e, 0xdd, 0xb0, 0xb9, 0x75, 0x2c, 0x0b, 0x3d, 0x7a, 0x08, 0x72, 0xc9, 0xbc, + 0xb7, 0xd5, 0x18, 0x08, 0xa5, 0x9b, 0x5f, 0x08, 0x14, 0x47, 0xeb, 0x5f, 0x68, 0x93, 0x0c, 0x6d, 0x9c, 0xdb, 0xb4, + 0xb3, 0x66, 0xb7, 0x29, 0xac, 0x5c, 0x72, 0x73, 0xbd, 0x38, 0xa6, 0xa8, 0xa7, 0xf2, 0xbd, 0xd6, 0xb2, 0x67, 0x63, + 0xa0, 0x86, 0xf6, 0xc8, 0x27, 0x85, 0xd0, 0x1b, 0xb6, 0x62, 0x69, 0x24, 0x93, 0xe6, 0xce, 0x3b, 0x27, 0xd4, 0xe6, + 0x61, 0x87, 0xc4, 0x09, 0x73, 0xeb, 0xbf, 0xcf, 0x23, 0x29, 0x8b, 0xf7, 0x29, 0x14, 0x6e, 0x86, 0xea, 0x86, 0xb1, + 0xe8, 0x38, 0x01, 0xb7, 0x95, 0xf5, 0xd3, 0x8c, 0x44, 0xac, 0x16, 0x16, 0xc6, 0x33, 0x80, 0xa9, 0x98, 0x22, 0x6e, + 0x55, 0x30, 0xd4, 0x20, 0x39, 0x57, 0x83, 0x60, 0xa6, 0xd7, 0x8c, 0x9d, 0x79, 0x99, 0xb7, 0xd0, 0xd6, 0xc6, 0x2c, + 0x2c, 0xd4, 0x6c, 0x4c, 0xcd, 0x93, 0x49, 0x01, 0x4b, 0x23, 0xe8, 0xf6, 0x98, 0x1e, 0xee, 0xae, 0x91, 0xef, 0x96, + 0x23, 0x67, 0x17, 0x83, 0xf9, 0xd8, 0xcb, 0xec, 0x71, 0xea, 0xc1, 0xcb, 0x04, 0x33, 0x42, 0x85, 0xad, 0xe2, 0x02, + 0xda, 0xb3, 0xa6, 0xff, 0xc0, 0x37, 0xf1, 0x31, 0x07, 0x37, 0x66, 0xec, 0xad, 0x59, 0xba, 0xe2, 0x3d, 0x1d, 0x23, + 0x64, 0x11, 0x23, 0xf2, 0x9c, 0x35, 0xc5, 0xdc, 0x4a, 0x15, 0xe3, 0x1e, 0x14, 0x82, 0xe5, 0x2b, 0x4c, 0x05, 0x10, + 0x0e, 0x66, 0x37, 0x1a, 0x1c, 0x62, 0x7d, 0xdc, 0xba, 0x5b, 0x20, 0x04, 0x06, 0x50, 0x5d, 0x9c, 0x73, 0x34, 0xd1, + 0x01, 0x90, 0xfc, 0x3e, 0x12, 0x00, 0x49, 0x60, 0x86, 0x22, 0x01, 0x46, 0xaf, 0x5a, 0xfa, 0x9a, 0x17, 0x6b, 0x8c, + 0x8c, 0xd8, 0x23, 0x08, 0xb6, 0x72, 0x8f, 0x2c, 0x90, 0x66, 0x73, 0xaf, 0x75, 0xc2, 0xb7, 0x67, 0x45, 0x25, 0x0e, + 0x2e, 0xbf, 0x2a, 0x23, 0xe9, 0x9f, 0x0c, 0x6a, 0xac, 0x63, 0xe5, 0x29, 0xfd, 0x98, 0xa9, 0xa3, 0x47, 0x77, 0x69, + 0x9a, 0x4e, 0xe6, 0xa0, 0xd8, 0x43, 0x36, 0x28, 0xab, 0x64, 0xec, 0xc4, 0x39, 0x74, 0x22, 0xa9, 0x7f, 0x1c, 0xbd, + 0xbc, 0x53, 0x8f, 0xa2, 0x34, 0xb7, 0xeb, 0x09, 0xb5, 0x72, 0xaa, 0xdd, 0x08, 0xbc, 0x49, 0x79, 0x26, 0x75, 0xc6, + 0x96, 0xfa, 0xa5, 0x42, 0x2a, 0x3b, 0x35, 0x26, 0xb1, 0x93, 0xf3, 0x32, 0xe7, 0xe8, 0x29, 0xbf, 0x10, 0xc6, 0x81, + 0xb1, 0x3f, 0x9d, 0xb6, 0xde, 0xaf, 0xd9, 0x19, 0xe2, 0xf1, 0x6a, 0xaa, 0xf6, 0x21, 0x5d, 0xab, 0x26, 0xa6, 0x40, + 0xd3, 0x9e, 0xa6, 0xff, 0xc9, 0x80, 0x3e, 0x0f, 0xc1, 0x9e, 0xe9, 0x27, 0x21, 0xd5, 0x0e, 0xa2, 0xfd, 0x41, 0x0b, + 0xaf, 0xf0, 0x35, 0x4a, 0xa8, 0xfe, 0xce, 0x09, 0xd0, 0xf1, 0xbd, 0x6e, 0x10, 0x5b, 0x92, 0xb8, 0x98, 0x8b, 0x54, + 0x76, 0x8e, 0x19, 0xd5, 0x40, 0x2e, 0x88, 0x14, 0xcf, 0x75, 0x1a, 0x95, 0x85, 0x2c, 0x79, 0x83, 0x1b, 0x3f, 0xfb, + 0x35, 0x53, 0x28, 0xfc, 0x6a, 0x38, 0x08, 0x58, 0x06, 0x90, 0x30, 0xef, 0x5e, 0x69, 0xce, 0x99, 0x9d, 0x8d, 0x18, + 0xb2, 0x00, 0x2e, 0x75, 0xec, 0x23, 0x74, 0x12, 0x00, 0x10, 0x1d, 0x13, 0x63, 0x20, 0xaf, 0x76, 0x54, 0xff, 0x03, + 0x1c, 0x7a, 0x27, 0xbd, 0x5a, 0x73, 0x37, 0x81, 0x28, 0x42, 0x40, 0x80, 0xc4, 0xde, 0x50, 0x10, 0x45, 0xcb, 0x41, + 0x24, 0x55, 0x62, 0x27, 0xb4, 0x15, 0x9a, 0x05, 0x37, 0xb2, 0x11, 0x69, 0x04, 0xd0, 0x2b, 0xb8, 0x10, 0x33, 0x02, + 0x65, 0x1e, 0x47, 0x1a, 0xbf, 0xa0, 0xc4, 0xcc, 0x4b, 0xc5, 0xe8, 0x73, 0x8a, 0x7a, 0xef, 0x41, 0x74, 0xcf, 0xcd, + 0xa3, 0xd6, 0xc7, 0x84, 0x10, 0x3d, 0x01, 0x6b, 0x28, 0xab, 0x9f, 0xa2, 0x0c, 0x30, 0x1a, 0xa0, 0x6c, 0xef, 0x70, + 0x1e, 0xb0, 0x7c, 0xa9, 0x79, 0x52, 0x0f, 0x1d, 0xf3, 0x88, 0x5c, 0x3a, 0x9f, 0xf7, 0xeb, 0xb8, 0x5e, 0xd4, 0x0e, + 0x2a, 0x04, 0x3c, 0x56, 0x2f, 0xd5, 0x8d, 0x20, 0x37, 0x14, 0xff, 0x45, 0xc5, 0xd4, 0x18, 0xf6, 0x95, 0x5f, 0x4c, + 0x27, 0x1d, 0x6a, 0x87, 0xf5, 0x2e, 0x72, 0x75, 0x2a, 0x4a, 0x00, 0x4e, 0xbb, 0x1d, 0xda, 0x39, 0xb3, 0xe3, 0x6f, + 0x77, 0xfd, 0x68, 0x95, 0x95, 0x6a, 0x51, 0xe7, 0x59, 0x43, 0x41, 0x79, 0x39, 0x1d, 0xff, 0x0b, 0x4f, 0xf6, 0xf2, + 0x64, 0x30, 0xa7, 0x16, 0x61, 0x9c, 0xba, 0xf3, 0xec, 0xfd, 0xc1, 0xdb, 0x61, 0x4b, 0x88, 0x9d, 0xea, 0xe6, 0xd7, + 0x7a, 0xe4, 0x8b, 0xa9, 0xdb, 0x7a, 0x82, 0x1b, 0x37, 0xb7, 0xce, 0xd8, 0xab, 0xc7, 0xd0, 0x31, 0x01, 0xe0, 0xad, + 0x25, 0x8a, 0xa2, 0x22, 0xfc, 0xfb, 0xe3, 0xe9, 0xa1, 0xe6, 0xf4, 0xa0, 0x6f, 0xe3, 0x9d, 0x18, 0x34, 0x05, 0x26, + 0x58, 0x07, 0x0c, 0xf3, 0x01, 0xfd, 0xae, 0xa4, 0x1a, 0xdf, 0xf7, 0xa2, 0xc8, 0x41, 0x4c, 0x66, 0xf0, 0xa5, 0xf1, + 0x4d, 0x56, 0x64, 0x7c, 0x51, 0x01, 0xda, 0xbc, 0x4c, 0xb6, 0x0b, 0xc7, 0x30, 0x85, 0x69, 0xb7, 0xee, 0x7b, 0xec, + 0xa0, 0x5c, 0xdc, 0x1a, 0xc6, 0x6f, 0x24, 0x82, 0xec, 0x8d, 0x65, 0xe6, 0x03, 0xc5, 0xaf, 0x9f, 0x3a, 0x26, 0xb9, + 0xe7, 0x0d, 0xf7, 0x87, 0xa8, 0xa9, 0xd0, 0xf9, 0x5c, 0x79, 0xb7, 0x9c, 0xdf, 0x85, 0xd7, 0xaa, 0x50, 0x77, 0x64, + 0xc9, 0x48, 0xd3, 0x69, 0xe8, 0xe9, 0x5a, 0x2d, 0xda, 0x9c, 0xb8, 0x0e, 0xda, 0xb6, 0xd8, 0x04, 0x12, 0x4b, 0xce, + 0x60, 0xa6, 0xe4, 0x4d, 0x2c, 0x08, 0x0e, 0x1d, 0x41, 0xa1, 0xbb, 0x28, 0x0e, 0x91, 0x30, 0x60, 0xb3, 0x43, 0x85, + 0xdd, 0x47, 0xb0, 0xf1, 0xd5, 0xbc, 0x50, 0xe4, 0x19, 0xab, 0xc2, 0x9c, 0xa9, 0x66, 0x56, 0xb5, 0x5f, 0x0c, 0x70, + 0xf6, 0x4f, 0xb8, 0x97, 0x4e, 0x0c, 0xd6, 0x83, 0x4c, 0x49, 0x0d, 0x9d, 0x72, 0x8a, 0x6a, 0x1e, 0xb1, 0x8d, 0x35, + 0x14, 0x50, 0x3b, 0x3c, 0x32, 0x1c, 0x6e, 0x7a, 0x6f, 0x7c, 0x3e, 0xf0, 0x2c, 0x36, 0xf0, 0xce, 0x21, 0xb0, 0x10, + 0xfb, 0x51, 0xbb, 0x38, 0xb4, 0x35, 0x9b, 0xa1, 0xb0, 0x8d, 0x86, 0x42, 0x3a, 0xb3, 0x17, 0x24, 0xd3, 0x41, 0x1a, + 0x48, 0x5b, 0x87, 0x89, 0xc6, 0xde, 0x57, 0x07, 0xba, 0x03, 0x8d, 0x37, 0x3d, 0xa2, 0xd0, 0xc6, 0xae, 0x1a, 0xc0, + 0x2b, 0x3a, 0x97, 0xe8, 0x66, 0xdf, 0x12, 0xd8, 0xaf, 0x36, 0x83, 0x1b, 0xcb, 0x97, 0x00, 0xa6, 0x14, 0x90, 0x6d, + 0xd9, 0xf8, 0xdc, 0x73, 0x3e, 0x90, 0x4d, 0x98, 0x1c, 0x8d, 0xa3, 0x76, 0x11, 0x76, 0x69, 0x8d, 0xb7, 0x1c, 0x4d, + 0xf5, 0xcf, 0xa5, 0x08, 0x0b, 0xac, 0x2e, 0x98, 0xb6, 0xc5, 0x47, 0x23, 0xac, 0x49, 0x51, 0xb7, 0x87, 0x05, 0xd4, + 0xd8, 0x61, 0x21, 0x95, 0xd6, 0x6b, 0x89, 0x8b, 0x95, 0x18, 0x5f, 0xd3, 0x53, 0x28, 0x0e, 0x2c, 0x3b, 0x47, 0x40, + 0xe3, 0xc1, 0x3a, 0xdf, 0x0a, 0x5f, 0x2a, 0xdc, 0x2f, 0xe5, 0xa8, 0xe4, 0x99, 0x26, 0xce, 0xf5, 0x02, 0xce, 0x08, + 0x89, 0xcb, 0x0f, 0xd8, 0x38, 0x96, 0x00, 0x5b, 0xa6, 0xf7, 0xff, 0x50, 0x87, 0x05, 0xdb, 0x21, 0xc0, 0x2b, 0xee, + 0xa2, 0x7d, 0xa0, 0x5c, 0x01, 0xa4, 0xc9, 0x51, 0x86, 0x5c, 0x7e, 0xd6, 0xbd, 0x42, 0xc6, 0xb4, 0x4f, 0xa2, 0x63, + 0xcb, 0x76, 0x76, 0x20, 0x99, 0x23, 0x43, 0xc2, 0xb8, 0xf5, 0x2a, 0x65, 0xe1, 0x6e, 0x80, 0x63, 0x44, 0xb1, 0xb4, + 0x62, 0x7e, 0x99, 0x29, 0xf2, 0x0a, 0xd8, 0x8d, 0x93, 0xa6, 0xbd, 0x36, 0xa6, 0x4b, 0x64, 0x63, 0x30, 0x76, 0xaa, + 0x08, 0x2c, 0x8c, 0x41, 0x55, 0xb2, 0x20, 0xfc, 0x63, 0x4f, 0x38, 0xe0, 0x7f, 0x72, 0x26, 0x28, 0x3f, 0x1e, 0xcb, + 0x79, 0x52, 0x61, 0x1e, 0xc8, 0x14, 0xf6, 0x70, 0xfa, 0xd2, 0xbf, 0xa2, 0x4f, 0xa9, 0xc0, 0x9a, 0x24, 0xc2, 0xb8, + 0x01, 0x06, 0x55, 0x1b, 0x00, 0x74, 0x83, 0x14, 0x6f, 0x12, 0xd0, 0xe4, 0x26, 0xb4, 0x0a, 0xe5, 0x28, 0x1d, 0xb0, + 0x52, 0xe4, 0x66, 0xd4, 0x14, 0xc1, 0x46, 0xda, 0x41, 0x8a, 0x12, 0x0c, 0x3b, 0xa9, 0x06, 0x69, 0x95, 0x7a, 0x38, + 0x08, 0x7f, 0x4d, 0x80, 0x0e, 0x40, 0x1e, 0x96, 0xff, 0x65, 0x32, 0xc2, 0xcb, 0x23, 0x2b, 0xb9, 0x47, 0xcd, 0x51, + 0x63, 0x62, 0x1a, 0x3a, 0xb9, 0xa5, 0x13, 0xde, 0xd5, 0x1c, 0x71, 0x36, 0x0e, 0x6a, 0xab, 0x9a, 0x0f, 0x06, 0x43, + 0xa7, 0x4e, 0x3a, 0x82, 0xc2, 0x47, 0x39, 0x06, 0x13, 0xda, 0xcd, 0x14, 0x3d, 0x0f, 0x7b, 0x99, 0x97, 0x93, 0x6e, + 0x36, 0x53, 0x00, 0xb6, 0x5a, 0x0a, 0x5b, 0x86, 0x81, 0x31, 0x8c, 0x3f, 0x02, 0x72, 0xc3, 0xa7, 0xcf, 0x4b, 0x23, + 0x8f, 0x4a, 0x2f, 0x6f, 0x7e, 0xf8, 0xf8, 0x31, 0x80, 0xc1, 0x50, 0xd1, 0xe0, 0xc3, 0x67, 0x7d, 0x35, 0xbe, 0x93, + 0xc9, 0xc6, 0x1a, 0xe3, 0x1c, 0x44, 0x79, 0x16, 0xda, 0x91, 0x9f, 0x95, 0x75, 0x51, 0x0c, 0xdb, 0xd7, 0x17, 0x95, + 0xd7, 0x97, 0x22, 0xa4, 0x6a, 0x41, 0x2d, 0x6f, 0x71, 0x8a, 0x8d, 0x43, 0x28, 0x34, 0xe6, 0xa0, 0x08, 0x19, 0x8e, + 0x22, 0x6e, 0xee, 0x34, 0x14, 0x03, 0x52, 0x22, 0x12, 0xe6, 0xd4, 0x69, 0xed, 0x6d, 0x4e, 0xb0, 0xd9, 0x3b, 0x53, + 0x4b, 0x0d, 0xaf, 0x31, 0x61, 0x65, 0xe7, 0x48, 0x91, 0xc0, 0xa5, 0x2d, 0xbb, 0xb5, 0xc8, 0x54, 0xdd, 0x8d, 0x86, + 0xcc, 0x99, 0x15, 0x14, 0xab, 0x97, 0xcf, 0x0a, 0x87, 0x56, 0x50, 0xfc, 0xa6, 0xc1, 0x06, 0xc4, 0x38, 0x76, 0x7f, + 0x7c, 0xae, 0x82, 0x7f, 0xf8, 0x39, 0xdc, 0x93, 0x3f, 0xa6, 0x17, 0xac, 0x52, 0xcc, 0x06, 0x35, 0xdf, 0x25, 0xca, + 0xf4, 0xda, 0x9c, 0x09, 0x4c, 0x1c, 0xf3, 0x82, 0x1e, 0x3e, 0x4b, 0x5f, 0x14, 0xa3, 0xcd, 0xa0, 0x22, 0x65, 0x52, + 0x01, 0x44, 0x34, 0xe9, 0x0e, 0xa9, 0xd7, 0x58, 0xa4, 0x2c, 0x9b, 0x62, 0x9b, 0xe6, 0x4a, 0x6d, 0x1f, 0x3b, 0x6a, + 0x6a, 0xdd, 0x90, 0x48, 0x3c, 0xa4, 0xf9, 0x0f, 0xc5, 0xd7, 0x31, 0x16, 0x84, 0x48, 0x21, 0xad, 0x2f, 0xce, 0x74, + 0x7a, 0x7c, 0x36, 0x8a, 0x3b, 0x1a, 0xc7, 0xa3, 0xfc, 0x6b, 0x8d, 0xe9, 0x54, 0xb0, 0x1f, 0xd2, 0x19, 0x12, 0x47, + 0x9e, 0x1b, 0x17, 0xdd, 0xad, 0xcf, 0x3a, 0x7c, 0x10, 0xb5, 0xbc, 0xe4, 0x1d, 0xbb, 0x21, 0x54, 0x32, 0x98, 0xeb, + 0x94, 0x40, 0x6b, 0xea, 0x0f, 0xfc, 0x0d, 0x5f, 0xb8, 0x51, 0x5d, 0x3a, 0x24, 0x5a, 0xd8, 0x90, 0x60, 0x3a, 0x49, + 0x8a, 0xb4, 0xe0, 0x12, 0x26, 0x9b, 0xa0, 0x58, 0xbb, 0xb0, 0xe0, 0xb3, 0xb0, 0x38, 0x64, 0xf3, 0x8b, 0x2e, 0xc4, + 0x78, 0x07, 0xd6, 0x19, 0xaa, 0x3c, 0x73, 0x8e, 0x41, 0x33, 0x78, 0x61, 0x61, 0xaf, 0x0a, 0x72, 0x88, 0x0b, 0xeb, + 0x80, 0xca, 0xc7, 0xa8, 0x91, 0xf1, 0xe8, 0xad, 0x4d, 0x21, 0x3d, 0xd0, 0x7d, 0xff, 0xce, 0x6f, 0xaf, 0x22, 0x67, + 0x60, 0x88, 0x0b, 0x91, 0x17, 0x1e, 0xcd, 0x6c, 0x70, 0x81, 0x71, 0xe1, 0x6d, 0x8e, 0x7a, 0xf1, 0x1c, 0xce, 0xdb, + 0x37, 0x54, 0x6a, 0x78, 0xc5, 0x94, 0x8e, 0x13, 0x14, 0xdc, 0xa4, 0x97, 0x15, 0xc8, 0xbb, 0x93, 0xb4, 0xd8, 0x35, + 0xbb, 0x14, 0xb2, 0x21, 0x45, 0x67, 0xed, 0x6e, 0x70, 0xca, 0xdc, 0x9e, 0x49, 0x87, 0x65, 0x4e, 0xd1, 0xcc, 0x24, + 0x0a, 0x3d, 0x87, 0x28, 0xc6, 0x8c, 0xa1, 0x49, 0xb5, 0x65, 0x5e, 0xd4, 0x92, 0x0d, 0x95, 0xba, 0x46, 0x50, 0xd6, + 0xcd, 0x91, 0xfd, 0x73, 0xe6, 0xe3, 0xdc, 0xb9, 0xc1, 0xd0, 0x03, 0x79, 0x18, 0x90, 0xb1, 0x3a, 0xc7, 0xfd, 0x85, + 0x8f, 0x69, 0xde, 0xed, 0x5e, 0x73, 0xfc, 0x6b, 0x04, 0x6d, 0x99, 0x7c, 0xd3, 0xfa, 0x07, 0xd5, 0xff, 0x65, 0x03, + 0x46, 0xd6, 0x3a, 0x3e, 0x2c, 0x36, 0xad, 0x37, 0x55, 0x4d, 0x76, 0xd0, 0xd8, 0x99, 0x26, 0x6d, 0x2c, 0x1c, 0xd4, + 0xdd, 0xdb, 0xc8, 0x24, 0x38, 0x6c, 0xde, 0x1c, 0xc2, 0x40, 0x56, 0xc6, 0x77, 0x1b, 0xa1, 0x75, 0xeb, 0xb4, 0xa9, + 0xc3, 0x2f, 0x43, 0x13, 0x0f, 0x7b, 0x8d, 0x56, 0x0c, 0x61, 0x9e, 0x4d, 0x19, 0xbb, 0x02, 0xde, 0x14, 0x41, 0x11, + 0x4f, 0xe3, 0x9a, 0x23, 0x98, 0xd2, 0x6a, 0x60, 0xc8, 0xaa, 0x11, 0xcf, 0x51, 0xa5, 0x6b, 0xd4, 0x73, 0xfb, 0xa6, + 0x07, 0x0c, 0xb9, 0x90, 0xb3, 0x5f, 0x4e, 0x6b, 0x42, 0x67, 0xeb, 0x76, 0xf4, 0x18, 0xf0, 0x0a, 0x91, 0xe8, 0xf3, + 0x41, 0x96, 0x01, 0xb1, 0xc5, 0x64, 0xa5, 0x43, 0x21, 0xc1, 0xe3, 0x76, 0xf8, 0x8c, 0xd5, 0xa7, 0xbc, 0xa7, 0x4f, + 0x59, 0xec, 0x86, 0xa6, 0xd6, 0xc1, 0xdf, 0xa9, 0x12, 0x22, 0x05, 0xae, 0xa5, 0xba, 0xcb, 0x90, 0x55, 0xa5, 0x1e, + 0xfd, 0x41, 0x91, 0x96, 0x46, 0xac, 0xc4, 0x52, 0xa9, 0x1a, 0xd3, 0xfa, 0xef, 0xb4, 0x15, 0x9d, 0xa8, 0xff, 0xb4, + 0xb0, 0x5a, 0x7d, 0x45, 0xac, 0xab, 0x84, 0xe3, 0x45, 0xaf, 0xb6, 0xe8, 0xc8, 0x10, 0x41, 0x02, 0x9f, 0x75, 0xad, + 0x37, 0x1b, 0x3a, 0x0d, 0x68, 0xbc, 0xcd, 0xe3, 0xbf, 0xea, 0xf9, 0x8c, 0xec, 0x05, 0x9a, 0xae, 0x52, 0x9b, 0x02, + 0x5d, 0x41, 0xe0, 0x9c, 0x25, 0xd6, 0x5c, 0xa5, 0x81, 0x09, 0xa6, 0x79, 0xb1, 0xe5, 0x0b, 0xa8, 0x4e, 0xb7, 0x40, + 0x1a, 0x08, 0xd2, 0x50, 0x7a, 0xa9, 0x55, 0xea, 0x36, 0xa6, 0xd3, 0x41, 0x79, 0xd6, 0x06, 0xa5, 0xf8, 0x01, 0xe5, + 0xc0, 0x95, 0x5b, 0xbd, 0x44, 0x09, 0xb2, 0xea, 0xd0, 0xbc, 0x95, 0xbd, 0x66, 0x1e, 0x52, 0xb8, 0x61, 0x4d, 0xc6, + 0x05, 0x6f, 0xfb, 0xdb, 0xdd, 0x40, 0xe6, 0x28, 0x5a, 0x47, 0x4d, 0xc9, 0x42, 0xf7, 0x88, 0xab, 0x08, 0xe9, 0xe7, + 0x85, 0xd2, 0x2d, 0xb0, 0xd3, 0xed, 0xef, 0xd0, 0xba, 0x5b, 0xd4, 0xc5, 0xf2, 0xd0, 0xc3, 0xce, 0x91, 0x7f, 0x04, + 0xef, 0x8f, 0x02, 0x16, 0xc3, 0x4f, 0x13, 0x65, 0x07, 0x6d, 0xf6, 0xfa, 0x7e, 0xb0, 0x4d, 0xbf, 0xa9, 0xb1, 0x1b, + 0xbc, 0x1d, 0xf0, 0x57, 0x1d, 0xac, 0xc2, 0x61, 0x0f, 0xcc, 0x27, 0x16, 0xbf, 0x3f, 0xbf, 0xd8, 0xd7, 0xe0, 0xf8, + 0x44, 0xb8, 0xcd, 0x54, 0x3e, 0xc0, 0xdb, 0x24, 0xb7, 0x74, 0xbd, 0x30, 0xf2, 0xea, 0x02, 0x52, 0x56, 0xce, 0x89, + 0xeb, 0x8b, 0x02, 0x57, 0xa0, 0x85, 0x12, 0x8f, 0x6e, 0x0b, 0xde, 0xb3, 0x86, 0xb4, 0x77, 0x1b, 0x63, 0xd3, 0x69, + 0xef, 0x38, 0x15, 0x87, 0x99, 0x2c, 0xcd, 0x26, 0xe4, 0xdf, 0xae, 0xa8, 0x53, 0x35, 0x70, 0x9f, 0x5f, 0xd7, 0x57, + 0xb3, 0x74, 0x37, 0xee, 0xe7, 0x4f, 0xd9, 0x9e, 0xb0, 0x95, 0x0d, 0x63, 0x76, 0xc8, 0xef, 0x0b, 0x0d, 0xe8, 0x7a, + 0x34, 0x8b, 0x90, 0xfd, 0x40, 0x80, 0xc1, 0x57, 0xe7, 0x8c, 0xa5, 0x59, 0xd9, 0x37, 0xfd, 0xc2, 0x43, 0x49, 0x41, + 0x8c, 0xca, 0x5e, 0x03, 0x64, 0xb4, 0x24, 0x5b, 0xa7, 0xc5, 0x7b, 0x61, 0x01, 0xa3, 0xef, 0x53, 0xe8, 0x54, 0x9f, + 0x64, 0x08, 0xab, 0x2e, 0xd1, 0x78, 0x4e, 0x7b, 0xc4, 0xd7, 0x79, 0x3e, 0x7c, 0x1d, 0x8b, 0x3d, 0x57, 0x58, 0x66, + 0xd8, 0x4c, 0x8c, 0x43, 0x03, 0xf1, 0xc4, 0xa1, 0xfb, 0x91, 0xd1, 0x62, 0xdc, 0x5a, 0x50, 0xc3, 0xe3, 0x2f, 0xe7, + 0x89, 0xa5, 0xeb, 0xdb, 0x80, 0x0c, 0x53, 0x44, 0x9c, 0x59, 0xd4, 0xeb, 0x8b, 0x6a, 0xd8, 0xbd, 0x2e, 0x2a, 0x08, + 0x9a, 0xcd, 0xb7, 0xf5, 0xe0, 0x06, 0xdb, 0x45, 0xed, 0x87, 0x2c, 0xd1, 0xda, 0xba, 0xdf, 0xb4, 0x1b, 0x64, 0x9f, + 0x33, 0x0e, 0xda, 0x40, 0xc0, 0xf8, 0xde, 0xbf, 0xb4, 0xd5, 0xd9, 0xde, 0x3a, 0xcd, 0x5f, 0x88, 0x8b, 0xbf, 0x93, + 0xb0, 0xbc, 0x9b, 0xe1, 0xa0, 0x94, 0x90, 0xe1, 0x04, 0x11, 0xa6, 0xc2, 0xba, 0xb8, 0xe4, 0xb3, 0x0b, 0x13, 0x2b, + 0x23, 0xac, 0x88, 0x76, 0xc4, 0x37, 0x7c, 0x9f, 0xb7, 0x05, 0x04, 0xb1, 0xb3, 0x65, 0xcc, 0x78, 0x46, 0x44, 0x89, + 0x8c, 0xec, 0x30, 0xb1, 0x69, 0x36, 0x61, 0xea, 0xd8, 0x6d, 0x32, 0x68, 0xea, 0x60, 0x9c, 0xc2, 0x06, 0xba, 0x1b, + 0xaa, 0xad, 0xb6, 0x92, 0x8c, 0xf9, 0x85, 0xac, 0x9d, 0xed, 0x8f, 0xea, 0x65, 0x5e, 0x6c, 0x3f, 0xdb, 0x86, 0xe6, + 0x55, 0x31, 0x86, 0x76, 0x20, 0xb3, 0x23, 0xdc, 0x65, 0xea, 0x1e, 0xd2, 0x78, 0xa2, 0x50, 0x6d, 0x25, 0x08, 0x07, + 0xa0, 0x90, 0xa6, 0x39, 0xe3, 0x02, 0xb3, 0xe8, 0xa3, 0x2a, 0xbc, 0xd3, 0x41, 0x59, 0x2d, 0x0d, 0xa0, 0x04, 0x88, + 0xe3, 0x4e, 0x3a, 0x8c, 0xe4, 0xc1, 0x5e, 0xa9, 0x3b, 0xb5, 0x6a, 0x9d, 0xb9, 0x58, 0xec, 0x47, 0x97, 0x5a, 0xec, + 0x11, 0xa6, 0x59, 0x52, 0xeb, 0x07, 0x5a, 0x68, 0xcf, 0x37, 0x5b, 0x13, 0xf3, 0x94, 0x71, 0x48, 0x7b, 0x68, 0x3f, + 0x14, 0xd4, 0x7a, 0x09, 0x8f, 0x95, 0x41, 0x89, 0x64, 0xa7, 0xa6, 0x9d, 0x95, 0x69, 0x0a, 0xde, 0x65, 0x99, 0x78, + 0x15, 0xfa, 0x1d, 0xe1, 0xdd, 0x96, 0x59, 0xdb, 0xc8, 0xc4, 0xcd, 0x49, 0xa4, 0x58, 0x0e, 0xce, 0x35, 0xbc, 0x2d, + 0x3a, 0x76, 0xf1, 0xdb, 0x4c, 0xad, 0x5f, 0xb0, 0x8c, 0x38, 0x5a, 0xc2, 0xcd, 0x0f, 0xe9, 0x91, 0x88, 0x02, 0xa3, + 0xfe, 0x4d, 0x5e, 0xc5, 0x89, 0x1b, 0x66, 0xfc, 0x8e, 0x86, 0x38, 0x54, 0x87, 0xba, 0x67, 0x89, 0x15, 0x88, 0x85, + 0xf3, 0xf7, 0xd5, 0x4d, 0x20, 0x97, 0xde, 0x56, 0xab, 0xe6, 0x61, 0xd4, 0x65, 0xdf, 0x83, 0x3f, 0x85, 0x31, 0x35, + 0x9f, 0xbc, 0x2a, 0xdf, 0x70, 0xcf, 0x64, 0x29, 0x97, 0xf0, 0xba, 0xde, 0x52, 0x73, 0x9c, 0xcb, 0x37, 0x5c, 0x56, + 0x59, 0x6a, 0x33, 0x82, 0x49, 0xdf, 0x5a, 0xe1, 0x38, 0x82, 0x35, 0x14, 0x91, 0xb8, 0x39, 0xa8, 0x83, 0xcd, 0xb1, + 0x0e, 0xe5, 0x36, 0x13, 0xac, 0x43, 0x36, 0xd8, 0x03, 0xc2, 0xa9, 0xc5, 0x66, 0x8e, 0x7d, 0x6c, 0x08, 0x07, 0x74, + 0xdc, 0x9a, 0x22, 0x4a, 0x4e, 0xdd, 0x89, 0xa7, 0x96, 0xe5, 0xbb, 0x19, 0xd3, 0x74, 0x7c, 0x87, 0x18, 0x59, 0x12, + 0x8b, 0xdc, 0xcb, 0x10, 0x97, 0x43, 0x8b, 0xf6, 0x2c, 0x55, 0x21, 0x37, 0xe8, 0xd6, 0x2d, 0x37, 0x1c, 0x3e, 0x7d, + 0x38, 0x2e, 0x7a, 0x22, 0xda, 0x4a, 0x7c, 0x39, 0x85, 0x54, 0x4a, 0xf6, 0x93, 0x0a, 0x2f, 0x54, 0x48, 0xa7, 0xcf, + 0x8a, 0x04, 0xdc, 0xdc, 0x99, 0x0b, 0x57, 0x53, 0xae, 0x65, 0x8d, 0x76, 0x93, 0x9c, 0x08, 0x15, 0x96, 0xcc, 0x18, + 0xbd, 0x78, 0x3f, 0x8b, 0x16, 0xdb, 0x39, 0xc5, 0x76, 0xd8, 0xd4, 0xd4, 0x79, 0x87, 0x22, 0xa7, 0xa1, 0xb2, 0x8c, + 0xc4, 0x2c, 0xca, 0x21, 0x3e, 0x3a, 0x75, 0xbe, 0xc7, 0x28, 0x75, 0x05, 0x73, 0xaa, 0x4d, 0xc9, 0x83, 0xd3, 0xc5, + 0xf9, 0x17, 0x6e, 0x37, 0xfd, 0xe3, 0x28, 0xe8, 0xb7, 0x5a, 0x35, 0x51, 0xad, 0x1c, 0x9a, 0x5d, 0xd7, 0x6e, 0x34, + 0x26, 0xc7, 0x0e, 0x70, 0x67, 0x13, 0xc4, 0x18, 0x3e, 0x2e, 0xc3, 0x2c, 0x9a, 0xe7, 0x53, 0x7d, 0xfd, 0xf3, 0x20, + 0xca, 0xb6, 0x4c, 0xdd, 0x0a, 0xa3, 0xc0, 0xa5, 0x81, 0x07, 0xe3, 0xa8, 0x21, 0x86, 0xcd, 0xa3, 0xa3, 0x6d, 0x22, + 0x93, 0x74, 0xcf, 0x6a, 0xae, 0x00, 0x4d, 0xa7, 0x20, 0xf2, 0xef, 0x71, 0x9b, 0x2f, 0x38, 0x8e, 0x4e, 0xe9, 0xf9, + 0x17, 0xa5, 0x1f, 0x69, 0xf0, 0xc6, 0x78, 0x75, 0xc1, 0xaa, 0x27, 0x23, 0xef, 0x88, 0x87, 0x39, 0x0a, 0xe4, 0x07, + 0xf0, 0x4d, 0xe9, 0x82, 0x73, 0x63, 0xf7, 0x3d, 0xc8, 0x96, 0xed, 0x68, 0x55, 0xc4, 0x1a, 0xf9, 0x1a, 0x27, 0x2e, + 0xb5, 0xfe, 0x92, 0xcc, 0x3a, 0x09, 0xf6, 0x35, 0xf2, 0x78, 0x47, 0xbc, 0xcf, 0xf6, 0x76, 0x68, 0xe3, 0x35, 0x92, + 0xb0, 0xef, 0xb6, 0xeb, 0xaa, 0x2b, 0x4e, 0x7f, 0x62, 0x01, 0xe1, 0x02, 0x36, 0x16, 0xe8, 0x9b, 0xdb, 0x86, 0xd2, + 0xb9, 0xee, 0x1a, 0x7c, 0xaf, 0xf1, 0xce, 0x3b, 0x3b, 0xb8, 0x8a, 0x93, 0x44, 0x60, 0x76, 0xa1, 0x34, 0x26, 0xea, + 0x17, 0x86, 0xe7, 0x6a, 0xcf, 0xb7, 0xea, 0x65, 0x54, 0xb3, 0x67, 0x02, 0xfe, 0x3a, 0x1a, 0x1f, 0x95, 0x79, 0x83, + 0x85, 0xdb, 0x3a, 0x85, 0xee, 0xfc, 0x7d, 0x00, 0xaf, 0xbc, 0x6b, 0xb6, 0x2c, 0xe6, 0x3b, 0xce, 0x82, 0xa5, 0xcd, + 0xdb, 0x5d, 0x99, 0xe0, 0x97, 0x1f, 0x70, 0xaf, 0xf8, 0xd2, 0xc1, 0x93, 0x7e, 0xdd, 0x52, 0xc0, 0x5d, 0xc0, 0xe4, + 0xa5, 0x1b, 0x6e, 0x42, 0xdc, 0xac, 0x72, 0xd3, 0xb7, 0x48, 0xf9, 0xe9, 0xe9, 0xac, 0x79, 0xea, 0x10, 0xde, 0x78, + 0x54, 0x87, 0xca, 0x68, 0x6e, 0xdd, 0xc2, 0x95, 0xfe, 0x05, 0xb7, 0x35, 0x77, 0x30, 0xc3, 0x89, 0x2c, 0x89, 0xc7, + 0x93, 0xee, 0x1e, 0xa0, 0xcc, 0x03, 0x2f, 0x22, 0x29, 0xa2, 0x6d, 0x60, 0x07, 0x2d, 0x28, 0x6b, 0x0d, 0xa2, 0xd6, + 0xde, 0x23, 0x66, 0x7b, 0x69, 0xf7, 0x43, 0xf7, 0xe1, 0x03, 0x0f, 0xd6, 0x44, 0xc8, 0x19, 0x4c, 0x28, 0x7e, 0x97, + 0xf6, 0x73, 0xd8, 0x33, 0xc2, 0x95, 0x56, 0x28, 0x78, 0x8e, 0x1b, 0x54, 0x7d, 0x9f, 0x2d, 0x20, 0x5a, 0x24, 0x20, + 0x67, 0xbb, 0x16, 0xd6, 0xa8, 0x18, 0xf9, 0x49, 0x0c, 0x95, 0xd4, 0xb6, 0x7c, 0x83, 0xa5, 0xbf, 0xae, 0x02, 0x49, + 0x20, 0x31, 0x27, 0xf5, 0xbc, 0xb6, 0x2d, 0x16, 0x37, 0x4b, 0x36, 0x0f, 0x15, 0xa5, 0xe7, 0xe5, 0xd8, 0x79, 0x07, + 0xf5, 0x28, 0xb8, 0x2c, 0xdb, 0xeb, 0xdc, 0x2e, 0xed, 0xae, 0x75, 0x18, 0x4e, 0x52, 0x4e, 0x31, 0xe0, 0xa1, 0x6d, + 0x3d, 0x72, 0xb1, 0xf8, 0xf7, 0x40, 0x1a, 0xde, 0x5d, 0x7e, 0x78, 0x73, 0x4b, 0x6b, 0x4c, 0xd4, 0x66, 0x2a, 0x12, + 0xe1, 0xe4, 0x86, 0x15, 0xc9, 0x90, 0x26, 0x12, 0x3d, 0x7c, 0x91, 0x6f, 0xae, 0x35, 0xac, 0x12, 0xd9, 0x90, 0x61, + 0xb3, 0xd9, 0xcd, 0x64, 0xdc, 0xca, 0x76, 0x7f, 0x3a, 0xf4, 0x26, 0xc8, 0xd6, 0x89, 0xd2, 0x3c, 0x77, 0xd8, 0x62, + 0xed, 0x9e, 0xb1, 0xa8, 0x9f, 0x1c, 0x65, 0x8e, 0x78, 0x43, 0x4c, 0xb4, 0x4d, 0xb9, 0xb6, 0x66, 0x1e, 0x21, 0x70, + 0x6f, 0xed, 0x3f, 0x2b, 0xf6, 0xf1, 0x1a, 0xd3, 0xc7, 0xf4, 0x0b, 0xee, 0xf9, 0xc4, 0xc3, 0xcf, 0x34, 0xc9, 0x0d, + 0xb1, 0xdd, 0x45, 0x3c, 0xe4, 0xa3, 0xbb, 0x61, 0xca, 0x84, 0x65, 0xda, 0x5c, 0xb5, 0x9c, 0x1b, 0x83, 0x54, 0xa1, + 0x48, 0xe5, 0x3e, 0xa2, 0xeb, 0xb0, 0x1f, 0xce, 0xf2, 0x3d, 0x48, 0x64, 0xbe, 0x4f, 0x22, 0x10, 0xeb, 0x1f, 0x05, + 0x71, 0x8e, 0x25, 0x2f, 0x8d, 0x22, 0x8d, 0xfe, 0x84, 0x52, 0x96, 0x72, 0x08, 0xf8, 0xe6, 0x80, 0x73, 0x15, 0x5b, + 0xff, 0x7d, 0xf6, 0x7d, 0x98, 0x76, 0x7d, 0xce, 0xee, 0x16, 0x12, 0xde, 0x72, 0xe2, 0x4e, 0xe5, 0xf1, 0xa9, 0x90, + 0x7b, 0x0f, 0x72, 0x2d, 0xbf, 0xed, 0x86, 0x86, 0xce, 0xf1, 0xb2, 0x45, 0x71, 0x55, 0xa7, 0xf2, 0x47, 0x51, 0xab, + 0xaa, 0xa4, 0x2a, 0x7b, 0x1e, 0x39, 0x93, 0x93, 0xb3, 0xdc, 0xab, 0x0a, 0x43, 0x03, 0x8f, 0x38, 0x5b, 0x62, 0x9d, + 0xbd, 0xc7, 0xcc, 0xe2, 0x84, 0x8f, 0x42, 0x03, 0xc1, 0x2a, 0xe9, 0x13, 0x8e, 0xe8, 0x0b, 0xb4, 0xd3, 0xfa, 0xd2, + 0xcd, 0xed, 0x47, 0x96, 0xb2, 0x83, 0xa3, 0xf1, 0xca, 0x8a, 0x7c, 0x9d, 0x02, 0x31, 0x53, 0xac, 0x62, 0xe4, 0xf3, + 0x1b, 0x84, 0x44, 0xf3, 0x8b, 0xe9, 0x82, 0xf6, 0x2e, 0x6b, 0x51, 0x1d, 0x3e, 0x6b, 0xf6, 0xca, 0x0b, 0x40, 0x1e, + 0x57, 0x15, 0x87, 0x48, 0x7b, 0x83, 0x38, 0x4d, 0x88, 0x7a, 0x76, 0xdb, 0xb3, 0x85, 0x38, 0x31, 0xcb, 0xd1, 0x62, + 0xd2, 0xab, 0x12, 0xd9, 0x6f, 0x4f, 0x4f, 0x20, 0x25, 0x3a, 0x63, 0x2c, 0x19, 0x69, 0x4b, 0xf9, 0x86, 0xe6, 0xf4, + 0x1e, 0xd6, 0x31, 0x11, 0xb1, 0x5a, 0x00, 0x52, 0x0d, 0x29, 0xf4, 0x35, 0x6a, 0x47, 0x44, 0xf8, 0xf9, 0xc8, 0x52, + 0x29, 0x32, 0xc6, 0x37, 0xf6, 0x23, 0x6d, 0x31, 0xab, 0x88, 0x53, 0xc4, 0xac, 0x61, 0x18, 0xd9, 0xb8, 0xc4, 0x28, + 0xa8, 0x56, 0x8f, 0x37, 0xf8, 0x04, 0x83, 0x94, 0x62, 0xab, 0xeb, 0x71, 0xdc, 0xc4, 0x4f, 0x47, 0x22, 0xc2, 0x7d, + 0x82, 0x38, 0x29, 0x81, 0x8d, 0xe7, 0x6f, 0xce, 0x54, 0xe7, 0x7c, 0x69, 0xb0, 0xe7, 0x48, 0xf5, 0x38, 0xc3, 0x40, + 0x13, 0x7c, 0xf5, 0xa3, 0xd9, 0x1f, 0xcb, 0x37, 0x32, 0x8b, 0x3b, 0x09, 0xa9, 0x95, 0xd3, 0xad, 0x36, 0x5b, 0x22, + 0x7e, 0x80, 0x0b, 0x67, 0xbc, 0x47, 0x35, 0x77, 0xf9, 0xa5, 0x26, 0x06, 0x56, 0x98, 0x13, 0x72, 0x37, 0x47, 0x92, + 0xbf, 0x00, 0xe3, 0x66, 0x0d, 0x6d, 0x2e, 0xc7, 0x2e, 0x38, 0x09, 0xe4, 0xea, 0xa6, 0xf4, 0x9b, 0xcf, 0x9e, 0x81, + 0xe9, 0x61, 0xf9, 0xd1, 0xef, 0x32, 0xff, 0x65, 0xac, 0x53, 0x13, 0xfc, 0xc8, 0x51, 0x59, 0x9f, 0xcb, 0xe3, 0xdf, + 0x01, 0xb7, 0x67, 0x7d, 0xe3, 0xcf, 0x93, 0x20, 0xce, 0x35, 0x7f, 0x66, 0xc1, 0x44, 0x36, 0xbb, 0xd6, 0xde, 0xcf, + 0x9f, 0xc1, 0x9b, 0xfb, 0x3d, 0x42, 0xe5, 0x6b, 0xe7, 0x14, 0xea, 0xa6, 0x01, 0x16, 0x7a, 0xf5, 0x60, 0x1f, 0x90, + 0x9b, 0x7d, 0x88, 0x0a, 0x14, 0x39, 0xa2, 0xd2, 0x35, 0xe3, 0x1a, 0xb6, 0x55, 0x3b, 0x94, 0x3d, 0xc3, 0x79, 0x4f, + 0x9b, 0x5d, 0xb5, 0xad, 0x57, 0x69, 0x13, 0x52, 0x98, 0xc2, 0x1a, 0xe8, 0x56, 0x37, 0xec, 0xdc, 0x1c, 0x2c, 0xdf, + 0x5a, 0x06, 0x1e, 0x16, 0xae, 0x98, 0xbd, 0x98, 0xf9, 0x8e, 0x0e, 0xfc, 0x59, 0xca, 0x2b, 0x0a, 0xb5, 0xfa, 0x8d, + 0xe3, 0xa8, 0x87, 0x36, 0xe0, 0x0d, 0x7f, 0x9d, 0x50, 0x9d, 0x3d, 0x67, 0x0b, 0x23, 0x17, 0xe2, 0xd7, 0xba, 0xc1, + 0x27, 0x74, 0xa9, 0x0a, 0x26, 0xe0, 0x4b, 0x9b, 0x1d, 0x0f, 0x5e, 0x87, 0x96, 0xa4, 0xf2, 0xb8, 0x79, 0x8c, 0xe5, + 0xdc, 0x4e, 0xb9, 0x54, 0x2b, 0xf3, 0xa3, 0x1b, 0x25, 0xd8, 0x20, 0x90, 0x24, 0x58, 0x84, 0xf0, 0x4f, 0x30, 0x67, + 0x1c, 0x89, 0x21, 0x7b, 0xa3, 0x62, 0x8a, 0x16, 0x14, 0x0c, 0x91, 0x52, 0xb6, 0x58, 0x60, 0xb3, 0xf7, 0x08, 0x7f, + 0x7f, 0xdf, 0x3a, 0xf5, 0xb4, 0xef, 0x9d, 0x02, 0xed, 0xdb, 0x27, 0xa5, 0xb4, 0xef, 0x9f, 0x14, 0x9d, 0xa5, 0x56, + 0x19, 0xfb, 0x6a, 0xc9, 0xbe, 0x1a, 0xd9, 0x63, 0x3b, 0xdb, 0x43, 0x2b, 0x8e, 0x6b, 0xd0, 0x8e, 0xc5, 0x82, 0x6f, + 0xc9, 0x01, 0xc7, 0x11, 0xcb, 0x92, 0xf5, 0x63, 0xa1, 0xb9, 0x77, 0xb5, 0x1e, 0xf9, 0xf6, 0x00, 0x15, 0x85, 0xb7, + 0xc3, 0xda, 0x8d, 0xac, 0x2c, 0xcf, 0x34, 0xb7, 0x4e, 0xe2, 0xd4, 0xd9, 0xde, 0x42, 0xf1, 0x74, 0xea, 0x08, 0x7e, + 0xd6, 0xe4, 0x70, 0x86, 0x4a, 0x13, 0xf8, 0x8f, 0x1c, 0x3f, 0x36, 0x5a, 0x5b, 0xd1, 0x78, 0xf3, 0xbd, 0x27, 0x1a, + 0x9a, 0xbf, 0xb8, 0x8a, 0x58, 0x98, 0x96, 0x93, 0x7b, 0x07, 0x53, 0x1f, 0x4a, 0xd6, 0xe2, 0x76, 0x07, 0x64, 0xb6, + 0x94, 0x97, 0x39, 0x41, 0x08, 0xa7, 0xba, 0x85, 0xff, 0x2c, 0xa0, 0x31, 0x27, 0x2d, 0x17, 0x53, 0xf9, 0xbc, 0xd5, + 0x86, 0xda, 0xce, 0x59, 0x83, 0x78, 0xec, 0xca, 0x74, 0x57, 0x82, 0x29, 0x3c, 0x9f, 0xc5, 0x15, 0x90, 0xfa, 0x85, + 0x35, 0xff, 0x46, 0xd9, 0xc3, 0xe5, 0x4e, 0x4c, 0x83, 0xff, 0xf7, 0x64, 0x3b, 0x08, 0x27, 0x74, 0x35, 0x4e, 0xb9, + 0x24, 0xe2, 0x7e, 0x6e, 0xa5, 0xed, 0x99, 0x37, 0x72, 0x7d, 0xfb, 0x8c, 0x61, 0x7a, 0xae, 0x42, 0x20, 0x53, 0x68, + 0x3f, 0xdd, 0x3f, 0x8f, 0x71, 0x48, 0xb0, 0x62, 0xcf, 0x09, 0x56, 0x19, 0x98, 0x92, 0x77, 0x33, 0x99, 0x9e, 0xbf, + 0xfc, 0x5f, 0xe6, 0xf7, 0x92, 0xf5, 0xa0, 0x37, 0x7b, 0xcb, 0x36, 0xb7, 0x85, 0x75, 0x69, 0x31, 0xb3, 0x7e, 0x34, + 0xd3, 0xfa, 0x5f, 0x71, 0x80, 0xb7, 0xdb, 0xe9, 0x8a, 0x3f, 0xaa, 0x0c, 0xd2, 0x38, 0x64, 0xdd, 0x6f, 0x4b, 0xd6, + 0x03, 0xde, 0xed, 0xed, 0xf3, 0x5b, 0x1c, 0xfe, 0xb1, 0x09, 0x7c, 0x4b, 0x17, 0x00, 0x02, 0xf8, 0x91, 0xbb, 0x1c, + 0xbb, 0x9c, 0xc9, 0x9d, 0xeb, 0x0a, 0x0b, 0xaa, 0x96, 0x43, 0x16, 0x2e, 0x96, 0x6c, 0x41, 0x3e, 0x5e, 0x13, 0xd9, + 0xe8, 0xc0, 0xec, 0x12, 0xb1, 0xf7, 0x44, 0x09, 0xde, 0x6c, 0xf3, 0x29, 0xd1, 0xf3, 0xe7, 0x04, 0xda, 0x66, 0xd7, + 0x89, 0x0d, 0xb9, 0xb6, 0x38, 0x15, 0x27, 0x00, 0xec, 0x7b, 0xe6, 0xc2, 0xe0, 0x6c, 0xa4, 0xf6, 0x41, 0x0b, 0xa7, + 0xb7, 0x04, 0xfa, 0xd9, 0x38, 0x45, 0xde, 0xef, 0x00, 0x95, 0x52, 0x78, 0xe2, 0x10, 0x13, 0x2a, 0x76, 0xf8, 0x9c, + 0x52, 0x9f, 0x43, 0x8e, 0x9c, 0x77, 0xc0, 0x89, 0x5b, 0xda, 0x74, 0x63, 0x79, 0xbb, 0xe1, 0xbb, 0x8a, 0x74, 0x65, + 0xf5, 0xb0, 0x84, 0xb6, 0xcd, 0xd1, 0x19, 0x67, 0x94, 0xa0, 0xc4, 0x08, 0x29, 0xc3, 0xf3, 0x63, 0x30, 0x48, 0x26, + 0xe3, 0x30, 0xd1, 0x6b, 0xce, 0x0a, 0xa3, 0xff, 0x44, 0x08, 0x23, 0x84, 0x9f, 0x5f, 0x67, 0x6c, 0xdf, 0xa3, 0xbb, + 0xb6, 0xe9, 0x5e, 0x6f, 0x15, 0xb1, 0xcf, 0x2b, 0x0d, 0x4a, 0xa5, 0xd2, 0x58, 0xdb, 0x8c, 0x7f, 0x75, 0x52, 0x9d, + 0x46, 0x1d, 0x8e, 0x70, 0x76, 0xa6, 0xcd, 0xf9, 0xbf, 0x9e, 0x99, 0xb9, 0xd7, 0xce, 0xcb, 0x9e, 0x19, 0xeb, 0xc6, + 0x25, 0x91, 0x16, 0xe4, 0x26, 0x0d, 0x25, 0xeb, 0xb1, 0xd1, 0xde, 0x94, 0x4c, 0xfd, 0xc8, 0xa4, 0x80, 0x8d, 0xb1, + 0xda, 0xe1, 0x32, 0x3e, 0xcd, 0xfb, 0xa8, 0x24, 0x0b, 0x2e, 0xc4, 0xf9, 0x70, 0xbb, 0xb1, 0x22, 0x85, 0x1d, 0x68, + 0xf2, 0xeb, 0x4f, 0xc9, 0xae, 0xf0, 0x9d, 0xdf, 0x81, 0x64, 0xd6, 0x17, 0x2b, 0xc5, 0x06, 0x75, 0x05, 0x7a, 0x03, + 0x2e, 0xdf, 0xd1, 0x1b, 0x65, 0x34, 0x7c, 0x5d, 0x4a, 0x54, 0x92, 0x50, 0x63, 0xa5, 0x60, 0xb7, 0x58, 0x97, 0x51, + 0x14, 0x17, 0x6b, 0xa2, 0x5f, 0x15, 0x4c, 0x16, 0xdb, 0x6e, 0xe0, 0xdc, 0x04, 0xea, 0x51, 0x07, 0x27, 0xfa, 0x3b, + 0x44, 0xde, 0x16, 0xc5, 0x86, 0x6c, 0x1b, 0x88, 0xa1, 0x15, 0xd7, 0x75, 0xaa, 0xb1, 0x3e, 0xf2, 0x80, 0x1e, 0xf7, + 0xaf, 0x8e, 0x21, 0x78, 0xf8, 0x69, 0xc0, 0x52, 0x57, 0x9d, 0x3a, 0xbc, 0x7d, 0x74, 0x63, 0x49, 0xea, 0x71, 0x7e, + 0xf3, 0x4f, 0xc5, 0x36, 0x2d, 0x4f, 0xb7, 0xc8, 0x0d, 0x89, 0xe0, 0x5d, 0x41, 0xf6, 0xd3, 0xc1, 0x6d, 0x7b, 0xa6, + 0x28, 0x0a, 0x2f, 0x94, 0xb4, 0xbc, 0x29, 0x3c, 0x8c, 0xe3, 0x46, 0x8a, 0x1a, 0x2a, 0x32, 0xfe, 0x31, 0x36, 0x2c, + 0x92, 0x9d, 0xad, 0x0f, 0x63, 0xe7, 0x95, 0x90, 0x8f, 0x2b, 0xd7, 0xea, 0x46, 0xa6, 0x63, 0x5b, 0x14, 0x39, 0x7a, + 0x9d, 0x07, 0xa0, 0xf2, 0x47, 0x61, 0x12, 0x50, 0x1c, 0x89, 0x00, 0xa2, 0x3a, 0xf1, 0xa2, 0xe8, 0x81, 0xcd, 0xa1, + 0x19, 0x56, 0x83, 0x7c, 0x2a, 0xfa, 0x1b, 0x15, 0x9d, 0xd9, 0xf1, 0x50, 0xd8, 0x8b, 0x4c, 0xac, 0x3e, 0xe6, 0xae, + 0x43, 0x91, 0x36, 0x72, 0xea, 0x3b, 0xd7, 0x98, 0x37, 0xd0, 0xc3, 0x22, 0x14, 0x7f, 0x61, 0x83, 0x98, 0xb2, 0x01, + 0x2b, 0x64, 0xec, 0x79, 0x04, 0x30, 0x4b, 0xf2, 0x45, 0x12, 0x78, 0xd3, 0xaf, 0x40, 0xbf, 0xc1, 0x7d, 0xb5, 0x6f, + 0x26, 0x4d, 0xb3, 0x70, 0x77, 0x63, 0xbf, 0x2f, 0x36, 0x72, 0x4f, 0x08, 0x22, 0x58, 0x92, 0xd9, 0xb2, 0x96, 0xde, + 0x03, 0x7e, 0xa5, 0xe0, 0x19, 0x78, 0xc8, 0x00, 0x8e, 0x98, 0x96, 0xb8, 0xae, 0xd6, 0x93, 0xab, 0xc3, 0x56, 0x6e, + 0x0b, 0x25, 0x38, 0x44, 0xd2, 0xe8, 0x96, 0x4a, 0xb3, 0x94, 0xee, 0x99, 0xad, 0xbb, 0x91, 0x71, 0xfc, 0x65, 0x50, + 0x9e, 0x58, 0x8f, 0x5f, 0x93, 0xc8, 0x96, 0x44, 0x14, 0x97, 0x5f, 0xe7, 0x90, 0xdd, 0x58, 0xa9, 0x98, 0x0c, 0x54, + 0x3d, 0x79, 0xaa, 0x09, 0xde, 0x60, 0x71, 0x17, 0x1c, 0xe9, 0x03, 0xed, 0x09, 0xc5, 0x49, 0xaa, 0x4a, 0xa9, 0x87, + 0x7e, 0xc2, 0x57, 0xd8, 0xe7, 0xa2, 0xb7, 0xd9, 0x31, 0xcd, 0xd8, 0x67, 0x34, 0xc1, 0x80, 0x3a, 0x09, 0x4e, 0xbb, + 0x66, 0x78, 0xe4, 0x48, 0x6c, 0x3a, 0x90, 0x8f, 0xf1, 0x54, 0xe8, 0x36, 0x6e, 0x56, 0x21, 0x8e, 0x86, 0xd0, 0xfd, + 0x30, 0x14, 0x46, 0x3f, 0xa3, 0x74, 0xac, 0x3e, 0xed, 0xd7, 0x5c, 0xd4, 0xce, 0x98, 0xa2, 0x29, 0x2f, 0xbb, 0xa6, + 0x00, 0x6f, 0xa4, 0xbc, 0xc1, 0x0a, 0xf8, 0xfe, 0xb2, 0x59, 0x57, 0x8f, 0x17, 0x36, 0xf9, 0x0f, 0xae, 0x83, 0x8d, + 0x84, 0x09, 0xfc, 0x11, 0x92, 0x99, 0x2d, 0x82, 0x35, 0x8c, 0xf3, 0x92, 0x58, 0x38, 0x7a, 0x9c, 0xef, 0x07, 0xd9, + 0x1f, 0x57, 0x8d, 0x07, 0x61, 0x0b, 0x0f, 0xad, 0xe4, 0x9c, 0xa8, 0xd7, 0xd4, 0xa9, 0x91, 0x0f, 0x22, 0x93, 0xc0, + 0x84, 0xf2, 0x3c, 0xc1, 0x34, 0xab, 0xb3, 0x59, 0x50, 0xdb, 0x44, 0xc5, 0xa0, 0xd0, 0x8d, 0xdb, 0x99, 0x20, 0xc9, + 0x86, 0xe0, 0x94, 0x97, 0x65, 0xc3, 0xed, 0x75, 0x6b, 0xe6, 0x45, 0xf3, 0xd7, 0x64, 0x87, 0xa5, 0xdf, 0x05, 0x1d, + 0x6b, 0xe3, 0xf5, 0x60, 0x7b, 0xd0, 0x79, 0x58, 0xbc, 0x50, 0x3a, 0x8d, 0xaa, 0x9b, 0x7a, 0x11, 0x37, 0xfb, 0x39, + 0x75, 0x35, 0xd1, 0x6c, 0x09, 0x48, 0x67, 0xa3, 0x7c, 0x8f, 0x9d, 0xb8, 0x46, 0x51, 0x5a, 0x4b, 0xab, 0x5b, 0xe6, + 0x1d, 0x8b, 0x91, 0xbb, 0x81, 0x51, 0x62, 0xed, 0x22, 0x86, 0x9a, 0x9f, 0xc3, 0xdc, 0x9e, 0x98, 0x40, 0x45, 0xff, + 0x3a, 0x9f, 0xcc, 0xec, 0x62, 0x9a, 0x4a, 0x32, 0xcc, 0x07, 0xa5, 0x6f, 0x89, 0xe6, 0xee, 0xf1, 0x9c, 0x93, 0xd2, + 0xb6, 0xad, 0x62, 0x1d, 0xba, 0x85, 0x81, 0x0f, 0x5c, 0x4d, 0x03, 0xc1, 0x15, 0xbd, 0xc5, 0x98, 0x67, 0xf0, 0x7c, + 0xc0, 0xec, 0x1b, 0x79, 0x3e, 0x2f, 0x45, 0xde, 0x3e, 0x91, 0x19, 0xbe, 0x50, 0xa0, 0x98, 0xde, 0xe9, 0x7c, 0x6f, + 0x9f, 0x87, 0x1b, 0x77, 0x59, 0xe0, 0xbe, 0x24, 0x0e, 0x19, 0xfe, 0x75, 0x17, 0x5b, 0xc6, 0x1a, 0xcf, 0x9c, 0xfb, + 0x2d, 0x89, 0x09, 0xa5, 0xda, 0xae, 0x1f, 0xa2, 0xbc, 0x16, 0x61, 0x52, 0x85, 0xa5, 0xdb, 0x2a, 0xa4, 0x32, 0xf4, + 0x45, 0xa4, 0x8a, 0xc7, 0x99, 0x9b, 0x9d, 0xa1, 0x34, 0x82, 0x0c, 0x05, 0x13, 0x64, 0xb5, 0x4f, 0xa2, 0x79, 0x56, + 0xf2, 0xa0, 0x4d, 0x13, 0xf9, 0xf0, 0xba, 0x2a, 0x63, 0xe1, 0x71, 0xe6, 0xde, 0x76, 0xc4, 0xdc, 0xba, 0x8e, 0xf3, + 0xea, 0x03, 0x75, 0x2b, 0x47, 0xe6, 0xb9, 0x62, 0x6c, 0xc5, 0xd8, 0x3d, 0xa8, 0x45, 0xa0, 0x0c, 0x45, 0x12, 0x0e, + 0x6c, 0x31, 0x7a, 0x7b, 0xa1, 0xce, 0x06, 0xc2, 0xad, 0xb2, 0x3e, 0xaa, 0xc5, 0x6b, 0xda, 0xb6, 0x52, 0x0a, 0x4e, + 0xa0, 0x10, 0x4e, 0x34, 0xf6, 0x9c, 0x0f, 0xff, 0xfc, 0x5c, 0xa7, 0x1e, 0xff, 0x99, 0x10, 0x9b, 0xfd, 0x97, 0xf7, + 0xaf, 0x63, 0x0a, 0xd0, 0xeb, 0x9e, 0x75, 0x45, 0x7a, 0xad, 0xeb, 0x35, 0xd2, 0xab, 0xaf, 0x57, 0xb5, 0x39, 0xe1, + 0x59, 0x2d, 0xb5, 0x51, 0x1b, 0x77, 0x6e, 0x14, 0xeb, 0x30, 0x94, 0x94, 0xd4, 0x7e, 0x4f, 0x4f, 0x3f, 0x8d, 0x55, + 0x99, 0x6f, 0xcd, 0xa4, 0x98, 0x4d, 0x5f, 0x1c, 0xab, 0xf5, 0xb8, 0x8c, 0x10, 0xbb, 0x17, 0x43, 0x6d, 0xa5, 0x3a, + 0x35, 0x75, 0x9b, 0xcf, 0x2f, 0xc6, 0xc5, 0xe5, 0xcb, 0xbf, 0x22, 0xc4, 0xf3, 0x11, 0xe3, 0xa1, 0x8d, 0x76, 0xde, + 0x37, 0x48, 0x8d, 0xcb, 0xcd, 0x11, 0xe7, 0x68, 0x56, 0x15, 0xc6, 0x88, 0xa7, 0x55, 0xe7, 0x2e, 0xb8, 0xf6, 0x20, + 0xf0, 0x73, 0x71, 0x55, 0xa9, 0x48, 0x52, 0xdf, 0x36, 0xb0, 0x2e, 0x37, 0x4b, 0x93, 0xc3, 0xdf, 0x0b, 0x2c, 0xe8, + 0x63, 0x53, 0x95, 0xeb, 0x07, 0x25, 0xc4, 0xd8, 0x29, 0x62, 0xca, 0xa9, 0xf4, 0x2e, 0xac, 0x7c, 0x51, 0x5f, 0x4f, + 0x99, 0xfa, 0x36, 0x88, 0x31, 0x8b, 0x31, 0x27, 0x4b, 0x31, 0x27, 0x79, 0x60, 0xfb, 0x3c, 0x06, 0xc6, 0xc5, 0x24, + 0x10, 0xf9, 0x70, 0xe3, 0xca, 0x58, 0xbe, 0x08, 0x18, 0xac, 0xa2, 0x0d, 0x04, 0xd3, 0x3b, 0x33, 0xed, 0xe2, 0x1f, + 0xf3, 0xcb, 0x41, 0x64, 0x5c, 0x89, 0x21, 0xac, 0x8e, 0xf8, 0xad, 0xd3, 0x0b, 0x64, 0x62, 0xe5, 0x8c, 0x66, 0x09, + 0x98, 0x75, 0xd3, 0x34, 0x38, 0x56, 0x4d, 0x83, 0x4a, 0x33, 0xaf, 0xb0, 0x0c, 0x24, 0x31, 0x30, 0x95, 0x6a, 0xf8, + 0x95, 0x16, 0x09, 0xce, 0xf9, 0xfb, 0xae, 0xcf, 0x29, 0x90, 0xc6, 0x99, 0x46, 0xa5, 0xc0, 0xe7, 0x0e, 0xf8, 0x05, + 0xfa, 0x15, 0x9f, 0x88, 0xe3, 0x34, 0xe9, 0x91, 0xc9, 0xe8, 0x81, 0xda, 0x81, 0x90, 0x59, 0x4b, 0x46, 0x61, 0x1a, + 0x42, 0x28, 0x05, 0x44, 0x7c, 0x3f, 0xcc, 0x45, 0x95, 0x35, 0xaf, 0xc6, 0x02, 0xb7, 0x10, 0x31, 0x23, 0xaa, 0x06, + 0x22, 0xc9, 0x48, 0xae, 0x1b, 0x32, 0x2c, 0x96, 0x26, 0x2d, 0xc6, 0xe0, 0x04, 0xc9, 0x3c, 0x9d, 0x08, 0xfe, 0x65, + 0x48, 0xc6, 0x05, 0x6f, 0x7a, 0xaf, 0x80, 0xbe, 0xc6, 0xc5, 0x64, 0xe7, 0xcd, 0xbc, 0xe8, 0x89, 0xb4, 0x5c, 0xe5, + 0x43, 0xa2, 0xd0, 0xdf, 0xd7, 0x7d, 0xef, 0x58, 0x3d, 0x48, 0xc1, 0xbc, 0x2d, 0x6a, 0x8b, 0x96, 0xed, 0xb5, 0x95, + 0xc7, 0x72, 0xdc, 0x3d, 0x4a, 0x50, 0x00, 0xdd, 0x66, 0xd1, 0x0a, 0x3c, 0x49, 0xd6, 0xd8, 0xa9, 0x4f, 0x44, 0x74, + 0x74, 0x1b, 0x25, 0xb3, 0x23, 0x5b, 0x17, 0x3f, 0x90, 0x91, 0xe4, 0xcc, 0x5c, 0x89, 0xce, 0xff, 0x59, 0xf2, 0x26, + 0x17, 0x33, 0x5b, 0x75, 0xc8, 0x01, 0x6e, 0x3a, 0x13, 0x61, 0x8a, 0xf6, 0x56, 0x66, 0x23, 0x44, 0x86, 0x93, 0x49, + 0x16, 0x64, 0xea, 0xc5, 0x5f, 0x8c, 0x14, 0xfc, 0x47, 0xc4, 0x86, 0x96, 0x3c, 0xd2, 0xff, 0x70, 0x0d, 0xe1, 0x5b, + 0x39, 0x1c, 0x24, 0xd5, 0x7b, 0x2d, 0xb8, 0x2d, 0x2d, 0x1b, 0x66, 0x83, 0x24, 0x3c, 0x3e, 0xbb, 0x7c, 0xe6, 0xdb, + 0x83, 0xfc, 0x43, 0x44, 0x08, 0x84, 0xfa, 0xdf, 0xf4, 0xaa, 0x76, 0xf1, 0x32, 0x2a, 0x4e, 0x83, 0xf2, 0xf5, 0xf8, + 0x8c, 0xc3, 0x1b, 0x2a, 0x2f, 0xe0, 0xb7, 0x6f, 0xe7, 0x1c, 0x98, 0x81, 0x2f, 0x63, 0xab, 0xb1, 0x80, 0xbd, 0x70, + 0xd8, 0x63, 0x28, 0x59, 0xc4, 0xa1, 0xed, 0x6c, 0x84, 0xdb, 0xd0, 0xf5, 0x36, 0xdb, 0xaf, 0x94, 0x72, 0x75, 0xc6, + 0xf9, 0x3b, 0xdb, 0xaa, 0xe6, 0x66, 0xd7, 0x0d, 0x5b, 0x2a, 0xe9, 0x69, 0x5f, 0x6e, 0x30, 0x75, 0x43, 0xf6, 0x36, + 0xd4, 0x5a, 0xbe, 0x19, 0xd6, 0x95, 0x37, 0x0b, 0x83, 0x42, 0xc0, 0x98, 0x61, 0xcd, 0x15, 0xb9, 0xd6, 0xca, 0x7e, + 0x30, 0xc5, 0xfe, 0x30, 0x08, 0x89, 0xa8, 0x8a, 0x24, 0x67, 0x83, 0x1e, 0xe7, 0x6a, 0xed, 0x59, 0x3d, 0x02, 0x4b, + 0x27, 0x96, 0x63, 0xcd, 0x0a, 0x06, 0x43, 0xa9, 0xaa, 0xd5, 0x52, 0x77, 0xb8, 0x4a, 0x9f, 0x6a, 0x79, 0xc5, 0x0b, + 0x12, 0xf6, 0x0b, 0x88, 0x4e, 0x7c, 0x77, 0xf7, 0x24, 0xf2, 0x9d, 0x59, 0x7d, 0x63, 0x2a, 0x4d, 0x94, 0x67, 0xc5, + 0x0a, 0x4a, 0xd6, 0x3b, 0xc0, 0x50, 0x51, 0x63, 0x6c, 0xe8, 0x0e, 0x0d, 0xd6, 0xe6, 0x38, 0xdc, 0x17, 0xf6, 0xdb, + 0x82, 0xec, 0x47, 0xfd, 0x9c, 0x93, 0xfb, 0x68, 0xb3, 0xa8, 0x97, 0xf5, 0x56, 0x63, 0xe4, 0x08, 0xaf, 0x37, 0x27, + 0x55, 0xb6, 0xa0, 0xc9, 0x5e, 0x83, 0xd3, 0x4b, 0x33, 0x75, 0xa1, 0xec, 0xc4, 0x8c, 0x28, 0xd3, 0x41, 0x24, 0x09, + 0xba, 0xb3, 0x1e, 0x04, 0xd7, 0x2c, 0x0b, 0x6b, 0x93, 0x91, 0x7b, 0x30, 0x9c, 0x23, 0x15, 0xd1, 0x25, 0x14, 0xc5, + 0x39, 0x9b, 0xd7, 0x3f, 0x30, 0xe4, 0x28, 0x8f, 0xc5, 0xb2, 0x64, 0x41, 0xbd, 0x6f, 0x61, 0xa4, 0x26, 0xfb, 0x74, + 0x2c, 0xa5, 0x90, 0x1d, 0xc0, 0xc6, 0x8e, 0xb6, 0x73, 0xc1, 0x9c, 0xda, 0xba, 0x04, 0x3b, 0xd9, 0xa9, 0xb9, 0x5b, + 0x91, 0x01, 0x91, 0x07, 0x42, 0x14, 0x06, 0x7c, 0x7f, 0x5e, 0x11, 0xc0, 0x9a, 0xe3, 0x14, 0x89, 0x3f, 0x08, 0xe3, + 0x97, 0x1f, 0x14, 0x83, 0x84, 0xe5, 0xae, 0xe7, 0x70, 0xfa, 0x3a, 0x80, 0x56, 0xea, 0xc5, 0xe6, 0x7b, 0x26, 0xca, + 0x46, 0xfe, 0x2a, 0xd6, 0x3a, 0x62, 0x88, 0x70, 0xe0, 0xcb, 0x66, 0x43, 0xd2, 0x78, 0xb3, 0x5c, 0x9c, 0x8d, 0x9a, + 0xae, 0xab, 0x23, 0xee, 0x23, 0x15, 0x84, 0xb1, 0xd9, 0xf0, 0xd0, 0x8d, 0xf3, 0x43, 0xd6, 0x6e, 0x06, 0x87, 0x41, + 0x04, 0x7e, 0x6d, 0xba, 0x56, 0x97, 0x70, 0xb5, 0xa6, 0x99, 0x78, 0x2f, 0xce, 0xa6, 0xfb, 0xba, 0xd7, 0x35, 0xc2, + 0xbf, 0x5c, 0xe2, 0x80, 0xf9, 0x37, 0x52, 0xc5, 0x41, 0x8b, 0x39, 0x7a, 0x8d, 0x4b, 0x9a, 0xe9, 0xa9, 0x21, 0x77, + 0x57, 0xca, 0x7b, 0x28, 0x07, 0xaa, 0x63, 0x3c, 0x3d, 0x64, 0x37, 0x87, 0x5b, 0x80, 0xda, 0x8e, 0x10, 0x57, 0x06, + 0xea, 0x09, 0x80, 0x2b, 0x09, 0x84, 0x65, 0x1e, 0xcf, 0x90, 0xbe, 0x67, 0xd2, 0x09, 0x68, 0xe8, 0x40, 0xb9, 0xe9, + 0x49, 0x99, 0x43, 0xea, 0xa1, 0x0e, 0x52, 0x4c, 0x78, 0xd0, 0xcb, 0xae, 0x96, 0xea, 0x3a, 0x1a, 0x21, 0x69, 0x42, + 0x41, 0xfc, 0x82, 0xa0, 0xe8, 0xab, 0x21, 0xf2, 0x97, 0x89, 0xca, 0xba, 0xaa, 0xf0, 0x06, 0xff, 0x12, 0x2d, 0xb2, + 0xfa, 0xce, 0xcc, 0xec, 0x48, 0x5d, 0x56, 0xa2, 0xf6, 0x02, 0xb0, 0x0e, 0x87, 0xe0, 0x40, 0x22, 0x62, 0x9e, 0x44, + 0x13, 0xd9, 0x54, 0x28, 0x7f, 0xe6, 0xd0, 0x28, 0x80, 0xcb, 0x79, 0x24, 0x68, 0x22, 0xf0, 0xb1, 0x13, 0xe0, 0xcc, + 0x0c, 0x3c, 0x9c, 0xad, 0x26, 0x8d, 0xc0, 0x98, 0x6b, 0xe5, 0xa5, 0x66, 0x1f, 0x33, 0xa2, 0x1c, 0x17, 0x73, 0x23, + 0xbb, 0x6b, 0xf2, 0x70, 0x88, 0x79, 0x62, 0x63, 0x0e, 0xdf, 0xd7, 0x9e, 0x19, 0xd3, 0xbf, 0xcc, 0xc0, 0x27, 0x25, + 0xea, 0x4e, 0x0d, 0x8a, 0xd7, 0xed, 0x9d, 0xd7, 0x56, 0xbb, 0x86, 0x5c, 0x16, 0x1d, 0x06, 0xab, 0xb5, 0xff, 0xd7, + 0x7f, 0x8a, 0xe3, 0xbe, 0x72, 0x3e, 0x06, 0x57, 0x3c, 0x04, 0x87, 0x35, 0x43, 0xcd, 0xaf, 0xeb, 0xe2, 0x39, 0x3e, + 0x6d, 0x1f, 0xe6, 0xc6, 0xd3, 0xdd, 0x81, 0x97, 0xb9, 0x90, 0xfa, 0xcc, 0x12, 0xa2, 0x0f, 0x43, 0x8b, 0x67, 0x63, + 0x54, 0x89, 0xc6, 0x97, 0x0e, 0x29, 0x96, 0x2d, 0x9e, 0xee, 0x04, 0xe2, 0xe5, 0x70, 0x77, 0xb6, 0x40, 0xac, 0x28, + 0x11, 0xe6, 0x74, 0x22, 0xd2, 0x38, 0x02, 0xc6, 0x2b, 0xf1, 0xc0, 0x10, 0x18, 0x69, 0x94, 0x59, 0xd3, 0xfe, 0xb0, + 0x11, 0xd9, 0xe7, 0x90, 0x68, 0x32, 0x6c, 0xca, 0x3b, 0x9b, 0x51, 0x7b, 0x25, 0x12, 0x8a, 0x86, 0x75, 0xdf, 0x4d, + 0x33, 0x2a, 0xef, 0xc5, 0x38, 0x24, 0x0e, 0xe1, 0xa4, 0x77, 0x3f, 0x6d, 0x1f, 0x4a, 0x1e, 0x7e, 0x0e, 0xfb, 0xc3, + 0x0f, 0xfe, 0xe1, 0xe7, 0x70, 0x77, 0x7e, 0xf0, 0x9d, 0x9f, 0x43, 0xde, 0xf9, 0x41, 0xbc, 0x54, 0x9a, 0xbe, 0xd2, + 0x9e, 0x07, 0x63, 0xc5, 0x50, 0x2e, 0xcb, 0xc8, 0x56, 0xaa, 0xe0, 0x17, 0x3f, 0x24, 0xdc, 0xe7, 0x12, 0x29, 0x39, + 0x25, 0x2e, 0x58, 0x89, 0x4a, 0x56, 0x86, 0x4e, 0x81, 0x7d, 0x1a, 0xd0, 0xc3, 0xea, 0xed, 0xe7, 0xfc, 0xcb, 0x6d, + 0x50, 0x74, 0x26, 0xe2, 0x01, 0x24, 0x43, 0xb9, 0x33, 0x07, 0x2f, 0x4c, 0x49, 0x18, 0x65, 0x39, 0x62, 0xb4, 0xa2, + 0xd2, 0x8e, 0xb3, 0x44, 0xef, 0xdc, 0x01, 0x16, 0x82, 0xbe, 0x5d, 0xe8, 0xb5, 0x72, 0x58, 0x7f, 0xff, 0x05, 0x28, + 0x55, 0x57, 0x0c, 0x78, 0x60, 0x1f, 0x7b, 0x71, 0x1f, 0x69, 0xe5, 0xd5, 0xa4, 0x8a, 0x1a, 0x5c, 0x93, 0x83, 0x31, + 0x46, 0x48, 0xdc, 0xd3, 0xbf, 0x64, 0x4d, 0x72, 0xe6, 0xe6, 0xad, 0x66, 0xe1, 0x1e, 0xa3, 0xe7, 0x80, 0xe6, 0xc4, + 0xa8, 0x9a, 0x19, 0xb6, 0x88, 0x5a, 0xb3, 0x9a, 0x33, 0x8b, 0x38, 0x59, 0x8a, 0xad, 0xab, 0xb0, 0xe7, 0x3d, 0x7e, + 0xca, 0xef, 0xe0, 0x2a, 0x37, 0x43, 0x1a, 0xec, 0x8b, 0x0c, 0xec, 0x83, 0x2b, 0x6c, 0x6b, 0x0d, 0xa6, 0x27, 0x9c, + 0xad, 0xc5, 0xf5, 0xd5, 0x14, 0xbe, 0x20, 0xad, 0xa1, 0x2d, 0x45, 0x34, 0xba, 0x4b, 0x26, 0x36, 0x52, 0xda, 0xfa, + 0xe1, 0x6b, 0x0b, 0x8d, 0x36, 0x2b, 0x96, 0x60, 0xc9, 0xee, 0x37, 0x2f, 0xb9, 0x0f, 0x4d, 0xe6, 0x2c, 0xc8, 0x44, + 0xd5, 0x4d, 0x90, 0x36, 0x05, 0xbe, 0x38, 0x59, 0x61, 0x3c, 0x02, 0x59, 0xe4, 0x36, 0x17, 0x87, 0x53, 0x47, 0x2d, + 0xa3, 0xaa, 0x84, 0x48, 0x7d, 0x56, 0xae, 0x93, 0x4b, 0xd0, 0xf1, 0xe2, 0x40, 0x04, 0x97, 0xc3, 0x84, 0x54, 0x6a, + 0x3a, 0x6d, 0xd7, 0x68, 0x6f, 0x21, 0xcf, 0xa1, 0x4e, 0x3f, 0x0d, 0x36, 0x84, 0x21, 0xaa, 0x31, 0xf8, 0x32, 0xf3, + 0xf4, 0x9a, 0x2e, 0x4d, 0xdb, 0xc7, 0x01, 0x04, 0x7a, 0xb1, 0x3d, 0x95, 0xce, 0x5d, 0x9f, 0x92, 0x48, 0x20, 0x91, + 0xf8, 0x02, 0xe0, 0x03, 0x80, 0xaf, 0x7a, 0x89, 0xaa, 0x45, 0x26, 0xbd, 0x54, 0x81, 0x9e, 0x29, 0xb8, 0x03, 0x32, + 0x43, 0x2b, 0x40, 0xe5, 0x8f, 0x48, 0xf1, 0xb5, 0x43, 0xb2, 0x98, 0xf0, 0xd2, 0x50, 0xbc, 0x8e, 0x09, 0xed, 0x7c, + 0x98, 0x9a, 0x5e, 0x22, 0x77, 0x81, 0x94, 0x8e, 0xd8, 0xa2, 0x9f, 0xbe, 0x3c, 0xbb, 0x69, 0xe1, 0x24, 0x8f, 0x2c, + 0xbf, 0xd6, 0xfe, 0x2d, 0x6b, 0xdb, 0x55, 0xf5, 0x47, 0xa6, 0xa4, 0x0e, 0xb4, 0x21, 0x94, 0xeb, 0x99, 0xb2, 0xa7, + 0xf4, 0x15, 0xec, 0x2c, 0x86, 0x45, 0xaf, 0x2d, 0xb3, 0xdd, 0x1c, 0x3e, 0x74, 0xd1, 0x03, 0xd1, 0x84, 0xdb, 0xd7, + 0x48, 0xa0, 0xb9, 0x44, 0xb0, 0x18, 0x9e, 0xe1, 0xd2, 0x6e, 0xfc, 0x92, 0x53, 0x14, 0xc4, 0x2a, 0xf0, 0x21, 0x7d, + 0xff, 0x01, 0x43, 0x86, 0xb2, 0xdd, 0x86, 0xc3, 0x55, 0x0d, 0x34, 0x5f, 0xf7, 0x71, 0xd8, 0xab, 0x13, 0xb0, 0xb6, + 0x64, 0xbe, 0xda, 0xb4, 0x51, 0xec, 0x35, 0x97, 0xa7, 0xbd, 0xb6, 0x52, 0xe0, 0xcf, 0xc5, 0x47, 0x7f, 0x7b, 0x5e, + 0xd4, 0x2c, 0xcb, 0x8b, 0xd2, 0x7b, 0x5b, 0xd5, 0xec, 0xb4, 0x06, 0xa3, 0x3f, 0x4e, 0x85, 0x90, 0x58, 0x0e, 0x93, + 0xd2, 0xf3, 0xd1, 0xa8, 0x16, 0xbb, 0xd7, 0x64, 0x1e, 0x1f, 0x26, 0xa1, 0x9a, 0x4d, 0x8d, 0x3c, 0xb8, 0xd7, 0x9b, + 0x0b, 0x7d, 0x8f, 0x02, 0xd5, 0xbd, 0x16, 0x4e, 0xd5, 0x55, 0x29, 0x41, 0x4c, 0x46, 0x46, 0x33, 0xcd, 0xc6, 0xbc, + 0x0c, 0xdc, 0x9a, 0xa9, 0x7e, 0x41, 0x9f, 0x48, 0xc9, 0x61, 0xd8, 0x59, 0x59, 0x94, 0x8a, 0x49, 0x4a, 0x00, 0x8b, + 0xed, 0x67, 0x71, 0x72, 0x60, 0x50, 0xb5, 0xea, 0x3c, 0x60, 0x24, 0x8e, 0xc5, 0xe2, 0x23, 0x50, 0xf1, 0x5b, 0x07, + 0xa8, 0x12, 0x4e, 0x8f, 0x55, 0x71, 0x1e, 0x7e, 0x10, 0xa5, 0x52, 0x4f, 0x40, 0xa0, 0xa6, 0x4e, 0x5e, 0xe6, 0x5e, + 0xb0, 0x7c, 0x33, 0xa7, 0x8d, 0xbd, 0x30, 0x2b, 0x1d, 0x90, 0x6b, 0xd3, 0x48, 0x0c, 0x45, 0xfc, 0x93, 0x63, 0xe3, + 0x36, 0xba, 0xb0, 0xea, 0x85, 0xe5, 0x5e, 0x54, 0x07, 0xa1, 0x41, 0xe8, 0x90, 0xa7, 0xca, 0x6d, 0x19, 0xd6, 0xe7, + 0x81, 0x97, 0x27, 0xfd, 0x0b, 0x4f, 0x0f, 0x36, 0x3d, 0xfc, 0x80, 0x45, 0x2b, 0x89, 0x34, 0x54, 0xb1, 0x49, 0xe1, + 0x8e, 0x48, 0x95, 0xe5, 0xce, 0xd3, 0x1e, 0xdd, 0x6b, 0x33, 0x0f, 0xd2, 0xd5, 0x47, 0x05, 0x45, 0x6b, 0x68, 0x09, + 0xa5, 0x2e, 0x60, 0x0a, 0xa3, 0x2c, 0xde, 0xe9, 0xab, 0xf5, 0x93, 0x5d, 0x4a, 0xc2, 0x01, 0x1f, 0xc3, 0x60, 0x26, + 0xf0, 0xef, 0x87, 0x48, 0x07, 0x37, 0xb5, 0x6e, 0x85, 0x32, 0x86, 0xb4, 0x42, 0x30, 0x1f, 0x49, 0x74, 0x98, 0xe0, + 0xfb, 0xc1, 0xa4, 0xc8, 0x49, 0xc1, 0x46, 0xe3, 0x37, 0xe3, 0x1a, 0x43, 0xc7, 0x99, 0xf1, 0x9d, 0x9f, 0xae, 0xd8, + 0xdb, 0x72, 0x5c, 0x1d, 0x42, 0xc0, 0xe5, 0x58, 0xee, 0x75, 0x5d, 0x90, 0x75, 0x8c, 0x76, 0x14, 0x3e, 0x23, 0x71, + 0xa9, 0x0b, 0x3d, 0xa5, 0xda, 0x91, 0x33, 0x86, 0x25, 0x38, 0x5d, 0xcd, 0x9f, 0xd8, 0xc6, 0x15, 0xb4, 0xed, 0xec, + 0x34, 0x50, 0xb7, 0x57, 0xc0, 0x83, 0x5d, 0x63, 0x4a, 0x94, 0x25, 0x56, 0x05, 0x34, 0x18, 0x01, 0x6d, 0x59, 0x60, + 0x54, 0x13, 0x31, 0xd1, 0x28, 0x8c, 0x12, 0xa9, 0xa5, 0x94, 0x1d, 0xcb, 0x1f, 0x75, 0x92, 0x4c, 0x92, 0x75, 0x28, + 0x4e, 0x7a, 0x62, 0x92, 0xd4, 0x6a, 0x5d, 0xb6, 0x78, 0x79, 0x21, 0xf6, 0x8b, 0x54, 0x7a, 0x62, 0xef, 0xa0, 0x05, + 0x72, 0xb3, 0xef, 0x69, 0x48, 0x0d, 0x8d, 0xce, 0xf6, 0x46, 0xe7, 0xe5, 0xa9, 0x6c, 0xbe, 0xd5, 0x51, 0xcb, 0xf8, + 0xc6, 0x98, 0xa2, 0x0a, 0xa8, 0x3f, 0xd6, 0x82, 0xf4, 0xfd, 0x4b, 0xb1, 0xce, 0x50, 0x34, 0x4c, 0x5d, 0xf6, 0x58, + 0x8c, 0x74, 0x9d, 0xe6, 0x89, 0x90, 0xe0, 0xde, 0x1d, 0x18, 0x78, 0x44, 0x99, 0x3b, 0x19, 0xd3, 0x09, 0xc2, 0x10, + 0x91, 0x75, 0xb2, 0xe6, 0x7d, 0x6e, 0xfd, 0x7c, 0x14, 0x87, 0x61, 0x0c, 0x1b, 0x4c, 0xae, 0xf6, 0x53, 0x7a, 0xef, + 0xc7, 0x62, 0xa4, 0x76, 0x9d, 0xd9, 0xcd, 0x78, 0x61, 0xa9, 0x3d, 0x16, 0xf6, 0x3f, 0x64, 0x3e, 0xf5, 0x58, 0xe9, + 0xbd, 0xb4, 0x86, 0x34, 0x9e, 0x59, 0x63, 0xd5, 0x5f, 0x82, 0x76, 0xe4, 0x12, 0xed, 0xc4, 0x4e, 0xa9, 0x2a, 0x48, + 0x28, 0x48, 0x8c, 0xa9, 0xed, 0x1c, 0x0c, 0x34, 0x63, 0x9d, 0xb9, 0x63, 0x8b, 0xbe, 0x3d, 0xe5, 0xa4, 0x1c, 0xa0, + 0xbc, 0x14, 0xfe, 0xd9, 0x76, 0x50, 0x62, 0x1f, 0xc7, 0x18, 0x5b, 0x81, 0x7d, 0x48, 0x20, 0x55, 0xc1, 0x84, 0x56, + 0x93, 0x07, 0x74, 0x71, 0x4a, 0xc7, 0x9f, 0x19, 0xe6, 0x4f, 0xb0, 0xfa, 0x9a, 0x27, 0xb6, 0xd9, 0x85, 0x63, 0x4c, + 0xa9, 0xd7, 0xd9, 0x11, 0xeb, 0xa7, 0x74, 0x61, 0x8b, 0xb5, 0x31, 0xa4, 0x6c, 0xc9, 0xd6, 0xb5, 0x45, 0xc8, 0x84, + 0x21, 0xeb, 0x3a, 0x52, 0x71, 0x03, 0xe7, 0x37, 0xe4, 0x02, 0x5e, 0xef, 0xe7, 0x5c, 0xa9, 0x67, 0x11, 0xcd, 0x32, + 0x41, 0xbb, 0x04, 0x72, 0xa4, 0xf3, 0xa2, 0xfe, 0xbf, 0x95, 0x10, 0xa2, 0x4b, 0x6b, 0xba, 0x2d, 0xa1, 0x4e, 0xf2, + 0xd9, 0x59, 0xb4, 0x80, 0xc7, 0x6e, 0x94, 0x1b, 0xe7, 0xb1, 0xb4, 0x09, 0x9e, 0x0d, 0x22, 0x81, 0x0d, 0xcb, 0x29, + 0x51, 0x0d, 0xab, 0xad, 0xee, 0x7a, 0x18, 0x9f, 0xdd, 0xde, 0x28, 0xc4, 0x50, 0x61, 0xf6, 0x77, 0xa0, 0xa4, 0xe2, + 0x5e, 0x97, 0xd4, 0x3a, 0x2a, 0xff, 0x1b, 0xa5, 0x0d, 0x41, 0xe1, 0x8b, 0x9b, 0x82, 0x1d, 0xdc, 0xeb, 0x9e, 0x1a, + 0x8a, 0xfd, 0xfd, 0x42, 0x85, 0x69, 0xa7, 0x0f, 0xca, 0x04, 0x4d, 0x78, 0x0b, 0x72, 0x39, 0xf2, 0xfd, 0x6c, 0x2a, + 0xbf, 0xc8, 0x2f, 0x7d, 0x7b, 0x6d, 0x08, 0x5b, 0xd1, 0x4a, 0x2b, 0x56, 0x47, 0xf9, 0x61, 0x78, 0x13, 0xb7, 0x45, + 0x06, 0x45, 0x7d, 0x5e, 0x63, 0xef, 0x90, 0xaa, 0xc4, 0x6e, 0x7b, 0xe2, 0x06, 0x61, 0x39, 0xe9, 0x12, 0x5c, 0x58, + 0x23, 0x11, 0xa3, 0xd4, 0x9c, 0xe1, 0x54, 0x8b, 0xda, 0xc2, 0x72, 0xae, 0xd5, 0x11, 0x15, 0x10, 0xaa, 0xef, 0xa9, + 0x52, 0xd6, 0xc0, 0xb0, 0x77, 0x9e, 0x86, 0xc1, 0xcb, 0xb1, 0xab, 0x6b, 0xe5, 0xe8, 0x34, 0x5d, 0xf7, 0xb4, 0x40, + 0x81, 0x36, 0xa5, 0xb7, 0x76, 0x59, 0x8e, 0xb7, 0xea, 0x02, 0x17, 0x43, 0x0b, 0x9e, 0x3b, 0xef, 0x00, 0xbe, 0x4a, + 0x1e, 0x29, 0x3c, 0x58, 0xba, 0x76, 0x05, 0xb4, 0x30, 0x99, 0x04, 0x1e, 0x9c, 0xc5, 0x5a, 0x25, 0x6b, 0x51, 0xe1, + 0x35, 0x21, 0x0c, 0xc8, 0x59, 0x1f, 0x6c, 0xbb, 0x31, 0x72, 0x89, 0xda, 0xeb, 0x47, 0x1a, 0x5a, 0x64, 0xfd, 0xa0, + 0x49, 0xcf, 0x03, 0x45, 0xe5, 0xa8, 0x7a, 0x77, 0xa7, 0x8c, 0xbe, 0xc4, 0x3c, 0x61, 0xd4, 0x27, 0x06, 0x8d, 0xf4, + 0x85, 0x3a, 0x22, 0xe4, 0xfc, 0xc4, 0x66, 0xcd, 0x57, 0xfb, 0xf0, 0x9e, 0x10, 0xc6, 0x6a, 0xd3, 0x91, 0xcf, 0x13, + 0x68, 0xcf, 0x96, 0xae, 0x5f, 0xd4, 0x90, 0xe1, 0xb5, 0xe9, 0x72, 0x48, 0xc6, 0x82, 0xa7, 0x66, 0x08, 0x83, 0x5a, + 0xc9, 0x38, 0x4d, 0xec, 0x73, 0x16, 0x26, 0xd2, 0x55, 0xb9, 0x86, 0x00, 0xd7, 0x2f, 0x9c, 0x49, 0xb3, 0xd8, 0x72, + 0x8b, 0x92, 0xd1, 0xa5, 0x26, 0xc4, 0x16, 0x4d, 0x44, 0x06, 0x00, 0xbd, 0x1c, 0xf6, 0x11, 0x90, 0xf0, 0x6d, 0xc2, + 0xb9, 0x79, 0x62, 0x4b, 0x1b, 0xd7, 0x5c, 0x50, 0x18, 0xee, 0xe8, 0xc9, 0x5e, 0x6c, 0x2a, 0x62, 0xcf, 0x60, 0x1e, + 0x9a, 0x8d, 0x65, 0x36, 0x7f, 0xe4, 0xa7, 0xe3, 0x50, 0x0c, 0xa4, 0xff, 0xc0, 0x82, 0xf8, 0x9f, 0xa1, 0x42, 0x5c, + 0x71, 0x41, 0xfe, 0x80, 0x2b, 0x69, 0xf8, 0x82, 0x74, 0x3b, 0x9d, 0xf9, 0xd9, 0xf4, 0xa9, 0x5a, 0x40, 0x50, 0x1e, + 0x08, 0x85, 0x34, 0x17, 0x90, 0xc6, 0x0b, 0x1c, 0x58, 0x2f, 0xec, 0x90, 0x04, 0xb6, 0x9e, 0x8e, 0x64, 0xd2, 0x48, + 0xa7, 0x78, 0xe0, 0x53, 0xbd, 0xb6, 0x3f, 0xd5, 0x31, 0xa5, 0x37, 0xe5, 0x69, 0xd3, 0x3c, 0x15, 0x0f, 0x3d, 0x6b, + 0xab, 0x08, 0x13, 0x06, 0x4f, 0x85, 0x13, 0x5e, 0xef, 0xe9, 0x5a, 0xbb, 0x86, 0xaf, 0xe0, 0x8b, 0x9e, 0x0d, 0xe6, + 0xc2, 0xe6, 0x5a, 0x24, 0xe8, 0x20, 0x4c, 0x17, 0x3e, 0x3e, 0xc2, 0xc8, 0x74, 0x29, 0xbd, 0xa2, 0x1f, 0x0d, 0x0a, + 0xc5, 0xdb, 0xf5, 0x87, 0xf6, 0x2e, 0x82, 0x83, 0xb3, 0x05, 0xd9, 0x98, 0x76, 0x07, 0x20, 0x0f, 0x69, 0x51, 0xd5, + 0x18, 0x23, 0xa4, 0x42, 0x1c, 0x43, 0xc4, 0xe9, 0xf6, 0x55, 0x5b, 0x1e, 0xba, 0xe5, 0x97, 0x3c, 0x23, 0xff, 0x5e, + 0xfc, 0x99, 0xf9, 0xae, 0x6f, 0xd0, 0x15, 0xd7, 0x79, 0x0e, 0xf1, 0xbd, 0xdf, 0xb5, 0x46, 0x42, 0x94, 0x84, 0x7f, + 0x0c, 0x1e, 0x20, 0x66, 0x3c, 0x58, 0x03, 0xf6, 0xbc, 0xba, 0x91, 0x93, 0xe0, 0xbe, 0x60, 0xe8, 0x6d, 0xf3, 0xb5, + 0x7e, 0x3c, 0x26, 0xf1, 0x16, 0x6d, 0x11, 0xbb, 0x52, 0x07, 0x33, 0x76, 0xe2, 0x9c, 0x0f, 0x93, 0xd9, 0x7f, 0x8c, + 0xb0, 0xc0, 0x11, 0x0a, 0x6a, 0x2d, 0xfc, 0xb2, 0x15, 0xc0, 0xad, 0xfe, 0x83, 0x91, 0x02, 0x37, 0xd1, 0x13, 0x3f, + 0xdb, 0x3d, 0xc5, 0x26, 0x38, 0x11, 0x7b, 0x45, 0x6c, 0xcf, 0x81, 0x5a, 0xad, 0x6a, 0x0a, 0xd5, 0xad, 0xd3, 0x41, + 0xe8, 0x62, 0x51, 0x98, 0xeb, 0x75, 0x14, 0xf8, 0xac, 0x5a, 0x56, 0x1d, 0x86, 0x6c, 0x57, 0xa1, 0xf6, 0x24, 0x1b, + 0x16, 0x25, 0x2a, 0x72, 0xe3, 0x78, 0x53, 0xac, 0x03, 0xea, 0xb7, 0x7a, 0x6d, 0x82, 0x5b, 0x2f, 0x78, 0x74, 0x2c, + 0xc8, 0xb5, 0x14, 0x31, 0x78, 0x82, 0xc8, 0xe0, 0x55, 0xb9, 0x40, 0x07, 0xbd, 0x74, 0x5f, 0x37, 0x1f, 0x5a, 0xe3, + 0xe9, 0x6e, 0x1a, 0x3e, 0xfb, 0xb9, 0xf7, 0xd6, 0x88, 0xed, 0x9a, 0x31, 0x32, 0x2e, 0x92, 0x16, 0x3d, 0x75, 0x8d, + 0xcb, 0x35, 0x98, 0x3d, 0xb4, 0x3a, 0x66, 0x98, 0xbf, 0x5c, 0x69, 0x31, 0xc6, 0xef, 0x44, 0x31, 0xed, 0x41, 0x37, + 0x2b, 0xc4, 0x3d, 0xbd, 0x60, 0xc0, 0x5a, 0x4b, 0xbc, 0x69, 0xf5, 0x56, 0x5b, 0x9f, 0x2d, 0xcb, 0x20, 0xfa, 0x46, + 0x53, 0xbe, 0x9b, 0x85, 0x2c, 0x97, 0x29, 0xd6, 0x68, 0x13, 0xf6, 0xe5, 0x72, 0x6f, 0x37, 0xb6, 0x95, 0xf1, 0x6f, + 0x51, 0xf5, 0x64, 0x48, 0x24, 0x2d, 0x51, 0x2a, 0x15, 0x38, 0xe9, 0xc2, 0x10, 0x6b, 0x3a, 0x6a, 0xb9, 0x4e, 0x82, + 0xf9, 0xbe, 0x3b, 0x75, 0x58, 0xfe, 0xf8, 0x9c, 0x17, 0x69, 0xe5, 0x93, 0x22, 0xf6, 0xd9, 0xe1, 0x62, 0x42, 0x39, + 0x85, 0x33, 0xb2, 0xfb, 0x6f, 0x78, 0xb5, 0x2b, 0x80, 0x9a, 0x60, 0xf4, 0x72, 0xc9, 0xd5, 0x50, 0x94, 0x7e, 0x3a, + 0x19, 0xa6, 0x20, 0xac, 0xaf, 0xd6, 0xc2, 0x6b, 0xaf, 0x48, 0x74, 0x89, 0xbf, 0x92, 0x5e, 0x1a, 0x82, 0xa4, 0xed, + 0x50, 0x5f, 0xd5, 0x25, 0x08, 0x74, 0x88, 0x57, 0x12, 0xe0, 0x66, 0xde, 0x82, 0x26, 0x13, 0x19, 0x17, 0x6f, 0x5c, + 0x00, 0x17, 0xc6, 0xdb, 0xa7, 0x1b, 0x48, 0xd6, 0x5a, 0x62, 0x27, 0xa1, 0x9b, 0x5e, 0x1a, 0x9c, 0x00, 0x09, 0x76, + 0x3c, 0x81, 0x26, 0xef, 0x84, 0xcf, 0x5c, 0xaf, 0x26, 0xa6, 0x20, 0x88, 0xe8, 0xde, 0x73, 0xb0, 0x9b, 0xeb, 0x59, + 0x56, 0xd8, 0x84, 0xd8, 0xec, 0xa8, 0xfa, 0x7e, 0xaa, 0xc0, 0xeb, 0xa5, 0x49, 0xc5, 0x46, 0xa1, 0xeb, 0xe4, 0x0e, + 0xc7, 0x01, 0xa6, 0xb3, 0xe4, 0x50, 0xc3, 0x95, 0x8f, 0x65, 0x39, 0x49, 0x09, 0x2d, 0x85, 0x03, 0xce, 0x40, 0x72, + 0xf0, 0x3f, 0x96, 0x74, 0x90, 0x75, 0xf8, 0x89, 0x69, 0x0b, 0xfe, 0x4c, 0x5a, 0xd3, 0xb4, 0x88, 0x56, 0x7b, 0x1d, + 0x6b, 0xd0, 0xbc, 0x4a, 0x9e, 0x4f, 0x0c, 0x60, 0xb3, 0x5a, 0xc8, 0xea, 0xc7, 0x5e, 0x5b, 0xfe, 0x48, 0xf9, 0x29, + 0x0b, 0xb5, 0xa7, 0x7a, 0x6c, 0x85, 0x64, 0xa7, 0x69, 0x51, 0x11, 0xc5, 0xf5, 0x64, 0xbb, 0x21, 0x7e, 0xf8, 0x22, + 0x11, 0x94, 0x4b, 0x05, 0xc4, 0x90, 0x00, 0x04, 0x83, 0x19, 0xd4, 0x90, 0xd0, 0x51, 0x5f, 0x6f, 0x9e, 0x8e, 0x7b, + 0x08, 0x34, 0x4f, 0x85, 0x02, 0x62, 0xba, 0x62, 0x76, 0xbe, 0x0b, 0xa8, 0xe2, 0xfd, 0x1b, 0x6c, 0x9b, 0x56, 0xdf, + 0xd6, 0xb4, 0xca, 0x4f, 0xd6, 0x7f, 0xd4, 0xb9, 0x29, 0xb0, 0x21, 0x36, 0xa8, 0x52, 0x24, 0xac, 0x32, 0x06, 0x88, + 0x46, 0xcf, 0xdc, 0x64, 0x9a, 0xc2, 0xfe, 0xee, 0x3c, 0x5d, 0xf5, 0x75, 0x6a, 0xf3, 0x5d, 0xcf, 0xa5, 0xc4, 0x12, + 0x2e, 0xb3, 0xd0, 0xc7, 0x72, 0x00, 0x64, 0xa6, 0x87, 0xa5, 0x83, 0x06, 0x5f, 0x83, 0x57, 0x57, 0x2c, 0x55, 0xd7, + 0xec, 0x7e, 0xc8, 0xf8, 0xeb, 0x9b, 0xf4, 0x8a, 0xde, 0xc9, 0xc8, 0x7c, 0x73, 0xaf, 0x77, 0xd7, 0xea, 0xfa, 0x85, + 0xf5, 0x8c, 0xba, 0x54, 0x2d, 0x4f, 0x7f, 0x6f, 0xf7, 0x7d, 0x71, 0x67, 0xed, 0x4f, 0x41, 0x19, 0xdb, 0x93, 0x7c, + 0xa0, 0x9a, 0x1b, 0xff, 0x02, 0xcd, 0x9b, 0x82, 0x5a, 0x46, 0xa6, 0xbc, 0xad, 0xfd, 0x92, 0x1b, 0xf2, 0xf6, 0x44, + 0xc6, 0x11, 0xe7, 0x8e, 0x21, 0xef, 0x4b, 0xdb, 0xf8, 0xdc, 0xeb, 0x08, 0x14, 0x7e, 0x79, 0x3a, 0xa5, 0x80, 0xd6, + 0x84, 0x4b, 0xc4, 0x11, 0x5a, 0x5e, 0x97, 0x2e, 0x8a, 0x41, 0xe4, 0xe8, 0x03, 0xd8, 0xd2, 0x86, 0xe0, 0xd3, 0x22, + 0xfc, 0x6c, 0x26, 0xd4, 0x93, 0xad, 0x40, 0xad, 0x88, 0x2a, 0x7b, 0x48, 0x56, 0x02, 0xcb, 0x89, 0xe4, 0xa4, 0x27, + 0x75, 0x26, 0x90, 0x60, 0xea, 0x15, 0xef, 0xbb, 0x60, 0xc8, 0x62, 0x97, 0x2b, 0x0c, 0x2c, 0xe2, 0x64, 0xa1, 0x7e, + 0xbd, 0x3c, 0x95, 0x46, 0x0b, 0x0c, 0x01, 0x4c, 0x73, 0x2f, 0x2f, 0x1b, 0x23, 0x9e, 0xfe, 0xee, 0x86, 0x4c, 0x17, + 0x78, 0xf0, 0xcd, 0x8b, 0x9b, 0xd4, 0x52, 0x80, 0x9e, 0x9b, 0xfc, 0x6e, 0xa4, 0x9d, 0xc8, 0x09, 0xa9, 0xcd, 0x19, + 0x0e, 0x01, 0xaa, 0x9a, 0x3d, 0xc4, 0x5c, 0x2a, 0x65, 0x27, 0xae, 0x81, 0x2c, 0xbf, 0x89, 0xc0, 0x97, 0x6f, 0xe7, + 0xd8, 0x3b, 0x15, 0x95, 0xad, 0xd0, 0x0e, 0xa1, 0xa2, 0x36, 0xac, 0xee, 0xe6, 0xe1, 0x31, 0x47, 0xb0, 0xf3, 0x87, + 0x79, 0xdc, 0xd7, 0x0d, 0x8f, 0x10, 0x60, 0x05, 0xc2, 0x27, 0x04, 0x1f, 0x60, 0x88, 0x66, 0xba, 0xb5, 0xef, 0xef, + 0x55, 0x52, 0x55, 0x3c, 0x05, 0x38, 0x3e, 0xc0, 0xf0, 0xce, 0xd4, 0x63, 0xb3, 0x04, 0x9b, 0x79, 0x04, 0x86, 0x90, + 0x9b, 0xe6, 0x54, 0x53, 0x6e, 0x80, 0xf9, 0x2e, 0x62, 0x98, 0xe2, 0x91, 0xee, 0xd1, 0xf0, 0x01, 0xed, 0xc6, 0x9b, + 0x3b, 0x2f, 0xf0, 0xd3, 0x2c, 0x62, 0xd9, 0xf3, 0x64, 0x94, 0xc1, 0x27, 0x22, 0xdf, 0x22, 0x85, 0xcc, 0xfd, 0xc4, + 0x29, 0xac, 0xb6, 0x69, 0x7d, 0x51, 0x88, 0xdc, 0x5c, 0xdd, 0x98, 0x68, 0x0d, 0x5c, 0xa8, 0x4d, 0x54, 0x27, 0xd0, + 0xda, 0x66, 0x7b, 0xb8, 0xea, 0x4c, 0x24, 0x83, 0x27, 0xc2, 0xfc, 0x1b, 0xaf, 0xee, 0x64, 0xeb, 0x90, 0x8b, 0xd3, + 0xa3, 0x30, 0x57, 0x7b, 0x6b, 0xcf, 0x5b, 0xf7, 0x2d, 0x77, 0xd5, 0x9a, 0x3c, 0xa7, 0x45, 0x28, 0xb1, 0x93, 0x0c, + 0xa0, 0x08, 0xee, 0x9b, 0x41, 0xef, 0x3d, 0xd4, 0x89, 0x0c, 0x2e, 0x54, 0x31, 0xe3, 0xcc, 0x38, 0xca, 0xf3, 0x2b, + 0xae, 0x39, 0xb8, 0xfd, 0xbc, 0x71, 0x31, 0x10, 0xa0, 0xd0, 0x01, 0x99, 0xfa, 0x51, 0x99, 0xda, 0x9a, 0x26, 0xc7, + 0x7c, 0x05, 0x0b, 0x44, 0x86, 0x20, 0x00, 0x59, 0x78, 0xda, 0x56, 0xe9, 0x3e, 0x9e, 0x0c, 0x07, 0xca, 0x1b, 0x81, + 0x19, 0x19, 0x74, 0x10, 0xcd, 0x58, 0xdb, 0x99, 0x44, 0x44, 0x98, 0x84, 0x1b, 0x8b, 0x1a, 0xfe, 0xc5, 0x53, 0x52, + 0x3e, 0xe6, 0xa1, 0x87, 0x11, 0xd3, 0x62, 0x5e, 0x51, 0x7c, 0x49, 0x41, 0x3a, 0x97, 0x56, 0xdf, 0xb2, 0x4c, 0xce, + 0xa9, 0x97, 0xa1, 0xd0, 0x45, 0xc2, 0xa8, 0xb0, 0x49, 0x3d, 0x91, 0x01, 0x24, 0x63, 0x95, 0x19, 0xca, 0x15, 0x5e, + 0x8f, 0x2a, 0x79, 0x5c, 0xf2, 0x6f, 0xcc, 0xca, 0xb8, 0x1c, 0x5b, 0xd6, 0x0d, 0xeb, 0x1c, 0x1c, 0xaf, 0x54, 0xcb, + 0xe4, 0x9b, 0xa2, 0x38, 0xf1, 0xe2, 0x23, 0x06, 0xe2, 0xfd, 0xac, 0xde, 0x66, 0x9e, 0x7d, 0x58, 0xee, 0xda, 0xc2, + 0x95, 0x49, 0xc5, 0x20, 0x96, 0x30, 0x11, 0xb4, 0x28, 0x8d, 0xdf, 0x71, 0x30, 0xc5, 0x29, 0x40, 0x1b, 0x0b, 0xdf, + 0x1b, 0x49, 0x55, 0xe5, 0xb0, 0x5c, 0x46, 0x6f, 0xa5, 0xa8, 0xb3, 0x59, 0x5e, 0x46, 0x9b, 0x79, 0x12, 0x10, 0xe0, + 0xea, 0x4c, 0x59, 0xcd, 0x6e, 0x0e, 0x1d, 0x86, 0x33, 0xac, 0x2c, 0xe5, 0x84, 0x29, 0x9a, 0x35, 0x96, 0x12, 0x61, + 0xdc, 0x66, 0xb7, 0x2f, 0x8e, 0xdf, 0xd5, 0x72, 0x67, 0xfa, 0x0d, 0xdc, 0xe5, 0xae, 0x59, 0x40, 0x78, 0xe0, 0x11, + 0x9d, 0x93, 0xcb, 0x80, 0xaf, 0x8c, 0xea, 0x0d, 0x1a, 0xb0, 0x25, 0xeb, 0xa5, 0xf9, 0x58, 0x95, 0x87, 0xbe, 0x8a, + 0x5d, 0xbc, 0xd4, 0x25, 0xb4, 0x3a, 0xd4, 0xfa, 0xb0, 0xb7, 0xff, 0xb4, 0x57, 0xed, 0x34, 0xa0, 0x03, 0x62, 0x5f, + 0xeb, 0xf1, 0x65, 0x97, 0xff, 0xd5, 0x1f, 0xb7, 0x45, 0xa2, 0xed, 0x94, 0xba, 0x81, 0x0a, 0x41, 0xee, 0x40, 0xb0, + 0x95, 0xce, 0x67, 0xe5, 0x38, 0xe8, 0x85, 0x25, 0xa1, 0x16, 0x5e, 0x97, 0x97, 0x4a, 0xf0, 0x60, 0x4a, 0x49, 0xac, + 0x71, 0xaf, 0x37, 0x87, 0x01, 0x7d, 0xb8, 0xc5, 0x5a, 0x4d, 0x4c, 0x7f, 0x42, 0x54, 0x99, 0x48, 0x0f, 0x6c, 0x2f, + 0x9a, 0x98, 0xf0, 0xb0, 0x1f, 0x54, 0xa4, 0x84, 0xea, 0x40, 0xd0, 0x06, 0xca, 0xc4, 0x1c, 0x5f, 0x76, 0x28, 0x79, + 0x2e, 0xb4, 0xc0, 0x27, 0x06, 0xfb, 0x8e, 0xab, 0xb1, 0x50, 0xb1, 0x03, 0xc9, 0x31, 0x65, 0x0e, 0x37, 0xd8, 0x22, + 0xf6, 0x27, 0xd5, 0x40, 0xe9, 0xaf, 0xc6, 0x75, 0xdf, 0x56, 0x01, 0x94, 0xba, 0xe6, 0xc7, 0x7d, 0x8d, 0x42, 0x0f, + 0x16, 0xf1, 0x76, 0x08, 0xcf, 0x64, 0xbb, 0xa6, 0x22, 0xd6, 0x7c, 0x96, 0xec, 0xb9, 0x61, 0xc3, 0xdf, 0x57, 0x04, + 0x32, 0x46, 0x9a, 0x0e, 0x65, 0x6c, 0xc6, 0x2f, 0x65, 0x14, 0x53, 0x84, 0x7d, 0xe1, 0x77, 0x92, 0x10, 0x21, 0x42, + 0xc6, 0x30, 0xcd, 0x11, 0xb4, 0x33, 0x9f, 0x27, 0xb5, 0x40, 0x75, 0x4d, 0x42, 0xdf, 0xd3, 0xc3, 0x8a, 0x78, 0x90, + 0xa3, 0x47, 0x25, 0x00, 0xea, 0xbf, 0xc5, 0xbd, 0x27, 0x59, 0x31, 0x82, 0xb4, 0xe2, 0x44, 0x1a, 0x57, 0xe0, 0x38, + 0xc7, 0x27, 0x2d, 0x24, 0x88, 0x97, 0xea, 0x4e, 0x42, 0x5f, 0xb4, 0x71, 0x6a, 0xf0, 0x02, 0xb9, 0x28, 0x56, 0x2a, + 0x00, 0xb5, 0x5b, 0xf0, 0x66, 0x09, 0x33, 0x66, 0x48, 0x8f, 0xbc, 0x07, 0x6b, 0x1e, 0xf2, 0x52, 0x2e, 0x8f, 0x39, + 0x39, 0x87, 0xa8, 0xb9, 0x28, 0x92, 0x1a, 0x73, 0x05, 0x7d, 0x0d, 0x8a, 0x53, 0xe8, 0x63, 0x4c, 0xac, 0x36, 0x4f, + 0x7d, 0xaa, 0x86, 0xa2, 0xf4, 0x6c, 0x56, 0x17, 0xeb, 0x88, 0x2d, 0xb0, 0x0b, 0xcd, 0x18, 0x82, 0x5f, 0xc9, 0x24, + 0x87, 0x83, 0xb4, 0x4c, 0x04, 0x1d, 0x95, 0x17, 0x43, 0x27, 0x33, 0xda, 0xbb, 0xf4, 0x84, 0x3b, 0x7a, 0x28, 0x39, + 0x7d, 0x81, 0xd2, 0x43, 0x08, 0xd0, 0x5f, 0x8d, 0x68, 0xdc, 0xfe, 0x0a, 0x27, 0xc5, 0x8b, 0x09, 0x1f, 0x24, 0x51, + 0x84, 0x87, 0x70, 0x46, 0x14, 0x32, 0x12, 0xed, 0x43, 0xc1, 0xcc, 0x3b, 0xdb, 0xd6, 0x94, 0xf7, 0x45, 0x9d, 0x3a, + 0xcd, 0xc1, 0xcb, 0xf7, 0xe2, 0xb5, 0x5c, 0x4e, 0x3d, 0x7a, 0xec, 0xcb, 0x96, 0x90, 0x9d, 0x07, 0x00, 0x02, 0xe4, + 0x8b, 0x1d, 0x32, 0x26, 0x68, 0xc3, 0x9a, 0x96, 0x64, 0x4d, 0x3f, 0x5a, 0x84, 0x7e, 0x54, 0x7d, 0x9c, 0x66, 0x99, + 0x90, 0x6a, 0x0b, 0x63, 0x40, 0x84, 0x9e, 0x2a, 0x94, 0x60, 0x45, 0xee, 0x83, 0x97, 0xb8, 0x9a, 0x00, 0xdb, 0xb6, + 0x18, 0x9e, 0xb4, 0x37, 0x43, 0x60, 0x3b, 0x22, 0xa0, 0xd3, 0x0c, 0x89, 0x42, 0x6c, 0xb8, 0x8f, 0xd1, 0x4c, 0x52, + 0xc1, 0x98, 0x26, 0x2a, 0x1f, 0xfc, 0x07, 0xb5, 0x11, 0x37, 0x69, 0xaf, 0xe2, 0x79, 0x84, 0x3d, 0xc7, 0xa1, 0xeb, + 0xc2, 0x65, 0x40, 0x54, 0xd9, 0x72, 0x59, 0x73, 0x3d, 0x5a, 0x9e, 0x91, 0x41, 0x95, 0x48, 0xfd, 0x85, 0x5b, 0x07, + 0x95, 0x06, 0xd4, 0xb3, 0xf8, 0x64, 0xe0, 0xb9, 0x25, 0xb4, 0xdc, 0x9f, 0x23, 0x89, 0x07, 0xe0, 0xd4, 0xa3, 0x39, + 0xc2, 0x4b, 0x77, 0x87, 0x00, 0xf7, 0x56, 0x75, 0xbb, 0x69, 0x09, 0x28, 0x63, 0x27, 0xe1, 0xaa, 0xad, 0x52, 0x92, + 0x5a, 0x83, 0x12, 0xf3, 0xef, 0xf2, 0x4b, 0x3d, 0x76, 0x15, 0x1b, 0x96, 0x21, 0xd0, 0xb5, 0x42, 0xfd, 0xe5, 0x13, + 0xda, 0x49, 0xe1, 0xc6, 0xe1, 0x0d, 0xb2, 0x68, 0xf3, 0x11, 0xb5, 0x60, 0x2e, 0x50, 0x77, 0x5c, 0xd4, 0xbd, 0xf9, + 0x1b, 0xc1, 0x4d, 0x51, 0x53, 0xe8, 0x42, 0xc9, 0x46, 0x8f, 0x37, 0x12, 0x33, 0x40, 0x73, 0xb9, 0xd2, 0x0a, 0xcf, + 0xaa, 0x07, 0x6a, 0xbf, 0x21, 0x71, 0x6b, 0xbd, 0xbe, 0x0d, 0x1b, 0x3d, 0x44, 0xab, 0xc9, 0x82, 0x36, 0x46, 0x92, + 0xc7, 0xcc, 0xa1, 0xb5, 0x22, 0xd3, 0x35, 0x49, 0xb0, 0x2c, 0xa9, 0xf5, 0x6a, 0xd7, 0xf0, 0xf3, 0xb7, 0x3e, 0x40, + 0x58, 0x30, 0xb0, 0x5a, 0x49, 0xef, 0xb0, 0xdd, 0xca, 0xa5, 0x85, 0xab, 0x4d, 0xfe, 0x2c, 0x95, 0x43, 0x40, 0x9b, + 0x2c, 0xbf, 0xc4, 0xa5, 0xa7, 0x28, 0x88, 0xd4, 0x69, 0xab, 0xab, 0x84, 0x84, 0x60, 0xa5, 0x52, 0x3f, 0x1d, 0x98, + 0x90, 0x23, 0x2a, 0x47, 0x64, 0xf7, 0xba, 0x9c, 0xf3, 0x53, 0x03, 0xd2, 0xdd, 0x88, 0x48, 0xc8, 0xe9, 0x8d, 0x01, + 0x5c, 0x16, 0x1a, 0xfb, 0xdb, 0x80, 0x2b, 0x7c, 0x88, 0xe0, 0xb4, 0xef, 0x4a, 0xb9, 0x2e, 0x82, 0xfb, 0xbe, 0x40, + 0x8a, 0xaa, 0x22, 0x82, 0x05, 0xd5, 0x8e, 0x6c, 0xce, 0x8e, 0xfc, 0xc6, 0x8c, 0x02, 0xe7, 0xe6, 0x78, 0xd7, 0x28, + 0x42, 0xe9, 0x62, 0xe7, 0xbe, 0x62, 0x20, 0x4a, 0x12, 0x3e, 0x3b, 0x46, 0x68, 0xad, 0x75, 0x3e, 0xf1, 0x7e, 0xc0, + 0xb3, 0x24, 0x9c, 0x7f, 0x60, 0x93, 0xf7, 0xa5, 0x38, 0x2f, 0xaf, 0x36, 0x75, 0x5b, 0x30, 0x02, 0x50, 0x5f, 0x78, + 0xde, 0x56, 0x1e, 0xdc, 0x60, 0x64, 0x90, 0x27, 0x73, 0x81, 0xf1, 0xcc, 0xd5, 0x60, 0x9e, 0x1f, 0x3b, 0x2a, 0x04, + 0x2c, 0x04, 0xf2, 0x54, 0x53, 0x9b, 0xd6, 0x4a, 0x6c, 0xd1, 0x8e, 0xd9, 0x6f, 0xd9, 0x00, 0x27, 0xc0, 0xe9, 0x70, + 0xbc, 0xb4, 0x0d, 0xde, 0x90, 0x4b, 0x7a, 0x6b, 0x19, 0x05, 0xd9, 0x85, 0x7f, 0x1b, 0xb4, 0x06, 0xe5, 0x15, 0x08, + 0x15, 0x49, 0x1d, 0x1b, 0x25, 0xa5, 0x48, 0x1a, 0xa1, 0x65, 0xb6, 0x05, 0x59, 0x71, 0xb6, 0x47, 0x7c, 0xd5, 0xcc, + 0xe1, 0xa6, 0xc8, 0x6d, 0x91, 0xce, 0x1a, 0xee, 0x8b, 0x40, 0xc5, 0xa6, 0x90, 0x66, 0x5a, 0x23, 0xdb, 0xb8, 0x27, + 0xab, 0xb4, 0x77, 0x1b, 0x51, 0x33, 0x68, 0x44, 0xdf, 0xd2, 0x54, 0xf9, 0x7d, 0x2d, 0xaa, 0x97, 0x62, 0xa0, 0xcc, + 0x21, 0xa6, 0x6b, 0x5a, 0xc1, 0xa4, 0x4a, 0x2d, 0x8e, 0xf3, 0x36, 0x9f, 0x3e, 0x5c, 0x28, 0x87, 0xe4, 0xc0, 0x09, + 0x25, 0x47, 0x0c, 0xd9, 0x0a, 0x43, 0x70, 0x2b, 0x67, 0x13, 0xc9, 0x72, 0x23, 0x72, 0x99, 0x35, 0x46, 0x77, 0xfc, + 0x83, 0x05, 0xa0, 0xd0, 0x17, 0x1b, 0x14, 0xf4, 0x63, 0xad, 0xf5, 0x89, 0x3a, 0x52, 0x6a, 0x52, 0x7c, 0xba, 0x70, + 0x13, 0x95, 0x43, 0xcd, 0xd5, 0xab, 0xa2, 0x01, 0xb5, 0x26, 0x74, 0xc0, 0xf5, 0x08, 0x83, 0x0d, 0x84, 0xd1, 0x1f, + 0x4d, 0x21, 0x2c, 0xf7, 0x55, 0xdc, 0xb4, 0x9b, 0xbc, 0x7b, 0x3a, 0xdb, 0x63, 0xa4, 0x06, 0x15, 0x69, 0x59, 0x71, + 0x0c, 0xa7, 0x07, 0x9c, 0x83, 0xc7, 0x8e, 0x19, 0x36, 0x1b, 0xa7, 0xc7, 0x18, 0x03, 0x2c, 0x59, 0x61, 0xb1, 0x4d, + 0xa5, 0xb5, 0x22, 0x42, 0x6a, 0x9b, 0xd5, 0x4b, 0x9b, 0x3b, 0x45, 0x7e, 0xfb, 0x33, 0x00, 0xcc, 0xab, 0x26, 0xd3, + 0x3a, 0x8a, 0x29, 0x62, 0x94, 0xb4, 0x59, 0x1c, 0x2f, 0xc4, 0xca, 0x8b, 0x8f, 0x05, 0xee, 0x8f, 0x54, 0xb9, 0xb2, + 0xec, 0xb8, 0x3a, 0x93, 0xfb, 0xe1, 0xe6, 0x87, 0xcc, 0x49, 0xc4, 0x03, 0x16, 0xfa, 0x8c, 0xd9, 0x70, 0x75, 0xe2, + 0x1d, 0xa9, 0xc3, 0x2c, 0x26, 0xf7, 0xba, 0x78, 0xcb, 0xc7, 0xb9, 0x0b, 0xa8, 0xec, 0x41, 0xec, 0xb6, 0x2a, 0x63, + 0xbd, 0xce, 0xc8, 0x20, 0xe1, 0x5b, 0x2a, 0xf6, 0x4a, 0xc6, 0x4e, 0x7c, 0x06, 0x99, 0x1e, 0x2c, 0xc3, 0xc2, 0x53, + 0x46, 0x72, 0xfb, 0x4c, 0x15, 0xb5, 0xeb, 0x29, 0x95, 0xeb, 0xa2, 0x3b, 0xaf, 0xb9, 0xb7, 0x15, 0xee, 0xd4, 0xcc, + 0xa4, 0x13, 0xaf, 0x0b, 0x50, 0xe7, 0x83, 0x97, 0x16, 0xe9, 0x9c, 0x37, 0xb0, 0x6a, 0x85, 0xc2, 0x75, 0xa9, 0x46, + 0x9f, 0x5d, 0xee, 0xa3, 0x2d, 0x8e, 0x4d, 0x77, 0x7e, 0x5d, 0xf6, 0x68, 0xf2, 0x59, 0x87, 0x40, 0xec, 0x29, 0x22, + 0x3e, 0xa5, 0xc1, 0xad, 0x75, 0x98, 0x69, 0xab, 0xad, 0x0c, 0x54, 0x9b, 0xa4, 0x16, 0xf8, 0x49, 0x9b, 0xd2, 0xec, + 0x70, 0x6a, 0x79, 0xd7, 0x20, 0x96, 0xf8, 0x05, 0x0e, 0xab, 0x62, 0xf5, 0xec, 0xf1, 0x2d, 0xae, 0xac, 0x0c, 0x73, + 0xbf, 0x1e, 0x55, 0x0e, 0xb3, 0xb9, 0xe2, 0x78, 0x53, 0x1d, 0x91, 0x48, 0x6d, 0x3f, 0xf7, 0xf3, 0x27, 0x43, 0x45, + 0x8f, 0x83, 0x81, 0x38, 0x50, 0x55, 0xe4, 0x4c, 0x89, 0xb0, 0x0a, 0xa7, 0x25, 0x9a, 0x86, 0xc6, 0x3a, 0x14, 0x04, + 0x64, 0xd4, 0xff, 0x81, 0x70, 0x10, 0x99, 0xb7, 0x4e, 0x48, 0xaa, 0x2a, 0x35, 0x2c, 0xd1, 0x5e, 0xec, 0x7b, 0x48, + 0xe1, 0x21, 0x4f, 0xb6, 0x3e, 0x6f, 0xbf, 0xce, 0x91, 0x05, 0x0f, 0x04, 0xa3, 0x4c, 0x12, 0x03, 0x5b, 0x47, 0x97, + 0x7a, 0xd9, 0x8b, 0xbb, 0x4c, 0x40, 0x4f, 0x77, 0x1e, 0x7f, 0x84, 0x43, 0x51, 0xda, 0x9c, 0xbf, 0x6a, 0x49, 0x36, + 0xf3, 0xe8, 0xb6, 0x6a, 0xac, 0x43, 0x24, 0x36, 0x97, 0x1c, 0x2d, 0xe7, 0x45, 0x9e, 0x72, 0x74, 0xf9, 0x00, 0x8c, + 0x85, 0x77, 0xe7, 0x5c, 0x35, 0x17, 0x52, 0x4d, 0x5f, 0x1c, 0x13, 0xb8, 0x0e, 0x8f, 0xd8, 0x4a, 0xdb, 0x06, 0xeb, + 0xc1, 0x72, 0x88, 0xe7, 0xdc, 0x50, 0xae, 0x3f, 0xd4, 0x92, 0x6a, 0x52, 0xcf, 0x60, 0x1a, 0x2b, 0x75, 0x82, 0x26, + 0x65, 0xce, 0x2b, 0x9e, 0x3a, 0x98, 0x3a, 0x74, 0x93, 0x44, 0xf4, 0xd7, 0x91, 0x39, 0x91, 0xa4, 0x49, 0x3f, 0xb6, + 0x8d, 0x0a, 0x08, 0x80, 0x8e, 0x56, 0x08, 0x68, 0xf7, 0xbd, 0x5b, 0x7d, 0x26, 0xc9, 0x87, 0x67, 0x3d, 0x8a, 0xb9, + 0xd6, 0xd1, 0x56, 0xd7, 0xb0, 0x7c, 0x7b, 0x45, 0x18, 0xcd, 0xdb, 0x03, 0xb3, 0xc2, 0xd9, 0x88, 0x14, 0x63, 0xe7, + 0x2d, 0x20, 0x61, 0x1e, 0x22, 0xc7, 0xbb, 0x2e, 0x6a, 0xdc, 0x4a, 0xe7, 0xe8, 0xbc, 0x08, 0x4f, 0x9b, 0x2b, 0x16, + 0x4a, 0xd1, 0x4b, 0xe5, 0xd8, 0x6f, 0xde, 0x99, 0x51, 0x43, 0x5e, 0xf2, 0xb0, 0xf1, 0x7e, 0x94, 0xa7, 0xa7, 0x30, + 0x3a, 0x3f, 0xc4, 0x61, 0xee, 0x48, 0x5f, 0xa9, 0x03, 0xf4, 0x7a, 0x4f, 0x0e, 0xdf, 0xae, 0xef, 0x65, 0x27, 0x38, + 0x5c, 0x18, 0x2e, 0x8a, 0xf3, 0x05, 0xa9, 0x24, 0xe6, 0x28, 0xf5, 0x78, 0x51, 0x4f, 0xf1, 0x81, 0x78, 0xe5, 0x04, + 0xdb, 0x5e, 0xf6, 0xfd, 0xdf, 0x85, 0x33, 0x29, 0xbf, 0xef, 0x2e, 0x81, 0xaf, 0x07, 0x7f, 0xe8, 0xf6, 0x0b, 0x1c, + 0x89, 0xc8, 0x61, 0x1c, 0xee, 0xd8, 0x56, 0x71, 0xbd, 0x6f, 0xc3, 0x16, 0xa9, 0xd7, 0x1f, 0x27, 0x84, 0x5c, 0x37, + 0xe4, 0xa8, 0x3b, 0x28, 0xe2, 0x65, 0x09, 0x4c, 0xdc, 0x14, 0x42, 0x14, 0xe3, 0xbf, 0x5c, 0xcd, 0x53, 0x84, 0x5f, + 0x35, 0xa2, 0xb0, 0x55, 0x53, 0x53, 0x70, 0x57, 0x60, 0x00, 0x56, 0xf2, 0x04, 0x77, 0xa0, 0xe5, 0x43, 0x59, 0x78, + 0x85, 0x8e, 0xd5, 0xa2, 0xac, 0x04, 0x6a, 0x99, 0x21, 0x8f, 0x08, 0x4e, 0xd0, 0x5e, 0x84, 0x59, 0xd7, 0x30, 0x29, + 0xf7, 0x60, 0xf2, 0xb6, 0x6e, 0xe1, 0x75, 0xb7, 0xa9, 0xd3, 0xc3, 0xfb, 0x55, 0x69, 0xb1, 0xab, 0xb2, 0xc7, 0x03, + 0xe4, 0x28, 0x39, 0xbd, 0x03, 0x30, 0xe7, 0x61, 0x12, 0xd8, 0xea, 0xd2, 0x1c, 0xb6, 0x76, 0x97, 0xd0, 0x6f, 0x33, + 0x7c, 0xba, 0x43, 0x66, 0xa3, 0xa4, 0x9d, 0x7d, 0xfe, 0x53, 0x05, 0x8b, 0xa1, 0x37, 0x00, 0x9e, 0xb0, 0xee, 0x64, + 0xb5, 0xb0, 0x81, 0x7b, 0xfc, 0xd3, 0x87, 0xa6, 0x28, 0xa4, 0x25, 0xa6, 0xb1, 0x8b, 0xa3, 0x9a, 0x6c, 0xad, 0xf6, + 0x1a, 0x39, 0xbb, 0x21, 0x71, 0x55, 0x4a, 0x88, 0x2e, 0x47, 0xb4, 0x42, 0xb2, 0x47, 0x14, 0xc1, 0x6a, 0xef, 0x2c, + 0xdd, 0x46, 0x5f, 0xc3, 0x74, 0x05, 0x18, 0x4d, 0xc0, 0xb0, 0x41, 0xa5, 0xbd, 0x13, 0x00, 0x18, 0xa5, 0x55, 0x53, + 0xa7, 0xf4, 0x2e, 0x76, 0xd9, 0xe5, 0xe6, 0x41, 0xa6, 0xd4, 0x13, 0x35, 0x93, 0xdb, 0x03, 0x2a, 0x6b, 0x2d, 0x54, + 0xb2, 0x5f, 0x72, 0xc5, 0xa7, 0x51, 0x89, 0x56, 0xe8, 0x6a, 0x46, 0x07, 0xdd, 0x4c, 0xd1, 0x51, 0x22, 0xb6, 0x4c, + 0x4c, 0xbb, 0xf2, 0x66, 0x98, 0x78, 0xa9, 0xd8, 0x2a, 0x33, 0x22, 0x4d, 0xd9, 0xa2, 0x96, 0x23, 0xe2, 0xfc, 0xa8, + 0xbd, 0x66, 0x55, 0xa7, 0x36, 0xd6, 0x5a, 0x78, 0xba, 0x38, 0xc4, 0xe4, 0xea, 0x43, 0xb4, 0xdd, 0x07, 0x29, 0x38, + 0xd3, 0xa6, 0x8d, 0x2b, 0xb5, 0xcd, 0xbe, 0x88, 0x32, 0x5e, 0x91, 0x71, 0x11, 0xb3, 0xd9, 0xed, 0x93, 0xa5, 0x1d, + 0x26, 0xca, 0xe3, 0x98, 0x4c, 0x46, 0x0e, 0x54, 0xd2, 0x06, 0xaa, 0x25, 0xf7, 0x92, 0x15, 0x17, 0x71, 0xf1, 0xdf, + 0x68, 0xd9, 0xe6, 0xd9, 0xc2, 0xc0, 0x82, 0x16, 0x66, 0x89, 0x02, 0xb3, 0x54, 0x4a, 0x07, 0x25, 0x1c, 0x45, 0x64, + 0x27, 0x09, 0xd3, 0xcb, 0x92, 0x36, 0xf8, 0xa0, 0x91, 0xee, 0x4e, 0x26, 0x0d, 0x09, 0x97, 0x6b, 0x9c, 0xb5, 0x2d, + 0x26, 0x32, 0xe2, 0xa9, 0x6f, 0x4a, 0x26, 0xc2, 0x48, 0x3c, 0xc8, 0x94, 0x98, 0x0b, 0xcf, 0x06, 0x52, 0xe2, 0x8b, + 0x9c, 0x7e, 0xae, 0x17, 0xb3, 0xd1, 0x22, 0x8d, 0xfe, 0xa1, 0xe7, 0x97, 0xc5, 0xce, 0x6e, 0x47, 0x8c, 0x7a, 0x7b, + 0x5c, 0x79, 0x56, 0x53, 0x6b, 0xd7, 0x8c, 0x1c, 0x33, 0x06, 0x34, 0x52, 0x08, 0x14, 0xd2, 0x27, 0x23, 0x9c, 0x16, + 0x97, 0x03, 0x1b, 0x36, 0xbe, 0x53, 0x8e, 0x67, 0x0a, 0xb7, 0x17, 0x43, 0xc3, 0x73, 0x87, 0x44, 0x10, 0xa1, 0xf1, + 0x06, 0x67, 0xce, 0x50, 0xff, 0xe1, 0xe9, 0xbc, 0x35, 0xd7, 0xfd, 0x0f, 0x8a, 0x9e, 0xa5, 0x45, 0x44, 0x80, 0xf3, + 0x45, 0x45, 0x9a, 0xdb, 0x7b, 0x27, 0x8b, 0xac, 0xc7, 0x37, 0xcd, 0xfa, 0x15, 0x01, 0xdc, 0x49, 0x02, 0x42, 0x80, + 0x86, 0xd7, 0xf5, 0x7c, 0x38, 0x4b, 0x58, 0x1e, 0x60, 0xba, 0xab, 0xe0, 0xef, 0xc4, 0x4d, 0xce, 0x4b, 0x13, 0xfa, + 0xb1, 0xa8, 0xe0, 0x83, 0x9d, 0x2c, 0x10, 0x6e, 0x01, 0x96, 0x10, 0x04, 0x82, 0x92, 0x99, 0x29, 0xa6, 0x12, 0xfa, + 0x0b, 0x29, 0x21, 0x43, 0x02, 0x4c, 0x47, 0xe3, 0x82, 0x1b, 0x24, 0xd5, 0x46, 0x3c, 0xad, 0x62, 0x36, 0x9c, 0x34, + 0x0c, 0x88, 0xf5, 0xc7, 0x30, 0xd8, 0x2a, 0x26, 0xc9, 0xb0, 0xbf, 0xb3, 0x37, 0x9e, 0x0c, 0xa7, 0x4b, 0x14, 0x72, + 0xb1, 0xcf, 0x98, 0x3c, 0xa1, 0xe9, 0x17, 0x85, 0xa8, 0x2f, 0xeb, 0x82, 0xd3, 0x7b, 0x76, 0x74, 0x07, 0x4f, 0xae, + 0x32, 0xd2, 0xdb, 0x38, 0xb0, 0xdc, 0x42, 0x22, 0xc0, 0xbc, 0xdf, 0x03, 0xcd, 0x48, 0x32, 0x64, 0x28, 0x03, 0xcc, + 0x35, 0x66, 0x4f, 0x0d, 0x4d, 0x0f, 0x65, 0x47, 0x72, 0x6d, 0x12, 0xac, 0x1e, 0xe6, 0xbe, 0xbc, 0xb2, 0x6e, 0x73, + 0xbd, 0x03, 0xb9, 0x6e, 0x6b, 0x08, 0xd8, 0xe5, 0x88, 0x34, 0xa7, 0x26, 0xb7, 0x09, 0xd5, 0x03, 0x14, 0x48, 0x35, + 0xd5, 0xb4, 0x0e, 0x0e, 0x37, 0x7c, 0xd0, 0x01, 0xe1, 0x26, 0xc4, 0x46, 0xe5, 0x11, 0x7a, 0xad, 0xc6, 0x3e, 0xd1, + 0xd7, 0x92, 0x6b, 0x9a, 0x6f, 0x90, 0x3a, 0x72, 0xa9, 0xea, 0x3c, 0x4e, 0xd4, 0xb5, 0xb6, 0xda, 0x82, 0x2d, 0xc2, + 0x00, 0x8b, 0x55, 0x0c, 0x87, 0xe8, 0x54, 0xa8, 0x68, 0x89, 0x7b, 0x1b, 0x73, 0xd5, 0xcb, 0x9d, 0xb7, 0x55, 0x97, + 0x7a, 0xa7, 0x06, 0x8d, 0xc8, 0xf4, 0x50, 0x01, 0x0e, 0x84, 0x8c, 0xb5, 0x7d, 0xb0, 0x8c, 0xe3, 0x8c, 0x54, 0x65, + 0xd8, 0x08, 0x46, 0xd3, 0x01, 0xca, 0x5a, 0xf5, 0x38, 0x9c, 0x03, 0x62, 0x79, 0x48, 0x6e, 0x9a, 0xcc, 0x10, 0xd9, + 0x22, 0x9b, 0x5f, 0x6a, 0xf2, 0xe4, 0x0a, 0x1d, 0x0d, 0xfb, 0x1e, 0xd0, 0xae, 0xee, 0xc0, 0x40, 0x76, 0xf8, 0xaa, + 0x93, 0xce, 0x72, 0x09, 0xb4, 0x39, 0x86, 0xce, 0x85, 0xc5, 0x29, 0x9f, 0xa7, 0x23, 0x1b, 0xee, 0x1d, 0xe0, 0x45, + 0x47, 0xd7, 0x0b, 0xf0, 0xdb, 0xc1, 0xc5, 0x1d, 0x63, 0x0f, 0x6e, 0xca, 0xa3, 0x2c, 0x3b, 0x95, 0x30, 0x95, 0x47, + 0x13, 0x17, 0xeb, 0x9c, 0x0b, 0x5d, 0xce, 0xe6, 0x75, 0xba, 0xf5, 0x27, 0x2a, 0x86, 0x9b, 0xb5, 0x73, 0x06, 0xcf, + 0x55, 0x4e, 0x87, 0x24, 0x62, 0x49, 0x8b, 0x73, 0xf4, 0x85, 0x44, 0x9e, 0xd6, 0xf9, 0xfd, 0x42, 0x81, 0xce, 0xa9, + 0x83, 0x6a, 0x1d, 0xe3, 0xcc, 0x4e, 0x0f, 0x3a, 0xef, 0x95, 0xc6, 0xa2, 0xb1, 0x4a, 0x59, 0xf1, 0x1f, 0x38, 0xb7, + 0xf4, 0xf6, 0x84, 0xb0, 0x49, 0x2a, 0xa4, 0x50, 0x96, 0x09, 0xb7, 0x3d, 0x0e, 0x34, 0x6d, 0xe7, 0x44, 0x76, 0x5b, + 0xdf, 0xbe, 0x93, 0x24, 0x22, 0x71, 0xdb, 0x0b, 0xa2, 0xf0, 0x0c, 0xd0, 0x18, 0x92, 0xb3, 0xe7, 0x9d, 0x75, 0xf9, + 0xd2, 0xcb, 0x72, 0xbc, 0xc2, 0xde, 0x15, 0x83, 0xb1, 0xb0, 0x42, 0x0b, 0x0b, 0x37, 0x0d, 0xd4, 0xb1, 0x93, 0x24, + 0x76, 0x59, 0x12, 0x3f, 0xb6, 0xfc, 0x33, 0x69, 0x6e, 0x44, 0x9e, 0x8a, 0x8e, 0x75, 0xc8, 0x3e, 0x73, 0xaa, 0x54, + 0xf7, 0x5a, 0xe5, 0x41, 0x39, 0xe6, 0xa9, 0x1a, 0x31, 0x67, 0x6e, 0x33, 0x45, 0x3e, 0x92, 0x3e, 0x6f, 0xae, 0x67, + 0x94, 0x28, 0x10, 0xa9, 0x0b, 0xbd, 0xca, 0x9c, 0xab, 0xd0, 0x91, 0x42, 0x4a, 0xb7, 0x46, 0xb3, 0x89, 0x39, 0x0e, + 0x67, 0x3f, 0x55, 0xd9, 0x13, 0x7c, 0xed, 0x3d, 0x6f, 0xed, 0xc3, 0x66, 0x83, 0xeb, 0x50, 0xf3, 0x21, 0x3d, 0x60, + 0xa6, 0x99, 0x3b, 0x53, 0x20, 0x0b, 0xdb, 0xaf, 0xec, 0x48, 0x94, 0x32, 0xfd, 0x63, 0xa3, 0x75, 0x7d, 0xd9, 0x47, + 0x75, 0x4c, 0xfe, 0xfd, 0x2d, 0x5d, 0xc3, 0x55, 0x07, 0x45, 0x8e, 0xe1, 0x58, 0xd1, 0x6e, 0xa5, 0x3b, 0x00, 0xe1, + 0x35, 0x3b, 0x8c, 0xdc, 0x72, 0x36, 0x45, 0xbd, 0x55, 0x57, 0xc1, 0x02, 0x6a, 0xd4, 0x91, 0x94, 0xbd, 0x51, 0x58, + 0x44, 0xfd, 0x9a, 0x5d, 0x8b, 0x2b, 0x8a, 0x6e, 0x59, 0xe3, 0x7e, 0xc8, 0xec, 0xa8, 0x3f, 0xe2, 0x5a, 0xb9, 0xc3, + 0x0c, 0xd9, 0xe1, 0x1a, 0x53, 0x48, 0xea, 0x8d, 0xc6, 0xcd, 0xb6, 0xd5, 0xf3, 0x4c, 0xc3, 0xb8, 0x6d, 0xcd, 0xd2, + 0x26, 0x76, 0x50, 0x0d, 0xb7, 0x75, 0xc1, 0x54, 0xb5, 0x5d, 0xf8, 0xfa, 0xd5, 0x6e, 0x25, 0xb2, 0x26, 0xb4, 0xe1, + 0x68, 0x6b, 0x60, 0x9a, 0x16, 0xf9, 0x5c, 0xf4, 0xec, 0x6a, 0xb0, 0xc5, 0xbe, 0x0b, 0xd9, 0xbc, 0xfb, 0x6b, 0x95, + 0x84, 0x2a, 0xb9, 0x72, 0x1f, 0x97, 0xe4, 0x27, 0x9d, 0xac, 0xc2, 0x33, 0xb5, 0x8d, 0xfc, 0x0e, 0x27, 0xda, 0x87, + 0x95, 0xe6, 0x69, 0x25, 0xb3, 0x10, 0x10, 0x85, 0xae, 0xf0, 0x2a, 0x04, 0xba, 0x05, 0x0b, 0xff, 0x07, 0x3a, 0x76, + 0x65, 0x5c, 0x0a, 0xe9, 0x8d, 0xca, 0x39, 0x74, 0x43, 0x42, 0x3e, 0xb4, 0xb0, 0x9c, 0x9c, 0x97, 0x1a, 0x74, 0xb5, + 0x35, 0x74, 0x64, 0x79, 0x20, 0x02, 0xfc, 0x44, 0x0e, 0x79, 0xa6, 0x26, 0xd8, 0xfd, 0x24, 0x70, 0x96, 0x66, 0xb3, + 0x08, 0xbf, 0x18, 0x70, 0x86, 0xa4, 0xf6, 0x9e, 0x7e, 0xf9, 0x14, 0x68, 0x0f, 0xbf, 0x5c, 0x68, 0x7d, 0x72, 0x66, + 0xce, 0x51, 0x4b, 0xc7, 0x0d, 0x1c, 0xc2, 0x45, 0x69, 0xc0, 0xf7, 0x48, 0x35, 0x86, 0x29, 0x22, 0x4c, 0x0e, 0xe0, + 0x5c, 0xb9, 0x6d, 0x78, 0x56, 0x6e, 0x02, 0x33, 0x1d, 0x29, 0xa5, 0x15, 0xc7, 0xa8, 0xfb, 0xb6, 0xf7, 0xa3, 0x24, + 0xe9, 0xcd, 0xc7, 0xcb, 0xac, 0x50, 0xfa, 0x9e, 0x99, 0x85, 0xae, 0xe2, 0x77, 0x26, 0xb9, 0xab, 0x4b, 0xe8, 0xa4, + 0x5a, 0xce, 0x80, 0x51, 0xae, 0x56, 0x58, 0xee, 0x84, 0x40, 0x0e, 0x9b, 0xfb, 0xe9, 0x66, 0x90, 0x26, 0x5b, 0x51, + 0x95, 0x18, 0x23, 0x52, 0x68, 0xbf, 0xd9, 0x9d, 0xfb, 0xa3, 0xd5, 0x0c, 0x3a, 0xea, 0x3b, 0x66, 0x5c, 0xcd, 0xb7, + 0x62, 0xbb, 0xd8, 0xb0, 0x83, 0x69, 0x14, 0x75, 0x98, 0xe6, 0x01, 0x42, 0xf7, 0x2c, 0x1d, 0xa8, 0x5f, 0x10, 0x9f, + 0xf2, 0x76, 0x55, 0x6d, 0x1d, 0xe4, 0x62, 0xa6, 0xa2, 0x7c, 0x8a, 0x1a, 0x14, 0xb0, 0x68, 0xdd, 0x2e, 0x4d, 0xc0, + 0x14, 0x59, 0x48, 0xb7, 0x90, 0x82, 0x28, 0x59, 0x08, 0x66, 0x50, 0xf1, 0x99, 0xbf, 0x4c, 0x7c, 0xad, 0x8f, 0x16, + 0x3c, 0xa5, 0x27, 0x6c, 0x15, 0x72, 0x75, 0xc7, 0x68, 0x31, 0xab, 0x4e, 0x3b, 0x4e, 0x13, 0x87, 0x0e, 0x35, 0xea, + 0x88, 0xd8, 0x75, 0x7c, 0xf0, 0x54, 0x32, 0x79, 0x83, 0xec, 0x2f, 0x27, 0x01, 0x3f, 0xd6, 0xb3, 0x5f, 0x32, 0x7b, + 0x88, 0x55, 0x69, 0xc6, 0xe3, 0x85, 0xb2, 0x47, 0xe5, 0xa8, 0xa8, 0x35, 0xf6, 0x73, 0x17, 0xa7, 0xb5, 0x51, 0x49, + 0x21, 0x77, 0x1e, 0x2e, 0xe4, 0x2b, 0xa7, 0x70, 0xee, 0x46, 0x25, 0xa2, 0x3c, 0x80, 0x99, 0xb0, 0x39, 0x71, 0xa3, + 0xe2, 0x16, 0x50, 0x39, 0xd3, 0x93, 0x26, 0x31, 0x9d, 0x95, 0x88, 0x31, 0xa3, 0x4b, 0xb8, 0x1e, 0x87, 0x68, 0x0c, + 0xcd, 0x30, 0xa7, 0xf7, 0x31, 0x7a, 0x82, 0x1c, 0x50, 0x0f, 0xed, 0x5a, 0x43, 0x88, 0x99, 0x54, 0xf8, 0x56, 0xad, + 0x88, 0x2d, 0xb3, 0x4f, 0x04, 0xb5, 0x6d, 0x2e, 0xf3, 0x88, 0x28, 0x6f, 0x29, 0x7c, 0x9f, 0xfb, 0xcb, 0x77, 0x8c, + 0x57, 0x72, 0xe8, 0x9d, 0x8e, 0x92, 0x9f, 0xc3, 0xfc, 0xec, 0x37, 0x0e, 0x60, 0x01, 0x11, 0xe7, 0x92, 0x9c, 0x7a, + 0x4a, 0x96, 0xe6, 0x3a, 0xeb, 0x75, 0x13, 0xc1, 0x2c, 0x99, 0x06, 0x4c, 0xac, 0x65, 0x16, 0x40, 0x07, 0x52, 0x09, + 0x9c, 0x15, 0x95, 0x75, 0x34, 0x93, 0x47, 0x0b, 0xbd, 0x37, 0xf1, 0xf0, 0x45, 0x29, 0xc6, 0x02, 0xfc, 0xb1, 0xa5, + 0xc6, 0xa2, 0x4c, 0xdf, 0xbc, 0x08, 0x54, 0xcd, 0x5a, 0x1e, 0x87, 0x74, 0xe9, 0xf5, 0x8a, 0x9a, 0x55, 0x49, 0x6b, + 0xa9, 0x2e, 0xd0, 0x76, 0x40, 0x8e, 0x51, 0x8b, 0xea, 0x0c, 0xd2, 0x50, 0xb4, 0x07, 0x4a, 0x5f, 0xc3, 0x84, 0x1e, + 0xf0, 0x4b, 0x35, 0x90, 0xd9, 0xe0, 0x9d, 0x4d, 0xb7, 0xb8, 0x98, 0x1c, 0x39, 0xeb, 0x06, 0x10, 0x70, 0xbb, 0xde, + 0x96, 0x9a, 0x08, 0xa9, 0x70, 0x83, 0x71, 0x59, 0x24, 0xea, 0x2f, 0x9a, 0xc3, 0xda, 0x15, 0x92, 0x3a, 0xc4, 0x3a, + 0xb4, 0x30, 0x01, 0xad, 0x19, 0x17, 0x1b, 0x5a, 0x94, 0x9d, 0xc8, 0x81, 0xb5, 0x59, 0x24, 0x19, 0x87, 0x3d, 0x9a, + 0x69, 0x33, 0x91, 0x6b, 0x09, 0x9e, 0x4a, 0x44, 0x6f, 0xd1, 0xf4, 0xeb, 0x07, 0x15, 0x36, 0x37, 0x99, 0x54, 0xca, + 0x4c, 0x8f, 0x86, 0x40, 0xbb, 0x76, 0x07, 0x7c, 0x87, 0x0a, 0xfe, 0x12, 0x3e, 0x18, 0x45, 0xf7, 0xfb, 0xec, 0x69, + 0x07, 0x7c, 0x08, 0xa7, 0x4e, 0xfb, 0x45, 0x80, 0x75, 0x0e, 0x94, 0x62, 0x5d, 0x98, 0xe3, 0x8c, 0xa3, 0x76, 0x35, + 0xa3, 0x8d, 0xfd, 0xc4, 0x18, 0x02, 0x85, 0xc3, 0xb7, 0x3d, 0x5a, 0x79, 0xd5, 0xcc, 0xd6, 0x4c, 0x2f, 0x69, 0x47, + 0x3e, 0xa2, 0x46, 0x30, 0x09, 0x22, 0x69, 0x99, 0x40, 0x68, 0xc6, 0xe8, 0x2d, 0x5c, 0xc1, 0xda, 0x9c, 0x01, 0x2d, + 0x75, 0xbd, 0x50, 0xe8, 0x81, 0xa7, 0xe7, 0x4c, 0x4c, 0x0a, 0xf3, 0x01, 0x2e, 0x69, 0xff, 0xde, 0x1c, 0x66, 0x0d, + 0xd5, 0x6a, 0x6d, 0xb7, 0x65, 0x7d, 0x97, 0x28, 0x10, 0xb6, 0x1f, 0xda, 0x45, 0xf7, 0x23, 0x3f, 0xbb, 0x16, 0xa0, + 0xce, 0x62, 0xdb, 0x35, 0x9e, 0xf4, 0xd7, 0x5e, 0xb7, 0x04, 0x1f, 0xfb, 0x2b, 0x0d, 0x9f, 0x54, 0x0c, 0xcb, 0x92, + 0x09, 0xd3, 0x95, 0xe5, 0x18, 0x67, 0xa5, 0xb8, 0xcf, 0xcb, 0x98, 0x74, 0x77, 0x28, 0x31, 0x89, 0xaf, 0x3b, 0x1b, + 0xd0, 0xb7, 0x8c, 0xe8, 0x65, 0xfd, 0x56, 0xcf, 0xb0, 0xd7, 0x25, 0x80, 0x98, 0x7a, 0x45, 0xc5, 0x78, 0x98, 0xe8, + 0x8b, 0x87, 0xa0, 0x30, 0x7e, 0x94, 0xb9, 0x18, 0x7c, 0x52, 0x6f, 0x5b, 0x48, 0x84, 0x9f, 0xc6, 0xa3, 0xb8, 0x98, + 0xb5, 0x68, 0xd8, 0x76, 0x3d, 0x29, 0x0e, 0x84, 0x84, 0xd6, 0xcc, 0xa7, 0x49, 0x5a, 0x73, 0x29, 0x0c, 0xbf, 0x59, + 0x88, 0x8d, 0x66, 0xe3, 0x28, 0x5a, 0x0b, 0x60, 0x74, 0x55, 0x73, 0xc5, 0x62, 0xe0, 0x61, 0xc1, 0x43, 0xf9, 0xd2, + 0x12, 0x96, 0x3d, 0x7f, 0x9f, 0x4e, 0xe4, 0x9b, 0xbb, 0x9c, 0x6e, 0xbf, 0x77, 0x9d, 0xbd, 0xb9, 0x4b, 0x27, 0xca, + 0xea, 0x17, 0x1d, 0x95, 0xa8, 0xc6, 0xfa, 0xd8, 0xfa, 0x70, 0x97, 0x5b, 0xfd, 0x44, 0x72, 0xda, 0xd9, 0x0e, 0x18, + 0xb7, 0x14, 0xb0, 0x65, 0xda, 0x1e, 0x36, 0xe5, 0x3f, 0xde, 0xba, 0x38, 0xd2, 0x28, 0x48, 0x7c, 0xc2, 0x9c, 0x21, + 0x49, 0xf1, 0xd8, 0x64, 0x00, 0xa3, 0x96, 0x01, 0xf5, 0x08, 0xf6, 0x75, 0x63, 0x47, 0xbe, 0xb9, 0x8c, 0x71, 0xa9, + 0x4e, 0xbb, 0x0e, 0x64, 0xda, 0xe5, 0x21, 0xb0, 0x71, 0x9b, 0xbb, 0x1c, 0x28, 0x12, 0x07, 0x2a, 0x62, 0xa6, 0xfd, + 0x22, 0xf5, 0xa7, 0x1b, 0xc4, 0x46, 0xed, 0xc0, 0xf5, 0x39, 0xd8, 0x14, 0xfb, 0x64, 0xb1, 0xdf, 0xca, 0x3b, 0x3b, + 0xec, 0x8d, 0xf4, 0x47, 0x9c, 0x9b, 0xcf, 0x38, 0x30, 0xa2, 0x4a, 0x73, 0x31, 0x2b, 0x91, 0x2a, 0xb2, 0xa7, 0x95, + 0xef, 0x2f, 0xa4, 0x49, 0xe0, 0xdc, 0xad, 0x0f, 0x3d, 0x9c, 0xcc, 0x9e, 0x08, 0x93, 0x39, 0xe4, 0x3b, 0x78, 0x49, + 0x89, 0xa6, 0x0b, 0x8d, 0xb6, 0x5b, 0x07, 0x04, 0x76, 0x02, 0xe6, 0x69, 0x89, 0xbc, 0x4e, 0xc9, 0x4b, 0x7e, 0xff, + 0xf6, 0xcf, 0xd2, 0xb2, 0x80, 0xe1, 0xc8, 0x53, 0x5c, 0xa5, 0x00, 0x11, 0xc7, 0x71, 0xfe, 0x6a, 0xdd, 0x67, 0x24, + 0xc6, 0xfa, 0xf3, 0xbb, 0x1f, 0xec, 0x3e, 0x41, 0xae, 0xa4, 0xa1, 0xf0, 0xcc, 0xcd, 0x91, 0x9d, 0x83, 0xec, 0xca, + 0xb8, 0x62, 0xb7, 0x41, 0x3f, 0x89, 0x2c, 0x2a, 0xd1, 0x4c, 0xeb, 0xcd, 0x29, 0x16, 0x49, 0x49, 0x2b, 0x2c, 0x6a, + 0xc9, 0x17, 0x0c, 0xe5, 0x30, 0x59, 0x96, 0xb6, 0x9d, 0x39, 0x0e, 0xc5, 0x5a, 0x96, 0x00, 0xd9, 0xc5, 0x12, 0x9c, + 0x2b, 0x8a, 0x5c, 0x86, 0x95, 0x35, 0xb7, 0x02, 0xe3, 0xc0, 0x14, 0x7e, 0xf2, 0x8f, 0x12, 0xed, 0xef, 0x64, 0x58, + 0xb2, 0x8b, 0x3f, 0xa7, 0x2b, 0xf4, 0xda, 0xb9, 0x17, 0xcc, 0x60, 0x32, 0x44, 0xef, 0xb1, 0x84, 0x79, 0xb9, 0x13, + 0xaf, 0x4a, 0x96, 0xa5, 0x71, 0xe0, 0xa0, 0x59, 0x37, 0x6b, 0x75, 0xdf, 0x22, 0x48, 0xcb, 0x86, 0xab, 0x46, 0xac, + 0xb4, 0x12, 0x2a, 0xa1, 0x29, 0xe8, 0x88, 0x92, 0xbc, 0x44, 0x98, 0x19, 0x80, 0xb2, 0x93, 0x88, 0xca, 0x08, 0x82, + 0x63, 0x58, 0xb1, 0x98, 0x69, 0x5c, 0xd9, 0x80, 0xd5, 0xa9, 0xf1, 0x51, 0x1e, 0xba, 0x5e, 0xc0, 0x50, 0x7d, 0xed, + 0x4d, 0xc6, 0x39, 0xc6, 0xbc, 0xd6, 0x4c, 0x73, 0x72, 0xec, 0x7f, 0xdc, 0x55, 0x13, 0x24, 0x2d, 0xbe, 0x1f, 0xed, + 0x67, 0x0c, 0x4d, 0x33, 0x20, 0x96, 0x3d, 0x7c, 0xc2, 0x56, 0x07, 0x6c, 0xd2, 0x75, 0xd8, 0x48, 0x12, 0x25, 0xe8, + 0x4d, 0x9c, 0x66, 0xfb, 0x26, 0x80, 0xa1, 0xba, 0x34, 0xc8, 0x9e, 0x47, 0x46, 0xbc, 0x35, 0x96, 0x03, 0x4b, 0xbe, + 0x02, 0xba, 0xa0, 0x3c, 0xf3, 0x08, 0xce, 0xb6, 0x73, 0x20, 0x0a, 0x63, 0x2d, 0x8a, 0x4b, 0x9c, 0xf0, 0x3b, 0x92, + 0x43, 0x59, 0x32, 0x43, 0x61, 0xca, 0xe7, 0xe0, 0x5c, 0x99, 0x0f, 0x1f, 0xfe, 0x90, 0x7f, 0xfc, 0x4c, 0x57, 0x97, + 0x22, 0xf6, 0xf9, 0x71, 0x8e, 0xcf, 0xbf, 0x4d, 0x7a, 0xca, 0xed, 0x2c, 0xfc, 0x06, 0xde, 0x59, 0x42, 0xce, 0xbb, + 0x1f, 0x7e, 0xd4, 0x2d, 0x0e, 0x8a, 0x85, 0xce, 0x62, 0x8b, 0x5a, 0x70, 0xfe, 0xf9, 0x79, 0x31, 0x17, 0x55, 0x1e, + 0x13, 0x38, 0x53, 0x49, 0x59, 0xfd, 0xa6, 0x48, 0x81, 0xb4, 0x8d, 0x4a, 0xc2, 0xc6, 0xff, 0x18, 0x45, 0xf1, 0xff, + 0xa3, 0x0c, 0x85, 0x86, 0xac, 0xfd, 0xf1, 0x96, 0x45, 0x65, 0x83, 0xcd, 0xff, 0x98, 0x68, 0xad, 0x56, 0x9f, 0x09, + 0x50, 0x49, 0x5b, 0x49, 0xa5, 0x0f, 0x0a, 0x3c, 0xd3, 0xd1, 0xe4, 0x0c, 0x35, 0xc8, 0x88, 0x27, 0x8c, 0x33, 0x60, + 0x68, 0x9b, 0x75, 0xc9, 0xbb, 0x6d, 0x13, 0x7f, 0x8d, 0xc2, 0x9b, 0x32, 0xb5, 0xd1, 0x18, 0x24, 0xa7, 0x0a, 0x90, + 0xe6, 0x38, 0x5b, 0x85, 0xae, 0x68, 0xc3, 0x39, 0x37, 0x6b, 0x2d, 0x38, 0x1b, 0xc6, 0x56, 0xc3, 0x97, 0xbf, 0x20, + 0x41, 0x60, 0xd7, 0xa4, 0x0e, 0xaa, 0xb2, 0xe6, 0xc5, 0x4d, 0xf8, 0x27, 0x6c, 0x2f, 0x31, 0x98, 0xc9, 0x4b, 0x9a, + 0x77, 0xa6, 0x23, 0xa4, 0x79, 0x84, 0x9c, 0xd9, 0xfc, 0x8f, 0x62, 0x26, 0xcb, 0x43, 0x19, 0xcd, 0x7c, 0x98, 0x18, + 0xff, 0xe6, 0x49, 0x02, 0xfb, 0x99, 0xf3, 0x61, 0x14, 0x99, 0x58, 0x1e, 0xdb, 0xc6, 0x0b, 0x72, 0x1f, 0x43, 0x37, + 0x5a, 0xac, 0xb2, 0x2c, 0x63, 0x5f, 0x29, 0xb3, 0xb4, 0xb4, 0xe0, 0xf0, 0x74, 0x03, 0xa2, 0x0a, 0x9d, 0x0d, 0x21, + 0xcf, 0xa5, 0x7f, 0x59, 0xa5, 0xc2, 0xf4, 0xa1, 0xcc, 0x58, 0xeb, 0x2d, 0x10, 0x7b, 0x3d, 0x51, 0x7f, 0x72, 0x87, + 0x44, 0x9b, 0xdc, 0x68, 0xf9, 0xe0, 0x14, 0x56, 0x93, 0x74, 0x1e, 0x99, 0x88, 0x47, 0xf8, 0xce, 0xb6, 0x9f, 0xb7, + 0x4a, 0x7a, 0x7e, 0xf0, 0x11, 0x76, 0xbb, 0x34, 0xf6, 0x5e, 0xf2, 0x3b, 0xf9, 0x39, 0xfa, 0x30, 0xb8, 0x23, 0x27, + 0x25, 0xb5, 0xfd, 0xa1, 0x8f, 0x71, 0x1d, 0x28, 0xbb, 0xff, 0x41, 0xe3, 0x39, 0x64, 0x51, 0xf1, 0x68, 0x92, 0xce, + 0x30, 0x07, 0x4b, 0xfd, 0x30, 0x73, 0xe1, 0x6f, 0xd2, 0x04, 0x67, 0xd1, 0x8d, 0x5e, 0x1e, 0x4c, 0xeb, 0xc9, 0x3f, + 0x22, 0x2b, 0x7f, 0x9a, 0x65, 0x93, 0xc3, 0x69, 0xb8, 0xe0, 0x47, 0x32, 0xfa, 0xed, 0xac, 0x6e, 0x4f, 0x96, 0xad, + 0x5b, 0xed, 0x21, 0x60, 0xfa, 0x91, 0x86, 0x48, 0xde, 0x2c, 0x53, 0x85, 0x81, 0xa8, 0x18, 0x5c, 0xd0, 0x1a, 0x74, + 0x29, 0x35, 0xb5, 0x55, 0xe0, 0x8c, 0x4e, 0x04, 0x1d, 0x54, 0x70, 0xb4, 0x5c, 0xf9, 0xea, 0x07, 0x0d, 0x8b, 0x93, + 0x8a, 0xed, 0xb6, 0x28, 0x92, 0x3d, 0x83, 0xe3, 0x68, 0x11, 0x15, 0x99, 0xf1, 0xef, 0x32, 0x5a, 0x29, 0xa5, 0x54, + 0x82, 0xe0, 0x8e, 0xbe, 0xd0, 0xc5, 0x65, 0x94, 0x86, 0xfc, 0x90, 0x4a, 0xb6, 0xd0, 0x80, 0x4a, 0x29, 0x0e, 0x54, + 0x8d, 0xcb, 0x44, 0xb8, 0x32, 0x36, 0x17, 0x8d, 0x2b, 0x5a, 0x15, 0xaf, 0x62, 0x87, 0xf4, 0xfa, 0x3a, 0x51, 0x85, + 0x21, 0xcb, 0xc0, 0xe1, 0xe1, 0x1c, 0x65, 0xcd, 0x93, 0x6d, 0x28, 0xc9, 0x33, 0x15, 0x73, 0x30, 0xe3, 0x5c, 0x3d, + 0xa9, 0xc6, 0x06, 0x34, 0x54, 0x54, 0x67, 0x31, 0x9d, 0xad, 0x0e, 0xa8, 0x53, 0x02, 0x02, 0xb3, 0xf0, 0x18, 0x8f, + 0xa3, 0x10, 0x77, 0xa5, 0x0c, 0xbb, 0x70, 0x9b, 0x25, 0x58, 0x8f, 0x93, 0xe1, 0x70, 0x47, 0x1b, 0x3b, 0x17, 0x75, + 0xf8, 0x51, 0xb0, 0x4b, 0x31, 0x68, 0x48, 0x23, 0x24, 0xb9, 0xd8, 0x39, 0x75, 0x2c, 0x9a, 0x70, 0x27, 0x0b, 0x02, + 0x20, 0xf2, 0x30, 0xf5, 0xc1, 0xe2, 0xf2, 0xa8, 0xb3, 0x80, 0x89, 0x79, 0xae, 0xec, 0xa2, 0xbc, 0x81, 0xaf, 0xd6, + 0xa1, 0x1c, 0x62, 0x99, 0xc4, 0x58, 0x69, 0x33, 0xfe, 0x77, 0x59, 0x1e, 0xa5, 0x37, 0x96, 0xd5, 0xb4, 0x45, 0xf5, + 0xa0, 0xd1, 0x1d, 0xae, 0x1d, 0x31, 0x36, 0x96, 0x59, 0x27, 0x86, 0x05, 0xf3, 0xdf, 0x67, 0x86, 0xc5, 0x46, 0x55, + 0xcb, 0x37, 0x39, 0xdf, 0xbd, 0xe3, 0x53, 0x08, 0x66, 0x51, 0xc3, 0x03, 0xee, 0x1e, 0x96, 0x31, 0x2c, 0x16, 0x04, + 0xb3, 0xec, 0xc1, 0xc3, 0xba, 0x1a, 0x82, 0x34, 0xe3, 0x51, 0x92, 0x40, 0x37, 0x62, 0x28, 0x46, 0x72, 0x46, 0xc0, + 0x26, 0x29, 0xc4, 0xe0, 0x15, 0xb0, 0x3f, 0xd6, 0x25, 0xa4, 0x82, 0x23, 0x3c, 0x20, 0x1c, 0xaa, 0xb8, 0xfc, 0xb0, + 0x88, 0x61, 0x20, 0x86, 0x54, 0xbc, 0x98, 0x95, 0x4f, 0x0b, 0x80, 0x91, 0x35, 0xaa, 0x78, 0x48, 0x86, 0xc8, 0xc8, + 0x9b, 0x16, 0x19, 0x75, 0xf0, 0xc6, 0xf0, 0x1b, 0x11, 0x03, 0x5e, 0xc9, 0x19, 0xe4, 0x31, 0x27, 0x2b, 0x73, 0xf9, + 0x32, 0x77, 0xe9, 0xb7, 0xe3, 0xa9, 0x1c, 0xb7, 0xcd, 0x3c, 0xb4, 0xe9, 0x65, 0xac, 0x73, 0x51, 0x71, 0x70, 0xbd, + 0xcc, 0x31, 0xa2, 0xa7, 0xf9, 0xc2, 0xb5, 0x45, 0xf6, 0xb4, 0x86, 0xeb, 0xd7, 0x2a, 0xfb, 0xf0, 0x09, 0x19, 0x5b, + 0x40, 0x86, 0x87, 0x9d, 0xba, 0x6d, 0x64, 0x0c, 0x23, 0xf0, 0xdf, 0xc6, 0xf7, 0x13, 0xe7, 0x98, 0x2e, 0x73, 0x41, + 0x72, 0x98, 0x17, 0xf8, 0xb6, 0x30, 0xfe, 0x92, 0x73, 0x1c, 0x8d, 0xc9, 0xba, 0x87, 0x1a, 0xdd, 0xbd, 0xb4, 0xe1, + 0x0b, 0x26, 0xe8, 0xfc, 0x12, 0x1d, 0x5f, 0x93, 0x06, 0xcb, 0x7d, 0xde, 0xd7, 0x33, 0x64, 0x1a, 0x0f, 0x63, 0x4c, + 0xc8, 0x35, 0x9e, 0x33, 0xd1, 0x8d, 0x7a, 0xcf, 0x96, 0xb1, 0x96, 0xd8, 0x2a, 0xa2, 0xcd, 0x36, 0x58, 0x39, 0xaa, + 0xfe, 0xf5, 0x5d, 0x24, 0x82, 0x11, 0x35, 0xed, 0xd3, 0x5a, 0xdf, 0xa8, 0x3c, 0xf3, 0xdb, 0x99, 0x77, 0x1b, 0x56, + 0x86, 0x19, 0x04, 0x33, 0xbe, 0x62, 0xce, 0xd0, 0xcf, 0x23, 0x73, 0x0f, 0xbc, 0xdd, 0x4b, 0xef, 0xc6, 0x9a, 0x35, + 0xfa, 0x61, 0xba, 0x53, 0x92, 0x59, 0x60, 0x3b, 0xfe, 0x4d, 0xd0, 0x53, 0x21, 0xf5, 0xa3, 0x3a, 0xb0, 0xf8, 0x9a, + 0x93, 0x98, 0x90, 0x0c, 0x39, 0x58, 0x90, 0xab, 0xe6, 0xbd, 0xa7, 0xdb, 0xb6, 0x8c, 0x0a, 0x71, 0xe9, 0x74, 0xf5, + 0xe5, 0xf5, 0xda, 0x0b, 0xb4, 0xa3, 0xfa, 0xd1, 0xc6, 0xcb, 0x78, 0xf1, 0x78, 0x03, 0x77, 0x22, 0x7e, 0x43, 0x6e, + 0x68, 0x8c, 0xaf, 0xc2, 0xa3, 0xb5, 0xda, 0x2b, 0xae, 0xbd, 0x69, 0xee, 0xf1, 0x8b, 0xb9, 0x56, 0x67, 0x4e, 0xb5, + 0x57, 0x66, 0x5c, 0x99, 0xb8, 0x58, 0x51, 0x92, 0x0f, 0x5f, 0x10, 0x5c, 0xc7, 0xcf, 0xd6, 0x41, 0xb8, 0xeb, 0xf1, + 0x9d, 0x1c, 0x2c, 0xc5, 0xc0, 0x74, 0x03, 0xd7, 0x81, 0x18, 0xc3, 0xd8, 0x22, 0x01, 0x92, 0xfa, 0xa1, 0x6c, 0xc5, + 0x28, 0x18, 0xbf, 0x3e, 0x5e, 0xb6, 0xea, 0x1d, 0xff, 0x61, 0x09, 0xe0, 0xd8, 0x46, 0x38, 0x02, 0xcd, 0xac, 0x38, + 0xe5, 0x52, 0x5c, 0xe8, 0x23, 0x38, 0xb3, 0x29, 0xfb, 0x80, 0xe3, 0x90, 0x4d, 0x30, 0xed, 0x8f, 0x86, 0xca, 0xef, + 0x9f, 0xc8, 0x8f, 0x6b, 0x77, 0xbf, 0x57, 0xd7, 0x16, 0x9e, 0xfe, 0x73, 0x87, 0xde, 0x49, 0x47, 0x5e, 0x3b, 0x1d, + 0x75, 0xb8, 0x02, 0xd9, 0x71, 0x53, 0x7b, 0x56, 0x57, 0x5f, 0xc9, 0xf1, 0x63, 0x7f, 0x5b, 0x95, 0x6e, 0xe3, 0xfd, + 0xf3, 0xb2, 0xaa, 0xec, 0x6c, 0xaf, 0x5c, 0x17, 0x7f, 0x59, 0x69, 0xf2, 0xda, 0x7f, 0xd1, 0x6f, 0xe7, 0xa4, 0x1f, + 0xe6, 0x9b, 0x45, 0x8b, 0xbc, 0x61, 0x9b, 0x01, 0xfe, 0xf1, 0xa0, 0xf1, 0x50, 0x44, 0xd8, 0xdc, 0x75, 0xbf, 0xb5, + 0xa1, 0x41, 0x31, 0x27, 0xef, 0x04, 0x29, 0x0a, 0x20, 0x71, 0xc7, 0x5a, 0x01, 0x38, 0x06, 0x86, 0xc1, 0x73, 0xef, + 0x53, 0xeb, 0xc6, 0x14, 0x75, 0xb9, 0x7a, 0xa2, 0xb1, 0x9b, 0xad, 0x37, 0xf4, 0x35, 0x6e, 0xf4, 0x1f, 0x91, 0x0b, + 0x11, 0x18, 0x3c, 0x3f, 0x80, 0xfb, 0xc7, 0x29, 0x7b, 0xd1, 0x62, 0x52, 0x79, 0xc3, 0xe7, 0xf6, 0xf5, 0xe1, 0xb5, + 0x7c, 0x9a, 0xcd, 0x05, 0x12, 0xbd, 0x3e, 0x36, 0xb5, 0xd0, 0x14, 0xb9, 0x96, 0x3b, 0xd9, 0xc5, 0xd1, 0x34, 0xc4, + 0x68, 0x01, 0x50, 0x28, 0x03, 0xc6, 0x4f, 0xb0, 0x86, 0x3a, 0xe3, 0x9f, 0xcf, 0xa7, 0x3c, 0xa7, 0xfb, 0xcd, 0x5b, + 0x33, 0xbd, 0xa5, 0x39, 0xe0, 0xdb, 0x90, 0xff, 0xdb, 0x3f, 0xd1, 0xad, 0x63, 0xac, 0xf6, 0x98, 0x1d, 0x5c, 0x9b, + 0x6b, 0x59, 0xf4, 0x6f, 0x6b, 0xe2, 0xca, 0xeb, 0xd1, 0x0f, 0xf8, 0x75, 0xee, 0x0b, 0x81, 0xd1, 0x14, 0x9e, 0xb1, + 0x98, 0xb4, 0x55, 0xae, 0xef, 0x7a, 0xc2, 0x6c, 0x1b, 0x9d, 0x22, 0x35, 0x04, 0xd7, 0xfb, 0x18, 0x57, 0x1b, 0x4f, + 0xa2, 0xb2, 0xda, 0xbe, 0x79, 0x2a, 0xc0, 0x85, 0xc6, 0xf2, 0x4f, 0xd4, 0x79, 0xbb, 0x47, 0x6d, 0x72, 0xda, 0x3f, + 0x69, 0xed, 0x9e, 0x4b, 0x0f, 0x1d, 0xe9, 0xb1, 0xe9, 0x53, 0x6b, 0xde, 0x10, 0xec, 0x5b, 0xd2, 0x62, 0x2f, 0x00, + 0xdc, 0x01, 0x9e, 0xa8, 0x36, 0xd1, 0xb3, 0xaa, 0x7f, 0xec, 0x01, 0x69, 0x8c, 0xef, 0x31, 0x49, 0x95, 0x1b, 0xb9, + 0x50, 0xb3, 0x48, 0x50, 0x74, 0x1c, 0x1f, 0xdf, 0x31, 0xad, 0xd6, 0xc3, 0xf3, 0x62, 0x55, 0x0a, 0x63, 0xcb, 0xdc, + 0x9b, 0x79, 0x90, 0xd3, 0x54, 0x1f, 0xbc, 0x16, 0xee, 0x1b, 0xba, 0x14, 0x3e, 0x16, 0x8f, 0x5a, 0xed, 0x80, 0x9c, + 0x6c, 0x41, 0x08, 0x47, 0x74, 0xfe, 0x52, 0x32, 0x53, 0x80, 0xd7, 0x81, 0xbb, 0xe2, 0x18, 0x3d, 0xb6, 0xe3, 0x6e, + 0x54, 0xdc, 0xc2, 0x9f, 0x1d, 0x44, 0x11, 0xd6, 0x55, 0xbb, 0x35, 0x61, 0xce, 0xcb, 0x14, 0x46, 0xa9, 0x90, 0x80, + 0x70, 0xb8, 0xcc, 0x0d, 0x50, 0x42, 0x49, 0x40, 0x5b, 0x15, 0xd5, 0x1f, 0xca, 0xdc, 0x76, 0xbb, 0x51, 0x73, 0x1e, + 0x89, 0x87, 0x81, 0x8a, 0xf5, 0x98, 0xd6, 0x5a, 0x92, 0x03, 0x0a, 0x51, 0xb3, 0xc9, 0xf3, 0xf2, 0x8f, 0xf5, 0x48, + 0x2e, 0x05, 0x8f, 0x44, 0x2c, 0xde, 0x96, 0xe4, 0x9b, 0xfc, 0xf1, 0x0c, 0x99, 0xbd, 0xe5, 0xe4, 0x87, 0x39, 0x4c, + 0x27, 0x76, 0x19, 0xf0, 0x04, 0x05, 0xac, 0x51, 0x8f, 0xb6, 0xa2, 0xa7, 0x80, 0x74, 0x98, 0x15, 0x0c, 0x08, 0x4e, + 0xa9, 0x5f, 0xe6, 0x47, 0xbe, 0xd9, 0x96, 0x42, 0x55, 0x89, 0x68, 0x29, 0x0b, 0xbe, 0xdc, 0x9e, 0x6f, 0x26, 0x94, + 0xac, 0xb8, 0xa6, 0xb6, 0x99, 0xad, 0xa2, 0x45, 0x2b, 0x08, 0x7f, 0x5c, 0xcd, 0x8c, 0xa8, 0xbf, 0x90, 0x6e, 0xd6, + 0xb4, 0x7d, 0x80, 0xb4, 0x9a, 0x53, 0x3b, 0x3b, 0x47, 0x73, 0x41, 0x03, 0xf5, 0x18, 0xc1, 0xc6, 0xe2, 0x52, 0x93, + 0x72, 0xd6, 0x39, 0xaf, 0xc6, 0x1b, 0x86, 0xdb, 0x4d, 0x52, 0x2f, 0x8a, 0x1b, 0x57, 0x37, 0x3a, 0xe9, 0x4b, 0xd0, + 0xc1, 0xa0, 0x03, 0x86, 0x94, 0x5a, 0x85, 0x8a, 0xec, 0xce, 0x62, 0x5d, 0x38, 0x4d, 0x48, 0x3a, 0x5d, 0xf1, 0x72, + 0x52, 0xbc, 0x67, 0x84, 0x38, 0xfa, 0x01, 0x29, 0x93, 0x47, 0xa8, 0x49, 0x5e, 0xfb, 0x80, 0x21, 0xf3, 0x67, 0xd4, + 0xe2, 0xb0, 0xa1, 0x0d, 0xa2, 0x7f, 0x10, 0x38, 0x1e, 0x47, 0x90, 0x0a, 0xd6, 0x53, 0x32, 0xba, 0x04, 0x48, 0x7a, + 0x09, 0x9f, 0x1e, 0xb1, 0x60, 0x6a, 0xee, 0x94, 0x82, 0xe2, 0xc9, 0x00, 0x43, 0x5b, 0x69, 0x54, 0x96, 0x54, 0x4e, + 0xf4, 0x40, 0x03, 0xef, 0x29, 0x14, 0x10, 0x46, 0x9c, 0x3d, 0xf6, 0x39, 0x2f, 0x62, 0x50, 0xec, 0xad, 0x41, 0xe8, + 0x3e, 0x03, 0xd8, 0xc8, 0x33, 0x0c, 0x16, 0x79, 0x5e, 0x21, 0x47, 0x65, 0x2f, 0xab, 0xb9, 0xff, 0x72, 0x46, 0xd9, + 0xc0, 0xe0, 0x51, 0x3d, 0xe9, 0xe4, 0x5a, 0xbf, 0x0e, 0x27, 0xc8, 0x59, 0xfa, 0x94, 0xd5, 0xa3, 0x76, 0x6e, 0xca, + 0x98, 0xac, 0x2b, 0xf5, 0x67, 0xee, 0x61, 0x24, 0xdf, 0xca, 0x99, 0x51, 0x16, 0xa9, 0x88, 0x17, 0x7e, 0x00, 0xa5, + 0x9f, 0x67, 0x1d, 0x83, 0xc2, 0x13, 0x0b, 0x0d, 0x81, 0x38, 0xc4, 0x35, 0x36, 0xb8, 0x71, 0x20, 0x18, 0x35, 0x68, + 0x4c, 0x6e, 0x51, 0xad, 0x29, 0x72, 0x2d, 0xd4, 0xa7, 0x06, 0x43, 0x6d, 0x9c, 0x79, 0x66, 0x25, 0x98, 0xd0, 0xf0, + 0x92, 0x4f, 0x95, 0xac, 0xa3, 0xb8, 0xc2, 0x2f, 0x57, 0x80, 0xd9, 0xc0, 0x34, 0x77, 0x1d, 0x60, 0xb0, 0xd2, 0x9c, + 0x9a, 0x91, 0x67, 0xe7, 0x0e, 0xa1, 0xd4, 0x8d, 0x5e, 0xc0, 0x04, 0x30, 0x1c, 0x02, 0xda, 0xa0, 0x97, 0x17, 0x3e, + 0x5c, 0x90, 0xaa, 0x1d, 0x19, 0x70, 0xb4, 0xc8, 0x89, 0xb2, 0x75, 0x88, 0xff, 0x99, 0x48, 0x48, 0xda, 0xec, 0x40, + 0xbc, 0x39, 0x76, 0x53, 0xc7, 0xaa, 0xe7, 0x20, 0xbf, 0xba, 0xc1, 0x5e, 0x2b, 0xae, 0x4c, 0x93, 0x1a, 0x7a, 0x35, + 0x1a, 0x87, 0x82, 0xb4, 0xbc, 0x98, 0xdd, 0x78, 0xd2, 0x24, 0xba, 0x2c, 0xdd, 0x34, 0xe8, 0x21, 0xbc, 0x33, 0x0f, + 0xf9, 0x1d, 0xef, 0xeb, 0xc9, 0xfe, 0x81, 0xa2, 0x43, 0x60, 0xb7, 0x21, 0xd7, 0x15, 0x5f, 0x3f, 0x21, 0xc5, 0x32, + 0xda, 0xa7, 0x5d, 0x5b, 0xf3, 0xd4, 0xe2, 0x04, 0x86, 0xbd, 0x9c, 0x8d, 0x0b, 0x6e, 0x55, 0x84, 0x61, 0x6a, 0x28, + 0x25, 0x97, 0x9d, 0x6e, 0x49, 0x4e, 0xae, 0x05, 0x1a, 0x83, 0x40, 0x71, 0x1e, 0xf7, 0x9f, 0xd3, 0x97, 0x12, 0x6c, + 0xc7, 0x0e, 0x46, 0x27, 0xe9, 0x3d, 0xad, 0x93, 0xa3, 0xa2, 0xb0, 0xdd, 0x29, 0xdd, 0x38, 0xf0, 0xc7, 0x89, 0x2a, + 0xb5, 0x25, 0x06, 0x9e, 0xef, 0xae, 0x4d, 0x42, 0x5b, 0x73, 0x0e, 0xb0, 0x12, 0x00, 0x28, 0x2f, 0x06, 0x55, 0xbb, + 0x78, 0xe0, 0xa6, 0xa5, 0x6d, 0x70, 0xd3, 0x40, 0x8d, 0x44, 0x04, 0x51, 0x40, 0xc2, 0xd4, 0x3f, 0x37, 0x25, 0x3b, + 0xf1, 0x8e, 0x79, 0x27, 0x0a, 0x15, 0x92, 0x06, 0xda, 0x79, 0xf5, 0xf0, 0xe8, 0x63, 0x42, 0x58, 0x63, 0x9c, 0x18, + 0xdb, 0x80, 0x7d, 0xd7, 0x5a, 0xd1, 0x5c, 0x17, 0xf4, 0xb6, 0xee, 0x14, 0xd5, 0x1c, 0xa0, 0x93, 0x70, 0x3b, 0x0f, + 0x3e, 0x42, 0x46, 0x95, 0xbc, 0xdf, 0xe5, 0xc8, 0xe3, 0x12, 0x04, 0x39, 0xdf, 0x36, 0x54, 0x1e, 0x83, 0x07, 0x51, + 0xe0, 0x83, 0x2a, 0x06, 0x53, 0xe5, 0xc4, 0x4d, 0x20, 0xd5, 0x08, 0x32, 0xaf, 0x22, 0xc4, 0x2b, 0x3a, 0xf9, 0x7d, + 0x8f, 0x40, 0xac, 0x12, 0x9e, 0x24, 0xf3, 0x2a, 0xf9, 0x34, 0x23, 0xae, 0x6a, 0x83, 0x61, 0x66, 0xd8, 0x6e, 0xc9, + 0x69, 0x8c, 0x88, 0xa7, 0xe3, 0x66, 0x6f, 0xe2, 0xb9, 0x11, 0xd8, 0xc2, 0x51, 0xc4, 0xf2, 0x35, 0xd1, 0x19, 0x98, + 0x21, 0x55, 0x85, 0xd8, 0x5c, 0xf2, 0x19, 0x91, 0x8d, 0xc2, 0xf5, 0xb5, 0xf8, 0xbb, 0x4a, 0x29, 0x11, 0x19, 0xea, + 0x6b, 0xf5, 0x4f, 0xd1, 0x08, 0xdb, 0xa9, 0x62, 0xf4, 0xfa, 0xf1, 0x81, 0x7a, 0x04, 0x3a, 0x53, 0xaa, 0x8d, 0x52, + 0x2d, 0x98, 0xd7, 0x5a, 0xa1, 0x61, 0xa1, 0x75, 0xd4, 0xa7, 0x26, 0xc3, 0xe2, 0xc7, 0xab, 0xdc, 0x2e, 0x06, 0x80, + 0x4e, 0x02, 0x94, 0xec, 0x0f, 0x2d, 0xf5, 0xcd, 0x2a, 0x4b, 0x12, 0x80, 0xcc, 0x01, 0xd8, 0xe3, 0x38, 0xa9, 0x59, + 0x91, 0x1d, 0xfd, 0x42, 0x54, 0x4e, 0xd8, 0xe1, 0x8b, 0xa5, 0x69, 0xfe, 0x00, 0x57, 0x09, 0xcc, 0x08, 0x31, 0x19, + 0xd7, 0x51, 0x67, 0x83, 0xd0, 0x02, 0xa0, 0x5b, 0xda, 0xa9, 0x87, 0xe4, 0xed, 0x7a, 0x0c, 0x52, 0xf6, 0x01, 0xea, + 0xbc, 0xab, 0xe1, 0xfa, 0x08, 0xc3, 0x9c, 0x1d, 0x24, 0xa0, 0x9d, 0xaa, 0xd0, 0x9f, 0x9a, 0xa6, 0x72, 0x44, 0xaf, + 0xa7, 0x4d, 0x07, 0x95, 0xbb, 0x89, 0x2a, 0x13, 0xe0, 0xe0, 0x4d, 0x3c, 0x49, 0xe2, 0xb0, 0xdb, 0x4b, 0x4d, 0x53, + 0x3f, 0x99, 0xb8, 0xb2, 0x5a, 0x4d, 0xf9, 0x76, 0x6e, 0x95, 0xd0, 0xd2, 0xe3, 0x42, 0x88, 0x79, 0xbc, 0xe7, 0x81, + 0xeb, 0x65, 0xdf, 0xc8, 0x1a, 0x2c, 0xee, 0x9b, 0x95, 0x51, 0x95, 0xd3, 0x11, 0x1a, 0x93, 0x62, 0x9e, 0xfc, 0x05, + 0x88, 0xd1, 0xdd, 0x4e, 0xd3, 0xeb, 0x10, 0x42, 0x44, 0x37, 0xfb, 0xf6, 0x9e, 0x1a, 0xeb, 0x88, 0x3d, 0x21, 0x2c, + 0x73, 0xc3, 0x4b, 0x74, 0x0c, 0xdc, 0xf6, 0xae, 0x2c, 0xc9, 0x74, 0xf9, 0xdc, 0x17, 0x20, 0x7c, 0x1d, 0x30, 0x43, + 0x0a, 0x54, 0x4a, 0xec, 0x83, 0xcd, 0xf7, 0x91, 0xd0, 0x3c, 0x3d, 0x17, 0xb6, 0x11, 0x7a, 0xbe, 0xec, 0xb3, 0xf5, + 0x5b, 0x38, 0x62, 0x6b, 0xab, 0x60, 0x0f, 0x7b, 0xb9, 0x6e, 0x91, 0xd1, 0x3c, 0xf8, 0x85, 0xe9, 0x2c, 0x0b, 0x89, + 0x57, 0x1b, 0xf5, 0x0d, 0xeb, 0x1d, 0x5b, 0xfa, 0x4c, 0x66, 0x4d, 0x3c, 0x4c, 0xd6, 0xd3, 0xc8, 0xc3, 0xc9, 0xa9, + 0x3c, 0xc7, 0xe6, 0xa9, 0xb0, 0xc0, 0x1b, 0xba, 0x7a, 0x7a, 0xcb, 0xb8, 0xf7, 0xa6, 0x21, 0x79, 0x89, 0xcf, 0xce, + 0xa2, 0x05, 0xa0, 0x98, 0xa8, 0x9c, 0x5e, 0xbb, 0xc0, 0x09, 0xf6, 0x7a, 0x51, 0x41, 0x83, 0x63, 0xe4, 0xd8, 0x96, + 0xe0, 0xe9, 0x70, 0x26, 0x67, 0x9d, 0x0b, 0x48, 0x5f, 0x33, 0xa9, 0x39, 0x0b, 0x73, 0x4e, 0x4a, 0x11, 0xf8, 0xe8, + 0x51, 0x9c, 0xa3, 0x79, 0xba, 0x01, 0x04, 0x86, 0x8a, 0xf7, 0x5d, 0x60, 0x8f, 0x37, 0x1c, 0xa9, 0x8b, 0x1c, 0xac, + 0xe4, 0x3d, 0x31, 0xcc, 0x0a, 0xfd, 0xeb, 0xe7, 0x07, 0x2b, 0x85, 0x8a, 0x5c, 0x8e, 0x51, 0x88, 0x62, 0xf7, 0x8c, + 0x08, 0xcc, 0x4d, 0xa5, 0x3a, 0x08, 0xd4, 0xf2, 0x0f, 0xb6, 0x5f, 0x08, 0x57, 0x4a, 0x70, 0xeb, 0x41, 0x5d, 0x5a, + 0x42, 0xc6, 0x1e, 0xce, 0xea, 0x2d, 0xd2, 0x58, 0x40, 0xb0, 0xc7, 0x5c, 0x6b, 0x7a, 0x98, 0x03, 0xc9, 0xac, 0x06, + 0x18, 0x6d, 0x89, 0x20, 0xf5, 0x82, 0xc1, 0x2e, 0x15, 0xdd, 0xd7, 0x05, 0x45, 0xba, 0xcb, 0xa8, 0x31, 0x95, 0x56, + 0x72, 0x7c, 0x1e, 0x62, 0x7f, 0xad, 0xa9, 0x5a, 0xea, 0xab, 0xec, 0x6b, 0x72, 0xba, 0xbb, 0x5f, 0x6c, 0xfc, 0x48, + 0xf8, 0x79, 0xae, 0x98, 0x41, 0x95, 0x8c, 0xa3, 0x5d, 0xc2, 0xa4, 0xa1, 0x7a, 0xa5, 0x38, 0x6e, 0x2c, 0x37, 0x9e, + 0x6e, 0x5f, 0x74, 0xc6, 0x56, 0xe9, 0xbf, 0xbb, 0x05, 0x3e, 0x27, 0xdd, 0x6b, 0x32, 0x4f, 0x49, 0x6c, 0xf0, 0x43, + 0xf7, 0x20, 0x9d, 0x28, 0xcf, 0xfd, 0xcb, 0xf3, 0xe3, 0x39, 0x29, 0x62, 0xdb, 0x56, 0xe4, 0x95, 0x15, 0xa0, 0x1c, + 0xd2, 0x6e, 0x02, 0xea, 0x4b, 0x37, 0xea, 0x4d, 0xe4, 0x8d, 0x0d, 0xbc, 0x84, 0xd4, 0x1a, 0x28, 0x76, 0x61, 0xec, + 0xab, 0xd3, 0x51, 0x48, 0x93, 0x33, 0xd9, 0x43, 0x42, 0x31, 0x61, 0x80, 0xfe, 0x69, 0x71, 0x34, 0xa3, 0x82, 0xd6, + 0xfb, 0xbd, 0xa8, 0x8e, 0x65, 0xe7, 0x1a, 0x08, 0x99, 0xd9, 0x68, 0x96, 0xbf, 0xc8, 0xf0, 0xc6, 0x21, 0xf2, 0x55, + 0x66, 0x3a, 0x3a, 0xf0, 0xd7, 0x94, 0x3b, 0xa9, 0xc3, 0xc6, 0x55, 0x76, 0x24, 0x81, 0xff, 0x2e, 0x73, 0x22, 0x14, + 0xbe, 0x99, 0x2d, 0x0f, 0xe4, 0x6b, 0x5d, 0xf9, 0x5f, 0x33, 0xea, 0xb3, 0xc2, 0x1d, 0x6d, 0xcb, 0xd5, 0x8c, 0xc3, + 0xd9, 0x70, 0x20, 0xf3, 0xf1, 0x81, 0x0b, 0x5e, 0x79, 0xaa, 0xca, 0x7e, 0x13, 0x0e, 0xc9, 0x03, 0x7b, 0x36, 0x39, + 0x4a, 0x4b, 0x47, 0xed, 0x7f, 0xe5, 0xb4, 0xe8, 0x50, 0x34, 0x2c, 0x5a, 0x17, 0x05, 0xa2, 0x56, 0x1b, 0xcb, 0xcb, + 0x3c, 0x22, 0x41, 0xed, 0x8b, 0xc5, 0x43, 0x7b, 0xe0, 0xa3, 0x29, 0x46, 0xbe, 0xcf, 0x58, 0x07, 0x12, 0x7d, 0x7f, + 0x44, 0x90, 0x32, 0x50, 0x3a, 0x74, 0x06, 0xa5, 0x89, 0x29, 0x1e, 0x93, 0x3c, 0x67, 0xb1, 0xc2, 0x5e, 0xf2, 0x3a, + 0x2a, 0x07, 0x2b, 0x92, 0x7f, 0x8e, 0x08, 0x70, 0x14, 0x0c, 0x1e, 0x45, 0x9e, 0xfa, 0x25, 0xb8, 0xe5, 0xbe, 0x3f, + 0x60, 0x44, 0x56, 0xd2, 0x58, 0x5b, 0x8c, 0x5e, 0x88, 0x91, 0xf9, 0x08, 0x8e, 0xc7, 0xef, 0x9b, 0xa3, 0x14, 0x94, + 0xbe, 0xb4, 0x2b, 0x50, 0xdc, 0x04, 0xba, 0xb4, 0x9b, 0x1a, 0xa7, 0x81, 0x9c, 0xc8, 0xb4, 0xb5, 0x1d, 0xf7, 0xdd, + 0xd9, 0xb1, 0xa0, 0x2d, 0x41, 0xc6, 0x74, 0x17, 0x9a, 0x39, 0x0a, 0x0c, 0xef, 0xb7, 0x1a, 0x47, 0xc0, 0x80, 0x5d, + 0x63, 0x3d, 0xfc, 0x52, 0x4c, 0xfb, 0x54, 0xe9, 0x87, 0x2b, 0x9c, 0xb3, 0x4b, 0x3a, 0xbd, 0xf9, 0xfd, 0x40, 0x06, + 0xc4, 0xc5, 0x1b, 0x31, 0xf5, 0x05, 0xcc, 0x2f, 0x83, 0x02, 0x10, 0xa6, 0x12, 0x58, 0xfa, 0xbf, 0x98, 0x0b, 0xbc, + 0x13, 0x87, 0x35, 0x83, 0x03, 0x83, 0x88, 0x8f, 0x3b, 0xb8, 0xc5, 0x5f, 0x87, 0xff, 0x68, 0x80, 0xba, 0x72, 0xf7, + 0x19, 0x65, 0xcd, 0xf7, 0x49, 0x29, 0x32, 0x7d, 0xf9, 0xee, 0x65, 0x2b, 0xd4, 0x41, 0x8e, 0x6d, 0x6e, 0x55, 0xf3, + 0xda, 0xe2, 0xf7, 0xd3, 0x58, 0xcd, 0x4d, 0x7e, 0xd3, 0xdb, 0x55, 0x57, 0x4f, 0x8d, 0x1a, 0xf5, 0x84, 0x60, 0xf4, + 0xe6, 0x66, 0xd8, 0xad, 0xf1, 0xcb, 0x59, 0x09, 0x68, 0x64, 0xb3, 0x57, 0xbf, 0x47, 0x41, 0xae, 0xaf, 0xf5, 0xf3, + 0xbc, 0xac, 0x32, 0x2e, 0xbe, 0x09, 0xc0, 0x53, 0xe3, 0x43, 0xa2, 0x4a, 0xb5, 0x2c, 0x0d, 0x51, 0x93, 0x00, 0x82, + 0xc3, 0x1f, 0x74, 0x0b, 0x2e, 0xed, 0x57, 0x72, 0x9b, 0x55, 0x79, 0x6d, 0x45, 0xd0, 0x81, 0x45, 0x9f, 0xae, 0x0c, + 0x76, 0x30, 0xe0, 0xe1, 0x14, 0xfd, 0x43, 0xf1, 0x87, 0x89, 0xed, 0x9d, 0x6d, 0x4a, 0x28, 0x1f, 0x9a, 0xb9, 0x17, + 0x77, 0xf6, 0x4c, 0x11, 0xcd, 0x22, 0xd4, 0xac, 0x82, 0x19, 0x2c, 0x1b, 0x6a, 0xe7, 0x1a, 0x12, 0xf6, 0x08, 0x52, + 0x4c, 0xc1, 0xb8, 0xd1, 0xde, 0x90, 0xee, 0x88, 0x6b, 0x06, 0xe5, 0xb0, 0x50, 0x94, 0xf9, 0xcd, 0x08, 0xc9, 0x38, + 0xa7, 0xe9, 0x0d, 0x0a, 0xfc, 0x30, 0xe0, 0x73, 0x79, 0xb0, 0x20, 0xcf, 0x1f, 0x55, 0xe9, 0x74, 0x14, 0xfb, 0x56, + 0x12, 0x31, 0x63, 0xda, 0x81, 0x2d, 0xaf, 0xf7, 0xca, 0x74, 0x61, 0xb3, 0x4f, 0x3a, 0xd6, 0x1d, 0xe2, 0xed, 0x29, + 0x71, 0x1d, 0xc4, 0x9e, 0xa6, 0x1c, 0x36, 0x79, 0x3d, 0x99, 0xe3, 0x68, 0x51, 0x76, 0x5d, 0xac, 0xa6, 0x33, 0x14, + 0x7a, 0x0b, 0xc9, 0x46, 0x1b, 0x7a, 0xfe, 0xa4, 0x72, 0x8c, 0xf3, 0xc3, 0xe5, 0x24, 0x86, 0xe9, 0x4b, 0xa9, 0x21, + 0x5a, 0xb7, 0x94, 0xee, 0xb1, 0xbe, 0x63, 0x05, 0x5b, 0xb3, 0xf7, 0x8f, 0x44, 0x96, 0x26, 0x96, 0xa9, 0xd4, 0x96, + 0x9d, 0xba, 0x71, 0xef, 0x59, 0x7b, 0xfc, 0xde, 0x62, 0xb1, 0x46, 0xea, 0x6c, 0xb4, 0x31, 0xcd, 0x40, 0x3e, 0x1a, + 0xda, 0x07, 0x5f, 0x30, 0x65, 0x0b, 0xfd, 0x70, 0xde, 0x6d, 0xd0, 0x16, 0xe3, 0x33, 0x86, 0xa6, 0xd9, 0x9d, 0x0f, + 0xbc, 0xfa, 0x2c, 0x8b, 0x2e, 0x17, 0x1d, 0x4f, 0x73, 0x8c, 0x18, 0x75, 0xff, 0x5f, 0x1e, 0xf6, 0x52, 0x86, 0xbb, + 0x3c, 0x21, 0xc3, 0x4e, 0xee, 0xdb, 0x29, 0xab, 0x80, 0x7c, 0x8c, 0xad, 0xf4, 0xbc, 0x72, 0x30, 0xa2, 0xd2, 0x51, + 0x9c, 0xe9, 0x3f, 0x7c, 0xe5, 0xd7, 0x32, 0x8d, 0xda, 0xf4, 0xa3, 0xcb, 0x92, 0xbf, 0xb2, 0x1a, 0x88, 0x36, 0x4f, + 0x88, 0x4c, 0xfe, 0x4f, 0x24, 0x25, 0x47, 0x06, 0xe2, 0xd1, 0x01, 0x14, 0x30, 0x53, 0x27, 0x93, 0xd3, 0x62, 0x70, + 0x02, 0x22, 0x4b, 0x34, 0x87, 0x73, 0x00, 0x93, 0xb4, 0x04, 0x13, 0x1e, 0xd7, 0x6a, 0xdf, 0x63, 0xc6, 0x01, 0x7f, + 0x99, 0x47, 0x73, 0x70, 0xf7, 0x01, 0x2d, 0x9a, 0x80, 0x64, 0x24, 0x61, 0x58, 0x6b, 0xdb, 0x79, 0x38, 0xd9, 0x4e, + 0xf0, 0xac, 0x7a, 0x7d, 0xc0, 0x8f, 0xb5, 0x82, 0xcb, 0x9d, 0x28, 0x45, 0x75, 0x1f, 0x7c, 0xd9, 0xea, 0xcd, 0x21, + 0xd4, 0x59, 0x0f, 0xf5, 0xcc, 0x40, 0x71, 0xdb, 0xce, 0x66, 0x54, 0xf3, 0x05, 0xff, 0xf8, 0xcb, 0xc2, 0x50, 0x2c, + 0x9a, 0x35, 0x64, 0xc0, 0x00, 0xdc, 0xc6, 0x9c, 0xef, 0x75, 0xfc, 0x97, 0x4f, 0x90, 0xb0, 0x17, 0x11, 0xf6, 0x26, + 0xc5, 0x28, 0xe1, 0x97, 0x13, 0x06, 0x04, 0xf1, 0xda, 0x13, 0x25, 0x88, 0xf4, 0xa0, 0x3e, 0x99, 0x66, 0x5c, 0x66, + 0x33, 0x48, 0xd6, 0xb0, 0x08, 0xba, 0xdd, 0x35, 0xeb, 0x32, 0xe3, 0x4f, 0x7e, 0xc8, 0x70, 0x0d, 0xf4, 0x4f, 0x26, + 0x4a, 0x3a, 0x37, 0x24, 0xa8, 0xf8, 0x20, 0x5e, 0xe6, 0x50, 0x79, 0xde, 0x33, 0xe4, 0xe9, 0xf9, 0x47, 0x7f, 0xdf, + 0xcc, 0x1c, 0xca, 0x53, 0xd6, 0xe4, 0xef, 0x9e, 0xea, 0xfe, 0xa7, 0xc8, 0x2b, 0x3a, 0xf3, 0xd5, 0xac, 0xb3, 0xe2, + 0x3a, 0xe3, 0xec, 0x88, 0x54, 0x70, 0x6a, 0x45, 0xeb, 0x1d, 0x0f, 0xb1, 0x69, 0xfc, 0xb5, 0x40, 0xea, 0xec, 0x91, + 0xb9, 0x67, 0x07, 0x15, 0xa3, 0x25, 0x14, 0x58, 0x2f, 0xa2, 0x06, 0xbe, 0x1d, 0xb5, 0x19, 0x33, 0x7d, 0x4e, 0x0a, + 0xb4, 0x68, 0x09, 0x36, 0x6d, 0x17, 0xa3, 0x26, 0x5e, 0x96, 0xcc, 0x15, 0x27, 0xfc, 0xe9, 0x32, 0x53, 0xec, 0x87, + 0x8c, 0xd4, 0xc1, 0x9e, 0x17, 0x2b, 0x96, 0x2c, 0x97, 0x4f, 0xd7, 0x0f, 0xc9, 0x2e, 0xf7, 0x1e, 0x11, 0x33, 0x5e, + 0x3f, 0x5e, 0xb2, 0x4b, 0x09, 0x28, 0x91, 0x91, 0x0d, 0xe3, 0x36, 0x12, 0x6a, 0x14, 0x15, 0xa3, 0x2b, 0x50, 0x72, + 0xac, 0x53, 0x11, 0x00, 0xf0, 0xc7, 0xf4, 0x52, 0xd8, 0xc0, 0x83, 0xd3, 0x89, 0x02, 0x94, 0x91, 0xa7, 0xef, 0x4c, + 0xc6, 0x82, 0xe8, 0xa8, 0x99, 0xc3, 0xef, 0x84, 0xb1, 0x7a, 0xe6, 0xde, 0xeb, 0xa3, 0x48, 0xb0, 0x7b, 0xd9, 0x08, + 0x03, 0x89, 0x65, 0xd9, 0x64, 0x1c, 0xb6, 0x6e, 0x2b, 0xfc, 0xb4, 0x58, 0x81, 0x34, 0x05, 0x68, 0xde, 0xd3, 0x46, + 0xc0, 0x69, 0x18, 0xb3, 0x2f, 0x13, 0x48, 0xa9, 0x82, 0xb1, 0xfc, 0xa4, 0x64, 0xc3, 0xb3, 0x49, 0xde, 0xfd, 0xc4, + 0xd3, 0x5c, 0x20, 0xe4, 0xc5, 0x02, 0xdb, 0x9a, 0xa9, 0x13, 0xbf, 0x19, 0xe5, 0x66, 0x3f, 0x56, 0xcd, 0xa2, 0x0d, + 0x47, 0x1e, 0x95, 0xe5, 0xa6, 0x1b, 0xdd, 0xda, 0x2d, 0x58, 0xb5, 0x10, 0xa9, 0xe6, 0x78, 0x19, 0x80, 0x8d, 0xe8, + 0x97, 0x94, 0x61, 0xf5, 0x83, 0x4e, 0x81, 0x64, 0x61, 0xc8, 0xb6, 0xcd, 0x92, 0x32, 0x18, 0x82, 0xf2, 0xa8, 0x9a, + 0x02, 0xac, 0x91, 0xf2, 0x4d, 0x0a, 0xa3, 0xc9, 0xbf, 0x6a, 0x8b, 0xfe, 0x93, 0xff, 0x29, 0xd6, 0x7b, 0x26, 0x88, + 0x64, 0x7b, 0x38, 0x9f, 0x9d, 0xa6, 0x05, 0x33, 0x68, 0x14, 0x84, 0xf6, 0x60, 0x4a, 0xcd, 0x49, 0x24, 0x06, 0x25, + 0x17, 0x22, 0xfb, 0x93, 0xea, 0x2d, 0xc7, 0x47, 0x1e, 0xb2, 0xaf, 0x6f, 0x92, 0x26, 0x9d, 0x56, 0xa7, 0xca, 0x08, + 0xee, 0x0a, 0x9c, 0xa0, 0x04, 0xb3, 0x01, 0xfd, 0x93, 0x9f, 0x3f, 0x85, 0x24, 0xfa, 0xd0, 0x05, 0x84, 0x52, 0x67, + 0xcf, 0x88, 0xdc, 0x2c, 0x3c, 0xa2, 0x55, 0x88, 0x62, 0x5c, 0x20, 0x07, 0xc8, 0xfc, 0xb7, 0x91, 0x05, 0xbd, 0x86, + 0xfd, 0x42, 0x37, 0xa2, 0x7d, 0x08, 0x8b, 0x11, 0x9b, 0x2b, 0xde, 0xe8, 0x3d, 0x90, 0x67, 0x88, 0x1b, 0xf7, 0x34, + 0x2e, 0x68, 0xe9, 0x2a, 0x9b, 0x95, 0x02, 0xdd, 0xc4, 0xa3, 0x3e, 0x09, 0x1d, 0xb5, 0x5a, 0xde, 0x0c, 0xd1, 0x3b, + 0xd0, 0xf3, 0x7a, 0xff, 0x04, 0xdf, 0x0e, 0x08, 0x10, 0x51, 0xb8, 0xa3, 0x33, 0xf9, 0xc1, 0xe1, 0x77, 0xae, 0x3c, + 0xff, 0xc8, 0x44, 0x3d, 0x52, 0x99, 0xef, 0x96, 0xf8, 0xbb, 0x5b, 0xde, 0xff, 0xa1, 0x29, 0x53, 0x82, 0xf2, 0x83, + 0x60, 0x60, 0x64, 0x85, 0x0f, 0xae, 0x9d, 0x0e, 0xbf, 0x91, 0x79, 0x89, 0xe2, 0x85, 0xe4, 0xb2, 0x85, 0xdb, 0x2b, + 0xc6, 0x55, 0xac, 0xe2, 0xca, 0x0e, 0xda, 0x67, 0xdc, 0x7a, 0xfc, 0x10, 0x35, 0xc6, 0x1a, 0x47, 0xe7, 0x1c, 0x94, + 0x06, 0x84, 0x04, 0xd3, 0xc0, 0x26, 0x3d, 0x5a, 0x60, 0x99, 0x16, 0x48, 0x09, 0x42, 0x48, 0x2a, 0xba, 0x1f, 0x43, + 0x53, 0x89, 0xcd, 0x8c, 0x20, 0xad, 0x2a, 0x76, 0xa8, 0xc4, 0x29, 0x67, 0x1f, 0xa6, 0x58, 0x23, 0x7c, 0xaa, 0xe9, + 0x3b, 0x88, 0x92, 0xc8, 0x7b, 0x4e, 0x2e, 0x2e, 0x1d, 0x68, 0x45, 0xa6, 0x4a, 0x49, 0xdf, 0x79, 0xc1, 0xad, 0xbf, + 0xd6, 0x3e, 0x20, 0xd6, 0x41, 0x15, 0xf4, 0xac, 0x8a, 0xbf, 0xdc, 0x62, 0xae, 0xa4, 0x25, 0x56, 0xb1, 0xa7, 0x2c, + 0xf6, 0x73, 0x5a, 0x71, 0x1e, 0xce, 0x69, 0xe8, 0x2e, 0x39, 0x77, 0xa9, 0xb8, 0x27, 0x9d, 0xf5, 0x12, 0xe1, 0xbe, + 0x65, 0x07, 0xd3, 0x67, 0x25, 0xfc, 0xf8, 0xbb, 0x39, 0x29, 0x29, 0xd7, 0x81, 0x46, 0xcf, 0x61, 0xe0, 0x65, 0xd0, + 0xa2, 0xee, 0xd4, 0xc0, 0x3d, 0x91, 0xe8, 0x5b, 0x7f, 0x60, 0xc6, 0x66, 0xd9, 0x12, 0x19, 0x14, 0xcf, 0xd4, 0xff, + 0x24, 0x48, 0xe2, 0xb1, 0xfc, 0x23, 0x2f, 0x0e, 0x49, 0x22, 0xa9, 0x3e, 0x80, 0x3e, 0x09, 0x9e, 0x58, 0x80, 0x57, + 0x7f, 0xa0, 0x80, 0xa1, 0x28, 0x57, 0x39, 0x32, 0x77, 0xc2, 0x1c, 0xf2, 0x74, 0x57, 0xbd, 0x53, 0x07, 0x38, 0x7d, + 0xb5, 0x9e, 0x4d, 0x40, 0xa7, 0x85, 0x1e, 0xa0, 0xc4, 0x99, 0x11, 0xa5, 0x19, 0x07, 0xa7, 0x86, 0x39, 0xfc, 0xaf, + 0x57, 0x12, 0x61, 0xec, 0xc1, 0xc3, 0x41, 0xe3, 0x41, 0x05, 0xf9, 0xd9, 0x8e, 0xa6, 0x34, 0x0c, 0x48, 0xc2, 0xb9, + 0x16, 0xab, 0x64, 0x19, 0x5e, 0x3c, 0xf2, 0xca, 0x0c, 0xe1, 0x04, 0xd6, 0x9d, 0x3e, 0x95, 0x0e, 0x82, 0x71, 0x09, + 0x17, 0x2a, 0xaf, 0x39, 0x35, 0x1c, 0x69, 0xb9, 0x40, 0xf1, 0x57, 0x9a, 0xa8, 0x6b, 0x11, 0x4f, 0xe6, 0x47, 0x5c, + 0x35, 0x10, 0x61, 0xda, 0x05, 0x01, 0x96, 0x97, 0xc8, 0xad, 0x85, 0x72, 0xed, 0xb7, 0x1e, 0x36, 0x30, 0x06, 0xeb, + 0xe6, 0xd7, 0x4b, 0x7e, 0x7d, 0xd3, 0xb4, 0xf6, 0xe2, 0x2d, 0x2a, 0x34, 0x9d, 0xe8, 0xe9, 0x90, 0x22, 0x3c, 0x1d, + 0x77, 0x11, 0x19, 0x46, 0x03, 0x4c, 0xdf, 0x56, 0xd5, 0x62, 0x26, 0xed, 0x00, 0xfa, 0xb9, 0x20, 0xcd, 0x01, 0xa0, + 0x29, 0x42, 0xd9, 0x01, 0x70, 0x15, 0xaa, 0xf5, 0xba, 0x5f, 0x69, 0x63, 0x63, 0x3c, 0xe0, 0x11, 0x81, 0x59, 0xf1, + 0x94, 0x42, 0xc9, 0x79, 0x02, 0x79, 0xb1, 0x4d, 0x55, 0xba, 0x99, 0x96, 0xcd, 0xfa, 0xdd, 0xfa, 0x47, 0x96, 0x00, + 0xa2, 0x26, 0x79, 0x64, 0x32, 0x81, 0x0d, 0x15, 0xd2, 0x14, 0xc7, 0xa4, 0x56, 0x02, 0xae, 0xf9, 0xb0, 0x8f, 0x6c, + 0x09, 0x38, 0x3b, 0x70, 0x2d, 0x88, 0xc3, 0x59, 0x33, 0x64, 0xb2, 0x3c, 0xa7, 0xad, 0xd1, 0x3f, 0x5b, 0xad, 0xb1, + 0xb5, 0xff, 0x43, 0x4b, 0x71, 0x3f, 0x19, 0x0b, 0x4d, 0x0c, 0x48, 0x6d, 0x8f, 0xbf, 0xbb, 0x95, 0x74, 0xe6, 0x6d, + 0xc1, 0x49, 0xff, 0x37, 0xd3, 0xe6, 0x74, 0x9e, 0x3d, 0x39, 0x8c, 0x7c, 0xc0, 0x98, 0x0a, 0x61, 0x8c, 0x93, 0xf0, + 0x62, 0x3b, 0xbc, 0x68, 0x0c, 0x6a, 0xff, 0xe5, 0x0e, 0x86, 0x9c, 0xea, 0xd8, 0x7b, 0x1f, 0x44, 0xc9, 0xbe, 0x98, + 0x5b, 0x34, 0x56, 0x87, 0xb4, 0x28, 0x6e, 0xfb, 0x00, 0x32, 0xf0, 0xd2, 0xfd, 0xff, 0xb8, 0x75, 0x88, 0x63, 0xb0, + 0x09, 0x79, 0x89, 0x4b, 0x12, 0xb3, 0x4d, 0x1f, 0x05, 0xf5, 0xfa, 0xb4, 0x11, 0x2e, 0xd1, 0x5c, 0xe9, 0xfe, 0x07, + 0x2f, 0x5b, 0x54, 0x77, 0x29, 0x0f, 0xf7, 0x0e, 0x8c, 0x69, 0x7c, 0x73, 0xf3, 0x3d, 0x0d, 0xa6, 0x14, 0xba, 0x19, + 0xef, 0x60, 0x13, 0xbb, 0xde, 0x56, 0x56, 0x6c, 0x17, 0x99, 0xa2, 0xa2, 0xa9, 0xd1, 0x47, 0x33, 0xd8, 0xec, 0xd0, + 0x80, 0xf6, 0x6f, 0x31, 0xc9, 0x60, 0xf1, 0x70, 0x6b, 0x2e, 0x44, 0xcb, 0xeb, 0x9c, 0xed, 0x28, 0x38, 0x27, 0x23, + 0x8e, 0x24, 0x48, 0x93, 0xee, 0x3b, 0x8e, 0x1e, 0xd4, 0x41, 0xd5, 0x88, 0x3b, 0x6d, 0xc9, 0x7e, 0x45, 0x7d, 0x97, + 0x3e, 0xae, 0x0b, 0x79, 0xe5, 0x1c, 0x48, 0xc4, 0x67, 0x85, 0x37, 0x27, 0x44, 0x46, 0x6d, 0x1b, 0xa9, 0x15, 0x59, + 0x91, 0x5f, 0x21, 0x25, 0xea, 0x5f, 0x51, 0x2b, 0xc8, 0x62, 0x0e, 0xc0, 0xc0, 0x36, 0x00, 0xab, 0xdf, 0xac, 0x18, + 0xb2, 0xa5, 0x80, 0xc6, 0x2f, 0x67, 0xdb, 0x7c, 0xe2, 0x96, 0xec, 0xe8, 0x17, 0x44, 0x6d, 0x6b, 0x45, 0x13, 0x9c, + 0x77, 0x2f, 0xac, 0x9e, 0x89, 0xdf, 0x53, 0xcf, 0xb7, 0xc0, 0x36, 0x90, 0x4f, 0xd2, 0xfd, 0xce, 0x99, 0x3e, 0x60, + 0x0f, 0xc6, 0x58, 0xc7, 0x60, 0x57, 0xd8, 0x63, 0xa3, 0x37, 0x55, 0xe5, 0x39, 0x68, 0x57, 0xb7, 0x1c, 0x15, 0xf1, + 0xf8, 0x2d, 0xcb, 0x3a, 0x18, 0x66, 0x18, 0x3d, 0xf3, 0x05, 0x94, 0x2d, 0xda, 0x11, 0x99, 0x93, 0x5c, 0x46, 0xdb, + 0x54, 0x0e, 0x28, 0x81, 0x05, 0x31, 0xa9, 0x71, 0x4a, 0xdd, 0x2d, 0x9b, 0x97, 0xae, 0xa3, 0x09, 0xf1, 0xd6, 0x5f, + 0x67, 0x3e, 0xd7, 0x83, 0xa3, 0xf2, 0x3c, 0x44, 0x60, 0x1a, 0xc8, 0xc3, 0x02, 0x0e, 0x23, 0x79, 0x5e, 0x8a, 0x40, + 0x01, 0xef, 0x06, 0x7d, 0xb6, 0x19, 0x28, 0x72, 0x0a, 0x91, 0x77, 0x9e, 0x83, 0x05, 0xba, 0xc1, 0x53, 0x44, 0x19, + 0x87, 0x87, 0xff, 0x2e, 0x70, 0x19, 0x1e, 0x92, 0x25, 0x8c, 0xef, 0x1d, 0x4e, 0x24, 0x27, 0xa9, 0x8b, 0xa4, 0xf5, + 0x4b, 0x78, 0xa6, 0xb6, 0x71, 0x6b, 0xfe, 0x22, 0xfb, 0x24, 0x76, 0xaf, 0xbc, 0x80, 0xf9, 0x18, 0x35, 0xd9, 0x65, + 0xfe, 0xc2, 0x3c, 0x26, 0x3d, 0x33, 0xaf, 0xd1, 0x6a, 0x0d, 0x78, 0x20, 0x69, 0x45, 0x58, 0xca, 0x2c, 0x99, 0x73, + 0x19, 0x00, 0xe8, 0xda, 0x78, 0xd8, 0x1a, 0x42, 0x7c, 0x22, 0xd7, 0x77, 0x45, 0x42, 0x65, 0xaa, 0x59, 0x96, 0x23, + 0xf7, 0xc9, 0x4d, 0x08, 0x4b, 0xb5, 0xcb, 0x12, 0xb7, 0x99, 0xe6, 0xb6, 0x36, 0x3c, 0xf7, 0xca, 0xf2, 0xbd, 0xc0, + 0x14, 0xf5, 0xa0, 0xbf, 0xb3, 0x8d, 0x38, 0x45, 0x10, 0x22, 0x66, 0x70, 0x87, 0xa3, 0x11, 0x64, 0x53, 0x4e, 0xf4, + 0x67, 0xbb, 0xc4, 0xe6, 0xa7, 0x97, 0xa9, 0xaa, 0x70, 0x39, 0x62, 0x32, 0xb1, 0x39, 0x1b, 0xb0, 0x98, 0x83, 0x57, + 0x7b, 0x72, 0x9b, 0xdb, 0xb2, 0xec, 0x8d, 0x08, 0x56, 0x83, 0x16, 0xce, 0x1d, 0x2c, 0x15, 0xfa, 0x4e, 0x66, 0xbd, + 0xab, 0x83, 0x9b, 0xd9, 0x6f, 0xd2, 0xee, 0x8f, 0x1c, 0x7d, 0x55, 0x69, 0xdc, 0x81, 0x6d, 0x2c, 0x81, 0x0d, 0x8f, + 0x11, 0x29, 0x87, 0x44, 0xf5, 0xa9, 0x4f, 0x6c, 0x1e, 0xd5, 0x98, 0xe4, 0x38, 0xc8, 0x1d, 0x26, 0xae, 0x68, 0x3a, + 0x9b, 0xb4, 0x10, 0xbb, 0x52, 0x21, 0x3d, 0x9d, 0x85, 0xfc, 0x16, 0x73, 0xd3, 0x75, 0x92, 0xc8, 0xd6, 0xb5, 0x0f, + 0xf9, 0xa2, 0x25, 0x75, 0x68, 0x60, 0xa7, 0xc7, 0x1c, 0xfd, 0x78, 0xb5, 0x95, 0xaf, 0xd4, 0xd6, 0x71, 0x4e, 0x92, + 0x8f, 0x71, 0xbc, 0x68, 0xf8, 0xe7, 0xa2, 0xa2, 0xd1, 0xc2, 0x93, 0xd8, 0xfa, 0x61, 0x27, 0xaf, 0x5f, 0xd1, 0x62, + 0x36, 0x1c, 0xb5, 0x5e, 0x96, 0x57, 0x1c, 0xee, 0xdd, 0xb6, 0x14, 0x4b, 0x58, 0x1f, 0xe3, 0x72, 0xc9, 0xd3, 0xa8, + 0x5a, 0x3a, 0xfa, 0xcb, 0x1b, 0xb8, 0x25, 0xef, 0x04, 0xc0, 0x44, 0x52, 0x1f, 0x61, 0x41, 0x7b, 0x19, 0x31, 0x42, + 0xec, 0x05, 0xd9, 0x27, 0x68, 0x7b, 0xb1, 0xaf, 0x76, 0x3d, 0x0c, 0xd9, 0x92, 0x64, 0x77, 0x6f, 0x46, 0xf8, 0x42, + 0xdd, 0x3d, 0xb2, 0x1a, 0x87, 0x6b, 0xf2, 0xe2, 0x32, 0x44, 0xb1, 0x97, 0x70, 0xc3, 0xa8, 0x2d, 0xc5, 0xdc, 0x82, + 0x1b, 0x49, 0x8b, 0x89, 0xad, 0x51, 0x46, 0x0d, 0x9b, 0x43, 0x9b, 0x43, 0x69, 0xef, 0x15, 0xdf, 0xf0, 0xdf, 0x10, + 0xef, 0x7c, 0x69, 0x4b, 0x12, 0x75, 0xef, 0x42, 0x5a, 0xe6, 0x45, 0xba, 0x92, 0xf5, 0xf3, 0x76, 0x62, 0x43, 0x71, + 0x37, 0xc7, 0x80, 0xf5, 0xc4, 0x41, 0x76, 0x69, 0xf2, 0x81, 0xc4, 0x26, 0x4a, 0x56, 0x5a, 0xfd, 0xcf, 0xee, 0xfa, + 0xb0, 0xe0, 0xa1, 0x89, 0x46, 0xc7, 0xb6, 0x43, 0x37, 0x62, 0x1e, 0x7e, 0x8d, 0x67, 0xaa, 0x16, 0x90, 0x1c, 0xe6, + 0x26, 0x51, 0xea, 0x66, 0x84, 0xea, 0xc4, 0x8d, 0x17, 0x88, 0x7a, 0xda, 0xf5, 0x4c, 0xc7, 0xd2, 0xfb, 0xbb, 0x0c, + 0xa1, 0xa9, 0x21, 0x04, 0x0f, 0x21, 0x39, 0x3f, 0x09, 0x6f, 0x46, 0x27, 0xe2, 0x1b, 0xa6, 0xcb, 0x19, 0x72, 0x0f, + 0x5f, 0xa0, 0x75, 0x27, 0xc1, 0xc2, 0xe1, 0x86, 0x90, 0x22, 0x15, 0x04, 0xc8, 0xf6, 0x31, 0x80, 0x85, 0x46, 0xf6, + 0xa2, 0xc9, 0xd4, 0x80, 0xc8, 0x66, 0x6d, 0x4b, 0x98, 0x63, 0x33, 0x35, 0x68, 0xc1, 0xd6, 0xfc, 0x12, 0x28, 0x1b, + 0xda, 0xe2, 0x2d, 0xfd, 0x4f, 0x5e, 0x13, 0x41, 0x8c, 0x69, 0x6a, 0xd3, 0xcc, 0x7a, 0xe5, 0xda, 0xde, 0xf5, 0x29, + 0x16, 0x0b, 0xe4, 0xc0, 0x75, 0x43, 0x69, 0x6c, 0x8d, 0xd5, 0x25, 0x0d, 0x68, 0xb9, 0xa8, 0x2e, 0x08, 0x84, 0xc4, + 0x10, 0xf3, 0xaa, 0xa1, 0x90, 0x92, 0x84, 0x6a, 0x6e, 0xdd, 0x89, 0x6d, 0x82, 0xc2, 0xec, 0xb8, 0x33, 0x79, 0xe8, + 0xe7, 0x70, 0xfe, 0xfe, 0xc6, 0x2c, 0x40, 0x51, 0xb8, 0xe2, 0xa5, 0x8c, 0x06, 0x89, 0x7e, 0xb3, 0x1e, 0x7a, 0xfe, + 0x83, 0x03, 0xda, 0x9d, 0xca, 0x32, 0xa3, 0xd4, 0xa9, 0x9e, 0x09, 0x4e, 0x6f, 0x0d, 0xd0, 0x88, 0x48, 0x80, 0x09, + 0xfc, 0xa8, 0x3f, 0x0a, 0x15, 0x0b, 0x98, 0xb5, 0x95, 0x53, 0xaf, 0xef, 0x31, 0x10, 0x29, 0xec, 0xb0, 0x71, 0xce, + 0xa2, 0x55, 0x8d, 0x78, 0x42, 0x82, 0x3e, 0x48, 0xc8, 0xce, 0x59, 0xf5, 0x8c, 0xaf, 0x93, 0x0b, 0xbe, 0x60, 0x77, + 0xfc, 0xb5, 0x06, 0x50, 0x8e, 0x7f, 0xb1, 0xf7, 0x86, 0xd7, 0xc3, 0x16, 0xd7, 0x23, 0xe6, 0x8b, 0x32, 0x2f, 0x7f, + 0x78, 0xd0, 0x72, 0xfa, 0xf7, 0xe7, 0x69, 0x80, 0x2a, 0x7f, 0xb1, 0x84, 0x01, 0xa9, 0x3c, 0xbc, 0xf5, 0x46, 0xe4, + 0x4a, 0x66, 0x14, 0x8d, 0x59, 0x3b, 0x6e, 0x09, 0x3b, 0xb8, 0x28, 0x8e, 0x20, 0x54, 0xfc, 0xf3, 0x16, 0x40, 0x62, + 0x2b, 0x68, 0x99, 0xd1, 0xa0, 0x11, 0xed, 0x81, 0x3a, 0x2b, 0x6c, 0xcc, 0x0b, 0xb6, 0x2e, 0x5f, 0xde, 0xad, 0xe0, + 0x20, 0x4b, 0x48, 0x82, 0x87, 0xf5, 0xf6, 0xcd, 0x26, 0xd3, 0xa5, 0x87, 0xa9, 0xd7, 0x1d, 0xbf, 0x67, 0x56, 0x20, + 0xa4, 0xd9, 0x43, 0x64, 0x6d, 0x37, 0x12, 0xd3, 0x1b, 0x4f, 0x6d, 0x3b, 0x62, 0x5e, 0xb7, 0x13, 0x91, 0x2b, 0x75, + 0x6c, 0x9b, 0x87, 0xc8, 0x08, 0x2b, 0x8c, 0x24, 0xb8, 0xfc, 0x32, 0x20, 0x36, 0x51, 0xd0, 0xd8, 0xc7, 0xe2, 0x52, + 0x16, 0x93, 0xec, 0xa3, 0xf8, 0x4b, 0x59, 0xeb, 0x5f, 0x22, 0xd5, 0xd9, 0x13, 0xf8, 0x15, 0x43, 0x7b, 0x0f, 0xa1, + 0xb1, 0x4e, 0x83, 0xbb, 0x16, 0x3c, 0xb2, 0x80, 0x72, 0x1f, 0x1a, 0x12, 0x42, 0x71, 0xba, 0x1d, 0x16, 0xd9, 0xae, + 0x25, 0x46, 0x80, 0x8f, 0x92, 0x5e, 0xa9, 0x4d, 0xc6, 0x70, 0x05, 0x05, 0x70, 0x79, 0xae, 0xc7, 0xf3, 0xd1, 0xcd, + 0xf6, 0x4a, 0x23, 0x09, 0x7d, 0x37, 0xac, 0x78, 0xb9, 0xb9, 0xee, 0x2a, 0x8b, 0x36, 0x9f, 0x62, 0x1c, 0xeb, 0x02, + 0x91, 0x19, 0x21, 0x62, 0x6e, 0xd9, 0xa0, 0x20, 0x1d, 0x6c, 0x17, 0x03, 0xf4, 0xb1, 0x81, 0xe1, 0x0c, 0x56, 0xba, + 0xaa, 0xad, 0x9d, 0xa7, 0xc8, 0xf4, 0x6f, 0xb6, 0x98, 0xc0, 0xcf, 0x17, 0x17, 0x24, 0x04, 0x24, 0x2c, 0xf4, 0xcc, + 0x83, 0x59, 0x0f, 0x27, 0x79, 0xf6, 0x12, 0x13, 0x2e, 0x64, 0xa8, 0x70, 0xfc, 0xa0, 0xad, 0xe6, 0x82, 0xe6, 0xf8, + 0xf5, 0x4c, 0x5b, 0x95, 0xaf, 0x95, 0x34, 0xc9, 0x82, 0x43, 0x5e, 0x38, 0x5d, 0xde, 0x32, 0x44, 0xf1, 0xa9, 0x76, + 0xdd, 0x77, 0xb8, 0xf9, 0x4c, 0x8a, 0x9c, 0x54, 0xda, 0x89, 0x40, 0xa5, 0x21, 0x93, 0xb7, 0x7b, 0x01, 0xb0, 0x6d, + 0x88, 0xbe, 0x68, 0x36, 0x32, 0x53, 0x99, 0x8e, 0xae, 0x96, 0x87, 0x70, 0x6c, 0x0f, 0x6f, 0x06, 0xc3, 0x10, 0xf0, + 0xfa, 0xb4, 0x66, 0xff, 0xba, 0x67, 0x25, 0x55, 0x15, 0x4d, 0x8c, 0x8a, 0xb8, 0xb9, 0x60, 0x72, 0x0f, 0x2a, 0xa6, + 0xc1, 0x43, 0x38, 0x69, 0xc0, 0xe9, 0x38, 0x53, 0xd9, 0x20, 0x79, 0x81, 0x49, 0x10, 0x7b, 0x02, 0x2d, 0x4d, 0xc0, + 0xbc, 0xa2, 0xec, 0x38, 0xda, 0x8c, 0xed, 0x88, 0x50, 0xce, 0x9c, 0x44, 0x45, 0xfc, 0x98, 0x7b, 0xd2, 0x0a, 0xb0, + 0xcf, 0x40, 0x77, 0xbd, 0xc6, 0x4f, 0x6a, 0x41, 0xd1, 0xb7, 0xb6, 0xff, 0x5f, 0x86, 0x41, 0xd8, 0x9e, 0xb6, 0x73, + 0x00, 0x0a, 0xb2, 0x84, 0x00, 0xfe, 0xf2, 0x82, 0xbe, 0x04, 0x59, 0x92, 0x0a, 0x3f, 0x90, 0x57, 0x8f, 0xad, 0x3e, + 0x55, 0xce, 0xbe, 0x3a, 0xfb, 0xf5, 0xb7, 0xec, 0x97, 0xf4, 0xc1, 0x25, 0x27, 0x77, 0xfb, 0x54, 0x62, 0x73, 0xbd, + 0x53, 0x2a, 0x1c, 0x9d, 0x63, 0xb9, 0xac, 0xaf, 0xc4, 0x70, 0x39, 0x95, 0x10, 0xfc, 0x87, 0x0f, 0xc4, 0xef, 0xb3, + 0x72, 0xb7, 0x4f, 0x21, 0xbf, 0x9f, 0x4b, 0x2b, 0xf9, 0xc9, 0xe1, 0x46, 0xba, 0x4f, 0xab, 0x28, 0xc7, 0x5c, 0x7f, + 0x5b, 0x4a, 0xe5, 0xac, 0xb3, 0xb3, 0x4b, 0xb9, 0xb9, 0x9c, 0x73, 0x78, 0xaa, 0xcb, 0xbd, 0x5e, 0xb5, 0xd6, 0xff, + 0x57, 0x66, 0x0d, 0x65, 0xb9, 0x19, 0x94, 0xcc, 0x7b, 0x28, 0x08, 0x72, 0x37, 0xb1, 0x4e, 0x2f, 0x72, 0xe7, 0xb8, + 0x43, 0x39, 0x96, 0xb6, 0xbe, 0x2a, 0x53, 0x8f, 0xcc, 0x45, 0x8c, 0xf3, 0x15, 0xf1, 0xb2, 0x9a, 0xbc, 0x6d, 0xd0, + 0x6f, 0x4f, 0xc8, 0xfc, 0xe7, 0xd7, 0x90, 0x64, 0x3f, 0xc6, 0x2f, 0xea, 0xfe, 0x02, 0x5c, 0xc3, 0x9b, 0x72, 0xe4, + 0x05, 0x3b, 0xae, 0xab, 0xa7, 0x6d, 0xb2, 0xae, 0x85, 0x63, 0xdb, 0xe5, 0xc0, 0x6b, 0x8b, 0x38, 0x04, 0x44, 0x69, + 0x65, 0xdc, 0x73, 0x7a, 0xd7, 0xe9, 0x77, 0xa6, 0x3a, 0x86, 0xdd, 0x80, 0x20, 0x11, 0x0c, 0x28, 0x30, 0x1f, 0x83, + 0xba, 0x93, 0x51, 0xe5, 0xc4, 0x9e, 0x35, 0x10, 0x4a, 0x60, 0x45, 0xf3, 0x35, 0x12, 0x80, 0x96, 0x76, 0xe0, 0x65, + 0xad, 0xa2, 0x93, 0x25, 0x6b, 0x10, 0x1c, 0xf4, 0xff, 0x88, 0xc1, 0x11, 0x07, 0xdf, 0x24, 0x21, 0xce, 0x0a, 0x45, + 0x62, 0x4e, 0xb3, 0x47, 0x1f, 0xb3, 0x8f, 0x72, 0x09, 0xd2, 0xec, 0x47, 0x60, 0x80, 0x60, 0x19, 0x8e, 0x63, 0x91, + 0xa0, 0x64, 0xbe, 0x2a, 0xc8, 0x92, 0x9a, 0xf7, 0x9f, 0x60, 0x6c, 0xff, 0x46, 0xb7, 0x8d, 0xec, 0xef, 0x9a, 0x4a, + 0x6e, 0x7f, 0xe5, 0xdd, 0xf2, 0xeb, 0xfa, 0x7a, 0x79, 0xa1, 0xfe, 0xfc, 0xba, 0x69, 0x81, 0x77, 0x72, 0xf7, 0x52, + 0x0e, 0x35, 0x3f, 0x5f, 0x67, 0xc4, 0x58, 0x30, 0x40, 0xec, 0x53, 0xc7, 0x87, 0x92, 0xee, 0xb7, 0x9e, 0x0d, 0xac, + 0x89, 0xfd, 0x1a, 0xb7, 0xa8, 0x5e, 0xce, 0x0b, 0x6c, 0x56, 0xe3, 0x1a, 0xba, 0xe7, 0x85, 0xd6, 0x3c, 0x17, 0x66, + 0xa9, 0xa0, 0x14, 0x5b, 0x53, 0xc0, 0x27, 0xb8, 0xeb, 0xca, 0x4d, 0x6a, 0xa2, 0xea, 0x4d, 0x78, 0x92, 0xa0, 0xa2, + 0x03, 0x17, 0x4d, 0x5f, 0x3d, 0xb5, 0x2d, 0x36, 0x86, 0x3f, 0x13, 0x74, 0x35, 0x86, 0xac, 0x46, 0x39, 0x66, 0x2d, + 0x56, 0x7a, 0xa1, 0xb5, 0xbc, 0x5a, 0xea, 0x6e, 0x5f, 0x03, 0xbd, 0xf2, 0x82, 0x32, 0xe0, 0x1e, 0x80, 0xac, 0x57, + 0xf4, 0x94, 0x56, 0x91, 0x2d, 0xd9, 0x27, 0x14, 0xdc, 0x3c, 0x9e, 0xe0, 0xb0, 0xf4, 0x51, 0xdd, 0x23, 0x4d, 0x62, + 0x2b, 0x5c, 0xc3, 0xde, 0x64, 0x55, 0xe9, 0x65, 0xf3, 0x84, 0x07, 0x98, 0xd3, 0x82, 0xfd, 0x1b, 0xdb, 0x62, 0xf9, + 0x71, 0x12, 0x68, 0xbb, 0x68, 0x14, 0x37, 0xca, 0x00, 0x88, 0xd2, 0x3d, 0xbd, 0x01, 0x07, 0xa2, 0x5d, 0xd7, 0x42, + 0x7d, 0x9b, 0xd8, 0x0e, 0xe7, 0x26, 0x13, 0x6a, 0xe1, 0xc2, 0x1a, 0xcd, 0xa6, 0x0b, 0x27, 0x6a, 0xef, 0xd2, 0x9e, + 0x27, 0x83, 0x8c, 0xff, 0x2a, 0x83, 0x98, 0xf4, 0xbd, 0xc0, 0xa3, 0x83, 0x70, 0x0f, 0xa1, 0x27, 0x61, 0x91, 0x8a, + 0xd6, 0x14, 0x6c, 0x83, 0x15, 0xa5, 0x71, 0x00, 0xa0, 0xbd, 0x8b, 0xb8, 0x01, 0x07, 0x37, 0x6c, 0x0c, 0x1d, 0x1b, + 0xb7, 0xe4, 0x95, 0x64, 0x82, 0xa0, 0xf2, 0x66, 0x89, 0xcd, 0x78, 0xb2, 0x13, 0x95, 0x6f, 0x70, 0xb3, 0x73, 0x27, + 0x14, 0xf6, 0x3b, 0x9d, 0x11, 0x4c, 0x59, 0x59, 0xed, 0xd0, 0x37, 0x23, 0x5e, 0x70, 0x98, 0x43, 0xb2, 0x20, 0x22, + 0x19, 0xb1, 0xaa, 0x1b, 0xbf, 0xf3, 0x7e, 0x94, 0x9b, 0x89, 0x6d, 0xb1, 0x5e, 0xf1, 0x8c, 0x60, 0xbd, 0x83, 0xa3, + 0x73, 0xf2, 0xdc, 0xcd, 0xc8, 0x5c, 0xe1, 0x3f, 0x86, 0xc9, 0xed, 0x66, 0x7e, 0x30, 0x8c, 0xa8, 0x2f, 0xff, 0x93, + 0x8c, 0x59, 0x55, 0x4e, 0xa3, 0x31, 0x24, 0x44, 0x32, 0xbc, 0x09, 0x40, 0x3c, 0xcf, 0x9a, 0x8c, 0xd1, 0x4c, 0xac, + 0xb6, 0xad, 0xd3, 0x34, 0xfb, 0xf6, 0x92, 0xd3, 0xef, 0x45, 0x85, 0x17, 0x78, 0x5c, 0x75, 0x6e, 0x64, 0xd7, 0x0f, + 0x74, 0x31, 0x87, 0xbe, 0x55, 0xe9, 0xaa, 0xbe, 0x91, 0x1f, 0x6a, 0xf8, 0x4a, 0x0c, 0xea, 0x6e, 0x50, 0xf2, 0x00, + 0x00, 0xfd, 0x71, 0x5e, 0x5e, 0xfd, 0x5f, 0xa3, 0xb9, 0x93, 0x4e, 0xb0, 0xb1, 0x62, 0x69, 0x8e, 0xe3, 0xe5, 0xd0, + 0x5f, 0xa8, 0xe8, 0x39, 0xa1, 0xdf, 0x8d, 0x48, 0xba, 0x44, 0x67, 0x18, 0x4f, 0xcc, 0xd2, 0xe0, 0xb0, 0x86, 0x12, + 0xfa, 0x9b, 0xd1, 0x6f, 0xd7, 0xde, 0x37, 0x90, 0xe2, 0xdf, 0xb8, 0xad, 0x8e, 0x67, 0x47, 0x95, 0x99, 0xd4, 0x32, + 0x0f, 0xdc, 0x16, 0x57, 0x75, 0xd5, 0xcc, 0xa7, 0xed, 0x92, 0x69, 0xda, 0x79, 0xcc, 0x2e, 0xe3, 0x57, 0x38, 0x91, + 0x44, 0x7d, 0xb7, 0x0e, 0x03, 0x34, 0x30, 0xd0, 0x5e, 0x12, 0xa7, 0x17, 0x99, 0xae, 0xde, 0x6a, 0x06, 0x43, 0x73, + 0xa5, 0x4e, 0x3f, 0xb0, 0x7a, 0x41, 0xcb, 0xb0, 0xb3, 0x66, 0xf2, 0xc8, 0x09, 0xb1, 0x8b, 0x9c, 0x9f, 0x98, 0x0f, + 0x39, 0xa1, 0xa6, 0x01, 0xbd, 0x9d, 0x97, 0x57, 0xae, 0x54, 0x91, 0x81, 0x9a, 0x09, 0x29, 0x20, 0xbb, 0xa1, 0xf5, + 0xb1, 0x26, 0xc6, 0x1e, 0xa4, 0x0b, 0xb3, 0xd6, 0x3c, 0x0d, 0x42, 0x53, 0x28, 0x0b, 0x57, 0x66, 0x64, 0xa3, 0xf0, + 0x3d, 0x39, 0x85, 0x86, 0x0b, 0x5a, 0x42, 0x7b, 0xf7, 0x3e, 0x24, 0x74, 0xf7, 0x98, 0x44, 0xd5, 0x74, 0x96, 0x16, + 0xca, 0xcd, 0x42, 0x79, 0x8e, 0xc0, 0x0b, 0x16, 0xb9, 0xe7, 0x55, 0x39, 0x12, 0xb7, 0xee, 0xd6, 0xe9, 0xeb, 0x6e, + 0xb5, 0x86, 0x7d, 0x4c, 0x79, 0x24, 0xbc, 0xa3, 0x85, 0xf9, 0x57, 0xb2, 0xe4, 0x48, 0x87, 0x8d, 0x9a, 0x66, 0xf2, + 0x15, 0x3e, 0xff, 0x47, 0x75, 0x6f, 0xe2, 0x7d, 0xe2, 0x59, 0x81, 0x70, 0x57, 0x14, 0x3a, 0xe3, 0x8e, 0x59, 0x47, + 0xeb, 0x70, 0x4e, 0x9d, 0x98, 0xf1, 0xf0, 0xb8, 0x40, 0x31, 0xfc, 0xf6, 0x8c, 0x06, 0xdc, 0xfd, 0xe9, 0x98, 0xd8, + 0xbd, 0x0e, 0x52, 0xec, 0x32, 0x8b, 0x74, 0x7f, 0xd5, 0x68, 0xaa, 0x0b, 0xb1, 0x6e, 0x95, 0xb9, 0x27, 0xa6, 0xec, + 0x30, 0x9c, 0x51, 0xed, 0xb3, 0x85, 0x9b, 0xbd, 0x91, 0xbb, 0x51, 0xd5, 0x53, 0x6c, 0xe9, 0x92, 0xc3, 0x13, 0x38, + 0x64, 0xd3, 0xa8, 0xdc, 0xfd, 0x5a, 0xcb, 0x57, 0xfb, 0x6a, 0xd1, 0x97, 0x58, 0xc4, 0xf7, 0xf3, 0x21, 0x85, 0x2d, + 0x4f, 0x44, 0xb6, 0x3a, 0x8c, 0x75, 0x80, 0xf1, 0x50, 0xeb, 0xdb, 0xcd, 0x4e, 0x6a, 0x3f, 0xa0, 0xbb, 0x75, 0x96, + 0x96, 0x6f, 0x16, 0xbf, 0xad, 0xff, 0x3c, 0x70, 0x2f, 0x39, 0x14, 0xbf, 0x56, 0x5f, 0x45, 0xa2, 0xc1, 0xfd, 0xb2, + 0x5c, 0x93, 0x49, 0x71, 0xfc, 0x04, 0xc7, 0x54, 0xa6, 0x28, 0x47, 0xd5, 0x6d, 0x37, 0x84, 0x8a, 0x8d, 0x8e, 0xcd, + 0x79, 0xb2, 0x33, 0x75, 0xf5, 0x00, 0x8f, 0x0c, 0x51, 0xfb, 0x9f, 0xca, 0x8b, 0xd3, 0x1e, 0xd9, 0x07, 0xfb, 0xb7, + 0xcc, 0x21, 0xb6, 0x4e, 0xbb, 0x4e, 0xad, 0x9a, 0x70, 0xe0, 0xc3, 0xea, 0x1a, 0xff, 0x17, 0x2f, 0xb8, 0xd1, 0x44, + 0xf4, 0x56, 0xb5, 0x65, 0xa5, 0x04, 0xb6, 0xab, 0x5d, 0x2a, 0x35, 0xbd, 0xd5, 0x4d, 0x8c, 0xcb, 0x9c, 0xd7, 0xd5, + 0xde, 0x90, 0xf5, 0x93, 0xa0, 0x0d, 0xb9, 0x7f, 0xfa, 0x30, 0xe2, 0x10, 0x23, 0x29, 0x6b, 0x17, 0x63, 0xae, 0x0d, + 0xa1, 0x93, 0x2d, 0xca, 0x98, 0xdc, 0xf5, 0x4f, 0x24, 0xaa, 0x2e, 0x9a, 0x20, 0x10, 0xe7, 0xed, 0xb1, 0xf5, 0xea, + 0x6e, 0x71, 0xc9, 0xcd, 0x70, 0x65, 0xaa, 0x12, 0xf0, 0x79, 0x62, 0xf0, 0xc5, 0x82, 0x44, 0x09, 0x3c, 0x0b, 0xd5, + 0x64, 0xdc, 0x35, 0x44, 0x1f, 0x6c, 0xbc, 0xfc, 0xc3, 0xc8, 0x31, 0x3f, 0xf3, 0x4f, 0xca, 0x1b, 0x44, 0x27, 0xc0, + 0x99, 0x00, 0x3c, 0x9e, 0xa5, 0x25, 0xd5, 0x37, 0xa7, 0x7f, 0x6d, 0x92, 0xff, 0x77, 0x6c, 0xf8, 0x56, 0xfb, 0x15, + 0xd0, 0x68, 0x61, 0xd8, 0x21, 0xd0, 0x1a, 0xd4, 0x39, 0x85, 0x71, 0x0f, 0x01, 0xb5, 0xe2, 0x1a, 0xd7, 0x77, 0x69, + 0x84, 0x30, 0x08, 0x49, 0x50, 0xd9, 0x1d, 0x76, 0xb8, 0xb7, 0xbe, 0x2f, 0x90, 0x01, 0xc2, 0x43, 0x19, 0x41, 0x8b, + 0x8c, 0x07, 0xf7, 0x06, 0x7b, 0x10, 0xd6, 0xb9, 0x94, 0x53, 0xae, 0x92, 0xae, 0x43, 0xf6, 0x71, 0xd3, 0xf4, 0x1a, + 0x27, 0xe4, 0x08, 0x52, 0xa9, 0x67, 0x40, 0xd3, 0x74, 0x91, 0x5e, 0xae, 0xb7, 0x74, 0xca, 0xb7, 0x06, 0x62, 0xeb, + 0x5a, 0x58, 0x74, 0x9f, 0x5d, 0xca, 0x43, 0x0f, 0x52, 0x08, 0x0e, 0x89, 0xe5, 0x14, 0xd4, 0x0f, 0x60, 0x52, 0x2e, + 0xff, 0xc3, 0x24, 0x5e, 0xe5, 0xee, 0xfe, 0xd7, 0x6a, 0xb1, 0xaa, 0x1e, 0xcc, 0x6c, 0xfc, 0x40, 0xf7, 0x97, 0xf0, + 0x51, 0xad, 0x3d, 0x5f, 0x39, 0x66, 0x05, 0xa6, 0x0c, 0xfe, 0x93, 0x7f, 0xd0, 0x86, 0x3a, 0x97, 0xf9, 0x6f, 0x71, + 0x25, 0xae, 0x81, 0x14, 0xe7, 0x3d, 0xd4, 0x88, 0x26, 0x69, 0xbc, 0x4c, 0x59, 0x6d, 0x1a, 0x9f, 0x66, 0x8a, 0x40, + 0x88, 0x3a, 0x7a, 0x1d, 0x2e, 0x39, 0x70, 0x91, 0xc3, 0xaa, 0x05, 0xf8, 0x67, 0xc1, 0x0a, 0xe8, 0xf6, 0xb7, 0xe4, + 0x68, 0xcd, 0xfc, 0xed, 0x8e, 0xc6, 0x95, 0x0b, 0x39, 0x34, 0xb1, 0xf6, 0xd5, 0x76, 0x4c, 0xce, 0xd4, 0x9d, 0xa7, + 0x15, 0x8a, 0xae, 0xab, 0x9b, 0x89, 0x2b, 0x02, 0x8e, 0x53, 0xcf, 0x0f, 0x02, 0x0c, 0x66, 0x85, 0x2f, 0xfb, 0x42, + 0x4d, 0xbf, 0xc6, 0x60, 0x0a, 0x32, 0x96, 0x3d, 0x8b, 0x62, 0x78, 0x17, 0xf2, 0x2a, 0x62, 0x2c, 0x97, 0x22, 0x56, + 0x08, 0x65, 0x01, 0x5b, 0x56, 0xae, 0x47, 0xa1, 0x78, 0x78, 0x9c, 0xe2, 0xdd, 0xcc, 0x39, 0x52, 0xee, 0x12, 0xcc, + 0xee, 0x90, 0xf9, 0x49, 0x22, 0xf5, 0xda, 0xb5, 0x60, 0x93, 0x62, 0x8a, 0x5d, 0x51, 0xe4, 0x06, 0x87, 0x30, 0xe1, + 0xa8, 0x7b, 0x7b, 0xa3, 0x69, 0x22, 0xa1, 0x91, 0x28, 0x30, 0x23, 0xa4, 0xbb, 0xfe, 0xe3, 0xee, 0x4d, 0x3f, 0x99, + 0x32, 0x06, 0x11, 0xd0, 0x28, 0x7a, 0x06, 0x10, 0x7a, 0xbe, 0x4a, 0xb9, 0x64, 0x3a, 0xae, 0x60, 0xc4, 0x7d, 0x05, + 0x24, 0x5c, 0x34, 0x6e, 0xcd, 0x2f, 0xd1, 0x49, 0xa6, 0x78, 0x9a, 0x00, 0x45, 0xa3, 0xad, 0xf2, 0x6c, 0x28, 0x1f, + 0x79, 0x16, 0xac, 0x44, 0x3d, 0x69, 0x70, 0x14, 0x0c, 0xba, 0xd9, 0x48, 0xc2, 0x21, 0x35, 0x19, 0xc6, 0xc8, 0x30, + 0x38, 0xfa, 0x97, 0xb6, 0xca, 0x43, 0x6a, 0x5d, 0x2d, 0x14, 0x32, 0xa3, 0x07, 0x33, 0x3f, 0x98, 0xa8, 0x61, 0x55, + 0x0b, 0xf3, 0x41, 0xba, 0x76, 0x5a, 0x65, 0x94, 0x25, 0xc6, 0x69, 0xb0, 0x30, 0x86, 0x1c, 0x6a, 0x1c, 0xb0, 0xd9, + 0x40, 0xee, 0x6a, 0xce, 0xe6, 0x51, 0x33, 0x6e, 0xaf, 0x6b, 0x46, 0x9f, 0xfa, 0xe2, 0x56, 0x7f, 0x2e, 0xd3, 0x0d, + 0x3b, 0x56, 0xf9, 0x4b, 0xbf, 0xa8, 0xa6, 0x0f, 0x3d, 0xe6, 0x4d, 0x39, 0x18, 0x66, 0x78, 0xf5, 0x59, 0x58, 0x3c, + 0x48, 0x1a, 0x94, 0xf9, 0x52, 0xad, 0x1d, 0x6e, 0x7f, 0x3f, 0x30, 0xf4, 0x66, 0x37, 0x31, 0x49, 0x1a, 0x02, 0xe5, + 0x08, 0x89, 0x08, 0x8e, 0x59, 0xf1, 0x1f, 0x57, 0x95, 0xff, 0xbd, 0x53, 0x5f, 0xd0, 0x83, 0xf0, 0xd1, 0x5e, 0xf7, + 0x34, 0x0a, 0x98, 0xb3, 0x96, 0xed, 0xea, 0xd3, 0x84, 0x1a, 0xd2, 0x5f, 0x11, 0x32, 0x6e, 0x1c, 0xab, 0x7f, 0x74, + 0x53, 0xf2, 0x3b, 0x5d, 0x25, 0xf6, 0xd1, 0x5c, 0x9f, 0xd8, 0xa2, 0x4a, 0x3a, 0x3a, 0x36, 0xa7, 0x2d, 0x29, 0xcd, + 0x49, 0xf9, 0x56, 0x7b, 0x78, 0xda, 0x4a, 0x71, 0xc9, 0xe6, 0x3d, 0xb9, 0x9a, 0x27, 0x59, 0x6d, 0xcb, 0x71, 0x84, + 0x3b, 0xc8, 0xd7, 0xe7, 0x8c, 0xd2, 0xd1, 0x07, 0xab, 0x1f, 0xf7, 0x26, 0x81, 0xcc, 0xd3, 0x13, 0x70, 0xa3, 0x6b, + 0x57, 0x7a, 0x7c, 0x2b, 0x4e, 0xcc, 0x93, 0xf7, 0x43, 0xf6, 0x6b, 0x5c, 0xc9, 0x82, 0x8e, 0x7b, 0x5f, 0x35, 0x4c, + 0xb7, 0x19, 0xd3, 0x7e, 0xa4, 0x18, 0x8c, 0xe6, 0xab, 0x2c, 0x89, 0x0a, 0x62, 0xc1, 0x6b, 0xe2, 0x83, 0xd8, 0x00, + 0x40, 0xce, 0x68, 0x8b, 0x5a, 0x7a, 0x8c, 0x25, 0x51, 0xbc, 0xad, 0x40, 0xcd, 0x79, 0x76, 0x96, 0xd1, 0xaa, 0x3a, + 0xd1, 0xab, 0x53, 0xae, 0xd2, 0xec, 0x22, 0x74, 0x3d, 0x7c, 0x65, 0x29, 0x2a, 0x59, 0x56, 0xbd, 0x0b, 0xd3, 0x57, + 0xec, 0x95, 0x17, 0x48, 0x79, 0x57, 0x4a, 0x4d, 0x21, 0x23, 0x1b, 0x83, 0xc6, 0xd6, 0xd9, 0x4b, 0x2c, 0x6e, 0xb2, + 0x3c, 0x4a, 0x28, 0x7c, 0x31, 0xf7, 0x71, 0x7b, 0x2c, 0x55, 0xc5, 0x9c, 0x43, 0x98, 0x93, 0x2a, 0x9d, 0x74, 0x95, + 0x03, 0xf8, 0xd5, 0x65, 0x10, 0xd6, 0x48, 0xa1, 0x3a, 0xc7, 0x3d, 0x6c, 0x49, 0xa6, 0x63, 0x06, 0x19, 0x8b, 0xee, + 0xfa, 0x3b, 0x2a, 0x9d, 0xc7, 0x41, 0x74, 0x1f, 0xba, 0x5a, 0x21, 0xc2, 0x60, 0x7b, 0xd6, 0x92, 0x2b, 0x9e, 0x2b, + 0x8e, 0xb2, 0x2b, 0x31, 0xb5, 0x3c, 0x1b, 0xb2, 0x6d, 0xd1, 0x15, 0x4b, 0x65, 0x4d, 0x77, 0x57, 0x13, 0xa9, 0xe0, + 0xb1, 0x1f, 0x7f, 0xe0, 0xcb, 0x92, 0x91, 0x53, 0x99, 0xc4, 0xb2, 0x0c, 0x61, 0x6e, 0xdc, 0x10, 0x3c, 0xc1, 0x68, + 0xde, 0x92, 0x79, 0xca, 0x29, 0x85, 0xd2, 0xfb, 0x9f, 0x1b, 0x8f, 0x50, 0x36, 0xdb, 0x30, 0xbd, 0x65, 0xea, 0xbb, + 0xc4, 0xf5, 0xfc, 0x87, 0xe8, 0x94, 0x44, 0x0b, 0xde, 0x9f, 0x27, 0x32, 0xda, 0x54, 0xa8, 0xb0, 0x6e, 0x66, 0xbb, + 0xcf, 0xc1, 0xc6, 0x7f, 0x51, 0x49, 0x86, 0x1c, 0x54, 0x98, 0x5e, 0xb5, 0x63, 0xa1, 0x73, 0xc8, 0x5d, 0x6f, 0x28, + 0x88, 0x8d, 0xc0, 0x6e, 0x68, 0x05, 0x89, 0x34, 0x59, 0x88, 0x7d, 0x36, 0xaa, 0xba, 0x9b, 0x55, 0xa1, 0x06, 0xfc, + 0xf2, 0x17, 0xb1, 0x38, 0xbf, 0x40, 0x52, 0x7d, 0xc1, 0x21, 0x21, 0xf4, 0xc9, 0x6f, 0xc4, 0x5e, 0x0d, 0xbe, 0x88, + 0x95, 0x66, 0xdb, 0x31, 0xfa, 0x99, 0x9f, 0x8f, 0xbb, 0xee, 0x0c, 0x53, 0x74, 0xb8, 0x01, 0x8b, 0x11, 0x43, 0x4e, + 0x52, 0x37, 0xf9, 0x4b, 0x4a, 0x7e, 0x32, 0xbd, 0xf9, 0x06, 0xdf, 0x69, 0x6d, 0x6f, 0xa0, 0x50, 0x88, 0x59, 0x67, + 0x68, 0x70, 0xc3, 0x1e, 0x9e, 0xea, 0x98, 0x59, 0x98, 0xe3, 0x90, 0x24, 0xa2, 0x45, 0x0e, 0x67, 0x88, 0xdf, 0x00, + 0x98, 0x40, 0x93, 0x95, 0x08, 0x19, 0x25, 0xb0, 0x47, 0xf0, 0x82, 0x9b, 0x6d, 0xde, 0xef, 0x79, 0x1e, 0x2e, 0xa4, + 0x56, 0xae, 0xe0, 0x0a, 0x30, 0xd5, 0xb3, 0x6b, 0x49, 0xf1, 0xe1, 0x51, 0xb4, 0x86, 0x78, 0xae, 0x25, 0x94, 0xc5, + 0xce, 0x83, 0x60, 0x55, 0x65, 0x57, 0xd9, 0x19, 0xcc, 0x52, 0x0f, 0x0e, 0x54, 0x71, 0x81, 0x24, 0xdd, 0x18, 0x6f, + 0x53, 0xcc, 0xb2, 0x16, 0x7e, 0xaa, 0x62, 0xde, 0xb0, 0xa9, 0xe0, 0xf0, 0x5a, 0x9d, 0x7f, 0x31, 0xd6, 0x30, 0xa1, + 0x4d, 0x0d, 0xac, 0x04, 0x31, 0x69, 0x58, 0xc2, 0xc6, 0xc1, 0x67, 0xd0, 0x9f, 0x07, 0x4c, 0x33, 0x9c, 0xde, 0x8f, + 0x51, 0xbd, 0x65, 0xf5, 0xc9, 0xf7, 0xd2, 0xf3, 0x46, 0x1d, 0x3d, 0xa8, 0xc4, 0xaa, 0xe5, 0xeb, 0x0c, 0x11, 0xdd, + 0xde, 0xfa, 0x8c, 0xe7, 0xd4, 0x32, 0x04, 0x40, 0xe2, 0x49, 0x9d, 0x19, 0x7b, 0x7c, 0xdc, 0x30, 0x46, 0x52, 0xa5, + 0xb7, 0x2c, 0x42, 0xa6, 0x9f, 0x94, 0x55, 0x0d, 0x87, 0x27, 0x9b, 0x76, 0x25, 0x54, 0x0c, 0xd7, 0x6f, 0x96, 0x17, + 0x50, 0x85, 0xc5, 0x0c, 0xc5, 0x1c, 0x9b, 0xca, 0xd9, 0x78, 0x83, 0x79, 0x06, 0xe3, 0x3c, 0xa5, 0x31, 0x37, 0x54, + 0xa0, 0x5f, 0x2a, 0x47, 0x53, 0x67, 0x62, 0xce, 0x58, 0x9e, 0xfb, 0xb0, 0xe3, 0x73, 0xc7, 0x98, 0x5d, 0x78, 0xee, + 0xee, 0xa9, 0xc3, 0xf6, 0x59, 0x74, 0x19, 0xee, 0x6e, 0x61, 0xc9, 0x9e, 0x92, 0x49, 0x8c, 0x03, 0x58, 0xe7, 0xd1, + 0x95, 0xad, 0xf1, 0x52, 0x06, 0xbb, 0x3f, 0x41, 0x0c, 0xe0, 0x68, 0xc1, 0x60, 0x04, 0xec, 0x5a, 0x7e, 0xed, 0x6a, + 0xac, 0x74, 0xf3, 0x71, 0x60, 0x85, 0x17, 0x99, 0xc0, 0xe5, 0x23, 0x26, 0xd2, 0xe0, 0x7f, 0xde, 0xc7, 0xc9, 0x57, + 0x9b, 0x8e, 0x26, 0xb2, 0xd7, 0x42, 0xbe, 0xf0, 0xaf, 0xe1, 0x6e, 0x1e, 0x98, 0xf2, 0xc5, 0x1e, 0x4f, 0x11, 0x05, + 0x4d, 0x62, 0x6c, 0xf5, 0x8c, 0x8b, 0x3d, 0x73, 0xb5, 0xe1, 0x17, 0x22, 0x8a, 0xbb, 0xbb, 0xb8, 0x2c, 0x04, 0x2c, + 0x99, 0xf0, 0x53, 0xce, 0xd4, 0xc8, 0x94, 0x3d, 0xc4, 0xb7, 0xcb, 0xf0, 0xe1, 0x71, 0x23, 0xf6, 0xc9, 0x5d, 0x11, + 0x9e, 0x48, 0xaa, 0xb0, 0xcf, 0xfc, 0xef, 0x90, 0x31, 0x27, 0xa2, 0xe8, 0xb1, 0x4c, 0x37, 0x06, 0xcf, 0x7f, 0x56, + 0xf1, 0x64, 0x55, 0x00, 0xb6, 0x46, 0x05, 0xe9, 0x97, 0x80, 0x73, 0x0a, 0x40, 0x3d, 0x0c, 0x63, 0x20, 0xc5, 0x9c, + 0x42, 0xe0, 0xe8, 0x92, 0x76, 0xc0, 0xf0, 0xb3, 0x59, 0xd0, 0x63, 0xf1, 0x5b, 0xba, 0xdc, 0x6d, 0xce, 0xcf, 0xd6, + 0x28, 0x6f, 0x2a, 0x77, 0xd5, 0xb0, 0xca, 0x4c, 0x4d, 0x61, 0xb2, 0xd8, 0x9b, 0xb9, 0x0e, 0xdf, 0xf9, 0x63, 0x5f, + 0xbb, 0xc4, 0xc1, 0xc8, 0x8d, 0xcc, 0x15, 0x2e, 0x3c, 0x98, 0x76, 0xf2, 0x0a, 0x88, 0x9a, 0xad, 0x04, 0x57, 0x02, + 0xad, 0x07, 0xa7, 0x0e, 0x77, 0x0a, 0x58, 0x41, 0x20, 0xf3, 0xfa, 0xab, 0x3e, 0x39, 0x90, 0xd1, 0xe6, 0x0a, 0x19, + 0xf4, 0xdc, 0xea, 0x05, 0x5a, 0xe5, 0x7d, 0xab, 0xfb, 0x39, 0x79, 0x63, 0xde, 0x75, 0x1f, 0x81, 0xc9, 0xf7, 0x8c, + 0xc4, 0x86, 0x2c, 0xaf, 0x85, 0xc2, 0x24, 0x01, 0x3d, 0x0e, 0xaa, 0x0a, 0x89, 0xd4, 0xa1, 0x6c, 0xd4, 0x0c, 0x15, + 0xc2, 0xf4, 0xfa, 0x07, 0x80, 0x80, 0xa3, 0x94, 0x42, 0x79, 0x22, 0xaa, 0x32, 0x02, 0x08, 0x8c, 0x0d, 0xd0, 0xb0, + 0x0c, 0x4c, 0x61, 0x9b, 0x51, 0xb4, 0xe5, 0x74, 0xe9, 0x6e, 0xbc, 0x2f, 0x47, 0xe6, 0xbc, 0x1b, 0x3c, 0x4b, 0xd0, + 0x6e, 0xec, 0xeb, 0x38, 0x86, 0x7e, 0x2a, 0xfa, 0x47, 0xb0, 0x83, 0x73, 0x58, 0x82, 0x82, 0x53, 0x42, 0x9f, 0x33, + 0xff, 0x83, 0xaf, 0xc4, 0xeb, 0x9e, 0xb6, 0xb8, 0xb7, 0x63, 0xc7, 0xcc, 0xca, 0x8f, 0x4d, 0x96, 0x5c, 0xcb, 0x90, + 0x44, 0x79, 0xcd, 0xa5, 0x63, 0xd0, 0x94, 0xc8, 0xcd, 0x07, 0x81, 0xa4, 0xbd, 0x41, 0xe5, 0x47, 0x9b, 0xd3, 0xfe, + 0x48, 0x08, 0xb1, 0x5a, 0x6a, 0xe6, 0xe2, 0x4b, 0x8a, 0x05, 0x50, 0x70, 0x1f, 0xc0, 0xf9, 0x3b, 0x71, 0xfd, 0xbb, + 0xe8, 0xc0, 0xa1, 0x8f, 0x00, 0x06, 0xe0, 0xad, 0x54, 0x5b, 0x79, 0x13, 0x50, 0x5a, 0x01, 0x90, 0x6b, 0x53, 0x19, + 0xe0, 0x0d, 0xf9, 0x0b, 0x1e, 0xd9, 0x97, 0x29, 0x50, 0x8c, 0xe2, 0xc6, 0xbb, 0x4c, 0xe5, 0xe5, 0xdd, 0x31, 0xe7, + 0x82, 0xdd, 0xdc, 0x30, 0xaf, 0xda, 0x44, 0x99, 0xb4, 0x5d, 0x0c, 0x62, 0x9c, 0x12, 0xa4, 0x28, 0x01, 0xd2, 0xf7, + 0x0f, 0x66, 0x21, 0x7a, 0xfe, 0xee, 0xd1, 0x5d, 0x65, 0xae, 0xc3, 0x30, 0x9a, 0xec, 0x1d, 0x51, 0x0b, 0x72, 0xba, + 0x3a, 0x26, 0xdf, 0x27, 0x07, 0xe1, 0x5f, 0x12, 0xf5, 0x33, 0x55, 0x82, 0xa6, 0xfa, 0xa6, 0x8a, 0x38, 0xa8, 0xf1, + 0x09, 0x88, 0xda, 0x32, 0xa9, 0x09, 0x73, 0x25, 0xea, 0x93, 0xeb, 0x44, 0x60, 0x5a, 0xfd, 0xb3, 0x1f, 0x5f, 0xfd, + 0xc0, 0x60, 0x7b, 0xbf, 0x77, 0xf1, 0x75, 0xa6, 0x0f, 0xe7, 0xef, 0xd8, 0xbd, 0xfb, 0x3c, 0xb8, 0x71, 0x5c, 0x5d, + 0xd6, 0x23, 0x49, 0x23, 0x33, 0xc0, 0x7b, 0xca, 0xa0, 0x61, 0x2f, 0xca, 0xe6, 0xcc, 0x35, 0xbb, 0xcf, 0xba, 0xca, + 0x5d, 0x40, 0x3f, 0x22, 0x69, 0x35, 0xa1, 0xb8, 0x00, 0x6e, 0xe7, 0x31, 0xcd, 0x0a, 0xff, 0x83, 0x42, 0xcd, 0x04, + 0x7b, 0x19, 0x19, 0xa5, 0x2f, 0x23, 0x98, 0xaf, 0x16, 0x41, 0xb6, 0xac, 0x42, 0xbb, 0x8f, 0x1a, 0x6c, 0xd6, 0xae, + 0xcd, 0xb3, 0x7b, 0xcb, 0x01, 0x39, 0x13, 0x44, 0xe3, 0x45, 0xad, 0xe4, 0x59, 0x4f, 0xf5, 0xaa, 0xe7, 0x88, 0x9b, + 0xae, 0xdc, 0xab, 0x47, 0xa6, 0xf9, 0x78, 0x85, 0x77, 0x3f, 0xea, 0x22, 0xda, 0x95, 0xb5, 0x00, 0x56, 0x16, 0x43, + 0xf2, 0x3d, 0xeb, 0xef, 0x99, 0x74, 0x09, 0x16, 0x90, 0xfa, 0xc4, 0xeb, 0xda, 0x75, 0xd0, 0x91, 0x93, 0xba, 0xfd, + 0x28, 0x0a, 0x66, 0xa5, 0x45, 0x26, 0xe5, 0x89, 0xa4, 0x2b, 0xc9, 0x47, 0xae, 0x62, 0x66, 0x98, 0xe6, 0xd2, 0x19, + 0xf6, 0xa4, 0xbf, 0xaa, 0xda, 0xab, 0xed, 0x39, 0x04, 0xc0, 0x35, 0x4f, 0x21, 0x56, 0xef, 0x56, 0xd1, 0xc2, 0x9d, + 0xf1, 0x6e, 0xff, 0xa2, 0xb5, 0xe3, 0x61, 0xec, 0xd6, 0x30, 0x0e, 0x32, 0x67, 0x05, 0xf3, 0x9b, 0x1c, 0xd3, 0x70, + 0xcd, 0x68, 0xa3, 0x0b, 0x3e, 0xc5, 0xbe, 0x5c, 0xbd, 0x8f, 0xba, 0x87, 0x0a, 0x91, 0xde, 0x83, 0x67, 0x84, 0xaf, + 0x37, 0x7f, 0x6d, 0xd4, 0x6b, 0xdf, 0xd1, 0x58, 0xde, 0x58, 0x3a, 0x82, 0xc6, 0x3f, 0x26, 0x38, 0xa3, 0x30, 0xdf, + 0xc0, 0x9b, 0x26, 0x93, 0xb5, 0x09, 0xc7, 0x8e, 0xdc, 0x26, 0xc5, 0xa6, 0xa5, 0x2a, 0xdf, 0x25, 0xb0, 0x92, 0x5b, + 0xa6, 0xfd, 0xe2, 0x9e, 0x52, 0x8f, 0x0d, 0xc1, 0x42, 0xc5, 0x82, 0x00, 0x35, 0xe6, 0xaa, 0xbd, 0x99, 0x48, 0x06, + 0xa7, 0xb4, 0xfd, 0x6c, 0xfb, 0x0c, 0xb3, 0xb3, 0x26, 0x12, 0x82, 0xb3, 0x42, 0xcb, 0xa6, 0x9b, 0xb4, 0x91, 0x00, + 0x8d, 0x54, 0xa3, 0xd0, 0x64, 0x82, 0xc6, 0xce, 0x7b, 0x41, 0xee, 0x86, 0x0e, 0xa9, 0xeb, 0x0c, 0x4a, 0xf0, 0x85, + 0x23, 0x31, 0x4b, 0x77, 0x41, 0x69, 0x0d, 0xdd, 0x63, 0xa8, 0x5e, 0x6f, 0xbf, 0x0b, 0x9e, 0x91, 0xf1, 0xa6, 0x11, + 0x68, 0x8e, 0x41, 0x20, 0xdf, 0x04, 0x63, 0x02, 0x0e, 0xbc, 0xf3, 0xf2, 0xfb, 0x48, 0x44, 0xca, 0x0f, 0xb0, 0x01, + 0xbd, 0xcc, 0x37, 0x5e, 0x04, 0x2b, 0x52, 0xa5, 0x19, 0x16, 0x66, 0x8f, 0xc1, 0xbc, 0xed, 0x8e, 0x7e, 0x32, 0xfc, + 0xcc, 0x04, 0x2f, 0xf9, 0x93, 0xe7, 0xf4, 0xce, 0x10, 0x1e, 0x62, 0xf0, 0xc1, 0x58, 0xf5, 0xc0, 0xe3, 0x94, 0xc6, + 0x0d, 0x01, 0x2e, 0x9f, 0xfd, 0xc8, 0x7c, 0x10, 0xbb, 0x11, 0x80, 0x67, 0x17, 0x57, 0x19, 0x78, 0x9b, 0xa9, 0xab, + 0x93, 0x96, 0x4e, 0xee, 0x17, 0x62, 0xc4, 0x0c, 0x52, 0x31, 0x9f, 0xde, 0xc8, 0x28, 0x0d, 0xe2, 0xa2, 0x64, 0xc6, + 0x25, 0xc5, 0xae, 0x39, 0x6f, 0xe8, 0x96, 0x9f, 0x33, 0x45, 0xed, 0x9d, 0x1d, 0xeb, 0x78, 0xff, 0x8f, 0xf3, 0x27, + 0x5d, 0x30, 0xba, 0xbc, 0xb5, 0xae, 0x66, 0xdb, 0xf3, 0x4d, 0x4d, 0xa9, 0x81, 0xe1, 0x37, 0x26, 0xfc, 0xd1, 0xc7, + 0x4b, 0x4d, 0x41, 0x0d, 0x8d, 0x5d, 0x64, 0x53, 0x8a, 0xac, 0xf0, 0xc6, 0x31, 0x65, 0xbe, 0x04, 0x52, 0x2c, 0xc6, + 0x4f, 0x3e, 0x37, 0x1a, 0x5c, 0x33, 0x52, 0x1c, 0x0e, 0x09, 0xea, 0x45, 0x91, 0xb7, 0x9f, 0x3a, 0xf9, 0x1c, 0x57, + 0x6f, 0xe6, 0x37, 0x43, 0x60, 0xa6, 0xdb, 0x56, 0x5a, 0xac, 0x9b, 0xb6, 0xe2, 0xab, 0xb5, 0x4a, 0xe3, 0x29, 0x5a, + 0xe3, 0xbb, 0x1a, 0x87, 0xe9, 0x95, 0xea, 0xab, 0xe1, 0xd7, 0xbd, 0x8d, 0xcd, 0x8c, 0x66, 0x2e, 0x74, 0x90, 0x38, + 0x24, 0xbd, 0x54, 0x4d, 0xab, 0xa8, 0xc6, 0x9e, 0x1e, 0xab, 0x1a, 0x94, 0x88, 0x77, 0xe8, 0x24, 0xd6, 0x30, 0x5b, + 0x8f, 0x72, 0xfa, 0x61, 0xb5, 0x85, 0x5a, 0xb1, 0x33, 0x31, 0xa9, 0xa9, 0x37, 0x96, 0xe5, 0xd5, 0x56, 0xd5, 0xe7, + 0x74, 0xa0, 0xc3, 0x9f, 0xc3, 0x1d, 0x84, 0xef, 0x6e, 0x05, 0x9a, 0x10, 0x64, 0x2e, 0xb6, 0xf2, 0x75, 0x88, 0xef, + 0xd2, 0x1e, 0x8f, 0x25, 0x56, 0x2b, 0x12, 0x8d, 0x6f, 0xaa, 0x2a, 0x0c, 0xc8, 0x65, 0x46, 0x15, 0x4b, 0x7b, 0x65, + 0x54, 0xc8, 0x8a, 0xec, 0x8d, 0x04, 0x69, 0x55, 0xf0, 0x42, 0x90, 0xd2, 0x2c, 0x9a, 0x98, 0xcc, 0x5f, 0x0d, 0xef, + 0x92, 0x92, 0xcc, 0x26, 0xf8, 0xd3, 0x26, 0xce, 0x66, 0x14, 0x70, 0xb7, 0x52, 0x37, 0xb8, 0xd8, 0x9a, 0x71, 0x55, + 0xae, 0x20, 0xb7, 0x05, 0x07, 0x21, 0xab, 0xa2, 0x68, 0x61, 0x9f, 0xdf, 0xf9, 0xa7, 0x48, 0x53, 0x00, 0x40, 0xe4, + 0x35, 0xa1, 0x29, 0xbb, 0x69, 0x41, 0x66, 0xe9, 0x60, 0x19, 0xc0, 0x07, 0x2c, 0x85, 0xf2, 0xd0, 0x79, 0x1e, 0xd7, + 0xdd, 0xcb, 0x4c, 0x2d, 0x2a, 0x2d, 0x1b, 0x74, 0x4f, 0x07, 0x87, 0x5c, 0xaf, 0x74, 0xfa, 0xef, 0x8f, 0xd4, 0x56, + 0x5e, 0xa0, 0x0e, 0x2a, 0x7c, 0xf7, 0x51, 0xb5, 0x10, 0xe3, 0x50, 0xab, 0xff, 0xad, 0x28, 0xd1, 0x39, 0x05, 0x4f, + 0xa2, 0xd7, 0x3f, 0x56, 0xac, 0xd3, 0x2b, 0x26, 0x91, 0xf8, 0x72, 0x22, 0xa8, 0xdb, 0x66, 0x57, 0x5d, 0x72, 0xda, + 0x5c, 0x65, 0xf6, 0x9f, 0x0e, 0x78, 0xf6, 0xad, 0x77, 0x7e, 0xa7, 0x17, 0x77, 0x90, 0x44, 0xa1, 0xd0, 0xf3, 0x21, + 0x3e, 0xa0, 0xa3, 0xb2, 0xfa, 0x13, 0x91, 0x14, 0xab, 0x96, 0xcb, 0xd0, 0x80, 0x22, 0xc5, 0x4d, 0x19, 0xd5, 0x78, + 0xd0, 0xeb, 0x19, 0xbb, 0x04, 0x69, 0x74, 0xb3, 0x57, 0x2a, 0xc1, 0x49, 0x2b, 0xad, 0x3e, 0x2f, 0x41, 0x90, 0x6d, + 0xbc, 0x93, 0x5c, 0xa5, 0x58, 0x61, 0xf6, 0x58, 0x96, 0x95, 0x51, 0xd7, 0x50, 0x8c, 0xce, 0xb2, 0x8a, 0x5a, 0xe7, + 0xda, 0x6a, 0xa7, 0x08, 0xc5, 0x3a, 0x16, 0x00, 0x9b, 0x16, 0x4e, 0x07, 0x69, 0x61, 0x0b, 0x7a, 0x3a, 0xa9, 0xc6, + 0x25, 0xcd, 0x8e, 0xb1, 0xc8, 0xbb, 0x85, 0x41, 0xd0, 0x44, 0x5f, 0x77, 0x70, 0x53, 0x1e, 0x2b, 0x8a, 0x3a, 0xb8, + 0xde, 0xb1, 0x0c, 0xaf, 0x0e, 0xcd, 0x78, 0x81, 0xae, 0xa4, 0xec, 0x08, 0x95, 0x2b, 0x61, 0x27, 0x6d, 0x4a, 0x07, + 0x6d, 0x15, 0x7e, 0x68, 0x9e, 0x94, 0x8e, 0x05, 0xaf, 0x58, 0xa1, 0xc4, 0x35, 0xdd, 0x79, 0x0f, 0xeb, 0xa5, 0x9b, + 0x18, 0x23, 0xe4, 0x2b, 0xe2, 0xaf, 0x91, 0x22, 0xcc, 0x0d, 0x64, 0x0d, 0x2c, 0x64, 0x34, 0xc5, 0x24, 0x4c, 0x90, + 0xb1, 0xc7, 0x98, 0x78, 0xd1, 0x2d, 0x2e, 0xfd, 0x19, 0xb4, 0x41, 0x9b, 0x4d, 0x2b, 0xe9, 0x3e, 0x70, 0x85, 0xf6, + 0x7b, 0x3c, 0xe9, 0x90, 0x8f, 0x2d, 0x44, 0xcf, 0x14, 0x5c, 0xbe, 0x2e, 0xa1, 0x51, 0x7f, 0x00, 0x65, 0xed, 0x58, + 0x8a, 0xcd, 0x9a, 0x84, 0x1d, 0x98, 0x4e, 0x94, 0xf6, 0x7d, 0xf0, 0xa9, 0xc7, 0x5f, 0xbe, 0xde, 0x23, 0xf8, 0x0c, + 0x65, 0x4f, 0x14, 0x9b, 0x29, 0x86, 0x8a, 0xa6, 0xa6, 0xa0, 0x99, 0x0f, 0xce, 0xc2, 0x6d, 0xf1, 0x7a, 0x42, 0x2f, + 0x57, 0xbb, 0x75, 0x4f, 0xe5, 0xe3, 0x8a, 0x34, 0x40, 0xab, 0xcf, 0x1a, 0x95, 0x0f, 0xe6, 0xc9, 0x3d, 0xaf, 0x74, + 0xcf, 0x0f, 0xe8, 0xa1, 0xd1, 0xee, 0xe2, 0x4d, 0xd7, 0x32, 0x3e, 0xb4, 0x9b, 0xac, 0xcf, 0x60, 0x11, 0x7a, 0xa8, + 0xa1, 0x14, 0xcd, 0xe1, 0x26, 0xab, 0xd9, 0xf0, 0xee, 0x8d, 0x66, 0x6d, 0x29, 0x25, 0x7f, 0x6f, 0xe7, 0xc5, 0x36, + 0x9b, 0x2a, 0x9c, 0xde, 0x0f, 0xa4, 0x77, 0x09, 0x14, 0xcd, 0x91, 0xef, 0x4e, 0xa7, 0xa9, 0x7c, 0xd0, 0x4f, 0x80, + 0xa1, 0x82, 0xef, 0x1e, 0x69, 0x74, 0x67, 0x4d, 0x71, 0xbe, 0x82, 0x4b, 0x0f, 0xa3, 0xc6, 0xb6, 0x4b, 0x4f, 0x04, + 0xe1, 0xd4, 0xe2, 0x1e, 0xe9, 0x25, 0x45, 0x4b, 0x1d, 0x29, 0xe1, 0x9f, 0x22, 0x9c, 0x53, 0x8d, 0x1d, 0xed, 0x6c, + 0x1a, 0x6f, 0xa8, 0x20, 0x3d, 0x6a, 0x72, 0x4d, 0xfb, 0x12, 0x0a, 0xe0, 0xbf, 0x9d, 0xba, 0x12, 0xe1, 0x32, 0x21, + 0x37, 0xab, 0x8a, 0x4a, 0x83, 0x32, 0x00, 0x28, 0xbf, 0x5d, 0xcb, 0xe8, 0x1a, 0x3f, 0x5a, 0xa8, 0xcb, 0x12, 0x73, + 0xa0, 0x83, 0x16, 0x67, 0x77, 0x03, 0x2d, 0x92, 0x6d, 0x73, 0xea, 0xae, 0x51, 0xb5, 0xc5, 0x93, 0xc0, 0x4b, 0x44, + 0x63, 0x39, 0xeb, 0xe7, 0xf0, 0x6d, 0xda, 0x5e, 0x0f, 0xce, 0x3a, 0x40, 0xb7, 0xb0, 0xa0, 0xda, 0x9a, 0xb5, 0xfc, + 0x5e, 0x81, 0x0f, 0xf8, 0x51, 0x6c, 0xec, 0x3c, 0x76, 0x42, 0xcd, 0xc9, 0x0e, 0xbd, 0xb9, 0x49, 0x39, 0x27, 0xca, + 0x9c, 0x4e, 0x62, 0x1c, 0x85, 0x26, 0xea, 0x8c, 0x30, 0xf9, 0xd4, 0x6b, 0x32, 0x03, 0x1e, 0x7d, 0xe3, 0x22, 0x61, + 0x1f, 0x9c, 0x53, 0xc9, 0x96, 0xb5, 0x66, 0x93, 0x9b, 0x9f, 0x49, 0xb1, 0xc9, 0x98, 0x60, 0xbd, 0xa0, 0xf7, 0x37, + 0x44, 0x42, 0x18, 0x37, 0x84, 0x62, 0x68, 0x6a, 0x52, 0xe3, 0x69, 0x73, 0xa5, 0x64, 0x46, 0x97, 0x54, 0xbf, 0xac, + 0x2e, 0x28, 0x24, 0x5a, 0x51, 0xf0, 0xcb, 0x16, 0x8e, 0xbd, 0x46, 0x10, 0x7b, 0x06, 0xa0, 0x0f, 0x1d, 0xa0, 0x89, + 0x91, 0xdc, 0x6a, 0x6a, 0x4f, 0xb6, 0x04, 0x5e, 0x79, 0x19, 0xe2, 0x0d, 0xfb, 0x4d, 0x50, 0x09, 0x3c, 0xc7, 0xbe, + 0x59, 0x0e, 0x79, 0x0e, 0x97, 0xd5, 0x5d, 0x7d, 0x8a, 0xe8, 0xdc, 0xf9, 0xc2, 0xc3, 0x14, 0xbd, 0x43, 0xb5, 0x8f, + 0xd0, 0xd5, 0x2b, 0x79, 0x15, 0x73, 0x90, 0x83, 0x45, 0xdd, 0x98, 0x6c, 0x62, 0x57, 0xa7, 0x9e, 0x6b, 0x40, 0xb7, + 0xc7, 0x6e, 0x06, 0x62, 0x0f, 0x23, 0x26, 0xeb, 0x78, 0x4a, 0x6f, 0x11, 0x31, 0xda, 0x62, 0x22, 0xa9, 0x99, 0x34, + 0x6b, 0x52, 0x03, 0x39, 0x2d, 0xc2, 0x1c, 0xd4, 0x4f, 0x74, 0x8e, 0x3d, 0x12, 0xba, 0xb3, 0x6c, 0xbb, 0x46, 0x25, + 0x93, 0xdc, 0x61, 0xae, 0x50, 0x49, 0x08, 0xa9, 0x28, 0xbb, 0x92, 0x29, 0x30, 0xa5, 0x31, 0xe1, 0x1a, 0x57, 0x83, + 0x22, 0x43, 0x97, 0x0a, 0x6a, 0x6f, 0x9d, 0xa4, 0xd4, 0x39, 0x67, 0x0e, 0xf0, 0x29, 0x94, 0x3f, 0xab, 0x9a, 0x87, + 0x4d, 0xad, 0x40, 0xc5, 0xbd, 0x7a, 0xb9, 0x58, 0xf0, 0x66, 0xfe, 0x04, 0x85, 0x41, 0xa1, 0xaf, 0xa8, 0x29, 0xcf, + 0xe5, 0xa1, 0xac, 0x44, 0xdf, 0x8c, 0xbf, 0xa7, 0xf2, 0x8a, 0xc0, 0x65, 0xbe, 0x42, 0x24, 0xa6, 0xdf, 0x78, 0xa8, + 0x3f, 0x2d, 0x0b, 0x9b, 0x2a, 0x62, 0xfa, 0xf7, 0x93, 0xbf, 0x36, 0x90, 0xe0, 0x87, 0x9e, 0xd8, 0x2f, 0x5a, 0x08, + 0x3a, 0x16, 0x19, 0x54, 0x98, 0x23, 0x72, 0xa2, 0x00, 0x4e, 0xb2, 0x47, 0xd7, 0xcb, 0x4b, 0x6a, 0xe8, 0x08, 0x6e, + 0x81, 0x9c, 0xb0, 0xa2, 0x6a, 0x24, 0xcf, 0xfe, 0xde, 0x76, 0x4b, 0xaa, 0x53, 0x0e, 0x03, 0x36, 0x7f, 0xed, 0x69, + 0x19, 0xba, 0x7b, 0x1b, 0x04, 0xb0, 0x05, 0xbd, 0x1e, 0x87, 0x1f, 0x01, 0x34, 0x82, 0xc9, 0x0c, 0x19, 0xcb, 0xa7, + 0x86, 0xea, 0x55, 0x5f, 0x9e, 0x1c, 0x85, 0xb8, 0x75, 0x8a, 0x8c, 0x28, 0x5b, 0x41, 0x2e, 0x63, 0xcb, 0x6e, 0xbf, + 0x95, 0xfe, 0xc0, 0x0a, 0xaa, 0x6b, 0x15, 0x82, 0x1c, 0x8c, 0x49, 0x78, 0x23, 0x51, 0x61, 0xcd, 0xdf, 0x74, 0x06, + 0x78, 0xcb, 0x53, 0x38, 0x84, 0x7b, 0xbb, 0x03, 0x6a, 0x7d, 0x0d, 0x41, 0xa1, 0xa9, 0x1c, 0x38, 0x9b, 0xa2, 0x35, + 0x47, 0x1c, 0x9c, 0xcf, 0x61, 0xc3, 0xf2, 0x1e, 0x77, 0x33, 0xc4, 0x32, 0x88, 0x14, 0xd1, 0xe1, 0x90, 0xa5, 0xc5, + 0xa2, 0xc6, 0x16, 0xab, 0x90, 0xf6, 0x29, 0xce, 0x08, 0x37, 0x31, 0xa5, 0x38, 0xd1, 0x87, 0x97, 0x60, 0x78, 0x06, + 0xce, 0x30, 0x6b, 0xd7, 0x1e, 0x88, 0xdb, 0x1b, 0x3a, 0x5f, 0x7e, 0xc9, 0x8e, 0x32, 0x7f, 0xae, 0x3a, 0x03, 0x96, + 0xcf, 0x7e, 0xde, 0x13, 0xa0, 0xa7, 0x9f, 0x38, 0x6c, 0xab, 0x9f, 0x4a, 0xcf, 0x46, 0x6a, 0xac, 0xee, 0x99, 0x4e, + 0xce, 0xdc, 0xd6, 0x1b, 0x1e, 0xe8, 0xcc, 0x82, 0x84, 0x0f, 0x5e, 0x63, 0x1f, 0xb4, 0x91, 0x4a, 0xd2, 0x57, 0x3c, + 0x51, 0xde, 0x5b, 0xe0, 0x57, 0x0f, 0x64, 0xe5, 0x91, 0x0b, 0x12, 0xf4, 0x12, 0xda, 0xf3, 0x79, 0x74, 0xc6, 0xc1, + 0xb0, 0x37, 0xca, 0x27, 0xc6, 0x4b, 0x4c, 0xfa, 0xe6, 0xdb, 0x61, 0x88, 0x48, 0xdf, 0x47, 0x54, 0xe0, 0x84, 0x2c, + 0xa9, 0xf2, 0xf0, 0x46, 0xc2, 0x21, 0x9e, 0x4a, 0x74, 0xa6, 0x4e, 0xcd, 0x59, 0xb5, 0x58, 0x6c, 0x59, 0x79, 0xf5, + 0xda, 0x51, 0xe4, 0x77, 0x6c, 0xd5, 0x92, 0x76, 0xb2, 0xaf, 0x94, 0xa1, 0x55, 0x89, 0x33, 0x18, 0x19, 0x5d, 0xb0, + 0xd5, 0x8b, 0x24, 0x1f, 0xb2, 0x26, 0x2a, 0x1a, 0xd6, 0x95, 0xc9, 0xcc, 0x28, 0xb9, 0x95, 0xf5, 0x45, 0xda, 0xb1, + 0x5d, 0x78, 0xad, 0x42, 0x25, 0xe9, 0xa0, 0x9e, 0x93, 0xe4, 0xfc, 0x40, 0xda, 0x3a, 0xca, 0xdf, 0xb6, 0xaa, 0x93, + 0xeb, 0xa1, 0xa7, 0xec, 0x2a, 0x1d, 0x08, 0xf3, 0x55, 0xb2, 0x06, 0x81, 0x81, 0x7c, 0x77, 0x60, 0x3b, 0x06, 0x9d, + 0xbe, 0xdd, 0x1e, 0x99, 0x74, 0x3c, 0x05, 0x3a, 0x65, 0x14, 0x30, 0x4d, 0x14, 0x46, 0x57, 0x6b, 0xcc, 0xfe, 0xee, + 0x78, 0xe9, 0xbb, 0x82, 0x03, 0x55, 0xdc, 0xe9, 0x41, 0xf8, 0xe1, 0xde, 0xd5, 0xc6, 0xe0, 0x87, 0x53, 0x47, 0x4f, + 0xcc, 0xcc, 0x52, 0xcb, 0xbf, 0xaf, 0x77, 0x87, 0xdf, 0xc7, 0x29, 0xc4, 0xf0, 0x81, 0x5e, 0xc7, 0xee, 0x8b, 0xfa, + 0x57, 0xf1, 0x32, 0x97, 0xf8, 0xc2, 0x0f, 0x5d, 0xd1, 0xec, 0xa6, 0xde, 0x95, 0x35, 0xcc, 0xa1, 0x6f, 0xc5, 0xda, + 0x48, 0xe5, 0x16, 0x58, 0xf7, 0x66, 0xb9, 0x13, 0x07, 0x0c, 0x38, 0xd7, 0x73, 0xc4, 0xc4, 0x67, 0xa6, 0x5a, 0xcf, + 0x24, 0x9d, 0x9a, 0xe9, 0x48, 0x86, 0x51, 0x0b, 0x58, 0x89, 0x89, 0x50, 0xdc, 0xe1, 0x01, 0x51, 0xd9, 0x21, 0x8f, + 0x7e, 0x2c, 0xf4, 0x6d, 0x4a, 0x28, 0x1b, 0xbe, 0x82, 0x97, 0x27, 0x97, 0x3f, 0x18, 0xd9, 0x78, 0xdc, 0xfc, 0xb1, + 0xd2, 0x8b, 0x97, 0x33, 0x4f, 0xde, 0xa0, 0x88, 0xd5, 0x79, 0x82, 0xe5, 0x01, 0x12, 0x9b, 0x33, 0x37, 0xd0, 0x49, + 0x30, 0xf5, 0x46, 0x37, 0xbf, 0x14, 0xc1, 0xad, 0xb6, 0x0d, 0x4e, 0xf9, 0x99, 0xe9, 0x1e, 0x85, 0xe2, 0x27, 0x3f, + 0xc3, 0x92, 0x59, 0x36, 0x4e, 0xc0, 0xc9, 0xb2, 0x2b, 0x0f, 0x3e, 0x6d, 0x7d, 0xf1, 0x61, 0x7d, 0x61, 0xfd, 0x79, + 0x8a, 0xb1, 0xfe, 0xfc, 0x92, 0xde, 0xdc, 0x3b, 0xac, 0x83, 0xd8, 0x7a, 0x74, 0x83, 0xfe, 0x29, 0x35, 0xec, 0xfc, + 0xb1, 0x33, 0x84, 0x0a, 0x11, 0x6a, 0xbc, 0x41, 0x58, 0x70, 0xee, 0x8e, 0x94, 0xac, 0x9a, 0x31, 0x4e, 0x2b, 0x49, + 0x6b, 0xc0, 0xbe, 0xd2, 0xa4, 0xb4, 0xca, 0xed, 0x6a, 0x45, 0xcc, 0x2e, 0x4d, 0xed, 0x50, 0x60, 0xd1, 0x77, 0x52, + 0x92, 0x24, 0xe7, 0xa5, 0x67, 0xf7, 0x48, 0x6d, 0x47, 0x40, 0xe5, 0xea, 0xbe, 0x40, 0x30, 0x6e, 0x6f, 0x77, 0x07, + 0xaa, 0xa6, 0xbe, 0x83, 0x41, 0x3d, 0xf2, 0x52, 0xff, 0x1f, 0x6c, 0x44, 0x6f, 0x5e, 0xfa, 0x0e, 0x50, 0x36, 0xa2, + 0xd9, 0xbb, 0x20, 0xd7, 0x01, 0xf2, 0x8e, 0x19, 0x4e, 0x55, 0xe5, 0x30, 0xca, 0xe8, 0xaf, 0x3e, 0x4b, 0xe1, 0xd2, + 0x7b, 0x87, 0x79, 0xb2, 0x49, 0x07, 0x9e, 0x05, 0x5b, 0xba, 0xf7, 0x12, 0x49, 0x60, 0xd9, 0x21, 0x21, 0x57, 0x69, + 0xdf, 0xa0, 0xcb, 0xaa, 0x53, 0x6d, 0x52, 0xf4, 0xd3, 0x8e, 0x1b, 0x3c, 0x62, 0x5a, 0x70, 0x8b, 0x74, 0x84, 0x5a, + 0x25, 0x84, 0x31, 0xe3, 0x29, 0x92, 0xd5, 0x80, 0xf0, 0x5a, 0x4d, 0x3c, 0x25, 0x8d, 0x28, 0x0f, 0x0c, 0x13, 0xdb, + 0x7b, 0xb1, 0xf3, 0x63, 0x17, 0xc4, 0x98, 0xdd, 0xba, 0xfb, 0x55, 0xf1, 0xa1, 0x3f, 0xc3, 0xb3, 0xb6, 0x3b, 0x99, + 0x4b, 0x48, 0x90, 0x38, 0xf4, 0x2f, 0x54, 0xfc, 0x5a, 0x23, 0x3c, 0x01, 0x0d, 0x56, 0x09, 0x86, 0xa9, 0x05, 0xbe, + 0x9d, 0xde, 0x67, 0xbd, 0x5e, 0x3d, 0x61, 0xe2, 0xe8, 0x16, 0xe0, 0xda, 0x23, 0x15, 0x97, 0xd3, 0x87, 0x03, 0xbb, + 0xaf, 0x96, 0x1a, 0xe8, 0xaa, 0x64, 0xb2, 0xf8, 0x4b, 0x6f, 0x9c, 0xff, 0x4d, 0x43, 0xd1, 0x81, 0x25, 0xfa, 0x39, + 0xbd, 0x16, 0x3b, 0xf7, 0xc9, 0x27, 0x12, 0x30, 0x1a, 0xc3, 0x93, 0x9c, 0x1e, 0x58, 0x15, 0x6d, 0x26, 0xdc, 0x9f, + 0x17, 0xa7, 0x09, 0x34, 0x76, 0xa0, 0x17, 0x37, 0x99, 0x6f, 0xe3, 0xdd, 0x95, 0xad, 0xee, 0xfd, 0x61, 0x59, 0xd5, + 0xbc, 0x4d, 0xea, 0xa8, 0xbb, 0x48, 0x10, 0xe2, 0x52, 0x47, 0xa8, 0x49, 0x57, 0x6c, 0xad, 0x39, 0x73, 0x71, 0x9a, + 0xc7, 0x56, 0x7e, 0x96, 0x6d, 0x79, 0x20, 0xeb, 0x85, 0x58, 0xd5, 0x6c, 0xd4, 0x04, 0x29, 0x43, 0x5d, 0x88, 0xee, + 0x32, 0xa2, 0x82, 0x16, 0xab, 0x5f, 0xd7, 0xb1, 0x32, 0xdd, 0xa7, 0xe9, 0x68, 0x42, 0xe0, 0xf7, 0x71, 0x00, 0x46, + 0xb4, 0xfe, 0x15, 0x83, 0xa6, 0xd6, 0x28, 0x39, 0x8d, 0x4e, 0x84, 0x88, 0x43, 0xdb, 0x34, 0x06, 0xbc, 0x74, 0xf9, + 0x99, 0x1c, 0x62, 0xaa, 0x05, 0xc6, 0x1b, 0x18, 0xaf, 0x87, 0xb6, 0x98, 0x72, 0xe7, 0xe9, 0x55, 0x65, 0x94, 0xf1, + 0xc9, 0xfd, 0xcc, 0xeb, 0x9e, 0x7d, 0x40, 0xc9, 0x00, 0x84, 0x0a, 0xaf, 0x55, 0x18, 0x32, 0x58, 0x25, 0xf8, 0xf3, + 0x16, 0x63, 0xf0, 0x73, 0xdb, 0x9c, 0x87, 0xf9, 0x10, 0x2b, 0xec, 0x30, 0x0b, 0xf4, 0xe9, 0x79, 0x01, 0xd3, 0x03, + 0xd9, 0xd9, 0xb3, 0xd2, 0x96, 0x51, 0x5a, 0x22, 0x60, 0x57, 0xb8, 0x4e, 0x01, 0x2c, 0x2a, 0x81, 0xc7, 0x41, 0x94, + 0x40, 0x1b, 0xfb, 0x81, 0x68, 0xca, 0x12, 0x52, 0x00, 0xab, 0xd5, 0x9f, 0x01, 0xec, 0xa0, 0x24, 0xdb, 0xce, 0xae, + 0x09, 0x91, 0xd9, 0x7a, 0xa4, 0xbd, 0xea, 0x30, 0x2d, 0xfa, 0xe7, 0xc4, 0x59, 0x9a, 0x18, 0xfb, 0x28, 0x89, 0x8f, + 0x1a, 0x37, 0x30, 0x25, 0x12, 0x74, 0x23, 0x0f, 0xc0, 0xcd, 0x2d, 0xf7, 0xe4, 0xbc, 0xd3, 0x9b, 0x03, 0x18, 0xe4, + 0xf4, 0x4c, 0x7f, 0xed, 0xc0, 0x82, 0xfb, 0xcf, 0x25, 0xea, 0xe8, 0x69, 0x09, 0xc9, 0x04, 0x2e, 0x7e, 0x34, 0xee, + 0x99, 0x06, 0x02, 0x62, 0xcf, 0x85, 0x51, 0x0b, 0x18, 0xfc, 0xd4, 0x11, 0xaf, 0x69, 0xcf, 0x92, 0x0e, 0xa3, 0xd2, + 0xf7, 0x44, 0x3a, 0xd5, 0xb6, 0x47, 0xa6, 0x7b, 0x9d, 0xc6, 0xd4, 0x87, 0xc8, 0x07, 0x53, 0xb8, 0x52, 0x04, 0xc0, + 0xf9, 0x1f, 0x0f, 0x58, 0xee, 0xdf, 0xc4, 0x8a, 0xae, 0x90, 0xe7, 0xda, 0x98, 0x72, 0x58, 0x25, 0x03, 0x5b, 0xc6, + 0x65, 0x47, 0x4c, 0x98, 0x8d, 0x99, 0x56, 0x46, 0x6f, 0xe6, 0xc8, 0x19, 0xa4, 0xb2, 0x31, 0x5c, 0x44, 0x39, 0xb5, + 0x25, 0x20, 0x21, 0xaa, 0x02, 0x18, 0x3c, 0xbd, 0x85, 0x8d, 0x95, 0xd4, 0xa6, 0x74, 0x26, 0x18, 0xaa, 0x21, 0xca, + 0x57, 0x39, 0xb1, 0x9d, 0xca, 0xd1, 0x7c, 0xa0, 0xc9, 0xea, 0x6f, 0x9f, 0x16, 0xee, 0x63, 0x87, 0xe7, 0xbd, 0x4e, + 0x9e, 0x99, 0x14, 0xe8, 0xd3, 0x96, 0xb9, 0x73, 0xe9, 0xc4, 0x65, 0xf1, 0xd2, 0x74, 0xb1, 0x5f, 0x9c, 0xf5, 0x4d, + 0x0a, 0xb2, 0x6c, 0xed, 0xd7, 0x83, 0xb9, 0xc3, 0xb6, 0x98, 0x3a, 0x8f, 0x45, 0x80, 0xcb, 0x12, 0x51, 0xba, 0x96, + 0x09, 0x81, 0x4d, 0xcb, 0xbc, 0x30, 0x9b, 0xd1, 0xe6, 0x0a, 0x2f, 0xcf, 0x47, 0x35, 0xad, 0xc9, 0x15, 0x7a, 0xdd, + 0xa7, 0xd3, 0x77, 0x42, 0xfe, 0x79, 0x39, 0xea, 0x9e, 0x59, 0xca, 0x40, 0x54, 0xed, 0x94, 0x0e, 0x3c, 0xe9, 0xc0, + 0xce, 0xb6, 0xa6, 0x6f, 0xdf, 0x2f, 0xfe, 0xd1, 0x3e, 0x99, 0x3a, 0xb7, 0xa1, 0xb5, 0xe8, 0xf8, 0xfd, 0x1e, 0x51, + 0xbb, 0x64, 0x85, 0x23, 0x04, 0x2a, 0xcf, 0x18, 0xd8, 0xa4, 0xde, 0xcc, 0x59, 0xdc, 0xf8, 0x48, 0xb5, 0xe8, 0x16, + 0x0e, 0xf0, 0x58, 0xdf, 0xfd, 0xea, 0x4f, 0xaa, 0x6e, 0xcf, 0xff, 0xda, 0x9e, 0x84, 0x76, 0x93, 0x7f, 0x6d, 0x6c, + 0xfd, 0xc7, 0xce, 0xc8, 0x72, 0x05, 0xd1, 0xf3, 0xda, 0x7a, 0xb5, 0x24, 0x1c, 0xbc, 0xc3, 0xdc, 0x3d, 0x01, 0xdf, + 0x8e, 0xbf, 0x35, 0xcd, 0x80, 0xa4, 0x65, 0x16, 0xad, 0x8d, 0x5c, 0xe3, 0x25, 0x0c, 0x28, 0x43, 0xd9, 0x15, 0xce, + 0x54, 0x1b, 0x43, 0xf3, 0xeb, 0x1d, 0xb7, 0x6f, 0x1b, 0x6c, 0xdc, 0xa2, 0x5b, 0x45, 0x37, 0x71, 0x61, 0x75, 0x78, + 0xa6, 0xb8, 0xca, 0xe6, 0x54, 0xb9, 0xca, 0xf8, 0xbb, 0x60, 0xa8, 0x0e, 0x03, 0x6e, 0x33, 0xec, 0xc2, 0x75, 0xe7, + 0xa1, 0x0b, 0x15, 0x45, 0x30, 0x2c, 0x48, 0xa5, 0xe5, 0x04, 0x8a, 0x32, 0xb6, 0xc5, 0x86, 0xa2, 0x04, 0xff, 0xfa, + 0xf7, 0x8c, 0x97, 0x51, 0xc0, 0x37, 0x36, 0xb4, 0xc8, 0x6c, 0x85, 0xa6, 0x29, 0xe1, 0x67, 0x98, 0x92, 0xe3, 0xca, + 0x27, 0x8d, 0xdb, 0xe1, 0x7f, 0x15, 0x4d, 0x04, 0x0a, 0xa8, 0x13, 0x0b, 0x09, 0x99, 0x69, 0x33, 0x45, 0xaf, 0x30, + 0x84, 0xae, 0x48, 0xca, 0x07, 0x97, 0x39, 0xf8, 0xae, 0xcd, 0x3d, 0x77, 0x2d, 0x6f, 0x1e, 0x04, 0x5b, 0x92, 0x4d, + 0x90, 0x96, 0x14, 0x32, 0xc9, 0xc2, 0xda, 0x91, 0x81, 0xeb, 0x6b, 0x7b, 0xa1, 0xa0, 0x24, 0x59, 0x10, 0x89, 0xe7, + 0x6b, 0x6d, 0x91, 0x3a, 0x16, 0x7f, 0x61, 0xba, 0x9f, 0xe2, 0xd3, 0x5e, 0xf8, 0x81, 0xfa, 0x3a, 0xdc, 0x75, 0x5f, + 0x45, 0xb3, 0x21, 0x6e, 0xd5, 0x8f, 0x19, 0x15, 0xd7, 0x23, 0xa5, 0xfd, 0x58, 0xfe, 0xf9, 0xfb, 0x0d, 0x8b, 0xc9, + 0x00, 0xc7, 0xc3, 0x9b, 0x9b, 0xa9, 0xc3, 0x8c, 0xbd, 0x86, 0x54, 0x6d, 0xac, 0xbe, 0x01, 0xb9, 0x45, 0x0e, 0xd5, + 0xae, 0x89, 0xa2, 0x0e, 0xb8, 0x99, 0x08, 0x0e, 0xc4, 0x7d, 0x64, 0xce, 0xa8, 0xd7, 0x9e, 0x54, 0x73, 0xba, 0x94, + 0x69, 0xd1, 0x52, 0xcd, 0x18, 0x66, 0xca, 0x74, 0x54, 0x31, 0xa0, 0xae, 0xdc, 0xd9, 0x95, 0xe7, 0x7b, 0x7e, 0x2a, + 0xcb, 0x8b, 0x0d, 0x9b, 0xa1, 0x4b, 0x2d, 0xcc, 0x51, 0xbe, 0xea, 0xf3, 0xb8, 0xbf, 0xf1, 0x8a, 0xf7, 0x7a, 0x87, + 0xa1, 0x43, 0x2d, 0x3d, 0x66, 0x6f, 0xd6, 0xfa, 0x7a, 0x3e, 0xe3, 0x20, 0x2d, 0x6a, 0xa7, 0x82, 0x71, 0xce, 0xa2, + 0x80, 0x05, 0x78, 0x85, 0xdd, 0x11, 0x8c, 0x8f, 0x67, 0xf1, 0x88, 0x7e, 0x64, 0xec, 0xe6, 0x6d, 0xf3, 0x1a, 0x10, + 0xa4, 0xca, 0x8e, 0x7b, 0x4b, 0x17, 0x2a, 0x16, 0xd1, 0xd2, 0x3b, 0xd3, 0x29, 0x94, 0x8f, 0x15, 0x00, 0xa4, 0xee, + 0xf4, 0x66, 0x30, 0x1e, 0xca, 0xcd, 0x01, 0xc2, 0x8d, 0x9c, 0x19, 0x37, 0x26, 0x0a, 0x47, 0x37, 0x06, 0x84, 0x08, + 0x71, 0x35, 0xf0, 0x95, 0x97, 0xb4, 0x4f, 0x54, 0x2c, 0x0d, 0xf1, 0xbd, 0xf2, 0xe0, 0x3e, 0xdc, 0xda, 0x6f, 0x2f, + 0x4e, 0x55, 0xc9, 0xc1, 0x22, 0x14, 0x1b, 0xc5, 0x7b, 0xe3, 0x77, 0x2f, 0xec, 0x7e, 0x62, 0x31, 0xd7, 0x12, 0x01, + 0xe5, 0x96, 0xef, 0x97, 0x56, 0x4d, 0x9c, 0x3f, 0xfd, 0x87, 0x0f, 0xe5, 0x12, 0x72, 0xe4, 0xab, 0x58, 0x76, 0x40, + 0x66, 0xbe, 0xa2, 0x9f, 0x45, 0x59, 0x4d, 0xe1, 0x53, 0xde, 0xc2, 0xdd, 0x75, 0xc7, 0xb5, 0x0e, 0x00, 0x59, 0x38, + 0x44, 0xb3, 0xd1, 0xd3, 0x2e, 0x89, 0xd0, 0x36, 0xda, 0xf8, 0x96, 0x47, 0x9a, 0x51, 0x51, 0x51, 0x34, 0x2e, 0xcd, + 0x46, 0x3d, 0xa4, 0x20, 0x9e, 0xa0, 0x17, 0xdf, 0x86, 0x80, 0x7c, 0x74, 0xed, 0x9d, 0x12, 0xb3, 0x74, 0x6b, 0xe1, + 0xfb, 0xfe, 0x46, 0xa2, 0x9e, 0x02, 0xfd, 0x28, 0xc2, 0x64, 0x41, 0x33, 0xf2, 0x95, 0xff, 0x2e, 0x00, 0x6f, 0x62, + 0xd1, 0x3f, 0xb1, 0xf0, 0x67, 0xb2, 0xee, 0xe1, 0xab, 0x9d, 0xb8, 0xde, 0x2e, 0x9a, 0xd3, 0x41, 0xfb, 0x10, 0x94, + 0xaa, 0xbe, 0xc7, 0xe1, 0x4d, 0xa1, 0xf5, 0xcb, 0x8e, 0x5d, 0xb0, 0x15, 0x05, 0x03, 0x9e, 0x75, 0x4a, 0x34, 0x31, + 0x5d, 0x97, 0x15, 0x01, 0xc6, 0x12, 0x27, 0x90, 0x5b, 0x9d, 0xb3, 0x74, 0x94, 0x9b, 0xb3, 0x9b, 0x3c, 0x6b, 0x27, + 0xd7, 0xd1, 0xbe, 0x9d, 0xcc, 0x4a, 0x59, 0xe5, 0xba, 0x21, 0x34, 0x7b, 0xf9, 0xe4, 0x2c, 0x94, 0x8b, 0x42, 0x1d, + 0x15, 0x37, 0xb4, 0x6a, 0x4d, 0x56, 0xc0, 0xca, 0xc9, 0x45, 0xab, 0xf2, 0xe6, 0xe9, 0xd0, 0xb8, 0xc9, 0x36, 0xfd, + 0x58, 0xd1, 0x76, 0x07, 0x0a, 0xaf, 0x14, 0xd6, 0xf6, 0x1c, 0x6c, 0xc3, 0x89, 0x06, 0xc7, 0x7d, 0xbb, 0x6d, 0x40, + 0x54, 0x20, 0xbb, 0x98, 0x50, 0x62, 0x6b, 0xf9, 0x2f, 0x0e, 0x28, 0xbe, 0xbd, 0x9a, 0x5e, 0x47, 0x31, 0x32, 0x7c, + 0x53, 0xff, 0x1e, 0x08, 0xf0, 0x2f, 0x7c, 0x60, 0x6a, 0x67, 0x54, 0x45, 0x28, 0x6b, 0x37, 0xab, 0xd4, 0x1f, 0x15, + 0xb9, 0xa5, 0x49, 0x6a, 0xb6, 0x79, 0x7a, 0x82, 0x29, 0x2b, 0xda, 0x9b, 0xc3, 0x06, 0x7b, 0x74, 0x6d, 0x44, 0xd8, + 0x60, 0x42, 0x1c, 0xff, 0x83, 0x9d, 0x00, 0x9d, 0x48, 0xf1, 0x82, 0xcb, 0x71, 0x65, 0x29, 0x9a, 0x12, 0xcd, 0x4b, + 0x51, 0xfb, 0x14, 0xe6, 0x3d, 0xaf, 0x02, 0xae, 0x9b, 0x93, 0xa3, 0x6e, 0x87, 0x3e, 0x71, 0x8a, 0x38, 0xcf, 0x81, + 0x08, 0x7b, 0x2a, 0xa7, 0x5d, 0xbd, 0x59, 0x5b, 0x86, 0xb8, 0x6e, 0x56, 0x88, 0x90, 0x7c, 0x18, 0xa7, 0x62, 0x88, + 0xb1, 0x7d, 0x23, 0x73, 0xde, 0xe3, 0xab, 0x85, 0x28, 0xac, 0x70, 0x11, 0x8f, 0x91, 0xa5, 0x3f, 0x79, 0x05, 0xd1, + 0x9d, 0x51, 0x93, 0x60, 0xd6, 0xea, 0x64, 0xa4, 0x38, 0x53, 0xff, 0x02, 0x02, 0x43, 0x6d, 0x90, 0xd1, 0x41, 0x4d, + 0x95, 0xf9, 0xd1, 0xd3, 0x88, 0x1b, 0x1f, 0x38, 0xaa, 0x46, 0x9b, 0x90, 0x71, 0xa6, 0xd8, 0x16, 0xbf, 0x35, 0x77, + 0x4b, 0x00, 0x66, 0x77, 0x1d, 0xa8, 0x15, 0x71, 0x24, 0xa1, 0x55, 0x7f, 0xae, 0xfe, 0x7a, 0x89, 0x44, 0x71, 0x4e, + 0xe8, 0x63, 0xa0, 0xc5, 0x47, 0x98, 0xae, 0xe6, 0x62, 0x1b, 0x87, 0x1d, 0x47, 0xa2, 0x8a, 0xd3, 0xbb, 0xe8, 0x72, + 0x3f, 0x93, 0x60, 0xf7, 0x13, 0x22, 0x9e, 0xef, 0xad, 0x0b, 0x35, 0x0b, 0x47, 0x1f, 0xb6, 0x3f, 0x09, 0x12, 0x32, + 0xd4, 0x5f, 0x0b, 0x37, 0x47, 0xed, 0xd5, 0x4b, 0x2d, 0xa3, 0x0d, 0x3f, 0x2d, 0xa2, 0xc5, 0xa9, 0x00, 0x94, 0x0c, + 0xa3, 0xf3, 0xcf, 0x5f, 0xec, 0xb0, 0x9f, 0x83, 0x73, 0x0c, 0x26, 0x0f, 0x78, 0xc0, 0xcd, 0xdd, 0x4f, 0xe8, 0xda, + 0x52, 0xce, 0x08, 0x67, 0xac, 0x0d, 0x09, 0x56, 0xc6, 0xb9, 0x66, 0x6b, 0xe3, 0x45, 0xc3, 0x09, 0xe1, 0x08, 0x3a, + 0x68, 0x8c, 0x7a, 0x9e, 0x33, 0x9a, 0xa7, 0x58, 0xfd, 0xca, 0x19, 0x6f, 0xf9, 0x81, 0x9d, 0xcb, 0x15, 0x04, 0x55, + 0x17, 0x55, 0x62, 0x4d, 0x27, 0xda, 0x81, 0xcb, 0xfd, 0x25, 0x7b, 0xca, 0x22, 0x7f, 0xbb, 0xc0, 0xa4, 0xa6, 0x42, + 0x21, 0x67, 0x85, 0x1b, 0xda, 0x15, 0x82, 0xd5, 0x6a, 0xdc, 0xf0, 0x3b, 0x6f, 0x59, 0x96, 0xaa, 0x4e, 0xed, 0x46, + 0x35, 0x34, 0xc3, 0x84, 0x29, 0x6e, 0x68, 0x19, 0xdf, 0x91, 0x94, 0xd8, 0x59, 0xd7, 0x06, 0x73, 0xfa, 0x1f, 0x52, + 0x9c, 0x0a, 0x2d, 0x44, 0xa9, 0xfa, 0x1c, 0x34, 0x3a, 0x31, 0x4d, 0xd5, 0x79, 0x23, 0x77, 0x26, 0x07, 0x83, 0x9a, + 0xb2, 0xb1, 0x53, 0xf3, 0x8e, 0xe9, 0xc8, 0x0c, 0xfe, 0x8e, 0xfc, 0xe4, 0x21, 0xab, 0x65, 0x72, 0x99, 0xe8, 0x67, + 0xbd, 0xf1, 0xaa, 0x00, 0x14, 0xd6, 0x31, 0xa8, 0xd0, 0x3c, 0x6b, 0x2a, 0x6b, 0x55, 0x65, 0xba, 0x09, 0x5f, 0x75, + 0x4b, 0x03, 0x05, 0xcf, 0x94, 0xa7, 0x10, 0x51, 0x53, 0xe2, 0xa4, 0xd5, 0x43, 0xa8, 0x01, 0xe5, 0xe8, 0xbc, 0x88, + 0xb9, 0x8e, 0x95, 0x2a, 0x1b, 0xff, 0x72, 0xef, 0xa3, 0x75, 0xeb, 0x20, 0xef, 0x67, 0x36, 0xea, 0xfd, 0x22, 0x55, + 0x4e, 0xa1, 0xcf, 0x8f, 0x34, 0x8d, 0x35, 0x09, 0xb6, 0x71, 0x32, 0x90, 0x0a, 0x3a, 0xa9, 0xc0, 0xff, 0xcb, 0x94, + 0x33, 0x56, 0x4c, 0x2a, 0x40, 0xc5, 0x62, 0xed, 0x9a, 0x7f, 0xdd, 0x87, 0x05, 0x93, 0xa0, 0xee, 0x1f, 0x80, 0x5e, + 0x0b, 0xb9, 0x90, 0x5f, 0xad, 0xb7, 0xa1, 0xec, 0x7c, 0xc3, 0x49, 0xeb, 0x73, 0xf5, 0x93, 0x23, 0x17, 0xb1, 0x9a, + 0xa2, 0xcd, 0xb4, 0x9e, 0x3a, 0x4b, 0x98, 0xf0, 0xd3, 0x72, 0x6e, 0xba, 0x41, 0xe6, 0x1a, 0x47, 0xca, 0xcb, 0xec, + 0xe3, 0xa8, 0x55, 0x66, 0xe9, 0xd8, 0x86, 0x2a, 0x6a, 0x73, 0x3c, 0x73, 0xc6, 0xf8, 0x62, 0x4f, 0x9a, 0x6a, 0x57, + 0x56, 0xf2, 0xcd, 0xb5, 0x98, 0x37, 0x87, 0x32, 0x45, 0x3d, 0x32, 0xad, 0x93, 0x8b, 0x13, 0x2a, 0xb3, 0x02, 0xc0, + 0xdb, 0x90, 0x6c, 0x84, 0xc0, 0x2e, 0xd8, 0x8f, 0xb5, 0x78, 0xe9, 0x2e, 0xa5, 0x51, 0x82, 0x97, 0x10, 0x2b, 0xfa, + 0x87, 0xd2, 0x42, 0x83, 0x54, 0x57, 0x94, 0x2c, 0x0d, 0xf5, 0xdf, 0x4a, 0x0f, 0x27, 0x39, 0x6a, 0x70, 0x0e, 0xb5, + 0xc7, 0xc2, 0xa8, 0xf7, 0x63, 0xd2, 0xa3, 0x3c, 0xd6, 0x4b, 0x81, 0x4d, 0x96, 0xc0, 0xca, 0x09, 0x76, 0x17, 0x20, + 0xe5, 0xb5, 0x87, 0xbe, 0x56, 0x64, 0xc2, 0xe3, 0xf3, 0xe4, 0xd6, 0xa5, 0x65, 0xe0, 0x15, 0xf4, 0xae, 0xbd, 0xa1, + 0xd2, 0x02, 0x77, 0xbf, 0xc8, 0x95, 0xff, 0xe8, 0x50, 0x24, 0x1d, 0xf1, 0x54, 0x12, 0x78, 0x2b, 0xa9, 0xc1, 0xc0, + 0xad, 0x65, 0xc3, 0xb5, 0x69, 0x1b, 0x7d, 0xa8, 0x8f, 0xe3, 0x3b, 0x46, 0xab, 0xe0, 0x3f, 0x9f, 0x7e, 0xc3, 0x38, + 0xb4, 0xe0, 0xd9, 0xaa, 0x54, 0x59, 0xd7, 0x53, 0x47, 0xb2, 0xfd, 0xd5, 0xce, 0x5b, 0x04, 0xb3, 0x70, 0x25, 0x0b, + 0x4d, 0x02, 0x3a, 0xb6, 0x49, 0x16, 0xb8, 0x4d, 0x81, 0x99, 0x47, 0x3f, 0x45, 0x6f, 0x23, 0xd5, 0x38, 0x52, 0xb5, + 0x68, 0x12, 0xe3, 0x70, 0x41, 0x34, 0x79, 0x73, 0xb7, 0x2a, 0x02, 0x19, 0x1c, 0xc0, 0x2d, 0xbf, 0x33, 0xce, 0x3d, + 0xf5, 0x91, 0xd6, 0x3a, 0xf0, 0xbb, 0x6e, 0xb2, 0x5d, 0xda, 0xa1, 0x51, 0x4b, 0xf4, 0xb6, 0x1d, 0x35, 0x1a, 0x64, + 0xd8, 0x23, 0xc5, 0xd8, 0xbd, 0x8f, 0xcf, 0xea, 0x31, 0x83, 0x2c, 0xd1, 0x01, 0x5f, 0x77, 0x0d, 0x54, 0x2c, 0x32, + 0x90, 0xbb, 0x0b, 0x21, 0x51, 0x87, 0x6d, 0xb4, 0x00, 0x50, 0xfa, 0x04, 0xab, 0xef, 0xc4, 0x2d, 0xf5, 0x06, 0x94, + 0xf9, 0x3e, 0xa4, 0x94, 0x42, 0x7d, 0x51, 0x91, 0x29, 0x67, 0x8b, 0xc5, 0x8c, 0x22, 0x8c, 0x3c, 0x11, 0x19, 0x6a, + 0x13, 0xc4, 0x08, 0x9c, 0xde, 0x32, 0xaa, 0x7e, 0x6c, 0x2f, 0x03, 0x2d, 0xed, 0xb5, 0x88, 0xa9, 0xca, 0x19, 0xcf, + 0x01, 0x94, 0x80, 0xc1, 0x55, 0x00, 0x67, 0xa6, 0x7a, 0x57, 0xc6, 0x9c, 0x58, 0x66, 0x05, 0x0f, 0x94, 0x4e, 0x2e, + 0xc6, 0xd7, 0xc0, 0xf9, 0x8f, 0xad, 0x89, 0xab, 0xf8, 0xeb, 0xd7, 0x2d, 0x9f, 0x67, 0xff, 0x97, 0x89, 0x76, 0x75, + 0x06, 0xac, 0x9c, 0xb0, 0xcf, 0x13, 0xc4, 0xeb, 0x06, 0xdb, 0xcb, 0xd6, 0x62, 0xc5, 0x93, 0x5e, 0x7f, 0x6c, 0xb5, + 0xa4, 0x2c, 0xab, 0xe4, 0x57, 0x1b, 0x08, 0xa4, 0xf1, 0x9d, 0x49, 0x64, 0x90, 0x0a, 0x92, 0x62, 0xba, 0x11, 0xfc, + 0xee, 0x5b, 0xef, 0x61, 0x47, 0x1a, 0x78, 0xd9, 0xea, 0xc2, 0xf0, 0x99, 0xba, 0x5d, 0xd3, 0x49, 0xce, 0xe0, 0xcc, + 0x9b, 0x09, 0x47, 0x5b, 0xef, 0xf2, 0xe5, 0x0a, 0x2d, 0xfa, 0x3c, 0xf4, 0x2b, 0xba, 0x4d, 0x5a, 0x96, 0xc7, 0x3d, + 0xcc, 0xa0, 0xfe, 0xaf, 0x62, 0xcd, 0x69, 0xf4, 0x55, 0x51, 0x5f, 0x7a, 0x41, 0x2b, 0xcd, 0x6d, 0xad, 0x2d, 0xe4, + 0x74, 0x6e, 0x91, 0x7b, 0x30, 0x34, 0xed, 0xfb, 0x8f, 0x2a, 0xc2, 0x92, 0x3d, 0xa5, 0xad, 0xf7, 0xc9, 0x45, 0x2f, + 0xd5, 0xb9, 0x11, 0xff, 0x96, 0x53, 0x79, 0xd3, 0x3a, 0x6a, 0x64, 0x27, 0xfe, 0x0f, 0xd6, 0x4d, 0x94, 0x71, 0xb9, + 0x4e, 0xee, 0xb4, 0x83, 0xe2, 0xa8, 0x4b, 0x8e, 0x87, 0x38, 0xd7, 0x8c, 0x46, 0x7a, 0x25, 0xcc, 0x33, 0xa7, 0x55, + 0x85, 0x1e, 0x8b, 0x06, 0xc9, 0x1a, 0x1a, 0x90, 0x04, 0xa8, 0xc9, 0x09, 0x71, 0xea, 0x4e, 0x70, 0x6b, 0x40, 0x72, + 0x72, 0x89, 0x90, 0x9c, 0x16, 0xde, 0xe5, 0xe7, 0x0d, 0x19, 0xa2, 0x9c, 0xd7, 0x37, 0xb1, 0x23, 0x2a, 0x3e, 0x8b, + 0x6e, 0xb9, 0x6f, 0x11, 0x1a, 0x6d, 0x1f, 0x34, 0x9a, 0x8e, 0x39, 0xb0, 0xcb, 0x9b, 0x35, 0x68, 0x39, 0x33, 0x08, + 0xf9, 0xe9, 0x19, 0x34, 0x61, 0xc0, 0x6c, 0x85, 0x10, 0x73, 0x94, 0x6c, 0x95, 0x9a, 0x34, 0x06, 0xf5, 0xc4, 0x4e, + 0x1c, 0xa8, 0xcf, 0xcf, 0xba, 0x59, 0x29, 0xd9, 0x9c, 0x9a, 0xda, 0xf4, 0x03, 0xd8, 0xe2, 0x89, 0x36, 0x1f, 0x28, + 0xc3, 0x20, 0x0d, 0x57, 0x25, 0xc2, 0xdf, 0xa8, 0xa8, 0xf3, 0x65, 0x3e, 0x6f, 0xd8, 0x46, 0xd0, 0x88, 0x21, 0x03, + 0xb3, 0x13, 0xac, 0x81, 0x20, 0x58, 0x16, 0x67, 0x72, 0x96, 0xd2, 0xd9, 0x38, 0x96, 0x58, 0x0b, 0x05, 0xb4, 0xbc, + 0x4d, 0xce, 0x1d, 0x04, 0x50, 0x46, 0xa2, 0xc4, 0xb2, 0x8d, 0x88, 0x3e, 0x30, 0x09, 0xde, 0x10, 0x2b, 0xf8, 0x05, + 0xdf, 0x50, 0x3a, 0xe9, 0x40, 0x6d, 0x92, 0x3b, 0x85, 0xaa, 0x0c, 0x0e, 0xc6, 0xe1, 0x15, 0xff, 0xed, 0xca, 0x0f, + 0x0e, 0x6d, 0x22, 0xee, 0x2a, 0xe0, 0x92, 0xd1, 0x73, 0x08, 0xea, 0xe4, 0xda, 0xb2, 0x89, 0xef, 0x34, 0xda, 0xde, + 0x55, 0xb5, 0x2b, 0x8e, 0xf8, 0xfc, 0x51, 0x60, 0x14, 0xa4, 0x5c, 0xce, 0xfe, 0x8d, 0x27, 0x69, 0xa2, 0x39, 0xb7, + 0xef, 0x1d, 0x2e, 0x16, 0x69, 0xa6, 0x3a, 0x35, 0xbd, 0xb9, 0x58, 0xb5, 0x0f, 0x46, 0xae, 0xb5, 0x67, 0x67, 0x1c, + 0x47, 0x20, 0x05, 0xe5, 0x03, 0xfe, 0x0b, 0xa9, 0x1a, 0xf2, 0xf9, 0xd0, 0xcf, 0x01, 0xd5, 0x4c, 0xf1, 0x69, 0xd5, + 0xd6, 0xbe, 0x49, 0xb5, 0xe0, 0x7f, 0x73, 0x58, 0xa4, 0x75, 0xfd, 0xfd, 0xf9, 0x8b, 0xde, 0x36, 0xd2, 0xf1, 0x23, + 0xb1, 0x92, 0xfa, 0x13, 0xa0, 0xac, 0xbd, 0x19, 0xb3, 0x76, 0x10, 0x4e, 0x63, 0x4a, 0x21, 0xfa, 0x4f, 0xe2, 0x53, + 0x4f, 0x65, 0xf0, 0x0d, 0xd4, 0x0f, 0xde, 0xc4, 0x68, 0xe9, 0x67, 0x6d, 0x6a, 0x21, 0xfc, 0x2d, 0xe6, 0x8b, 0x5a, + 0x3d, 0xe8, 0x38, 0x0f, 0xb9, 0x78, 0xc5, 0xea, 0x3f, 0x7d, 0xf1, 0xe5, 0x6c, 0x61, 0xb0, 0x96, 0xb5, 0x07, 0xff, + 0x8f, 0xf3, 0x00, 0x20, 0x5b, 0x61, 0x58, 0x4b, 0x34, 0xd3, 0x2f, 0xad, 0xa7, 0x00, 0xdf, 0x9d, 0xa7, 0x52, 0x6c, + 0x4d, 0x8b, 0x95, 0xa9, 0x67, 0x3a, 0xa8, 0x57, 0x6a, 0x6b, 0xdc, 0x37, 0xd6, 0x87, 0xd1, 0xd0, 0x77, 0x30, 0x57, + 0xbc, 0x7e, 0x8c, 0xe9, 0xee, 0x9f, 0x26, 0x26, 0x86, 0xfd, 0x4e, 0x75, 0x4a, 0x9a, 0xa5, 0xbe, 0x6d, 0xc8, 0x99, + 0xdd, 0x26, 0x70, 0xdf, 0x64, 0x8a, 0x90, 0xe3, 0x7d, 0x72, 0x94, 0xa2, 0xa6, 0x7d, 0x4b, 0x25, 0xab, 0x5b, 0x0f, + 0x69, 0xc4, 0x2c, 0x35, 0xd0, 0xfb, 0xe2, 0x55, 0x81, 0x81, 0x87, 0xea, 0xbc, 0x7e, 0x8b, 0x02, 0x9e, 0xc1, 0x47, + 0xcb, 0xac, 0xda, 0xba, 0x04, 0x8e, 0x51, 0xeb, 0xc0, 0xfd, 0xf2, 0xc0, 0x1f, 0x29, 0xfa, 0xe2, 0x6d, 0xe4, 0x60, + 0x83, 0xd7, 0x53, 0x83, 0x53, 0x1e, 0x9e, 0x8d, 0xf5, 0x31, 0xe3, 0xa7, 0x95, 0xa3, 0xb0, 0x67, 0x5c, 0x3c, 0x99, + 0x5d, 0x8c, 0xc3, 0xa6, 0xdb, 0x2a, 0x27, 0x4a, 0xa6, 0x4c, 0xd7, 0x64, 0x7e, 0xc6, 0x85, 0x9e, 0x37, 0x6b, 0xb5, + 0x84, 0xcd, 0x0f, 0xfe, 0x70, 0x53, 0x5c, 0x19, 0x27, 0xa3, 0xd0, 0xfe, 0x1f, 0xd9, 0x99, 0xa6, 0x77, 0xa1, 0x46, + 0xe0, 0x52, 0x70, 0xb5, 0x54, 0x96, 0x46, 0xda, 0xcf, 0xf6, 0xe9, 0xfb, 0x24, 0x5f, 0x41, 0x9e, 0xfe, 0x92, 0x15, + 0x1b, 0x73, 0x92, 0x64, 0xff, 0xa8, 0x14, 0x32, 0x87, 0xaa, 0x45, 0x3b, 0x46, 0x5b, 0xf9, 0x09, 0x41, 0x7d, 0xd9, + 0x21, 0xea, 0x00, 0xcc, 0xb6, 0x4a, 0x79, 0xbf, 0x18, 0x68, 0x46, 0x51, 0xb6, 0x1c, 0xf4, 0xb5, 0x61, 0x06, 0x07, + 0xaf, 0x1a, 0xd6, 0xef, 0xbd, 0xac, 0x55, 0x32, 0x52, 0x69, 0xb3, 0xcc, 0x51, 0x6a, 0xf2, 0x74, 0xbf, 0xd4, 0xb9, + 0xe8, 0x9a, 0x38, 0xf8, 0xd9, 0xda, 0xf7, 0x60, 0xd7, 0x4e, 0xcb, 0xae, 0x14, 0xe6, 0x06, 0xc7, 0x79, 0xcc, 0x71, + 0x65, 0x03, 0x11, 0x6b, 0x16, 0x5a, 0xde, 0x14, 0x2d, 0x52, 0x77, 0xea, 0xbb, 0xb3, 0xec, 0x26, 0x80, 0xad, 0x62, + 0xef, 0xa1, 0xe5, 0xdb, 0x67, 0xe9, 0x8d, 0x0e, 0x6c, 0x6b, 0xe3, 0x5e, 0xc7, 0x37, 0x16, 0x84, 0x9e, 0x2c, 0xaf, + 0xce, 0xa8, 0x8e, 0x3b, 0xa7, 0xf9, 0xfc, 0x50, 0x31, 0x96, 0x6e, 0x93, 0xe8, 0x9c, 0x8f, 0xe4, 0x09, 0xb2, 0x0c, + 0x15, 0xcb, 0x69, 0x60, 0x2d, 0x23, 0x68, 0xec, 0x24, 0x7d, 0xe5, 0x91, 0xac, 0xc6, 0x8a, 0xf9, 0x47, 0xa0, 0x76, + 0xae, 0xec, 0xb8, 0x6d, 0x86, 0xa4, 0x5a, 0xae, 0xb4, 0x46, 0x30, 0x0c, 0x8d, 0x7f, 0x2d, 0x44, 0xa2, 0xda, 0x4a, + 0x40, 0x02, 0x0e, 0x67, 0x29, 0xa8, 0xdd, 0x6d, 0x79, 0xf3, 0x6e, 0x94, 0x1e, 0x51, 0xa4, 0xa2, 0x56, 0x54, 0x4e, + 0xf1, 0x86, 0xb2, 0xf5, 0x4c, 0x34, 0x01, 0x13, 0x8d, 0x62, 0x23, 0x33, 0x28, 0x6f, 0xb7, 0x2a, 0xe4, 0x5e, 0xae, + 0xfb, 0xb7, 0x57, 0xef, 0x28, 0x0d, 0x9b, 0xbe, 0x12, 0x92, 0x06, 0xad, 0x50, 0x44, 0x7c, 0xc0, 0x8e, 0x31, 0x8e, + 0xae, 0xc9, 0xf4, 0x99, 0x3a, 0x30, 0x46, 0x75, 0x89, 0x94, 0x2f, 0xcd, 0x9f, 0xbd, 0xf1, 0xea, 0x25, 0xb0, 0xf5, + 0x3b, 0x5d, 0x6b, 0x4d, 0x66, 0xde, 0x96, 0x52, 0x2b, 0x91, 0x6e, 0x32, 0x22, 0x8d, 0xff, 0x4c, 0xb3, 0x6f, 0x26, + 0xf2, 0x87, 0x1d, 0xed, 0xc0, 0x40, 0x86, 0xf4, 0x66, 0xb3, 0x39, 0xa7, 0x6a, 0x16, 0x00, 0x0a, 0xff, 0xd5, 0xba, + 0x0f, 0x66, 0x6b, 0xa6, 0xa9, 0x88, 0xe0, 0xb3, 0x30, 0x34, 0x6f, 0xe1, 0x90, 0xd5, 0x69, 0x04, 0xe0, 0x20, 0x09, + 0x81, 0xcc, 0xd9, 0x5c, 0x6f, 0x08, 0xaa, 0xd8, 0xdb, 0xb0, 0x46, 0x9f, 0x42, 0xe8, 0x7f, 0xe4, 0xd3, 0xcf, 0xf9, + 0x5e, 0x45, 0x51, 0x0c, 0x5d, 0x1d, 0x0a, 0x87, 0xd6, 0xdf, 0x64, 0xd2, 0x78, 0x97, 0x2c, 0x14, 0x83, 0xfa, 0x8b, + 0xbd, 0x43, 0xcb, 0xdc, 0x74, 0x67, 0x03, 0x0b, 0x97, 0x0a, 0x06, 0x52, 0x2c, 0x42, 0x48, 0x73, 0x83, 0xb3, 0x7e, + 0xeb, 0xb1, 0x7c, 0xe9, 0x02, 0x4d, 0xdf, 0xca, 0xe3, 0x31, 0x3e, 0xfb, 0x76, 0xbc, 0xe3, 0x13, 0x66, 0x5a, 0x66, + 0x89, 0x4a, 0x0a, 0xe9, 0x93, 0xff, 0x0e, 0xa3, 0x96, 0xc7, 0x84, 0x05, 0xd3, 0xea, 0xee, 0xa9, 0x14, 0xc5, 0xce, + 0x73, 0x58, 0x53, 0x2f, 0xa0, 0x0e, 0x85, 0x9b, 0xea, 0x03, 0xbb, 0x12, 0x41, 0x6a, 0x53, 0x00, 0x30, 0xfe, 0x08, + 0x80, 0x88, 0x07, 0x99, 0x57, 0xaa, 0x25, 0x64, 0xb8, 0x59, 0x4e, 0xa4, 0xbb, 0x8b, 0x51, 0xe2, 0x9b, 0x23, 0x02, + 0xb4, 0xa5, 0x66, 0x18, 0x9e, 0xc9, 0x6f, 0x73, 0x79, 0x13, 0x2e, 0x81, 0xed, 0x1a, 0xc1, 0x1b, 0x21, 0x6d, 0xd6, + 0x7e, 0x38, 0x02, 0xaa, 0xb6, 0x01, 0x51, 0xfa, 0x4d, 0x79, 0x63, 0xde, 0x88, 0x14, 0xaa, 0xd5, 0xce, 0xee, 0x4d, + 0x5a, 0xa7, 0x0d, 0xab, 0xe1, 0x29, 0xdc, 0x54, 0xa9, 0x6d, 0x23, 0xd7, 0xf6, 0x7f, 0x92, 0x82, 0x9c, 0x4d, 0xdd, + 0xd5, 0x6d, 0xf7, 0xfb, 0xa7, 0x09, 0x38, 0xfc, 0x24, 0x31, 0xbe, 0xfb, 0xd5, 0x32, 0xfb, 0x3f, 0xb6, 0xf2, 0xa0, + 0x04, 0x0f, 0xa7, 0x20, 0x9f, 0x62, 0x0d, 0xd7, 0x90, 0x7a, 0xf2, 0xae, 0xaf, 0xbb, 0x80, 0xc0, 0xfa, 0x2d, 0xb9, + 0x13, 0xef, 0x32, 0x82, 0x53, 0x00, 0xdb, 0xd6, 0x11, 0x58, 0xeb, 0xe6, 0x3b, 0x90, 0x82, 0x18, 0xf9, 0x2d, 0x92, + 0xff, 0xb3, 0x32, 0x37, 0xfc, 0x48, 0x51, 0xdc, 0x9c, 0x4b, 0x17, 0xd1, 0x93, 0x55, 0xd8, 0x0e, 0x1b, 0x55, 0x80, + 0x23, 0xb0, 0xf0, 0x7e, 0x6e, 0x26, 0xff, 0x0c, 0xa1, 0x9d, 0xab, 0x33, 0xc5, 0xa1, 0x18, 0xd5, 0x4f, 0x75, 0x01, + 0xca, 0xc3, 0x64, 0xc4, 0xa6, 0x26, 0xb4, 0x18, 0x0b, 0x4b, 0x97, 0x24, 0x80, 0x40, 0x7b, 0xa8, 0x25, 0x32, 0x97, + 0x6b, 0x91, 0x5d, 0x32, 0xee, 0xd9, 0x56, 0x2c, 0x5d, 0xfb, 0x98, 0xd7, 0xd9, 0x33, 0x70, 0xe3, 0x3c, 0x06, 0x5f, + 0xdc, 0xd9, 0x52, 0x58, 0xe9, 0x19, 0xb2, 0x3a, 0x3b, 0x57, 0xe2, 0xb0, 0x4d, 0xb6, 0x1f, 0x15, 0xec, 0xee, 0xdb, + 0x5b, 0x22, 0x0b, 0xc4, 0xe0, 0x3f, 0xad, 0x35, 0x59, 0xeb, 0x6f, 0xe4, 0x00, 0xbe, 0x85, 0x95, 0x7c, 0x41, 0x33, + 0xe0, 0x72, 0x77, 0x73, 0x40, 0xea, 0x81, 0x4f, 0x26, 0xac, 0xaa, 0x72, 0xcd, 0xcd, 0x46, 0xa6, 0x09, 0x9a, 0x10, + 0xff, 0xbf, 0xb2, 0xd5, 0x10, 0x1b, 0x80, 0x27, 0x63, 0xdf, 0x7c, 0xd9, 0x85, 0xc1, 0x66, 0xa1, 0xc5, 0x16, 0xf6, + 0xe1, 0x2d, 0xa7, 0xe2, 0x75, 0x73, 0x03, 0x35, 0xfc, 0x20, 0x81, 0x95, 0xef, 0x12, 0xaa, 0xf9, 0x9e, 0x38, 0xf6, + 0xbd, 0x57, 0xbe, 0x7a, 0x4e, 0x8f, 0x40, 0xd3, 0xe8, 0xac, 0x99, 0xf4, 0xe4, 0x70, 0x6e, 0x0c, 0x55, 0x23, 0xaf, + 0x95, 0xb7, 0x07, 0x57, 0xab, 0xbf, 0x3e, 0x9b, 0xf3, 0x36, 0x3f, 0xa2, 0x1f, 0x5d, 0x63, 0x23, 0x66, 0x71, 0xc2, + 0x57, 0xd7, 0x47, 0x91, 0x50, 0x51, 0xc4, 0xc5, 0x87, 0x75, 0x9f, 0x36, 0xae, 0xb7, 0x8e, 0x6e, 0xf1, 0x2e, 0xc0, + 0x9c, 0x92, 0x54, 0x9d, 0x6d, 0x67, 0xe8, 0x0a, 0xbe, 0x97, 0xb5, 0xc5, 0xf1, 0xa5, 0xb5, 0x6e, 0xcb, 0xcb, 0xae, + 0xbc, 0x37, 0x46, 0x5d, 0xb4, 0x60, 0xd7, 0x77, 0x9c, 0xbc, 0xd5, 0xc8, 0xfd, 0xea, 0xa9, 0x2d, 0x96, 0x50, 0x40, + 0x1b, 0x5a, 0xbe, 0x20, 0x3b, 0xc6, 0x9e, 0x8d, 0x4e, 0xa5, 0xc9, 0x53, 0xf4, 0xba, 0xfb, 0xcc, 0x23, 0x1e, 0xd6, + 0x81, 0xae, 0x9c, 0x06, 0x1d, 0xff, 0xc2, 0x7f, 0x79, 0x59, 0xaa, 0xb7, 0x2a, 0xae, 0xbd, 0x12, 0x00, 0x93, 0x2a, + 0x9f, 0xf4, 0xf2, 0xf7, 0x41, 0x10, 0x19, 0xd9, 0x08, 0xf1, 0x4c, 0x54, 0x96, 0x00, 0x3a, 0xae, 0x72, 0xf1, 0xce, + 0x74, 0xd0, 0x2f, 0x67, 0x22, 0x11, 0x39, 0x03, 0x6d, 0x1b, 0x14, 0x0a, 0x91, 0x7a, 0xbb, 0x08, 0xe2, 0x1e, 0x45, + 0x4c, 0x34, 0xd7, 0x5d, 0xdf, 0xaf, 0xd1, 0x71, 0x34, 0x36, 0xa3, 0x76, 0xfb, 0x5b, 0xc1, 0x14, 0x48, 0x89, 0x83, + 0x81, 0xba, 0xa2, 0x22, 0x1e, 0xff, 0xf1, 0x40, 0xfb, 0x25, 0x35, 0x9c, 0xb2, 0xc3, 0x78, 0x15, 0x5f, 0x59, 0x55, + 0xb5, 0xe2, 0x97, 0x88, 0x99, 0x21, 0x88, 0x37, 0x1a, 0xe9, 0x95, 0xcd, 0x5e, 0xcd, 0x64, 0xa2, 0x38, 0x29, 0x2c, + 0x8f, 0x6b, 0xd7, 0x84, 0x75, 0x00, 0x6b, 0xf5, 0xd1, 0xa1, 0xa5, 0xf8, 0xfb, 0xec, 0x8f, 0x4b, 0x8e, 0x99, 0xe7, + 0xcf, 0xf0, 0xbf, 0xcd, 0x2e, 0x97, 0xfc, 0xd1, 0x3d, 0xc9, 0xf6, 0x3d, 0x76, 0x00, 0xcd, 0x32, 0xa5, 0x8e, 0x32, + 0x86, 0x00, 0xc0, 0x41, 0xe2, 0x7b, 0x8b, 0xdb, 0xff, 0xee, 0x18, 0x44, 0xce, 0xf2, 0xa6, 0xc5, 0x83, 0xff, 0x18, + 0x51, 0x5a, 0x1a, 0x6b, 0xe1, 0x08, 0x82, 0x71, 0x6d, 0xac, 0x1b, 0xc9, 0x3c, 0xd0, 0x75, 0x04, 0xb2, 0x96, 0x9c, + 0x60, 0xa2, 0x44, 0xee, 0x55, 0xcd, 0xeb, 0x10, 0x6a, 0x25, 0x96, 0xa9, 0xcd, 0x23, 0xea, 0xa8, 0xb1, 0xef, 0x40, + 0xf0, 0x32, 0x3b, 0x44, 0x6d, 0xfe, 0x63, 0x4b, 0x81, 0x5f, 0x4a, 0x79, 0x32, 0x70, 0x78, 0x23, 0x14, 0x15, 0x1f, + 0x05, 0x30, 0x9c, 0x11, 0xbc, 0xa8, 0xd5, 0x57, 0x8e, 0x63, 0xa0, 0x1f, 0x4a, 0x2a, 0x5e, 0xec, 0x3e, 0x6f, 0xbc, + 0x01, 0x77, 0xa1, 0xfc, 0x03, 0xe5, 0x3a, 0x52, 0x2d, 0x7b, 0xf9, 0xc8, 0x4e, 0x6d, 0xc7, 0xd9, 0x50, 0x15, 0x54, + 0x45, 0xef, 0xd0, 0x2f, 0x85, 0x70, 0x60, 0x79, 0xb2, 0xda, 0x1b, 0xee, 0x0c, 0x7c, 0x6c, 0xc4, 0x47, 0x7d, 0x25, + 0x7b, 0x43, 0xa2, 0x8c, 0x85, 0xe4, 0x38, 0x2a, 0x40, 0xf4, 0xe4, 0xd3, 0x75, 0x36, 0x0d, 0x7b, 0x75, 0xb6, 0x14, + 0x48, 0x23, 0x46, 0x3a, 0x97, 0x4a, 0x67, 0xf6, 0xf4, 0x48, 0x19, 0x3f, 0xef, 0xfc, 0x6a, 0xd9, 0xa0, 0xcc, 0x36, + 0xa4, 0xf2, 0xa7, 0xbc, 0x2f, 0x25, 0x65, 0xb2, 0xad, 0xd8, 0xf4, 0xc6, 0xe6, 0x14, 0xc0, 0x64, 0x05, 0x61, 0xee, + 0xbe, 0x41, 0x39, 0x18, 0x63, 0x5d, 0xa9, 0x22, 0xdf, 0xf8, 0x3c, 0x76, 0x7a, 0x7a, 0xc1, 0x33, 0x8a, 0x2c, 0xfa, + 0x53, 0x04, 0x36, 0xcb, 0x6b, 0x85, 0x09, 0xdf, 0xe7, 0xb8, 0x46, 0xbf, 0xd0, 0x14, 0x4d, 0x42, 0xf4, 0xe3, 0x8d, + 0x48, 0x35, 0x2b, 0xe0, 0xcd, 0xfb, 0xa6, 0x1b, 0xc1, 0xb3, 0x32, 0xda, 0x48, 0x24, 0xda, 0xba, 0x29, 0xf0, 0xef, + 0x11, 0x7d, 0x23, 0x66, 0xfa, 0x83, 0x34, 0x5f, 0xfd, 0x20, 0xcc, 0x37, 0xdb, 0x03, 0xaa, 0xda, 0x87, 0xdc, 0xf8, + 0xe4, 0x42, 0x01, 0x16, 0x10, 0x46, 0x2f, 0x95, 0x36, 0xd6, 0x04, 0xa5, 0x84, 0x4b, 0x51, 0x93, 0x51, 0x5e, 0x4f, + 0xf5, 0x09, 0xad, 0xeb, 0x25, 0x19, 0x60, 0x12, 0xba, 0xb1, 0x8d, 0xbe, 0x8d, 0xb9, 0x4d, 0x97, 0xfd, 0x87, 0x0a, + 0xed, 0x81, 0x2b, 0x1b, 0x2c, 0xe0, 0x73, 0xb5, 0xe7, 0xce, 0x45, 0x04, 0x5a, 0x83, 0xf8, 0x8f, 0xe3, 0x7a, 0xb1, + 0x77, 0x4b, 0x25, 0x25, 0x56, 0x59, 0x08, 0x19, 0x2a, 0x17, 0x76, 0x73, 0xc3, 0x3c, 0xeb, 0x71, 0xf0, 0x8c, 0x04, + 0x01, 0xc1, 0xa9, 0x82, 0x49, 0x5c, 0x4d, 0x69, 0x58, 0xd9, 0x73, 0x74, 0xc3, 0x69, 0xf9, 0x35, 0x53, 0x65, 0xbb, + 0x40, 0xa7, 0x6f, 0x5c, 0x31, 0x98, 0x9f, 0xd8, 0x17, 0x8e, 0x1e, 0x5a, 0x46, 0xd7, 0x67, 0x07, 0x46, 0x80, 0x1c, + 0x56, 0x96, 0x81, 0x84, 0x2d, 0x49, 0xab, 0x37, 0x79, 0x78, 0xcf, 0x14, 0x22, 0xc9, 0x02, 0x55, 0x8e, 0x5f, 0x60, + 0x6b, 0x69, 0x49, 0x39, 0x2b, 0xd1, 0x5a, 0x85, 0x32, 0x44, 0x6b, 0xbd, 0x6f, 0x57, 0x9d, 0xde, 0x7b, 0x5f, 0xd0, + 0x79, 0x69, 0x24, 0x87, 0x18, 0x02, 0x43, 0x2c, 0x8d, 0xef, 0x14, 0x36, 0x5a, 0x6f, 0x96, 0xd9, 0x7d, 0x35, 0xb6, + 0x5f, 0xc3, 0x75, 0x3d, 0xf1, 0xa6, 0xfc, 0xb6, 0xce, 0x1e, 0xe6, 0xbc, 0x72, 0xa2, 0x1b, 0xba, 0x86, 0xcd, 0xda, + 0x4e, 0x7f, 0x55, 0xdf, 0x32, 0x19, 0x16, 0x1f, 0x7b, 0x08, 0x21, 0x17, 0xaa, 0x54, 0x88, 0xf4, 0x76, 0x27, 0x90, + 0x2a, 0xf7, 0x94, 0x2b, 0x9d, 0xe3, 0x44, 0xd6, 0xb1, 0x9d, 0x1c, 0x2e, 0x4d, 0x2a, 0x88, 0x63, 0x7b, 0xf7, 0x9d, + 0x58, 0xf0, 0xc9, 0x17, 0xd2, 0x9c, 0xa7, 0xeb, 0x97, 0x7e, 0x78, 0x65, 0xac, 0x94, 0x9c, 0x6e, 0x66, 0x51, 0xd3, + 0xdd, 0x2c, 0xb2, 0xf3, 0xaf, 0x71, 0xeb, 0x92, 0xf0, 0x3a, 0x69, 0xff, 0x6a, 0x84, 0x97, 0x5c, 0xeb, 0x52, 0x44, + 0x53, 0x94, 0xba, 0x7f, 0x9d, 0xa0, 0x20, 0x12, 0xfc, 0xb9, 0x68, 0x18, 0x6b, 0x9f, 0x56, 0xcd, 0x47, 0x63, 0xc5, + 0xd6, 0xde, 0xb7, 0x92, 0x1a, 0x17, 0x05, 0xd7, 0x8c, 0x5c, 0x69, 0xa5, 0xc4, 0xe0, 0x38, 0xd0, 0x94, 0x3f, 0x50, + 0xe5, 0x0f, 0x53, 0xd2, 0x79, 0x8b, 0xd9, 0xea, 0xfb, 0xd4, 0x6e, 0x1d, 0x53, 0x45, 0x23, 0x9d, 0x19, 0xb3, 0x51, + 0x2b, 0x38, 0xda, 0xe3, 0x7a, 0x59, 0x48, 0xe7, 0xb4, 0xcd, 0xe0, 0x93, 0xf4, 0xf1, 0xad, 0x7c, 0xb6, 0xca, 0x5f, + 0xea, 0xfd, 0x5e, 0xda, 0xdb, 0xe4, 0xc5, 0x06, 0xde, 0x0a, 0x13, 0x60, 0x20, 0xa2, 0x52, 0x05, 0xb5, 0x84, 0x24, + 0xec, 0xb4, 0xd3, 0x39, 0x43, 0x55, 0x5a, 0x4c, 0x81, 0x1f, 0x97, 0xf5, 0xf1, 0xf8, 0x5a, 0x34, 0xa6, 0xd6, 0x51, + 0x23, 0x3e, 0x2e, 0xe7, 0x19, 0x20, 0x2f, 0x54, 0x3c, 0x53, 0x11, 0x7d, 0x46, 0xce, 0xf0, 0xa0, 0xcc, 0x82, 0x91, + 0x76, 0x18, 0x8a, 0x2d, 0x37, 0xa6, 0x3a, 0x03, 0xba, 0xf0, 0x67, 0x8d, 0x94, 0x69, 0x84, 0x52, 0xc8, 0xb5, 0x49, + 0xbb, 0xcc, 0x37, 0x08, 0xd3, 0x0b, 0x1a, 0x7f, 0x3d, 0xf9, 0x5e, 0x0a, 0x99, 0x02, 0xee, 0x23, 0x85, 0xd7, 0xf4, + 0x42, 0x66, 0xc0, 0x9b, 0x1a, 0x20, 0x09, 0x40, 0x9a, 0x55, 0x27, 0xbc, 0x0d, 0x0f, 0x49, 0xb3, 0xdf, 0xca, 0x52, + 0xb9, 0x27, 0x57, 0x5a, 0xf2, 0xad, 0x6e, 0x2b, 0xe6, 0x4b, 0xd6, 0x36, 0xad, 0x9d, 0x9d, 0xd0, 0xeb, 0x34, 0x4d, + 0xba, 0x44, 0x38, 0xa8, 0x24, 0xbd, 0xdf, 0x01, 0x06, 0x53, 0x5f, 0xbe, 0x45, 0xcd, 0xfc, 0x5e, 0x82, 0x9d, 0x0c, + 0xd8, 0x50, 0x65, 0xe5, 0x32, 0x0b, 0x00, 0x01, 0xba, 0x6d, 0xa3, 0x9b, 0x26, 0x8b, 0x37, 0x22, 0xf7, 0x80, 0xce, + 0x05, 0x77, 0x64, 0x6f, 0x29, 0xdd, 0x99, 0x8e, 0x95, 0x6c, 0xbc, 0x2b, 0x6b, 0xb2, 0x0b, 0x95, 0xf8, 0x26, 0x06, + 0x66, 0x3b, 0x2b, 0x09, 0x80, 0xeb, 0xc6, 0x2e, 0xf3, 0x42, 0x9d, 0xc9, 0x6c, 0xcd, 0xaa, 0x3c, 0x55, 0xc3, 0x54, + 0x3a, 0x74, 0xd5, 0x44, 0x0d, 0x41, 0x36, 0x20, 0x6c, 0x5e, 0xdb, 0x5c, 0xc7, 0x67, 0x01, 0x20, 0xe8, 0x41, 0x29, + 0x4b, 0xc6, 0x8e, 0x1b, 0x69, 0x77, 0xbd, 0xac, 0x00, 0x61, 0xbc, 0xb3, 0x26, 0x39, 0x39, 0x2d, 0xfd, 0xc9, 0x78, + 0xdb, 0x6a, 0xa6, 0xdd, 0xf1, 0x43, 0x42, 0xdb, 0xe2, 0xd0, 0x82, 0x1f, 0xa9, 0xdd, 0xb9, 0x5a, 0xc4, 0xaa, 0xbd, + 0x2c, 0x60, 0xb0, 0x8d, 0xd6, 0xba, 0x6d, 0xee, 0xe6, 0x98, 0x08, 0x27, 0xcb, 0xc6, 0x74, 0x27, 0x96, 0x17, 0x89, + 0x35, 0x06, 0x6a, 0x6b, 0xde, 0xf8, 0xa5, 0xc0, 0xd4, 0x04, 0xdf, 0xa8, 0x5c, 0x2c, 0x8d, 0xfe, 0xf4, 0x03, 0x11, + 0xa1, 0x59, 0x6c, 0xae, 0xd6, 0x4d, 0x68, 0xbc, 0xc6, 0xf5, 0x06, 0xdc, 0x0d, 0x2c, 0x1a, 0x4e, 0xf4, 0x60, 0xce, + 0xee, 0x48, 0xcd, 0x8a, 0x65, 0xf8, 0xd1, 0xa3, 0xa3, 0x02, 0xbb, 0xb3, 0x39, 0x96, 0x14, 0x48, 0x30, 0xe2, 0xd7, + 0xd7, 0x58, 0x2c, 0x6a, 0x97, 0x46, 0x07, 0x63, 0x2e, 0xf9, 0x0f, 0xaa, 0x9b, 0x69, 0x5f, 0x01, 0x9b, 0x7b, 0x86, + 0x23, 0x49, 0x99, 0x19, 0xbd, 0xbc, 0x36, 0x0d, 0xec, 0x55, 0x1e, 0x75, 0x1c, 0x46, 0x4f, 0x4a, 0xc2, 0xde, 0x6c, + 0x4d, 0xa9, 0x5c, 0x8a, 0x51, 0xe8, 0x79, 0x83, 0x58, 0xf4, 0xb8, 0x07, 0x38, 0xc9, 0x98, 0x22, 0x7d, 0xb5, 0x51, + 0x90, 0xb7, 0xda, 0x5f, 0xba, 0xec, 0xa0, 0x49, 0x87, 0xce, 0x02, 0x9c, 0x8c, 0x92, 0x82, 0x10, 0xa0, 0x0d, 0xa1, + 0xd7, 0x06, 0x2f, 0xa5, 0x08, 0x4d, 0x4d, 0x66, 0xd4, 0x85, 0xf9, 0x9c, 0x71, 0x46, 0xa1, 0xa0, 0xa7, 0x5d, 0x9a, + 0x77, 0xab, 0xdb, 0x5c, 0x38, 0xde, 0x5d, 0x54, 0x2b, 0x02, 0x29, 0x5a, 0xf1, 0xd3, 0x43, 0xe1, 0x22, 0xb7, 0x20, + 0xa2, 0xd6, 0x1c, 0xde, 0x1a, 0x9c, 0x5c, 0x4c, 0x68, 0x95, 0xea, 0xae, 0xf7, 0xf0, 0x85, 0x88, 0xef, 0xda, 0x3c, + 0x21, 0x8e, 0x5a, 0x6f, 0xe8, 0xe6, 0x2c, 0xcd, 0x53, 0x09, 0xf5, 0xcc, 0x16, 0x02, 0x97, 0x8d, 0x8c, 0x2a, 0x7c, + 0x33, 0x3e, 0xc7, 0xc8, 0x92, 0x80, 0x32, 0x38, 0x9d, 0xc5, 0x08, 0x2c, 0x32, 0xe6, 0xe3, 0xd8, 0x1f, 0xcf, 0x6c, + 0x82, 0x7c, 0xd7, 0x98, 0x11, 0x89, 0xb7, 0xbd, 0x37, 0xd4, 0x28, 0x94, 0x8c, 0x44, 0x5c, 0x1e, 0x39, 0xb4, 0x7b, + 0x50, 0x7d, 0x37, 0x20, 0x36, 0x8c, 0x29, 0xd3, 0x09, 0xa1, 0x4f, 0x1e, 0xc4, 0x9a, 0x5c, 0x98, 0xb0, 0xd2, 0x49, + 0x0c, 0xc4, 0xe8, 0x6c, 0x40, 0xf5, 0x8d, 0xd0, 0x22, 0x91, 0x05, 0x25, 0x12, 0xf9, 0x6c, 0x4e, 0x88, 0xc3, 0x56, + 0x64, 0xfc, 0x60, 0xb5, 0x77, 0x11, 0x95, 0x3e, 0xe3, 0xa4, 0xb0, 0x2e, 0x0b, 0xa3, 0x3f, 0x46, 0x09, 0x61, 0xc0, + 0xd9, 0xed, 0x49, 0x51, 0xde, 0x0d, 0x8b, 0x47, 0x17, 0xa8, 0xca, 0xb7, 0x5c, 0x01, 0xec, 0xd1, 0x42, 0x0d, 0x54, + 0x59, 0xb2, 0x9c, 0xeb, 0x47, 0x21, 0xc2, 0x53, 0x66, 0x8e, 0xaa, 0x10, 0x06, 0x84, 0x88, 0x4a, 0xed, 0xc2, 0xae, + 0x95, 0x02, 0x74, 0x30, 0xa6, 0x8d, 0x46, 0x88, 0x0b, 0x78, 0x9e, 0xb7, 0x3f, 0x0e, 0x98, 0xe6, 0x89, 0x3f, 0xa8, + 0x06, 0xfd, 0x77, 0x24, 0x9b, 0xac, 0x9f, 0xdc, 0xf7, 0xc3, 0x27, 0x7d, 0x87, 0xce, 0xde, 0xef, 0xab, 0xbf, 0x7f, + 0xec, 0xd1, 0x40, 0x16, 0xf2, 0x0b, 0xdd, 0x84, 0x56, 0xcf, 0xde, 0x18, 0xee, 0x88, 0x56, 0xcf, 0x4e, 0x2f, 0x0a, + 0xd4, 0x3b, 0xd7, 0x4e, 0x6d, 0x1b, 0x36, 0x32, 0x89, 0xc7, 0x9a, 0x27, 0x63, 0xb0, 0x22, 0x83, 0x6a, 0x05, 0x2b, + 0x9b, 0x2c, 0xd1, 0x5d, 0x9f, 0x99, 0x83, 0x7b, 0xe2, 0x46, 0xbe, 0x93, 0x67, 0x1f, 0x80, 0x9b, 0x10, 0xf9, 0x4b, + 0x0e, 0xab, 0xfa, 0x1d, 0xd5, 0xa6, 0x3b, 0x28, 0x18, 0x4a, 0x2d, 0x31, 0x5b, 0x15, 0x8d, 0x25, 0xd8, 0x1b, 0x04, + 0x5a, 0x53, 0xab, 0x0f, 0xeb, 0x70, 0xc8, 0x1f, 0x5b, 0xfb, 0x07, 0x95, 0x89, 0xba, 0x68, 0x40, 0x9e, 0x86, 0x5f, + 0xba, 0x44, 0xb8, 0x6c, 0x53, 0xff, 0xaf, 0x6e, 0x2f, 0x76, 0x46, 0xc1, 0x24, 0xe4, 0x6d, 0xc8, 0xc3, 0xdd, 0xc1, + 0x00, 0x05, 0x4a, 0xe7, 0x1b, 0x6d, 0x78, 0x12, 0x3d, 0xc9, 0xc3, 0xf6, 0x79, 0x69, 0xaf, 0x46, 0x7d, 0xae, 0x63, + 0x9b, 0xda, 0xb6, 0x49, 0x4d, 0x49, 0x73, 0x70, 0x05, 0x96, 0x18, 0x17, 0x34, 0xad, 0xe4, 0x11, 0x4b, 0x2c, 0xc7, + 0xa4, 0xca, 0xad, 0xe4, 0x29, 0xa7, 0x8c, 0xff, 0x10, 0xb4, 0x97, 0x59, 0x1e, 0x0d, 0x97, 0xe5, 0xd1, 0x65, 0xb0, + 0x36, 0xa1, 0xba, 0xb7, 0xa1, 0xfa, 0x62, 0xd6, 0xb4, 0xd4, 0x6a, 0x93, 0x24, 0x91, 0xc6, 0x7b, 0xba, 0x58, 0xd7, + 0x03, 0xe8, 0xce, 0xd4, 0x2e, 0x65, 0x12, 0xc7, 0x38, 0xd9, 0x86, 0xb9, 0xfa, 0xd8, 0x2a, 0xad, 0xcf, 0x5f, 0xd0, + 0xf8, 0xdc, 0x7d, 0x2b, 0x8f, 0x18, 0xb5, 0x18, 0x78, 0x7f, 0x78, 0x2a, 0xc1, 0xc5, 0xa1, 0xb1, 0xb3, 0x3d, 0x4c, + 0x1c, 0x76, 0xec, 0xec, 0xd7, 0x14, 0x4c, 0xcf, 0x81, 0x36, 0xf4, 0xd5, 0xe0, 0xf8, 0xda, 0x3d, 0x77, 0xf0, 0x62, + 0x40, 0x4b, 0xa4, 0xbc, 0x53, 0xe4, 0x88, 0x01, 0x26, 0x5a, 0xf9, 0x9b, 0x5f, 0xe7, 0xf5, 0x87, 0xf8, 0x7a, 0x3c, + 0x10, 0x3b, 0x51, 0x1e, 0x3d, 0x2b, 0x14, 0xa5, 0x44, 0x45, 0x4f, 0xe1, 0x2f, 0x6e, 0xa1, 0x0c, 0xa7, 0x89, 0x4e, + 0x47, 0x45, 0xb7, 0x77, 0x4f, 0x7c, 0x67, 0xff, 0xa6, 0x3a, 0x97, 0xf3, 0x0a, 0x03, 0x5d, 0x08, 0x6c, 0xa0, 0x8c, + 0x8c, 0x05, 0x4a, 0xf1, 0x63, 0xcc, 0x2e, 0x43, 0x94, 0xdc, 0xea, 0x13, 0x3e, 0x70, 0x11, 0x98, 0x3b, 0xa4, 0x49, + 0xc2, 0xe8, 0x51, 0x7b, 0x6e, 0x5a, 0x9e, 0x84, 0x99, 0x9d, 0x27, 0x99, 0x9d, 0x53, 0xc5, 0x85, 0x09, 0x53, 0x35, + 0x28, 0x16, 0x8f, 0xe5, 0xa4, 0xb6, 0x5a, 0x4d, 0x33, 0x27, 0x9a, 0xe9, 0x91, 0x3b, 0x0c, 0x81, 0x6e, 0xd2, 0x0d, + 0x35, 0xfa, 0x4d, 0x54, 0xf1, 0xd1, 0x7a, 0x11, 0x0c, 0xd1, 0xfa, 0x74, 0xd6, 0x46, 0xb9, 0x63, 0x14, 0x25, 0xdf, + 0x17, 0x80, 0xb8, 0xb7, 0xae, 0x28, 0x5d, 0x7d, 0xf2, 0xc7, 0x3f, 0x4c, 0xb5, 0x9e, 0x07, 0x10, 0x23, 0xbe, 0x66, + 0x93, 0x33, 0xa3, 0xf2, 0x48, 0xfc, 0x43, 0x98, 0xb4, 0x80, 0x3b, 0x42, 0x58, 0xb5, 0x71, 0x30, 0x49, 0x4e, 0xe7, + 0x62, 0xa8, 0xef, 0xa2, 0x91, 0x24, 0x94, 0x49, 0x7d, 0x0a, 0x9e, 0x4d, 0x4e, 0xad, 0x8f, 0x0e, 0x09, 0x77, 0xeb, + 0x20, 0x14, 0x62, 0xa6, 0x5a, 0x03, 0xdc, 0x3d, 0xa5, 0xfb, 0x7a, 0xed, 0x8d, 0xd7, 0x2a, 0xe2, 0xfe, 0xfb, 0xc5, + 0xc1, 0xfb, 0xef, 0x78, 0xa9, 0xa9, 0xdf, 0x6f, 0x9c, 0x0d, 0xdb, 0xb7, 0x3c, 0x00, 0x2f, 0x06, 0x78, 0x08, 0x70, + 0x11, 0xf5, 0x56, 0xa7, 0xfd, 0x61, 0x74, 0xe3, 0xeb, 0xca, 0xec, 0x59, 0xd1, 0xf5, 0x3b, 0x3f, 0x78, 0xb7, 0x6f, + 0x21, 0x60, 0x17, 0xdd, 0xff, 0x1f, 0x81, 0x0a, 0x08, 0x86, 0x82, 0xbf, 0x3f, 0x6e, 0x87, 0xb3, 0x23, 0x78, 0x0e, + 0xbd, 0x3e, 0x8e, 0x62, 0xa5, 0x7b, 0x27, 0x4d, 0xb1, 0x57, 0x11, 0x54, 0x99, 0x57, 0xc4, 0xa6, 0x8c, 0xcd, 0x2e, + 0xeb, 0x52, 0xaf, 0xcd, 0x37, 0x18, 0xd0, 0x97, 0x00, 0xc8, 0x48, 0xf5, 0xa6, 0x0c, 0x20, 0xfc, 0xfa, 0x52, 0x2c, + 0x46, 0xf3, 0x7c, 0xa7, 0xb5, 0x6b, 0xf7, 0x29, 0xf4, 0xc3, 0x76, 0x1d, 0x1e, 0x0c, 0xed, 0x09, 0x79, 0x9e, 0x37, + 0xbc, 0xcb, 0xf0, 0x6d, 0x5e, 0x14, 0x9c, 0x06, 0x2f, 0xa3, 0x5a, 0x1a, 0xf2, 0x49, 0x34, 0x06, 0xfa, 0xb4, 0x6f, + 0x29, 0x01, 0xb7, 0x21, 0x31, 0xd8, 0x41, 0x56, 0x7a, 0x7d, 0x24, 0xed, 0x9d, 0xeb, 0x31, 0xbc, 0xd9, 0x6e, 0x71, + 0x91, 0x32, 0x22, 0xb1, 0x63, 0xa0, 0xc9, 0x8d, 0x50, 0xed, 0xed, 0xce, 0x9e, 0x0f, 0xdf, 0xdc, 0x5c, 0xde, 0xdc, + 0xae, 0x8f, 0x43, 0xaa, 0xb1, 0x4e, 0xa7, 0xd6, 0x6a, 0x6c, 0x27, 0x6d, 0x91, 0xef, 0x2d, 0x0b, 0x9b, 0x84, 0x16, + 0xe9, 0x06, 0x96, 0x96, 0x0f, 0x93, 0xaa, 0x55, 0x06, 0x38, 0x91, 0x9a, 0xba, 0x9f, 0x9e, 0x9e, 0x33, 0x25, 0xcb, + 0x03, 0x7a, 0x71, 0xd0, 0x55, 0x21, 0xb6, 0x4b, 0xd7, 0x6f, 0x2f, 0x97, 0x9e, 0xeb, 0x06, 0x60, 0x13, 0x39, 0x30, + 0x90, 0xf2, 0x7f, 0xc7, 0xa2, 0x5e, 0x0e, 0xcb, 0x93, 0x25, 0x82, 0xc2, 0x25, 0xde, 0x75, 0x49, 0x4a, 0xb4, 0x29, + 0x45, 0x68, 0x2e, 0x5e, 0x1f, 0x15, 0xe3, 0x49, 0xdd, 0x59, 0xf3, 0xec, 0x20, 0x12, 0x19, 0x5b, 0x19, 0x1b, 0xcc, + 0x4d, 0x5a, 0x86, 0x00, 0x07, 0x85, 0x64, 0xcb, 0xf5, 0xa6, 0x0b, 0xb0, 0x5d, 0xf2, 0x57, 0xa3, 0x71, 0x9e, 0x2c, + 0xd1, 0x1d, 0x1a, 0xf6, 0xe5, 0x40, 0xc1, 0xe4, 0xe6, 0xca, 0xe9, 0x91, 0x1f, 0xc5, 0x6c, 0xb1, 0x46, 0x86, 0xc1, + 0x82, 0xe9, 0x04, 0x1c, 0x08, 0xb9, 0x57, 0x0e, 0x10, 0x5b, 0x16, 0xf8, 0x30, 0x98, 0x5b, 0x22, 0x9b, 0x3c, 0xda, + 0xd9, 0x3d, 0x55, 0x28, 0xf8, 0xe4, 0xd6, 0x6d, 0x59, 0xf2, 0xca, 0x0f, 0x82, 0x5e, 0xc5, 0xe5, 0x69, 0xbb, 0x68, + 0x8e, 0xc9, 0xd1, 0x77, 0xd9, 0x94, 0xfd, 0x30, 0x8d, 0xc8, 0xc3, 0x43, 0x92, 0xe1, 0x30, 0x0b, 0x82, 0xc5, 0x4e, + 0x78, 0x29, 0x6c, 0x60, 0xac, 0x6d, 0xc2, 0x8e, 0xd4, 0x10, 0xde, 0x21, 0x26, 0xac, 0x99, 0xb3, 0x16, 0x2c, 0x10, + 0x71, 0x39, 0xe8, 0x3e, 0x72, 0xa0, 0x5f, 0xd9, 0x0a, 0x1d, 0xed, 0xe2, 0x6e, 0xf6, 0x23, 0x16, 0xc8, 0xd8, 0x92, + 0x39, 0xe9, 0x1a, 0x7e, 0xcb, 0x50, 0xad, 0xad, 0x67, 0xa3, 0xb3, 0x7b, 0xc3, 0x34, 0xd1, 0x96, 0x25, 0x3b, 0xa2, + 0x64, 0xfd, 0x42, 0x02, 0xb7, 0x50, 0xe5, 0x46, 0xee, 0xad, 0x44, 0x11, 0xc4, 0x14, 0xba, 0x78, 0xdd, 0x2d, 0x8c, + 0x88, 0x37, 0xd3, 0xa9, 0x39, 0x2a, 0x7c, 0x22, 0x63, 0x50, 0x52, 0x92, 0x82, 0xff, 0x67, 0xbd, 0x5f, 0x80, 0x82, + 0xf8, 0xc4, 0xaf, 0x7f, 0x17, 0x44, 0x38, 0xb0, 0xdb, 0x5e, 0xb6, 0xaa, 0x1d, 0x4b, 0x50, 0x1e, 0x15, 0xe6, 0xdc, + 0x40, 0x6a, 0xfd, 0x7b, 0x6e, 0xe3, 0xcd, 0x9f, 0xbf, 0xcb, 0x5c, 0xad, 0xdb, 0xe5, 0xe6, 0xb5, 0x3b, 0xe4, 0x9a, + 0xb1, 0x03, 0xf6, 0xe5, 0xe0, 0xc3, 0x6a, 0x26, 0xdd, 0x02, 0x92, 0x86, 0x4c, 0x2f, 0xdc, 0xae, 0xe8, 0x86, 0x13, + 0x72, 0x07, 0xe4, 0x10, 0x20, 0xd0, 0x66, 0x50, 0xd6, 0xe8, 0x58, 0xef, 0xc3, 0x79, 0x7b, 0x7d, 0xf9, 0xf7, 0xba, + 0x5e, 0xa2, 0x43, 0x9a, 0x9d, 0xc5, 0xa0, 0xff, 0x7e, 0x2b, 0x19, 0xc9, 0xf6, 0xcd, 0xf6, 0xfe, 0x5d, 0x0b, 0x8a, + 0x6b, 0x9a, 0xf6, 0x0f, 0x7e, 0xf9, 0xa2, 0xb7, 0xf0, 0x7a, 0xe7, 0x23, 0xa9, 0x49, 0x53, 0x6e, 0xf8, 0x71, 0xb5, + 0x95, 0xef, 0x4a, 0x66, 0x7c, 0x40, 0x60, 0xc4, 0xc9, 0xea, 0xe2, 0xe9, 0x61, 0xc4, 0x64, 0x3d, 0x6a, 0x18, 0x4e, + 0x6e, 0x6d, 0xc6, 0xb4, 0x6a, 0x21, 0x32, 0xc0, 0x25, 0x1a, 0x95, 0x28, 0x12, 0x25, 0x31, 0x40, 0x70, 0x6f, 0x7d, + 0x9e, 0xa0, 0x2d, 0x6a, 0xd6, 0x0e, 0xd4, 0x76, 0x56, 0x36, 0x27, 0x01, 0xa3, 0xcd, 0x1c, 0xd3, 0x6a, 0x2e, 0x42, + 0xe7, 0xee, 0x34, 0x88, 0x0e, 0xbd, 0x25, 0xba, 0x94, 0xb9, 0x62, 0xdf, 0xb4, 0xac, 0x2d, 0x03, 0xf2, 0x49, 0xd4, + 0x46, 0x1d, 0x24, 0x58, 0xe5, 0x54, 0x6c, 0x26, 0xf6, 0x8d, 0xa1, 0x2d, 0xdc, 0x81, 0xbe, 0x81, 0x1e, 0xac, 0xf1, + 0x92, 0xdd, 0xe4, 0xed, 0x53, 0xca, 0x0b, 0x8b, 0x49, 0xf7, 0x3b, 0xa9, 0x1e, 0xdb, 0x5b, 0x03, 0xa2, 0x50, 0x8c, + 0x77, 0x0f, 0x09, 0x56, 0x1e, 0xbd, 0x0d, 0x38, 0xb6, 0x4a, 0xaf, 0x71, 0x55, 0x3d, 0x31, 0x26, 0x78, 0x58, 0xca, + 0x27, 0xdf, 0x3f, 0x79, 0x35, 0xee, 0x1a, 0xc6, 0x4b, 0x8b, 0x5b, 0x10, 0x54, 0x30, 0x7b, 0x8b, 0x59, 0xfc, 0xd2, + 0xfc, 0xbe, 0x7b, 0xe0, 0xc6, 0xce, 0x21, 0x37, 0x6f, 0x70, 0xf7, 0x5a, 0xdc, 0xa7, 0xce, 0x67, 0xf5, 0xec, 0xd3, + 0xe9, 0x6a, 0x6b, 0x14, 0x7d, 0x3b, 0x03, 0xed, 0x11, 0xe9, 0xac, 0x01, 0x98, 0x04, 0x28, 0x4b, 0x32, 0xa0, 0x86, + 0x05, 0x5e, 0x2e, 0xad, 0xba, 0x13, 0xd4, 0x54, 0x7b, 0xb6, 0x29, 0x9f, 0x0b, 0x6b, 0x2c, 0xbe, 0x58, 0xba, 0x4e, + 0x53, 0xc3, 0x14, 0xb5, 0xae, 0x5d, 0xf3, 0xf7, 0x6f, 0x65, 0x09, 0x34, 0x4c, 0xe5, 0x8a, 0xfd, 0x1a, 0x55, 0x43, + 0xf0, 0x29, 0x2c, 0xa2, 0x84, 0x00, 0xcf, 0x62, 0x12, 0xa8, 0x5a, 0x3f, 0xb4, 0xbd, 0xdf, 0xbb, 0x63, 0xeb, 0x64, + 0x3a, 0xb8, 0x6b, 0x40, 0x96, 0x99, 0xf3, 0xce, 0x99, 0x96, 0xa1, 0x9b, 0xc6, 0x45, 0x48, 0xd9, 0x4f, 0x5f, 0xa0, + 0x4e, 0x96, 0xdb, 0xec, 0x51, 0xd0, 0x58, 0x0e, 0x91, 0x14, 0xb9, 0x20, 0xc5, 0xbf, 0x0b, 0x47, 0x3c, 0x46, 0x6a, + 0x9d, 0xa9, 0x65, 0x8c, 0xa6, 0xff, 0x16, 0xd6, 0x82, 0xa5, 0xdd, 0x7b, 0x96, 0xc1, 0x8f, 0x93, 0x01, 0xd5, 0x3a, + 0x77, 0x52, 0x26, 0x9b, 0x25, 0x8c, 0x0c, 0xed, 0x8e, 0x5a, 0xfd, 0xf4, 0x6b, 0xbd, 0x5d, 0x9a, 0xbd, 0x34, 0xcd, + 0x2f, 0xa2, 0x85, 0x81, 0x2c, 0x01, 0x17, 0x0b, 0x4a, 0x3b, 0x27, 0xd5, 0xbf, 0xf7, 0xcd, 0xf7, 0xc4, 0xf7, 0xc2, + 0x5f, 0x66, 0x3e, 0x8f, 0x7c, 0xca, 0x2b, 0x3f, 0x40, 0x9e, 0x4f, 0xee, 0xad, 0x16, 0x0c, 0x23, 0x98, 0x88, 0xac, + 0x5c, 0x81, 0x80, 0x45, 0x91, 0x3c, 0x50, 0x01, 0x89, 0x88, 0x2b, 0xdb, 0x21, 0xad, 0x66, 0xbd, 0x9b, 0x01, 0x85, + 0x01, 0xd7, 0xfe, 0x42, 0xe3, 0x9c, 0x2e, 0xf6, 0xd6, 0x51, 0x51, 0xe9, 0x58, 0x1a, 0xfd, 0x11, 0x98, 0x18, 0x51, + 0xc9, 0xe9, 0xa8, 0x38, 0xb3, 0x18, 0xed, 0x2b, 0x3a, 0x8b, 0x19, 0xc8, 0x58, 0xa9, 0x29, 0x5b, 0xf9, 0x0d, 0x30, + 0xbb, 0x3d, 0x97, 0x34, 0xf5, 0x18, 0x0e, 0xe4, 0x05, 0x44, 0x0d, 0xac, 0x68, 0x03, 0x9d, 0xda, 0x6f, 0x08, 0xcf, + 0x1b, 0x96, 0x47, 0x80, 0x20, 0x28, 0xdf, 0x41, 0xd8, 0x9f, 0xd8, 0xbe, 0x72, 0x35, 0xc3, 0x29, 0xc3, 0xf4, 0x19, + 0x87, 0x86, 0xfa, 0x14, 0xfc, 0x04, 0x6c, 0xa2, 0xab, 0x11, 0x20, 0xdf, 0x24, 0x84, 0x1e, 0x04, 0xfd, 0x2b, 0x8f, + 0x48, 0x7f, 0xdd, 0xd4, 0xea, 0x2b, 0x98, 0xe2, 0xa8, 0x4c, 0xd6, 0x6d, 0x6a, 0x5b, 0xbd, 0xb2, 0x65, 0x5c, 0xd7, + 0x80, 0x3a, 0x2d, 0x9d, 0xe3, 0x0c, 0x27, 0x0d, 0xf1, 0xbf, 0x06, 0x86, 0x3f, 0xa8, 0xdd, 0x0e, 0xa3, 0x0f, 0xfd, + 0xc6, 0x8c, 0x79, 0x87, 0x70, 0x78, 0x3c, 0x31, 0x8d, 0xdc, 0x9f, 0x0b, 0x4c, 0x87, 0x96, 0xf8, 0x23, 0x8d, 0x38, + 0xe9, 0x83, 0xd2, 0x8b, 0xd5, 0xa1, 0x32, 0xfe, 0xdb, 0xb8, 0x1f, 0xbe, 0x6d, 0xb3, 0x8a, 0xe1, 0xc9, 0x88, 0x02, + 0xb6, 0x1a, 0xb3, 0x8e, 0x4f, 0x8e, 0xd6, 0xe3, 0x98, 0xdb, 0x80, 0xa8, 0x71, 0xbd, 0xa9, 0xda, 0x2c, 0x52, 0xb1, + 0xe5, 0x96, 0x3d, 0x1f, 0xcc, 0xa8, 0x7c, 0xfc, 0xf3, 0x32, 0x15, 0x82, 0x00, 0x55, 0xe2, 0x43, 0x34, 0xd0, 0xc5, + 0x6e, 0x27, 0x68, 0xe1, 0xb7, 0x96, 0xd2, 0x4a, 0xe6, 0xc1, 0x6a, 0xee, 0x90, 0x80, 0x8e, 0xaa, 0x01, 0xc3, 0xa7, + 0x68, 0xb2, 0xab, 0xc9, 0x31, 0x42, 0x01, 0x4d, 0xce, 0x92, 0x86, 0x93, 0x61, 0xbf, 0x2d, 0x4e, 0x7f, 0x9d, 0xf3, + 0x51, 0xb3, 0x21, 0x52, 0xdf, 0x8e, 0x89, 0x98, 0x7e, 0xc7, 0x57, 0x59, 0x19, 0x1b, 0xa1, 0x78, 0x33, 0x88, 0x8d, + 0x21, 0xc9, 0x1b, 0x05, 0x25, 0x42, 0x24, 0xbb, 0x38, 0x11, 0x66, 0xf3, 0x7e, 0xa5, 0xf0, 0xf4, 0x15, 0xa1, 0xd4, + 0x1c, 0x23, 0x8d, 0x0e, 0xb6, 0x74, 0xc2, 0xda, 0xb4, 0x7d, 0x5c, 0x7d, 0x81, 0x41, 0x87, 0xcf, 0x1c, 0xf0, 0x02, + 0xe0, 0xc6, 0xb0, 0x0a, 0x60, 0xad, 0x31, 0x77, 0x0c, 0xb7, 0x65, 0x7c, 0x62, 0x2d, 0x73, 0x40, 0xff, 0x98, 0xc8, + 0x72, 0x43, 0x7b, 0x0e, 0x41, 0xc1, 0xb4, 0x1d, 0x58, 0xa2, 0xf2, 0xef, 0xb4, 0x29, 0x76, 0x55, 0x31, 0x31, 0x0f, + 0x84, 0xcb, 0x12, 0x09, 0x95, 0xaf, 0x7b, 0xd7, 0x63, 0x06, 0xf8, 0x88, 0xa8, 0x19, 0x54, 0xbc, 0xce, 0x4d, 0x7e, + 0x55, 0x3f, 0xbf, 0x04, 0xec, 0x75, 0xf6, 0xba, 0xfe, 0xf0, 0xba, 0x7a, 0xfa, 0x93, 0x52, 0x00, 0xf4, 0x5c, 0xd8, + 0x95, 0x61, 0x26, 0x0b, 0x9b, 0xc8, 0xf0, 0x73, 0xbd, 0x84, 0xf2, 0xb4, 0x99, 0x03, 0x42, 0x38, 0xc7, 0xf9, 0xe4, + 0xfa, 0x74, 0x95, 0xb9, 0x09, 0xa4, 0x08, 0xb8, 0x09, 0x20, 0xf3, 0xfe, 0x08, 0x67, 0xce, 0x07, 0x04, 0xe2, 0x5d, + 0x5c, 0x9b, 0x1c, 0x3d, 0x0e, 0x92, 0x98, 0xdd, 0x4f, 0x3d, 0x2a, 0x88, 0xcb, 0x68, 0x01, 0x0d, 0x5b, 0x53, 0x76, + 0x2d, 0x58, 0xee, 0x08, 0x1d, 0x36, 0x84, 0x99, 0x42, 0x57, 0x89, 0xfc, 0x87, 0x47, 0x4b, 0xaa, 0xe8, 0xb1, 0x3b, + 0x7a, 0xb6, 0x22, 0xca, 0x70, 0x52, 0x47, 0x42, 0x82, 0xf0, 0x85, 0xa8, 0x81, 0x7e, 0xc0, 0xc6, 0xa8, 0x52, 0xe2, + 0x12, 0xdb, 0x12, 0xe8, 0x3b, 0x09, 0xc2, 0xb2, 0x53, 0x1a, 0x86, 0xe6, 0x90, 0xc3, 0x48, 0x14, 0x41, 0x29, 0xfc, + 0x02, 0x25, 0xcf, 0x34, 0x94, 0x80, 0x32, 0x75, 0x60, 0x47, 0x0d, 0x55, 0x89, 0x09, 0x75, 0x7a, 0x7a, 0x10, 0xdd, + 0xbb, 0x0c, 0x34, 0x4d, 0x07, 0xa7, 0x1d, 0x2a, 0xc6, 0xd2, 0x98, 0xea, 0x60, 0x3b, 0x2a, 0x04, 0x47, 0x3a, 0x1e, + 0x32, 0x0a, 0x4e, 0x6e, 0xdf, 0xe1, 0xb2, 0xe1, 0xd3, 0xed, 0xa7, 0x4a, 0x8c, 0x8e, 0x9e, 0xac, 0xce, 0xa5, 0xd5, + 0xf3, 0x6c, 0xcc, 0x24, 0x48, 0x9f, 0xc0, 0xa1, 0x52, 0xf8, 0x32, 0x03, 0xd3, 0x22, 0x8f, 0xb7, 0x65, 0xb4, 0x38, + 0x85, 0x92, 0xab, 0x6e, 0x1f, 0xe9, 0x36, 0xdf, 0xce, 0xa4, 0xdb, 0x6f, 0xa7, 0xc1, 0x51, 0xd6, 0xcc, 0xfa, 0x42, + 0xf9, 0xbc, 0x52, 0xaa, 0xed, 0x5b, 0xf9, 0x49, 0xa2, 0x83, 0x63, 0x0d, 0xd5, 0x2a, 0x2c, 0xf1, 0x93, 0x81, 0xd5, + 0x6b, 0x48, 0xb5, 0x91, 0x8a, 0x61, 0x07, 0x9e, 0x8f, 0x3c, 0x9e, 0xbb, 0xae, 0x34, 0xe3, 0xca, 0x30, 0xb3, 0x49, + 0x25, 0xc6, 0xf7, 0xc3, 0x63, 0x0f, 0xed, 0x99, 0xf6, 0xf9, 0x74, 0xf8, 0x12, 0xe8, 0x74, 0x20, 0x9a, 0x80, 0x81, + 0x39, 0x84, 0x32, 0x16, 0x68, 0x6c, 0x2c, 0x66, 0x51, 0x1e, 0x95, 0x29, 0x4d, 0x95, 0xc6, 0x30, 0x86, 0xda, 0x00, + 0xae, 0x6e, 0xd7, 0x4c, 0x4a, 0x46, 0x49, 0x77, 0x29, 0x0d, 0x14, 0xd3, 0x31, 0x8c, 0x15, 0x9e, 0x29, 0x19, 0x2e, + 0x0a, 0x71, 0x1a, 0xe0, 0xcb, 0x8b, 0xff, 0xf7, 0xaf, 0xc0, 0xa8, 0xb9, 0xed, 0x91, 0xac, 0xd9, 0xec, 0x68, 0x4b, + 0x2b, 0x3c, 0x4f, 0xe7, 0xcb, 0x17, 0x29, 0xeb, 0x52, 0x2d, 0x8a, 0xd3, 0xe8, 0x28, 0x23, 0x4a, 0xfb, 0x76, 0xf7, + 0x97, 0xba, 0x33, 0x8c, 0x98, 0x2b, 0xdf, 0xf8, 0x3d, 0xe5, 0x5a, 0xf2, 0x6e, 0xb7, 0x8c, 0xac, 0x4a, 0x31, 0xe1, + 0x43, 0xe5, 0x1a, 0x5e, 0x69, 0xfd, 0x07, 0xf9, 0x4f, 0xb9, 0xaa, 0x6d, 0x7f, 0x0c, 0xeb, 0x95, 0x6c, 0x4e, 0xb4, + 0xde, 0x3c, 0xe3, 0x88, 0xb7, 0x3d, 0xc6, 0xfd, 0x25, 0x85, 0x63, 0x69, 0xfc, 0xae, 0xea, 0x64, 0x37, 0x3f, 0xb9, + 0x5c, 0x90, 0xb4, 0x98, 0x74, 0xeb, 0xad, 0xca, 0x7e, 0xe6, 0xab, 0xf7, 0xfb, 0xb3, 0x87, 0x3b, 0x26, 0x41, 0xc2, + 0x6d, 0x43, 0x3e, 0x0d, 0x22, 0xbd, 0x6d, 0x46, 0x47, 0x69, 0xf2, 0xca, 0x99, 0x4d, 0x08, 0x84, 0xe3, 0x8d, 0xe9, + 0x01, 0x26, 0x3b, 0x93, 0xd2, 0xcb, 0xfe, 0x67, 0x76, 0xe5, 0xda, 0xd4, 0xc5, 0x5d, 0xb1, 0xc5, 0x83, 0xe4, 0xd7, + 0x43, 0x7c, 0x38, 0x86, 0x37, 0x9f, 0xe3, 0x77, 0xc8, 0x3f, 0xea, 0xb8, 0x0c, 0x0c, 0x4c, 0xac, 0x1c, 0xfb, 0x4e, + 0x78, 0xd9, 0xdf, 0x12, 0x6b, 0x50, 0x56, 0x69, 0x8a, 0x21, 0x18, 0xc4, 0x79, 0x1d, 0x00, 0xc8, 0x95, 0x0d, 0x62, + 0x9b, 0x27, 0xb2, 0xe5, 0xab, 0x60, 0xf1, 0xce, 0xf1, 0xd1, 0x0b, 0x6e, 0x4a, 0x7c, 0xaa, 0xbc, 0x3d, 0x63, 0x0c, + 0x70, 0x0b, 0xca, 0xd3, 0xb1, 0x83, 0x19, 0x31, 0x47, 0x42, 0xed, 0x8a, 0x4a, 0x2c, 0x49, 0x1d, 0x2a, 0x14, 0xcd, + 0xea, 0x82, 0x91, 0x89, 0xe4, 0xb3, 0x35, 0x55, 0x82, 0x81, 0xd4, 0x41, 0x7b, 0xf6, 0x2c, 0x4a, 0x9a, 0x7d, 0x1e, + 0x9a, 0x6c, 0x92, 0x3b, 0x7e, 0x09, 0xa6, 0x3f, 0xf8, 0x59, 0x28, 0xe9, 0x73, 0x6f, 0x62, 0x21, 0x7f, 0xb7, 0x95, + 0xf5, 0x27, 0xec, 0x1d, 0xfe, 0x26, 0x21, 0x7c, 0x39, 0x85, 0xd5, 0x24, 0x61, 0x59, 0xb8, 0xf0, 0x76, 0x49, 0x80, + 0x3c, 0x65, 0x69, 0x57, 0x83, 0x03, 0x85, 0x3e, 0x14, 0x94, 0x2c, 0x96, 0xb1, 0x12, 0x33, 0xc3, 0x22, 0xa6, 0xe4, + 0x5e, 0xf4, 0x35, 0xf3, 0xbe, 0xf9, 0x3a, 0x85, 0x47, 0x06, 0x4f, 0xe5, 0xa6, 0x6d, 0x5b, 0x88, 0x0e, 0x18, 0x9a, + 0xe9, 0x4f, 0x70, 0x40, 0xbb, 0x7f, 0xdd, 0xa5, 0xa7, 0x1c, 0xf8, 0xec, 0x39, 0x0e, 0xd6, 0x56, 0x9e, 0xa5, 0x9c, + 0x35, 0x54, 0xf7, 0x39, 0x05, 0x3f, 0x17, 0xef, 0x10, 0x57, 0x26, 0xc1, 0xd3, 0x5d, 0x4c, 0x12, 0x54, 0x9f, 0x82, + 0x21, 0xe9, 0x04, 0x74, 0xb1, 0xc2, 0xea, 0x5a, 0xb3, 0xe5, 0x09, 0xba, 0x98, 0x60, 0x05, 0x63, 0x38, 0x14, 0xf4, + 0xf2, 0x30, 0xb3, 0x1e, 0x56, 0xd3, 0xd3, 0x22, 0x48, 0x22, 0x9d, 0xec, 0xf6, 0x53, 0x92, 0xbd, 0x26, 0x12, 0x40, + 0x3f, 0x37, 0x2b, 0x69, 0x03, 0xe0, 0x41, 0xad, 0x10, 0xb1, 0xef, 0x45, 0xcc, 0x49, 0x2a, 0x55, 0x73, 0x46, 0xb7, + 0x15, 0x02, 0x62, 0x5d, 0xf8, 0x5b, 0x5e, 0xdd, 0x94, 0xfa, 0x53, 0xb0, 0x80, 0xbe, 0xe1, 0x42, 0x02, 0xaf, 0x8d, + 0x8d, 0xf7, 0x8a, 0xc6, 0x1a, 0x5f, 0x02, 0x58, 0x1c, 0x0c, 0xf0, 0xa4, 0xc6, 0x32, 0x2c, 0x01, 0x69, 0x15, 0x0f, + 0x9d, 0x98, 0xb0, 0xf2, 0xb4, 0xe0, 0x98, 0xe5, 0xbb, 0x7f, 0x98, 0xdf, 0xe9, 0xb4, 0x4e, 0x20, 0x31, 0xd3, 0xa9, + 0x76, 0x4b, 0x2f, 0x1f, 0x58, 0xbf, 0xd6, 0x98, 0x25, 0xe2, 0x9e, 0xe4, 0x65, 0xb7, 0x63, 0x15, 0xda, 0x58, 0xc4, + 0x32, 0x9e, 0x29, 0x87, 0x57, 0x53, 0x6f, 0xf3, 0xf0, 0x00, 0x0e, 0xcf, 0xa7, 0x96, 0xfb, 0xeb, 0x00, 0x13, 0x87, + 0x9b, 0x52, 0x28, 0x15, 0xf1, 0x7a, 0x10, 0x20, 0x12, 0xc4, 0x44, 0xbb, 0xc8, 0x50, 0x7a, 0xca, 0x0d, 0x62, 0xb3, + 0x01, 0x25, 0x62, 0x87, 0xb6, 0x8e, 0xd2, 0x1f, 0xc2, 0x57, 0x47, 0xf9, 0x54, 0x99, 0xea, 0xa4, 0xb7, 0x30, 0xcb, + 0xe5, 0x48, 0x35, 0x34, 0x60, 0xd9, 0x71, 0xfb, 0xc9, 0x63, 0x5b, 0x61, 0x78, 0x6e, 0xab, 0xfe, 0x6e, 0x1b, 0xfe, + 0xfe, 0x02, 0x5e, 0x3c, 0xfd, 0xbe, 0xee, 0x6b, 0x6e, 0xd9, 0x90, 0x43, 0x5d, 0xda, 0x8d, 0x88, 0xb8, 0x17, 0x2f, + 0xaf, 0x52, 0x48, 0x01, 0xd2, 0xfc, 0x01, 0x3c, 0x3b, 0xbe, 0x3d, 0xd2, 0x7d, 0x2a, 0x32, 0x41, 0x24, 0xe4, 0xed, + 0x82, 0xb0, 0xe2, 0xb1, 0xa7, 0xb0, 0x69, 0x64, 0x41, 0x9f, 0x4a, 0xe8, 0x12, 0x7e, 0x8a, 0x7c, 0x79, 0x39, 0x17, + 0xfc, 0x18, 0xd2, 0x09, 0x68, 0xb0, 0x3b, 0xeb, 0x45, 0x50, 0x06, 0x39, 0xed, 0x2d, 0xa5, 0x79, 0x27, 0x97, 0x8d, + 0x02, 0xd3, 0x96, 0x85, 0xf6, 0x4b, 0xa3, 0x6e, 0xba, 0x78, 0x6a, 0xa2, 0x10, 0xf0, 0xf0, 0xb0, 0xd9, 0xed, 0xa4, + 0xa1, 0x9c, 0x55, 0x73, 0xef, 0xab, 0x55, 0xe3, 0x8a, 0xe4, 0xe3, 0x61, 0x86, 0x20, 0xa4, 0xdd, 0x8e, 0x9c, 0x1a, + 0xc3, 0x51, 0xd1, 0xbe, 0x48, 0xd6, 0x79, 0xe2, 0x70, 0xdc, 0xcb, 0x27, 0x71, 0xb2, 0x71, 0xac, 0x8b, 0x93, 0x48, + 0x05, 0xbe, 0x58, 0x7d, 0xd5, 0x10, 0x6d, 0xa6, 0xc5, 0xe9, 0x5d, 0x55, 0xa5, 0x6a, 0x0a, 0xb4, 0x93, 0x22, 0x47, + 0x76, 0x33, 0xbb, 0x2b, 0xb6, 0xa1, 0xd0, 0x0c, 0x38, 0x7f, 0xd6, 0x5e, 0xac, 0x47, 0x78, 0xa8, 0xbc, 0xf8, 0x47, + 0xd1, 0x3f, 0x56, 0x3d, 0x91, 0x65, 0x2b, 0xfc, 0xd5, 0x78, 0xbd, 0xb4, 0xf8, 0x37, 0x0f, 0xdc, 0x67, 0xd7, 0xd9, + 0x91, 0xb7, 0xde, 0x9c, 0x8f, 0x57, 0x15, 0x4f, 0x17, 0x89, 0x6f, 0x18, 0x06, 0x70, 0x39, 0xa4, 0x79, 0xb9, 0xdb, + 0x7b, 0x0c, 0x9f, 0x86, 0x80, 0x90, 0x6c, 0xe7, 0xdc, 0x3e, 0x9f, 0x3f, 0x1c, 0x69, 0x33, 0x9c, 0xc9, 0x4b, 0x21, + 0xd9, 0x57, 0x08, 0x00, 0x64, 0xd5, 0x66, 0xa4, 0x63, 0x5d, 0x4d, 0x02, 0x69, 0x32, 0x49, 0xdd, 0x6e, 0x03, 0x5c, + 0x80, 0x54, 0x94, 0x2f, 0xd7, 0x83, 0x15, 0x35, 0xf5, 0xc2, 0x14, 0x5f, 0xee, 0xe5, 0x0b, 0x34, 0xad, 0x69, 0xda, + 0xcb, 0xb9, 0x0c, 0x05, 0xd6, 0xcb, 0x0e, 0x11, 0x1e, 0x64, 0x2b, 0xc6, 0xe3, 0x71, 0xe4, 0xbb, 0xc9, 0x07, 0x94, + 0x1b, 0x2c, 0x2e, 0xf7, 0xea, 0xcb, 0xa9, 0xdd, 0x14, 0xb6, 0x42, 0x9f, 0x61, 0x15, 0x05, 0x73, 0xc0, 0x9b, 0x6b, + 0x7a, 0x3b, 0x9b, 0x0b, 0xb2, 0xd9, 0xc5, 0x67, 0x0b, 0xdb, 0x20, 0x81, 0x78, 0x1c, 0x06, 0x6b, 0x72, 0x88, 0x94, + 0x78, 0x74, 0x4a, 0x53, 0x42, 0x01, 0xc8, 0x00, 0x5e, 0x4c, 0xe2, 0x2d, 0x24, 0xfd, 0xf7, 0xe0, 0x13, 0xec, 0xad, + 0x71, 0xc5, 0xc8, 0x79, 0xfe, 0xe1, 0x74, 0xc0, 0xe9, 0xcf, 0xed, 0x9d, 0xcf, 0x3d, 0x23, 0xa0, 0x46, 0xa9, 0x0f, + 0xe5, 0xc1, 0x7f, 0xd2, 0x15, 0x9d, 0xd6, 0x62, 0xbe, 0x13, 0xb1, 0x4a, 0x85, 0x2d, 0xf7, 0x32, 0xd8, 0xdf, 0xef, + 0x87, 0xe9, 0xff, 0xab, 0x6b, 0x43, 0x55, 0x7e, 0xfe, 0xb7, 0x35, 0xfc, 0x27, 0xbd, 0x0e, 0x4b, 0xcd, 0xfd, 0x6f, + 0x0d, 0x36, 0xfd, 0xf6, 0x1a, 0xea, 0xa1, 0x6d, 0xff, 0xd6, 0x03, 0x88, 0x3a, 0x28, 0x72, 0xb3, 0x27, 0xb2, 0xd2, + 0xaa, 0x73, 0x0f, 0x06, 0xda, 0xc2, 0xff, 0x9f, 0xe5, 0x3d, 0xcb, 0x9e, 0xad, 0x30, 0xb5, 0xf0, 0xf1, 0xfd, 0x8c, + 0x49, 0x00, 0xcb, 0x49, 0x84, 0x36, 0x0e, 0x39, 0xad, 0xfc, 0xb4, 0x46, 0xae, 0x43, 0x5a, 0xb1, 0x56, 0x01, 0xfd, + 0xb2, 0xa4, 0x4f, 0x10, 0xcf, 0x3d, 0x8c, 0xbd, 0x86, 0x92, 0xe0, 0x81, 0x7a, 0xbe, 0x75, 0x94, 0x1f, 0x49, 0xd3, + 0x62, 0x57, 0x4a, 0x7e, 0xe9, 0x9f, 0x3f, 0x66, 0xd9, 0x57, 0x96, 0x1f, 0x88, 0xa1, 0x26, 0xb7, 0xff, 0xc1, 0x42, + 0xda, 0x17, 0x24, 0x31, 0x16, 0xa6, 0x6e, 0x5d, 0x38, 0x9e, 0x38, 0xbd, 0x63, 0x5b, 0xb5, 0x19, 0x84, 0x17, 0x55, + 0x2d, 0x14, 0x67, 0xd7, 0x82, 0x32, 0xa6, 0xf7, 0xe9, 0x4c, 0x13, 0x0c, 0xa8, 0xa5, 0xe4, 0x9d, 0xdf, 0xf0, 0xef, + 0x6c, 0x85, 0x79, 0x57, 0x63, 0xee, 0xde, 0xc0, 0x3e, 0x1a, 0x39, 0x8c, 0xe3, 0x3e, 0x42, 0xa1, 0x6e, 0x70, 0x83, + 0x2f, 0x35, 0x12, 0xdd, 0xb3, 0x65, 0x1a, 0x46, 0x54, 0xf6, 0xbc, 0x05, 0x47, 0xe2, 0x9c, 0x71, 0x09, 0x32, 0xf4, + 0x08, 0x0d, 0xcb, 0x69, 0x78, 0x8b, 0x29, 0x6c, 0x2f, 0xef, 0x18, 0x77, 0x96, 0xad, 0xed, 0x55, 0x9a, 0x21, 0x90, + 0xce, 0x8b, 0xe0, 0xad, 0xe2, 0x49, 0xb8, 0x31, 0x6d, 0xcf, 0xd4, 0x83, 0x5d, 0x7b, 0x49, 0x2f, 0x6a, 0xf3, 0x37, + 0xb2, 0xdb, 0x7b, 0xe9, 0x98, 0x29, 0xcd, 0xeb, 0x9a, 0x2d, 0x5e, 0xbc, 0x20, 0x13, 0x7e, 0x1c, 0x5c, 0x1b, 0xb3, + 0x6e, 0xb7, 0x12, 0x80, 0xcc, 0x89, 0xc6, 0xd5, 0x5c, 0xec, 0x7f, 0xda, 0x1f, 0xa4, 0xf5, 0x60, 0xde, 0x3d, 0xb8, + 0x92, 0x11, 0x9b, 0xbf, 0x33, 0x37, 0x92, 0x7d, 0x93, 0x49, 0x0e, 0xb5, 0xa8, 0xaa, 0xe2, 0xc1, 0xbb, 0x17, 0xc9, + 0xdd, 0xd5, 0xa5, 0x25, 0xa3, 0xde, 0x20, 0x9f, 0xef, 0xd0, 0xcd, 0x3e, 0xac, 0xdb, 0x5a, 0xe3, 0xd4, 0xe2, 0x24, + 0x36, 0x4d, 0xac, 0xc2, 0xac, 0xa6, 0x13, 0xc1, 0xf6, 0xbf, 0xd6, 0xe0, 0x9a, 0x89, 0x3a, 0x14, 0xd6, 0x56, 0x28, + 0x94, 0x82, 0x1f, 0x25, 0x20, 0x61, 0xc6, 0x98, 0x13, 0x70, 0x82, 0x64, 0x4c, 0x27, 0x53, 0xa2, 0x69, 0x28, 0x37, + 0x3f, 0x88, 0x19, 0xbe, 0xcd, 0x28, 0x46, 0x40, 0x72, 0x3f, 0x32, 0x72, 0xc3, 0xc9, 0x92, 0x50, 0x23, 0xee, 0xf6, + 0xc9, 0x2f, 0x70, 0xcc, 0x78, 0x8e, 0xa5, 0xd4, 0xf8, 0x69, 0x7d, 0x7e, 0xcc, 0x7a, 0x3f, 0x5d, 0xff, 0xb0, 0xba, + 0xe7, 0xce, 0x3f, 0x28, 0xe9, 0xd4, 0x5c, 0x43, 0x66, 0x55, 0x00, 0xc8, 0x9b, 0xf2, 0xce, 0xb8, 0x8e, 0xd3, 0x7b, + 0xab, 0x44, 0x04, 0x2e, 0x55, 0xb4, 0xaa, 0x31, 0x82, 0xf9, 0x5e, 0x88, 0x18, 0x27, 0x2b, 0x07, 0xbe, 0xf7, 0x2b, + 0x54, 0x24, 0xe7, 0xe1, 0x73, 0xf6, 0x46, 0x9a, 0x3e, 0x16, 0x4d, 0x26, 0xcf, 0x1d, 0xf1, 0x55, 0x7c, 0x7e, 0x37, + 0x4b, 0x17, 0x9b, 0x6c, 0x0e, 0x52, 0xc1, 0x92, 0x86, 0xba, 0x80, 0xda, 0xd6, 0x62, 0x28, 0xd1, 0x8e, 0xd4, 0xea, + 0x84, 0x2f, 0xa5, 0x80, 0xa5, 0x32, 0x22, 0x67, 0xa8, 0xad, 0xc1, 0xa9, 0xa3, 0x34, 0x71, 0xdd, 0xab, 0x0a, 0xbe, + 0x28, 0xf3, 0xc8, 0x9d, 0x31, 0xfc, 0xd2, 0xc7, 0xeb, 0x90, 0x8c, 0x91, 0x69, 0x36, 0x70, 0x7e, 0x9a, 0x15, 0xeb, + 0x1d, 0x7c, 0x21, 0x74, 0xea, 0xd4, 0x4c, 0xbe, 0x40, 0xdd, 0x0a, 0x4a, 0x32, 0x1c, 0x7c, 0xad, 0x8a, 0x5b, 0xb4, + 0x12, 0xf7, 0x1f, 0x90, 0xf5, 0x49, 0x2b, 0x69, 0xd1, 0x9e, 0x56, 0x56, 0x04, 0xa5, 0x65, 0x52, 0xb5, 0x29, 0x4c, + 0xbf, 0x14, 0x1d, 0xd5, 0xd3, 0xba, 0x7b, 0x3f, 0xe4, 0x76, 0xc9, 0x25, 0xdb, 0x7d, 0x8b, 0x34, 0x34, 0xba, 0xda, + 0x15, 0x80, 0xb4, 0xeb, 0x4d, 0x5f, 0x85, 0xcc, 0x53, 0xd2, 0x94, 0x92, 0x1e, 0x1c, 0xb2, 0x23, 0x34, 0xbf, 0xef, + 0xc6, 0x56, 0x1d, 0xe9, 0x4e, 0x05, 0xfb, 0xce, 0x2f, 0x73, 0xbb, 0x19, 0x9c, 0xc4, 0xe7, 0x36, 0x7e, 0xed, 0x11, + 0x40, 0xb6, 0xa8, 0x84, 0xaf, 0x4d, 0x39, 0x68, 0x97, 0x5f, 0xe2, 0x99, 0x9a, 0x1d, 0x0a, 0xef, 0xf3, 0xd6, 0x69, + 0xba, 0x75, 0x6c, 0x94, 0x4a, 0x1e, 0x7e, 0xa3, 0x42, 0xb6, 0x62, 0x77, 0x56, 0xb8, 0x00, 0x73, 0xfe, 0xaa, 0x20, + 0xea, 0x4a, 0x56, 0xdb, 0x45, 0x8d, 0xc1, 0x06, 0xda, 0x38, 0xd4, 0x2b, 0x44, 0xcc, 0x3b, 0x46, 0x39, 0x42, 0x87, + 0xa4, 0x43, 0x49, 0x27, 0xd3, 0x40, 0x4e, 0xac, 0x3a, 0x24, 0xd8, 0x9f, 0x8e, 0x94, 0x03, 0xf8, 0x9f, 0x4c, 0x91, + 0xe5, 0x9f, 0xea, 0x55, 0xce, 0xd4, 0x29, 0xfe, 0x5c, 0xb2, 0x6b, 0x76, 0x94, 0x5a, 0x4d, 0x35, 0xee, 0x17, 0x4d, + 0x01, 0xa3, 0x52, 0x5e, 0xcb, 0x8e, 0xdc, 0xcc, 0x91, 0x14, 0xff, 0x60, 0xb2, 0xf4, 0xa4, 0x7f, 0x7c, 0xc8, 0xa5, + 0xaf, 0x9c, 0x7b, 0xf5, 0xce, 0x22, 0xa7, 0x2a, 0xdd, 0xfd, 0x34, 0x77, 0x9e, 0xfe, 0xfe, 0x92, 0x9d, 0x1f, 0xfd, + 0xc5, 0x43, 0x74, 0x86, 0xbf, 0x60, 0x43, 0xec, 0xc1, 0xda, 0x65, 0xe1, 0xc9, 0xeb, 0xf3, 0x43, 0xa3, 0x4f, 0x19, + 0x58, 0xf2, 0xee, 0x82, 0x96, 0x40, 0x99, 0xd7, 0x94, 0xa5, 0x5a, 0xdf, 0x17, 0xd3, 0xa7, 0x2b, 0x76, 0xbe, 0x98, + 0x55, 0x5b, 0x6d, 0xdf, 0x97, 0xd5, 0x6d, 0x75, 0xff, 0x72, 0xf6, 0xe1, 0xaf, 0xdb, 0x7b, 0x3e, 0x31, 0x01, 0x08, + 0xec, 0xf4, 0x50, 0xf5, 0x8b, 0x9f, 0xab, 0xb2, 0x98, 0xaa, 0xba, 0x38, 0xab, 0xc6, 0xc5, 0x79, 0x35, 0x3d, 0xfc, + 0x74, 0xc4, 0x0f, 0x3c, 0x12, 0x86, 0xd5, 0x89, 0x06, 0x59, 0x5b, 0xfc, 0xd2, 0xd4, 0x32, 0xcb, 0x27, 0x8a, 0xdd, + 0x4a, 0xad, 0x3f, 0xed, 0xd2, 0xf8, 0xd3, 0x64, 0x79, 0x23, 0x05, 0xbd, 0x52, 0xd1, 0x2e, 0x27, 0xb6, 0xd3, 0x4c, + 0x2c, 0x48, 0x2c, 0x65, 0xa7, 0xbd, 0xb5, 0x0e, 0x39, 0x83, 0x41, 0x6f, 0xbf, 0xe4, 0x1a, 0xcf, 0x22, 0x8c, 0x99, + 0xbc, 0xa1, 0xb7, 0x4c, 0x05, 0x5f, 0xa1, 0x1a, 0x33, 0xeb, 0x3b, 0x51, 0x47, 0x12, 0x0b, 0x82, 0x18, 0xba, 0xd4, + 0x49, 0xed, 0xed, 0xd2, 0xd5, 0xad, 0xab, 0xbe, 0x04, 0x70, 0x2d, 0xd6, 0x94, 0x9e, 0xfa, 0xa2, 0x46, 0x31, 0x3a, + 0x2a, 0x4b, 0x66, 0xaa, 0x84, 0x8a, 0x1e, 0x62, 0x7d, 0xcb, 0xbc, 0xce, 0xca, 0x73, 0x33, 0x4c, 0xd3, 0x2d, 0xcd, + 0x00, 0x5f, 0xd1, 0x85, 0xac, 0xcc, 0x05, 0x6f, 0x29, 0x99, 0xd6, 0x23, 0xe3, 0x54, 0xd3, 0xba, 0x7a, 0x44, 0xf6, + 0xf2, 0x97, 0xb7, 0x40, 0x64, 0x1f, 0xfa, 0xa2, 0xf6, 0x59, 0x94, 0xad, 0x30, 0x89, 0x41, 0xa6, 0x21, 0xe4, 0x28, + 0x0d, 0xd1, 0x88, 0xb3, 0x78, 0xb4, 0xab, 0x20, 0xb1, 0xf1, 0x59, 0x7e, 0xcd, 0x8c, 0xbd, 0x0e, 0x20, 0x16, 0xa8, + 0xb8, 0x2c, 0xbd, 0xe0, 0xff, 0x41, 0x0d, 0xe5, 0xbe, 0xe9, 0x7f, 0xa0, 0x98, 0x14, 0xca, 0xcd, 0xd0, 0x8f, 0x4b, + 0xae, 0x60, 0x13, 0x62, 0xd0, 0x83, 0x15, 0x51, 0x9d, 0xc5, 0xbe, 0x45, 0x9d, 0x40, 0x0a, 0x38, 0x50, 0x9c, 0x41, + 0xe3, 0x44, 0x01, 0x8e, 0x06, 0xad, 0xb5, 0x48, 0x85, 0x50, 0x78, 0x3f, 0xea, 0xaa, 0x75, 0x39, 0xd2, 0xd0, 0x4d, + 0xa4, 0xdf, 0xea, 0xd7, 0x56, 0x94, 0xc1, 0x9c, 0x5f, 0xae, 0xbc, 0xf9, 0xa0, 0xe4, 0xef, 0xdb, 0x3f, 0xa9, 0x0b, + 0x54, 0xf4, 0x0e, 0x1c, 0x46, 0xb4, 0x39, 0x62, 0x6c, 0x61, 0x71, 0x18, 0x5b, 0xea, 0x09, 0xb1, 0xfe, 0x0e, 0x3d, + 0xc2, 0xd9, 0x37, 0x49, 0xad, 0x79, 0x39, 0x99, 0xe5, 0x76, 0x3b, 0xba, 0xdd, 0xf9, 0x99, 0x29, 0xfc, 0xa4, 0xe6, + 0x60, 0x51, 0xef, 0x49, 0xa4, 0x01, 0xba, 0x5e, 0x38, 0x8f, 0xc0, 0xf5, 0x28, 0x49, 0xc1, 0x64, 0x40, 0x13, 0x1a, + 0x3b, 0x62, 0x65, 0xc5, 0x59, 0x1a, 0x8d, 0xce, 0x85, 0xab, 0xa2, 0xfa, 0xfb, 0xcb, 0x62, 0x2e, 0x00, 0x8c, 0x20, + 0xf4, 0xc1, 0x1b, 0xbb, 0x9d, 0x36, 0xbd, 0xda, 0x96, 0x34, 0xc4, 0x11, 0x44, 0x65, 0x41, 0xc5, 0x2e, 0xa8, 0x3a, + 0xda, 0x2f, 0xa8, 0x1c, 0x27, 0xd5, 0x90, 0x9f, 0x7a, 0x65, 0xb9, 0x0b, 0xfe, 0xdc, 0xa3, 0x5a, 0xfd, 0xf3, 0x43, + 0xc3, 0x53, 0xfd, 0x43, 0x98, 0xf7, 0x95, 0xf2, 0x3c, 0x97, 0x7c, 0x6c, 0x12, 0xc9, 0xd5, 0x56, 0x05, 0x1f, 0x1e, + 0x4a, 0x7a, 0x2b, 0x6a, 0x16, 0x58, 0x6f, 0x0f, 0xcf, 0x6b, 0xcf, 0x61, 0xc6, 0x8e, 0xfa, 0x25, 0x51, 0x37, 0x67, + 0xff, 0x0d, 0x06, 0xf6, 0x9b, 0x56, 0x72, 0xae, 0x9b, 0xf5, 0x9e, 0x27, 0xc5, 0x7a, 0x3d, 0xbf, 0xa2, 0x81, 0x8d, + 0x7d, 0xf6, 0x99, 0x3f, 0xa0, 0x61, 0x90, 0x3d, 0x5d, 0x37, 0xe7, 0xb4, 0xce, 0xce, 0xb9, 0x72, 0xd8, 0x69, 0x33, + 0x7e, 0xd2, 0xbd, 0xe5, 0xa0, 0xda, 0x02, 0xf9, 0x9d, 0xfd, 0x84, 0x38, 0x69, 0xf9, 0xf9, 0x69, 0xb4, 0x33, 0x0b, + 0x21, 0x0f, 0xce, 0x76, 0x2b, 0x20, 0xe5, 0x65, 0x76, 0x01, 0x49, 0x73, 0xa1, 0xe7, 0x38, 0x2a, 0x45, 0x82, 0x2f, + 0x03, 0x66, 0xdd, 0x35, 0x02, 0xd3, 0xf5, 0x6e, 0x65, 0xde, 0xc5, 0xaa, 0x06, 0x9d, 0xd7, 0x36, 0x6d, 0xdf, 0x7c, + 0xa5, 0x3b, 0x9e, 0xbe, 0x28, 0x16, 0x3b, 0xac, 0xdc, 0xe5, 0x20, 0x7f, 0xaf, 0x04, 0x1e, 0x05, 0xf0, 0x5e, 0x4c, + 0xd2, 0x4f, 0xf0, 0x74, 0x27, 0x13, 0x98, 0xa8, 0x86, 0xa4, 0x6c, 0x75, 0x77, 0x23, 0x9b, 0x51, 0x35, 0xd0, 0x29, + 0x47, 0x8e, 0x78, 0xf5, 0xb3, 0xf6, 0x98, 0x07, 0x3b, 0xf7, 0xad, 0x17, 0x7e, 0x94, 0x0d, 0x15, 0x96, 0x67, 0x0c, + 0x0d, 0x38, 0x65, 0x58, 0x5c, 0xc6, 0x60, 0x40, 0x6e, 0xae, 0xe3, 0x46, 0x0a, 0xcd, 0x3f, 0x47, 0x3f, 0xa6, 0xa0, + 0x06, 0xea, 0x8d, 0xeb, 0xf1, 0xa1, 0x19, 0xec, 0x97, 0xbf, 0x01, 0x8f, 0x0f, 0x32, 0xa0, 0x9a, 0x85, 0xce, 0x68, + 0xe3, 0x69, 0x9e, 0x7f, 0xd2, 0xb7, 0xb9, 0xe4, 0xfc, 0x47, 0xff, 0x34, 0x1b, 0xa7, 0xce, 0xc9, 0x99, 0x26, 0xc1, + 0x79, 0x0a, 0x5d, 0x9d, 0xfd, 0x7f, 0x97, 0x6c, 0x64, 0x15, 0x2f, 0x9a, 0x47, 0x71, 0x75, 0x81, 0x28, 0xaa, 0xf5, + 0x91, 0x67, 0xed, 0xce, 0x5e, 0xec, 0x7b, 0x38, 0x0c, 0x7a, 0x83, 0x0f, 0x7e, 0xaa, 0xf2, 0x24, 0x66, 0xfd, 0xca, + 0x44, 0xca, 0x25, 0x7e, 0x4a, 0x5d, 0xd9, 0xd7, 0x49, 0xb3, 0x0f, 0x97, 0xa6, 0x34, 0x1c, 0xd8, 0x94, 0x62, 0x8d, + 0x0a, 0xb0, 0x5f, 0x89, 0xd2, 0xb7, 0x76, 0xce, 0xd0, 0x07, 0xff, 0xac, 0x0a, 0x2c, 0x4e, 0xeb, 0x32, 0x40, 0x52, + 0xd7, 0xe3, 0xca, 0x7e, 0x3d, 0x09, 0x88, 0x8b, 0x7c, 0x85, 0x36, 0x47, 0x8c, 0x51, 0x91, 0x0b, 0xd1, 0x41, 0xe6, + 0xaa, 0x62, 0xa2, 0xd6, 0xa7, 0x17, 0xb4, 0xfb, 0x6e, 0x22, 0x2e, 0xd4, 0xd0, 0xf9, 0x57, 0x27, 0x16, 0x94, 0x36, + 0xc7, 0xf6, 0x8e, 0xd0, 0x23, 0x97, 0xf1, 0x11, 0x41, 0x12, 0x5f, 0x4f, 0x61, 0xde, 0x7e, 0xc7, 0x8f, 0xab, 0x08, + 0x20, 0x81, 0x77, 0x8b, 0xb8, 0x19, 0x18, 0x4a, 0x12, 0xa8, 0x9a, 0x5a, 0xeb, 0x01, 0x13, 0xf3, 0x4e, 0x47, 0xe1, + 0x56, 0x54, 0x20, 0xf0, 0x10, 0x99, 0xd8, 0x83, 0x44, 0x56, 0x8f, 0xa2, 0x87, 0x3b, 0xda, 0xe9, 0x4a, 0xa6, 0x68, + 0x04, 0x25, 0xda, 0xf4, 0x90, 0xa4, 0x87, 0x2f, 0x9b, 0x89, 0xde, 0x89, 0x73, 0xd3, 0x1f, 0xf5, 0x5e, 0xcb, 0xfe, + 0x77, 0x5d, 0x47, 0xf6, 0x2e, 0x63, 0x44, 0xcc, 0xe1, 0x51, 0xb6, 0x9e, 0xac, 0x8e, 0xdb, 0x3e, 0xe4, 0xdc, 0x0b, + 0x8a, 0x01, 0x68, 0x6f, 0x0e, 0xdd, 0x77, 0xa5, 0x44, 0xad, 0xeb, 0xd6, 0x43, 0xca, 0x35, 0x12, 0xfd, 0xc5, 0xf7, + 0xe7, 0x77, 0xb5, 0xc9, 0xc9, 0x26, 0x0a, 0x15, 0x4d, 0xf2, 0x18, 0x44, 0x87, 0x97, 0xc6, 0x30, 0xea, 0xc5, 0xc5, + 0x18, 0xb1, 0xa7, 0xd3, 0x28, 0x6e, 0x61, 0x31, 0x5a, 0x65, 0x6f, 0x11, 0x62, 0x5d, 0x3a, 0x35, 0x4c, 0x51, 0xf5, + 0xdf, 0x9f, 0x46, 0xb5, 0x3b, 0x05, 0x11, 0xf8, 0x7a, 0xee, 0x58, 0xb2, 0x0b, 0xa8, 0x97, 0xf3, 0x77, 0xac, 0x68, + 0xd3, 0x69, 0x1f, 0x84, 0x71, 0x8c, 0xcc, 0x7b, 0xf9, 0xb6, 0x08, 0x31, 0x94, 0x12, 0xa4, 0xe0, 0x6b, 0xc7, 0x30, + 0x08, 0x0e, 0xf3, 0xf2, 0x31, 0xb4, 0xff, 0x10, 0xee, 0xc8, 0x8c, 0x31, 0x99, 0xe2, 0xde, 0x00, 0xeb, 0x0d, 0x77, + 0xd8, 0x47, 0x47, 0xbd, 0xd2, 0xe4, 0x4e, 0x12, 0x7b, 0x9a, 0x49, 0x8e, 0xde, 0xed, 0xd2, 0x28, 0x53, 0x3a, 0x7c, + 0x33, 0x89, 0xf8, 0x56, 0x9c, 0x10, 0xa9, 0xba, 0xac, 0xad, 0xae, 0xfd, 0xbe, 0x74, 0x1c, 0xdd, 0xb3, 0x6b, 0xbd, + 0x8f, 0x62, 0x6c, 0xd5, 0x9b, 0x9a, 0x6d, 0xea, 0xa7, 0xa1, 0x40, 0x8e, 0x0e, 0x77, 0xba, 0x95, 0x4c, 0xc7, 0xea, + 0xf2, 0x17, 0x6d, 0x5b, 0xe4, 0x0b, 0x03, 0x98, 0x9e, 0xba, 0xb7, 0x59, 0xed, 0x27, 0x44, 0x89, 0xf4, 0x81, 0x98, + 0x25, 0x3e, 0x4a, 0x01, 0xe3, 0x2b, 0xa7, 0x89, 0x6c, 0xf0, 0xb3, 0xfc, 0x5c, 0xc4, 0xed, 0xae, 0xf1, 0x9c, 0x4f, + 0x00, 0xbd, 0x1f, 0x8f, 0xb3, 0x33, 0x68, 0xe7, 0xdb, 0x74, 0xa6, 0x53, 0x79, 0x31, 0xfd, 0xb3, 0xff, 0xcf, 0xf4, + 0x40, 0xfd, 0x01, 0x24, 0x1a, 0xff, 0xf7, 0x22, 0x93, 0xd7, 0x6a, 0x24, 0x26, 0x07, 0x31, 0xea, 0x1e, 0x14, 0x8b, + 0x68, 0x08, 0xe0, 0x2b, 0x2f, 0x88, 0x1b, 0x1c, 0x1e, 0x15, 0x3e, 0x4d, 0xef, 0x0e, 0xe4, 0x70, 0xa7, 0xe3, 0x49, + 0x5b, 0xdc, 0x57, 0xc9, 0xcd, 0x8c, 0xfd, 0x3e, 0x83, 0x68, 0x18, 0x14, 0x7d, 0x81, 0x41, 0x29, 0xe4, 0xe7, 0x4b, + 0xf1, 0xa5, 0x99, 0xab, 0x2b, 0xa3, 0xa4, 0xb5, 0x82, 0xf5, 0x2a, 0xa4, 0x06, 0x12, 0xef, 0xa5, 0xf0, 0x19, 0xf4, + 0x14, 0x8a, 0xfd, 0xfe, 0xd4, 0x29, 0x27, 0x68, 0x2f, 0xab, 0xd2, 0xa4, 0x57, 0x92, 0xdb, 0x7b, 0x67, 0x1d, 0xfd, + 0x04, 0x28, 0xc7, 0x0f, 0xa2, 0xc5, 0xd7, 0x0e, 0x8b, 0x72, 0xbb, 0x54, 0x75, 0x1c, 0x43, 0xf0, 0xfc, 0xc9, 0xb3, + 0xb0, 0x5d, 0x91, 0x9e, 0xfe, 0x6d, 0xb1, 0xe9, 0xbb, 0x73, 0xab, 0xe1, 0xff, 0xe4, 0xb3, 0x3f, 0xf0, 0x36, 0x3d, + 0xeb, 0xcf, 0xd8, 0x48, 0xe5, 0x5d, 0xc2, 0xe5, 0x36, 0xb1, 0xf9, 0x02, 0x86, 0xe1, 0x71, 0x7b, 0x9e, 0x08, 0x89, + 0xfd, 0xa6, 0x30, 0xb3, 0xc7, 0xb1, 0x68, 0x25, 0xc2, 0xdf, 0xee, 0x46, 0xde, 0xf9, 0x4f, 0x87, 0x25, 0x08, 0xc3, + 0xb9, 0x71, 0xa6, 0xdf, 0x33, 0xda, 0x7f, 0x9a, 0xa7, 0x4f, 0x7f, 0x77, 0xc9, 0xe9, 0x8f, 0xfe, 0x69, 0xf6, 0xbd, + 0x7d, 0x55, 0xa2, 0x77, 0xc0, 0x66, 0xdf, 0x44, 0x8c, 0x9a, 0xbc, 0x9e, 0x53, 0x0e, 0x7a, 0x44, 0x57, 0x33, 0xe1, + 0xe5, 0x09, 0x5c, 0xa0, 0x61, 0x54, 0xe7, 0x3d, 0xcf, 0xc1, 0x0b, 0x65, 0xbb, 0xa3, 0x58, 0x92, 0x68, 0xb3, 0x90, + 0x3b, 0xf4, 0x53, 0x83, 0x28, 0xc1, 0xac, 0xfb, 0x49, 0xb2, 0x47, 0x6d, 0x35, 0x4c, 0xac, 0x52, 0x5d, 0x7c, 0xe7, + 0x5a, 0x26, 0x29, 0xe5, 0x55, 0xbc, 0x53, 0x89, 0xbc, 0xf9, 0x21, 0xcc, 0x98, 0x0d, 0x46, 0x2f, 0x84, 0xb0, 0xdf, + 0x29, 0x02, 0x23, 0x47, 0x15, 0x2c, 0x24, 0x7e, 0xbb, 0x03, 0x24, 0xde, 0xbe, 0x0b, 0xd2, 0x57, 0x12, 0x20, 0x5f, + 0xcb, 0x96, 0x53, 0x9b, 0x9d, 0x1b, 0xe1, 0xb0, 0x47, 0xe9, 0x1b, 0xef, 0x91, 0x6f, 0x64, 0xd2, 0x56, 0xa9, 0x1f, + 0x03, 0xcc, 0xce, 0xd6, 0x61, 0x64, 0xc4, 0x0e, 0xe4, 0x10, 0x53, 0xb1, 0x03, 0x04, 0xb3, 0x0e, 0xfd, 0x1c, 0xf8, + 0x63, 0xd7, 0x0d, 0x40, 0x34, 0x6b, 0x2e, 0x7d, 0x92, 0xb1, 0x9d, 0x1c, 0x8e, 0x4d, 0x04, 0xe3, 0x7d, 0xa9, 0xfb, + 0xac, 0x79, 0x8a, 0x94, 0x6a, 0x89, 0x14, 0x34, 0x20, 0xbd, 0x8a, 0x3b, 0xf7, 0x6c, 0x0e, 0x46, 0x9c, 0xec, 0xef, + 0x4a, 0xa9, 0x3e, 0xdc, 0xb8, 0xcb, 0xa1, 0x71, 0x5e, 0x1e, 0xb0, 0x8b, 0xcd, 0xa0, 0x04, 0xda, 0xe9, 0x34, 0x4f, + 0xd6, 0x1a, 0xcc, 0xb9, 0x26, 0x25, 0x29, 0x0b, 0x9f, 0x90, 0x19, 0xb9, 0xf9, 0xbe, 0xbc, 0xbe, 0xe5, 0xc3, 0x68, + 0x4e, 0x29, 0xd8, 0x2b, 0x7d, 0xd3, 0xa7, 0xfb, 0xba, 0xfc, 0xdc, 0x05, 0xdd, 0xda, 0x41, 0x2b, 0x17, 0x0f, 0xfb, + 0x93, 0x47, 0x02, 0xc8, 0x04, 0xf1, 0xc3, 0x0d, 0xcb, 0xee, 0xbe, 0x4f, 0x60, 0xf6, 0x8d, 0x5f, 0xec, 0xa7, 0x0c, + 0x83, 0x6f, 0xec, 0x66, 0x95, 0x60, 0x39, 0xfc, 0x3f, 0xf7, 0xcf, 0xb6, 0x5e, 0xec, 0x26, 0x87, 0xab, 0xfd, 0xba, + 0x7d, 0x06, 0x18, 0x7b, 0xbf, 0x5c, 0x27, 0x54, 0xc2, 0x48, 0x6d, 0xd1, 0xe4, 0xab, 0xc2, 0x99, 0x3d, 0x9c, 0x4c, + 0xd9, 0x4e, 0xa1, 0x16, 0x69, 0x1c, 0xd7, 0x39, 0x47, 0x5a, 0xa0, 0x8d, 0x65, 0xb1, 0x68, 0x14, 0x09, 0x9d, 0x60, + 0x8b, 0x8d, 0x1c, 0xf7, 0xc3, 0xfa, 0x6c, 0x98, 0xf1, 0x96, 0x28, 0xb4, 0xe0, 0x6c, 0xc4, 0x44, 0x90, 0x51, 0x35, + 0x06, 0xa1, 0x1d, 0x72, 0xb0, 0x00, 0xd5, 0xd0, 0x29, 0x82, 0xe7, 0xc6, 0x9f, 0x16, 0x3f, 0x2e, 0x0c, 0x5e, 0x42, + 0x32, 0x0c, 0x12, 0x40, 0x8a, 0xc9, 0x4a, 0xba, 0x71, 0x6f, 0xb7, 0x70, 0xbc, 0x2f, 0x98, 0x6a, 0xec, 0xa7, 0xdd, + 0xa3, 0x9b, 0x0e, 0xd4, 0x8b, 0x8f, 0x06, 0x86, 0xed, 0x8e, 0x21, 0xf3, 0xca, 0x88, 0xce, 0x44, 0xcf, 0xfb, 0x38, + 0xe9, 0xb1, 0x55, 0x98, 0x23, 0xcc, 0x08, 0xbe, 0x31, 0x99, 0x8d, 0x3c, 0xc2, 0xdd, 0x6e, 0x3f, 0x9a, 0xe3, 0xd8, + 0x1a, 0x7b, 0x85, 0x50, 0xa8, 0x78, 0xcb, 0x74, 0x37, 0xa1, 0x59, 0x87, 0xcd, 0x3d, 0xd4, 0xd9, 0x55, 0x06, 0xfa, + 0x2c, 0xab, 0x04, 0x27, 0xf2, 0xf6, 0xdb, 0xe8, 0x42, 0x03, 0x27, 0x68, 0x6b, 0xa3, 0x87, 0x7f, 0x88, 0xd0, 0xb7, + 0xa0, 0x4e, 0x38, 0x29, 0xdf, 0x19, 0x8f, 0x89, 0x41, 0xd4, 0x38, 0x4e, 0x95, 0x59, 0x4e, 0x4f, 0x76, 0x23, 0x57, + 0x4a, 0xae, 0xb0, 0x9c, 0x59, 0x5a, 0x36, 0x4b, 0x05, 0x78, 0xff, 0x51, 0x17, 0xc7, 0x84, 0x94, 0xab, 0x46, 0x6d, + 0xea, 0x81, 0x86, 0x4f, 0xa3, 0x95, 0x54, 0x56, 0x36, 0xf1, 0x87, 0x1e, 0xee, 0xf4, 0x07, 0xd1, 0xdd, 0x8a, 0x6a, + 0x93, 0xdb, 0xd0, 0x78, 0x42, 0x8f, 0x29, 0xec, 0x83, 0x45, 0xa0, 0xce, 0xa3, 0xf0, 0xf0, 0xf8, 0x3b, 0x26, 0x6f, + 0x24, 0xd1, 0xad, 0xc0, 0xcd, 0xe2, 0x07, 0x2e, 0x58, 0x24, 0x39, 0x5a, 0xc5, 0xd2, 0xbb, 0xd3, 0xb2, 0x35, 0xa9, + 0xfc, 0x84, 0xb6, 0xaf, 0xaf, 0xe5, 0x55, 0x0b, 0xac, 0xc4, 0xec, 0x55, 0x23, 0xf9, 0x45, 0x29, 0x0e, 0xec, 0x80, + 0x69, 0x91, 0x6b, 0x34, 0xcc, 0xd4, 0xb2, 0x79, 0x30, 0xee, 0xe9, 0x36, 0x1c, 0x4a, 0x67, 0x77, 0x7f, 0xa1, 0x09, + 0x0e, 0xa1, 0x29, 0xa9, 0x09, 0x93, 0x7c, 0x3c, 0xb5, 0x71, 0x62, 0x15, 0xb5, 0x60, 0xb2, 0xe5, 0xb8, 0xe5, 0xb5, + 0x3a, 0xa6, 0xea, 0xa5, 0xf7, 0x31, 0x90, 0x24, 0xd3, 0x38, 0xa1, 0x72, 0x70, 0x43, 0xbc, 0x42, 0xc1, 0x69, 0x7b, + 0x1a, 0x27, 0x76, 0x28, 0x6f, 0xff, 0x2a, 0xde, 0x56, 0x68, 0xfe, 0x15, 0x4e, 0xde, 0xcb, 0xf5, 0xbb, 0x6e, 0xb8, + 0x99, 0xd8, 0x0d, 0xbb, 0xfd, 0xab, 0x69, 0xab, 0x54, 0xec, 0xe9, 0xa4, 0xe7, 0x23, 0x1f, 0x00, 0xf8, 0xf3, 0xca, + 0x04, 0xf9, 0x64, 0x98, 0x11, 0xb5, 0x09, 0xc2, 0x4c, 0x65, 0xc4, 0xf8, 0xa6, 0x2a, 0x37, 0xb5, 0x68, 0x45, 0x62, + 0x49, 0x69, 0x1a, 0x67, 0xe7, 0x8e, 0x34, 0x3b, 0xee, 0x8e, 0xd8, 0x6d, 0x89, 0xb9, 0x7e, 0x9a, 0xf4, 0x34, 0x58, + 0x85, 0x22, 0x54, 0x9e, 0x50, 0xae, 0x29, 0x47, 0x7b, 0xd0, 0x8d, 0xba, 0x86, 0x0c, 0x86, 0x54, 0xa1, 0x8c, 0x5e, + 0xec, 0x3c, 0x22, 0x70, 0x54, 0xa1, 0x87, 0x0c, 0xa4, 0xa8, 0x88, 0x66, 0x33, 0x7e, 0x7c, 0xfe, 0x95, 0xa2, 0x2d, + 0xea, 0x06, 0xe1, 0x10, 0x80, 0xac, 0x77, 0x87, 0x43, 0x08, 0x5c, 0xff, 0x0e, 0xcb, 0xd6, 0xa8, 0x51, 0x46, 0x06, + 0x36, 0x64, 0x3d, 0x45, 0xfa, 0x8f, 0x51, 0x5d, 0x91, 0x49, 0xdd, 0xac, 0x50, 0x46, 0x90, 0x41, 0xcc, 0x3b, 0x4a, + 0x9b, 0x6f, 0x86, 0xd1, 0x91, 0x35, 0x8a, 0x30, 0x15, 0xbb, 0x41, 0xe1, 0xaa, 0x3f, 0x48, 0x91, 0x5d, 0x88, 0x38, + 0x05, 0x78, 0x77, 0x6a, 0x48, 0xd4, 0xac, 0xa9, 0x68, 0xf8, 0x18, 0x7a, 0xee, 0xcc, 0xbb, 0x0d, 0x07, 0x12, 0xc2, + 0x22, 0x35, 0xd8, 0x81, 0x68, 0x0b, 0x32, 0x16, 0xe1, 0x8d, 0x48, 0x34, 0xd4, 0x7b, 0x02, 0xf0, 0x6e, 0xdd, 0xa7, + 0xbc, 0x03, 0x80, 0x3e, 0x59, 0x39, 0x91, 0xee, 0x8f, 0x07, 0x72, 0x88, 0xb9, 0xd9, 0x91, 0xba, 0x43, 0x5c, 0x8a, + 0xf3, 0x89, 0x62, 0xbd, 0x20, 0x07, 0x91, 0xa0, 0x15, 0xaf, 0xc9, 0x45, 0x99, 0xb4, 0xf3, 0xae, 0x33, 0xd7, 0xb9, + 0x26, 0x9e, 0xe4, 0xa8, 0x33, 0x51, 0x4c, 0xee, 0x99, 0x7c, 0xad, 0xdb, 0xb0, 0xda, 0x41, 0x9f, 0x10, 0xe3, 0xc9, + 0x58, 0xa6, 0x1e, 0xd9, 0xd9, 0x78, 0x36, 0xe2, 0x50, 0x01, 0x2d, 0x1d, 0xdc, 0x72, 0xd9, 0xac, 0xf9, 0x19, 0x77, + 0xfc, 0xb0, 0x09, 0x1f, 0xad, 0xe2, 0xda, 0xf4, 0xe9, 0x65, 0x90, 0x06, 0xf3, 0xa1, 0xa4, 0xe0, 0x4a, 0xaa, 0xb1, + 0xef, 0x4d, 0x25, 0xb5, 0x7f, 0xb7, 0x99, 0x9a, 0xb5, 0x58, 0xf1, 0x64, 0x5c, 0x04, 0x91, 0xf9, 0xfa, 0xdd, 0xd4, + 0x8c, 0xa3, 0xdd, 0xb4, 0x20, 0x42, 0x5f, 0xe5, 0x62, 0x64, 0x39, 0xfd, 0xa6, 0x89, 0x37, 0x37, 0x84, 0x3e, 0x62, + 0xfa, 0xb3, 0x8d, 0x39, 0x3e, 0x3b, 0xbc, 0x50, 0x43, 0x0f, 0xda, 0x20, 0x22, 0x35, 0x4e, 0x77, 0xb0, 0x48, 0x64, + 0x4b, 0x78, 0x45, 0xd1, 0x8a, 0xb9, 0xfa, 0xe1, 0x90, 0xb1, 0x44, 0x26, 0x88, 0x34, 0xfa, 0xf1, 0xc3, 0x2e, 0x1d, + 0xb6, 0x1e, 0x86, 0xb1, 0x02, 0x5c, 0xe6, 0x25, 0x25, 0x6f, 0xac, 0xe0, 0xb7, 0x9f, 0x03, 0xd3, 0xbc, 0xdf, 0xde, + 0x35, 0xbd, 0x11, 0x2f, 0xd5, 0x8d, 0xd3, 0x3b, 0x14, 0x4a, 0x42, 0x94, 0xd3, 0xc6, 0xc5, 0xc5, 0x9c, 0x3d, 0x0d, + 0x2c, 0xf2, 0x72, 0xc5, 0xd2, 0x2e, 0x7e, 0x0d, 0xa2, 0x61, 0xc5, 0x3b, 0x08, 0xe9, 0x22, 0xbb, 0xce, 0xf0, 0x00, + 0x8d, 0xea, 0xe1, 0x1e, 0x6d, 0xd1, 0x05, 0x04, 0x99, 0x63, 0xf4, 0x68, 0xa0, 0x04, 0x14, 0x7c, 0xc5, 0x09, 0x74, + 0x95, 0xd6, 0xcc, 0xb3, 0x35, 0x32, 0x63, 0x02, 0x84, 0xd3, 0xfa, 0x93, 0x08, 0x2e, 0x21, 0x73, 0xb8, 0x54, 0xd8, + 0x82, 0x8c, 0x5a, 0x29, 0x4e, 0x46, 0x01, 0x4d, 0x9f, 0x88, 0xe3, 0x17, 0xbd, 0x4b, 0x01, 0x38, 0x7a, 0x2c, 0xac, + 0x24, 0xf0, 0x99, 0xc6, 0x15, 0xb3, 0xcb, 0xa0, 0x39, 0xd0, 0xb8, 0xf6, 0xb5, 0xd5, 0x18, 0x8b, 0x8d, 0xd7, 0xdf, + 0x43, 0x84, 0x0d, 0xf6, 0x94, 0x42, 0xac, 0x48, 0x74, 0x80, 0xac, 0x5c, 0x43, 0x27, 0xef, 0xd9, 0xd3, 0xb1, 0xb5, + 0x5c, 0x41, 0x17, 0x3a, 0x92, 0x70, 0xad, 0xc1, 0x66, 0xff, 0x11, 0xe0, 0x4c, 0x43, 0x5a, 0xcf, 0x0c, 0x2b, 0x72, + 0x99, 0x82, 0x1a, 0xf1, 0xaf, 0x53, 0x07, 0x8b, 0x7a, 0x48, 0x17, 0x71, 0x2a, 0xea, 0x99, 0x56, 0x16, 0xe8, 0x84, + 0x3a, 0x52, 0x43, 0x6c, 0x00, 0x05, 0x6f, 0x94, 0x9e, 0x70, 0xfa, 0xdd, 0xa5, 0xe7, 0xa8, 0x2c, 0xb8, 0x0e, 0xcd, + 0xe2, 0x0f, 0x51, 0x6d, 0x3c, 0xfd, 0xf8, 0x60, 0x06, 0x0f, 0xe2, 0xed, 0x59, 0xc0, 0x87, 0x89, 0xb7, 0x63, 0xe7, + 0x79, 0x67, 0x37, 0x01, 0xc1, 0xac, 0x34, 0x11, 0x92, 0x11, 0xe6, 0xce, 0xbd, 0xc3, 0xd6, 0xf8, 0x2b, 0x76, 0x7f, + 0x29, 0x14, 0x06, 0xdb, 0x91, 0x08, 0xf3, 0xb1, 0x18, 0x45, 0xa8, 0xed, 0xe5, 0xd7, 0x2c, 0x19, 0xc9, 0xef, 0xce, + 0x9b, 0x8b, 0xb8, 0x1d, 0xd8, 0xaa, 0x54, 0xa9, 0x1f, 0x10, 0x55, 0xed, 0xf7, 0xb2, 0x61, 0x9b, 0x85, 0x8f, 0x17, + 0x3d, 0x3b, 0xf1, 0xc1, 0x72, 0x3d, 0xc7, 0x92, 0xdf, 0x3f, 0x43, 0x40, 0xcd, 0x66, 0xfb, 0xd5, 0xe2, 0xa0, 0xcf, + 0xb5, 0xf5, 0x1b, 0xb5, 0x81, 0x7e, 0x42, 0x58, 0xe0, 0xfb, 0x79, 0x8d, 0x5c, 0x3c, 0xca, 0xe6, 0xfa, 0x81, 0xdf, + 0x78, 0xb5, 0xc0, 0x3e, 0xbb, 0x33, 0x37, 0x9c, 0x1b, 0xc2, 0xd0, 0xf6, 0x44, 0xe3, 0xfe, 0x89, 0x49, 0x08, 0xaf, + 0xb3, 0x8a, 0x29, 0x9d, 0xc8, 0xac, 0xf2, 0x4f, 0xfa, 0x9d, 0xbb, 0x9b, 0xf9, 0x08, 0x25, 0xda, 0xdf, 0x80, 0xf3, + 0x72, 0xd5, 0x7e, 0x4d, 0xf2, 0x8c, 0x96, 0x1e, 0xb0, 0xa9, 0xa5, 0x9f, 0xeb, 0x95, 0xea, 0x40, 0xe9, 0xbe, 0x03, + 0x09, 0x30, 0x50, 0x87, 0x19, 0xbf, 0x8f, 0xcd, 0x10, 0x6e, 0x4a, 0x30, 0x06, 0x9e, 0xe9, 0x3f, 0x7c, 0x81, 0x83, + 0xb3, 0x92, 0x81, 0x39, 0xa2, 0xe6, 0x15, 0x41, 0xc0, 0xe7, 0x12, 0x54, 0xc8, 0x6e, 0x05, 0xf2, 0xf3, 0xbc, 0x72, + 0xe4, 0x06, 0x90, 0x5b, 0x21, 0xa8, 0xb8, 0x27, 0xcf, 0x5c, 0x1a, 0xd0, 0x03, 0x50, 0xfe, 0xe1, 0x9c, 0x93, 0x84, + 0xfe, 0x26, 0xa0, 0xa8, 0xd1, 0x49, 0x7f, 0xfe, 0xb5, 0x66, 0x64, 0xf2, 0xe7, 0xb1, 0x5f, 0x79, 0xbc, 0xec, 0xe6, + 0x2d, 0xc8, 0x48, 0x1b, 0xdf, 0x86, 0x19, 0x99, 0x81, 0x8e, 0x55, 0x50, 0x5b, 0xf8, 0x42, 0xaa, 0x55, 0x40, 0xae, + 0x2e, 0x42, 0x8b, 0x14, 0xb7, 0x90, 0xd3, 0x9f, 0xb6, 0xb3, 0x90, 0x7f, 0x9a, 0x01, 0x8e, 0x59, 0xf9, 0xcf, 0xc6, + 0x15, 0x45, 0xf6, 0x10, 0x18, 0xcd, 0x8f, 0x2e, 0x15, 0xd4, 0xb4, 0x72, 0x12, 0x7f, 0x02, 0x72, 0x09, 0x12, 0x30, + 0x3e, 0xbf, 0x51, 0x7b, 0xff, 0x9d, 0xce, 0x52, 0x8b, 0xaa, 0x63, 0xa4, 0x9f, 0xfc, 0x1a, 0xf2, 0x1f, 0xe0, 0x47, + 0x1f, 0x91, 0xd2, 0xd9, 0x3c, 0x5b, 0xfd, 0x89, 0xab, 0xd8, 0x65, 0x41, 0x75, 0x02, 0x2a, 0x48, 0x58, 0x05, 0xb5, + 0x06, 0x23, 0xfb, 0x1f, 0x16, 0xae, 0x46, 0x4c, 0xf3, 0xa7, 0x5b, 0xb4, 0x1a, 0xba, 0x57, 0xa0, 0xea, 0x70, 0x03, + 0x44, 0x0e, 0xdd, 0xa3, 0xea, 0x62, 0xc7, 0x99, 0xfe, 0x5b, 0x09, 0xd8, 0x38, 0x73, 0x82, 0xd3, 0xfd, 0x87, 0x97, + 0x2f, 0xd6, 0xf6, 0xa4, 0x5f, 0x32, 0xc3, 0xf8, 0x92, 0xba, 0x78, 0x70, 0x5f, 0xd3, 0xe2, 0x5b, 0xc2, 0xe4, 0xd3, + 0xfc, 0xf3, 0x49, 0xff, 0xea, 0x4b, 0xfe, 0xfc, 0xe8, 0x17, 0xbe, 0x95, 0xaf, 0x79, 0xf6, 0x4d, 0x5a, 0xa3, 0x1d, + 0xf6, 0x7a, 0x88, 0xbb, 0x37, 0xfd, 0xa1, 0x0e, 0xf9, 0x5a, 0xc5, 0xf8, 0xaf, 0x9e, 0xe9, 0xd3, 0x1f, 0x1e, 0x1f, + 0xdc, 0xa4, 0x77, 0x09, 0x39, 0xcd, 0x94, 0x57, 0xe7, 0xd6, 0xbe, 0xc1, 0x12, 0xb6, 0xf5, 0x26, 0xc1, 0xde, 0xa0, + 0x20, 0xd2, 0x48, 0xbb, 0x13, 0x21, 0x02, 0x95, 0x41, 0xae, 0x60, 0xc8, 0xcd, 0x71, 0xd4, 0xf0, 0x3f, 0x71, 0xc0, + 0x28, 0x97, 0x11, 0x55, 0xa5, 0x8a, 0xd3, 0xd1, 0xc1, 0x4c, 0xc0, 0x29, 0x44, 0x18, 0x21, 0xf9, 0x5e, 0xcd, 0x62, + 0x81, 0xce, 0x24, 0x0d, 0x3e, 0x7e, 0x27, 0x1d, 0x4b, 0x56, 0x5c, 0x5b, 0xe6, 0xeb, 0xfd, 0x27, 0xd9, 0x58, 0xf9, + 0x28, 0x90, 0x59, 0x79, 0x87, 0x02, 0xd5, 0x21, 0x05, 0x93, 0x8b, 0xd4, 0xf9, 0x88, 0x99, 0xf3, 0x91, 0x4a, 0x2f, + 0xd8, 0xaf, 0xe6, 0x06, 0xda, 0x8d, 0x3d, 0x1c, 0xec, 0x5b, 0x65, 0x6c, 0xc2, 0x90, 0xe4, 0x26, 0xbf, 0x46, 0x06, + 0xe5, 0xe4, 0xa6, 0x0d, 0x5b, 0xe0, 0x9b, 0x5f, 0x9f, 0xa1, 0x49, 0x0a, 0x9d, 0x8d, 0x7c, 0xcf, 0xc8, 0x83, 0xeb, + 0xfb, 0xb3, 0xd7, 0xfe, 0xd1, 0x94, 0x45, 0x13, 0xd6, 0x6e, 0xa9, 0x7d, 0x42, 0x28, 0x05, 0x2a, 0x08, 0x10, 0xa6, + 0xc2, 0x1a, 0x58, 0xd6, 0x21, 0x35, 0x87, 0x9a, 0xae, 0x3f, 0x67, 0x90, 0x23, 0xb5, 0xc3, 0xc4, 0xbe, 0x0d, 0x03, + 0x5f, 0x2b, 0xa5, 0xb7, 0x37, 0x50, 0xa5, 0x16, 0xf6, 0x59, 0x64, 0xa8, 0x33, 0x39, 0x57, 0x1c, 0x81, 0xd7, 0x2d, + 0x35, 0x33, 0x51, 0xe8, 0x2c, 0x1b, 0x69, 0x7e, 0x4a, 0x78, 0x45, 0x7f, 0x55, 0x04, 0x4c, 0x74, 0xd0, 0x99, 0xdc, + 0x9a, 0x8a, 0x02, 0x93, 0x90, 0xaa, 0xba, 0x62, 0xeb, 0x78, 0x0a, 0x84, 0x9f, 0xa7, 0x88, 0xed, 0x1a, 0x9f, 0x87, + 0xa2, 0x3c, 0xc9, 0xfb, 0x34, 0x77, 0x7d, 0xe8, 0x9c, 0x6b, 0x03, 0x91, 0x6c, 0x46, 0x74, 0xe1, 0x87, 0xd7, 0x54, + 0xa7, 0xc5, 0x6d, 0x4b, 0xf7, 0x69, 0x5e, 0x7c, 0xd2, 0xac, 0x4b, 0x2e, 0x7e, 0xf4, 0x97, 0x6c, 0x9b, 0x65, 0x08, + 0x45, 0x2a, 0x53, 0xf0, 0x6a, 0x9f, 0x2f, 0x8a, 0xc9, 0xf6, 0x7b, 0x58, 0xf2, 0xc4, 0x97, 0x41, 0x83, 0x89, 0x7e, + 0x71, 0xe7, 0x11, 0x1c, 0xaf, 0xba, 0xc8, 0x6a, 0x0e, 0x9c, 0xeb, 0x7a, 0x36, 0xe6, 0xb2, 0x35, 0x2e, 0x34, 0x42, + 0xa2, 0xae, 0x1a, 0x79, 0xd9, 0xbb, 0x80, 0x0c, 0x23, 0x29, 0x7b, 0x20, 0xc0, 0x9c, 0x5f, 0x5b, 0x46, 0xc3, 0xb3, + 0x90, 0x7c, 0xdd, 0x74, 0xba, 0xa0, 0x21, 0x54, 0x40, 0x83, 0x9f, 0xbf, 0x97, 0xd0, 0x9e, 0x0a, 0x7b, 0x7d, 0xfa, + 0x0b, 0xcf, 0x4c, 0x5a, 0x51, 0xc6, 0x33, 0x7d, 0x16, 0x4b, 0x9a, 0x27, 0x9d, 0xb1, 0x25, 0xcf, 0xfb, 0x58, 0xbe, + 0x4f, 0xe5, 0x58, 0xee, 0xee, 0x69, 0xba, 0xe4, 0x24, 0x35, 0xc7, 0x4a, 0x67, 0x42, 0x6d, 0x7c, 0x99, 0x4f, 0x22, + 0x12, 0x37, 0x78, 0x8a, 0x81, 0x58, 0xcf, 0x7d, 0x3a, 0x18, 0x4e, 0x15, 0xcd, 0xb7, 0xa7, 0xbb, 0x55, 0xe9, 0x9b, + 0x4d, 0xb5, 0x08, 0x71, 0x79, 0xc8, 0x62, 0xe2, 0xc3, 0x40, 0xd9, 0xd9, 0xa6, 0x8d, 0x9b, 0x04, 0x0f, 0xa4, 0xce, + 0xe5, 0xf4, 0x60, 0xb8, 0x88, 0xbd, 0xce, 0x3c, 0xa4, 0x57, 0x5c, 0xdc, 0x05, 0xe2, 0xbc, 0x42, 0x38, 0xa8, 0x57, + 0x8c, 0x6b, 0xf9, 0xa6, 0xd9, 0xbf, 0x9c, 0x4a, 0xe2, 0x92, 0x87, 0x6b, 0xd0, 0x4a, 0x35, 0x6b, 0x9d, 0x62, 0xab, + 0xa3, 0xf5, 0xf0, 0xdf, 0x37, 0x88, 0xac, 0xd8, 0x7c, 0xe1, 0x5b, 0xf9, 0xca, 0x76, 0x41, 0xc8, 0xec, 0x2f, 0xc7, + 0x17, 0x68, 0x3f, 0xcb, 0xd6, 0xda, 0x8b, 0xd3, 0xee, 0x74, 0xe3, 0x2e, 0xaf, 0x0f, 0xdb, 0x60, 0x7c, 0x85, 0x0e, + 0xdb, 0x05, 0x99, 0x7e, 0x62, 0xbd, 0xbe, 0xa7, 0x12, 0xfe, 0xe1, 0xfa, 0x87, 0xdf, 0xf4, 0xb9, 0x3f, 0xe6, 0x2a, + 0xe2, 0x00, 0x99, 0x97, 0xd4, 0x86, 0x71, 0xcd, 0x62, 0x2f, 0xe8, 0x56, 0x42, 0x7d, 0x6e, 0x9f, 0x01, 0x07, 0x37, + 0x37, 0xbd, 0xa7, 0x56, 0x03, 0x80, 0x45, 0x1c, 0x5d, 0xc3, 0x8e, 0x27, 0xe0, 0x13, 0x4a, 0x05, 0x61, 0x8f, 0x63, + 0x54, 0x29, 0x5d, 0xaa, 0x47, 0x1d, 0x3f, 0x0f, 0xa3, 0x3a, 0x10, 0x20, 0xe0, 0xf1, 0x98, 0xc7, 0x82, 0x44, 0x0d, + 0xea, 0x3c, 0x9a, 0xf2, 0x0a, 0x3e, 0x44, 0x02, 0xf6, 0x5d, 0xaf, 0xef, 0xc6, 0x37, 0xc3, 0x2b, 0x02, 0x5b, 0xf8, + 0x25, 0x8d, 0x6c, 0x23, 0x34, 0x8a, 0x47, 0xb9, 0x75, 0x4d, 0xf4, 0x45, 0x6d, 0xc7, 0xcc, 0x0b, 0x41, 0x56, 0x4f, + 0x78, 0x06, 0x0b, 0xe5, 0x82, 0xe0, 0x0b, 0xab, 0x80, 0xfb, 0x73, 0xa2, 0x1f, 0x83, 0x94, 0x1e, 0x8a, 0xe8, 0x88, + 0xd6, 0x91, 0xa9, 0xc1, 0x71, 0x8f, 0x65, 0x89, 0xe1, 0x3c, 0x42, 0xb0, 0xdb, 0x96, 0x35, 0x22, 0xab, 0xd5, 0x08, + 0x7e, 0xf3, 0x52, 0xd1, 0x3a, 0xa4, 0x24, 0x85, 0x0a, 0xd6, 0xd4, 0xf4, 0x5a, 0x10, 0xa9, 0x45, 0xe7, 0x7f, 0x02, + 0xc4, 0x69, 0x4f, 0x34, 0xad, 0xf6, 0x9c, 0x5a, 0x54, 0x1c, 0xda, 0x46, 0xc2, 0xdc, 0xa5, 0xc0, 0x95, 0x38, 0x70, + 0x00, 0xb1, 0xf4, 0xae, 0x48, 0xe4, 0x3d, 0xb4, 0x3f, 0xb8, 0x42, 0x9a, 0x4e, 0x8d, 0x77, 0x72, 0xca, 0x0d, 0x52, + 0x75, 0x61, 0xe4, 0x34, 0x12, 0x93, 0x2a, 0x27, 0x8c, 0x50, 0xc5, 0xed, 0x5a, 0x2d, 0xe1, 0xd4, 0x1b, 0xb7, 0x03, + 0x4f, 0x01, 0xef, 0x92, 0x21, 0x6c, 0xaf, 0x35, 0xe2, 0xcc, 0x18, 0xba, 0x7c, 0xf3, 0x9f, 0xba, 0x9d, 0x53, 0xfb, + 0x65, 0x70, 0x45, 0x87, 0x81, 0xaf, 0xc6, 0xab, 0x30, 0x79, 0x4a, 0x61, 0x5a, 0xfd, 0xa5, 0xeb, 0x33, 0x18, 0xf2, + 0x27, 0xf9, 0x4c, 0x43, 0x22, 0x48, 0xf1, 0x36, 0x7c, 0x78, 0x3f, 0xda, 0x06, 0xe4, 0x21, 0x70, 0x98, 0x8f, 0xc1, + 0xef, 0x44, 0xf6, 0x41, 0x6b, 0x44, 0x77, 0x8a, 0xb0, 0x20, 0x35, 0x77, 0xf8, 0xe8, 0x90, 0x6f, 0x1e, 0xea, 0x91, + 0x5c, 0x5e, 0x83, 0x00, 0x0a, 0x56, 0xd3, 0xc2, 0x9e, 0x3e, 0xb7, 0x79, 0xc6, 0x7b, 0xd0, 0x44, 0x47, 0xe1, 0x10, + 0x13, 0x3c, 0xe7, 0x0c, 0xed, 0x68, 0x27, 0x87, 0xe1, 0x31, 0xf4, 0x4a, 0x61, 0xee, 0x3f, 0x23, 0x72, 0xc3, 0xf9, + 0xb9, 0x9e, 0x31, 0x8d, 0x72, 0x9e, 0xb2, 0xaf, 0x57, 0x8d, 0x1e, 0xff, 0xb1, 0x03, 0x70, 0xff, 0xf4, 0xd7, 0x84, + 0xe4, 0x4f, 0x75, 0x0a, 0xdf, 0x57, 0x96, 0x84, 0xb7, 0x02, 0xff, 0x06, 0xaf, 0x59, 0x62, 0x70, 0x98, 0x82, 0x42, + 0xf9, 0x6b, 0x0b, 0x42, 0x6e, 0x73, 0x72, 0x6d, 0x0e, 0x97, 0xcf, 0x99, 0xe4, 0x0b, 0xb6, 0x09, 0xb5, 0x3e, 0x2b, + 0x70, 0xf0, 0xa6, 0xc9, 0x72, 0x3a, 0x8e, 0x9c, 0xf9, 0xad, 0xd8, 0x5c, 0x37, 0x26, 0x79, 0x14, 0x29, 0xfa, 0xcd, + 0xf4, 0x46, 0xde, 0x78, 0xb3, 0x10, 0x6d, 0x87, 0x5e, 0x9a, 0xd6, 0x8f, 0x2f, 0x08, 0x3f, 0x0d, 0xcb, 0x89, 0xd9, + 0x1f, 0x7c, 0x2f, 0xb0, 0xba, 0xc4, 0xc5, 0x80, 0x0c, 0xc3, 0xee, 0x58, 0xb0, 0x0e, 0x57, 0xd7, 0x68, 0xca, 0xb8, + 0x1c, 0xa4, 0x8a, 0x96, 0xee, 0x08, 0xa1, 0x9b, 0xb8, 0x28, 0xed, 0x4c, 0xd9, 0x7b, 0xf9, 0x3b, 0xb4, 0xfa, 0xb5, + 0x2a, 0xde, 0x5d, 0x12, 0x3e, 0xf8, 0xee, 0x5d, 0xd0, 0xdf, 0x74, 0xc8, 0xc6, 0xba, 0x5f, 0x3e, 0xbe, 0x54, 0x4d, + 0x16, 0x46, 0x83, 0x99, 0x4f, 0x79, 0x73, 0x76, 0x57, 0x65, 0x94, 0xd4, 0x35, 0x14, 0x46, 0x62, 0x8f, 0x1c, 0xe7, + 0xbd, 0x33, 0x59, 0xd7, 0xbb, 0x8e, 0x55, 0xe9, 0xf2, 0xb3, 0x04, 0x8b, 0xd6, 0x72, 0xef, 0xfe, 0x2c, 0xd5, 0xa7, + 0x50, 0x03, 0x69, 0xb3, 0x81, 0x0e, 0xdd, 0x46, 0x9b, 0x68, 0x9c, 0x49, 0xa0, 0xb4, 0x87, 0x2b, 0x2f, 0x6a, 0xfa, + 0x2c, 0x26, 0xd0, 0xba, 0x9d, 0x2d, 0x74, 0xb6, 0x0b, 0x4a, 0x83, 0xdb, 0x3f, 0xee, 0x76, 0xe9, 0xcc, 0xe0, 0xe3, + 0xfd, 0x83, 0x0c, 0xcb, 0xff, 0x1b, 0x55, 0xec, 0x9e, 0x1c, 0x80, 0x86, 0x35, 0x6f, 0x9b, 0x44, 0x44, 0x48, 0x58, + 0xdc, 0x7c, 0x72, 0xec, 0xfb, 0xc6, 0x97, 0xe8, 0xb9, 0xa1, 0x27, 0xe3, 0xc4, 0xf5, 0x52, 0x9d, 0xb2, 0x1e, 0x89, + 0x01, 0x7f, 0xd2, 0x39, 0x90, 0x68, 0x6b, 0x9a, 0xdd, 0x0e, 0xca, 0x81, 0xdd, 0x9b, 0x03, 0xeb, 0x8f, 0xf9, 0x06, + 0x23, 0x07, 0x2b, 0x9b, 0x3f, 0xb5, 0xb9, 0xed, 0xb4, 0x0e, 0x9f, 0x4d, 0xc6, 0xd2, 0xe3, 0xe1, 0x2b, 0xab, 0x23, + 0xb4, 0x35, 0x92, 0x15, 0x83, 0x6a, 0x6f, 0xf7, 0x63, 0x0f, 0x22, 0x7e, 0xa6, 0xee, 0xde, 0x45, 0xdd, 0xa1, 0xa5, + 0x67, 0xf6, 0xf6, 0xe0, 0xb1, 0x7f, 0x60, 0x8d, 0x43, 0xdd, 0xcb, 0x05, 0x08, 0x4b, 0xdc, 0x51, 0xd6, 0x56, 0x71, + 0x71, 0xfb, 0xe7, 0xd7, 0x0f, 0x9a, 0x83, 0x40, 0xe5, 0x70, 0x30, 0xd1, 0x8b, 0x11, 0xeb, 0xc8, 0xb1, 0x63, 0x18, + 0x23, 0x76, 0x73, 0x80, 0x94, 0x11, 0x23, 0xcd, 0x29, 0xdf, 0x07, 0x63, 0x5c, 0xf4, 0x46, 0xed, 0xc2, 0x86, 0x79, + 0x80, 0x15, 0xee, 0xa4, 0xaa, 0xc3, 0xc2, 0xc4, 0xfc, 0xba, 0xb5, 0x49, 0x72, 0xde, 0x91, 0xf5, 0xa9, 0xd9, 0xbb, + 0x12, 0x84, 0x3e, 0x1f, 0xfe, 0x8d, 0x8a, 0x78, 0xae, 0xb3, 0x87, 0x60, 0x02, 0x7e, 0xac, 0x3a, 0xec, 0x6f, 0xc1, + 0xa7, 0x0d, 0x27, 0xea, 0xe8, 0x93, 0xd1, 0x59, 0xe1, 0x80, 0x5d, 0x6b, 0xfa, 0x50, 0xc6, 0x43, 0x8f, 0x59, 0x18, + 0x2b, 0xd3, 0x5b, 0x15, 0x94, 0x0d, 0x9b, 0xa9, 0x2e, 0xa9, 0x06, 0xaa, 0x4c, 0x26, 0x99, 0x4c, 0xd9, 0x42, 0xce, + 0x00, 0xb6, 0xf7, 0x41, 0x72, 0x85, 0x88, 0x7a, 0x5f, 0x5a, 0x8f, 0xcc, 0x22, 0xae, 0x91, 0x23, 0xda, 0x63, 0x50, + 0x8b, 0x88, 0x77, 0x6a, 0x75, 0x94, 0xe4, 0xa3, 0x2f, 0x1f, 0x82, 0xd0, 0xb5, 0xa4, 0x3f, 0x9b, 0xa1, 0x84, 0x65, + 0x46, 0x2e, 0xdb, 0x4f, 0xdc, 0xbd, 0x3f, 0x8d, 0x7f, 0x9a, 0x08, 0x6d, 0x97, 0x67, 0xeb, 0xc1, 0xc8, 0xb5, 0x34, + 0x95, 0xd7, 0xb8, 0xa5, 0xc6, 0xb8, 0xe0, 0xa7, 0x38, 0xd2, 0xe6, 0x6b, 0xcd, 0xd3, 0x43, 0xdd, 0x7a, 0x1e, 0xb5, + 0x0f, 0xb2, 0xb6, 0x0e, 0xec, 0xc5, 0x42, 0x7b, 0x0a, 0x7b, 0xe7, 0xf8, 0xd0, 0xfd, 0xc5, 0xad, 0xcb, 0x4d, 0x95, + 0x8f, 0xce, 0x5c, 0x48, 0x64, 0x8e, 0x8a, 0xb7, 0x38, 0xc8, 0x07, 0xa0, 0x22, 0x92, 0xe1, 0xbd, 0x5b, 0x1e, 0x36, + 0xcf, 0xba, 0x47, 0x3d, 0xf6, 0xa0, 0x8c, 0x84, 0x8f, 0x77, 0x08, 0x89, 0x52, 0x21, 0xf6, 0xfc, 0x67, 0x92, 0x72, + 0x16, 0x0d, 0x95, 0xb7, 0x65, 0xe5, 0xf4, 0xf5, 0x3c, 0x92, 0x6a, 0x19, 0x0f, 0x78, 0x4f, 0x6e, 0xb6, 0x96, 0x13, + 0xc5, 0xad, 0xbe, 0xda, 0x5c, 0x82, 0xa0, 0x6c, 0xf4, 0x86, 0xdb, 0xb7, 0x11, 0x3b, 0x4e, 0xa0, 0x6d, 0xdb, 0x9f, + 0x5c, 0x2c, 0x45, 0xa9, 0x70, 0xc2, 0x58, 0x37, 0x39, 0x8a, 0xe6, 0x10, 0x86, 0x37, 0x6b, 0xab, 0x09, 0x1f, 0x70, + 0xc3, 0x31, 0x6f, 0x6f, 0x29, 0x87, 0x55, 0x2d, 0x9c, 0xa3, 0x48, 0xc6, 0xc4, 0xde, 0x2e, 0xa3, 0xdb, 0x5b, 0x85, + 0xfe, 0x13, 0xb2, 0xeb, 0xac, 0x56, 0xde, 0x04, 0x5f, 0x29, 0x88, 0x6c, 0xee, 0xc7, 0x67, 0xc6, 0x01, 0xd2, 0x0d, + 0xf0, 0xd7, 0x0a, 0x92, 0x55, 0x9e, 0xa8, 0xbc, 0x0a, 0x4c, 0xd3, 0x90, 0x82, 0xe1, 0x53, 0x7a, 0x0f, 0x96, 0xbc, + 0xe6, 0xcb, 0x66, 0xd7, 0x37, 0x17, 0x3f, 0xac, 0xf5, 0x10, 0x2f, 0x3b, 0xbd, 0xb5, 0x2a, 0x9c, 0xe0, 0x31, 0x49, + 0xfc, 0xba, 0xf4, 0xb3, 0xfd, 0x60, 0xe3, 0x96, 0x42, 0xed, 0x07, 0x9c, 0xd9, 0xba, 0xe7, 0x30, 0xb3, 0x49, 0x9f, + 0x01, 0x12, 0x16, 0x68, 0xdd, 0xc7, 0x22, 0x53, 0x60, 0xab, 0x01, 0x6e, 0x00, 0x23, 0xb6, 0x7d, 0xc8, 0x1e, 0xbd, + 0x29, 0x92, 0x2d, 0xe4, 0x7b, 0x3a, 0x72, 0xfb, 0x53, 0x4c, 0xef, 0x17, 0x75, 0x20, 0x9a, 0xaf, 0x03, 0x6e, 0xeb, + 0x81, 0x77, 0x1c, 0xa4, 0x48, 0x5c, 0x21, 0xa6, 0x49, 0xf7, 0x15, 0x5a, 0xb5, 0xba, 0x9b, 0x5c, 0xf6, 0xe7, 0x8e, + 0x93, 0xb5, 0xde, 0x86, 0xbb, 0xd8, 0xcf, 0xaa, 0x1d, 0xd2, 0x51, 0x03, 0xf8, 0xd2, 0xaf, 0x0c, 0x74, 0x7a, 0x9a, + 0xc2, 0x77, 0x25, 0x96, 0x4d, 0x08, 0x98, 0x3b, 0x28, 0xec, 0x2c, 0x90, 0x04, 0x2b, 0x9c, 0x38, 0x96, 0x77, 0x58, + 0x93, 0x17, 0xfa, 0x7a, 0x1c, 0x19, 0x18, 0x98, 0xb2, 0x27, 0x11, 0x61, 0xef, 0x2c, 0x52, 0x34, 0x6b, 0x19, 0xde, + 0x32, 0xd1, 0x93, 0x0f}; // Backwards compatibility alias #define INDEX_GZ INDEX_BR From 37a0cec53dc0e4e9d9c0c5848e220b6d8480964d Mon Sep 17 00:00:00 2001 From: Szpadel Date: Wed, 25 Feb 2026 17:12:03 +0100 Subject: [PATCH 057/147] [ac_dimmer] Use a shared ESP32 GPTimer for multiple dimmers (#13523) Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> --- esphome/components/ac_dimmer/ac_dimmer.cpp | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/esphome/components/ac_dimmer/ac_dimmer.cpp b/esphome/components/ac_dimmer/ac_dimmer.cpp index 1e850a18fe..f731a8c753 100644 --- a/esphome/components/ac_dimmer/ac_dimmer.cpp +++ b/esphome/components/ac_dimmer/ac_dimmer.cpp @@ -199,12 +199,19 @@ void AcDimmer::setup() { setTimer1Callback(&timer_interrupt); #endif #ifdef USE_ESP32 - dimmer_timer = timer_begin(TIMER_FREQUENCY_HZ); - timer_attach_interrupt(dimmer_timer, &AcDimmerDataStore::s_timer_intr); - // For ESP32, we can't use dynamic interval calculation because the timerX functions - // are not callable from ISR (placed in flash storage). - // Here we just use an interrupt firing every 50 µs. - timer_alarm(dimmer_timer, TIMER_INTERVAL_US, true, 0); + if (dimmer_timer == nullptr) { + dimmer_timer = timer_begin(TIMER_FREQUENCY_HZ); + if (dimmer_timer == nullptr) { + ESP_LOGE(TAG, "Failed to create GPTimer for AC dimmer"); + this->mark_failed(); + return; + } + timer_attach_interrupt(dimmer_timer, &AcDimmerDataStore::s_timer_intr); + // For ESP32, we can't use dynamic interval calculation because the timerX functions + // are not callable from ISR (placed in flash storage). + // Here we just use an interrupt firing every 50 µs. + timer_alarm(dimmer_timer, TIMER_INTERVAL_US, true, 0); + } #endif } From ede8235aaee8467be33dd33fd8c25c39957063e3 Mon Sep 17 00:00:00 2001 From: Thomas Rupprecht Date: Wed, 25 Feb 2026 17:46:28 +0100 Subject: [PATCH 058/147] [core] more accurate check for leap year and valid day_of_month (#14197) Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- esphome/core/time.cpp | 2 +- esphome/core/time.h | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/esphome/core/time.cpp b/esphome/core/time.cpp index 554431c631..1aea18ac8d 100644 --- a/esphome/core/time.cpp +++ b/esphome/core/time.cpp @@ -8,7 +8,7 @@ namespace esphome { uint8_t days_in_month(uint8_t month, uint16_t year) { static const uint8_t DAYS_IN_MONTH[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; - if (month == 2 && (year % 4 == 0)) + if (month == 2 && (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)) return 29; return DAYS_IN_MONTH[month]; } diff --git a/esphome/core/time.h b/esphome/core/time.h index 87ebb5c221..d9ce86131c 100644 --- a/esphome/core/time.h +++ b/esphome/core/time.h @@ -70,14 +70,14 @@ struct ESPTime { /// @copydoc strftime(const std::string &format) std::string strftime(const char *format); - /// Check if this ESPTime is valid (all fields in range and year is greater than 2018) + /// Check if this ESPTime is valid (all fields in range and year is greater than or equal to 2019) bool is_valid() const { return this->year >= 2019 && this->fields_in_range(); } /// Check if all time fields of this ESPTime are in range. bool fields_in_range() const { return this->second < 61 && this->minute < 60 && this->hour < 24 && this->day_of_week > 0 && - this->day_of_week < 8 && this->day_of_month > 0 && this->day_of_month < 32 && this->day_of_year > 0 && - this->day_of_year < 367 && this->month > 0 && this->month < 13; + this->day_of_week < 8 && this->day_of_year > 0 && this->day_of_year < 367 && this->month > 0 && + this->month < 13 && this->day_of_month > 0 && this->day_of_month <= days_in_month(this->month, this->year); } /** Convert a string to ESPTime struct as specified by the format argument. From 8bb577de644243c3822305d3720ddaec8b9864c6 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 25 Feb 2026 12:23:13 -0600 Subject: [PATCH 059/147] [api] Split ProtoVarInt::parse into 32-bit and 64-bit phases (#14039) --- esphome/components/api/api_pb2.h | 1 - esphome/components/api/api_pb2_defines.h | 12 ++ esphome/components/api/proto.cpp | 17 +++ esphome/components/api/proto.h | 70 ++++++---- esphome/core/defines.h | 1 + script/api_protobuf/api_protobuf.py | 65 +++++++++- .../fixtures/varint_five_byte_device_id.yaml | 47 +++++++ .../test_varint_five_byte_device_id.py | 120 ++++++++++++++++++ 8 files changed, 301 insertions(+), 32 deletions(-) create mode 100644 esphome/components/api/api_pb2_defines.h create mode 100644 tests/integration/fixtures/varint_five_byte_device_id.yaml create mode 100644 tests/integration/test_varint_five_byte_device_id.py diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h index c90873d993..c2675cefe4 100644 --- a/esphome/components/api/api_pb2.h +++ b/esphome/components/api/api_pb2.h @@ -2,7 +2,6 @@ // See script/api_protobuf/api_protobuf.py #pragma once -#include "esphome/core/defines.h" #include "esphome/core/string_ref.h" #include "proto.h" diff --git a/esphome/components/api/api_pb2_defines.h b/esphome/components/api/api_pb2_defines.h new file mode 100644 index 0000000000..8ebd60fb5d --- /dev/null +++ b/esphome/components/api/api_pb2_defines.h @@ -0,0 +1,12 @@ +// This file was automatically generated with a tool. +// See script/api_protobuf/api_protobuf.py +#pragma once + +#include "esphome/core/defines.h" +#ifdef USE_BLUETOOTH_PROXY +#ifndef USE_API_VARINT64 +#define USE_API_VARINT64 +#endif +#endif + +namespace esphome::api {} // namespace esphome::api diff --git a/esphome/components/api/proto.cpp b/esphome/components/api/proto.cpp index 73a3bab12a..a252907fd7 100644 --- a/esphome/components/api/proto.cpp +++ b/esphome/components/api/proto.cpp @@ -7,6 +7,23 @@ namespace esphome::api { static const char *const TAG = "api.proto"; +#ifdef USE_API_VARINT64 +optional ProtoVarInt::parse_wide(const uint8_t *buffer, uint32_t len, uint32_t *consumed, + uint32_t result32) { + uint64_t result64 = result32; + uint32_t limit = std::min(len, uint32_t(10)); + for (uint32_t i = 4; i < limit; i++) { + uint8_t val = buffer[i]; + result64 |= uint64_t(val & 0x7F) << (i * 7); + if ((val & 0x80) == 0) { + *consumed = i + 1; + return ProtoVarInt(result64); + } + } + return {}; +} +#endif + uint32_t ProtoDecodableMessage::count_repeated_field(const uint8_t *buffer, size_t length, uint32_t target_field_id) { uint32_t count = 0; const uint8_t *ptr = buffer; diff --git a/esphome/components/api/proto.h b/esphome/components/api/proto.h index 4522fc9665..c34f7744e6 100644 --- a/esphome/components/api/proto.h +++ b/esphome/components/api/proto.h @@ -1,5 +1,6 @@ #pragma once +#include "api_pb2_defines.h" #include "esphome/core/component.h" #include "esphome/core/helpers.h" #include "esphome/core/log.h" @@ -110,59 +111,78 @@ class ProtoVarInt { #endif if (len == 0) return {}; - - // Most common case: single-byte varint (values 0-127) + // Fast path: single-byte varints (0-127) are the most common case + // (booleans, small enums, field tags). Avoid loop overhead entirely. if ((buffer[0] & 0x80) == 0) { *consumed = 1; return ProtoVarInt(buffer[0]); } - - // General case for multi-byte varints - // Since we know buffer[0]'s high bit is set, initialize with its value - uint64_t result = buffer[0] & 0x7F; - uint8_t bitpos = 7; - - // A 64-bit varint is at most 10 bytes (ceil(64/7)). Reject overlong encodings - // to avoid undefined behavior from shifting uint64_t by >= 64 bits. - uint32_t max_len = std::min(len, uint32_t(10)); - - // Start from the second byte since we've already processed the first - for (uint32_t i = 1; i < max_len; i++) { + // 32-bit phase: process remaining bytes with native 32-bit shifts. + // Without USE_API_VARINT64: cover bytes 1-4 (shifts 7, 14, 21, 28) — the uint32_t + // shift at byte 4 (shift by 28) may lose bits 32-34, but those are always zero for valid uint32 values. + // With USE_API_VARINT64: cover bytes 1-3 (shifts 7, 14, 21) so parse_wide handles + // byte 4+ with full 64-bit arithmetic (avoids truncating values > UINT32_MAX). + uint32_t result32 = buffer[0] & 0x7F; +#ifdef USE_API_VARINT64 + uint32_t limit = std::min(len, uint32_t(4)); +#else + uint32_t limit = std::min(len, uint32_t(5)); +#endif + for (uint32_t i = 1; i < limit; i++) { uint8_t val = buffer[i]; - result |= uint64_t(val & 0x7F) << uint64_t(bitpos); - bitpos += 7; + result32 |= uint32_t(val & 0x7F) << (i * 7); if ((val & 0x80) == 0) { *consumed = i + 1; - return ProtoVarInt(result); + return ProtoVarInt(result32); } } - - return {}; // Incomplete or invalid varint + // 64-bit phase for remaining bytes (BLE addresses etc.) +#ifdef USE_API_VARINT64 + return parse_wide(buffer, len, consumed, result32); +#else + return {}; +#endif } +#ifdef USE_API_VARINT64 + protected: + /// Continue parsing varint bytes 4-9 with 64-bit arithmetic. + /// Separated to keep 64-bit shift code (__ashldi3 on 32-bit platforms) out of the common path. + static optional parse_wide(const uint8_t *buffer, uint32_t len, uint32_t *consumed, uint32_t result32) + __attribute__((noinline)); + + public: +#endif + constexpr uint16_t as_uint16() const { return this->value_; } constexpr uint32_t as_uint32() const { return this->value_; } - constexpr uint64_t as_uint64() const { return this->value_; } constexpr bool as_bool() const { return this->value_; } constexpr int32_t as_int32() const { // Not ZigZag encoded - return static_cast(this->as_int64()); - } - constexpr int64_t as_int64() const { - // Not ZigZag encoded - return static_cast(this->value_); + return static_cast(this->value_); } constexpr int32_t as_sint32() const { // with ZigZag encoding return decode_zigzag32(static_cast(this->value_)); } +#ifdef USE_API_VARINT64 + constexpr uint64_t as_uint64() const { return this->value_; } + constexpr int64_t as_int64() const { + // Not ZigZag encoded + return static_cast(this->value_); + } constexpr int64_t as_sint64() const { // with ZigZag encoding return decode_zigzag64(this->value_); } +#endif protected: +#ifdef USE_API_VARINT64 uint64_t value_; +#else + uint32_t value_; +#endif }; // Forward declarations for decode_to_message, encode_message and encode_packed_sint32 diff --git a/esphome/core/defines.h b/esphome/core/defines.h index a1e3d1707f..673aa246fe 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -144,6 +144,7 @@ #define USE_API_HOMEASSISTANT_SERVICES #define USE_API_HOMEASSISTANT_STATES #define USE_API_NOISE +#define USE_API_VARINT64 #define USE_API_PLAINTEXT #define USE_API_USER_DEFINED_ACTIONS #define USE_API_CUSTOM_SERVICES diff --git a/script/api_protobuf/api_protobuf.py b/script/api_protobuf/api_protobuf.py index cc881caa5c..350947a8d6 100755 --- a/script/api_protobuf/api_protobuf.py +++ b/script/api_protobuf/api_protobuf.py @@ -1913,6 +1913,37 @@ def build_type_usage_map( ) +def get_varint64_ifdef( + file_desc: descriptor.FileDescriptorProto, + message_ifdef_map: dict[str, str | None], +) -> tuple[bool, str | None]: + """Check if 64-bit varint fields exist and get their common ifdef guard. + + Returns: + (has_varint64, ifdef_guard) - has_varint64 is True if any fields exist, + ifdef_guard is the common guard or None if unconditional. + """ + varint64_types = { + FieldDescriptorProto.TYPE_INT64, + FieldDescriptorProto.TYPE_UINT64, + FieldDescriptorProto.TYPE_SINT64, + } + ifdefs: set[str | None] = { + message_ifdef_map.get(msg.name) + for msg in file_desc.message_type + if not msg.options.deprecated + for field in msg.field + if not field.options.deprecated and field.type in varint64_types + } + if not ifdefs: + return False, None + if None in ifdefs: + # At least one 64-bit varint field is unconditional, so the guard must be unconditional. + return True, None + ifdefs.discard(None) + return True, ifdefs.pop() if len(ifdefs) == 1 else None + + def build_enum_type(desc, enum_ifdef_map) -> tuple[str, str, str]: """Builds the enum type. @@ -2567,11 +2598,38 @@ def main() -> None: file = d.file[0] + # Build dynamic ifdef mappings early so we can emit USE_API_VARINT64 before includes + enum_ifdef_map, message_ifdef_map, message_source_map, used_messages = ( + build_type_usage_map(file) + ) + + # Find the ifdef guard for 64-bit varint fields (int64/uint64/sint64). + # Generated into api_pb2_defines.h so proto.h can include it, ensuring + # consistent ProtoVarInt layout across all translation units. + has_varint64, varint64_guard = get_varint64_ifdef(file, message_ifdef_map) + + # Generate api_pb2_defines.h — included by proto.h to ensure all translation + # units see USE_API_VARINT64 consistently (avoids ODR violations in ProtoVarInt). + defines_content = FILE_HEADER + defines_content += "#pragma once\n\n" + defines_content += '#include "esphome/core/defines.h"\n' + if has_varint64: + lines = [ + "#ifndef USE_API_VARINT64", + "#define USE_API_VARINT64", + "#endif", + ] + defines_content += "\n".join(wrap_with_ifdef(lines, varint64_guard)) + defines_content += "\n" + defines_content += "\nnamespace esphome::api {} // namespace esphome::api\n" + + with open(root / "api_pb2_defines.h", "w", encoding="utf-8") as f: + f.write(defines_content) + content = FILE_HEADER content += """\ #pragma once -#include "esphome/core/defines.h" #include "esphome/core/string_ref.h" #include "proto.h" @@ -2702,11 +2760,6 @@ static void dump_bytes_field(DumpBuffer &out, const char *field_name, const uint content += "namespace enums {\n\n" - # Build dynamic ifdef mappings for both enums and messages - enum_ifdef_map, message_ifdef_map, message_source_map, used_messages = ( - build_type_usage_map(file) - ) - # Simple grouping of enums by ifdef current_ifdef = None diff --git a/tests/integration/fixtures/varint_five_byte_device_id.yaml b/tests/integration/fixtures/varint_five_byte_device_id.yaml new file mode 100644 index 0000000000..08259869ca --- /dev/null +++ b/tests/integration/fixtures/varint_five_byte_device_id.yaml @@ -0,0 +1,47 @@ +esphome: + name: varint-5byte-test + # Define areas and devices - device_ids will be FNV hashes > 2^28, + # requiring 5-byte varint encoding that exercises the 32-bit parse boundary. + areas: + - id: test_area + name: Test Area + devices: + - id: sub_device_one + name: Sub Device One + area_id: test_area + - id: sub_device_two + name: Sub Device Two + area_id: test_area + +host: +api: +logger: + +# Switches on sub-devices so we can send commands with large device_id varints +switch: + - platform: template + name: Device Switch + device_id: sub_device_one + id: device_switch_one + optimistic: true + turn_on_action: + - logger.log: "Switch one on" + turn_off_action: + - logger.log: "Switch one off" + + - platform: template + name: Device Switch + device_id: sub_device_two + id: device_switch_two + optimistic: true + turn_on_action: + - logger.log: "Switch two on" + turn_off_action: + - logger.log: "Switch two off" + +sensor: + - platform: template + name: Device Sensor + device_id: sub_device_one + lambda: return 42.0; + update_interval: 0.1s diff --git a/tests/integration/test_varint_five_byte_device_id.py b/tests/integration/test_varint_five_byte_device_id.py new file mode 100644 index 0000000000..d34c2f03d6 --- /dev/null +++ b/tests/integration/test_varint_five_byte_device_id.py @@ -0,0 +1,120 @@ +"""Integration test for 5-byte varint parsing of device_id fields. + +Device IDs are FNV hashes (uint32) that frequently exceed 2^28 (268435456), +requiring 5 varint bytes. This test verifies that: +1. The firmware correctly decodes 5-byte varint device_id in incoming commands +2. The firmware correctly encodes large device_id values in state responses +3. Switch commands with large device_id reach the correct entity +""" + +from __future__ import annotations + +import asyncio + +from aioesphomeapi import EntityState, SwitchInfo, SwitchState +import pytest + +from .types import APIClientConnectedFactory, RunCompiledFunction + + +@pytest.mark.asyncio +async def test_varint_five_byte_device_id( + yaml_config: str, + run_compiled: RunCompiledFunction, + api_client_connected: APIClientConnectedFactory, +) -> None: + """Test that device_id values requiring 5-byte varints parse correctly.""" + async with run_compiled(yaml_config), api_client_connected() as client: + device_info = await client.device_info() + devices = device_info.devices + assert len(devices) >= 2, f"Expected at least 2 devices, got {len(devices)}" + + # Verify at least one device_id exceeds the 4-byte varint boundary (2^28) + large_ids = [d for d in devices if d.device_id >= (1 << 28)] + assert len(large_ids) > 0, ( + "Expected at least one device_id >= 2^28 to exercise 5-byte varint path. " + f"Got device_ids: {[d.device_id for d in devices]}" + ) + + # Get entities + all_entities, _ = await client.list_entities_services() + switch_entities = [e for e in all_entities if isinstance(e, SwitchInfo)] + + # Find switches named "Device Switch" — one per sub-device + device_switches = [e for e in switch_entities if e.name == "Device Switch"] + assert len(device_switches) == 2, ( + f"Expected 2 'Device Switch' entities, got {len(device_switches)}" + ) + + # Verify switches have different device_ids matching the sub-devices + switch_device_ids = {s.device_id for s in device_switches} + assert len(switch_device_ids) == 2, "Switches should have different device_ids" + + # Subscribe to states and wait for initial states + loop = asyncio.get_running_loop() + states: dict[tuple[int, int], EntityState] = {} + switch_futures: dict[tuple[int, int], asyncio.Future[EntityState]] = {} + initial_done: asyncio.Future[bool] = loop.create_future() + + def on_state(state: EntityState) -> None: + key = (state.device_id, state.key) + states[key] = state + + if len(states) >= 3 and not initial_done.done(): + initial_done.set_result(True) + + if initial_done.done() and key in switch_futures: + fut = switch_futures[key] + if not fut.done() and isinstance(state, SwitchState): + fut.set_result(state) + + client.subscribe_states(on_state) + + try: + await asyncio.wait_for(initial_done, timeout=10.0) + except TimeoutError: + pytest.fail( + f"Timed out waiting for initial states. Got {len(states)} states" + ) + + # Verify state responses contain correct large device_id values + for device in devices: + device_states = [ + s for (did, _), s in states.items() if did == device.device_id + ] + assert len(device_states) > 0, ( + f"No states received for device '{device.name}' " + f"(device_id={device.device_id})" + ) + + # Test switch commands with large device_id varints — + # this is the critical path: the client encodes device_id as a varint + # in the SwitchCommandRequest, and the firmware must decode it correctly. + for switch in device_switches: + state_key = (switch.device_id, switch.key) + + # Turn on + switch_futures[state_key] = loop.create_future() + client.switch_command(switch.key, True, device_id=switch.device_id) + try: + await asyncio.wait_for(switch_futures[state_key], timeout=2.0) + except TimeoutError: + pytest.fail( + f"Timed out waiting for switch ON state " + f"(device_id={switch.device_id}, key={switch.key}). " + f"This likely means the firmware failed to decode the " + f"5-byte varint device_id in SwitchCommandRequest." + ) + assert states[state_key].state is True + + # Turn off + switch_futures[state_key] = loop.create_future() + client.switch_command(switch.key, False, device_id=switch.device_id) + try: + await asyncio.wait_for(switch_futures[state_key], timeout=2.0) + except TimeoutError: + pytest.fail( + f"Timed out waiting for switch OFF state " + f"(device_id={switch.device_id}, key={switch.key})" + ) + assert states[state_key].state is False From 62da60df477d3efcf9fcb80de6978b7ff44749f9 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:19:20 -0500 Subject: [PATCH 060/147] [ld2420] Fix sizeof vs value bug in register memcpy (#14286) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/ld2420/ld2420.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esphome/components/ld2420/ld2420.cpp b/esphome/components/ld2420/ld2420.cpp index cf78a1a460..b653f4ae88 100644 --- a/esphome/components/ld2420/ld2420.cpp +++ b/esphome/components/ld2420/ld2420.cpp @@ -590,7 +590,7 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) { for (uint16_t index = 0; index < (CMD_REG_DATA_REPLY_SIZE * // NOLINT ((buffer[CMD_FRAME_DATA_LENGTH] - 4) / CMD_REG_DATA_REPLY_SIZE)); index += CMD_REG_DATA_REPLY_SIZE) { - memcpy(&this->cmd_reply_.data[reg_element], &buffer[data_pos + index], sizeof(CMD_REG_DATA_REPLY_SIZE)); + memcpy(&this->cmd_reply_.data[reg_element], &buffer[data_pos + index], CMD_REG_DATA_REPLY_SIZE); byteswap(this->cmd_reply_.data[reg_element]); reg_element++; } @@ -729,9 +729,9 @@ void LD2420Component::set_reg_value(uint16_t reg, uint16_t value) { cmd_frame.data_length = 0; cmd_frame.header = CMD_FRAME_HEADER; cmd_frame.command = CMD_WRITE_REGISTER; - memcpy(&cmd_frame.data[cmd_frame.data_length], ®, sizeof(CMD_REG_DATA_REPLY_SIZE)); + memcpy(&cmd_frame.data[cmd_frame.data_length], ®, CMD_REG_DATA_REPLY_SIZE); cmd_frame.data_length += 2; - memcpy(&cmd_frame.data[cmd_frame.data_length], &value, sizeof(CMD_REG_DATA_REPLY_SIZE)); + memcpy(&cmd_frame.data[cmd_frame.data_length], &value, CMD_REG_DATA_REPLY_SIZE); cmd_frame.data_length += 2; cmd_frame.footer = CMD_FRAME_FOOTER; ESP_LOGV(TAG, "Sending write register %4X command: %2X data = %4X", reg, cmd_frame.command, value); From e601162cdd0500581cb838b8fd588fca3e3bba8e Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:21:00 -0500 Subject: [PATCH 061/147] [lcd_base] Fix millis() truncation to uint8_t (#14289) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/lcd_base/lcd_display.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/lcd_base/lcd_display.cpp b/esphome/components/lcd_base/lcd_display.cpp index d3434cce10..cd08a739eb 100644 --- a/esphome/components/lcd_base/lcd_display.cpp +++ b/esphome/components/lcd_base/lcd_display.cpp @@ -45,7 +45,7 @@ void LCDDisplay::setup() { // TODO dotsize // Commands can only be sent 40ms after boot-up, so let's wait if we're close - const uint8_t now = millis(); + const uint32_t now = millis(); if (now < 40) delay(40u - now); From df77213f2cb21a31e62ff0a9570d7af73e8f431b Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:27:00 -0500 Subject: [PATCH 062/147] [shelly_dimmer] Fix millis overflow in ACK timeout check (#14288) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/shelly_dimmer/stm32flash.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/shelly_dimmer/stm32flash.cpp b/esphome/components/shelly_dimmer/stm32flash.cpp index b052c0cee9..a1a933bcab 100644 --- a/esphome/components/shelly_dimmer/stm32flash.cpp +++ b/esphome/components/shelly_dimmer/stm32flash.cpp @@ -149,7 +149,7 @@ stm32_err_t stm32_get_ack_timeout(const stm32_unique_ptr &stm, uint32_t timeout) do { yield(); if (!stream->available()) { - if (millis() < start_time + timeout) + if (millis() - start_time < timeout) continue; ESP_LOGD(TAG, "Failed to read ACK timeout=%i", timeout); return STM32_ERR_UNKNOWN; @@ -212,7 +212,7 @@ stm32_err_t stm32_resync(const stm32_unique_ptr &stm) { static_assert(sizeof(buf) == BUFFER_SIZE, "Buf expected to be 2 bytes"); uint8_t ack; - while (t1 < t0 + STM32_RESYNC_TIMEOUT) { + while (t1 - t0 < STM32_RESYNC_TIMEOUT) { stream->write_array(buf, BUFFER_SIZE); stream->flush(); if (!stream->read_array(&ack, 1)) { From 3f558f63d8fec863d51e05e44a8dcee406d278c1 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:28:47 -0500 Subject: [PATCH 063/147] [bl0942] Fix millis overflow in packet timeout check (#14285) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/bl0942/bl0942.cpp | 8 ++++---- esphome/components/bl0942/bl0942.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/esphome/components/bl0942/bl0942.cpp b/esphome/components/bl0942/bl0942.cpp index b408c5549c..16ad33141d 100644 --- a/esphome/components/bl0942/bl0942.cpp +++ b/esphome/components/bl0942/bl0942.cpp @@ -52,12 +52,12 @@ void BL0942::loop() { return; } if (avail < sizeof(buffer)) { - if (!this->rx_start_) { + if (!this->rx_start_.has_value()) { this->rx_start_ = millis(); - } else if (millis() > this->rx_start_ + PKT_TIMEOUT_MS) { + } else if (millis() - *this->rx_start_ > PKT_TIMEOUT_MS) { ESP_LOGW(TAG, "Junk on wire. Throwing away partial message (%zu bytes)", avail); this->read_array((uint8_t *) &buffer, avail); - this->rx_start_ = 0; + this->rx_start_.reset(); } return; } @@ -67,7 +67,7 @@ void BL0942::loop() { this->received_package_(&buffer); } } - this->rx_start_ = 0; + this->rx_start_.reset(); } bool BL0942::validate_checksum_(DataPacket *data) { diff --git a/esphome/components/bl0942/bl0942.h b/esphome/components/bl0942/bl0942.h index 10b29a72c6..3c013f86e7 100644 --- a/esphome/components/bl0942/bl0942.h +++ b/esphome/components/bl0942/bl0942.h @@ -140,7 +140,7 @@ class BL0942 : public PollingComponent, public uart::UARTDevice { uint8_t address_ = 0; bool reset_ = false; LineFrequency line_freq_ = LINE_FREQUENCY_50HZ; - uint32_t rx_start_ = 0; + optional rx_start_{}; uint32_t prev_cf_cnt_ = 0; bool validate_checksum_(DataPacket *data); From d1a636a5c3227d08eed01f704e26f172394eba64 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:34:38 -0500 Subject: [PATCH 064/147] [rtttl] Fix speaker playback bugs (#14280) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/rtttl/rtttl.cpp | 21 +++++++++++---------- esphome/components/rtttl/rtttl.h | 6 +++--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/esphome/components/rtttl/rtttl.cpp b/esphome/components/rtttl/rtttl.cpp index 6e86405b74..ab95067f45 100644 --- a/esphome/components/rtttl/rtttl.cpp +++ b/esphome/components/rtttl/rtttl.cpp @@ -139,9 +139,10 @@ void Rtttl::loop() { x++; } if (x > 0) { - int send = this->speaker_->play((uint8_t *) (&sample), x * 2); - if (send != x * 4) { - this->samples_sent_ -= (x - (send / 2)); + size_t bytes_to_send = x * sizeof(SpeakerSample); + size_t send = this->speaker_->play((uint8_t *) (&sample), bytes_to_send); + if (send != bytes_to_send) { + this->samples_sent_ -= (x - (send / sizeof(SpeakerSample))); } return; } @@ -201,9 +202,9 @@ void Rtttl::loop() { bool need_note_gap = false; if (note) { auto note_index = (scale - 4) * 12 + note; - if (note_index < 0 || note_index >= (int) sizeof(NOTES)) { + if (note_index < 0 || note_index >= (int) (sizeof(NOTES) / sizeof(NOTES[0]))) { ESP_LOGE(TAG, "Note out of range (note: %d, scale: %d, index: %d, max: %d)", note, scale, note_index, - (int) sizeof(NOTES)); + (int) (sizeof(NOTES) / sizeof(NOTES[0]))); this->finish_(); return; } @@ -221,7 +222,7 @@ void Rtttl::loop() { #ifdef USE_OUTPUT if (this->output_ != nullptr) { - if (need_note_gap) { + if (need_note_gap && this->note_duration_ > DOUBLE_NOTE_GAP_MS) { this->output_->set_level(0.0); delay(DOUBLE_NOTE_GAP_MS); this->note_duration_ -= DOUBLE_NOTE_GAP_MS; @@ -240,9 +241,9 @@ void Rtttl::loop() { this->samples_sent_ = 0; this->samples_gap_ = 0; this->samples_per_wave_ = 0; - this->samples_count_ = (this->sample_rate_ * this->note_duration_) / 1600; //(ms); + this->samples_count_ = (this->sample_rate_ * this->note_duration_) / 1000; if (need_note_gap) { - this->samples_gap_ = (this->sample_rate_ * DOUBLE_NOTE_GAP_MS) / 1600; //(ms); + this->samples_gap_ = (this->sample_rate_ * DOUBLE_NOTE_GAP_MS) / 1000; } if (this->output_freq_ != 0) { // make sure there is enough samples to add a full last sinus. @@ -279,7 +280,7 @@ void Rtttl::play(std::string rtttl) { this->note_duration_ = 0; int bpm = 63; - uint8_t num; + uint16_t num; // Get name this->position_ = this->rtttl_.find(':'); @@ -395,7 +396,7 @@ void Rtttl::finish_() { sample[0].right = 0; sample[1].left = 0; sample[1].right = 0; - this->speaker_->play((uint8_t *) (&sample), 8); + this->speaker_->play((uint8_t *) (&sample), sizeof(sample)); this->speaker_->finish(); this->set_state_(State::STOPPING); } diff --git a/esphome/components/rtttl/rtttl.h b/esphome/components/rtttl/rtttl.h index 6f5df07766..4d4a652c51 100644 --- a/esphome/components/rtttl/rtttl.h +++ b/esphome/components/rtttl/rtttl.h @@ -46,8 +46,8 @@ class Rtttl : public Component { } protected: - inline uint8_t get_integer_() { - uint8_t ret = 0; + inline uint16_t get_integer_() { + uint16_t ret = 0; while (isdigit(this->rtttl_[this->position_])) { ret = (ret * 10) + (this->rtttl_[this->position_++] - '0'); } @@ -87,7 +87,7 @@ class Rtttl : public Component { #ifdef USE_OUTPUT /// The output to write the sound to. - output::FloatOutput *output_; + output::FloatOutput *output_{nullptr}; #endif // USE_OUTPUT #ifdef USE_SPEAKER From 5dffceda59542cf5abca89415bc6944b94b97793 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:35:27 -0500 Subject: [PATCH 065/147] [hmc5883l] Fix wrong gain for 88uT range (#14281) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/hmc5883l/hmc5883l.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/hmc5883l/hmc5883l.cpp b/esphome/components/hmc5883l/hmc5883l.cpp index b62381a287..bee5282125 100644 --- a/esphome/components/hmc5883l/hmc5883l.cpp +++ b/esphome/components/hmc5883l/hmc5883l.cpp @@ -95,7 +95,7 @@ void HMC5883LComponent::update() { float mg_per_bit; switch (this->range_) { case HMC5883L_RANGE_88_UT: - mg_per_bit = 0.073f; + mg_per_bit = 0.73f; break; case HMC5883L_RANGE_130_UT: mg_per_bit = 0.92f; From d61e2f9c29543e19c79b6accaf94a47b11cf87ab Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:06:13 -0500 Subject: [PATCH 066/147] [light] Fix millis overflow in transition progress and flash timing (#14292) Co-authored-by: J. Nick Koston Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/light/light_transformer.h | 7 +++---- esphome/components/light/transformers.h | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/esphome/components/light/light_transformer.h b/esphome/components/light/light_transformer.h index 079c2d2ae0..b9535c834c 100644 --- a/esphome/components/light/light_transformer.h +++ b/esphome/components/light/light_transformer.h @@ -44,12 +44,11 @@ class LightTransformer { /// The progress of this transition, on a scale of 0 to 1. float get_progress_() { uint32_t now = esphome::millis(); - if (now < this->start_time_) - return 0.0f; - if (now >= this->start_time_ + this->length_) + uint32_t elapsed = now - this->start_time_; + if (elapsed >= this->length_) return 1.0f; - return clamp((now - this->start_time_) / float(this->length_), 0.0f, 1.0f); + return clamp(elapsed / float(this->length_), 0.0f, 1.0f); } uint32_t start_time_; diff --git a/esphome/components/light/transformers.h b/esphome/components/light/transformers.h index a26713b723..b6e5e08f2b 100644 --- a/esphome/components/light/transformers.h +++ b/esphome/components/light/transformers.h @@ -78,7 +78,7 @@ class LightFlashTransformer : public LightTransformer { optional apply() override { optional result = {}; - if (this->transformer_ == nullptr && millis() > this->start_time_ + this->length_ - this->transition_length_) { + if (this->transformer_ == nullptr && millis() - this->start_time_ > this->length_ - this->transition_length_) { // second transition back to start value this->transformer_ = this->state_.get_output()->create_default_transition(); this->transformer_->setup(this->state_.current_values, this->get_start_values(), this->transition_length_); From 3dcc9ab76537dc884dbc93924e5190fd12c14bef Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:08:04 -0500 Subject: [PATCH 067/147] [ble_presence] Fix millis overflow in presence timeout check (#14293) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/ble_presence/ble_presence_device.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/ble_presence/ble_presence_device.h b/esphome/components/ble_presence/ble_presence_device.h index 70ecc67c32..f2f0a3ed19 100644 --- a/esphome/components/ble_presence/ble_presence_device.h +++ b/esphome/components/ble_presence/ble_presence_device.h @@ -101,7 +101,7 @@ class BLEPresenceDevice : public binary_sensor::BinarySensorInitiallyOff, } void loop() override { - if (this->found_ && this->last_seen_ + this->timeout_ < millis()) + if (this->found_ && millis() - this->last_seen_ > this->timeout_) this->set_found_(false); } void dump_config() override; From a60e5c5c4f5b3871ac30633ed007f21bbbc24333 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:11:52 -0500 Subject: [PATCH 068/147] [lightwaverf] Fix millis overflow in send timeout check (#14294) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/lightwaverf/lightwaverf.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/esphome/components/lightwaverf/lightwaverf.cpp b/esphome/components/lightwaverf/lightwaverf.cpp index 2b44195c97..2c6a1ecf5b 100644 --- a/esphome/components/lightwaverf/lightwaverf.cpp +++ b/esphome/components/lightwaverf/lightwaverf.cpp @@ -31,13 +31,12 @@ void LightWaveRF::read_tx() { void LightWaveRF::send_rx(const std::vector &msg, uint8_t repeats, bool inverted, int u_sec) { this->lwtx_.lwtx_setup(pin_tx_, repeats, inverted, u_sec); - uint32_t timeout = 0; + uint32_t timeout = millis(); if (this->lwtx_.lwtx_free()) { this->lwtx_.lwtx_send(msg); - timeout = millis(); ESP_LOGD(TAG, "[%i] msg start", timeout); } - while (!this->lwtx_.lwtx_free() && millis() < (timeout + 1000)) { + while (!this->lwtx_.lwtx_free() && millis() - timeout < 1000) { delay(10); } timeout = millis() - timeout; From 2e167835ead5cc85d3507d0f262695ed112d5729 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 15:15:49 -0500 Subject: [PATCH 069/147] [pn532] Replace millis zero sentinel with optional (#14295) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/pn532/pn532.cpp | 8 ++++---- esphome/components/pn532/pn532.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/esphome/components/pn532/pn532.cpp b/esphome/components/pn532/pn532.cpp index 1ab0da3df7..199a44dacc 100644 --- a/esphome/components/pn532/pn532.cpp +++ b/esphome/components/pn532/pn532.cpp @@ -308,13 +308,13 @@ void PN532::send_nack_() { enum PN532ReadReady PN532::read_ready_(bool block) { if (this->rd_ready_ == READY) { if (block) { - this->rd_start_time_ = 0; + this->rd_start_time_.reset(); this->rd_ready_ = WOULDBLOCK; } return READY; } - if (!this->rd_start_time_) { + if (!this->rd_start_time_.has_value()) { this->rd_start_time_ = millis(); } @@ -324,7 +324,7 @@ enum PN532ReadReady PN532::read_ready_(bool block) { break; } - if (millis() - this->rd_start_time_ > 100) { + if (millis() - *this->rd_start_time_ > 100) { ESP_LOGV(TAG, "Timed out waiting for readiness from PN532!"); this->rd_ready_ = TIMEOUT; break; @@ -340,7 +340,7 @@ enum PN532ReadReady PN532::read_ready_(bool block) { auto rdy = this->rd_ready_; if (block || rdy == TIMEOUT) { - this->rd_start_time_ = 0; + this->rd_start_time_.reset(); this->rd_ready_ = WOULDBLOCK; } return rdy; diff --git a/esphome/components/pn532/pn532.h b/esphome/components/pn532/pn532.h index f98c0f9322..e57ecd8104 100644 --- a/esphome/components/pn532/pn532.h +++ b/esphome/components/pn532/pn532.h @@ -99,7 +99,7 @@ class PN532 : public PollingComponent { std::vector triggers_ontagremoved_; nfc::NfcTagUid current_uid_; nfc::NdefMessage *next_task_message_to_write_; - uint32_t rd_start_time_{0}; + optional rd_start_time_{}; enum PN532ReadReady rd_ready_ { WOULDBLOCK }; enum NfcTask { READ = 0, From 24fb74f78bce8d618f1a4e134c61aeded194956d Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 17:21:33 -0500 Subject: [PATCH 070/147] [ld2420] Fix buffer overflows in command response parsing (#14297) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/ld2420/ld2420.cpp | 39 ++++++++++++++-------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/esphome/components/ld2420/ld2420.cpp b/esphome/components/ld2420/ld2420.cpp index b653f4ae88..f14400d15a 100644 --- a/esphome/components/ld2420/ld2420.cpp +++ b/esphome/components/ld2420/ld2420.cpp @@ -560,8 +560,6 @@ void LD2420Component::read_batch_(std::span buffer) { void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) { this->cmd_reply_.command = buffer[CMD_FRAME_COMMAND]; this->cmd_reply_.length = buffer[CMD_FRAME_DATA_LENGTH]; - uint8_t reg_element = 0; - uint8_t data_element = 0; uint16_t data_pos = 0; if (this->cmd_reply_.length > CMD_MAX_BYTES) { ESP_LOGW(TAG, "Reply frame too long"); @@ -583,43 +581,44 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) { case (CMD_DISABLE_CONF): ESP_LOGV(TAG, "Set config disable: CMD = %2X %s", CMD_DISABLE_CONF, result); break; - case (CMD_READ_REGISTER): + case (CMD_READ_REGISTER): { ESP_LOGV(TAG, "Read register: CMD = %2X %s", CMD_READ_REGISTER, result); // TODO Read/Write register is not implemented yet, this will get flushed out to a proper header file data_pos = 0x0A; - for (uint16_t index = 0; index < (CMD_REG_DATA_REPLY_SIZE * // NOLINT - ((buffer[CMD_FRAME_DATA_LENGTH] - 4) / CMD_REG_DATA_REPLY_SIZE)); - index += CMD_REG_DATA_REPLY_SIZE) { - memcpy(&this->cmd_reply_.data[reg_element], &buffer[data_pos + index], CMD_REG_DATA_REPLY_SIZE); - byteswap(this->cmd_reply_.data[reg_element]); - reg_element++; + uint16_t reg_count = std::min((buffer[CMD_FRAME_DATA_LENGTH] - 4) / CMD_REG_DATA_REPLY_SIZE, + sizeof(this->cmd_reply_.data) / sizeof(this->cmd_reply_.data[0])); + for (uint16_t i = 0; i < reg_count; i++) { + memcpy(&this->cmd_reply_.data[i], &buffer[data_pos + i * CMD_REG_DATA_REPLY_SIZE], CMD_REG_DATA_REPLY_SIZE); } break; + } case (CMD_WRITE_REGISTER): ESP_LOGV(TAG, "Write register: CMD = %2X %s", CMD_WRITE_REGISTER, result); break; case (CMD_WRITE_ABD_PARAM): ESP_LOGV(TAG, "Write gate parameter(s): %2X %s", CMD_WRITE_ABD_PARAM, result); break; - case (CMD_READ_ABD_PARAM): + case (CMD_READ_ABD_PARAM): { ESP_LOGV(TAG, "Read gate parameter(s): %2X %s", CMD_READ_ABD_PARAM, result); data_pos = CMD_ABD_DATA_REPLY_START; - for (uint16_t index = 0; index < (CMD_ABD_DATA_REPLY_SIZE * // NOLINT - ((buffer[CMD_FRAME_DATA_LENGTH] - 4) / CMD_ABD_DATA_REPLY_SIZE)); - index += CMD_ABD_DATA_REPLY_SIZE) { - memcpy(&this->cmd_reply_.data[data_element], &buffer[data_pos + index], - sizeof(this->cmd_reply_.data[data_element])); - byteswap(this->cmd_reply_.data[data_element]); - data_element++; + uint16_t abd_count = std::min((buffer[CMD_FRAME_DATA_LENGTH] - 4) / CMD_ABD_DATA_REPLY_SIZE, + sizeof(this->cmd_reply_.data) / sizeof(this->cmd_reply_.data[0])); + for (uint16_t i = 0; i < abd_count; i++) { + memcpy(&this->cmd_reply_.data[i], &buffer[data_pos + i * CMD_ABD_DATA_REPLY_SIZE], + sizeof(this->cmd_reply_.data[i])); } break; + } case (CMD_WRITE_SYS_PARAM): ESP_LOGV(TAG, "Set system parameter(s): %2X %s", CMD_WRITE_SYS_PARAM, result); break; - case (CMD_READ_VERSION): - memcpy(this->firmware_ver_, &buffer[12], buffer[10]); - ESP_LOGV(TAG, "Firmware version: %7s %s", this->firmware_ver_, result); + case (CMD_READ_VERSION): { + uint8_t ver_len = std::min(buffer[10], sizeof(this->firmware_ver_) - 1); + memcpy(this->firmware_ver_, &buffer[12], ver_len); + this->firmware_ver_[ver_len] = '\0'; + ESP_LOGV(TAG, "Firmware version: %s %s", this->firmware_ver_, result); break; + } default: break; } From 23ef233b60de8bef361eb062cfa732321c9a4ceb Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 17:21:50 -0500 Subject: [PATCH 071/147] [gp8403] Fix enum size mismatch in voltage register write (#14296) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/gp8403/gp8403.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/gp8403/gp8403.h b/esphome/components/gp8403/gp8403.h index 972f2ce60c..a19df15515 100644 --- a/esphome/components/gp8403/gp8403.h +++ b/esphome/components/gp8403/gp8403.h @@ -6,12 +6,12 @@ namespace esphome { namespace gp8403 { -enum GP8403Voltage { +enum GP8403Voltage : uint8_t { GP8403_VOLTAGE_5V = 0x00, GP8403_VOLTAGE_10V = 0x11, }; -enum GP8403Model { +enum GP8403Model : uint8_t { GP8403, GP8413, }; From 0a81a7a50bc4b73f4075a20fb8c5a74b4ddc82f4 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:01:32 -0500 Subject: [PATCH 072/147] [mcp2515] Fix millis overflow in set_mode_ timeout (#14298) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/mcp2515/mcp2515.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/mcp2515/mcp2515.cpp b/esphome/components/mcp2515/mcp2515.cpp index 1a17715315..77bfaf9224 100644 --- a/esphome/components/mcp2515/mcp2515.cpp +++ b/esphome/components/mcp2515/mcp2515.cpp @@ -133,8 +133,8 @@ uint8_t MCP2515::get_status_() { canbus::Error MCP2515::set_mode_(const CanctrlReqopMode mode) { modify_register_(MCP_CANCTRL, CANCTRL_REQOP, mode); - uint32_t end_time = millis() + 10; - while (millis() < end_time) { + uint32_t start_time = millis(); + while (millis() - start_time < 10) { if ((read_register_(MCP_CANSTAT) & CANSTAT_OPMOD) == mode) return canbus::ERROR_OK; } From 534857db9c16b7ebfc62693291d4b7a56b91eb36 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 18:01:49 -0500 Subject: [PATCH 073/147] [wled] Fix millis overflow in blank timeout (#14300) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: J. Nick Koston --- esphome/components/wled/wled_light_effect.cpp | 21 +++++++++++-------- esphome/components/wled/wled_light_effect.h | 3 ++- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/esphome/components/wled/wled_light_effect.cpp b/esphome/components/wled/wled_light_effect.cpp index d26b7a1750..87bae5b1da 100644 --- a/esphome/components/wled/wled_light_effect.cpp +++ b/esphome/components/wled/wled_light_effect.cpp @@ -24,7 +24,7 @@ namespace wled { // https://github.com/Aircoookie/WLED/wiki/UDP-Realtime-Control enum Protocol { WLED_NOTIFIER = 0, WARLS = 1, DRGB = 2, DRGBW = 3, DNRGB = 4 }; -const int DEFAULT_BLANK_TIME = 1000; +constexpr uint32_t DEFAULT_BLANK_TIME = 1000; static const char *const TAG = "wled_light_effect"; @@ -34,9 +34,10 @@ void WLEDLightEffect::start() { AddressableLightEffect::start(); if (this->blank_on_start_) { - this->blank_at_ = 0; + this->blank_start_ = millis(); + this->blank_timeout_ = 0; } else { - this->blank_at_ = UINT32_MAX; + this->blank_start_.reset(); } } @@ -81,10 +82,10 @@ void WLEDLightEffect::apply(light::AddressableLight &it, const Color ¤t_co } } - // FIXME: Use roll-over safe arithmetic - if (blank_at_ < millis()) { + if (this->blank_start_.has_value() && millis() - *this->blank_start_ >= this->blank_timeout_) { blank_all_leds_(it); - blank_at_ = millis() + DEFAULT_BLANK_TIME; + this->blank_start_ = millis(); + this->blank_timeout_ = DEFAULT_BLANK_TIME; } } @@ -142,11 +143,13 @@ bool WLEDLightEffect::parse_frame_(light::AddressableLight &it, const uint8_t *p } if (timeout == UINT8_MAX) { - blank_at_ = UINT32_MAX; + this->blank_start_.reset(); } else if (timeout > 0) { - blank_at_ = millis() + timeout * 1000; + this->blank_start_ = millis(); + this->blank_timeout_ = timeout * 1000; } else { - blank_at_ = millis() + DEFAULT_BLANK_TIME; + this->blank_start_ = millis(); + this->blank_timeout_ = DEFAULT_BLANK_TIME; } it.schedule_show(); diff --git a/esphome/components/wled/wled_light_effect.h b/esphome/components/wled/wled_light_effect.h index 6da5f4e9f9..3f3b710611 100644 --- a/esphome/components/wled/wled_light_effect.h +++ b/esphome/components/wled/wled_light_effect.h @@ -35,7 +35,8 @@ class WLEDLightEffect : public light::AddressableLightEffect { uint16_t port_{0}; std::unique_ptr udp_; - uint32_t blank_at_{0}; + optional blank_start_{}; + uint32_t blank_timeout_{0}; uint32_t dropped_{0}; uint8_t sync_group_mask_{0}; bool blank_on_start_{true}; From 0d5b7df77d11b48ad58029adea4dfb88743e2932 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 19:32:02 -0500 Subject: [PATCH 074/147] [sensor] Fix delta filter percentage mode regression (#14302) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/sensor/__init__.py | 2 +- .../fixtures/sensor_filters_delta.yaml | 40 +++++++++++++++++++ .../integration/test_sensor_filters_delta.py | 27 ++++++++++++- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/esphome/components/sensor/__init__.py b/esphome/components/sensor/__init__.py index b0e0c28bda..770c044efb 100644 --- a/esphome/components/sensor/__init__.py +++ b/esphome/components/sensor/__init__.py @@ -603,7 +603,7 @@ DELTA_SCHEMA = cv.Any( def _get_delta(value): if isinstance(value, str): assert value.endswith("%") - return 0.0, float(value[:-1]) + return 0.0, float(value[:-1]) / 100.0 return value, 0.0 diff --git a/tests/integration/fixtures/sensor_filters_delta.yaml b/tests/integration/fixtures/sensor_filters_delta.yaml index 19bd2d5ca4..2494a430da 100644 --- a/tests/integration/fixtures/sensor_filters_delta.yaml +++ b/tests/integration/fixtures/sensor_filters_delta.yaml @@ -28,6 +28,11 @@ sensor: id: source_sensor_4 accuracy_decimals: 1 + - platform: template + name: "Source Sensor 5" + id: source_sensor_5 + accuracy_decimals: 1 + - platform: copy source_id: source_sensor_1 name: "Filter Min" @@ -69,6 +74,13 @@ sensor: filters: - delta: 0 + - platform: copy + source_id: source_sensor_5 + name: "Filter Percentage" + id: filter_percentage + filters: + - delta: 50% + script: - id: test_filter_min then: @@ -154,6 +166,28 @@ script: id: source_sensor_4 state: 2.0 + - id: test_filter_percentage + then: + - sensor.template.publish: + id: source_sensor_5 + state: 100.0 + - delay: 20ms + - sensor.template.publish: + id: source_sensor_5 + state: 120.0 # Filtered out (delta=20, need >50) + - delay: 20ms + - sensor.template.publish: + id: source_sensor_5 + state: 160.0 # Passes (delta=60 > 50% of 100=50) + - delay: 20ms + - sensor.template.publish: + id: source_sensor_5 + state: 200.0 # Filtered out (delta=40, need >50% of 160=80) + - delay: 20ms + - sensor.template.publish: + id: source_sensor_5 + state: 250.0 # Passes (delta=90 > 80) + button: - platform: template name: "Test Filter Min" @@ -178,3 +212,9 @@ button: id: btn_filter_zero_delta on_press: - script.execute: test_filter_zero_delta + + - platform: template + name: "Test Filter Percentage" + id: btn_filter_percentage + on_press: + - script.execute: test_filter_percentage diff --git a/tests/integration/test_sensor_filters_delta.py b/tests/integration/test_sensor_filters_delta.py index c7a26bf9d1..9d0114e0c4 100644 --- a/tests/integration/test_sensor_filters_delta.py +++ b/tests/integration/test_sensor_filters_delta.py @@ -24,12 +24,14 @@ async def test_sensor_filters_delta( "filter_max": [], "filter_baseline_max": [], "filter_zero_delta": [], + "filter_percentage": [], } filter_min_done = loop.create_future() filter_max_done = loop.create_future() filter_baseline_max_done = loop.create_future() filter_zero_delta_done = loop.create_future() + filter_percentage_done = loop.create_future() def on_state(state: EntityState) -> None: if not isinstance(state, SensorState) or state.missing_state: @@ -66,6 +68,12 @@ async def test_sensor_filters_delta( and not filter_zero_delta_done.done() ): filter_zero_delta_done.set_result(True) + elif ( + sensor_name == "filter_percentage" + and len(sensor_values[sensor_name]) == 3 + and not filter_percentage_done.done() + ): + filter_percentage_done.set_result(True) async with ( run_compiled(yaml_config), @@ -80,6 +88,7 @@ async def test_sensor_filters_delta( "filter_max": "Filter Max", "filter_baseline_max": "Filter Baseline Max", "filter_zero_delta": "Filter Zero Delta", + "filter_percentage": "Filter Percentage", }, ) @@ -98,13 +107,14 @@ async def test_sensor_filters_delta( "Test Filter Max": "filter_max", "Test Filter Baseline Max": "filter_baseline_max", "Test Filter Zero Delta": "filter_zero_delta", + "Test Filter Percentage": "filter_percentage", } buttons = {} for entity in entities: if isinstance(entity, ButtonInfo) and entity.name in button_name_map: buttons[button_name_map[entity.name]] = entity.key - assert len(buttons) == 4, f"Expected 3 buttons, found {len(buttons)}" + assert len(buttons) == 5, f"Expected 5 buttons, found {len(buttons)}" # Test 1: Min sensor_values["filter_min"].clear() @@ -161,3 +171,18 @@ async def test_sensor_filters_delta( assert sensor_values["filter_zero_delta"] == pytest.approx(expected), ( f"Test 4 failed: expected {expected}, got {sensor_values['filter_zero_delta']}" ) + + # Test 5: Percentage (delta: 50%) + sensor_values["filter_percentage"].clear() + client.button_command(buttons["filter_percentage"]) + try: + await asyncio.wait_for(filter_percentage_done, timeout=2.0) + except TimeoutError: + pytest.fail( + f"Test 5 timed out. Values: {sensor_values['filter_percentage']}" + ) + + expected = [100.0, 160.0, 250.0] + assert sensor_values["filter_percentage"] == pytest.approx(expected), ( + f"Test 5 failed: expected {expected}, got {sensor_values['filter_percentage']}" + ) From 19f4845185c5669d88c395e323f892fd6a0dbb2c Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Fri, 20 Feb 2026 16:06:46 -0500 Subject: [PATCH 075/147] [max7219digit] Fix typo in action names (#14162) Co-authored-by: Claude Opus 4.6 --- esphome/components/max7219digit/display.py | 22 +++++++++++----------- tests/components/max7219digit/common.yaml | 14 +++++++------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/esphome/components/max7219digit/display.py b/esphome/components/max7219digit/display.py index e6d53efc5d..a251eaccea 100644 --- a/esphome/components/max7219digit/display.py +++ b/esphome/components/max7219digit/display.py @@ -133,12 +133,12 @@ MAX7219_ON_ACTION_SCHEMA = automation.maybe_simple_id( @automation.register_action( - "max7129digit.invert_off", DisplayInvertAction, MAX7219_OFF_ACTION_SCHEMA + "max7219digit.invert_off", DisplayInvertAction, MAX7219_OFF_ACTION_SCHEMA ) @automation.register_action( - "max7129digit.invert_on", DisplayInvertAction, MAX7219_ON_ACTION_SCHEMA + "max7219digit.invert_on", DisplayInvertAction, MAX7219_ON_ACTION_SCHEMA ) -async def max7129digit_invert_to_code(config, action_id, template_arg, args): +async def max7219digit_invert_to_code(config, action_id, template_arg, args): var = cg.new_Pvariable(action_id, template_arg) await cg.register_parented(var, config[CONF_ID]) cg.add(var.set_state(config[CONF_STATE])) @@ -146,12 +146,12 @@ async def max7129digit_invert_to_code(config, action_id, template_arg, args): @automation.register_action( - "max7129digit.turn_off", DisplayVisibilityAction, MAX7219_OFF_ACTION_SCHEMA + "max7219digit.turn_off", DisplayVisibilityAction, MAX7219_OFF_ACTION_SCHEMA ) @automation.register_action( - "max7129digit.turn_on", DisplayVisibilityAction, MAX7219_ON_ACTION_SCHEMA + "max7219digit.turn_on", DisplayVisibilityAction, MAX7219_ON_ACTION_SCHEMA ) -async def max7129digit_visible_to_code(config, action_id, template_arg, args): +async def max7219digit_visible_to_code(config, action_id, template_arg, args): var = cg.new_Pvariable(action_id, template_arg) await cg.register_parented(var, config[CONF_ID]) cg.add(var.set_state(config[CONF_STATE])) @@ -159,12 +159,12 @@ async def max7129digit_visible_to_code(config, action_id, template_arg, args): @automation.register_action( - "max7129digit.reverse_off", DisplayReverseAction, MAX7219_OFF_ACTION_SCHEMA + "max7219digit.reverse_off", DisplayReverseAction, MAX7219_OFF_ACTION_SCHEMA ) @automation.register_action( - "max7129digit.reverse_on", DisplayReverseAction, MAX7219_ON_ACTION_SCHEMA + "max7219digit.reverse_on", DisplayReverseAction, MAX7219_ON_ACTION_SCHEMA ) -async def max7129digit_reverse_to_code(config, action_id, template_arg, args): +async def max7219digit_reverse_to_code(config, action_id, template_arg, args): var = cg.new_Pvariable(action_id, template_arg) await cg.register_parented(var, config[CONF_ID]) cg.add(var.set_state(config[CONF_STATE])) @@ -183,9 +183,9 @@ MAX7219_INTENSITY_SCHEMA = cv.maybe_simple_value( @automation.register_action( - "max7129digit.intensity", DisplayIntensityAction, MAX7219_INTENSITY_SCHEMA + "max7219digit.intensity", DisplayIntensityAction, MAX7219_INTENSITY_SCHEMA ) -async def max7129digit_intensity_to_code(config, action_id, template_arg, args): +async def max7219digit_intensity_to_code(config, action_id, template_arg, args): var = cg.new_Pvariable(action_id, template_arg) await cg.register_parented(var, config[CONF_ID]) template_ = await cg.templatable(config[CONF_INTENSITY], args, cg.uint8) diff --git a/tests/components/max7219digit/common.yaml b/tests/components/max7219digit/common.yaml index 525b7b8d3e..4d2dbb781d 100644 --- a/tests/components/max7219digit/common.yaml +++ b/tests/components/max7219digit/common.yaml @@ -13,10 +13,10 @@ esphome: on_boot: - priority: 100 then: - - max7129digit.invert_off: - - max7129digit.invert_on: - - max7129digit.turn_on: - - max7129digit.turn_off: - - max7129digit.reverse_on: - - max7129digit.reverse_off: - - max7129digit.intensity: 10 + - max7219digit.invert_off: + - max7219digit.invert_on: + - max7219digit.turn_on: + - max7219digit.turn_off: + - max7219digit.reverse_on: + - max7219digit.reverse_off: + - max7219digit.intensity: 10 From 0975755a9d13de364cb780abdc6bd854d7419b64 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Fri, 20 Feb 2026 22:51:13 -1000 Subject: [PATCH 076/147] [mipi_dsi] Disallow swap_xy (#14124) --- esphome/components/mipi_dsi/display.py | 26 +++++-------------- .../mipi_dsi/fixtures/mipi_dsi.yaml | 7 ++++- .../mipi_dsi/test_mipi_dsi_config.py | 6 +++-- 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/esphome/components/mipi_dsi/display.py b/esphome/components/mipi_dsi/display.py index c288b33cd2..de3791b3a4 100644 --- a/esphome/components/mipi_dsi/display.py +++ b/esphome/components/mipi_dsi/display.py @@ -87,38 +87,24 @@ COLOR_DEPTHS = { def model_schema(config): model = MODELS[config[CONF_MODEL].upper()] + model.defaults[CONF_SWAP_XY] = cv.UNDEFINED transform = cv.Schema( { cv.Required(CONF_MIRROR_X): cv.boolean, cv.Required(CONF_MIRROR_Y): cv.boolean, + cv.Optional(CONF_SWAP_XY): cv.invalid( + "Axis swapping not supported by DSI displays" + ), } ) - if model.get_default(CONF_SWAP_XY) != cv.UNDEFINED: - transform = transform.extend( - { - cv.Optional(CONF_SWAP_XY): cv.invalid( - "Axis swapping not supported by this model" - ) - } - ) - else: - transform = transform.extend( - { - cv.Required(CONF_SWAP_XY): cv.boolean, - } - ) # CUSTOM model will need to provide a custom init sequence iseqconf = ( cv.Required(CONF_INIT_SEQUENCE) if model.initsequence is None else cv.Optional(CONF_INIT_SEQUENCE) ) - swap_xy = config.get(CONF_TRANSFORM, {}).get(CONF_SWAP_XY, False) - - # Dimensions are optional if the model has a default width and the swap_xy transform is not overridden - cv_dimensions = ( - cv.Optional if model.get_default(CONF_WIDTH) and not swap_xy else cv.Required - ) + # Dimensions are optional if the model has a default width + cv_dimensions = cv.Optional if model.get_default(CONF_WIDTH) else cv.Required pixel_modes = (PIXEL_MODE_16BIT, PIXEL_MODE_24BIT, "16", "24") schema = display.FULL_DISPLAY_SCHEMA.extend( { diff --git a/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml b/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml index 7d1fc84121..6de2bd5a77 100644 --- a/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml +++ b/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml @@ -15,8 +15,13 @@ esp_ldo: display: - platform: mipi_dsi + id: p4_nano model: WAVESHARE-P4-NANO-10.1 - + rotation: 90 + - platform: mipi_dsi + id: p4_86 + model: "WAVESHARE-P4-86-PANEL" + rotation: 180 i2c: sda: GPIO7 scl: GPIO8 diff --git a/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py b/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py index f8a9af0279..d465a8c81b 100644 --- a/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py +++ b/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py @@ -119,9 +119,11 @@ def test_code_generation( main_cpp = generate_main(component_fixture_path("mipi_dsi.yaml")) assert ( - "mipi_dsi_mipi_dsi_id = new mipi_dsi::MIPI_DSI(800, 1280, display::COLOR_BITNESS_565, 16);" + "p4_nano = new mipi_dsi::MIPI_DSI(800, 1280, display::COLOR_BITNESS_565, 16);" in main_cpp ) assert "set_init_sequence({224, 1, 0, 225, 1, 147, 226, 1," in main_cpp - assert "mipi_dsi_mipi_dsi_id->set_lane_bit_rate(1500);" in main_cpp + assert "p4_nano->set_lane_bit_rate(1500);" in main_cpp + assert "p4_nano->set_rotation(display::DISPLAY_ROTATION_90_DEGREES);" in main_cpp + assert "p4_86->set_rotation(display::DISPLAY_ROTATION_0_DEGREES);" in main_cpp # assert "backlight_id = new light::LightState(mipi_dsi_dsibacklight_id);" in main_cpp From 1f5a35a99f599045a397d8df7316e4f1626fed74 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 21 Feb 2026 11:08:13 -0600 Subject: [PATCH 077/147] [dsmr] Add deprecated std::string overload for set_decryption_key (#14180) --- esphome/components/dsmr/dsmr.h | 3 +++ tests/components/dsmr/common.yaml | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/esphome/components/dsmr/dsmr.h b/esphome/components/dsmr/dsmr.h index fafcf62b87..dc81ba9b2a 100644 --- a/esphome/components/dsmr/dsmr.h +++ b/esphome/components/dsmr/dsmr.h @@ -64,6 +64,9 @@ class Dsmr : public Component, public uart::UARTDevice { void dump_config() override; void set_decryption_key(const char *decryption_key); + // Remove before 2026.8.0 + ESPDEPRECATED("Pass .c_str() - e.g. set_decryption_key(key.c_str()). Removed in 2026.8.0", "2026.2.0") + void set_decryption_key(const std::string &decryption_key) { this->set_decryption_key(decryption_key.c_str()); } void set_max_telegram_length(size_t length) { this->max_telegram_len_ = length; } void set_request_pin(GPIOPin *request_pin) { this->request_pin_ = request_pin; } void set_request_interval(uint32_t interval) { this->request_interval_ = interval; } diff --git a/tests/components/dsmr/common.yaml b/tests/components/dsmr/common.yaml index 038bf2806b..d11ce37d59 100644 --- a/tests/components/dsmr/common.yaml +++ b/tests/components/dsmr/common.yaml @@ -1,4 +1,13 @@ +esphome: + on_boot: + then: + - lambda: |- + // Test deprecated std::string overload still compiles + std::string key = "00112233445566778899aabbccddeeff"; + id(dsmr_instance).set_decryption_key(key); + dsmr: + id: dsmr_instance decryption_key: 00112233445566778899aabbccddeeff max_telegram_length: 1000 request_pin: ${request_pin} From 15e2a778d406ccdfdfcc8b6a39709d9ca84cadc4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 21 Feb 2026 13:54:20 -0600 Subject: [PATCH 078/147] [api] Fix build error when lambda returns StringRef in homeassistant.event data (#14187) --- esphome/components/api/homeassistant_service.h | 2 ++ tests/components/homeassistant/common.yaml | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/esphome/components/api/homeassistant_service.h b/esphome/components/api/homeassistant_service.h index 2322d96eef..340699e1a6 100644 --- a/esphome/components/api/homeassistant_service.h +++ b/esphome/components/api/homeassistant_service.h @@ -36,6 +36,8 @@ template class TemplatableStringValue : public TemplatableValue() {} diff --git a/tests/components/homeassistant/common.yaml b/tests/components/homeassistant/common.yaml index 9c6cb71b8b..60e3defd49 100644 --- a/tests/components/homeassistant/common.yaml +++ b/tests/components/homeassistant/common.yaml @@ -90,6 +90,19 @@ text_sensor: id: ha_hello_world_text2 attribute: some_attribute +event: + - platform: template + name: Test Event + id: test_event + event_types: + - test_event_type + on_event: + - homeassistant.event: + event: esphome.test_event + data: + event_name: !lambda |- + return event_type; + time: - platform: homeassistant on_time: From c5c6ce6b0e71a932621fbb5848cc3909fbe9634a Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 21 Feb 2026 13:54:43 -0600 Subject: [PATCH 079/147] [haier] Fix uninitialized HonSettings causing API connection failures (#14188) --- esphome/components/haier/hon_climate.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/esphome/components/haier/hon_climate.h b/esphome/components/haier/hon_climate.h index a567ab1d89..608d5e7f21 100644 --- a/esphome/components/haier/hon_climate.h +++ b/esphome/components/haier/hon_climate.h @@ -29,10 +29,10 @@ enum class CleaningState : uint8_t { enum class HonControlMethod { MONITOR_ONLY = 0, SET_GROUP_PARAMETERS, SET_SINGLE_PARAMETER }; struct HonSettings { - hon_protocol::VerticalSwingMode last_vertiacal_swing; - hon_protocol::HorizontalSwingMode last_horizontal_swing; - bool beeper_state; - bool quiet_mode_state; + hon_protocol::VerticalSwingMode last_vertiacal_swing{hon_protocol::VerticalSwingMode::CENTER}; + hon_protocol::HorizontalSwingMode last_horizontal_swing{hon_protocol::HorizontalSwingMode::CENTER}; + bool beeper_state{true}; + bool quiet_mode_state{false}; }; class HonClimate : public HaierClimateBase { @@ -189,7 +189,7 @@ class HonClimate : public HaierClimateBase { int big_data_sensors_{0}; esphome::optional current_vertical_swing_{}; esphome::optional current_horizontal_swing_{}; - HonSettings settings_; + HonSettings settings_{}; ESPPreferenceObject hon_rtc_; SwitchState quiet_mode_state_{SwitchState::OFF}; }; From 27fe866d5e5776317a3700cd98b00adf7e2fc52e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 21 Feb 2026 23:22:59 -0600 Subject: [PATCH 080/147] [bme68x_bsec2] Fix compilation on ESP32 Arduino (#14194) --- esphome/components/bme68x_bsec2/__init__.py | 5 ++++- tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml diff --git a/esphome/components/bme68x_bsec2/__init__.py b/esphome/components/bme68x_bsec2/__init__.py index e421efb2d6..4200b2f0b8 100644 --- a/esphome/components/bme68x_bsec2/__init__.py +++ b/esphome/components/bme68x_bsec2/__init__.py @@ -178,8 +178,11 @@ async def to_code_base(config): bsec2_arr = cg.progmem_array(config[CONF_RAW_DATA_ID], rhs) cg.add(var.set_bsec2_configuration(bsec2_arr, len(rhs))) - # Although this component does not use SPI, the BSEC2 Arduino library requires the SPI library + # The BSEC2 and BME68x Arduino libraries unconditionally include Wire.h and + # SPI.h in their source files, so these libraries must be available even though + # ESPHome uses its own I2C/SPI abstractions instead of the Arduino ones. if core.CORE.using_arduino: + cg.add_library("Wire", None) cg.add_library("SPI", None) cg.add_library( "BME68x Sensor library", diff --git a/tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml b/tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml new file mode 100644 index 0000000000..7c503b0ccb --- /dev/null +++ b/tests/components/bme68x_bsec2_i2c/test.esp32-ard.yaml @@ -0,0 +1,4 @@ +packages: + i2c: !include ../../test_build_components/common/i2c/esp32-ard.yaml + +<<: !include common.yaml From 997f825cd3c03ee1a7a07c07306b37e1d37e4fe2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 15:56:09 -0600 Subject: [PATCH 081/147] [network] Improve IPAddress::str() deprecation warning with usage example (#14195) --- esphome/components/network/ip_address.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/esphome/components/network/ip_address.h b/esphome/components/network/ip_address.h index d0ac8164af..b2a2c563e2 100644 --- a/esphome/components/network/ip_address.h +++ b/esphome/components/network/ip_address.h @@ -61,7 +61,9 @@ struct IPAddress { IPAddress(const std::string &in_address) { inet_aton(in_address.c_str(), &ip_addr_); } IPAddress(const ip_addr_t *other_ip) { ip_addr_ = *other_ip; } // Remove before 2026.8.0 - ESPDEPRECATED("Use str_to() instead. Removed in 2026.8.0", "2026.2.0") + ESPDEPRECATED( + "str() is deprecated: use 'char buf[IP_ADDRESS_BUFFER_SIZE]; ip.str_to(buf);' instead. Removed in 2026.8.0", + "2026.2.0") std::string str() const { char buf[IP_ADDRESS_BUFFER_SIZE]; this->str_to(buf); @@ -150,7 +152,9 @@ struct IPAddress { bool is_ip6() const { return IP_IS_V6(&ip_addr_); } bool is_multicast() const { return ip_addr_ismulticast(&ip_addr_); } // Remove before 2026.8.0 - ESPDEPRECATED("Use str_to() instead. Removed in 2026.8.0", "2026.2.0") + ESPDEPRECATED( + "str() is deprecated: use 'char buf[IP_ADDRESS_BUFFER_SIZE]; ip.str_to(buf);' instead. Removed in 2026.8.0", + "2026.2.0") std::string str() const { char buf[IP_ADDRESS_BUFFER_SIZE]; this->str_to(buf); From 4b57ac323666c8278e93bf20af20268077cab2c6 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sun, 22 Feb 2026 17:07:56 -0600 Subject: [PATCH 082/147] [water_heater] Fix device_id missing from state responses (#14212) --- esphome/components/api/api_connection.cpp | 3 +- .../fixtures/device_id_in_state.yaml | 115 ++++++++++++ tests/integration/test_device_id_in_state.py | 173 ++++++++++++------ 3 files changed, 232 insertions(+), 59 deletions(-) diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 4bc3c9b307..b388bf5971 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -1334,9 +1334,8 @@ uint16_t APIConnection::try_send_water_heater_state(EntityBase *entity, APIConne resp.target_temperature_low = wh->get_target_temperature_low(); resp.target_temperature_high = wh->get_target_temperature_high(); resp.state = wh->get_state(); - resp.key = wh->get_object_id_hash(); - return encode_message_to_buffer(resp, WaterHeaterStateResponse::MESSAGE_TYPE, conn, remaining_size); + return fill_and_encode_entity_state(wh, resp, WaterHeaterStateResponse::MESSAGE_TYPE, conn, remaining_size); } uint16_t APIConnection::try_send_water_heater_info(EntityBase *entity, APIConnection *conn, uint32_t remaining_size) { auto *wh = static_cast(entity); diff --git a/tests/integration/fixtures/device_id_in_state.yaml b/tests/integration/fixtures/device_id_in_state.yaml index c8548617b8..a5dfb7ee45 100644 --- a/tests/integration/fixtures/device_id_in_state.yaml +++ b/tests/integration/fixtures/device_id_in_state.yaml @@ -46,6 +46,7 @@ sensor: binary_sensor: - platform: template + id: motion_detected name: Motion Detected device_id: motion_sensor lambda: return true; @@ -82,3 +83,117 @@ output: write_action: - lambda: |- ESP_LOGD("test", "Light output: %d", state); + +cover: + - platform: template + name: Garage Door + device_id: motion_sensor + optimistic: true + +fan: + - platform: template + name: Ceiling Fan + device_id: humidity_monitor + speed_count: 3 + has_oscillating: false + has_direction: false + +lock: + - platform: template + name: Front Door Lock + device_id: motion_sensor + optimistic: true + +number: + - platform: template + name: Target Temperature + device_id: temperature_monitor + optimistic: true + min_value: 0 + max_value: 100 + step: 1 + +select: + - platform: template + name: Mode Select + device_id: humidity_monitor + optimistic: true + options: + - "Auto" + - "Manual" + +text: + - platform: template + name: Device Label + device_id: temperature_monitor + optimistic: true + mode: text + +valve: + - platform: template + name: Water Valve + device_id: humidity_monitor + optimistic: true + +globals: + - id: global_away + type: bool + initial_value: "false" + - id: global_is_on + type: bool + initial_value: "true" + +water_heater: + - platform: template + name: Test Boiler + device_id: temperature_monitor + optimistic: true + current_temperature: !lambda "return 45.0f;" + target_temperature: !lambda "return 60.0f;" + away: !lambda "return id(global_away);" + is_on: !lambda "return id(global_is_on);" + supported_modes: + - "off" + - electric + visual: + min_temperature: 30.0 + max_temperature: 85.0 + target_temperature_step: 0.5 + set_action: + - lambda: |- + ESP_LOGD("test", "Water heater set"); + +alarm_control_panel: + - platform: template + name: House Alarm + device_id: motion_sensor + codes: + - "1234" + restore_mode: ALWAYS_DISARMED + binary_sensors: + - input: motion_detected + +datetime: + - platform: template + name: Schedule Date + device_id: temperature_monitor + type: date + optimistic: true + - platform: template + name: Schedule Time + device_id: humidity_monitor + type: time + optimistic: true + - platform: template + name: Schedule DateTime + device_id: motion_sensor + type: datetime + optimistic: true + +event: + - platform: template + name: Doorbell + device_id: motion_sensor + event_types: + - "press" + - "double_press" diff --git a/tests/integration/test_device_id_in_state.py b/tests/integration/test_device_id_in_state.py index 51088bcbf7..48de94a85a 100644 --- a/tests/integration/test_device_id_in_state.py +++ b/tests/integration/test_device_id_in_state.py @@ -4,11 +4,80 @@ from __future__ import annotations import asyncio -from aioesphomeapi import BinarySensorState, EntityState, SensorState, TextSensorState +from aioesphomeapi import ( + AlarmControlPanelEntityState, + BinarySensorState, + CoverState, + DateState, + DateTimeState, + EntityState, + FanState, + LightState, + LockEntityState, + NumberState, + SelectState, + SensorState, + SwitchState, + TextSensorState, + TextState, + TimeState, + ValveState, + WaterHeaterState, +) import pytest from .types import APIClientConnectedFactory, RunCompiledFunction +# Mapping of entity name to device name for all entities with device_id +ENTITY_TO_DEVICE = { + # Original entities + "Temperature": "Temperature Monitor", + "Humidity": "Humidity Monitor", + "Motion Detected": "Motion Sensor", + "Temperature Monitor Power": "Temperature Monitor", + "Temperature Status": "Temperature Monitor", + "Motion Light": "Motion Sensor", + # New entity types + "Garage Door": "Motion Sensor", + "Ceiling Fan": "Humidity Monitor", + "Front Door Lock": "Motion Sensor", + "Target Temperature": "Temperature Monitor", + "Mode Select": "Humidity Monitor", + "Device Label": "Temperature Monitor", + "Water Valve": "Humidity Monitor", + "Test Boiler": "Temperature Monitor", + "House Alarm": "Motion Sensor", + "Schedule Date": "Temperature Monitor", + "Schedule Time": "Humidity Monitor", + "Schedule DateTime": "Motion Sensor", + "Doorbell": "Motion Sensor", +} + +# Entities without device_id (should have device_id 0) +NO_DEVICE_ENTITIES = {"No Device Sensor"} + +# State types that should have non-zero device_id, mapped by their aioesphomeapi class +EXPECTED_STATE_TYPES = [ + (SensorState, "sensor"), + (BinarySensorState, "binary_sensor"), + (SwitchState, "switch"), + (TextSensorState, "text_sensor"), + (LightState, "light"), + (CoverState, "cover"), + (FanState, "fan"), + (LockEntityState, "lock"), + (NumberState, "number"), + (SelectState, "select"), + (TextState, "text"), + (ValveState, "valve"), + (WaterHeaterState, "water_heater"), + (AlarmControlPanelEntityState, "alarm_control_panel"), + (DateState, "date"), + (TimeState, "time"), + (DateTimeState, "datetime"), + # Event is stateless (no initial state sent on subscribe) +] + @pytest.mark.asyncio async def test_device_id_in_state( @@ -40,34 +109,35 @@ async def test_device_id_in_state( entity_device_mapping: dict[int, int] = {} for entity in all_entities: - # All entities have name and key attributes - if entity.name == "Temperature": - entity_device_mapping[entity.key] = device_ids["Temperature Monitor"] - elif entity.name == "Humidity": - entity_device_mapping[entity.key] = device_ids["Humidity Monitor"] - elif entity.name == "Motion Detected": - entity_device_mapping[entity.key] = device_ids["Motion Sensor"] - elif entity.name in {"Temperature Monitor Power", "Temperature Status"}: - entity_device_mapping[entity.key] = device_ids["Temperature Monitor"] - elif entity.name == "Motion Light": - entity_device_mapping[entity.key] = device_ids["Motion Sensor"] - elif entity.name == "No Device Sensor": - # Entity without device_id should have device_id 0 + if entity.name in ENTITY_TO_DEVICE: + expected_device = ENTITY_TO_DEVICE[entity.name] + entity_device_mapping[entity.key] = device_ids[expected_device] + elif entity.name in NO_DEVICE_ENTITIES: entity_device_mapping[entity.key] = 0 - assert len(entity_device_mapping) >= 6, ( - f"Expected at least 6 mapped entities, got {len(entity_device_mapping)}" + expected_count = len(ENTITY_TO_DEVICE) + len(NO_DEVICE_ENTITIES) + assert len(entity_device_mapping) >= expected_count, ( + f"Expected at least {expected_count} mapped entities, " + f"got {len(entity_device_mapping)}. " + f"Missing: {set(ENTITY_TO_DEVICE) | NO_DEVICE_ENTITIES - {e.name for e in all_entities}}" + ) + + # Subscribe to states and wait for all mapped entities + # Event entities are stateless (no initial state on subscribe), + # so exclude them from the expected count + stateless_keys = {e.key for e in all_entities if e.name == "Doorbell"} + stateful_count = len(entity_device_mapping) - len( + stateless_keys & entity_device_mapping.keys() ) - # Subscribe to states loop = asyncio.get_running_loop() states: dict[int, EntityState] = {} states_future: asyncio.Future[bool] = loop.create_future() def on_state(state: EntityState) -> None: - states[state.key] = state - # Check if we have states for all mapped entities - if len(states) >= len(entity_device_mapping) and not states_future.done(): + if state.key in entity_device_mapping: + states[state.key] = state + if len(states) >= stateful_count and not states_future.done(): states_future.set_result(True) client.subscribe_states(on_state) @@ -76,9 +146,16 @@ async def test_device_id_in_state( try: await asyncio.wait_for(states_future, timeout=10.0) except TimeoutError: + received_names = {e.name for e in all_entities if e.key in states} + missing_names = ( + (set(ENTITY_TO_DEVICE) | NO_DEVICE_ENTITIES) + - received_names + - {"Doorbell"} + ) pytest.fail( f"Did not receive all entity states within 10 seconds. " - f"Received {len(states)} states, expected {len(entity_device_mapping)}" + f"Received {len(states)} states. " + f"Missing: {missing_names}" ) # Verify each state has the correct device_id @@ -86,51 +163,33 @@ async def test_device_id_in_state( for key, expected_device_id in entity_device_mapping.items(): if key in states: state = states[key] + entity_name = next( + (e.name for e in all_entities if e.key == key), f"key={key}" + ) assert state.device_id == expected_device_id, ( - f"State for key {key} has device_id {state.device_id}, " - f"expected {expected_device_id}" + f"State for '{entity_name}' (type={type(state).__name__}) " + f"has device_id {state.device_id}, expected {expected_device_id}" ) verified_count += 1 - assert verified_count >= 6, ( - f"Only verified {verified_count} states, expected at least 6" + # All stateful entities should be verified (everything except Doorbell event) + expected_verified = expected_count - 1 # exclude Doorbell + assert verified_count >= expected_verified, ( + f"Only verified {verified_count} states, expected at least {expected_verified}" ) - # Test specific state types to ensure device_id is present - # Find a sensor state with device_id - sensor_state = next( - ( + # Verify each expected state type has at least one instance with non-zero device_id + for state_type, type_name in EXPECTED_STATE_TYPES: + matching = [ s for s in states.values() - if isinstance(s, SensorState) - and isinstance(s.state, float) - and s.device_id != 0 - ), - None, - ) - assert sensor_state is not None, "No sensor state with device_id found" - assert sensor_state.device_id > 0, "Sensor state should have non-zero device_id" - - # Find a binary sensor state - binary_sensor_state = next( - (s for s in states.values() if isinstance(s, BinarySensorState)), - None, - ) - assert binary_sensor_state is not None, "No binary sensor state found" - assert binary_sensor_state.device_id > 0, ( - "Binary sensor state should have non-zero device_id" - ) - - # Find a text sensor state - text_sensor_state = next( - (s for s in states.values() if isinstance(s, TextSensorState)), - None, - ) - assert text_sensor_state is not None, "No text sensor state found" - assert text_sensor_state.device_id > 0, ( - "Text sensor state should have non-zero device_id" - ) + if isinstance(s, state_type) and s.device_id != 0 + ] + assert matching, ( + f"No {type_name} state (type={state_type.__name__}) " + f"with non-zero device_id found" + ) # Verify the "No Device Sensor" has device_id = 0 no_device_key = next( From efa39ae591ea3aedc5ea7b41d048df33ac15d0d7 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 25 Feb 2026 00:33:33 +1100 Subject: [PATCH 083/147] [mipi_dsi] Allow transform disable; fix warnings (#14216) --- esphome/components/mipi_dsi/display.py | 24 +++++++++++-------- esphome/components/mipi_dsi/mipi_dsi.cpp | 4 ++-- esphome/components/mipi_dsi/mipi_dsi.h | 10 ++++---- .../mipi_dsi/fixtures/mipi_dsi.yaml | 17 +++++++++++++ .../mipi_dsi/test_mipi_dsi_config.py | 3 ++- 5 files changed, 40 insertions(+), 18 deletions(-) diff --git a/esphome/components/mipi_dsi/display.py b/esphome/components/mipi_dsi/display.py index de3791b3a4..85bfad7f1a 100644 --- a/esphome/components/mipi_dsi/display.py +++ b/esphome/components/mipi_dsi/display.py @@ -39,6 +39,7 @@ import esphome.config_validation as cv from esphome.const import ( CONF_COLOR_ORDER, CONF_DIMENSIONS, + CONF_DISABLED, CONF_ENABLE_PIN, CONF_ID, CONF_INIT_SEQUENCE, @@ -88,14 +89,17 @@ COLOR_DEPTHS = { def model_schema(config): model = MODELS[config[CONF_MODEL].upper()] model.defaults[CONF_SWAP_XY] = cv.UNDEFINED - transform = cv.Schema( - { - cv.Required(CONF_MIRROR_X): cv.boolean, - cv.Required(CONF_MIRROR_Y): cv.boolean, - cv.Optional(CONF_SWAP_XY): cv.invalid( - "Axis swapping not supported by DSI displays" - ), - } + transform = cv.Any( + cv.Schema( + { + cv.Required(CONF_MIRROR_X): cv.boolean, + cv.Required(CONF_MIRROR_Y): cv.boolean, + cv.Optional(CONF_SWAP_XY): cv.invalid( + "Axis swapping not supported by DSI displays" + ), + } + ), + cv.one_of(CONF_DISABLED, lower=True), ) # CUSTOM model will need to provide a custom init sequence iseqconf = ( @@ -199,9 +203,9 @@ async def to_code(config): cg.add(var.set_vsync_pulse_width(config[CONF_VSYNC_PULSE_WIDTH])) cg.add(var.set_vsync_back_porch(config[CONF_VSYNC_BACK_PORCH])) cg.add(var.set_vsync_front_porch(config[CONF_VSYNC_FRONT_PORCH])) - cg.add(var.set_pclk_frequency(int(config[CONF_PCLK_FREQUENCY] / 1e6))) + cg.add(var.set_pclk_frequency(config[CONF_PCLK_FREQUENCY] / 1.0e6)) cg.add(var.set_lanes(int(config[CONF_LANES]))) - cg.add(var.set_lane_bit_rate(int(config[CONF_LANE_BIT_RATE] / 1e6))) + cg.add(var.set_lane_bit_rate(config[CONF_LANE_BIT_RATE] / 1.0e6)) if reset_pin := config.get(CONF_RESET_PIN): reset = await cg.gpio_pin_expression(reset_pin) cg.add(var.set_reset_pin(reset)) diff --git a/esphome/components/mipi_dsi/mipi_dsi.cpp b/esphome/components/mipi_dsi/mipi_dsi.cpp index 18cafab684..4d45cfb799 100644 --- a/esphome/components/mipi_dsi/mipi_dsi.cpp +++ b/esphome/components/mipi_dsi/mipi_dsi.cpp @@ -374,7 +374,7 @@ void MIPI_DSI::dump_config() { "\n Swap X/Y: %s" "\n Rotation: %d degrees" "\n DSI Lanes: %u" - "\n Lane Bit Rate: %uMbps" + "\n Lane Bit Rate: %.0fMbps" "\n HSync Pulse Width: %u" "\n HSync Back Porch: %u" "\n HSync Front Porch: %u" @@ -385,7 +385,7 @@ void MIPI_DSI::dump_config() { "\n Display Pixel Mode: %d bit" "\n Color Order: %s" "\n Invert Colors: %s" - "\n Pixel Clock: %dMHz", + "\n Pixel Clock: %.1fMHz", this->model_, this->width_, this->height_, YESNO(this->madctl_ & (MADCTL_XFLIP | MADCTL_MX)), YESNO(this->madctl_ & (MADCTL_YFLIP | MADCTL_MY)), YESNO(this->madctl_ & MADCTL_MV), this->rotation_, this->lanes_, this->lane_bit_rate_, this->hsync_pulse_width_, this->hsync_back_porch_, diff --git a/esphome/components/mipi_dsi/mipi_dsi.h b/esphome/components/mipi_dsi/mipi_dsi.h index 1cffe3b178..6e27912aa5 100644 --- a/esphome/components/mipi_dsi/mipi_dsi.h +++ b/esphome/components/mipi_dsi/mipi_dsi.h @@ -47,7 +47,7 @@ class MIPI_DSI : public display::Display { void set_reset_pin(GPIOPin *reset_pin) { this->reset_pin_ = reset_pin; } void set_enable_pins(std::vector enable_pins) { this->enable_pins_ = std::move(enable_pins); } - void set_pclk_frequency(uint32_t pclk_frequency) { this->pclk_frequency_ = pclk_frequency; } + void set_pclk_frequency(float pclk_frequency) { this->pclk_frequency_ = pclk_frequency; } int get_width_internal() override { return this->width_; } int get_height_internal() override { return this->height_; } void set_hsync_back_porch(uint16_t hsync_back_porch) { this->hsync_back_porch_ = hsync_back_porch; } @@ -58,7 +58,7 @@ class MIPI_DSI : public display::Display { void set_vsync_front_porch(uint16_t vsync_front_porch) { this->vsync_front_porch_ = vsync_front_porch; } void set_init_sequence(const std::vector &init_sequence) { this->init_sequence_ = init_sequence; } void set_model(const char *model) { this->model_ = model; } - void set_lane_bit_rate(uint16_t lane_bit_rate) { this->lane_bit_rate_ = lane_bit_rate; } + void set_lane_bit_rate(float lane_bit_rate) { this->lane_bit_rate_ = lane_bit_rate; } void set_lanes(uint8_t lanes) { this->lanes_ = lanes; } void set_madctl(uint8_t madctl) { this->madctl_ = madctl; } @@ -95,9 +95,9 @@ class MIPI_DSI : public display::Display { uint16_t vsync_front_porch_ = 10; const char *model_{"Unknown"}; std::vector init_sequence_{}; - uint16_t pclk_frequency_ = 16; // in MHz - uint16_t lane_bit_rate_{1500}; // in Mbps - uint8_t lanes_{2}; // 1, 2, 3 or 4 lanes + float pclk_frequency_ = 16; // in MHz + float lane_bit_rate_{1500}; // in Mbps + uint8_t lanes_{2}; // 1, 2, 3 or 4 lanes bool invert_colors_{}; display::ColorOrder color_mode_{display::COLOR_ORDER_BGR}; diff --git a/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml b/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml index 6de2bd5a77..6f76dcb1d1 100644 --- a/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml +++ b/tests/component_tests/mipi_dsi/fixtures/mipi_dsi.yaml @@ -22,6 +22,23 @@ display: id: p4_86 model: "WAVESHARE-P4-86-PANEL" rotation: 180 + - platform: mipi_dsi + model: custom + id: custom_id + dimensions: + width: 400 + height: 1280 + hsync_back_porch: 40 + hsync_pulse_width: 30 + hsync_front_porch: 40 + vsync_back_porch: 20 + vsync_pulse_width: 10 + vsync_front_porch: 20 + pclk_frequency: 48Mhz + lane_bit_rate: 1.2Gbps + rotation: 180 + transform: disabled + init_sequence: i2c: sda: GPIO7 scl: GPIO8 diff --git a/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py b/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py index d465a8c81b..92f56b5451 100644 --- a/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py +++ b/tests/component_tests/mipi_dsi/test_mipi_dsi_config.py @@ -123,7 +123,8 @@ def test_code_generation( in main_cpp ) assert "set_init_sequence({224, 1, 0, 225, 1, 147, 226, 1," in main_cpp - assert "p4_nano->set_lane_bit_rate(1500);" in main_cpp + assert "p4_nano->set_lane_bit_rate(1500.0f);" in main_cpp assert "p4_nano->set_rotation(display::DISPLAY_ROTATION_90_DEGREES);" in main_cpp assert "p4_86->set_rotation(display::DISPLAY_ROTATION_0_DEGREES);" in main_cpp + assert "custom_id->set_rotation(display::DISPLAY_ROTATION_180_DEGREES);" in main_cpp # assert "backlight_id = new light::LightState(mipi_dsi_dsibacklight_id);" in main_cpp From 29d890bb0f89af6257a471e9256aa1bc042f381b Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:15:22 -0500 Subject: [PATCH 084/147] [http_request.ota] Percent-encode credentials in URL (#14257) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../http_request/ota/ota_http_request.cpp | 22 +++++++++++++++++++ .../http_request/ota/ota_http_request.h | 4 ++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/esphome/components/http_request/ota/ota_http_request.cpp b/esphome/components/http_request/ota/ota_http_request.cpp index 882def4d7f..bbe128aad9 100644 --- a/esphome/components/http_request/ota/ota_http_request.cpp +++ b/esphome/components/http_request/ota/ota_http_request.cpp @@ -1,5 +1,7 @@ #include "ota_http_request.h" +#include + #include "esphome/core/application.h" #include "esphome/core/defines.h" #include "esphome/core/log.h" @@ -210,6 +212,26 @@ uint8_t OtaHttpRequestComponent::do_ota_() { return ota::OTA_RESPONSE_OK; } +// URL-encode characters that are not unreserved per RFC 3986 section 2.3. +// This is needed for embedding userinfo (username/password) in URLs safely. +static std::string url_encode(const std::string &str) { + std::string result; + result.reserve(str.size()); + for (char c : str) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || c == '.' || c == '~') { + result += c; + } else { + result += '%'; + result += format_hex_pretty_char((static_cast(c) >> 4) & 0x0F); + result += format_hex_pretty_char(static_cast(c) & 0x0F); + } + } + return result; +} + +void OtaHttpRequestComponent::set_password(const std::string &password) { this->password_ = url_encode(password); } +void OtaHttpRequestComponent::set_username(const std::string &username) { this->username_ = url_encode(username); } + std::string OtaHttpRequestComponent::get_url_with_auth_(const std::string &url) { if (this->username_.empty() || this->password_.empty()) { return url; diff --git a/esphome/components/http_request/ota/ota_http_request.h b/esphome/components/http_request/ota/ota_http_request.h index 8735189e99..e3f1a4aa90 100644 --- a/esphome/components/http_request/ota/ota_http_request.h +++ b/esphome/components/http_request/ota/ota_http_request.h @@ -29,9 +29,9 @@ class OtaHttpRequestComponent : public ota::OTAComponent, public Parentedmd5_expected_ = md5; } - void set_password(const std::string &password) { this->password_ = password; } + void set_password(const std::string &password); void set_url(const std::string &url); - void set_username(const std::string &username) { this->username_ = username; } + void set_username(const std::string &username); std::string md5_computed() { return this->md5_computed_; } std::string md5_expected() { return this->md5_expected_; } From 2c11c65faff2edec0224ca0bbe7624a9d3adc147 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:28:19 +1300 Subject: [PATCH 085/147] Don't get stuck forever on a failed component can_proceed (#14267) --- esphome/core/application.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/core/application.cpp b/esphome/core/application.cpp index 449acc64cf..2b84b1c1e4 100644 --- a/esphome/core/application.cpp +++ b/esphome/core/application.cpp @@ -132,7 +132,7 @@ void Application::setup() { this->after_loop_tasks_(); this->app_state_ = new_app_state; yield(); - } while (!component->can_proceed()); + } while (!component->can_proceed() && !component->is_failed()); } ESP_LOGI(TAG, "setup() finished successfully!"); From af296eb600262ca2a3a4f9e47aab3e65bbc8826d Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Tue, 24 Feb 2026 23:26:00 -0500 Subject: [PATCH 086/147] [pid] Fix deadband threshold conversion for Fahrenheit (#14268) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/pid/climate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/pid/climate.py b/esphome/components/pid/climate.py index 5919d2cac8..5fa3166f9d 100644 --- a/esphome/components/pid/climate.py +++ b/esphome/components/pid/climate.py @@ -50,8 +50,8 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_HEAT_OUTPUT): cv.use_id(output.FloatOutput), cv.Optional(CONF_DEADBAND_PARAMETERS): cv.Schema( { - cv.Required(CONF_THRESHOLD_HIGH): cv.temperature, - cv.Required(CONF_THRESHOLD_LOW): cv.temperature, + cv.Required(CONF_THRESHOLD_HIGH): cv.temperature_delta, + cv.Required(CONF_THRESHOLD_LOW): cv.temperature_delta, cv.Optional(CONF_KP_MULTIPLIER, default=0.1): cv.float_, cv.Optional(CONF_KI_MULTIPLIER, default=0.0): cv.float_, cv.Optional(CONF_KD_MULTIPLIER, default=0.0): cv.float_, From da930310b1e2e1175118126cd25680fa3ca2eeb2 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:19:20 -0500 Subject: [PATCH 087/147] [ld2420] Fix sizeof vs value bug in register memcpy (#14286) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/ld2420/ld2420.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esphome/components/ld2420/ld2420.cpp b/esphome/components/ld2420/ld2420.cpp index cf78a1a460..b653f4ae88 100644 --- a/esphome/components/ld2420/ld2420.cpp +++ b/esphome/components/ld2420/ld2420.cpp @@ -590,7 +590,7 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) { for (uint16_t index = 0; index < (CMD_REG_DATA_REPLY_SIZE * // NOLINT ((buffer[CMD_FRAME_DATA_LENGTH] - 4) / CMD_REG_DATA_REPLY_SIZE)); index += CMD_REG_DATA_REPLY_SIZE) { - memcpy(&this->cmd_reply_.data[reg_element], &buffer[data_pos + index], sizeof(CMD_REG_DATA_REPLY_SIZE)); + memcpy(&this->cmd_reply_.data[reg_element], &buffer[data_pos + index], CMD_REG_DATA_REPLY_SIZE); byteswap(this->cmd_reply_.data[reg_element]); reg_element++; } @@ -729,9 +729,9 @@ void LD2420Component::set_reg_value(uint16_t reg, uint16_t value) { cmd_frame.data_length = 0; cmd_frame.header = CMD_FRAME_HEADER; cmd_frame.command = CMD_WRITE_REGISTER; - memcpy(&cmd_frame.data[cmd_frame.data_length], ®, sizeof(CMD_REG_DATA_REPLY_SIZE)); + memcpy(&cmd_frame.data[cmd_frame.data_length], ®, CMD_REG_DATA_REPLY_SIZE); cmd_frame.data_length += 2; - memcpy(&cmd_frame.data[cmd_frame.data_length], &value, sizeof(CMD_REG_DATA_REPLY_SIZE)); + memcpy(&cmd_frame.data[cmd_frame.data_length], &value, CMD_REG_DATA_REPLY_SIZE); cmd_frame.data_length += 2; cmd_frame.footer = CMD_FRAME_FOOTER; ESP_LOGV(TAG, "Sending write register %4X command: %2X data = %4X", reg, cmd_frame.command, value); From a39be5a4619817d0b3a244b04cbac5150cb4b540 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:34:38 -0500 Subject: [PATCH 088/147] [rtttl] Fix speaker playback bugs (#14280) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/rtttl/rtttl.cpp | 21 +++++++++++---------- esphome/components/rtttl/rtttl.h | 6 +++--- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/esphome/components/rtttl/rtttl.cpp b/esphome/components/rtttl/rtttl.cpp index 6e86405b74..ab95067f45 100644 --- a/esphome/components/rtttl/rtttl.cpp +++ b/esphome/components/rtttl/rtttl.cpp @@ -139,9 +139,10 @@ void Rtttl::loop() { x++; } if (x > 0) { - int send = this->speaker_->play((uint8_t *) (&sample), x * 2); - if (send != x * 4) { - this->samples_sent_ -= (x - (send / 2)); + size_t bytes_to_send = x * sizeof(SpeakerSample); + size_t send = this->speaker_->play((uint8_t *) (&sample), bytes_to_send); + if (send != bytes_to_send) { + this->samples_sent_ -= (x - (send / sizeof(SpeakerSample))); } return; } @@ -201,9 +202,9 @@ void Rtttl::loop() { bool need_note_gap = false; if (note) { auto note_index = (scale - 4) * 12 + note; - if (note_index < 0 || note_index >= (int) sizeof(NOTES)) { + if (note_index < 0 || note_index >= (int) (sizeof(NOTES) / sizeof(NOTES[0]))) { ESP_LOGE(TAG, "Note out of range (note: %d, scale: %d, index: %d, max: %d)", note, scale, note_index, - (int) sizeof(NOTES)); + (int) (sizeof(NOTES) / sizeof(NOTES[0]))); this->finish_(); return; } @@ -221,7 +222,7 @@ void Rtttl::loop() { #ifdef USE_OUTPUT if (this->output_ != nullptr) { - if (need_note_gap) { + if (need_note_gap && this->note_duration_ > DOUBLE_NOTE_GAP_MS) { this->output_->set_level(0.0); delay(DOUBLE_NOTE_GAP_MS); this->note_duration_ -= DOUBLE_NOTE_GAP_MS; @@ -240,9 +241,9 @@ void Rtttl::loop() { this->samples_sent_ = 0; this->samples_gap_ = 0; this->samples_per_wave_ = 0; - this->samples_count_ = (this->sample_rate_ * this->note_duration_) / 1600; //(ms); + this->samples_count_ = (this->sample_rate_ * this->note_duration_) / 1000; if (need_note_gap) { - this->samples_gap_ = (this->sample_rate_ * DOUBLE_NOTE_GAP_MS) / 1600; //(ms); + this->samples_gap_ = (this->sample_rate_ * DOUBLE_NOTE_GAP_MS) / 1000; } if (this->output_freq_ != 0) { // make sure there is enough samples to add a full last sinus. @@ -279,7 +280,7 @@ void Rtttl::play(std::string rtttl) { this->note_duration_ = 0; int bpm = 63; - uint8_t num; + uint16_t num; // Get name this->position_ = this->rtttl_.find(':'); @@ -395,7 +396,7 @@ void Rtttl::finish_() { sample[0].right = 0; sample[1].left = 0; sample[1].right = 0; - this->speaker_->play((uint8_t *) (&sample), 8); + this->speaker_->play((uint8_t *) (&sample), sizeof(sample)); this->speaker_->finish(); this->set_state_(State::STOPPING); } diff --git a/esphome/components/rtttl/rtttl.h b/esphome/components/rtttl/rtttl.h index 6f5df07766..4d4a652c51 100644 --- a/esphome/components/rtttl/rtttl.h +++ b/esphome/components/rtttl/rtttl.h @@ -46,8 +46,8 @@ class Rtttl : public Component { } protected: - inline uint8_t get_integer_() { - uint8_t ret = 0; + inline uint16_t get_integer_() { + uint16_t ret = 0; while (isdigit(this->rtttl_[this->position_])) { ret = (ret * 10) + (this->rtttl_[this->position_++] - '0'); } @@ -87,7 +87,7 @@ class Rtttl : public Component { #ifdef USE_OUTPUT /// The output to write the sound to. - output::FloatOutput *output_; + output::FloatOutput *output_{nullptr}; #endif // USE_OUTPUT #ifdef USE_SPEAKER From 5a1d6428b20163de46cc428246002ac1dd845b4e Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 14:35:27 -0500 Subject: [PATCH 089/147] [hmc5883l] Fix wrong gain for 88uT range (#14281) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/hmc5883l/hmc5883l.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/hmc5883l/hmc5883l.cpp b/esphome/components/hmc5883l/hmc5883l.cpp index b62381a287..bee5282125 100644 --- a/esphome/components/hmc5883l/hmc5883l.cpp +++ b/esphome/components/hmc5883l/hmc5883l.cpp @@ -95,7 +95,7 @@ void HMC5883LComponent::update() { float mg_per_bit; switch (this->range_) { case HMC5883L_RANGE_88_UT: - mg_per_bit = 0.073f; + mg_per_bit = 0.73f; break; case HMC5883L_RANGE_130_UT: mg_per_bit = 0.92f; From 8479664df104b85ab3bce2e9c6ca3377ed02eb24 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Wed, 25 Feb 2026 19:32:02 -0500 Subject: [PATCH 090/147] [sensor] Fix delta filter percentage mode regression (#14302) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/sensor/__init__.py | 2 +- .../fixtures/sensor_filters_delta.yaml | 40 +++++++++++++++++++ .../integration/test_sensor_filters_delta.py | 27 ++++++++++++- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/esphome/components/sensor/__init__.py b/esphome/components/sensor/__init__.py index ebbe0fbccc..03784ba76b 100644 --- a/esphome/components/sensor/__init__.py +++ b/esphome/components/sensor/__init__.py @@ -603,7 +603,7 @@ DELTA_SCHEMA = cv.Any( def _get_delta(value): if isinstance(value, str): assert value.endswith("%") - return 0.0, float(value[:-1]) + return 0.0, float(value[:-1]) / 100.0 return value, 0.0 diff --git a/tests/integration/fixtures/sensor_filters_delta.yaml b/tests/integration/fixtures/sensor_filters_delta.yaml index 19bd2d5ca4..2494a430da 100644 --- a/tests/integration/fixtures/sensor_filters_delta.yaml +++ b/tests/integration/fixtures/sensor_filters_delta.yaml @@ -28,6 +28,11 @@ sensor: id: source_sensor_4 accuracy_decimals: 1 + - platform: template + name: "Source Sensor 5" + id: source_sensor_5 + accuracy_decimals: 1 + - platform: copy source_id: source_sensor_1 name: "Filter Min" @@ -69,6 +74,13 @@ sensor: filters: - delta: 0 + - platform: copy + source_id: source_sensor_5 + name: "Filter Percentage" + id: filter_percentage + filters: + - delta: 50% + script: - id: test_filter_min then: @@ -154,6 +166,28 @@ script: id: source_sensor_4 state: 2.0 + - id: test_filter_percentage + then: + - sensor.template.publish: + id: source_sensor_5 + state: 100.0 + - delay: 20ms + - sensor.template.publish: + id: source_sensor_5 + state: 120.0 # Filtered out (delta=20, need >50) + - delay: 20ms + - sensor.template.publish: + id: source_sensor_5 + state: 160.0 # Passes (delta=60 > 50% of 100=50) + - delay: 20ms + - sensor.template.publish: + id: source_sensor_5 + state: 200.0 # Filtered out (delta=40, need >50% of 160=80) + - delay: 20ms + - sensor.template.publish: + id: source_sensor_5 + state: 250.0 # Passes (delta=90 > 80) + button: - platform: template name: "Test Filter Min" @@ -178,3 +212,9 @@ button: id: btn_filter_zero_delta on_press: - script.execute: test_filter_zero_delta + + - platform: template + name: "Test Filter Percentage" + id: btn_filter_percentage + on_press: + - script.execute: test_filter_percentage diff --git a/tests/integration/test_sensor_filters_delta.py b/tests/integration/test_sensor_filters_delta.py index c7a26bf9d1..9d0114e0c4 100644 --- a/tests/integration/test_sensor_filters_delta.py +++ b/tests/integration/test_sensor_filters_delta.py @@ -24,12 +24,14 @@ async def test_sensor_filters_delta( "filter_max": [], "filter_baseline_max": [], "filter_zero_delta": [], + "filter_percentage": [], } filter_min_done = loop.create_future() filter_max_done = loop.create_future() filter_baseline_max_done = loop.create_future() filter_zero_delta_done = loop.create_future() + filter_percentage_done = loop.create_future() def on_state(state: EntityState) -> None: if not isinstance(state, SensorState) or state.missing_state: @@ -66,6 +68,12 @@ async def test_sensor_filters_delta( and not filter_zero_delta_done.done() ): filter_zero_delta_done.set_result(True) + elif ( + sensor_name == "filter_percentage" + and len(sensor_values[sensor_name]) == 3 + and not filter_percentage_done.done() + ): + filter_percentage_done.set_result(True) async with ( run_compiled(yaml_config), @@ -80,6 +88,7 @@ async def test_sensor_filters_delta( "filter_max": "Filter Max", "filter_baseline_max": "Filter Baseline Max", "filter_zero_delta": "Filter Zero Delta", + "filter_percentage": "Filter Percentage", }, ) @@ -98,13 +107,14 @@ async def test_sensor_filters_delta( "Test Filter Max": "filter_max", "Test Filter Baseline Max": "filter_baseline_max", "Test Filter Zero Delta": "filter_zero_delta", + "Test Filter Percentage": "filter_percentage", } buttons = {} for entity in entities: if isinstance(entity, ButtonInfo) and entity.name in button_name_map: buttons[button_name_map[entity.name]] = entity.key - assert len(buttons) == 4, f"Expected 3 buttons, found {len(buttons)}" + assert len(buttons) == 5, f"Expected 5 buttons, found {len(buttons)}" # Test 1: Min sensor_values["filter_min"].clear() @@ -161,3 +171,18 @@ async def test_sensor_filters_delta( assert sensor_values["filter_zero_delta"] == pytest.approx(expected), ( f"Test 4 failed: expected {expected}, got {sensor_values['filter_zero_delta']}" ) + + # Test 5: Percentage (delta: 50%) + sensor_values["filter_percentage"].clear() + client.button_command(buttons["filter_percentage"]) + try: + await asyncio.wait_for(filter_percentage_done, timeout=2.0) + except TimeoutError: + pytest.fail( + f"Test 5 timed out. Values: {sensor_values['filter_percentage']}" + ) + + expected = [100.0, 160.0, 250.0] + assert sensor_values["filter_percentage"] == pytest.approx(expected), ( + f"Test 5 failed: expected {expected}, got {sensor_values['filter_percentage']}" + ) From 2c749e9dbefa3a3b0caf3b2275d2cadb46ee5165 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 26 Feb 2026 13:45:13 +1300 Subject: [PATCH 091/147] Bump version to 2026.2.2 --- Doxyfile | 2 +- esphome/const.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doxyfile b/Doxyfile index d41a79b0dc..2de0460ef1 100644 --- a/Doxyfile +++ b/Doxyfile @@ -48,7 +48,7 @@ PROJECT_NAME = ESPHome # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 2026.2.1 +PROJECT_NUMBER = 2026.2.2 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/esphome/const.py b/esphome/const.py index b3c15b1e27..7d15964eab 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -4,7 +4,7 @@ from enum import Enum from esphome.enum import StrEnum -__version__ = "2026.2.1" +__version__ = "2026.2.2" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 789da5fdf822a7332adb7e670ff2de9353907bc3 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 25 Feb 2026 20:13:44 -0700 Subject: [PATCH 092/147] [logger] Mark Logger and LoggerMessageTrigger as final (#14291) --- esphome/components/logger/logger.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/logger/logger.h b/esphome/components/logger/logger.h index 90722ee79c..263d12b444 100644 --- a/esphome/components/logger/logger.h +++ b/esphome/components/logger/logger.h @@ -141,7 +141,7 @@ enum UARTSelection : uint8_t { * 2. Works with ESP-IDF's pthread implementation that uses a linked list for TLS variables * 3. Avoids the limitations of the fixed FreeRTOS task local storage slots */ -class Logger : public Component { +class Logger final : public Component { public: explicit Logger(uint32_t baud_rate); #ifdef USE_ESPHOME_TASK_LOG_BUFFER @@ -481,7 +481,7 @@ class Logger : public Component { }; extern Logger *global_logger; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -class LoggerMessageTrigger : public Trigger { +class LoggerMessageTrigger final : public Trigger { public: explicit LoggerMessageTrigger(Logger *parent, uint8_t level) : level_(level) { parent->add_log_callback(this, From 478a876b0156763e27605ed22e034fb2ed442a3c Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 25 Feb 2026 20:13:51 -0700 Subject: [PATCH 093/147] [mdns] Mark MDNSComponent as final (#14290) --- esphome/components/mdns/mdns_component.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/mdns/mdns_component.h b/esphome/components/mdns/mdns_component.h index 32f8f16ec1..13c8ccf288 100644 --- a/esphome/components/mdns/mdns_component.h +++ b/esphome/components/mdns/mdns_component.h @@ -40,7 +40,7 @@ struct MDNSService { FixedVector txt_records; }; -class MDNSComponent : public Component { +class MDNSComponent final : public Component { public: void setup() override; void dump_config() override; From cced0a82b55d17ae402425c86dfd9654ed4f7d86 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 25 Feb 2026 20:14:04 -0700 Subject: [PATCH 094/147] [ota] Mark OTA backend and component leaf classes as final (#14287) --- esphome/components/esphome/ota/ota_esphome.h | 2 +- esphome/components/http_request/ota/ota_http_request.h | 2 +- esphome/components/ota/ota_backend_arduino_libretiny.h | 2 +- esphome/components/ota/ota_backend_arduino_rp2040.h | 2 +- esphome/components/ota/ota_backend_esp8266.h | 2 +- esphome/components/ota/ota_backend_esp_idf.h | 2 +- esphome/components/ota/ota_backend_host.h | 2 +- esphome/components/web_server/ota/ota_web_server.h | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/esphome/components/esphome/ota/ota_esphome.h b/esphome/components/esphome/ota/ota_esphome.h index c9e89c82ba..53715cfe6a 100644 --- a/esphome/components/esphome/ota/ota_esphome.h +++ b/esphome/components/esphome/ota/ota_esphome.h @@ -12,7 +12,7 @@ namespace esphome { /// ESPHomeOTAComponent provides a simple way to integrate Over-the-Air updates into your app using ArduinoOTA. -class ESPHomeOTAComponent : public ota::OTAComponent { +class ESPHomeOTAComponent final : public ota::OTAComponent { public: enum class OTAState : uint8_t { IDLE, diff --git a/esphome/components/http_request/ota/ota_http_request.h b/esphome/components/http_request/ota/ota_http_request.h index e3f1a4aa90..6d39b0d466 100644 --- a/esphome/components/http_request/ota/ota_http_request.h +++ b/esphome/components/http_request/ota/ota_http_request.h @@ -22,7 +22,7 @@ enum OtaHttpRequestError : uint8_t { OTA_CONNECTION_ERROR = 0x12, }; -class OtaHttpRequestComponent : public ota::OTAComponent, public Parented { +class OtaHttpRequestComponent final : public ota::OTAComponent, public Parented { public: void dump_config() override; float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } diff --git a/esphome/components/ota/ota_backend_arduino_libretiny.h b/esphome/components/ota/ota_backend_arduino_libretiny.h index 6d9b7a96d5..8f9d268eec 100644 --- a/esphome/components/ota/ota_backend_arduino_libretiny.h +++ b/esphome/components/ota/ota_backend_arduino_libretiny.h @@ -7,7 +7,7 @@ namespace esphome { namespace ota { -class ArduinoLibreTinyOTABackend : public OTABackend { +class ArduinoLibreTinyOTABackend final : public OTABackend { public: OTAResponseTypes begin(size_t image_size) override; void set_update_md5(const char *md5) override; diff --git a/esphome/components/ota/ota_backend_arduino_rp2040.h b/esphome/components/ota/ota_backend_arduino_rp2040.h index b9e10d506c..6a708f9c57 100644 --- a/esphome/components/ota/ota_backend_arduino_rp2040.h +++ b/esphome/components/ota/ota_backend_arduino_rp2040.h @@ -9,7 +9,7 @@ namespace esphome { namespace ota { -class ArduinoRP2040OTABackend : public OTABackend { +class ArduinoRP2040OTABackend final : public OTABackend { public: OTAResponseTypes begin(size_t image_size) override; void set_update_md5(const char *md5) override; diff --git a/esphome/components/ota/ota_backend_esp8266.h b/esphome/components/ota/ota_backend_esp8266.h index a9d6dd2ccc..52f657f006 100644 --- a/esphome/components/ota/ota_backend_esp8266.h +++ b/esphome/components/ota/ota_backend_esp8266.h @@ -12,7 +12,7 @@ namespace esphome::ota { /// OTA backend for ESP8266 using native SDK functions. /// This implementation bypasses the Arduino Updater library to save ~228 bytes of RAM /// by not having a global Update object in .bss. -class ESP8266OTABackend : public OTABackend { +class ESP8266OTABackend final : public OTABackend { public: OTAResponseTypes begin(size_t image_size) override; void set_update_md5(const char *md5) override; diff --git a/esphome/components/ota/ota_backend_esp_idf.h b/esphome/components/ota/ota_backend_esp_idf.h index 764010e614..7f7f6115c5 100644 --- a/esphome/components/ota/ota_backend_esp_idf.h +++ b/esphome/components/ota/ota_backend_esp_idf.h @@ -10,7 +10,7 @@ namespace esphome { namespace ota { -class IDFOTABackend : public OTABackend { +class IDFOTABackend final : public OTABackend { public: OTAResponseTypes begin(size_t image_size) override; void set_update_md5(const char *md5) override; diff --git a/esphome/components/ota/ota_backend_host.h b/esphome/components/ota/ota_backend_host.h index ae7d0cb0b3..5a2dcfcf39 100644 --- a/esphome/components/ota/ota_backend_host.h +++ b/esphome/components/ota/ota_backend_host.h @@ -7,7 +7,7 @@ namespace esphome::ota { /// Stub OTA backend for host platform - allows compilation but does not implement OTA. /// All operations return error codes immediately. This enables configurations with /// OTA triggers to compile for host platform during development. -class HostOTABackend : public OTABackend { +class HostOTABackend final : public OTABackend { public: OTAResponseTypes begin(size_t image_size) override; void set_update_md5(const char *md5) override; diff --git a/esphome/components/web_server/ota/ota_web_server.h b/esphome/components/web_server/ota/ota_web_server.h index 53ff99899c..0857c31c5d 100644 --- a/esphome/components/web_server/ota/ota_web_server.h +++ b/esphome/components/web_server/ota/ota_web_server.h @@ -9,7 +9,7 @@ namespace esphome::web_server { -class WebServerOTAComponent : public ota::OTAComponent { +class WebServerOTAComponent final : public ota::OTAComponent { public: void setup() override; void dump_config() override; From ee4d67930f11a4af1997190f9dc576db8a0d05c2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 25 Feb 2026 20:14:16 -0700 Subject: [PATCH 095/147] [api] Mark ListEntitiesIterator and InitialStateIterator as final (#14284) --- esphome/components/api/list_entities.h | 2 +- esphome/components/api/subscribe_state.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/api/list_entities.h b/esphome/components/api/list_entities.h index 90769f9a81..7d0eb5bb13 100644 --- a/esphome/components/api/list_entities.h +++ b/esphome/components/api/list_entities.h @@ -15,7 +15,7 @@ class APIConnection; return this->client_->schedule_message_(entity, ResponseType::MESSAGE_TYPE, ResponseType::ESTIMATED_SIZE); \ } -class ListEntitiesIterator : public ComponentIterator { +class ListEntitiesIterator final : public ComponentIterator { public: ListEntitiesIterator(APIConnection *client); #ifdef USE_BINARY_SENSOR diff --git a/esphome/components/api/subscribe_state.h b/esphome/components/api/subscribe_state.h index 6f8577ca7b..9edf0f0f0c 100644 --- a/esphome/components/api/subscribe_state.h +++ b/esphome/components/api/subscribe_state.h @@ -16,7 +16,7 @@ class APIConnection; return this->client_->send_##entity_type##_state(entity); \ } -class InitialStateIterator : public ComponentIterator { +class InitialStateIterator final : public ComponentIterator { public: InitialStateIterator(APIConnection *client); #ifdef USE_BINARY_SENSOR From d52f8c9c6f250024f8ce4a353100919cb2b25215 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Wed, 25 Feb 2026 20:14:33 -0700 Subject: [PATCH 096/147] [web_server] Mark classes as final (#14283) --- esphome/components/web_server/list_entities.cpp | 2 -- esphome/components/web_server/list_entities.h | 3 +-- esphome/components/web_server/web_server.h | 6 +++--- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/esphome/components/web_server/list_entities.cpp b/esphome/components/web_server/list_entities.cpp index 8458298062..ebe7bf4450 100644 --- a/esphome/components/web_server/list_entities.cpp +++ b/esphome/components/web_server/list_entities.cpp @@ -14,8 +14,6 @@ ListEntitiesIterator::ListEntitiesIterator(const WebServer *ws, AsyncEventSource ListEntitiesIterator::ListEntitiesIterator(const WebServer *ws, DeferredUpdateEventSource *es) : web_server_(ws), events_(es) {} #endif -ListEntitiesIterator::~ListEntitiesIterator() {} - #ifdef USE_BINARY_SENSOR bool ListEntitiesIterator::on_binary_sensor(binary_sensor::BinarySensor *obj) { this->events_->deferrable_send_state(obj, "state_detail_all", WebServer::binary_sensor_all_json_generator); diff --git a/esphome/components/web_server/list_entities.h b/esphome/components/web_server/list_entities.h index d0a4fa2725..6a84066109 100644 --- a/esphome/components/web_server/list_entities.h +++ b/esphome/components/web_server/list_entities.h @@ -17,14 +17,13 @@ class DeferredUpdateEventSource; #endif class WebServer; -class ListEntitiesIterator : public ComponentIterator { +class ListEntitiesIterator final : public ComponentIterator { public: #ifdef USE_ESP32 ListEntitiesIterator(const WebServer *ws, esphome::web_server_idf::AsyncEventSource *es); #elif defined(USE_ARDUINO) ListEntitiesIterator(const WebServer *ws, DeferredUpdateEventSource *es); #endif - virtual ~ListEntitiesIterator(); #ifdef USE_BINARY_SENSOR bool on_binary_sensor(binary_sensor::BinarySensor *obj) override; #endif diff --git a/esphome/components/web_server/web_server.h b/esphome/components/web_server/web_server.h index 76c1c8b0bd..64c492f82b 100644 --- a/esphome/components/web_server/web_server.h +++ b/esphome/components/web_server/web_server.h @@ -107,7 +107,7 @@ enum JsonDetail { DETAIL_ALL, DETAIL_STATE }; using message_generator_t = json::SerializationBuffer<>(WebServer *, void *); class DeferredUpdateEventSourceList; -class DeferredUpdateEventSource : public AsyncEventSource { +class DeferredUpdateEventSource final : public AsyncEventSource { friend class DeferredUpdateEventSourceList; /* @@ -163,7 +163,7 @@ class DeferredUpdateEventSource : public AsyncEventSource { void try_send_nodefer(const char *message, const char *event = nullptr, uint32_t id = 0, uint32_t reconnect = 0); }; -class DeferredUpdateEventSourceList : public std::list { +class DeferredUpdateEventSourceList final : public std::list { protected: void on_client_connect_(DeferredUpdateEventSource *source); void on_client_disconnect_(DeferredUpdateEventSource *source); @@ -187,7 +187,7 @@ class DeferredUpdateEventSourceList : public std::list Date: Wed, 25 Feb 2026 20:14:53 -0700 Subject: [PATCH 097/147] [safe_mode] Mark SafeModeComponent and SafeModeTrigger as final (#14282) --- esphome/components/safe_mode/automation.h | 2 +- esphome/components/safe_mode/safe_mode.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/safe_mode/automation.h b/esphome/components/safe_mode/automation.h index 952ed4da33..1d82ac45f1 100644 --- a/esphome/components/safe_mode/automation.h +++ b/esphome/components/safe_mode/automation.h @@ -8,7 +8,7 @@ namespace esphome::safe_mode { -class SafeModeTrigger : public Trigger<> { +class SafeModeTrigger final : public Trigger<> { public: explicit SafeModeTrigger(SafeModeComponent *parent) { parent->add_on_safe_mode_callback([this]() { trigger(); }); diff --git a/esphome/components/safe_mode/safe_mode.h b/esphome/components/safe_mode/safe_mode.h index a4d27c15da..902b8c415d 100644 --- a/esphome/components/safe_mode/safe_mode.h +++ b/esphome/components/safe_mode/safe_mode.h @@ -15,7 +15,7 @@ namespace esphome::safe_mode { constexpr uint32_t RTC_KEY = 233825507UL; /// SafeModeComponent provides a safe way to recover from repeated boot failures -class SafeModeComponent : public Component { +class SafeModeComponent final : public Component { public: bool should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time, uint32_t boot_is_good_after); From 6c253f0c71958a182cf1d9c4ad64a10b2b62957f Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Thu, 26 Feb 2026 08:40:43 -0500 Subject: [PATCH 098/147] [sprinkler] Fix millis overflow and underflow bugs (#14299) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- esphome/components/sprinkler/sprinkler.cpp | 81 +++++++++++----------- esphome/components/sprinkler/sprinkler.h | 4 +- 2 files changed, 43 insertions(+), 42 deletions(-) diff --git a/esphome/components/sprinkler/sprinkler.cpp b/esphome/components/sprinkler/sprinkler.cpp index 9e423c1760..d82d7baaf6 100644 --- a/esphome/components/sprinkler/sprinkler.cpp +++ b/esphome/components/sprinkler/sprinkler.cpp @@ -84,32 +84,30 @@ SprinklerValveOperator::SprinklerValveOperator(SprinklerValve *valve, Sprinkler : controller_(controller), valve_(valve) {} void SprinklerValveOperator::loop() { + // Use wrapping subtraction so 32-bit millis() rollover is handled correctly: + // (now - start) yields the true elapsed time even across the 49.7-day boundary. uint32_t now = App.get_loop_component_start_time(); - if (now >= this->start_millis_) { // dummy check - switch (this->state_) { - case STARTING: - if (now > (this->start_millis_ + this->start_delay_)) { - this->run_(); // start_delay_ has been exceeded, so ensure both valves are on and update the state - } - break; + switch (this->state_) { + case STARTING: + if ((now - *this->start_millis_) > this->start_delay_) { + this->run_(); // start_delay_ has been exceeded, so ensure both valves are on and update the state + } + break; - case ACTIVE: - if (now > (this->start_millis_ + this->start_delay_ + this->run_duration_)) { - this->stop(); // start_delay_ + run_duration_ has been exceeded, start shutting down - } - break; + case ACTIVE: + if ((now - *this->start_millis_) > (this->start_delay_ + this->run_duration_)) { + this->stop(); // start_delay_ + run_duration_ has been exceeded, start shutting down + } + break; - case STOPPING: - if (now > (this->stop_millis_ + this->stop_delay_)) { - this->kill_(); // stop_delay_has been exceeded, ensure all valves are off - } - break; + case STOPPING: + if ((now - *this->stop_millis_) > this->stop_delay_) { + this->kill_(); // stop_delay_has been exceeded, ensure all valves are off + } + break; - default: - break; - } - } else { // perhaps millis() rolled over...or something else is horribly wrong! - this->stop(); // bail out (TODO: handle this highly unlikely situation better...) + default: + break; } } @@ -124,11 +122,11 @@ void SprinklerValveOperator::set_valve(SprinklerValve *valve) { if (this->state_ != IDLE) { // Only kill if not already idle this->kill_(); // ensure everything is off before we let go! } - this->state_ = IDLE; // reset state - this->run_duration_ = 0; // reset to ensure the valve isn't started without updating it - this->start_millis_ = 0; // reset because (new) valve has not been started yet - this->stop_millis_ = 0; // reset because (new) valve has not been started yet - this->valve_ = valve; // finally, set the pointer to the new valve + this->state_ = IDLE; // reset state + this->run_duration_ = 0; // reset to ensure the valve isn't started without updating it + this->start_millis_.reset(); // reset because (new) valve has not been started yet + this->stop_millis_.reset(); // reset because (new) valve has not been started yet + this->valve_ = valve; // finally, set the pointer to the new valve } } @@ -162,7 +160,7 @@ void SprinklerValveOperator::start() { } else { this->run_(); // there is no start_delay_, so just start the pump and valve } - this->stop_millis_ = 0; + this->stop_millis_.reset(); this->start_millis_ = millis(); // save the time the start request was made } @@ -189,22 +187,25 @@ void SprinklerValveOperator::stop() { uint32_t SprinklerValveOperator::run_duration() { return this->run_duration_ / 1000; } uint32_t SprinklerValveOperator::time_remaining() { - if (this->start_millis_ == 0) { + if (!this->start_millis_.has_value()) { return this->run_duration(); // hasn't been started yet } - if (this->stop_millis_) { - if (this->stop_millis_ - this->start_millis_ >= this->start_delay_ + this->run_duration_) { + if (this->stop_millis_.has_value()) { + uint32_t elapsed = *this->stop_millis_ - *this->start_millis_; + if (elapsed >= this->start_delay_ + this->run_duration_) { return 0; // valve was active for more than its configured duration, so we are done - } else { - // we're stopped; return time remaining - return (this->run_duration_ - (this->stop_millis_ - this->start_millis_)) / 1000; } + if (elapsed <= this->start_delay_) { + return this->run_duration_ / 1000; // stopped during start delay, full run duration remains + } + return (this->run_duration_ - (elapsed - this->start_delay_)) / 1000; } - auto completed_millis = this->start_millis_ + this->start_delay_ + this->run_duration_; - if (completed_millis > millis()) { - return (completed_millis - millis()) / 1000; // running now + uint32_t elapsed = millis() - *this->start_millis_; + uint32_t total_duration = this->start_delay_ + this->run_duration_; + if (elapsed < total_duration) { + return (total_duration - elapsed) / 1000; // running now } return 0; // run completed } @@ -593,7 +594,7 @@ void Sprinkler::set_repeat(optional repeat) { if (this->repeat_number_ == nullptr) { return; } - if (this->repeat_number_->state == repeat.value()) { + if (this->repeat_number_->state == repeat.value_or(0)) { return; } auto call = this->repeat_number_->make_call(); @@ -793,7 +794,7 @@ void Sprinkler::start_single_valve(const optional valve_number, optional void Sprinkler::queue_valve(optional valve_number, optional run_duration) { if (valve_number.has_value()) { if (this->is_a_valid_valve(valve_number.value()) && (this->queued_valves_.size() < this->max_queue_size_)) { - SprinklerQueueItem item{valve_number.value(), run_duration.value()}; + SprinklerQueueItem item{valve_number.value(), run_duration.value_or(0)}; this->queued_valves_.insert(this->queued_valves_.begin(), item); ESP_LOGD(TAG, "Valve %zu placed into queue with run duration of %" PRIu32 " seconds", valve_number.value_or(0), run_duration.value_or(0)); @@ -1080,7 +1081,7 @@ uint32_t Sprinkler::total_cycle_time_enabled_incomplete_valves() { } } - if (incomplete_valve_count >= enabled_valve_count) { + if (incomplete_valve_count > 0 && incomplete_valve_count >= enabled_valve_count) { incomplete_valve_count--; } if (incomplete_valve_count) { diff --git a/esphome/components/sprinkler/sprinkler.h b/esphome/components/sprinkler/sprinkler.h index a3cdef5b1a..2598a5606a 100644 --- a/esphome/components/sprinkler/sprinkler.h +++ b/esphome/components/sprinkler/sprinkler.h @@ -141,8 +141,8 @@ class SprinklerValveOperator { uint32_t start_delay_{0}; uint32_t stop_delay_{0}; uint32_t run_duration_{0}; - uint64_t start_millis_{0}; - uint64_t stop_millis_{0}; + optional start_millis_{}; + optional stop_millis_{}; Sprinkler *controller_{nullptr}; SprinklerValve *valve_{nullptr}; SprinklerState state_{IDLE}; From a05d0202e696b5498787b3b895acd71915844ac5 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 09:21:27 -0700 Subject: [PATCH 099/147] [core] ESP32: massively reduce main loop socket polling overhead by replacing select() (#14249) --- esphome/components/socket/__init__.py | 8 +- esphome/components/socket/socket.h | 2 +- esphome/core/application.cpp | 102 ++++++--- esphome/core/application.h | 47 ++-- esphome/core/lwip_fast_select.c | 216 ++++++++++++++++++ esphome/core/lwip_fast_select.h | 33 +++ .../socket/test_wake_loop_threadsafe.py | 39 ++++ 7 files changed, 397 insertions(+), 50 deletions(-) create mode 100644 esphome/core/lwip_fast_select.c create mode 100644 esphome/core/lwip_fast_select.h diff --git a/esphome/components/socket/__init__.py b/esphome/components/socket/__init__.py index d82f0c7aba..5f4d04eb44 100644 --- a/esphome/components/socket/__init__.py +++ b/esphome/components/socket/__init__.py @@ -134,6 +134,8 @@ def require_wake_loop_threadsafe() -> None: IMPORTANT: This is for background thread context only, NOT ISR context. Socket operations are not safe to call from ISR handlers. + On ESP32, FreeRTOS task notifications are used instead (no socket needed). + Example: from esphome.components import socket @@ -147,8 +149,10 @@ def require_wake_loop_threadsafe() -> None: ): CORE.data[KEY_WAKE_LOOP_THREADSAFE_REQUIRED] = True cg.add_define("USE_WAKE_LOOP_THREADSAFE") - # Consume 1 socket for the shared wake notification socket - consume_sockets(1, "socket.wake_loop_threadsafe", SocketType.UDP)({}) + if not CORE.is_esp32: + # Only non-ESP32 platforms need a UDP socket for wake notifications. + # ESP32 uses FreeRTOS task notifications instead (no socket needed). + consume_sockets(1, "socket.wake_loop_threadsafe", SocketType.UDP)({}) CONFIG_SCHEMA = cv.Schema( diff --git a/esphome/components/socket/socket.h b/esphome/components/socket/socket.h index c0098d689a..a771e2fe1a 100644 --- a/esphome/components/socket/socket.h +++ b/esphome/components/socket/socket.h @@ -71,7 +71,7 @@ class Socket { int get_fd() const { return -1; } #endif - /// Check if socket has data ready to read + /// Check if socket has data ready to read. Must only be called from the main loop thread. /// For select()-based sockets: non-virtual, checks Application's select() results /// For LWIP raw TCP sockets: virtual, checks internal buffer state #ifdef USE_SOCKET_SELECT_SUPPORT diff --git a/esphome/core/application.cpp b/esphome/core/application.cpp index 6a7683a987..fd6a14b50f 100644 --- a/esphome/core/application.cpp +++ b/esphome/core/application.cpp @@ -9,6 +9,9 @@ #endif #ifdef USE_ESP32 #include +#include "esphome/core/lwip_fast_select.h" +#include +#include #endif #include "esphome/core/version.h" #include "esphome/core/hal.h" @@ -144,8 +147,14 @@ void Application::setup() { clear_setup_priority_overrides(); #endif -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) - // Set up wake socket for waking main loop from tasks +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_ESP32) + // Initialize fast select: saves main loop task handle for xTaskNotifyGive wake. + // Always init on ESP32 — the fast path (rcvevent reads + ulTaskNotifyTake) is used + // unconditionally when USE_SOCKET_SELECT_SUPPORT is enabled. + esphome_lwip_fast_select_init(); +#endif +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) + // Set up wake socket for waking main loop from tasks (non-ESP32 only) this->setup_wake_loop_threadsafe_(); #endif @@ -523,7 +532,7 @@ void Application::enable_pending_loops_() { } void Application::before_loop_tasks_(uint32_t loop_start_time) { -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) // Drain wake notifications first to clear socket for next wake this->drain_wake_notifications_(); #endif @@ -576,11 +585,15 @@ bool Application::register_socket_fd(int fd) { #endif this->socket_fds_.push_back(fd); +#ifdef USE_ESP32 + // Hook the socket's netconn callback for instant wake on receive events + esphome_lwip_hook_socket(fd); +#else this->socket_fds_changed_ = true; - if (fd > this->max_fd_) { this->max_fd_ = fd; } +#endif return true; } @@ -595,12 +608,14 @@ void Application::unregister_socket_fd(int fd) { if (this->socket_fds_[i] != fd) continue; - // Swap with last element and pop - O(1) removal since order doesn't matter + // Swap with last element and pop - O(1) removal since order doesn't matter. + // No need to unhook the netconn callback on ESP32 — all LwIP sockets share + // the same static event_callback, and the socket will be closed by the caller. if (i < this->socket_fds_.size() - 1) this->socket_fds_[i] = this->socket_fds_.back(); this->socket_fds_.pop_back(); +#ifndef USE_ESP32 this->socket_fds_changed_ = true; - // Only recalculate max_fd if we removed the current max if (fd == this->max_fd_) { this->max_fd_ = -1; @@ -609,6 +624,7 @@ void Application::unregister_socket_fd(int fd) { this->max_fd_ = sock_fd; } } +#endif return; } } @@ -616,16 +632,41 @@ void Application::unregister_socket_fd(int fd) { #endif void Application::yield_with_select_(uint32_t delay_ms) { - // Delay while monitoring sockets. When delay_ms is 0, always yield() to ensure other tasks run - // since select() with 0 timeout only polls without yielding. -#ifdef USE_SOCKET_SELECT_SUPPORT - if (!this->socket_fds_.empty()) { + // Delay while monitoring sockets. When delay_ms is 0, always yield() to ensure other tasks run. +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_ESP32) + // ESP32 fast path: reads rcvevent directly via lwip_socket_dbg_get_socket() (~215 ns per socket). + // Safe because this runs on the main loop which owns socket lifetime (create, read, close). + if (delay_ms == 0) [[unlikely]] { + yield(); + return; + } + + // Check if any socket already has pending data before sleeping. + // If a socket still has unread data (rcvevent > 0) but the task notification was already + // consumed, ulTaskNotifyTake would block until timeout — adding up to delay_ms latency. + // This scan preserves select() semantics: return immediately when any fd is ready. + for (int fd : this->socket_fds_) { + if (esphome_lwip_socket_has_data(fd)) { + yield(); + return; + } + } + + // Sleep with instant wake via FreeRTOS task notification. + // Woken by: callback wrapper (socket data arrives), wake_loop_threadsafe() (other tasks), or timeout. + // Without USE_WAKE_LOOP_THREADSAFE, only hooked socket callbacks wake the task — + // background tasks won't call wake, so this degrades to a pure timeout (same as old select path). + ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(delay_ms)); + +#elif defined(USE_SOCKET_SELECT_SUPPORT) + // Non-ESP32 select() path (LibreTiny bk72xx/rtl87xx, host platform). + // ESP32 is excluded by the #if above — both BSD_SOCKETS and LWIP_SOCKETS on ESP32 + // use LwIP under the hood, so the fast path handles all ESP32 socket implementations. + if (!this->socket_fds_.empty()) [[likely]] { // Update fd_set if socket list has changed - if (this->socket_fds_changed_) { + if (this->socket_fds_changed_) [[unlikely]] { FD_ZERO(&this->base_read_fds_); - // fd bounds are already validated in register_socket_fd() or guaranteed by platform design: - // - ESP32: LwIP guarantees fd < FD_SETSIZE by design (LWIP_SOCKET_OFFSET = FD_SETSIZE - CONFIG_LWIP_MAX_SOCKETS) - // - Other platforms: register_socket_fd() validates fd < FD_SETSIZE + // fd bounds are validated in register_socket_fd() for (int fd : this->socket_fds_) { FD_SET(fd, &this->base_read_fds_); } @@ -641,7 +682,7 @@ void Application::yield_with_select_(uint32_t delay_ms) { tv.tv_usec = (delay_ms - tv.tv_sec * 1000) * 1000; // Call select with timeout -#if defined(USE_SOCKET_IMPL_LWIP_SOCKETS) || (defined(USE_ESP32) && defined(USE_SOCKET_IMPL_BSD_SOCKETS)) +#ifdef USE_SOCKET_IMPL_LWIP_SOCKETS int ret = lwip_select(this->max_fd_ + 1, &this->read_fds_, nullptr, nullptr, &tv); #else int ret = ::select(this->max_fd_ + 1, &this->read_fds_, nullptr, nullptr, &tv); @@ -651,19 +692,18 @@ void Application::yield_with_select_(uint32_t delay_ms) { // ret < 0: error (except EINTR which is normal) // ret > 0: socket(s) have data ready - normal and expected // ret == 0: timeout occurred - normal and expected - if (ret < 0 && errno != EINTR) { - // Actual error - log and fall back to delay - ESP_LOGW(TAG, "select() failed with errno %d", errno); - delay(delay_ms); + if (ret >= 0 || errno == EINTR) [[likely]] { + // Yield if zero timeout since select(0) only polls without yielding + if (delay_ms == 0) [[unlikely]] { + yield(); + } + return; } - // When delay_ms is 0, we need to yield since select(0) doesn't yield - if (delay_ms == 0) { - yield(); - } - } else { - // No sockets registered, use regular delay - delay(delay_ms); + // select() error - log and fall through to delay() + ESP_LOGW(TAG, "select() failed with errno %d", errno); } + // No sockets registered or select() failed - use regular delay + delay(delay_ms); #elif defined(USE_ESP8266) && defined(USE_SOCKET_IMPL_LWIP_TCP) // No select support but can wake on socket activity via esp_schedule() socket::socket_delay(delay_ms); @@ -676,6 +716,14 @@ void Application::yield_with_select_(uint32_t delay_ms) { Application App; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) #if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) + +#ifdef USE_ESP32 +void Application::wake_loop_threadsafe() { + // Direct FreeRTOS task notification — <1 us, task context only (NOT ISR-safe) + esphome_lwip_wake_main_loop(); +} +#else // !USE_ESP32 + void Application::setup_wake_loop_threadsafe_() { // Create UDP socket for wake notifications this->wake_socket_fd_ = lwip_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); @@ -742,6 +790,8 @@ void Application::wake_loop_threadsafe() { lwip_send(this->wake_socket_fd_, &dummy, 1, 0); } } +#endif // USE_ESP32 + #endif // defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) void Application::get_build_time_string(std::span buffer) { diff --git a/esphome/core/application.h b/esphome/core/application.h index cd275bb97f..f5df5e7bdf 100644 --- a/esphome/core/application.h +++ b/esphome/core/application.h @@ -24,10 +24,14 @@ #endif #ifdef USE_SOCKET_SELECT_SUPPORT +#ifdef USE_ESP32 +#include "esphome/core/lwip_fast_select.h" +#else #include #ifdef USE_WAKE_LOOP_THREADSAFE #include #endif +#endif #endif // USE_SOCKET_SELECT_SUPPORT #ifdef USE_BINARY_SENSOR @@ -491,15 +495,12 @@ class Application { /// @return true if registration was successful, false if fd exceeds limits bool register_socket_fd(int fd); void unregister_socket_fd(int fd); - /// Check if there's data available on a socket without blocking - /// This function is thread-safe for reading, but should be called after select() has run - /// The read_fds_ is only modified by select() in the main loop - bool is_socket_ready(int fd) const { return fd >= 0 && this->is_socket_ready_(fd); } #ifdef USE_WAKE_LOOP_THREADSAFE - /// Wake the main event loop from a FreeRTOS task - /// Thread-safe, can be called from task context to immediately wake select() - /// IMPORTANT: NOT safe to call from ISR context (socket operations not ISR-safe) + /// Wake the main event loop from another FreeRTOS task. + /// Thread-safe, but must only be called from task context (NOT ISR-safe). + /// On ESP32: uses xTaskNotifyGive (<1 us) + /// On other platforms: uses UDP loopback socket void wake_loop_threadsafe(); #endif #endif @@ -510,10 +511,14 @@ class Application { #ifdef USE_SOCKET_SELECT_SUPPORT /// Fast path for Socket::ready() via friendship - skips negative fd check. - /// Safe because: fd was validated in register_socket_fd() at registration time, - /// and Socket::ready() only calls this when loop_monitored_ is true (registration succeeded). - /// FD_ISSET may include its own upper bounds check depending on platform. + /// Main loop only — on ESP32, reads rcvevent via lwip_socket_dbg_get_socket() + /// which has no refcount; safe only because the main loop owns socket lifetime + /// (creates, reads, and closes sockets on the same thread). +#ifdef USE_ESP32 + bool is_socket_ready_(int fd) const { return esphome_lwip_socket_has_data(fd); } +#else bool is_socket_ready_(int fd) const { return FD_ISSET(fd, &this->read_fds_); } +#endif #endif void register_component_(Component *comp); @@ -541,7 +546,7 @@ class Application { /// Perform a delay while also monitoring socket file descriptors for readiness void yield_with_select_(uint32_t delay_ms); -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) void setup_wake_loop_threadsafe_(); // Create wake notification socket inline void drain_wake_notifications_(); // Read pending wake notifications in main loop (hot path - inlined) #endif @@ -571,7 +576,7 @@ class Application { FixedVector looping_components_{}; #ifdef USE_SOCKET_SELECT_SUPPORT std::vector socket_fds_; // Vector of all monitored socket file descriptors -#ifdef USE_WAKE_LOOP_THREADSAFE +#if defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) int wake_socket_fd_{-1}; // Shared wake notification socket for waking main loop from tasks #endif #endif @@ -584,7 +589,7 @@ class Application { uint32_t last_loop_{0}; uint32_t loop_component_start_time_{0}; -#ifdef USE_SOCKET_SELECT_SUPPORT +#if defined(USE_SOCKET_SELECT_SUPPORT) && !defined(USE_ESP32) int max_fd_{-1}; // Highest file descriptor number for select() #endif @@ -600,14 +605,14 @@ class Application { bool in_loop_{false}; volatile bool has_pending_enable_loop_requests_{false}; -#ifdef USE_SOCKET_SELECT_SUPPORT +#if defined(USE_SOCKET_SELECT_SUPPORT) && !defined(USE_ESP32) bool socket_fds_changed_{false}; // Flag to rebuild base_read_fds_ when socket_fds_ changes #endif -#ifdef USE_SOCKET_SELECT_SUPPORT - // Variable-sized members +#if defined(USE_SOCKET_SELECT_SUPPORT) && !defined(USE_ESP32) + // Variable-sized members (not needed on ESP32 — is_socket_ready_ reads rcvevent directly) + fd_set read_fds_{}; // Working fd_set: populated by select() fd_set base_read_fds_{}; // Cached fd_set rebuilt only when socket_fds_ changes - fd_set read_fds_{}; // Working fd_set for select(), copied from base_read_fds_ #endif // StaticVectors (largest members - contain actual array data inline) @@ -694,7 +699,7 @@ class Application { /// Global storage of Application pointer - only one Application can exist. extern Application App; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) // Inline implementations for hot-path functions // drain_wake_notifications_() is called on every loop iteration @@ -704,8 +709,8 @@ static constexpr size_t WAKE_NOTIFY_DRAIN_BUFFER_SIZE = 16; inline void Application::drain_wake_notifications_() { // Called from main loop to drain any pending wake notifications - // Must check is_socket_ready() to avoid blocking on empty socket - if (this->wake_socket_fd_ >= 0 && this->is_socket_ready(this->wake_socket_fd_)) { + // Must check is_socket_ready_() to avoid blocking on empty socket + if (this->wake_socket_fd_ >= 0 && this->is_socket_ready_(this->wake_socket_fd_)) { char buffer[WAKE_NOTIFY_DRAIN_BUFFER_SIZE]; // Drain all pending notifications with non-blocking reads // Multiple wake events may have triggered multiple writes, so drain until EWOULDBLOCK @@ -716,6 +721,6 @@ inline void Application::drain_wake_notifications_() { } } } -#endif // defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) +#endif // defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) } // namespace esphome diff --git a/esphome/core/lwip_fast_select.c b/esphome/core/lwip_fast_select.c new file mode 100644 index 0000000000..70a6482d48 --- /dev/null +++ b/esphome/core/lwip_fast_select.c @@ -0,0 +1,216 @@ +// Fast socket monitoring for ESP32 (ESP-IDF LwIP) +// Replaces lwip_select() with direct rcvevent reads and FreeRTOS task notifications. +// +// This must be a .c file (not .cpp) because: +// 1. lwip/priv/sockets_priv.h conflicts with C++ compilation units that include bootloader headers +// 2. The netconn callback is a C function pointer +// +// defines.h is force-included by the build system (-include flag), providing USE_ESP32 etc. +// +// Thread safety analysis +// ====================== +// Three threads interact with this code: +// 1. Main loop task — calls init, has_data, hook +// 2. LwIP TCP/IP task — calls event_callback (reads s_original_callback; writes rcvevent +// via the original callback under SYS_ARCH_PROTECT/UNPROTECT mutex) +// 3. Background tasks — call wake_main_loop +// +// LwIP source references (ESP-IDF v5.5.2, commit 30aaf64524): +// sockets.c: https://github.com/espressif/esp-idf/blob/30aaf64524/components/lwip/lwip/src/api/sockets.c +// - event_callback (static, same for all sockets): L327 +// - DEFAULT_SOCKET_EVENTCB = event_callback: L328 +// - tryget_socket_unconn_nouse (direct array lookup): L450 +// - lwip_socket_dbg_get_socket (thin wrapper): L461 +// - All socket types use DEFAULT_SOCKET_EVENTCB: L1741, L1748, L1759 +// - event_callback definition: L2538 +// - SYS_ARCH_PROTECT before rcvevent switch: L2578 +// - sock->rcvevent++ (NETCONN_EVT_RCVPLUS case): L2582 +// - SYS_ARCH_UNPROTECT after switch: L2615 +// sys.h: https://github.com/espressif/esp-idf/blob/30aaf64524/components/lwip/lwip/src/include/lwip/sys.h +// - SYS_ARCH_PROTECT calls sys_arch_protect(): L495 +// - SYS_ARCH_UNPROTECT calls sys_arch_unprotect(): L506 +// (ESP-IDF implements sys_arch_protect/unprotect as FreeRTOS mutex lock/unlock) +// +// Socket slot lifetime +// ==================== +// This code reads struct lwip_sock fields without SYS_ARCH_PROTECT. The safety +// argument requires that the slot cannot be freed while we read it. +// +// In LwIP, the socket table is a static array and slots are only freed via: +// lwip_close() -> lwip_close_internal() -> free_socket_free_elements() -> free_socket() +// The TCP/IP thread does NOT call free_socket(). On link loss, RST, or timeout +// it frees the TCP PCB and signals the netconn (rcvevent++ to indicate EOF), but +// the netconn and lwip_sock slot remain allocated until the application calls +// lwip_close(). ESPHome removes the fd from the monitored set before calling +// lwip_close(). +// +// Therefore lwip_socket_dbg_get_socket(fd) plus a volatile read of rcvevent +// (to prevent compiler reordering or caching) is safe as long as the application +// is single-writer for close. ESPHome guarantees this by design: all socket +// create/read/close happens on the main loop. fd numbers are not reused while +// the slot remains allocated, and the slot remains allocated until lwip_close(). +// Any change in LwIP that allows free_socket() to be called outside lwip_close() +// would invalidate this assumption. +// +// LwIP source references for slot lifetime: +// sockets.c (same commit as above): +// - alloc_socket (slot allocation): L419 +// - free_socket (slot deallocation): L384 +// - free_socket_free_elements (called from lwip_close_internal): L393 +// - lwip_close_internal (only caller of free_socket_free_elements): L2355 +// - lwip_close (only caller of lwip_close_internal): L2450 +// +// Shared state and safety rationale: +// +// s_main_loop_task (TaskHandle_t, 4 bytes): +// Written once by main loop in init(). Read by TCP/IP thread (in callback) +// and background tasks (in wake). +// Safe: write-once-then-read pattern. Socket hooks may run before init(), +// but the NULL check on s_main_loop_task in the callback provides correct +// degraded behavior — notifications are simply skipped until init() completes. +// +// s_original_callback (netconn_callback, 4-byte function pointer): +// Written by main loop in hook_socket() (only when NULL — set once). +// Read by TCP/IP thread in esphome_socket_event_callback(). +// Safe: set-once pattern. The first hook_socket() captures the original callback. +// All subsequent hooks see it already set and skip the write. The TCP/IP thread +// only reads this after the callback pointer has been swapped (which happens after +// the write), so it always sees the initialized value. +// +// sock->conn->callback (netconn_callback, 4-byte function pointer): +// Written by main loop in hook_socket(). Never restored — all LwIP sockets share +// the same static event_callback (DEFAULT_SOCKET_EVENTCB), so the wrapper stays permanently. +// Read by TCP/IP thread when invoking the callback. +// Safe: 32-bit aligned pointer writes are atomic on Xtensa and RISC-V (ESP32). +// The TCP/IP thread will see either the old or new pointer atomically — never a +// torn value. Both the wrapper and original callbacks are valid at all times +// (the wrapper itself calls the original), so either value is correct. +// +// sock->rcvevent (s16_t, 2 bytes): +// Written by TCP/IP thread in event_callback under SYS_ARCH_PROTECT. +// Read by main loop in has_data() via volatile cast. +// Safe: SYS_ARCH_UNPROTECT releases a FreeRTOS mutex, which internally +// uses a critical section with memory barrier (rsync on dual-core Xtensa; on +// single-core builds the spinlock is compiled out, but cross-core visibility is +// not an issue). The volatile cast prevents the compiler +// from caching the read. Aligned 16-bit reads are single-instruction loads on +// Xtensa (L16SI) and RISC-V (LH), which cannot produce torn values. +// +// FreeRTOS task notification value: +// Written by TCP/IP thread (xTaskNotifyGive in callback) and background tasks +// (xTaskNotifyGive in wake_main_loop). Read by main loop (ulTaskNotifyTake). +// Safe: FreeRTOS notification APIs are thread-safe by design (use internal +// critical sections). Multiple concurrent xTaskNotifyGive calls are safe — +// the notification count simply increments. + +#ifdef USE_ESP32 + +// LwIP headers must come first — they define netconn_callback, struct lwip_sock, etc. +#include +#include +#include +#include + +#include "esphome/core/lwip_fast_select.h" + +#include + +// Compile-time verification of thread safety assumptions. +// On ESP32 (Xtensa/RISC-V), naturally-aligned reads/writes up to 32 bits are atomic. +// These asserts ensure our cross-thread shared state meets those requirements. + +// Pointer types must fit in a single 32-bit store (atomic write) +_Static_assert(sizeof(TaskHandle_t) <= 4, "TaskHandle_t must be <= 4 bytes for atomic access"); +_Static_assert(sizeof(netconn_callback) <= 4, "netconn_callback must be <= 4 bytes for atomic access"); + +// rcvevent must fit in a single atomic read +_Static_assert(sizeof(((struct lwip_sock *) 0)->rcvevent) <= 4, "rcvevent must be <= 4 bytes for atomic access"); + +// Struct member alignment — natural alignment guarantees atomicity on Xtensa/RISC-V. +// Misaligned access would not be atomic even if the size is <= 4 bytes. +_Static_assert(offsetof(struct netconn, callback) % sizeof(netconn_callback) == 0, + "netconn.callback must be naturally aligned for atomic access"); +_Static_assert(offsetof(struct lwip_sock, rcvevent) % sizeof(((struct lwip_sock *) 0)->rcvevent) == 0, + "lwip_sock.rcvevent must be naturally aligned for atomic access"); + +// Task handle for the main loop — written once in init(), read from TCP/IP and background tasks. +static TaskHandle_t s_main_loop_task = NULL; + +// Saved original event_callback pointer — written once in first hook_socket(), read from TCP/IP task. +static netconn_callback s_original_callback = NULL; + +// Wrapper callback: calls original event_callback + notifies main loop task. +// Called from LwIP's TCP/IP thread when socket events occur (task context, not ISR). +static void esphome_socket_event_callback(struct netconn *conn, enum netconn_evt evt, u16_t len) { + // Call original LwIP event_callback first — updates rcvevent/sendevent/errevent, + // signals any select() waiters. This preserves all LwIP behavior. + // s_original_callback is always valid here: hook_socket() sets it before swapping + // the callback pointer, so this wrapper cannot run until it's initialized. + s_original_callback(conn, evt, len); + // Wake the main loop task if sleeping in ulTaskNotifyTake(). + // Only notify on receive events to avoid spurious wakeups from send-ready events. + // NETCONN_EVT_ERROR is deliberately omitted: LwIP signals errors via RCVPLUS + // (rcvevent++ with a NULL pbuf or error in recvmbox), so error conditions + // already wake the main loop through the RCVPLUS path. + if (evt == NETCONN_EVT_RCVPLUS) { + TaskHandle_t task = s_main_loop_task; + if (task != NULL) { + xTaskNotifyGive(task); + } + } +} + +void esphome_lwip_fast_select_init(void) { s_main_loop_task = xTaskGetCurrentTaskHandle(); } + +// lwip_socket_dbg_get_socket() is a thin wrapper around the static +// tryget_socket_unconn_nouse() — a direct array lookup without the refcount +// that get_socket()/done_socket() uses. This is safe because: +// 1. The only path to free_socket() is lwip_close(), called exclusively from the main loop +// 2. The TCP/IP thread never frees socket slots (see "Socket slot lifetime" above) +// 3. Both has_data() reads and lwip_close() run on the main loop — no concurrent free +// If lwip_socket_dbg_get_socket() were ever removed, we could fall back to lwip_select(). +// Returns the sock only if both the sock and its netconn are valid, NULL otherwise. +static inline struct lwip_sock *get_sock(int fd) { + struct lwip_sock *sock = lwip_socket_dbg_get_socket(fd); + if (sock == NULL || sock->conn == NULL) + return NULL; + return sock; +} + +bool esphome_lwip_socket_has_data(int fd) { + struct lwip_sock *sock = get_sock(fd); + if (sock == NULL) + return false; + // volatile prevents the compiler from caching/reordering this cross-thread read. + // The write side (TCP/IP thread) commits via SYS_ARCH_UNPROTECT which releases a + // FreeRTOS mutex with a memory barrier (rsync on Xtensa), ensuring the value is + // visible. Aligned 16-bit reads are single-instruction loads (L16SI/LH) on + // Xtensa/RISC-V and cannot produce torn values. + return *(volatile s16_t *) &sock->rcvevent > 0; +} + +void esphome_lwip_hook_socket(int fd) { + struct lwip_sock *sock = get_sock(fd); + if (sock == NULL) + return; + + // Save original callback once — all LwIP sockets share the same static event_callback + // (DEFAULT_SOCKET_EVENTCB in sockets.c, used for SOCK_RAW, SOCK_DGRAM, and SOCK_STREAM). + if (s_original_callback == NULL) { + s_original_callback = sock->conn->callback; + } + + // Replace with our wrapper. Atomic on ESP32 (32-bit aligned pointer write). + // TCP/IP thread sees either old or new pointer — both are valid. + sock->conn->callback = esphome_socket_event_callback; +} + +// Wake the main loop from another FreeRTOS task. NOT ISR-safe. +void esphome_lwip_wake_main_loop(void) { + TaskHandle_t task = s_main_loop_task; + if (task != NULL) { + xTaskNotifyGive(task); + } +} + +#endif // USE_ESP32 diff --git a/esphome/core/lwip_fast_select.h b/esphome/core/lwip_fast_select.h new file mode 100644 index 0000000000..73a89fdc3d --- /dev/null +++ b/esphome/core/lwip_fast_select.h @@ -0,0 +1,33 @@ +#pragma once + +// Fast socket monitoring for ESP32 (ESP-IDF LwIP) +// Replaces lwip_select() with direct rcvevent reads and FreeRTOS task notifications. + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/// Initialize fast select — must be called from the main loop task during setup(). +/// Saves the current task handle for xTaskNotifyGive() wake notifications. +void esphome_lwip_fast_select_init(void); + +/// Check if a LwIP socket has data ready via direct rcvevent read (~215 ns per socket). +/// Uses lwip_socket_dbg_get_socket() — a direct array lookup without the refcount that +/// get_socket()/done_socket() uses. Safe because the caller owns the socket lifetime: +/// both has_data reads and socket close/unregister happen on the main loop thread. +bool esphome_lwip_socket_has_data(int fd); + +/// Hook a socket's netconn callback to notify the main loop task on receive events. +/// Wraps the original event_callback with one that also calls xTaskNotifyGive(). +/// Must be called from the main loop after socket creation. +void esphome_lwip_hook_socket(int fd); + +/// Wake the main loop task from another FreeRTOS task — costs <1 us. +/// NOT ISR-safe — must only be called from task context. +void esphome_lwip_wake_main_loop(void); + +#ifdef __cplusplus +} +#endif diff --git a/tests/components/socket/test_wake_loop_threadsafe.py b/tests/components/socket/test_wake_loop_threadsafe.py index a40b6068a8..28b4ee564f 100644 --- a/tests/components/socket/test_wake_loop_threadsafe.py +++ b/tests/components/socket/test_wake_loop_threadsafe.py @@ -1,9 +1,21 @@ from esphome.components import socket +from esphome.const import ( + KEY_CORE, + KEY_TARGET_PLATFORM, + PLATFORM_ESP32, + PLATFORM_ESP8266, +) from esphome.core import CORE +def _setup_platform(platform=PLATFORM_ESP8266) -> None: + """Set up CORE.data with a platform for testing.""" + CORE.data[KEY_CORE] = {KEY_TARGET_PLATFORM: platform} + + def test_require_wake_loop_threadsafe__first_call() -> None: """Test that first call sets up define and consumes socket.""" + _setup_platform() CORE.config = {"wifi": True} socket.require_wake_loop_threadsafe() @@ -32,6 +44,7 @@ def test_require_wake_loop_threadsafe__idempotent() -> None: def test_require_wake_loop_threadsafe__multiple_calls() -> None: """Test that multiple calls only set up once.""" + _setup_platform() # Call three times CORE.config = {"openthread": True} socket.require_wake_loop_threadsafe() @@ -75,3 +88,29 @@ def test_require_wake_loop_threadsafe__no_networking_does_not_consume_socket() - udp_consumers = CORE.data.get(socket.KEY_SOCKET_CONSUMERS_UDP, {}) assert "socket.wake_loop_threadsafe" not in udp_consumers assert udp_consumers == initial_udp + + +def test_require_wake_loop_threadsafe__esp32_no_udp_socket() -> None: + """Test that ESP32 uses task notifications instead of UDP socket.""" + _setup_platform(PLATFORM_ESP32) + CORE.config = {"wifi": True} + socket.require_wake_loop_threadsafe() + + # Verify the define was added + assert CORE.data[socket.KEY_WAKE_LOOP_THREADSAFE_REQUIRED] is True + assert any(d.name == "USE_WAKE_LOOP_THREADSAFE" for d in CORE.defines) + + # Verify no UDP socket was consumed (ESP32 uses FreeRTOS task notifications) + udp_consumers = CORE.data.get(socket.KEY_SOCKET_CONSUMERS_UDP, {}) + assert "socket.wake_loop_threadsafe" not in udp_consumers + + +def test_require_wake_loop_threadsafe__non_esp32_consumes_udp_socket() -> None: + """Test that non-ESP32 platforms consume a UDP socket for wake notifications.""" + _setup_platform(PLATFORM_ESP8266) + CORE.config = {"wifi": True} + socket.require_wake_loop_threadsafe() + + # Verify UDP socket was consumed + udp_consumers = CORE.data.get(socket.KEY_SOCKET_CONSUMERS_UDP, {}) + assert udp_consumers.get("socket.wake_loop_threadsafe") == 1 From be000eab4e0cb4f9eaa3807b069c143c4eeee5b6 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 11:02:52 -0700 Subject: [PATCH 100/147] [ci] Add undocumented C++ API change checkbox and auto-label (#14317) --- .github/PULL_REQUEST_TEMPLATE.md | 5 +++-- .github/scripts/auto-label-pr/constants.js | 1 + .github/scripts/auto-label-pr/detectors.js | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d1ef3bd822..965b186c31 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -6,8 +6,9 @@ - [ ] Bugfix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) -- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) -- [ ] Developer breaking change (an API change that could break external components) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) — [policy](https://developers.esphome.io/contributing/code/#what-constitutes-a-c-breaking-change) +- [ ] Developer breaking change (an API change that could break external components) — [policy](https://developers.esphome.io/contributing/code/#what-is-considered-public-c-api) +- [ ] Undocumented C++ API change (removal or change of undocumented public methods that lambda users may depend on) — [policy](https://developers.esphome.io/contributing/code/#c-user-expectations) - [ ] Code quality improvements to existing code or addition of tests - [ ] Other diff --git a/.github/scripts/auto-label-pr/constants.js b/.github/scripts/auto-label-pr/constants.js index bd60d8c766..8c3a62cf19 100644 --- a/.github/scripts/auto-label-pr/constants.js +++ b/.github/scripts/auto-label-pr/constants.js @@ -27,6 +27,7 @@ module.exports = { 'new-feature', 'breaking-change', 'developer-breaking-change', + 'undocumented-api-change', 'code-quality', 'deprecated-component' ], diff --git a/.github/scripts/auto-label-pr/detectors.js b/.github/scripts/auto-label-pr/detectors.js index f502a85666..a45a84f219 100644 --- a/.github/scripts/auto-label-pr/detectors.js +++ b/.github/scripts/auto-label-pr/detectors.js @@ -238,6 +238,7 @@ async function detectPRTemplateCheckboxes(context) { { pattern: /- \[x\] New feature \(non-breaking change which adds functionality\)/i, label: 'new-feature' }, { pattern: /- \[x\] Breaking change \(fix or feature that would cause existing functionality to not work as expected\)/i, label: 'breaking-change' }, { pattern: /- \[x\] Developer breaking change \(an API change that could break external components\)/i, label: 'developer-breaking-change' }, + { pattern: /- \[x\] Undocumented C\+\+ API change \(removal or change of undocumented public methods that lambda users may depend on\)/i, label: 'undocumented-api-change' }, { pattern: /- \[x\] Code quality improvements to existing code or addition of tests/i, label: 'code-quality' } ]; From ae16c3bae7450db7bba0b1c06755022e5b2696e9 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 11:25:36 -0700 Subject: [PATCH 101/147] Add socket compile tests for libretiny platforms (#14314) --- tests/components/socket/test.bk72xx-ard.yaml | 1 + tests/components/socket/test.ln882x-ard.yaml | 1 + tests/components/socket/test.rtl87xx-ard.yaml | 1 + 3 files changed, 3 insertions(+) create mode 100644 tests/components/socket/test.bk72xx-ard.yaml create mode 100644 tests/components/socket/test.ln882x-ard.yaml create mode 100644 tests/components/socket/test.rtl87xx-ard.yaml diff --git a/tests/components/socket/test.bk72xx-ard.yaml b/tests/components/socket/test.bk72xx-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/socket/test.bk72xx-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/socket/test.ln882x-ard.yaml b/tests/components/socket/test.ln882x-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/socket/test.ln882x-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/socket/test.rtl87xx-ard.yaml b/tests/components/socket/test.rtl87xx-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/socket/test.rtl87xx-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From 1912dcf03da6f0d1590f3708cf8ddad9b404ef04 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 12:07:42 -0700 Subject: [PATCH 102/147] [core] Use placement new for global Application instance (#14052) --- esphome/core/application.cpp | 10 +++++++++- esphome/core/config.py | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/esphome/core/application.cpp b/esphome/core/application.cpp index fd6a14b50f..a9753da1b5 100644 --- a/esphome/core/application.cpp +++ b/esphome/core/application.cpp @@ -713,7 +713,15 @@ void Application::yield_with_select_(uint32_t delay_ms) { #endif } -Application App; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +// App storage — asm label shares the linker symbol with "extern Application App". +// char[] is trivially destructible, so no __cxa_atexit or destructor chain is emitted. +// Constructed via placement new in the generated setup(). +#ifndef __GXX_ABI_VERSION +#error "Application placement new requires Itanium C++ ABI (GCC/Clang)" +#endif +static_assert(std::is_default_constructible::value, "Application must be default-constructible"); +// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) +alignas(Application) char app_storage[sizeof(Application)] asm("_ZN7esphome3AppE"); #if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) diff --git a/esphome/core/config.py b/esphome/core/config.py index 21ed8ced1a..215432835a 100644 --- a/esphome/core/config.py +++ b/esphome/core/config.py @@ -512,6 +512,9 @@ async def to_code(config: ConfigType) -> None: cg.add_global(cg.RawExpression("using std::min")) cg.add_global(cg.RawExpression("using std::max")) + # Construct App via placement new — see application.cpp for storage details + cg.add_global(cg.RawStatement("#include ")) + cg.add(cg.RawExpression("new (&App) Application()")) cg.add( cg.App.pre_setup( config[CONF_NAME], From 4c3bb1596e876259f496cafc682dfb75e34d3089 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 12:14:46 -0700 Subject: [PATCH 103/147] [wifi] Use memcpy-based insertion sort for scan results (#13960) --- esphome/components/wifi/wifi_component.cpp | 50 ++++++++++++++++++++-- esphome/components/wifi/wifi_component.h | 9 ++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/esphome/components/wifi/wifi_component.cpp b/esphome/components/wifi/wifi_component.cpp index d5d0419395..1e6961b8bd 100644 --- a/esphome/components/wifi/wifi_component.cpp +++ b/esphome/components/wifi/wifi_component.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #ifdef USE_ESP32 #if (ESP_IDF_VERSION_MAJOR >= 5 && ESP_IDF_VERSION_MINOR >= 1) @@ -1334,20 +1335,61 @@ void WiFiComponent::start_scanning() { // Using insertion sort instead of std::stable_sort saves flash memory // by avoiding template instantiations (std::rotate, std::stable_sort, lambdas) // IMPORTANT: This sort is stable (preserves relative order of equal elements) +// +// Uses raw memcpy instead of copy assignment to avoid CompactString's +// destructor/constructor overhead (heap delete[]/new[] for long SSIDs). +// Copy assignment calls ~CompactString() then placement-new for every shift, +// which means delete[]/new[] per shift for heap-allocated SSIDs. With 70+ +// networks (e.g., captive portal showing full scan results), this caused +// event loop blocking from hundreds of heap operations in a tight loop. +// +// This is safe because we're permuting elements within the same array — +// each slot is overwritten exactly once, so no ownership duplication occurs. +// All members of WiFiScanResult are either trivially copyable (bssid, channel, +// rssi, priority, flags) or CompactString, which stores either inline data or +// a heap pointer — never a self-referential pointer (unlike std::string's SSO +// on some implementations). This was not possible before PR#13472 replaced +// std::string with CompactString, since std::string's internal layout is +// implementation-defined and may use self-referential pointers. +// +// TODO: If C++ standardizes std::trivially_relocatable, add the assertion for +// WiFiScanResult/CompactString here to formally express the memcpy safety guarantee. template static void insertion_sort_scan_results(VectorType &results) { + // memcpy-based sort requires no self-referential pointers or virtual dispatch. + // These static_asserts guard the assumptions. If any fire, the memcpy sort + // must be reviewed for safety before updating the expected values. + // + // No vtable pointers (memcpy would corrupt vptr) + static_assert(!std::is_polymorphic::value, "WiFiScanResult must not have vtable"); + static_assert(!std::is_polymorphic::value, "CompactString must not have vtable"); + // Standard layout ensures predictable memory layout with no virtual bases + // and no mixed-access-specifier reordering + static_assert(std::is_standard_layout::value, "WiFiScanResult must be standard layout"); + static_assert(std::is_standard_layout::value, "CompactString must be standard layout"); + // Size checks catch added/removed fields that may need safety review + static_assert(sizeof(WiFiScanResult) == 32, "WiFiScanResult size changed - verify memcpy sort is still safe"); + static_assert(sizeof(CompactString) == 20, "CompactString size changed - verify memcpy sort is still safe"); + // Alignment must match for reinterpret_cast of key_buf to be valid + static_assert(alignof(WiFiScanResult) <= alignof(std::max_align_t), "WiFiScanResult alignment exceeds max_align_t"); const size_t size = results.size(); + constexpr size_t elem_size = sizeof(WiFiScanResult); + // Suppress warnings for intentional memcpy on non-trivially-copyable type. + // Safety is guaranteed by the static_asserts above and the permutation invariant. + // NOLINTNEXTLINE(bugprone-undefined-memory-manipulation) + auto *memcpy_fn = &memcpy; for (size_t i = 1; i < size; i++) { - // Make a copy to avoid issues with move semantics during comparison - WiFiScanResult key = results[i]; + alignas(WiFiScanResult) uint8_t key_buf[elem_size]; + memcpy_fn(key_buf, &results[i], elem_size); + const auto &key = *reinterpret_cast(key_buf); int32_t j = i - 1; // Move elements that are worse than key to the right // For stability, we only move if key is strictly better than results[j] while (j >= 0 && wifi_scan_result_is_better(key, results[j])) { - results[j + 1] = results[j]; + memcpy_fn(&results[j + 1], &results[j], elem_size); j--; } - results[j + 1] = key; + memcpy_fn(&results[j + 1], key_buf, elem_size); } } diff --git a/esphome/components/wifi/wifi_component.h b/esphome/components/wifi/wifi_component.h index 984930c80c..63c7039f21 100644 --- a/esphome/components/wifi/wifi_component.h +++ b/esphome/components/wifi/wifi_component.h @@ -10,6 +10,7 @@ #include #include +#include #include #ifdef USE_LIBRETINY @@ -223,6 +224,14 @@ class CompactString { }; static_assert(sizeof(CompactString) == 20, "CompactString must be exactly 20 bytes"); +// CompactString is not trivially copyable (non-trivial destructor/copy for heap case). +// However, its layout has no self-referential pointers: storage_[] contains either inline +// data or an external heap pointer — never a pointer to itself. This is unlike libstdc++ +// std::string SSO where _M_p points to _M_local_buf within the same object. +// This property allows memcpy-based permutation sorting where each element ends up in +// exactly one slot (no ownership duplication). These asserts document that layout property. +static_assert(std::is_standard_layout::value, "CompactString must be standard layout"); +static_assert(!std::is_polymorphic::value, "CompactString must not have vtable"); class WiFiAP { friend class WiFiComponent; From c149be20fcf8d2eecc8a4c518673f2bb8cc1bc42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 19:31:47 +0000 Subject: [PATCH 104/147] Bump aioesphomeapi from 44.1.0 to 44.2.0 (#14324) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index d22097b3ca..95e3710f9e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ platformio==6.1.19 esptool==5.2.0 click==8.1.7 esphome-dashboard==20260210.0 -aioesphomeapi==44.1.0 +aioesphomeapi==44.2.0 zeroconf==0.148.0 puremagic==1.30 ruamel.yaml==0.19.1 # dashboard_import From 8da1e3ce21de2e720294c1ff05d3021a07b0ddb7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 19:32:53 +0000 Subject: [PATCH 105/147] Bump ruff from 0.15.2 to 0.15.3 (#14323) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: J. Nick Koston --- .pre-commit-config.yaml | 2 +- requirements_test.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 07d02e0e3c..d70dd9d0e1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -11,7 +11,7 @@ ci: repos: - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.15.2 + rev: v0.15.3 hooks: # Run the linter. - id: ruff diff --git a/requirements_test.txt b/requirements_test.txt index 3e5dc8a90c..88a38ffa99 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -1,6 +1,6 @@ pylint==4.0.5 flake8==7.3.0 # also change in .pre-commit-config.yaml when updating -ruff==0.15.2 # also change in .pre-commit-config.yaml when updating +ruff==0.15.3 # also change in .pre-commit-config.yaml when updating pyupgrade==3.21.2 # also change in .pre-commit-config.yaml when updating pre-commit From d325890148091a682c31185ccf1c5d3864e8c303 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Thu, 26 Feb 2026 14:48:05 -0500 Subject: [PATCH 106/147] [cc1101] Transition through IDLE in begin_tx/begin_rx for reliable state changes (#14321) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/cc1101/cc1101.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/esphome/components/cc1101/cc1101.cpp b/esphome/components/cc1101/cc1101.cpp index b6973da78d..51aa88b8f7 100644 --- a/esphome/components/cc1101/cc1101.cpp +++ b/esphome/components/cc1101/cc1101.cpp @@ -242,6 +242,9 @@ void CC1101Component::begin_tx() { if (this->gdo0_pin_ != nullptr) { this->gdo0_pin_->pin_mode(gpio::FLAG_OUTPUT); } + // Transition through IDLE to bypass CCA (Clear Channel Assessment) which can + // block TX entry when strobing from RX, and to ensure FS_AUTOCAL calibration + this->enter_idle_(); if (!this->enter_tx_()) { ESP_LOGW(TAG, "Failed to enter TX state!"); } @@ -252,6 +255,8 @@ void CC1101Component::begin_rx() { if (this->gdo0_pin_ != nullptr) { this->gdo0_pin_->pin_mode(gpio::FLAG_INPUT); } + // Transition through IDLE to ensure FS_AUTOCAL calibration occurs + this->enter_idle_(); if (!this->enter_rx_()) { ESP_LOGW(TAG, "Failed to enter RX state!"); } From e8b45e53fd4020ecc65500e9df8c0c7145b4f1fe Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 13:02:25 -0700 Subject: [PATCH 107/147] [libretiny] Use -Os optimization for ESPHome source on BK72xx (SDK remains at -O1) (#14322) --- esphome/components/libretiny/__init__.py | 10 +++++++++- esphome/components/libretiny/lt_component.cpp | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/esphome/components/libretiny/__init__.py b/esphome/components/libretiny/__init__.py index 2291114d9a..8f99124604 100644 --- a/esphome/components/libretiny/__init__.py +++ b/esphome/components/libretiny/__init__.py @@ -27,6 +27,7 @@ from esphome.storage_json import StorageJSON from . import gpio # noqa from .const import ( + COMPONENT_BK72XX, CONF_GPIO_RECOVER, CONF_LOGLEVEL, CONF_SDK_SILENT, @@ -453,7 +454,14 @@ async def component_to_code(config): cg.add_platformio_option("lib_ldf_mode", "off") cg.add_platformio_option("lib_compat_mode", "soft") # include in every file - cg.add_platformio_option("build_src_flags", "-include Arduino.h") + build_src_flags = "-include Arduino.h" + if FAMILY_COMPONENT[config[CONF_FAMILY]] == COMPONENT_BK72XX: + # LibreTiny forces -O1 globally for BK72xx because the Beken SDK + # has issues with higher optimization levels. However, ESPHome code + # works fine with -Os (used on every other platform), so override + # it for project source files only. GCC uses the last -O flag. + build_src_flags += " -Os" + cg.add_platformio_option("build_src_flags", build_src_flags) # dummy version code cg.add_define("USE_ARDUINO_VERSION_CODE", cg.RawExpression("VERSION_CODE(0, 0, 0)")) # decrease web server stack size (16k words -> 4k words) diff --git a/esphome/components/libretiny/lt_component.cpp b/esphome/components/libretiny/lt_component.cpp index ffccd0ad7a..834245c147 100644 --- a/esphome/components/libretiny/lt_component.cpp +++ b/esphome/components/libretiny/lt_component.cpp @@ -15,6 +15,9 @@ void LTComponent::dump_config() { " Version: %s\n" " Loglevel: %u", LT_BANNER_STR + 10, LT_LOGLEVEL); +#if defined(__OPTIMIZE_SIZE__) && __OPTIMIZE_LEVEL__ > 0 && __OPTIMIZE_LEVEL__ <= 3 + ESP_LOGCONFIG(TAG, " Optimization: -Os, SDK: -O" STRINGIFY_MACRO(__OPTIMIZE_LEVEL__)); +#endif #ifdef USE_TEXT_SENSOR if (this->version_ != nullptr) { From 08035261b85617b6b978336c8ca56629a86bb5cc Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 13:02:36 -0700 Subject: [PATCH 108/147] [libretiny] Use C++17 nested namespace syntax (#14325) --- esphome/components/libretiny/core.h | 4 +--- esphome/components/libretiny/gpio_arduino.cpp | 7 ++++--- esphome/components/libretiny/gpio_arduino.h | 6 ++---- esphome/components/libretiny/lt_component.cpp | 6 ++---- esphome/components/libretiny/lt_component.h | 6 ++---- esphome/components/libretiny/preferences.cpp | 7 ++++--- esphome/components/libretiny/preferences.h | 6 ++---- 7 files changed, 17 insertions(+), 25 deletions(-) diff --git a/esphome/components/libretiny/core.h b/esphome/components/libretiny/core.h index 9458df1f16..f909db4f0f 100644 --- a/esphome/components/libretiny/core.h +++ b/esphome/components/libretiny/core.h @@ -4,8 +4,6 @@ #include -namespace esphome { -namespace libretiny {} // namespace libretiny -} // namespace esphome +namespace esphome::libretiny {} // namespace esphome::libretiny #endif // USE_LIBRETINY diff --git a/esphome/components/libretiny/gpio_arduino.cpp b/esphome/components/libretiny/gpio_arduino.cpp index 0b14c77cf2..1af0dce16d 100644 --- a/esphome/components/libretiny/gpio_arduino.cpp +++ b/esphome/components/libretiny/gpio_arduino.cpp @@ -3,8 +3,7 @@ #include "gpio_arduino.h" #include "esphome/core/log.h" -namespace esphome { -namespace libretiny { +namespace esphome::libretiny { static const char *const TAG = "lt.gpio"; @@ -77,7 +76,9 @@ void ArduinoInternalGPIOPin::detach_interrupt() const { detachInterrupt(pin_); // NOLINT } -} // namespace libretiny +} // namespace esphome::libretiny + +namespace esphome { using namespace libretiny; diff --git a/esphome/components/libretiny/gpio_arduino.h b/esphome/components/libretiny/gpio_arduino.h index 30c7c33869..5f1fa3fec7 100644 --- a/esphome/components/libretiny/gpio_arduino.h +++ b/esphome/components/libretiny/gpio_arduino.h @@ -3,8 +3,7 @@ #ifdef USE_LIBRETINY #include "esphome/core/hal.h" -namespace esphome { -namespace libretiny { +namespace esphome::libretiny { class ArduinoInternalGPIOPin : public InternalGPIOPin { public: @@ -31,7 +30,6 @@ class ArduinoInternalGPIOPin : public InternalGPIOPin { gpio::Flags flags_{}; }; -} // namespace libretiny -} // namespace esphome +} // namespace esphome::libretiny #endif // USE_LIBRETINY diff --git a/esphome/components/libretiny/lt_component.cpp b/esphome/components/libretiny/lt_component.cpp index 834245c147..c01661b3a6 100644 --- a/esphome/components/libretiny/lt_component.cpp +++ b/esphome/components/libretiny/lt_component.cpp @@ -4,8 +4,7 @@ #include "esphome/core/log.h" -namespace esphome { -namespace libretiny { +namespace esphome::libretiny { static const char *const TAG = "lt.component"; @@ -28,7 +27,6 @@ void LTComponent::dump_config() { float LTComponent::get_setup_priority() const { return setup_priority::LATE; } -} // namespace libretiny -} // namespace esphome +} // namespace esphome::libretiny #endif // USE_LIBRETINY diff --git a/esphome/components/libretiny/lt_component.h b/esphome/components/libretiny/lt_component.h index 3d4483ab5d..896f1901e3 100644 --- a/esphome/components/libretiny/lt_component.h +++ b/esphome/components/libretiny/lt_component.h @@ -12,8 +12,7 @@ #include "esphome/components/text_sensor/text_sensor.h" #endif -namespace esphome { -namespace libretiny { +namespace esphome::libretiny { class LTComponent : public Component { public: @@ -30,7 +29,6 @@ class LTComponent : public Component { #endif // USE_TEXT_SENSOR }; -} // namespace libretiny -} // namespace esphome +} // namespace esphome::libretiny #endif // USE_LIBRETINY diff --git a/esphome/components/libretiny/preferences.cpp b/esphome/components/libretiny/preferences.cpp index 8549631e46..740c1a233a 100644 --- a/esphome/components/libretiny/preferences.cpp +++ b/esphome/components/libretiny/preferences.cpp @@ -8,8 +8,7 @@ #include #include -namespace esphome { -namespace libretiny { +namespace esphome::libretiny { static const char *const TAG = "lt.preferences"; @@ -194,7 +193,9 @@ void setup_preferences() { global_preferences = &s_preferences; } -} // namespace libretiny +} // namespace esphome::libretiny + +namespace esphome { ESPPreferences *global_preferences; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) diff --git a/esphome/components/libretiny/preferences.h b/esphome/components/libretiny/preferences.h index 8ec3cd31b1..68f377bd3e 100644 --- a/esphome/components/libretiny/preferences.h +++ b/esphome/components/libretiny/preferences.h @@ -2,12 +2,10 @@ #ifdef USE_LIBRETINY -namespace esphome { -namespace libretiny { +namespace esphome::libretiny { void setup_preferences(); -} // namespace libretiny -} // namespace esphome +} // namespace esphome::libretiny #endif // USE_LIBRETINY From 54edc46c7f95ee35ec3c681276aa6a789fdeafdc Mon Sep 17 00:00:00 2001 From: Oliver Kleinecke Date: Thu, 26 Feb 2026 21:12:52 +0100 Subject: [PATCH 109/147] [esp_ldo] Add channels 1&2 support and passthrough mode (#14177) --- esphome/components/esp_ldo/__init__.py | 67 ++++++++++++++++--- esphome/components/esp_ldo/esp_ldo.cpp | 20 +++--- esphome/components/esp_ldo/esp_ldo.h | 4 +- .../components/esp_ldo/test.esp32-p4-idf.yaml | 9 ++- 4 files changed, 75 insertions(+), 25 deletions(-) diff --git a/esphome/components/esp_ldo/__init__.py b/esphome/components/esp_ldo/__init__.py index f136dd149b..5235a9411e 100644 --- a/esphome/components/esp_ldo/__init__.py +++ b/esphome/components/esp_ldo/__init__.py @@ -13,22 +13,63 @@ esp_ldo_ns = cg.esphome_ns.namespace("esp_ldo") EspLdo = esp_ldo_ns.class_("EspLdo", cg.Component) AdjustAction = esp_ldo_ns.class_("AdjustAction", Action) -CHANNELS = (3, 4) +CHANNELS = (1, 2, 3, 4) +CHANNELS_INTERNAL = (1, 2) CONF_ADJUSTABLE = "adjustable" +CONF_ALLOW_INTERNAL_CHANNEL = "allow_internal_channel" +CONF_PASSTHROUGH = "passthrough" adjusted_ids = set() + +def validate_ldo_voltage(value): + if isinstance(value, str) and value.lower() == CONF_PASSTHROUGH: + return CONF_PASSTHROUGH + value = cv.voltage(value) + if 0.5 <= value <= 2.7: + return value + raise cv.Invalid( + f"LDO voltage must be in range 0.5V-2.7V or 'passthrough' (bypass mode), got {value}V" + ) + + +def validate_ldo_config(config): + channel = config[CONF_CHANNEL] + allow_internal = config[CONF_ALLOW_INTERNAL_CHANNEL] + if allow_internal and channel not in CHANNELS_INTERNAL: + raise cv.Invalid( + f"'{CONF_ALLOW_INTERNAL_CHANNEL}' is only valid for internal channels (1, 2). " + f"Channel {channel} is a user-configurable channel — its usage depends on your board schematic.", + path=[CONF_ALLOW_INTERNAL_CHANNEL], + ) + if channel in CHANNELS_INTERNAL and not allow_internal: + raise cv.Invalid( + f"LDO channel {channel} is normally used internally by the chip (flash/PSRAM). " + f"Set '{CONF_ALLOW_INTERNAL_CHANNEL}: true' to confirm you know what you are doing.", + path=[CONF_CHANNEL], + ) + if config[CONF_VOLTAGE] == CONF_PASSTHROUGH and config[CONF_ADJUSTABLE]: + raise cv.Invalid( + "Passthrough mode passes the supply voltage directly to the output and does not support " + "runtime voltage adjustment.", + path=[CONF_ADJUSTABLE], + ) + return config + + CONFIG_SCHEMA = cv.All( cv.ensure_list( - cv.COMPONENT_SCHEMA.extend( - { - cv.GenerateID(): cv.declare_id(EspLdo), - cv.Required(CONF_VOLTAGE): cv.All( - cv.voltage, cv.float_range(min=0.5, max=2.7) - ), - cv.Required(CONF_CHANNEL): cv.one_of(*CHANNELS, int=True), - cv.Optional(CONF_ADJUSTABLE, default=False): cv.boolean, - } + cv.All( + cv.COMPONENT_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(EspLdo), + cv.Required(CONF_VOLTAGE): validate_ldo_voltage, + cv.Required(CONF_CHANNEL): cv.one_of(*CHANNELS, int=True), + cv.Optional(CONF_ADJUSTABLE, default=False): cv.boolean, + cv.Optional(CONF_ALLOW_INTERNAL_CHANNEL, default=False): cv.boolean, + } + ), + validate_ldo_config, ) ), cv.only_on_esp32, @@ -40,7 +81,11 @@ async def to_code(configs): for config in configs: var = cg.new_Pvariable(config[CONF_ID], config[CONF_CHANNEL]) await cg.register_component(var, config) - cg.add(var.set_voltage(config[CONF_VOLTAGE])) + voltage = config[CONF_VOLTAGE] + if voltage == CONF_PASSTHROUGH: + cg.add(var.set_voltage(3300)) + else: + cg.add(var.set_voltage(int(round(voltage * 1000)))) cg.add(var.set_adjustable(config[CONF_ADJUSTABLE])) diff --git a/esphome/components/esp_ldo/esp_ldo.cpp b/esphome/components/esp_ldo/esp_ldo.cpp index 2eee855b46..f8ebec1903 100644 --- a/esphome/components/esp_ldo/esp_ldo.cpp +++ b/esphome/components/esp_ldo/esp_ldo.cpp @@ -10,32 +10,34 @@ static const char *const TAG = "esp_ldo"; void EspLdo::setup() { esp_ldo_channel_config_t config{}; config.chan_id = this->channel_; - config.voltage_mv = (int) (this->voltage_ * 1000.0f); + config.voltage_mv = this->voltage_mv_; config.flags.adjustable = this->adjustable_; auto err = esp_ldo_acquire_channel(&config, &this->handle_); if (err != ESP_OK) { - ESP_LOGE(TAG, "Failed to acquire LDO channel %d with voltage %fV", this->channel_, this->voltage_); + ESP_LOGE(TAG, "Failed to acquire LDO channel %d with voltage %dmV", this->channel_, this->voltage_mv_); this->mark_failed(LOG_STR("Failed to acquire LDO channel")); } else { - ESP_LOGD(TAG, "Acquired LDO channel %d with voltage %fV", this->channel_, this->voltage_); + ESP_LOGD(TAG, "Acquired LDO channel %d with voltage %dmV", this->channel_, this->voltage_mv_); } } void EspLdo::dump_config() { ESP_LOGCONFIG(TAG, "ESP LDO Channel %d:\n" - " Voltage: %fV\n" + " Voltage: %dmV\n" " Adjustable: %s", - this->channel_, this->voltage_, YESNO(this->adjustable_)); + this->channel_, this->voltage_mv_, YESNO(this->adjustable_)); } void EspLdo::adjust_voltage(float voltage) { if (!std::isfinite(voltage) || voltage < 0.5f || voltage > 2.7f) { - ESP_LOGE(TAG, "Invalid voltage %fV for LDO channel %d", voltage, this->channel_); + ESP_LOGE(TAG, "Invalid voltage %fV for LDO channel %d (must be 0.5V-2.7V)", voltage, this->channel_); return; } - auto erro = esp_ldo_channel_adjust_voltage(this->handle_, (int) (voltage * 1000.0f)); - if (erro != ESP_OK) { - ESP_LOGE(TAG, "Failed to adjust LDO channel %d to voltage %fV: %s", this->channel_, voltage, esp_err_to_name(erro)); + int voltage_mv = (int) roundf(voltage * 1000.0f); + auto err = esp_ldo_channel_adjust_voltage(this->handle_, voltage_mv); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to adjust LDO channel %d to voltage %dmV: %s", this->channel_, voltage_mv, + esp_err_to_name(err)); } } diff --git a/esphome/components/esp_ldo/esp_ldo.h b/esphome/components/esp_ldo/esp_ldo.h index 9edd303e16..1a20f1d08a 100644 --- a/esphome/components/esp_ldo/esp_ldo.h +++ b/esphome/components/esp_ldo/esp_ldo.h @@ -15,7 +15,7 @@ class EspLdo : public Component { void dump_config() override; void set_adjustable(bool adjustable) { this->adjustable_ = adjustable; } - void set_voltage(float voltage) { this->voltage_ = voltage; } + void set_voltage(int voltage_mv) { this->voltage_mv_ = voltage_mv; } void adjust_voltage(float voltage); float get_setup_priority() const override { return setup_priority::BUS; // LDO setup should be done early @@ -23,7 +23,7 @@ class EspLdo : public Component { protected: int channel_; - float voltage_{2.7}; + int voltage_mv_{2700}; bool adjustable_{false}; esp_ldo_channel_handle_t handle_{}; }; diff --git a/tests/components/esp_ldo/test.esp32-p4-idf.yaml b/tests/components/esp_ldo/test.esp32-p4-idf.yaml index 38bd6ac411..31d2b8cf7a 100644 --- a/tests/components/esp_ldo/test.esp32-p4-idf.yaml +++ b/tests/components/esp_ldo/test.esp32-p4-idf.yaml @@ -3,10 +3,13 @@ esp_ldo: channel: 3 voltage: 2.5V adjustable: true - - id: ldo_4 + - id: ldo_4_passthrough channel: 4 - voltage: 2.0V - setup_priority: 900 + voltage: passthrough + - id: ldo_1_internal + channel: 1 + voltage: 1.8V + allow_internal_channel: true esphome: on_boot: From 8bd474fd017d31f4f8504f4c96db5a8e1a7f2f80 Mon Sep 17 00:00:00 2001 From: lyubomirtraykov Date: Thu, 26 Feb 2026 22:27:18 +0200 Subject: [PATCH 110/147] [api] Add DEFROSTING to ClimateAction (#13976) Co-authored-by: J. Nick Koston --- esphome/components/api/api.proto | 1 + esphome/components/api/api_pb2.h | 1 + esphome/components/api/api_pb2_dump.cpp | 2 ++ esphome/components/climate/climate_mode.cpp | 6 ++++-- esphome/components/climate/climate_mode.h | 2 ++ esphome/components/mqtt/mqtt_climate.cpp | 5 +++-- 6 files changed, 13 insertions(+), 4 deletions(-) diff --git a/esphome/components/api/api.proto b/esphome/components/api/api.proto index 18dac6a2d1..d7f32cd8d1 100644 --- a/esphome/components/api/api.proto +++ b/esphome/components/api/api.proto @@ -989,6 +989,7 @@ enum ClimateAction { CLIMATE_ACTION_IDLE = 4; CLIMATE_ACTION_DRYING = 5; CLIMATE_ACTION_FAN = 6; + CLIMATE_ACTION_DEFROSTING = 7; } enum ClimatePreset { CLIMATE_PRESET_NONE = 0; diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h index c2675cefe4..22dc3de995 100644 --- a/esphome/components/api/api_pb2.h +++ b/esphome/components/api/api_pb2.h @@ -116,6 +116,7 @@ enum ClimateAction : uint32_t { CLIMATE_ACTION_IDLE = 4, CLIMATE_ACTION_DRYING = 5, CLIMATE_ACTION_FAN = 6, + CLIMATE_ACTION_DEFROSTING = 7, }; enum ClimatePreset : uint32_t { CLIMATE_PRESET_NONE = 0, diff --git a/esphome/components/api/api_pb2_dump.cpp b/esphome/components/api/api_pb2_dump.cpp index 73690610ed..52d2486410 100644 --- a/esphome/components/api/api_pb2_dump.cpp +++ b/esphome/components/api/api_pb2_dump.cpp @@ -321,6 +321,8 @@ template<> const char *proto_enum_to_string(enums::Climate return "CLIMATE_ACTION_DRYING"; case enums::CLIMATE_ACTION_FAN: return "CLIMATE_ACTION_FAN"; + case enums::CLIMATE_ACTION_DEFROSTING: + return "CLIMATE_ACTION_DEFROSTING"; default: return "UNKNOWN"; } diff --git a/esphome/components/climate/climate_mode.cpp b/esphome/components/climate/climate_mode.cpp index c4dd19d503..8e443f4146 100644 --- a/esphome/components/climate/climate_mode.cpp +++ b/esphome/components/climate/climate_mode.cpp @@ -10,8 +10,10 @@ const LogString *climate_mode_to_string(ClimateMode mode) { return ClimateModeStrings::get_log_str(static_cast(mode), ClimateModeStrings::LAST_INDEX); } -// Climate action strings indexed by ClimateAction enum (0,2-6): OFF, (gap), COOLING, HEATING, IDLE, DRYING, FAN -PROGMEM_STRING_TABLE(ClimateActionStrings, "OFF", "UNKNOWN", "COOLING", "HEATING", "IDLE", "DRYING", "FAN", "UNKNOWN"); +// Climate action strings indexed by ClimateAction enum (0,2-7): OFF, (gap), COOLING, HEATING, IDLE, DRYING, FAN, +// DEFROSTING +PROGMEM_STRING_TABLE(ClimateActionStrings, "OFF", "UNKNOWN", "COOLING", "HEATING", "IDLE", "DRYING", "FAN", + "DEFROSTING", "UNKNOWN"); const LogString *climate_action_to_string(ClimateAction action) { return ClimateActionStrings::get_log_str(static_cast(action), ClimateActionStrings::LAST_INDEX); diff --git a/esphome/components/climate/climate_mode.h b/esphome/components/climate/climate_mode.h index c961c44248..014b1a9e64 100644 --- a/esphome/components/climate/climate_mode.h +++ b/esphome/components/climate/climate_mode.h @@ -41,6 +41,8 @@ enum ClimateAction : uint8_t { CLIMATE_ACTION_DRYING = 5, /// The climate device is in fan only mode CLIMATE_ACTION_FAN = 6, + /// The climate device is defrosting + CLIMATE_ACTION_DEFROSTING = 7, }; /// NOTE: If adding values, update ClimateFanModeMask in climate_traits.h to use the new last value diff --git a/esphome/components/mqtt/mqtt_climate.cpp b/esphome/components/mqtt/mqtt_climate.cpp index 81b2e0e8db..443c983efe 100644 --- a/esphome/components/mqtt/mqtt_climate.cpp +++ b/esphome/components/mqtt/mqtt_climate.cpp @@ -20,9 +20,10 @@ static ProgmemStr climate_mode_to_mqtt_str(ClimateMode mode) { return ClimateMqttModeStrings::get_progmem_str(static_cast(mode), ClimateMqttModeStrings::LAST_INDEX); } -// Climate action MQTT strings indexed by ClimateAction enum (0,2-6): OFF, (gap), COOLING, HEATING, IDLE, DRYING, FAN +// Climate action MQTT strings indexed by ClimateAction enum (0,2-7): OFF, (gap), COOLING, HEATING, IDLE, DRYING, FAN, +// DEFROSTING PROGMEM_STRING_TABLE(ClimateMqttActionStrings, "off", "unknown", "cooling", "heating", "idle", "drying", "fan", - "unknown"); + "defrosting", "unknown"); static ProgmemStr climate_action_to_mqtt_str(ClimateAction action) { return ClimateMqttActionStrings::get_progmem_str(static_cast(action), ClimateMqttActionStrings::LAST_INDEX); From 67ba68a1a09adb4cf3cb8178d625645a59a33c29 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Fri, 27 Feb 2026 11:21:40 +1300 Subject: [PATCH 111/147] Update webserver local assets to 20260226-220330 (#14330) Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> --- esphome/components/captive_portal/captive_index.h | 4 ++-- esphome/components/web_server/server_index_v2.h | 4 ++-- esphome/components/web_server/server_index_v3.h | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/esphome/components/captive_portal/captive_index.h b/esphome/components/captive_portal/captive_index.h index 645ebb7a2f..a81edc1900 100644 --- a/esphome/components/captive_portal/captive_index.h +++ b/esphome/components/captive_portal/captive_index.h @@ -6,7 +6,7 @@ namespace esphome::captive_portal { #ifdef USE_CAPTIVE_PORTAL_GZIP -const uint8_t INDEX_GZ[] PROGMEM = { +constexpr uint8_t INDEX_GZ[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x95, 0x16, 0x6b, 0x8f, 0xdb, 0x36, 0xf2, 0x7b, 0x7e, 0x05, 0x8f, 0x49, 0xbb, 0x52, 0xb3, 0x7a, 0x7a, 0xed, 0x6c, 0x24, 0x51, 0x45, 0x9a, 0xbb, 0xa2, 0x05, 0x9a, 0x36, 0xc0, 0x6e, 0x73, 0x1f, 0x82, 0x00, 0x4b, 0x53, 0x23, 0x8b, 0x31, 0x45, 0xea, 0x48, 0xca, 0x8f, 0x18, 0xbe, 0xdf, @@ -86,7 +86,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xfc, 0xda, 0xd1, 0xf8, 0xe9, 0xa3, 0xe1, 0xa6, 0xfb, 0x1f, 0x53, 0x58, 0x46, 0xb2, 0xf9, 0x0a, 0x00, 0x00}; #else // Brotli (default, smaller) -const uint8_t INDEX_BR[] PROGMEM = { +constexpr uint8_t INDEX_BR[] PROGMEM = { 0x1b, 0xf8, 0x0a, 0x00, 0x64, 0x5a, 0xd3, 0xfa, 0xe7, 0xf3, 0x62, 0xd8, 0x06, 0x1b, 0xe9, 0x6a, 0x8a, 0x81, 0x2b, 0xb5, 0x49, 0x14, 0x37, 0xdc, 0x9e, 0x1a, 0xcb, 0x56, 0x87, 0xfb, 0xff, 0xf7, 0x73, 0x75, 0x12, 0x0a, 0xd6, 0x48, 0x84, 0xc6, 0x21, 0xa4, 0x6d, 0xb5, 0x71, 0xef, 0x13, 0xbe, 0x4e, 0x54, 0xf1, 0x64, 0x8f, 0x3f, 0xcc, 0x9a, 0x78, diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h index ffa9c87b3a..ac2195f387 100644 --- a/esphome/components/web_server/server_index_v2.h +++ b/esphome/components/web_server/server_index_v2.h @@ -9,7 +9,7 @@ namespace esphome::web_server { #ifdef USE_WEBSERVER_GZIP -const uint8_t INDEX_GZ[] PROGMEM = { +constexpr uint8_t INDEX_GZ[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xed, 0x7d, 0xd9, 0x72, 0xdb, 0x48, 0xb6, 0xe0, 0xf3, 0xd4, 0x57, 0x40, 0x28, 0xb5, 0x8c, 0x2c, 0x26, 0xc1, 0x45, 0x92, 0x2d, 0x83, 0x4a, 0xb2, 0x65, 0xd9, 0xd5, 0x76, 0x97, 0xb7, 0xb6, 0xec, 0xda, 0x58, 0x6c, 0x09, 0x02, 0x92, 0x44, 0x96, 0x41, 0x80, 0x05, 0x24, 0xb5, 0x14, 0x89, @@ -698,7 +698,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x01, 0x65, 0x21, 0x07, 0x4b, 0xe3, 0x97, 0x00, 0x00}; #else // Brotli (default, smaller) -const uint8_t INDEX_BR[] PROGMEM = { +constexpr uint8_t INDEX_BR[] PROGMEM = { 0x1b, 0xe2, 0x97, 0xa3, 0x90, 0xa2, 0x95, 0x55, 0x51, 0x04, 0x1b, 0x07, 0x80, 0x20, 0x79, 0x0e, 0x50, 0xab, 0x02, 0xdb, 0x98, 0x16, 0xf4, 0x7b, 0x22, 0xa3, 0x4d, 0xd3, 0x86, 0xc1, 0x26, 0x48, 0x49, 0x60, 0xbe, 0xb3, 0xc9, 0xa1, 0x8c, 0x96, 0x10, 0x1b, 0x21, 0xcf, 0x48, 0x68, 0xce, 0x10, 0x34, 0x32, 0x7c, 0xbf, 0x71, 0x7b, 0x03, 0x8f, 0xdd, diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h index b7c15df32b..a1cafe8707 100644 --- a/esphome/components/web_server/server_index_v3.h +++ b/esphome/components/web_server/server_index_v3.h @@ -9,7 +9,7 @@ namespace esphome::web_server { #ifdef USE_WEBSERVER_GZIP -const uint8_t INDEX_GZ[] PROGMEM = { +constexpr uint8_t INDEX_GZ[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, 0xbd, 0x7b, 0x7f, 0x1a, 0xb9, 0xb2, 0x28, 0xfa, 0xf7, 0x3d, 0x9f, 0xc2, 0xee, 0x9d, 0xf1, 0xb4, 0x8c, 0x68, 0x03, 0x36, 0x8e, 0xd3, 0x58, 0xe6, 0xe4, 0x39, 0xc9, 0x3c, 0x92, 0x4c, 0x9c, 0x64, 0x26, 0xc3, 0xb0, 0x33, 0xa2, 0x11, 0xa0, 0xa4, 0x91, 0x98, 0x96, 0x88, 0xed, 0x01, @@ -4107,7 +4107,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe8, 0xcd, 0xfe, 0x2c, 0x9d, 0x07, 0xfd, 0xff, 0x05, 0x64, 0x23, 0xa6, 0xdb, 0x06, 0x7b, 0x03, 0x00}; #else // Brotli (default, smaller) -const uint8_t INDEX_BR[] PROGMEM = { +constexpr uint8_t INDEX_BR[] PROGMEM = { 0x5b, 0x05, 0x7b, 0x53, 0xc1, 0xb6, 0x69, 0x3d, 0x41, 0xeb, 0x04, 0x30, 0xf6, 0xd6, 0x77, 0x35, 0xdb, 0xa3, 0x08, 0x36, 0x0e, 0x04, 0x80, 0x90, 0x4f, 0xf1, 0xb2, 0x21, 0xa4, 0x82, 0xee, 0x00, 0xaa, 0x20, 0x7f, 0x3b, 0xff, 0x00, 0xaa, 0x9a, 0x73, 0x74, 0x8c, 0xe1, 0xa6, 0x1f, 0xa0, 0xa2, 0x59, 0xf5, 0xaa, 0x92, 0x79, 0x50, 0x43, 0x1f, 0xe8, From 527d4964f61b77439c469d41207527c5677b813b Mon Sep 17 00:00:00 2001 From: George Joseph Date: Thu, 26 Feb 2026 17:38:07 -0700 Subject: [PATCH 112/147] [mipi_dsi] Add more Waveshare panels and comments (#14023) --- .../components/mipi_dsi/models/waveshare.py | 139 +++++++++++++++++- 1 file changed, 136 insertions(+), 3 deletions(-) diff --git a/esphome/components/mipi_dsi/models/waveshare.py b/esphome/components/mipi_dsi/models/waveshare.py index bf4f9063bb..69414065f1 100644 --- a/esphome/components/mipi_dsi/models/waveshare.py +++ b/esphome/components/mipi_dsi/models/waveshare.py @@ -2,7 +2,11 @@ from esphome.components.mipi import DriverChip import esphome.config_validation as cv # fmt: off -DriverChip( + +# Source for parameters and initsequence: +# https://github.com/waveshareteam/Waveshare-ESP32-components/tree/master/display/lcd/esp_lcd_jd9365_10_1 +# Product page: https://www.waveshare.com/wiki/ESP32-P4-Nano-StartPage +JD9365_10_1_DSI_TOUCH_A = DriverChip( "WAVESHARE-P4-NANO-10.1", height=1280, width=800, @@ -52,6 +56,15 @@ DriverChip( ], ) +# Standalone display +# Product page: https://www.waveshare.com/wiki/10.1-DSI-TOUCH-A +JD9365_10_1_DSI_TOUCH_A.extend( + "WAVESHARE-10.1-DSI-TOUCH-A", +) + +# Source for parameters and initsequence: +# https://github.com/espressif/esp-iot-solution/tree/master/components/display/lcd/esp_lcd_st7703 +# Product page: https://www.waveshare.com/wiki/ESP32-P4-86-Panel-ETH-2RO DriverChip( "WAVESHARE-P4-86-PANEL", height=720, @@ -95,6 +108,9 @@ DriverChip( ], ) +# Source for parameters and initsequence: +# https://github.com/espressif/esp-iot-solution/tree/master/components/display/lcd/esp_lcd_ek79007 +# Product page: https://www.waveshare.com/wiki/ESP32-P4-WIFI6-Touch-LCD-7B DriverChip( "WAVESHARE-ESP32-P4-WIFI6-TOUCH-LCD-7B", height=600, @@ -121,7 +137,10 @@ DriverChip( ], ) -DriverChip( +# Source for parameters and initsequence: +# https://github.com/waveshareteam/Waveshare-ESP32-components/tree/master/display/lcd/esp_lcd_jd9365 +# Product page: https://www.waveshare.com/wiki/ESP32-P4-WIFI6-Touch-LCD-3.4C +JD9365_3_4_DSI_TOUCH_C = DriverChip( "WAVESHARE-ESP32-P4-WIFI6-TOUCH-LCD-3.4C", height=800, width=800, @@ -170,7 +189,16 @@ DriverChip( ], ) -DriverChip( +# Standalone display +# Product page: https://www.waveshare.com/wiki/3.4-DSI-TOUCH-C +JD9365_3_4_DSI_TOUCH_C.extend( + "WAVESHARE-3.4-DSI-TOUCH-C", +) + +# Source for parameters and initsequence: +# https://github.com/waveshareteam/Waveshare-ESP32-components/tree/master/display/lcd/esp_lcd_jd9365 +# Product page: https://www.waveshare.com/wiki/ESP32-P4-WIFI6-Touch-LCD-4C +JD9365_4_DSI_TOUCH_C = DriverChip( "WAVESHARE-ESP32-P4-WIFI6-TOUCH-LCD-4C", height=720, width=720, @@ -218,3 +246,108 @@ DriverChip( (0xE0, 0x00), # select userpage ] ) + +# Standalone display +# Product page: https://www.waveshare.com/wiki/4-DSI-TOUCH-C +JD9365_4_DSI_TOUCH_C.extend( + "WAVESHARE-4-DSI-TOUCH-C", +) + +# Source for parameters and initsequence: +# https://github.com/waveshareteam/Waveshare-ESP32-components/tree/master/display/lcd/esp_lcd_jd9365 +# Product page: https://www.waveshare.com/wiki/8-DSI-TOUCH-A +DriverChip( + "WAVESHARE-8-DSI-TOUCH-A", + height=1280, + width=800, + hsync_back_porch=20, + hsync_pulse_width=20, + hsync_front_porch=40, + vsync_back_porch=12, + vsync_pulse_width=4, + vsync_front_porch=30, + pclk_frequency="80MHz", + lane_bit_rate="1.5Gbps", + swap_xy=cv.UNDEFINED, + color_order="RGB", + initsequence=[ + (0xE0, 0x00), # select userpage + (0xE1, 0x93), (0xE2, 0x65), (0xE3, 0xF8), + (0x80, 0x01), # Select number of lanes (2) + (0xE0, 0x01), # select page 1 + (0x00, 0x00), (0x01, 0x4E), (0x03, 0x00), (0x04, 0x65), (0x0C, 0x74), (0x17, 0x00), (0x18, 0xB7), (0x19, 0x00), + (0x1A, 0x00), (0x1B, 0xB7), (0x1C, 0x00), (0x24, 0xFE), (0x37, 0x19), (0x38, 0x05), (0x39, 0x00), (0x3A, 0x01), + (0x3B, 0x01), (0x3C, 0x70), (0x3D, 0xFF), (0x3E, 0xFF), (0x3F, 0xFF), (0x40, 0x06), (0x41, 0xA0), (0x43, 0x1E), + (0x44, 0x0F), (0x45, 0x28), (0x4B, 0x04), (0x55, 0x02), (0x56, 0x01), (0x57, 0xA9), (0x58, 0x0A), (0x59, 0x0A), + (0x5A, 0x37), (0x5B, 0x19), (0x5D, 0x78), (0x5E, 0x63), (0x5F, 0x54), (0x60, 0x49), (0x61, 0x45), (0x62, 0x38), + (0x63, 0x3D), (0x64, 0x28), (0x65, 0x43), (0x66, 0x41), (0x67, 0x43), (0x68, 0x62), (0x69, 0x50), (0x6A, 0x57), + (0x6B, 0x49), (0x6C, 0x44), (0x6D, 0x37), (0x6E, 0x23), (0x6F, 0x10), (0x70, 0x78), (0x71, 0x63), (0x72, 0x54), + (0x73, 0x49), (0x74, 0x45), (0x75, 0x38), (0x76, 0x3D), (0x77, 0x28), (0x78, 0x43), (0x79, 0x41), (0x7A, 0x43), + (0x7B, 0x62), (0x7C, 0x50), (0x7D, 0x57), (0x7E, 0x49), (0x7F, 0x44), (0x80, 0x37), (0x81, 0x23), (0x82, 0x10), + (0xE0, 0x02), # select page 2 + (0x00, 0x47), (0x01, 0x47), (0x02, 0x45), (0x03, 0x45), (0x04, 0x4B), (0x05, 0x4B), (0x06, 0x49), (0x07, 0x49), + (0x08, 0x41), (0x09, 0x1F), (0x0A, 0x1F), (0x0B, 0x1F), (0x0C, 0x1F), (0x0D, 0x1F), (0x0E, 0x1F), (0x0F, 0x5F), + (0x10, 0x5F), (0x11, 0x57), (0x12, 0x77), (0x13, 0x35), (0x14, 0x1F), (0x15, 0x1F), (0x16, 0x46), (0x17, 0x46), + (0x18, 0x44), (0x19, 0x44), (0x1A, 0x4A), (0x1B, 0x4A), (0x1C, 0x48), (0x1D, 0x48), (0x1E, 0x40), (0x1F, 0x1F), + (0x20, 0x1F), (0x21, 0x1F), (0x22, 0x1F), (0x23, 0x1F), (0x24, 0x1F), (0x25, 0x5F), (0x26, 0x5F), (0x27, 0x57), + (0x28, 0x77), (0x29, 0x35), (0x2A, 0x1F), (0x2B, 0x1F), (0x58, 0x40), (0x59, 0x00), (0x5A, 0x00), (0x5B, 0x10), + (0x5C, 0x06), (0x5D, 0x40), (0x5E, 0x01), (0x5F, 0x02), (0x60, 0x30), (0x61, 0x01), (0x62, 0x02), (0x63, 0x03), + (0x64, 0x6B), (0x65, 0x05), (0x66, 0x0C), (0x67, 0x73), (0x68, 0x09), (0x69, 0x03), (0x6A, 0x56), (0x6B, 0x08), + (0x6C, 0x00), (0x6D, 0x04), (0x6E, 0x04), (0x6F, 0x88), (0x70, 0x00), (0x71, 0x00), (0x72, 0x06), (0x73, 0x7B), + (0x74, 0x00), (0x75, 0xF8), (0x76, 0x00), (0x77, 0xD5), (0x78, 0x2E), (0x79, 0x12), (0x7A, 0x03), (0x7B, 0x00), + (0x7C, 0x00), (0x7D, 0x03), (0x7E, 0x7B), + (0xE0, 0x04), # select page 4 + (0x00, 0x0E), (0x02, 0xB3), (0x09, 0x60), (0x0E, 0x2A), (0x36, 0x59), (0x37, 0x58), (0x2B, 0x0F), + (0xE0, 0x00), # select userpage + ] +) + +# Source for parameters and initsequence: +# https://github.com/waveshareteam/Waveshare-ESP32-components/tree/master/display/lcd/esp_lcd_ili9881c +# Product page: https://www.waveshare.com/wiki/7-DSI-TOUCH-A +DriverChip( + "WAVESHARE-7-DSI-TOUCH-A", + height=1280, + width=720, + hsync_back_porch=239, + hsync_pulse_width=50, + hsync_front_porch=33, + vsync_back_porch=20, + vsync_pulse_width=30, + vsync_front_porch=2, + pclk_frequency="80MHz", + lane_bit_rate="1000Mbps", + no_transform=True, + color_order="RGB", + initsequence=[ + (0xFF, 0x98, 0x81, 0x03), + (0x01, 0x00), (0x02, 0x00), (0x03, 0x73), (0x04, 0x00), (0x05, 0x00), (0x06, 0x0A), (0x07, 0x00), (0x08, 0x00), + (0x09, 0x61), (0x0A, 0x00), (0x0B, 0x00), (0x0C, 0x01), (0x0D, 0x00), (0x0E, 0x00), (0x0F, 0x61), (0x10, 0x61), + (0x11, 0x00), (0x12, 0x00), (0x13, 0x00), (0x14, 0x00), (0x15, 0x00), (0x16, 0x00), (0x17, 0x00), (0x18, 0x00), + (0x19, 0x00), (0x1A, 0x00), (0x1B, 0x00), (0x1C, 0x00), (0x1D, 0x00), (0x1E, 0x40), (0x1F, 0x80), (0x20, 0x06), + (0x21, 0x01), (0x22, 0x00), (0x23, 0x00), (0x24, 0x00), (0x25, 0x00), (0x26, 0x00), (0x27, 0x00), (0x28, 0x33), + (0x29, 0x03), (0x2A, 0x00), (0x2B, 0x00), (0x2C, 0x00), (0x2D, 0x00), (0x2E, 0x00), (0x2F, 0x00), (0x30, 0x00), + (0x31, 0x00), (0x32, 0x00), (0x33, 0x00), (0x34, 0x04), (0x35, 0x00), (0x36, 0x00), (0x37, 0x00), (0x38, 0x3C), + (0x39, 0x00), (0x3A, 0x00), (0x3B, 0x00), (0x3C, 0x00), (0x3D, 0x00), (0x3E, 0x00), (0x3F, 0x00), (0x40, 0x00), + (0x41, 0x00), (0x42, 0x00), (0x43, 0x00), (0x44, 0x00), (0x50, 0x10), (0x51, 0x32), (0x52, 0x54), (0x53, 0x76), + (0x54, 0x98), (0x55, 0xBA), (0x56, 0x10), (0x57, 0x32), (0x58, 0x54), (0x59, 0x76), (0x5A, 0x98), (0x5B, 0xBA), + (0x5C, 0xDC), (0x5D, 0xFE), (0x5E, 0x00), (0x5F, 0x0E), (0x60, 0x0F), (0x61, 0x0C), (0x62, 0x0D), (0x63, 0x06), + (0x64, 0x07), (0x65, 0x02), (0x66, 0x02), (0x67, 0x02), (0x68, 0x02), (0x69, 0x01), (0x6A, 0x00), (0x6B, 0x02), + (0x6C, 0x15), (0x6D, 0x14), (0x6E, 0x02), (0x6F, 0x02), (0x70, 0x02), (0x71, 0x02), (0x72, 0x02), (0x73, 0x02), + (0x74, 0x02), (0x75, 0x0E), (0x76, 0x0F), (0x77, 0x0C), (0x78, 0x0D), (0x79, 0x06), (0x7A, 0x07), (0x7B, 0x02), + (0x7C, 0x02), (0x7D, 0x02), (0x7E, 0x02), (0x7F, 0x01), (0x80, 0x00), (0x81, 0x02), (0x82, 0x14), (0x83, 0x15), + (0x84, 0x02), (0x85, 0x02), (0x86, 0x02), (0x87, 0x02), (0x88, 0x02), (0x89, 0x02), (0x8A, 0x02), + (0xFF, 0x98, 0x81, 0x04), + (0x38, 0x01), (0x39, 0x00), (0x6C, 0x15), (0x6E, 0x2A), (0x6F, 0x33), (0x3A, 0x94), (0x8D, 0x14), (0x87, 0xBA), + (0x26, 0x76), (0xB2, 0xD1), (0xB5, 0x06), (0x3B, 0x98), + (0xFF, 0x98, 0x81, 0x01), + (0x22, 0x0A), (0x31, 0x00), (0x53, 0x71), (0x55, 0x8F), (0x40, 0x33), (0x50, 0x96), (0x51, 0x96), (0x60, 0x23), + (0xA0, 0x08), (0xA1, 0x1D), (0xA2, 0x2A), (0xA3, 0x10), (0xA4, 0x15), (0xA5, 0x28), (0xA6, 0x1C), (0xA7, 0x1D), + (0xA8, 0x7E), (0xA9, 0x1D), (0xAA, 0x29), (0xAB, 0x6B), (0xAC, 0x1A), (0xAD, 0x18), (0xAE, 0x4B), (0xAF, 0x20), + (0xB0, 0x27), (0xB1, 0x50), (0xB2, 0x64), (0xB3, 0x39), (0xC0, 0x08), (0xC1, 0x1D), (0xC2, 0x2A), (0xC3, 0x10), + (0xC4, 0x15), (0xC5, 0x28), (0xC6, 0x1C), (0xC7, 0x1D), (0xC8, 0x7E), (0xC9, 0x1D), (0xCA, 0x29), (0xCB, 0x6B), + (0xCC, 0x1A), (0xCD, 0x18), (0xCE, 0x4B), (0xCF, 0x20), (0xD0, 0x27), (0xD1, 0x50), (0xD2, 0x64), (0xD3, 0x39), + (0xFF, 0x98, 0x81, 0x00), + (0x3A, 0x77), (0x36, 0x00), (0x35, 0x00), (0x35, 0x00), + ], +) From 1ccfcfc8d85593f81e96ea40cd4e8a162392a678 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 18:12:44 -0700 Subject: [PATCH 113/147] [time] Eliminate libc timezone bloat (~9.5KB flash ESP32, ~2% RAM on ESP8266) (#13635) Co-authored-by: Claude Opus 4.6 --- esphome/components/time/posix_tz.cpp | 488 +++++++ esphome/components/time/posix_tz.h | 144 +++ esphome/components/time/real_time_clock.cpp | 61 +- esphome/components/time/real_time_clock.h | 35 +- esphome/core/time.cpp | 232 +++- esphome/core/time.h | 18 +- script/cpp_unit_test.py | 1 + tests/components/time/posix_tz_parser.cpp | 1275 +++++++++++++++++++ 8 files changed, 2163 insertions(+), 91 deletions(-) create mode 100644 esphome/components/time/posix_tz.cpp create mode 100644 esphome/components/time/posix_tz.h create mode 100644 tests/components/time/posix_tz_parser.cpp diff --git a/esphome/components/time/posix_tz.cpp b/esphome/components/time/posix_tz.cpp new file mode 100644 index 0000000000..4d1f0c74c2 --- /dev/null +++ b/esphome/components/time/posix_tz.cpp @@ -0,0 +1,488 @@ +#include "esphome/core/defines.h" + +#ifdef USE_TIME_TIMEZONE + +#include "posix_tz.h" +#include + +namespace esphome::time { + +// Global timezone - set once at startup, rarely changes +// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) - intentional mutable state +static ParsedTimezone global_tz_{}; + +void set_global_tz(const ParsedTimezone &tz) { global_tz_ = tz; } + +const ParsedTimezone &get_global_tz() { return global_tz_; } + +namespace internal { + +// Remove before 2026.9.0: parse_uint, skip_tz_name, parse_offset, parse_dst_rule, +// and parse_transition_time are only used by parse_posix_tz() (bridge code). +static uint32_t parse_uint(const char *&p) { + uint32_t value = 0; + while (std::isdigit(static_cast(*p))) { + value = value * 10 + (*p - '0'); + p++; + } + return value; +} + +bool is_leap_year(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } + +// Get days in year (avoids duplicate is_leap_year calls) +static inline int days_in_year(int year) { return is_leap_year(year) ? 366 : 365; } + +// Convert days since epoch to year, updating days to remainder +static int __attribute__((noinline)) days_to_year(int64_t &days) { + int year = 1970; + int diy; + while (days >= (diy = days_in_year(year)) && year < 2200) { + days -= diy; + year++; + } + while (days < 0 && year > 1900) { + year--; + days += days_in_year(year); + } + return year; +} + +// Extract just the year from a UTC epoch +static int epoch_to_year(time_t epoch) { + int64_t days = epoch / 86400; + if (epoch < 0 && epoch % 86400 != 0) + days--; + return days_to_year(days); +} + +int days_in_month(int year, int month) { + switch (month) { + case 2: + return is_leap_year(year) ? 29 : 28; + case 4: + case 6: + case 9: + case 11: + return 30; + default: + return 31; + } +} + +// Zeller-like algorithm for day of week (0 = Sunday) +int __attribute__((noinline)) day_of_week(int year, int month, int day) { + // Adjust for January/February + if (month < 3) { + month += 12; + year--; + } + int k = year % 100; + int j = year / 100; + int h = (day + (13 * (month + 1)) / 5 + k + k / 4 + j / 4 - 2 * j) % 7; + // Convert from Zeller (0=Sat) to standard (0=Sun) + return ((h + 6) % 7); +} + +void __attribute__((noinline)) epoch_to_tm_utc(time_t epoch, struct tm *out_tm) { + // Days since epoch + int64_t days = epoch / 86400; + int32_t remaining_secs = epoch % 86400; + if (remaining_secs < 0) { + days--; + remaining_secs += 86400; + } + + out_tm->tm_sec = remaining_secs % 60; + remaining_secs /= 60; + out_tm->tm_min = remaining_secs % 60; + out_tm->tm_hour = remaining_secs / 60; + + // Day of week (Jan 1, 1970 was Thursday = 4) + out_tm->tm_wday = static_cast((days + 4) % 7); + if (out_tm->tm_wday < 0) + out_tm->tm_wday += 7; + + // Calculate year (updates days to day-of-year) + int year = days_to_year(days); + out_tm->tm_year = year - 1900; + out_tm->tm_yday = static_cast(days); + + // Calculate month and day + int month = 1; + int dim; + while (days >= (dim = days_in_month(year, month))) { + days -= dim; + month++; + } + + out_tm->tm_mon = month - 1; + out_tm->tm_mday = static_cast(days) + 1; + out_tm->tm_isdst = 0; +} + +bool skip_tz_name(const char *&p) { + if (*p == '<') { + // Angle-bracket quoted name: <+07>, <-03>, + p++; // skip '<' + while (*p && *p != '>') { + p++; + } + if (*p == '>') { + p++; // skip '>' + return true; + } + return false; // Unterminated + } + + // Standard name: 3+ letters + const char *start = p; + while (*p && std::isalpha(static_cast(*p))) { + p++; + } + return (p - start) >= 3; +} + +int32_t __attribute__((noinline)) parse_offset(const char *&p) { + int sign = 1; + if (*p == '-') { + sign = -1; + p++; + } else if (*p == '+') { + p++; + } + + int hours = parse_uint(p); + int minutes = 0; + int seconds = 0; + + if (*p == ':') { + p++; + minutes = parse_uint(p); + if (*p == ':') { + p++; + seconds = parse_uint(p); + } + } + + return sign * (hours * 3600 + minutes * 60 + seconds); +} + +// Helper to parse the optional /time suffix (reuses parse_offset logic) +static void parse_transition_time(const char *&p, DSTRule &rule) { + rule.time_seconds = 2 * 3600; // Default 02:00 + if (*p == '/') { + p++; + rule.time_seconds = parse_offset(p); + } +} + +void __attribute__((noinline)) julian_to_month_day(int julian_day, int &out_month, int &out_day) { + // J format: day 1-365, Feb 29 is NOT counted even in leap years + // So day 60 is always March 1 + // Iterate forward through months (no array needed) + int remaining = julian_day; + out_month = 1; + while (out_month <= 12) { + // Days in month for non-leap year (J format ignores leap years) + int dim = days_in_month(2001, out_month); // 2001 is non-leap year + if (remaining <= dim) { + out_day = remaining; + return; + } + remaining -= dim; + out_month++; + } + out_day = remaining; +} + +void __attribute__((noinline)) day_of_year_to_month_day(int day_of_year, int year, int &out_month, int &out_day) { + // Plain format: day 0-365, Feb 29 IS counted in leap years + // Day 0 = Jan 1 + int remaining = day_of_year; + out_month = 1; + + while (out_month <= 12) { + int days_this_month = days_in_month(year, out_month); + if (remaining < days_this_month) { + out_day = remaining + 1; + return; + } + remaining -= days_this_month; + out_month++; + } + + // Shouldn't reach here with valid input + out_month = 12; + out_day = 31; +} + +bool parse_dst_rule(const char *&p, DSTRule &rule) { + rule = {}; // Zero initialize + + if (*p == 'M' || *p == 'm') { + // M format: Mm.w.d (month.week.day) + rule.type = DSTRuleType::MONTH_WEEK_DAY; + p++; + + rule.month = parse_uint(p); + if (rule.month < 1 || rule.month > 12) + return false; + + if (*p++ != '.') + return false; + + rule.week = parse_uint(p); + if (rule.week < 1 || rule.week > 5) + return false; + + if (*p++ != '.') + return false; + + rule.day_of_week = parse_uint(p); + if (rule.day_of_week > 6) + return false; + + } else if (*p == 'J' || *p == 'j') { + // J format: Jn (Julian day 1-365, not counting Feb 29) + rule.type = DSTRuleType::JULIAN_NO_LEAP; + p++; + + rule.day = parse_uint(p); + if (rule.day < 1 || rule.day > 365) + return false; + + } else if (std::isdigit(static_cast(*p))) { + // Plain number format: n (day 0-365, counting Feb 29) + rule.type = DSTRuleType::DAY_OF_YEAR; + + rule.day = parse_uint(p); + if (rule.day > 365) + return false; + + } else { + return false; + } + + // Parse optional /time suffix + parse_transition_time(p, rule); + + return true; +} + +// Calculate days from Jan 1 of given year to given month/day +static int __attribute__((noinline)) days_from_year_start(int year, int month, int day) { + int days = day - 1; + for (int m = 1; m < month; m++) { + days += days_in_month(year, m); + } + return days; +} + +// Calculate days from epoch to Jan 1 of given year (for DST transition calculations) +// Only supports years >= 1970. Timezone is either compiled in from YAML or set by +// Home Assistant, so pre-1970 dates are not a concern. +static int64_t __attribute__((noinline)) days_to_year_start(int year) { + int64_t days = 0; + for (int y = 1970; y < year; y++) { + days += days_in_year(y); + } + return days; +} + +time_t __attribute__((noinline)) calculate_dst_transition(int year, const DSTRule &rule, int32_t base_offset_seconds) { + int month, day; + + switch (rule.type) { + case DSTRuleType::MONTH_WEEK_DAY: { + // Find the nth occurrence of day_of_week in the given month + int first_dow = day_of_week(year, rule.month, 1); + + // Days until first occurrence of target day + int days_until_first = (rule.day_of_week - first_dow + 7) % 7; + int first_occurrence = 1 + days_until_first; + + if (rule.week == 5) { + // "Last" occurrence - find the last one in the month + int dim = days_in_month(year, rule.month); + day = first_occurrence; + while (day + 7 <= dim) { + day += 7; + } + } else { + // nth occurrence + day = first_occurrence + (rule.week - 1) * 7; + } + month = rule.month; + break; + } + + case DSTRuleType::JULIAN_NO_LEAP: + // J format: day 1-365, Feb 29 not counted + julian_to_month_day(rule.day, month, day); + break; + + case DSTRuleType::DAY_OF_YEAR: + // Plain format: day 0-365, Feb 29 counted + day_of_year_to_month_day(rule.day, year, month, day); + break; + + case DSTRuleType::NONE: + // Should never be called with NONE, but handle it gracefully + month = 1; + day = 1; + break; + } + + // Calculate days from epoch to this date + int64_t days = days_to_year_start(year) + days_from_year_start(year, month, day); + + // Convert to epoch and add transition time and base offset + return days * 86400 + rule.time_seconds + base_offset_seconds; +} + +} // namespace internal + +bool __attribute__((noinline)) is_in_dst(time_t utc_epoch, const ParsedTimezone &tz) { + if (!tz.has_dst()) { + return false; + } + + int year = internal::epoch_to_year(utc_epoch); + + // Calculate DST start and end for this year + // DST start transition happens in standard time + time_t dst_start = internal::calculate_dst_transition(year, tz.dst_start, tz.std_offset_seconds); + // DST end transition happens in daylight time + time_t dst_end = internal::calculate_dst_transition(year, tz.dst_end, tz.dst_offset_seconds); + + if (dst_start < dst_end) { + // Northern hemisphere: DST is between start and end + return (utc_epoch >= dst_start && utc_epoch < dst_end); + } else { + // Southern hemisphere: DST is outside the range (wraps around year) + return (utc_epoch >= dst_start || utc_epoch < dst_end); + } +} + +// Remove before 2026.9.0: This parser is bridge code for backward compatibility with +// older Home Assistant clients that send the timezone as a POSIX TZ string instead of +// the pre-parsed ParsedTimezone protobuf struct. Once all clients send the struct +// directly, this function and the parsing helpers above (skip_tz_name, parse_offset, +// parse_dst_rule, parse_transition_time) can be removed. +// See https://github.com/esphome/backlog/issues/91 +bool parse_posix_tz(const char *tz_string, ParsedTimezone &result) { + if (!tz_string || !*tz_string) { + return false; + } + + const char *p = tz_string; + + // Initialize result (dst_start/dst_end default to type=NONE, so has_dst() returns false) + result.std_offset_seconds = 0; + result.dst_offset_seconds = 0; + result.dst_start = {}; + result.dst_end = {}; + + // Skip standard timezone name + if (!internal::skip_tz_name(p)) { + return false; + } + + // Parse standard offset (required) + if (!*p || (!std::isdigit(static_cast(*p)) && *p != '+' && *p != '-')) { + return false; + } + result.std_offset_seconds = internal::parse_offset(p); + + // Check for DST name + if (!*p) { + return true; // No DST + } + + // If next char is comma, there's no DST name but there are rules (invalid) + if (*p == ',') { + return false; + } + + // Check if there's something that looks like a DST name start + // (letter or angle bracket). If not, treat as trailing garbage and return success. + if (!std::isalpha(static_cast(*p)) && *p != '<') { + return true; // No DST, trailing characters ignored + } + + if (!internal::skip_tz_name(p)) { + return false; // Invalid DST name (started but malformed) + } + + // Optional DST offset (default is std - 1 hour) + if (*p && *p != ',' && (std::isdigit(static_cast(*p)) || *p == '+' || *p == '-')) { + result.dst_offset_seconds = internal::parse_offset(p); + } else { + result.dst_offset_seconds = result.std_offset_seconds - 3600; + } + + // Parse DST rules (required when DST name is present) + if (*p != ',') { + // DST name without rules - treat as no DST since we can't determine transitions + return true; + } + + p++; + if (!internal::parse_dst_rule(p, result.dst_start)) { + return false; + } + + // Second rule is required per POSIX + if (*p != ',') { + return false; + } + p++; + // has_dst() now returns true since dst_start.type was set by parse_dst_rule + return internal::parse_dst_rule(p, result.dst_end); +} + +bool epoch_to_local_tm(time_t utc_epoch, const ParsedTimezone &tz, struct tm *out_tm) { + if (!out_tm) { + return false; + } + + // Determine DST status once (avoids duplicate is_in_dst calculation) + bool in_dst = is_in_dst(utc_epoch, tz); + int32_t offset = in_dst ? tz.dst_offset_seconds : tz.std_offset_seconds; + + // Apply offset (POSIX offset is positive west, so subtract to get local) + time_t local_epoch = utc_epoch - offset; + + internal::epoch_to_tm_utc(local_epoch, out_tm); + out_tm->tm_isdst = in_dst ? 1 : 0; + + return true; +} + +} // namespace esphome::time + +#ifndef USE_HOST +// Override libc's localtime functions to use our timezone on embedded platforms. +// This allows user lambdas calling ::localtime() to get correct local time +// without needing the TZ environment variable (which pulls in scanf bloat). +// On host, we use the normal TZ mechanism since there's no memory constraint. + +// Thread-safe version +extern "C" struct tm *localtime_r(const time_t *timer, struct tm *result) { + if (timer == nullptr || result == nullptr) { + return nullptr; + } + esphome::time::epoch_to_local_tm(*timer, esphome::time::get_global_tz(), result); + return result; +} + +// Non-thread-safe version (uses static buffer, standard libc behavior) +extern "C" struct tm *localtime(const time_t *timer) { + // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) + static struct tm localtime_buf; + return localtime_r(timer, &localtime_buf); +} +#endif // !USE_HOST + +#endif // USE_TIME_TIMEZONE diff --git a/esphome/components/time/posix_tz.h b/esphome/components/time/posix_tz.h new file mode 100644 index 0000000000..c71ba15cd1 --- /dev/null +++ b/esphome/components/time/posix_tz.h @@ -0,0 +1,144 @@ +#pragma once + +#ifdef USE_TIME_TIMEZONE + +#include +#include + +namespace esphome::time { + +/// Type of DST transition rule +enum class DSTRuleType : uint8_t { + NONE = 0, ///< No DST rule (used to indicate no DST) + MONTH_WEEK_DAY, ///< M format: Mm.w.d (e.g., M3.2.0 = 2nd Sunday of March) + JULIAN_NO_LEAP, ///< J format: Jn (day 1-365, Feb 29 not counted) + DAY_OF_YEAR, ///< Plain number: n (day 0-365, Feb 29 counted in leap years) +}; + +/// Rule for DST transition (packed for 32-bit: 12 bytes) +struct DSTRule { + int32_t time_seconds; ///< Seconds after midnight (default 7200 = 2:00 AM) + uint16_t day; ///< Day of year (for JULIAN_NO_LEAP and DAY_OF_YEAR) + DSTRuleType type; ///< Type of rule + uint8_t month; ///< Month 1-12 (for MONTH_WEEK_DAY) + uint8_t week; ///< Week 1-5, 5 = last (for MONTH_WEEK_DAY) + uint8_t day_of_week; ///< Day 0-6, 0 = Sunday (for MONTH_WEEK_DAY) +}; + +/// Parsed POSIX timezone information (packed for 32-bit: 32 bytes) +struct ParsedTimezone { + int32_t std_offset_seconds; ///< Standard time offset from UTC in seconds (positive = west) + int32_t dst_offset_seconds; ///< DST offset from UTC in seconds + DSTRule dst_start; ///< When DST starts + DSTRule dst_end; ///< When DST ends + + /// Check if this timezone has DST rules + bool has_dst() const { return this->dst_start.type != DSTRuleType::NONE; } +}; + +/// Parse a POSIX TZ string into a ParsedTimezone struct. +/// +/// @deprecated Remove before 2026.9.0 (bridge code for backward compatibility). +/// This parser only exists so that older Home Assistant clients that send the timezone +/// as a string (instead of the pre-parsed ParsedTimezone protobuf struct) can still +/// set the timezone on the device. Once all clients are updated to send the struct +/// directly, this function and all internal parsing helpers will be removed. +/// See https://github.com/esphome/backlog/issues/91 +/// +/// Supports formats like: +/// - "EST5" (simple offset, no DST) +/// - "EST5EDT,M3.2.0,M11.1.0" (with DST, M-format rules) +/// - "CST6CDT,M3.2.0/2,M11.1.0/2" (with transition times) +/// - "<+07>-7" (angle-bracket notation for special names) +/// - "IST-5:30" (half-hour offsets) +/// - "EST5EDT,J60,J300" (J-format: Julian day without leap day) +/// - "EST5EDT,60,300" (plain day number: day of year with leap day) +/// @param tz_string The POSIX TZ string to parse +/// @param result Output: the parsed timezone data +/// @return true if parsing succeeded, false on error +bool parse_posix_tz(const char *tz_string, ParsedTimezone &result); + +/// Convert a UTC epoch to local time using the parsed timezone. +/// This replaces libc's localtime() to avoid scanf dependency. +/// @param utc_epoch Unix timestamp in UTC +/// @param tz The parsed timezone +/// @param[out] out_tm Output tm struct with local time +/// @return true on success +bool epoch_to_local_tm(time_t utc_epoch, const ParsedTimezone &tz, struct tm *out_tm); + +/// Set the global timezone used by epoch_to_local_tm() when called without a timezone. +/// This is called by RealTimeClock::apply_timezone_() to enable ESPTime::from_epoch_local() +/// to work without libc's localtime(). +void set_global_tz(const ParsedTimezone &tz); + +/// Get the global timezone. +const ParsedTimezone &get_global_tz(); + +/// Check if a given UTC epoch falls within DST for the parsed timezone. +/// @param utc_epoch Unix timestamp in UTC +/// @param tz The parsed timezone +/// @return true if DST is in effect at the given time +bool is_in_dst(time_t utc_epoch, const ParsedTimezone &tz); + +// Internal helper functions exposed for testing. +// Remove before 2026.9.0: skip_tz_name, parse_offset, parse_dst_rule are only +// used by parse_posix_tz() which is bridge code for backward compatibility. +// The remaining helpers (epoch_to_tm_utc, day_of_week, days_in_month, etc.) +// are used by the conversion functions and will stay. + +namespace internal { + +/// Skip a timezone name (letters or <...> quoted format) +/// @param p Pointer to current position, updated on return +/// @return true if a valid name was found +bool skip_tz_name(const char *&p); + +/// Parse an offset in format [-]hh[:mm[:ss]] +/// @param p Pointer to current position, updated on return +/// @return Offset in seconds +int32_t parse_offset(const char *&p); + +/// Parse a DST rule in format Mm.w.d[/time], Jn[/time], or n[/time] +/// @param p Pointer to current position, updated on return +/// @param rule Output: the parsed rule +/// @return true if parsing succeeded +bool parse_dst_rule(const char *&p, DSTRule &rule); + +/// Convert Julian day (J format, 1-365 not counting Feb 29) to month/day +/// @param julian_day Day number 1-365 +/// @param[out] month Output: month 1-12 +/// @param[out] day Output: day of month +void julian_to_month_day(int julian_day, int &month, int &day); + +/// Convert day of year (plain format, 0-365 counting Feb 29) to month/day +/// @param day_of_year Day number 0-365 +/// @param year The year (for leap year calculation) +/// @param[out] month Output: month 1-12 +/// @param[out] day Output: day of month +void day_of_year_to_month_day(int day_of_year, int year, int &month, int &day); + +/// Calculate day of week for any date (0 = Sunday) +/// Uses a simplified algorithm that works for years 1970-2099 +int day_of_week(int year, int month, int day); + +/// Get the number of days in a month +int days_in_month(int year, int month); + +/// Check if a year is a leap year +bool is_leap_year(int year); + +/// Convert epoch to year/month/day/hour/min/sec (UTC) +void epoch_to_tm_utc(time_t epoch, struct tm *out_tm); + +/// Calculate the epoch timestamp for a DST transition in a given year. +/// @param year The year (e.g., 2026) +/// @param rule The DST rule (month, week, day_of_week, time) +/// @param base_offset_seconds The timezone offset to apply (std or dst depending on context) +/// @return Unix epoch timestamp of the transition +time_t calculate_dst_transition(int year, const DSTRule &rule, int32_t base_offset_seconds); + +} // namespace internal + +} // namespace esphome::time + +#endif // USE_TIME_TIMEZONE diff --git a/esphome/components/time/real_time_clock.cpp b/esphome/components/time/real_time_clock.cpp index 8a78186178..2e758ad8e7 100644 --- a/esphome/components/time/real_time_clock.cpp +++ b/esphome/components/time/real_time_clock.cpp @@ -14,8 +14,8 @@ #include #endif #include - #include +#include namespace esphome::time { @@ -23,9 +23,33 @@ static const char *const TAG = "time"; RealTimeClock::RealTimeClock() = default; +ESPTime __attribute__((noinline)) RealTimeClock::now() { +#ifdef USE_TIME_TIMEZONE + time_t epoch = this->timestamp_now(); + struct tm local_tm; + if (epoch_to_local_tm(epoch, get_global_tz(), &local_tm)) { + return ESPTime::from_c_tm(&local_tm, epoch); + } + // Fallback to UTC if parsing failed + return ESPTime::from_epoch_utc(epoch); +#else + return ESPTime::from_epoch_local(this->timestamp_now()); +#endif +} + void RealTimeClock::dump_config() { #ifdef USE_TIME_TIMEZONE - ESP_LOGCONFIG(TAG, "Timezone: '%s'", this->timezone_.c_str()); + const auto &tz = get_global_tz(); + // POSIX offset is positive west, negate for conventional UTC+X display + int std_h = -tz.std_offset_seconds / 3600; + int std_m = (std::abs(tz.std_offset_seconds) % 3600) / 60; + if (tz.has_dst()) { + int dst_h = -tz.dst_offset_seconds / 3600; + int dst_m = (std::abs(tz.dst_offset_seconds) % 3600) / 60; + ESP_LOGCONFIG(TAG, "Timezone: UTC%+d:%02d (DST UTC%+d:%02d)", std_h, std_m, dst_h, dst_m); + } else { + ESP_LOGCONFIG(TAG, "Timezone: UTC%+d:%02d", std_h, std_m); + } #endif auto time = this->now(); ESP_LOGCONFIG(TAG, "Current time: %04d-%02d-%02d %02d:%02d:%02d", time.year, time.month, time.day_of_month, time.hour, @@ -72,11 +96,6 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) { ret = settimeofday(&timev, nullptr); } -#ifdef USE_TIME_TIMEZONE - // Move timezone back to local timezone. - this->apply_timezone_(); -#endif - if (ret != 0) { ESP_LOGW(TAG, "setimeofday() failed with code %d", ret); } @@ -89,9 +108,33 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) { } #ifdef USE_TIME_TIMEZONE -void RealTimeClock::apply_timezone_() { - setenv("TZ", this->timezone_.c_str(), 1); +void RealTimeClock::apply_timezone_(const char *tz) { + ParsedTimezone parsed{}; + + // Handle null or empty input - use UTC + if (tz == nullptr || *tz == '\0') { + // Skip if already UTC + if (!get_global_tz().has_dst() && get_global_tz().std_offset_seconds == 0) { + return; + } + set_global_tz(parsed); + return; + } + +#ifdef USE_HOST + // On host platform, also set TZ environment variable for libc compatibility + setenv("TZ", tz, 1); tzset(); +#endif + + // Parse the POSIX TZ string using our custom parser + if (!parse_posix_tz(tz, parsed)) { + ESP_LOGW(TAG, "Failed to parse timezone: %s", tz); + return; + } + + // Set global timezone for all time conversions + set_global_tz(parsed); } #endif diff --git a/esphome/components/time/real_time_clock.h b/esphome/components/time/real_time_clock.h index 19aa1a4f4a..f9de5f5614 100644 --- a/esphome/components/time/real_time_clock.h +++ b/esphome/components/time/real_time_clock.h @@ -6,6 +6,9 @@ #include "esphome/core/component.h" #include "esphome/core/helpers.h" #include "esphome/core/time.h" +#ifdef USE_TIME_TIMEZONE +#include "posix_tz.h" +#endif namespace esphome::time { @@ -20,26 +23,31 @@ class RealTimeClock : public PollingComponent { explicit RealTimeClock(); #ifdef USE_TIME_TIMEZONE - /// Set the time zone. - void set_timezone(const std::string &tz) { - this->timezone_ = tz; - this->apply_timezone_(); - } + /// Set the time zone from a POSIX TZ string. + void set_timezone(const char *tz) { this->apply_timezone_(tz); } - /// Set the time zone from raw buffer, only if it differs from the current one. + /// Set the time zone from a character buffer with known length. + /// The buffer does not need to be null-terminated. void set_timezone(const char *tz, size_t len) { - if (this->timezone_.length() != len || memcmp(this->timezone_.c_str(), tz, len) != 0) { - this->timezone_.assign(tz, len); - this->apply_timezone_(); + if (tz == nullptr) { + this->apply_timezone_(nullptr); + return; } + // Stack buffer - TZ strings from tzdata are typically short (< 50 chars) + char buf[128]; + if (len >= sizeof(buf)) + len = sizeof(buf) - 1; + memcpy(buf, tz, len); + buf[len] = '\0'; + this->apply_timezone_(buf); } - /// Get the time zone currently in use. - std::string get_timezone() { return this->timezone_; } + /// Set the time zone from a std::string. + void set_timezone(const std::string &tz) { this->apply_timezone_(tz.c_str()); } #endif /// Get the time in the currently defined timezone. - ESPTime now() { return ESPTime::from_epoch_local(this->timestamp_now()); } + ESPTime now(); /// Get the time without any time zone or DST corrections. ESPTime utcnow() { return ESPTime::from_epoch_utc(this->timestamp_now()); } @@ -58,8 +66,7 @@ class RealTimeClock : public PollingComponent { void synchronize_epoch_(uint32_t epoch); #ifdef USE_TIME_TIMEZONE - std::string timezone_{}; - void apply_timezone_(); + void apply_timezone_(const char *tz); #endif LazyCallbackManager time_sync_callback_; diff --git a/esphome/core/time.cpp b/esphome/core/time.cpp index 1aea18ac8d..73ba0a9be7 100644 --- a/esphome/core/time.cpp +++ b/esphome/core/time.cpp @@ -2,7 +2,6 @@ #include "helpers.h" #include -#include namespace esphome { @@ -67,58 +66,123 @@ std::string ESPTime::strftime(const char *format) { std::string ESPTime::strftime(const std::string &format) { return this->strftime(format.c_str()); } -bool ESPTime::strptime(const char *time_to_parse, size_t len, ESPTime &esp_time) { - uint16_t year; - uint8_t month; - uint8_t day; - uint8_t hour; - uint8_t minute; - uint8_t second; - int num; - const int ilen = static_cast(len); - - if (sscanf(time_to_parse, "%04hu-%02hhu-%02hhu %02hhu:%02hhu:%02hhu %n", &year, &month, &day, // NOLINT - &hour, // NOLINT - &minute, // NOLINT - &second, &num) == 6 && // NOLINT - num == ilen) { - esp_time.year = year; - esp_time.month = month; - esp_time.day_of_month = day; - esp_time.hour = hour; - esp_time.minute = minute; - esp_time.second = second; - } else if (sscanf(time_to_parse, "%04hu-%02hhu-%02hhu %02hhu:%02hhu %n", &year, &month, &day, // NOLINT - &hour, // NOLINT - &minute, &num) == 5 && // NOLINT - num == ilen) { - esp_time.year = year; - esp_time.month = month; - esp_time.day_of_month = day; - esp_time.hour = hour; - esp_time.minute = minute; - esp_time.second = 0; - } else if (sscanf(time_to_parse, "%02hhu:%02hhu:%02hhu %n", &hour, &minute, &second, &num) == 3 && // NOLINT - num == ilen) { - esp_time.hour = hour; - esp_time.minute = minute; - esp_time.second = second; - } else if (sscanf(time_to_parse, "%02hhu:%02hhu %n", &hour, &minute, &num) == 2 && // NOLINT - num == ilen) { - esp_time.hour = hour; - esp_time.minute = minute; - esp_time.second = 0; - } else if (sscanf(time_to_parse, "%04hu-%02hhu-%02hhu %n", &year, &month, &day, &num) == 3 && // NOLINT - num == ilen) { - esp_time.year = year; - esp_time.month = month; - esp_time.day_of_month = day; - } else { - return false; +// Helper to parse exactly N digits, returns false if not enough digits +static bool parse_digits(const char *&p, const char *end, int count, uint16_t &value) { + value = 0; + for (int i = 0; i < count; i++) { + if (p >= end || *p < '0' || *p > '9') + return false; + value = value * 10 + (*p - '0'); + p++; } return true; } +// Helper to check for expected character +static bool expect_char(const char *&p, const char *end, char expected) { + if (p >= end || *p != expected) + return false; + p++; + return true; +} + +bool ESPTime::strptime(const char *time_to_parse, size_t len, ESPTime &esp_time) { + // Supported formats: + // YYYY-MM-DD HH:MM:SS (19 chars) + // YYYY-MM-DD HH:MM (16 chars) + // YYYY-MM-DD (10 chars) + // HH:MM:SS (8 chars) + // HH:MM (5 chars) + + if (time_to_parse == nullptr || len == 0) + return false; + + const char *p = time_to_parse; + const char *end = time_to_parse + len; + uint16_t v1, v2, v3, v4, v5, v6; + + // Try date formats first (start with 4-digit year) + if (len >= 10 && time_to_parse[4] == '-') { + // YYYY-MM-DD... + if (!parse_digits(p, end, 4, v1)) + return false; + if (!expect_char(p, end, '-')) + return false; + if (!parse_digits(p, end, 2, v2)) + return false; + if (!expect_char(p, end, '-')) + return false; + if (!parse_digits(p, end, 2, v3)) + return false; + + esp_time.year = v1; + esp_time.month = v2; + esp_time.day_of_month = v3; + + if (p == end) { + // YYYY-MM-DD (date only) + return true; + } + + if (!expect_char(p, end, ' ')) + return false; + + // Continue with time part: HH:MM[:SS] + if (!parse_digits(p, end, 2, v4)) + return false; + if (!expect_char(p, end, ':')) + return false; + if (!parse_digits(p, end, 2, v5)) + return false; + + esp_time.hour = v4; + esp_time.minute = v5; + + if (p == end) { + // YYYY-MM-DD HH:MM + esp_time.second = 0; + return true; + } + + if (!expect_char(p, end, ':')) + return false; + if (!parse_digits(p, end, 2, v6)) + return false; + + esp_time.second = v6; + return p == end; // YYYY-MM-DD HH:MM:SS + } + + // Try time-only formats (HH:MM[:SS]) + if (len >= 5 && time_to_parse[2] == ':') { + if (!parse_digits(p, end, 2, v1)) + return false; + if (!expect_char(p, end, ':')) + return false; + if (!parse_digits(p, end, 2, v2)) + return false; + + esp_time.hour = v1; + esp_time.minute = v2; + + if (p == end) { + // HH:MM + esp_time.second = 0; + return true; + } + + if (!expect_char(p, end, ':')) + return false; + if (!parse_digits(p, end, 2, v3)) + return false; + + esp_time.second = v3; + return p == end; // HH:MM:SS + } + + return false; +} + void ESPTime::increment_second() { this->timestamp++; if (!increment_time_value(this->second, 0, 60)) @@ -193,27 +257,67 @@ void ESPTime::recalc_timestamp_utc(bool use_day_of_year) { } void ESPTime::recalc_timestamp_local() { - struct tm tm; +#ifdef USE_TIME_TIMEZONE + // Calculate timestamp as if fields were UTC + this->recalc_timestamp_utc(false); + if (this->timestamp == -1) { + return; // Invalid time + } - tm.tm_year = this->year - 1900; - tm.tm_mon = this->month - 1; - tm.tm_mday = this->day_of_month; - tm.tm_hour = this->hour; - tm.tm_min = this->minute; - tm.tm_sec = this->second; - tm.tm_isdst = -1; + // Now convert from local to UTC by adding the offset + // POSIX: local = utc - offset, so utc = local + offset + const auto &tz = time::get_global_tz(); - this->timestamp = mktime(&tm); + if (!tz.has_dst()) { + // No DST - just apply standard offset + this->timestamp += tz.std_offset_seconds; + return; + } + + // Try both interpretations to match libc mktime() with tm_isdst=-1 + // For ambiguous times (fall-back repeated hour), prefer standard time + // For invalid times (spring-forward skipped hour), libc normalizes forward + time_t utc_if_dst = this->timestamp + tz.dst_offset_seconds; + time_t utc_if_std = this->timestamp + tz.std_offset_seconds; + + bool dst_valid = time::is_in_dst(utc_if_dst, tz); + bool std_valid = !time::is_in_dst(utc_if_std, tz); + + if (dst_valid && std_valid) { + // Ambiguous time (repeated hour during fall-back) - prefer standard time + this->timestamp = utc_if_std; + } else if (dst_valid) { + // Only DST interpretation is valid + this->timestamp = utc_if_dst; + } else if (std_valid) { + // Only standard interpretation is valid + this->timestamp = utc_if_std; + } else { + // Invalid time (skipped hour during spring-forward) + // libc normalizes forward: 02:30 CST -> 08:30 UTC -> 03:30 CDT + // Using std offset achieves this since the UTC result falls during DST + this->timestamp = utc_if_std; + } +#else + // No timezone support - treat as UTC + this->recalc_timestamp_utc(false); +#endif } int32_t ESPTime::timezone_offset() { +#ifdef USE_TIME_TIMEZONE time_t now = ::time(nullptr); - struct tm local_tm = *::localtime(&now); - local_tm.tm_isdst = 0; // Cause mktime to ignore daylight saving time because we want to include it in the offset. - time_t local_time = mktime(&local_tm); - struct tm utc_tm = *::gmtime(&now); - time_t utc_time = mktime(&utc_tm); - return static_cast(local_time - utc_time); + const auto &tz = time::get_global_tz(); + // POSIX offset is positive west, but we return offset to add to UTC to get local + // So we negate the POSIX offset + if (time::is_in_dst(now, tz)) { + return -tz.dst_offset_seconds; + } + return -tz.std_offset_seconds; +#else + // No timezone support - no offset + return 0; +#endif } bool ESPTime::operator<(const ESPTime &other) const { return this->timestamp < other.timestamp; } diff --git a/esphome/core/time.h b/esphome/core/time.h index d9ce86131c..874f0db4b4 100644 --- a/esphome/core/time.h +++ b/esphome/core/time.h @@ -7,6 +7,10 @@ #include #include +#ifdef USE_TIME_TIMEZONE +#include "esphome/components/time/posix_tz.h" +#endif + namespace esphome { template bool increment_time_value(T ¤t, uint16_t begin, uint16_t end); @@ -105,11 +109,17 @@ struct ESPTime { * @return The generated ESPTime */ static ESPTime from_epoch_local(time_t epoch) { - struct tm *c_tm = ::localtime(&epoch); - if (c_tm == nullptr) { - return ESPTime{}; // Return an invalid ESPTime +#ifdef USE_TIME_TIMEZONE + struct tm local_tm; + if (time::epoch_to_local_tm(epoch, time::get_global_tz(), &local_tm)) { + return ESPTime::from_c_tm(&local_tm, epoch); } - return ESPTime::from_c_tm(c_tm, epoch); + // Fallback to UTC if conversion failed + return ESPTime::from_epoch_utc(epoch); +#else + // No timezone support - return UTC (no TZ configured, localtime would return UTC anyway) + return ESPTime::from_epoch_utc(epoch); +#endif } /** Convert an UTC epoch timestamp to a UTC time ESPTime instance. * diff --git a/script/cpp_unit_test.py b/script/cpp_unit_test.py index e97b5bd7b0..78b65092ae 100755 --- a/script/cpp_unit_test.py +++ b/script/cpp_unit_test.py @@ -66,6 +66,7 @@ def create_test_config(config_name: str, includes: list[str]) -> dict: ], "build_flags": [ "-Og", # optimize for debug + "-DUSE_TIME_TIMEZONE", # enable timezone code paths for testing ], "debug_build_flags": [ # only for debug builds "-g3", # max debug info diff --git a/tests/components/time/posix_tz_parser.cpp b/tests/components/time/posix_tz_parser.cpp new file mode 100644 index 0000000000..d1747ef5b1 --- /dev/null +++ b/tests/components/time/posix_tz_parser.cpp @@ -0,0 +1,1275 @@ +// Tests for the POSIX TZ parser, time conversion functions, and ESPTime::strptime. +// +// Most tests here cover the C++ POSIX TZ string parser (parse_posix_tz), which is +// bridge code for backward compatibility — it will be removed before ESPHome 2026.9.0. +// After https://github.com/esphome/esphome/pull/14233 merges, the parser is solely +// used to handle timezone strings from Home Assistant clients older than 2026.3.0 +// that haven't been updated to send the pre-parsed ParsedTimezone protobuf struct. +// See https://github.com/esphome/backlog/issues/91 +// +// The epoch_to_local_tm, is_in_dst, and ESPTime::strptime tests cover conversion +// functions that will remain permanently. + +// Enable USE_TIME_TIMEZONE for tests +#define USE_TIME_TIMEZONE + +#include +#include +#include +#include "esphome/components/time/posix_tz.h" +#include "esphome/core/time.h" + +namespace esphome::time::testing { + +// Helper to create UTC epoch from date/time components (for test readability) +static time_t make_utc(int year, int month, int day, int hour = 0, int min = 0, int sec = 0) { + int64_t days = 0; + for (int y = 1970; y < year; y++) { + days += (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) ? 366 : 365; + } + static const int DAYS_BEFORE[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; + days += DAYS_BEFORE[month - 1]; + if (month > 2 && (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))) + days++; // Leap year adjustment + days += day - 1; + return days * 86400 + hour * 3600 + min * 60 + sec; +} + +// ============================================================================ +// Basic TZ string parsing tests +// ============================================================================ + +TEST(PosixTzParser, ParseSimpleOffsetEST5) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("EST5", tz)); + EXPECT_EQ(tz.std_offset_seconds, 5 * 3600); // +5 hours (west of UTC) + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, ParseNegativeOffsetCET) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("CET-1", tz)); + EXPECT_EQ(tz.std_offset_seconds, -1 * 3600); // -1 hour (east of UTC) + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, ParseExplicitPositiveOffset) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("TEST+5", tz)); + EXPECT_EQ(tz.std_offset_seconds, 5 * 3600); + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, ParseZeroOffset) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("UTC0", tz)); + EXPECT_EQ(tz.std_offset_seconds, 0); + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, ParseUSEasternWithDST) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("EST5EDT,M3.2.0,M11.1.0", tz)); + EXPECT_EQ(tz.std_offset_seconds, 5 * 3600); + EXPECT_EQ(tz.dst_offset_seconds, 4 * 3600); // Default: STD - 1hr + EXPECT_TRUE(tz.has_dst()); + EXPECT_EQ(tz.dst_start.month, 3); + EXPECT_EQ(tz.dst_start.week, 2); + EXPECT_EQ(tz.dst_start.day_of_week, 0); // Sunday + EXPECT_EQ(tz.dst_start.time_seconds, 2 * 3600); // Default 2:00 AM + EXPECT_EQ(tz.dst_end.month, 11); + EXPECT_EQ(tz.dst_end.week, 1); + EXPECT_EQ(tz.dst_end.day_of_week, 0); +} + +TEST(PosixTzParser, ParseUSCentralWithTime) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("CST6CDT,M3.2.0/2,M11.1.0/2", tz)); + EXPECT_EQ(tz.std_offset_seconds, 6 * 3600); + EXPECT_EQ(tz.dst_offset_seconds, 5 * 3600); + EXPECT_EQ(tz.dst_start.time_seconds, 2 * 3600); // 2:00 AM + EXPECT_EQ(tz.dst_end.time_seconds, 2 * 3600); +} + +TEST(PosixTzParser, ParseEuropeBerlin) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("CET-1CEST,M3.5.0,M10.5.0/3", tz)); + EXPECT_EQ(tz.std_offset_seconds, -1 * 3600); + EXPECT_EQ(tz.dst_offset_seconds, -2 * 3600); // Default: STD - 1hr + EXPECT_TRUE(tz.has_dst()); + EXPECT_EQ(tz.dst_start.month, 3); + EXPECT_EQ(tz.dst_start.week, 5); // Last week + EXPECT_EQ(tz.dst_end.month, 10); + EXPECT_EQ(tz.dst_end.week, 5); // Last week + EXPECT_EQ(tz.dst_end.time_seconds, 3 * 3600); // 3:00 AM +} + +TEST(PosixTzParser, ParseNewZealand) { + ParsedTimezone tz; + // Southern hemisphere - DST starts in Sept, ends in April + ASSERT_TRUE(parse_posix_tz("NZST-12NZDT,M9.5.0,M4.1.0/3", tz)); + EXPECT_EQ(tz.std_offset_seconds, -12 * 3600); + EXPECT_EQ(tz.dst_offset_seconds, -13 * 3600); // Default: STD - 1hr + EXPECT_TRUE(tz.has_dst()); + EXPECT_EQ(tz.dst_start.month, 9); // September + EXPECT_EQ(tz.dst_end.month, 4); // April +} + +TEST(PosixTzParser, ParseExplicitDstOffset) { + ParsedTimezone tz; + // Some places have non-standard DST offsets + ASSERT_TRUE(parse_posix_tz("TEST5DST4,M3.2.0,M11.1.0", tz)); + EXPECT_EQ(tz.std_offset_seconds, 5 * 3600); + EXPECT_EQ(tz.dst_offset_seconds, 4 * 3600); + EXPECT_TRUE(tz.has_dst()); +} + +// ============================================================================ +// Angle-bracket notation tests (espressif/newlib-esp32#8) +// ============================================================================ + +TEST(PosixTzParser, ParseAngleBracketPositive) { + // Format: <+07>-7 means UTC+7 (name is "+07", offset is -7 hours east) + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("<+07>-7", tz)); + EXPECT_EQ(tz.std_offset_seconds, -7 * 3600); // -7 = 7 hours east of UTC + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, ParseAngleBracketNegative) { + // <-03>3 means UTC-3 (name is "-03", offset is 3 hours west) + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("<-03>3", tz)); + EXPECT_EQ(tz.std_offset_seconds, 3 * 3600); + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, ParseAngleBracketWithDST) { + // <+10>-10<+11>,M10.1.0,M4.1.0/3 (Australia/Sydney style) + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("<+10>-10<+11>,M10.1.0,M4.1.0/3", tz)); + EXPECT_EQ(tz.std_offset_seconds, -10 * 3600); + EXPECT_EQ(tz.dst_offset_seconds, -11 * 3600); + EXPECT_TRUE(tz.has_dst()); + EXPECT_EQ(tz.dst_start.month, 10); + EXPECT_EQ(tz.dst_end.month, 4); +} + +TEST(PosixTzParser, ParseAngleBracketNamed) { + // -10 (Australian Eastern Standard Time) + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("-10", tz)); + EXPECT_EQ(tz.std_offset_seconds, -10 * 3600); + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, ParseAngleBracketWithMinutes) { + // <+0545>-5:45 (Nepal) + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("<+0545>-5:45", tz)); + EXPECT_EQ(tz.std_offset_seconds, -(5 * 3600 + 45 * 60)); + EXPECT_FALSE(tz.has_dst()); +} + +// ============================================================================ +// Half-hour and unusual offset tests +// ============================================================================ + +TEST(PosixTzParser, ParseOffsetWithMinutesIndia) { + ParsedTimezone tz; + // India: UTC+5:30 + ASSERT_TRUE(parse_posix_tz("IST-5:30", tz)); + EXPECT_EQ(tz.std_offset_seconds, -(5 * 3600 + 30 * 60)); + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, ParseOffsetWithMinutesNepal) { + ParsedTimezone tz; + // Nepal: UTC+5:45 + ASSERT_TRUE(parse_posix_tz("NPT-5:45", tz)); + EXPECT_EQ(tz.std_offset_seconds, -(5 * 3600 + 45 * 60)); + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, ParseOffsetWithSeconds) { + ParsedTimezone tz; + // Unusual but valid: offset with seconds + ASSERT_TRUE(parse_posix_tz("TEST-1:30:30", tz)); + EXPECT_EQ(tz.std_offset_seconds, -(1 * 3600 + 30 * 60 + 30)); +} + +TEST(PosixTzParser, ParseChathamIslands) { + // Chatham Islands: UTC+12:45 with DST + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45", tz)); + EXPECT_EQ(tz.std_offset_seconds, -(12 * 3600 + 45 * 60)); + EXPECT_EQ(tz.dst_offset_seconds, -(13 * 3600 + 45 * 60)); + EXPECT_TRUE(tz.has_dst()); +} + +// ============================================================================ +// Invalid input tests +// ============================================================================ + +TEST(PosixTzParser, ParseEmptyStringFails) { + ParsedTimezone tz; + EXPECT_FALSE(parse_posix_tz("", tz)); +} + +TEST(PosixTzParser, ParseNullFails) { + ParsedTimezone tz; + EXPECT_FALSE(parse_posix_tz(nullptr, tz)); +} + +TEST(PosixTzParser, ParseShortNameFails) { + ParsedTimezone tz; + // TZ name must be at least 3 characters + EXPECT_FALSE(parse_posix_tz("AB5", tz)); +} + +TEST(PosixTzParser, ParseMissingOffsetFails) { + ParsedTimezone tz; + EXPECT_FALSE(parse_posix_tz("EST", tz)); +} + +TEST(PosixTzParser, ParseUnterminatedBracketFails) { + ParsedTimezone tz; + EXPECT_FALSE(parse_posix_tz("<+07-7", tz)); // Missing closing > +} + +// ============================================================================ +// J-format and plain day number tests +// ============================================================================ + +TEST(PosixTzParser, ParseJFormatBasic) { + ParsedTimezone tz; + // J format: Julian day 1-365, not counting Feb 29 + ASSERT_TRUE(parse_posix_tz("EST5EDT,J60,J305", tz)); + EXPECT_TRUE(tz.has_dst()); + EXPECT_EQ(tz.dst_start.type, DSTRuleType::JULIAN_NO_LEAP); + EXPECT_EQ(tz.dst_start.day, 60); // March 1 + EXPECT_EQ(tz.dst_end.type, DSTRuleType::JULIAN_NO_LEAP); + EXPECT_EQ(tz.dst_end.day, 305); // November 1 +} + +TEST(PosixTzParser, ParseJFormatWithTime) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("EST5EDT,J60/2,J305/2", tz)); + EXPECT_EQ(tz.dst_start.day, 60); + EXPECT_EQ(tz.dst_start.time_seconds, 2 * 3600); + EXPECT_EQ(tz.dst_end.day, 305); + EXPECT_EQ(tz.dst_end.time_seconds, 2 * 3600); +} + +TEST(PosixTzParser, ParsePlainDayNumber) { + ParsedTimezone tz; + // Plain format: day 0-365, counting Feb 29 in leap years + ASSERT_TRUE(parse_posix_tz("EST5EDT,59,304", tz)); + EXPECT_TRUE(tz.has_dst()); + EXPECT_EQ(tz.dst_start.type, DSTRuleType::DAY_OF_YEAR); + EXPECT_EQ(tz.dst_start.day, 59); + EXPECT_EQ(tz.dst_end.type, DSTRuleType::DAY_OF_YEAR); + EXPECT_EQ(tz.dst_end.day, 304); +} + +TEST(PosixTzParser, JFormatInvalidDayZero) { + ParsedTimezone tz; + // J format day must be 1-365, not 0 + EXPECT_FALSE(parse_posix_tz("EST5EDT,J0,J305", tz)); +} + +TEST(PosixTzParser, JFormatInvalidDay366) { + ParsedTimezone tz; + // J format day must be 1-365 + EXPECT_FALSE(parse_posix_tz("EST5EDT,J366,J305", tz)); +} + +TEST(PosixTzParser, ParsePlainDayNumberWithTime) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("EST5EDT,59/3,304/1:30", tz)); + EXPECT_EQ(tz.dst_start.day, 59); + EXPECT_EQ(tz.dst_start.time_seconds, 3 * 3600); + EXPECT_EQ(tz.dst_end.day, 304); + EXPECT_EQ(tz.dst_end.time_seconds, 1 * 3600 + 30 * 60); +} + +TEST(PosixTzParser, PlainDayInvalidDay366) { + ParsedTimezone tz; + // Plain format day must be 0-365 + EXPECT_FALSE(parse_posix_tz("EST5EDT,366,304", tz)); +} + +// ============================================================================ +// Transition time edge cases (POSIX V3 allows -167 to +167 hours) +// ============================================================================ + +TEST(PosixTzParser, NegativeTransitionTime) { + ParsedTimezone tz; + // Negative transition time: /-1 means 11 PM (23:00) the previous day + ASSERT_TRUE(parse_posix_tz("EST5EDT,M3.2.0/-1,M11.1.0/2", tz)); + EXPECT_EQ(tz.dst_start.time_seconds, -1 * 3600); // -1 hour = 11 PM previous day + EXPECT_EQ(tz.dst_end.time_seconds, 2 * 3600); +} + +TEST(PosixTzParser, NegativeTransitionTimeWithMinutes) { + ParsedTimezone tz; + // /-1:30 means 10:30 PM the previous day + ASSERT_TRUE(parse_posix_tz("EST5EDT,M3.2.0/-1:30,M11.1.0", tz)); + EXPECT_EQ(tz.dst_start.time_seconds, -(1 * 3600 + 30 * 60)); +} + +TEST(PosixTzParser, LargeTransitionTime) { + ParsedTimezone tz; + // POSIX V3 allows transition times from -167 to +167 hours + // /25 means 1:00 AM the next day + ASSERT_TRUE(parse_posix_tz("EST5EDT,M3.2.0/25,M11.1.0", tz)); + EXPECT_EQ(tz.dst_start.time_seconds, 25 * 3600); +} + +TEST(PosixTzParser, MaxTransitionTime167Hours) { + ParsedTimezone tz; + // Maximum allowed transition time per POSIX V3 + ASSERT_TRUE(parse_posix_tz("EST5EDT,M3.2.0/167,M11.1.0", tz)); + EXPECT_EQ(tz.dst_start.time_seconds, 167 * 3600); +} + +TEST(PosixTzParser, TransitionTimeWithHoursMinutesSeconds) { + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz("EST5EDT,M3.2.0/2:30:45,M11.1.0", tz)); + EXPECT_EQ(tz.dst_start.time_seconds, 2 * 3600 + 30 * 60 + 45); +} + +// ============================================================================ +// Invalid M format tests +// ============================================================================ + +TEST(PosixTzParser, MFormatInvalidMonth13) { + ParsedTimezone tz; + // Month must be 1-12 + EXPECT_FALSE(parse_posix_tz("EST5EDT,M13.1.0,M11.1.0", tz)); +} + +TEST(PosixTzParser, MFormatInvalidMonth0) { + ParsedTimezone tz; + // Month must be 1-12 + EXPECT_FALSE(parse_posix_tz("EST5EDT,M0.1.0,M11.1.0", tz)); +} + +TEST(PosixTzParser, MFormatInvalidWeek6) { + ParsedTimezone tz; + // Week must be 1-5 + EXPECT_FALSE(parse_posix_tz("EST5EDT,M3.6.0,M11.1.0", tz)); +} + +TEST(PosixTzParser, MFormatInvalidWeek0) { + ParsedTimezone tz; + // Week must be 1-5 + EXPECT_FALSE(parse_posix_tz("EST5EDT,M3.0.0,M11.1.0", tz)); +} + +TEST(PosixTzParser, MFormatInvalidDayOfWeek7) { + ParsedTimezone tz; + // Day of week must be 0-6 + EXPECT_FALSE(parse_posix_tz("EST5EDT,M3.2.7,M11.1.0", tz)); +} + +TEST(PosixTzParser, MissingEndRule) { + ParsedTimezone tz; + // POSIX requires both start and end rules if any rules are specified + EXPECT_FALSE(parse_posix_tz("EST5EDT,M3.2.0", tz)); +} + +TEST(PosixTzParser, MissingEndRuleJFormat) { + ParsedTimezone tz; + // POSIX requires both start and end rules if any rules are specified + EXPECT_FALSE(parse_posix_tz("EST5EDT,J60", tz)); +} + +TEST(PosixTzParser, MissingEndRulePlainDay) { + ParsedTimezone tz; + // POSIX requires both start and end rules if any rules are specified + EXPECT_FALSE(parse_posix_tz("EST5EDT,60", tz)); +} + +TEST(PosixTzParser, LowercaseMFormat) { + ParsedTimezone tz; + // Lowercase 'm' should be accepted + ASSERT_TRUE(parse_posix_tz("EST5EDT,m3.2.0,m11.1.0", tz)); + EXPECT_TRUE(tz.has_dst()); + EXPECT_EQ(tz.dst_start.month, 3); + EXPECT_EQ(tz.dst_end.month, 11); +} + +TEST(PosixTzParser, LowercaseJFormat) { + ParsedTimezone tz; + // Lowercase 'j' should be accepted + ASSERT_TRUE(parse_posix_tz("EST5EDT,j60,j305", tz)); + EXPECT_EQ(tz.dst_start.type, DSTRuleType::JULIAN_NO_LEAP); + EXPECT_EQ(tz.dst_start.day, 60); +} + +TEST(PosixTzParser, DstNameWithoutRules) { + ParsedTimezone tz; + // DST name present but no rules - treat as no DST since we can't determine transitions + ASSERT_TRUE(parse_posix_tz("EST5EDT", tz)); + EXPECT_FALSE(tz.has_dst()); + EXPECT_EQ(tz.std_offset_seconds, 5 * 3600); +} + +TEST(PosixTzParser, TrailingCharactersIgnored) { + ParsedTimezone tz; + // Trailing characters after valid TZ should be ignored (parser stops at end of valid input) + // This matches libc behavior + ASSERT_TRUE(parse_posix_tz("EST5 extra garbage here", tz)); + EXPECT_EQ(tz.std_offset_seconds, 5 * 3600); + EXPECT_FALSE(tz.has_dst()); +} + +TEST(PosixTzParser, PlainDay365LeapYear) { + // Day 365 in leap year is Dec 31 + int month, day; + internal::day_of_year_to_month_day(365, 2024, month, day); + EXPECT_EQ(month, 12); + EXPECT_EQ(day, 31); +} + +TEST(PosixTzParser, PlainDay364NonLeapYear) { + // Day 364 (0-indexed) is Dec 31 in non-leap year (last valid day) + int month, day; + internal::day_of_year_to_month_day(364, 2025, month, day); + EXPECT_EQ(month, 12); + EXPECT_EQ(day, 31); +} + +// ============================================================================ +// Large offset tests +// ============================================================================ + +TEST(PosixTzParser, MaxOffset14Hours) { + ParsedTimezone tz; + // Line Islands (Kiribati) is UTC+14, the maximum offset + ASSERT_TRUE(parse_posix_tz("<+14>-14", tz)); + EXPECT_EQ(tz.std_offset_seconds, -14 * 3600); +} + +TEST(PosixTzParser, MaxNegativeOffset12Hours) { + ParsedTimezone tz; + // Baker Island is UTC-12 + ASSERT_TRUE(parse_posix_tz("<-12>12", tz)); + EXPECT_EQ(tz.std_offset_seconds, 12 * 3600); +} + +// ============================================================================ +// Helper function tests +// ============================================================================ + +TEST(PosixTzParser, JulianDay60IsMarch1) { + // J60 is always March 1 (J format ignores leap years by design) + int month, day; + internal::julian_to_month_day(60, month, day); + EXPECT_EQ(month, 3); + EXPECT_EQ(day, 1); +} + +TEST(PosixTzParser, DayOfYear59DiffersByLeap) { + int month, day; + // Day 59 in leap year is Feb 29 + internal::day_of_year_to_month_day(59, 2024, month, day); + EXPECT_EQ(month, 2); + EXPECT_EQ(day, 29); + // Day 59 in non-leap year is March 1 + internal::day_of_year_to_month_day(59, 2025, month, day); + EXPECT_EQ(month, 3); + EXPECT_EQ(day, 1); +} + +TEST(PosixTzParser, DayOfWeekKnownDates) { + // January 1, 1970 was Thursday (4) + EXPECT_EQ(internal::day_of_week(1970, 1, 1), 4); + // January 1, 2000 was Saturday (6) + EXPECT_EQ(internal::day_of_week(2000, 1, 1), 6); + // March 8, 2026 is Sunday (0) - US DST start + EXPECT_EQ(internal::day_of_week(2026, 3, 8), 0); +} + +TEST(PosixTzParser, LeapYearDetection) { + EXPECT_FALSE(internal::is_leap_year(1900)); // Divisible by 100 but not 400 + EXPECT_TRUE(internal::is_leap_year(2000)); // Divisible by 400 + EXPECT_TRUE(internal::is_leap_year(2024)); // Divisible by 4 + EXPECT_FALSE(internal::is_leap_year(2025)); // Not divisible by 4 +} + +TEST(PosixTzParser, JulianDay1IsJan1) { + int month, day; + internal::julian_to_month_day(1, month, day); + EXPECT_EQ(month, 1); + EXPECT_EQ(day, 1); +} + +TEST(PosixTzParser, JulianDay31IsJan31) { + int month, day; + internal::julian_to_month_day(31, month, day); + EXPECT_EQ(month, 1); + EXPECT_EQ(day, 31); +} + +TEST(PosixTzParser, JulianDay32IsFeb1) { + int month, day; + internal::julian_to_month_day(32, month, day); + EXPECT_EQ(month, 2); + EXPECT_EQ(day, 1); +} + +TEST(PosixTzParser, JulianDay59IsFeb28) { + int month, day; + internal::julian_to_month_day(59, month, day); + EXPECT_EQ(month, 2); + EXPECT_EQ(day, 28); +} + +TEST(PosixTzParser, JulianDay365IsDec31) { + int month, day; + internal::julian_to_month_day(365, month, day); + EXPECT_EQ(month, 12); + EXPECT_EQ(day, 31); +} + +TEST(PosixTzParser, DayOfYear0IsJan1) { + int month, day; + internal::day_of_year_to_month_day(0, 2025, month, day); + EXPECT_EQ(month, 1); + EXPECT_EQ(day, 1); +} + +TEST(PosixTzParser, DaysInMonthRegular) { + // Test all 12 months to ensure switch coverage + EXPECT_EQ(internal::days_in_month(2025, 1), 31); // Jan - default case + EXPECT_EQ(internal::days_in_month(2025, 2), 28); // Feb - case 2 + EXPECT_EQ(internal::days_in_month(2025, 3), 31); // Mar - default case + EXPECT_EQ(internal::days_in_month(2025, 4), 30); // Apr - case 4 + EXPECT_EQ(internal::days_in_month(2025, 5), 31); // May - default case + EXPECT_EQ(internal::days_in_month(2025, 6), 30); // Jun - case 6 + EXPECT_EQ(internal::days_in_month(2025, 7), 31); // Jul - default case + EXPECT_EQ(internal::days_in_month(2025, 8), 31); // Aug - default case + EXPECT_EQ(internal::days_in_month(2025, 9), 30); // Sep - case 9 + EXPECT_EQ(internal::days_in_month(2025, 10), 31); // Oct - default case + EXPECT_EQ(internal::days_in_month(2025, 11), 30); // Nov - case 11 + EXPECT_EQ(internal::days_in_month(2025, 12), 31); // Dec - default case +} + +TEST(PosixTzParser, DaysInMonthLeapYear) { + EXPECT_EQ(internal::days_in_month(2024, 2), 29); + EXPECT_EQ(internal::days_in_month(2025, 2), 28); +} + +// ============================================================================ +// DST transition calculation tests +// ============================================================================ + +TEST(PosixTzParser, DstStartUSEastern2026) { + // March 8, 2026 is 2nd Sunday of March + ParsedTimezone tz; + parse_posix_tz("EST5EDT,M3.2.0/2,M11.1.0/2", tz); + + time_t dst_start = internal::calculate_dst_transition(2026, tz.dst_start, tz.std_offset_seconds); + struct tm tm; + internal::epoch_to_tm_utc(dst_start, &tm); + + // At 2:00 AM EST (UTC-5), so 7:00 AM UTC + EXPECT_EQ(tm.tm_year + 1900, 2026); + EXPECT_EQ(tm.tm_mon + 1, 3); // March + EXPECT_EQ(tm.tm_mday, 8); // 8th + EXPECT_EQ(tm.tm_hour, 7); // 7:00 UTC = 2:00 EST +} + +TEST(PosixTzParser, DstEndUSEastern2026) { + // November 1, 2026 is 1st Sunday of November + ParsedTimezone tz; + parse_posix_tz("EST5EDT,M3.2.0/2,M11.1.0/2", tz); + + time_t dst_end = internal::calculate_dst_transition(2026, tz.dst_end, tz.dst_offset_seconds); + struct tm tm; + internal::epoch_to_tm_utc(dst_end, &tm); + + // At 2:00 AM EDT (UTC-4), so 6:00 AM UTC + EXPECT_EQ(tm.tm_year + 1900, 2026); + EXPECT_EQ(tm.tm_mon + 1, 11); // November + EXPECT_EQ(tm.tm_mday, 1); // 1st + EXPECT_EQ(tm.tm_hour, 6); // 6:00 UTC = 2:00 EDT +} + +TEST(PosixTzParser, LastSundayOfMarch2026) { + // Europe: M3.5.0 = last Sunday of March = March 29, 2026 + DSTRule rule{}; + rule.type = DSTRuleType::MONTH_WEEK_DAY; + rule.month = 3; + rule.week = 5; + rule.day_of_week = 0; + rule.time_seconds = 2 * 3600; + time_t transition = internal::calculate_dst_transition(2026, rule, 0); + struct tm tm; + internal::epoch_to_tm_utc(transition, &tm); + EXPECT_EQ(tm.tm_mday, 29); + EXPECT_EQ(tm.tm_wday, 0); // Sunday +} + +TEST(PosixTzParser, LastSundayOfOctober2026) { + // Europe: M10.5.0 = last Sunday of October = October 25, 2026 + DSTRule rule{}; + rule.type = DSTRuleType::MONTH_WEEK_DAY; + rule.month = 10; + rule.week = 5; + rule.day_of_week = 0; + rule.time_seconds = 3 * 3600; + time_t transition = internal::calculate_dst_transition(2026, rule, 0); + struct tm tm; + internal::epoch_to_tm_utc(transition, &tm); + EXPECT_EQ(tm.tm_mday, 25); + EXPECT_EQ(tm.tm_wday, 0); // Sunday +} + +TEST(PosixTzParser, FirstSundayOfApril2026) { + // April 5, 2026 is 1st Sunday + DSTRule rule{}; + rule.type = DSTRuleType::MONTH_WEEK_DAY; + rule.month = 4; + rule.week = 1; + rule.day_of_week = 0; + rule.time_seconds = 0; + time_t transition = internal::calculate_dst_transition(2026, rule, 0); + struct tm tm; + internal::epoch_to_tm_utc(transition, &tm); + EXPECT_EQ(tm.tm_mday, 5); + EXPECT_EQ(tm.tm_wday, 0); +} + +// ============================================================================ +// DST detection tests +// ============================================================================ + +TEST(PosixTzParser, IsInDstUSEasternSummer) { + ParsedTimezone tz; + parse_posix_tz("EST5EDT,M3.2.0/2,M11.1.0/2", tz); + + // July 4, 2026 12:00 UTC - definitely in DST + time_t summer = make_utc(2026, 7, 4, 12); + EXPECT_TRUE(is_in_dst(summer, tz)); +} + +TEST(PosixTzParser, IsInDstUSEasternWinter) { + ParsedTimezone tz; + parse_posix_tz("EST5EDT,M3.2.0/2,M11.1.0/2", tz); + + // January 15, 2026 12:00 UTC - definitely not in DST + time_t winter = make_utc(2026, 1, 15, 12); + EXPECT_FALSE(is_in_dst(winter, tz)); +} + +TEST(PosixTzParser, IsInDstNoDstTimezone) { + ParsedTimezone tz; + parse_posix_tz("IST-5:30", tz); + + // July 15, 2026 12:00 UTC + time_t epoch = make_utc(2026, 7, 15, 12); + EXPECT_FALSE(is_in_dst(epoch, tz)); +} + +TEST(PosixTzParser, SouthernHemisphereDstSummer) { + ParsedTimezone tz; + parse_posix_tz("NZST-12NZDT,M9.5.0,M4.1.0/3", tz); + + // December 15, 2025 12:00 UTC - summer in NZ, should be in DST + time_t nz_summer = make_utc(2025, 12, 15, 12); + EXPECT_TRUE(is_in_dst(nz_summer, tz)); +} + +TEST(PosixTzParser, SouthernHemisphereDstWinter) { + ParsedTimezone tz; + parse_posix_tz("NZST-12NZDT,M9.5.0,M4.1.0/3", tz); + + // July 15, 2026 12:00 UTC - winter in NZ, should NOT be in DST + time_t nz_winter = make_utc(2026, 7, 15, 12); + EXPECT_FALSE(is_in_dst(nz_winter, tz)); +} + +// ============================================================================ +// epoch_to_local_tm tests +// ============================================================================ + +TEST(PosixTzParser, EpochToLocalBasic) { + ParsedTimezone tz; + parse_posix_tz("UTC0", tz); + + time_t epoch = 0; // Jan 1, 1970 00:00:00 UTC + struct tm local; + ASSERT_TRUE(epoch_to_local_tm(epoch, tz, &local)); + EXPECT_EQ(local.tm_year, 70); + EXPECT_EQ(local.tm_mon, 0); + EXPECT_EQ(local.tm_mday, 1); + EXPECT_EQ(local.tm_hour, 0); +} + +TEST(PosixTzParser, EpochToLocalNegativeEpoch) { + ParsedTimezone tz; + parse_posix_tz("UTC0", tz); + + // Dec 31, 1969 23:59:59 UTC (1 second before epoch) + time_t epoch = -1; + struct tm local; + ASSERT_TRUE(epoch_to_local_tm(epoch, tz, &local)); + EXPECT_EQ(local.tm_year, 69); // 1969 + EXPECT_EQ(local.tm_mon, 11); // December + EXPECT_EQ(local.tm_mday, 31); + EXPECT_EQ(local.tm_hour, 23); + EXPECT_EQ(local.tm_min, 59); + EXPECT_EQ(local.tm_sec, 59); +} + +TEST(PosixTzParser, EpochToLocalNullTmFails) { + ParsedTimezone tz; + parse_posix_tz("UTC0", tz); + EXPECT_FALSE(epoch_to_local_tm(0, tz, nullptr)); +} + +TEST(PosixTzParser, EpochToLocalWithOffset) { + ParsedTimezone tz; + parse_posix_tz("EST5", tz); // UTC-5 + + // Jan 1, 2026 05:00:00 UTC should be Jan 1, 2026 00:00:00 EST + time_t utc_epoch = make_utc(2026, 1, 1, 5); + + struct tm local; + ASSERT_TRUE(epoch_to_local_tm(utc_epoch, tz, &local)); + EXPECT_EQ(local.tm_hour, 0); // Midnight EST + EXPECT_EQ(local.tm_mday, 1); + EXPECT_EQ(local.tm_isdst, 0); +} + +TEST(PosixTzParser, EpochToLocalDstTransition) { + ParsedTimezone tz; + parse_posix_tz("EST5EDT,M3.2.0/2,M11.1.0/2", tz); + + // July 4, 2026 16:00 UTC = 12:00 EDT (noon) + time_t utc_epoch = make_utc(2026, 7, 4, 16); + + struct tm local; + ASSERT_TRUE(epoch_to_local_tm(utc_epoch, tz, &local)); + EXPECT_EQ(local.tm_hour, 12); // Noon EDT + EXPECT_EQ(local.tm_isdst, 1); +} + +// ============================================================================ +// Verification against libc +// ============================================================================ + +class LibcVerificationTest : public ::testing::TestWithParam> { + protected: + // NOLINTNEXTLINE(readability-identifier-naming) - Google Test requires this name + void SetUp() override { + // Save current TZ + const char *current_tz = getenv("TZ"); + saved_tz_ = current_tz ? current_tz : ""; + had_tz_ = current_tz != nullptr; + } + + // NOLINTNEXTLINE(readability-identifier-naming) - Google Test requires this name + void TearDown() override { + // Restore TZ + if (had_tz_) { + setenv("TZ", saved_tz_.c_str(), 1); + } else { + unsetenv("TZ"); + } + tzset(); + } + + private: + std::string saved_tz_; + bool had_tz_{false}; +}; + +TEST_P(LibcVerificationTest, MatchesLibc) { + auto [tz_str, epoch] = GetParam(); + + ParsedTimezone tz; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + + // Our implementation + struct tm our_tm {}; + ASSERT_TRUE(epoch_to_local_tm(epoch, tz, &our_tm)); + + // libc implementation + setenv("TZ", tz_str, 1); + tzset(); + struct tm *libc_tm = localtime(&epoch); + ASSERT_NE(libc_tm, nullptr); + + EXPECT_EQ(our_tm.tm_year, libc_tm->tm_year); + EXPECT_EQ(our_tm.tm_mon, libc_tm->tm_mon); + EXPECT_EQ(our_tm.tm_mday, libc_tm->tm_mday); + EXPECT_EQ(our_tm.tm_hour, libc_tm->tm_hour); + EXPECT_EQ(our_tm.tm_min, libc_tm->tm_min); + EXPECT_EQ(our_tm.tm_sec, libc_tm->tm_sec); + EXPECT_EQ(our_tm.tm_isdst, libc_tm->tm_isdst); +} + +INSTANTIATE_TEST_SUITE_P(USEastern, LibcVerificationTest, + ::testing::Values(std::make_tuple("EST5EDT,M3.2.0/2,M11.1.0/2", 1704067200), + std::make_tuple("EST5EDT,M3.2.0/2,M11.1.0/2", 1720000000), + std::make_tuple("EST5EDT,M3.2.0/2,M11.1.0/2", 1735689600))); + +INSTANTIATE_TEST_SUITE_P(AngleBracket, LibcVerificationTest, + ::testing::Values(std::make_tuple("<+07>-7", 1704067200), + std::make_tuple("<+07>-7", 1720000000))); + +INSTANTIATE_TEST_SUITE_P(India, LibcVerificationTest, + ::testing::Values(std::make_tuple("IST-5:30", 1704067200), + std::make_tuple("IST-5:30", 1720000000))); + +INSTANTIATE_TEST_SUITE_P(NewZealand, LibcVerificationTest, + ::testing::Values(std::make_tuple("NZST-12NZDT,M9.5.0,M4.1.0/3", 1704067200), + std::make_tuple("NZST-12NZDT,M9.5.0,M4.1.0/3", 1720000000))); + +INSTANTIATE_TEST_SUITE_P(USCentral, LibcVerificationTest, + ::testing::Values(std::make_tuple("CST6CDT,M3.2.0/2,M11.1.0/2", 1704067200), + std::make_tuple("CST6CDT,M3.2.0/2,M11.1.0/2", 1720000000), + std::make_tuple("CST6CDT,M3.2.0/2,M11.1.0/2", 1735689600))); + +INSTANTIATE_TEST_SUITE_P(EuropeBerlin, LibcVerificationTest, + ::testing::Values(std::make_tuple("CET-1CEST,M3.5.0,M10.5.0/3", 1704067200), + std::make_tuple("CET-1CEST,M3.5.0,M10.5.0/3", 1720000000), + std::make_tuple("CET-1CEST,M3.5.0,M10.5.0/3", 1735689600))); + +INSTANTIATE_TEST_SUITE_P(AustraliaSydney, LibcVerificationTest, + ::testing::Values(std::make_tuple("AEST-10AEDT,M10.1.0,M4.1.0/3", 1704067200), + std::make_tuple("AEST-10AEDT,M10.1.0,M4.1.0/3", 1720000000), + std::make_tuple("AEST-10AEDT,M10.1.0,M4.1.0/3", 1735689600))); + +// ============================================================================ +// DST boundary edge cases +// ============================================================================ + +TEST(PosixTzParser, DstBoundaryJustBeforeSpringForward) { + // Test 1 second before DST starts + ParsedTimezone tz; + parse_posix_tz("EST5EDT,M3.2.0/2,M11.1.0/2", tz); + + // March 8, 2026 06:59:59 UTC = 01:59:59 EST (1 second before spring forward) + time_t before_epoch = make_utc(2026, 3, 8, 6, 59, 59); + EXPECT_FALSE(is_in_dst(before_epoch, tz)); + + // March 8, 2026 07:00:00 UTC = 02:00:00 EST -> 03:00:00 EDT (DST started) + time_t after_epoch = make_utc(2026, 3, 8, 7); + EXPECT_TRUE(is_in_dst(after_epoch, tz)); +} + +TEST(PosixTzParser, DstBoundaryJustBeforeFallBack) { + // Test 1 second before DST ends + ParsedTimezone tz; + parse_posix_tz("EST5EDT,M3.2.0/2,M11.1.0/2", tz); + + // November 1, 2026 05:59:59 UTC = 01:59:59 EDT (1 second before fall back) + time_t before_epoch = make_utc(2026, 11, 1, 5, 59, 59); + EXPECT_TRUE(is_in_dst(before_epoch, tz)); + + // November 1, 2026 06:00:00 UTC = 02:00:00 EDT -> 01:00:00 EST (DST ended) + time_t after_epoch = make_utc(2026, 11, 1, 6); + EXPECT_FALSE(is_in_dst(after_epoch, tz)); +} + +} // namespace esphome::time::testing + +// ============================================================================ +// ESPTime::strptime tests (replaces sscanf-based parsing) +// ============================================================================ + +namespace esphome::testing { + +TEST(ESPTimeStrptime, FullDateTime) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("2026-03-15 14:30:45", 19, t)); + EXPECT_EQ(t.year, 2026); + EXPECT_EQ(t.month, 3); + EXPECT_EQ(t.day_of_month, 15); + EXPECT_EQ(t.hour, 14); + EXPECT_EQ(t.minute, 30); + EXPECT_EQ(t.second, 45); +} + +TEST(ESPTimeStrptime, DateTimeNoSeconds) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("2026-03-15 14:30", 16, t)); + EXPECT_EQ(t.year, 2026); + EXPECT_EQ(t.month, 3); + EXPECT_EQ(t.day_of_month, 15); + EXPECT_EQ(t.hour, 14); + EXPECT_EQ(t.minute, 30); + EXPECT_EQ(t.second, 0); +} + +TEST(ESPTimeStrptime, DateOnly) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("2026-03-15", 10, t)); + EXPECT_EQ(t.year, 2026); + EXPECT_EQ(t.month, 3); + EXPECT_EQ(t.day_of_month, 15); +} + +TEST(ESPTimeStrptime, TimeWithSeconds) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("14:30:45", 8, t)); + EXPECT_EQ(t.hour, 14); + EXPECT_EQ(t.minute, 30); + EXPECT_EQ(t.second, 45); +} + +TEST(ESPTimeStrptime, TimeNoSeconds) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("14:30", 5, t)); + EXPECT_EQ(t.hour, 14); + EXPECT_EQ(t.minute, 30); + EXPECT_EQ(t.second, 0); +} + +TEST(ESPTimeStrptime, Midnight) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("00:00:00", 8, t)); + EXPECT_EQ(t.hour, 0); + EXPECT_EQ(t.minute, 0); + EXPECT_EQ(t.second, 0); +} + +TEST(ESPTimeStrptime, EndOfDay) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("23:59:59", 8, t)); + EXPECT_EQ(t.hour, 23); + EXPECT_EQ(t.minute, 59); + EXPECT_EQ(t.second, 59); +} + +TEST(ESPTimeStrptime, LeapYearDate) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("2024-02-29", 10, t)); + EXPECT_EQ(t.year, 2024); + EXPECT_EQ(t.month, 2); + EXPECT_EQ(t.day_of_month, 29); +} + +TEST(ESPTimeStrptime, NewYearsEve) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("2026-12-31 23:59:59", 19, t)); + EXPECT_EQ(t.year, 2026); + EXPECT_EQ(t.month, 12); + EXPECT_EQ(t.day_of_month, 31); + EXPECT_EQ(t.hour, 23); + EXPECT_EQ(t.minute, 59); + EXPECT_EQ(t.second, 59); +} + +TEST(ESPTimeStrptime, EmptyStringFails) { + ESPTime t{}; + EXPECT_FALSE(ESPTime::strptime("", 0, t)); +} + +TEST(ESPTimeStrptime, NullInputFails) { + ESPTime t{}; + EXPECT_FALSE(ESPTime::strptime(nullptr, 0, t)); +} + +TEST(ESPTimeStrptime, InvalidFormatFails) { + ESPTime t{}; + EXPECT_FALSE(ESPTime::strptime("not-a-date", 10, t)); +} + +TEST(ESPTimeStrptime, PartialDateFails) { + ESPTime t{}; + EXPECT_FALSE(ESPTime::strptime("2026-03", 7, t)); +} + +TEST(ESPTimeStrptime, PartialTimeFails) { + ESPTime t{}; + EXPECT_FALSE(ESPTime::strptime("14:", 3, t)); +} + +TEST(ESPTimeStrptime, ExtraCharactersFails) { + ESPTime t{}; + // Full datetime with extra characters should fail + EXPECT_FALSE(ESPTime::strptime("2026-03-15 14:30:45x", 20, t)); +} + +TEST(ESPTimeStrptime, WrongSeparatorFails) { + ESPTime t{}; + EXPECT_FALSE(ESPTime::strptime("2026/03/15", 10, t)); +} + +TEST(ESPTimeStrptime, LeadingZeroTime) { + ESPTime t{}; + ASSERT_TRUE(ESPTime::strptime("01:05:09", 8, t)); + EXPECT_EQ(t.hour, 1); + EXPECT_EQ(t.minute, 5); + EXPECT_EQ(t.second, 9); +} + +// ============================================================================ +// recalc_timestamp_local() tests - verify behavior matches libc mktime() +// ============================================================================ + +// Helper to call libc mktime with same fields +static time_t libc_mktime(int year, int month, int day, int hour, int min, int sec) { + struct tm tm {}; + tm.tm_year = year - 1900; + tm.tm_mon = month - 1; + tm.tm_mday = day; + tm.tm_hour = hour; + tm.tm_min = min; + tm.tm_sec = sec; + tm.tm_isdst = -1; // Let libc determine DST + return mktime(&tm); +} + +// Helper to create ESPTime and call recalc_timestamp_local +static time_t esptime_recalc_local(int year, int month, int day, int hour, int min, int sec) { + ESPTime t{}; + t.year = year; + t.month = month; + t.day_of_month = day; + t.hour = hour; + t.minute = min; + t.second = sec; + t.day_of_week = 1; // Placeholder for fields_in_range() + t.day_of_year = 1; + t.recalc_timestamp_local(); + return t.timestamp; +} + +TEST(RecalcTimestampLocal, NormalTimeMatchesLibc) { + // Set timezone to US Central (CST6CDT) + const char *tz_str = "CST6CDT,M3.2.0,M11.1.0"; + setenv("TZ", tz_str, 1); + tzset(); + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + // Test a normal time in winter (no DST) + // January 15, 2026 at 10:30:00 CST + time_t libc_result = libc_mktime(2026, 1, 15, 10, 30, 0); + time_t esp_result = esptime_recalc_local(2026, 1, 15, 10, 30, 0); + EXPECT_EQ(esp_result, libc_result); + + // Test a normal time in summer (DST active) + // July 15, 2026 at 10:30:00 CDT + libc_result = libc_mktime(2026, 7, 15, 10, 30, 0); + esp_result = esptime_recalc_local(2026, 7, 15, 10, 30, 0); + EXPECT_EQ(esp_result, libc_result); +} + +TEST(RecalcTimestampLocal, SpringForwardSkippedHour) { + // Set timezone to US Central (CST6CDT) + // DST starts March 8, 2026 at 2:00 AM -> clocks jump to 3:00 AM + const char *tz_str = "CST6CDT,M3.2.0,M11.1.0"; + setenv("TZ", tz_str, 1); + tzset(); + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + // Test time before the transition (1:30 AM CST exists) + time_t libc_result = libc_mktime(2026, 3, 8, 1, 30, 0); + time_t esp_result = esptime_recalc_local(2026, 3, 8, 1, 30, 0); + EXPECT_EQ(esp_result, libc_result); + + // Test time after the transition (3:30 AM CDT exists) + libc_result = libc_mktime(2026, 3, 8, 3, 30, 0); + esp_result = esptime_recalc_local(2026, 3, 8, 3, 30, 0); + EXPECT_EQ(esp_result, libc_result); + + // Test the skipped hour (2:30 AM doesn't exist - gets normalized) + // Both implementations should produce the same result + libc_result = libc_mktime(2026, 3, 8, 2, 30, 0); + esp_result = esptime_recalc_local(2026, 3, 8, 2, 30, 0); + EXPECT_EQ(esp_result, libc_result); +} + +TEST(RecalcTimestampLocal, FallBackRepeatedHour) { + // Set timezone to US Central (CST6CDT) + // DST ends November 1, 2026 at 2:00 AM -> clocks fall back to 1:00 AM + const char *tz_str = "CST6CDT,M3.2.0,M11.1.0"; + setenv("TZ", tz_str, 1); + tzset(); + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + // Test time before the transition (midnight CDT) + time_t libc_result = libc_mktime(2026, 11, 1, 0, 30, 0); + time_t esp_result = esptime_recalc_local(2026, 11, 1, 0, 30, 0); + EXPECT_EQ(esp_result, libc_result); + + // Test time well after the transition (3:00 AM CST) + libc_result = libc_mktime(2026, 11, 1, 3, 0, 0); + esp_result = esptime_recalc_local(2026, 11, 1, 3, 0, 0); + EXPECT_EQ(esp_result, libc_result); + + // Test the repeated hour (1:30 AM occurs twice) + // libc behavior varies by platform for this edge case, so we verify our + // consistent behavior: prefer standard time (later UTC timestamp) + esp_result = esptime_recalc_local(2026, 11, 1, 1, 30, 0); + time_t std_interpretation = esptime_recalc_local(2026, 11, 1, 2, 30, 0) - 3600; // 2:30 CST - 1 hour + EXPECT_EQ(esp_result, std_interpretation); +} + +TEST(RecalcTimestampLocal, SouthernHemisphereDST) { + // Set timezone to Australia/Sydney (AEST-10AEDT,M10.1.0,M4.1.0) + // DST starts first Sunday of October, ends first Sunday of April + const char *tz_str = "AEST-10AEDT,M10.1.0,M4.1.0"; + setenv("TZ", tz_str, 1); + tzset(); + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + // Test winter time (July - no DST in southern hemisphere) + time_t libc_result = libc_mktime(2026, 7, 15, 10, 30, 0); + time_t esp_result = esptime_recalc_local(2026, 7, 15, 10, 30, 0); + EXPECT_EQ(esp_result, libc_result); + + // Test summer time (January - DST active in southern hemisphere) + libc_result = libc_mktime(2026, 1, 15, 10, 30, 0); + esp_result = esptime_recalc_local(2026, 1, 15, 10, 30, 0); + EXPECT_EQ(esp_result, libc_result); +} + +TEST(RecalcTimestampLocal, ExactTransitionBoundary) { + // Test exact boundary of spring forward transition + // Mar 8, 2026 at 2:00 AM CST -> 3:00 AM CDT (clocks skip forward) + const char *tz_str = "CST6CDT,M3.2.0,M11.1.0"; + setenv("TZ", tz_str, 1); + tzset(); + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + // 1:59:59 AM CST - last second before transition (still standard time) + time_t libc_result = libc_mktime(2026, 3, 8, 1, 59, 59); + time_t esp_result = esptime_recalc_local(2026, 3, 8, 1, 59, 59); + EXPECT_EQ(esp_result, libc_result); + + // 3:00:00 AM CDT - first second after transition (now DST) + libc_result = libc_mktime(2026, 3, 8, 3, 0, 0); + esp_result = esptime_recalc_local(2026, 3, 8, 3, 0, 0); + EXPECT_EQ(esp_result, libc_result); + + // Verify the gap: 3:00 AM CDT should be exactly 1 second after 1:59:59 AM CST + time_t before_transition = esptime_recalc_local(2026, 3, 8, 1, 59, 59); + time_t after_transition = esptime_recalc_local(2026, 3, 8, 3, 0, 0); + EXPECT_EQ(after_transition - before_transition, 1); +} + +TEST(RecalcTimestampLocal, NonDefaultTransitionTime) { + // Test DST transition at 3:00 AM instead of default 2:00 AM + // Using custom transition time: CST6CDT,M3.2.0/3,M11.1.0/3 + const char *tz_str = "CST6CDT,M3.2.0/3,M11.1.0/3"; + setenv("TZ", tz_str, 1); + tzset(); + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + // 2:30 AM should still be standard time (transition at 3:00 AM) + time_t libc_result = libc_mktime(2026, 3, 8, 2, 30, 0); + time_t esp_result = esptime_recalc_local(2026, 3, 8, 2, 30, 0); + EXPECT_EQ(esp_result, libc_result); + + // 4:00 AM should be DST (after 3:00 AM transition) + libc_result = libc_mktime(2026, 3, 8, 4, 0, 0); + esp_result = esptime_recalc_local(2026, 3, 8, 4, 0, 0); + EXPECT_EQ(esp_result, libc_result); +} + +TEST(RecalcTimestampLocal, YearBoundaryDST) { + // Test southern hemisphere DST across year boundary + // Australia/Sydney: DST active from October to April (spans Jan 1) + const char *tz_str = "AEST-10AEDT,M10.1.0,M4.1.0"; + setenv("TZ", tz_str, 1); + tzset(); + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + // Dec 31, 2025 at 23:30 - DST should be active + time_t libc_result = libc_mktime(2025, 12, 31, 23, 30, 0); + time_t esp_result = esptime_recalc_local(2025, 12, 31, 23, 30, 0); + EXPECT_EQ(esp_result, libc_result); + + // Jan 1, 2026 at 00:30 - DST should still be active + libc_result = libc_mktime(2026, 1, 1, 0, 30, 0); + esp_result = esptime_recalc_local(2026, 1, 1, 0, 30, 0); + EXPECT_EQ(esp_result, libc_result); + + // Verify both are in DST (11 hour offset from UTC, not 10) + // The timestamps should be 1 hour apart + time_t dec31 = esptime_recalc_local(2025, 12, 31, 23, 30, 0); + time_t jan1 = esptime_recalc_local(2026, 1, 1, 0, 30, 0); + EXPECT_EQ(jan1 - dec31, 3600); // 1 hour difference +} + +// ============================================================================ +// ESPTime::timezone_offset() tests +// ============================================================================ + +TEST(TimezoneOffset, NoTimezone) { + // When no timezone is set, offset should be 0 + time::ParsedTimezone tz{}; + set_global_tz(tz); + + int32_t offset = ESPTime::timezone_offset(); + EXPECT_EQ(offset, 0); +} + +TEST(TimezoneOffset, FixedOffsetPositive) { + // India: UTC+5:30 (no DST) + const char *tz_str = "IST-5:30"; + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + int32_t offset = ESPTime::timezone_offset(); + // Offset should be +5:30 = 19800 seconds (to add to UTC to get local) + EXPECT_EQ(offset, 5 * 3600 + 30 * 60); +} + +TEST(TimezoneOffset, FixedOffsetNegative) { + // US Eastern Standard Time: UTC-5 (testing without DST rules) + const char *tz_str = "EST5"; + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + int32_t offset = ESPTime::timezone_offset(); + // Offset should be -5 hours = -18000 seconds + EXPECT_EQ(offset, -5 * 3600); +} + +TEST(TimezoneOffset, WithDstReturnsCorrectOffsetBasedOnCurrentTime) { + // US Eastern with DST + const char *tz_str = "EST5EDT,M3.2.0,M11.1.0"; + time::ParsedTimezone tz{}; + ASSERT_TRUE(parse_posix_tz(tz_str, tz)); + set_global_tz(tz); + + // Get current time and check offset matches expected based on DST status + time_t now = ::time(nullptr); + int32_t offset = ESPTime::timezone_offset(); + + // Verify offset matches what is_in_dst says + if (time::is_in_dst(now, tz)) { + // During DST, offset should be -4 hours (EDT) + EXPECT_EQ(offset, -4 * 3600); + } else { + // During standard time, offset should be -5 hours (EST) + EXPECT_EQ(offset, -5 * 3600); + } +} + +} // namespace esphome::testing From 50e7571f4c603f460a2dffa2b78eacc0a6dd5014 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 18:17:25 -0700 Subject: [PATCH 114/147] [web_server_idf] Prefer make_unique_for_overwrite for noninit recv buffer (#14279) --- esphome/components/web_server_idf/web_server_idf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/web_server_idf/web_server_idf.cpp b/esphome/components/web_server_idf/web_server_idf.cpp index 4034a22586..f18570965b 100644 --- a/esphome/components/web_server_idf/web_server_idf.cpp +++ b/esphome/components/web_server_idf/web_server_idf.cpp @@ -921,7 +921,7 @@ esp_err_t AsyncWebServer::handle_multipart_upload_(httpd_req_t *r, const char *c }); // Use heap buffer - 1460 bytes is too large for the httpd task stack - auto buffer = std::make_unique(MULTIPART_CHUNK_SIZE); + auto buffer = std::make_unique_for_overwrite(MULTIPART_CHUNK_SIZE); size_t bytes_since_yield = 0; for (size_t remaining = r->content_len; remaining > 0;) { From 15846137a6c64bbbc44345f29ff17d40ac92f1bb Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 18:17:52 -0700 Subject: [PATCH 115/147] [rp2040] Update arduino-pico framework from 3.9.4 to 5.5.0 (#14328) --- .clang-tidy.hash | 2 +- esphome/components/rp2040/__init__.py | 8 +-- esphome/components/rp2040/gpio.cpp | 2 +- .../components/uart/uart_component_rp2040.cpp | 4 +- .../components/wifi/wifi_component_pico_w.cpp | 53 +++++++++++++------ platformio.ini | 4 +- 6 files changed, 46 insertions(+), 27 deletions(-) diff --git a/.clang-tidy.hash b/.clang-tidy.hash index 777c846371..767da3f33e 100644 --- a/.clang-tidy.hash +++ b/.clang-tidy.hash @@ -1 +1 @@ -5eb1e5852765114ad06533220d3160b6c23f5ccefc4de41828699de5dfff5ad6 +b97e16a84153b2a4cfc51137cd6121db3c32374504b2bea55144413b3e573052 diff --git a/esphome/components/rp2040/__init__.py b/esphome/components/rp2040/__init__.py index 3a1ea16fa3..23f12e651f 100644 --- a/esphome/components/rp2040/__init__.py +++ b/esphome/components/rp2040/__init__.py @@ -91,18 +91,18 @@ def _parse_platform_version(value): # The default/recommended arduino framework version # - https://github.com/earlephilhower/arduino-pico/releases # - https://api.registry.platformio.org/v3/packages/earlephilhower/tool/framework-arduinopico -RECOMMENDED_ARDUINO_FRAMEWORK_VERSION = cv.Version(3, 9, 4) +RECOMMENDED_ARDUINO_FRAMEWORK_VERSION = cv.Version(5, 5, 0) # The raspberrypi platform version to use for arduino frameworks # - https://github.com/maxgerhardt/platform-raspberrypi/tags -RECOMMENDED_ARDUINO_PLATFORM_VERSION = "v1.2.0-gcc12" +RECOMMENDED_ARDUINO_PLATFORM_VERSION = "v1.4.0-gcc14-arduinopico460" def _arduino_check_versions(value): value = value.copy() lookups = { - "dev": (cv.Version(3, 9, 4), "https://github.com/earlephilhower/arduino-pico"), - "latest": (cv.Version(3, 9, 4), None), + "dev": (cv.Version(5, 5, 0), "https://github.com/earlephilhower/arduino-pico"), + "latest": (cv.Version(5, 5, 0), None), "recommended": (RECOMMENDED_ARDUINO_FRAMEWORK_VERSION, None), } diff --git a/esphome/components/rp2040/gpio.cpp b/esphome/components/rp2040/gpio.cpp index 2b1699f888..4b3c98104c 100644 --- a/esphome/components/rp2040/gpio.cpp +++ b/esphome/components/rp2040/gpio.cpp @@ -106,7 +106,7 @@ void IRAM_ATTR ISRInternalGPIOPin::pin_mode(gpio::Flags flags) { sio_hw->gpio_oe_set = arg->mask; } else if (flags & gpio::FLAG_INPUT) { sio_hw->gpio_oe_clr = arg->mask; - hw_write_masked(&padsbank0_hw->io[arg->pin], + hw_write_masked(&pads_bank0_hw->io[arg->pin], (bool_to_bit(flags & gpio::FLAG_PULLUP) << PADS_BANK0_GPIO0_PUE_LSB) | (bool_to_bit(flags & gpio::FLAG_PULLDOWN) << PADS_BANK0_GPIO0_PDE_LSB), PADS_BANK0_GPIO0_PUE_BITS | PADS_BANK0_GPIO0_PDE_BITS); diff --git a/esphome/components/uart/uart_component_rp2040.cpp b/esphome/components/uart/uart_component_rp2040.cpp index 0c6834055c..faf8f4d90f 100644 --- a/esphome/components/uart/uart_component_rp2040.cpp +++ b/esphome/components/uart/uart_component_rp2040.cpp @@ -115,8 +115,8 @@ void RP2040UartComponent::setup() { if (tx_hw == -1 || rx_hw == -1 || tx_hw != rx_hw) { ESP_LOGV(TAG, "Using SerialPIO"); - pin_size_t tx = this->tx_pin_ == nullptr ? SerialPIO::NOPIN : this->tx_pin_->get_pin(); - pin_size_t rx = this->rx_pin_ == nullptr ? SerialPIO::NOPIN : this->rx_pin_->get_pin(); + pin_size_t tx = this->tx_pin_ == nullptr ? NOPIN : this->tx_pin_->get_pin(); + pin_size_t rx = this->rx_pin_ == nullptr ? NOPIN : this->rx_pin_->get_pin(); auto *serial = new SerialPIO(tx, rx, this->rx_buffer_size_); // NOLINT(cppcoreguidelines-owning-memory) serial->begin(this->baud_rate_, config); if (this->tx_pin_ != nullptr && this->tx_pin_->is_inverted()) diff --git a/esphome/components/wifi/wifi_component_pico_w.cpp b/esphome/components/wifi/wifi_component_pico_w.cpp index 1baf21e2b2..9b2c077dc5 100644 --- a/esphome/components/wifi/wifi_component_pico_w.cpp +++ b/esphome/components/wifi/wifi_component_pico_w.cpp @@ -78,8 +78,13 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) { return false; #endif - auto ret = WiFi.begin(ap.ssid_.c_str(), ap.password_.c_str()); - if (ret != WL_CONNECTED) + // Use beginNoBlock to avoid WiFi.begin()'s additional 2x timeout wait loop on top of + // CYW43::begin()'s internal blocking join. CYW43::begin() blocks for up to 10 seconds + // (default timeout) to complete the join - this is required because the LwipIntfDev netif + // setup depends on begin() succeeding. beginNoBlock() skips the outer wait loop, saving + // up to 20 additional seconds of blocking per attempt. + auto ret = WiFi.beginNoBlock(ap.ssid_.c_str(), ap.password_.c_str()); + if (ret == WL_IDLE_STATUS) return false; return true; @@ -116,13 +121,19 @@ const char *get_disconnect_reason_str(uint8_t reason) { } WiFiSTAConnectStatus WiFiComponent::wifi_sta_connect_status_() { - int status = cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA); + // Use cyw43_wifi_link_status instead of cyw43_tcpip_link_status because the Arduino + // framework's __wrap_cyw43_cb_tcpip_init is a no-op — the SDK's internal netif + // (cyw43_state.netif[]) is never initialized. cyw43_tcpip_link_status checks that netif's + // flags and would only fall through to cyw43_wifi_link_status when the flags aren't set. + // Using cyw43_wifi_link_status directly gives us the actual WiFi radio join state. + int status = cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA); switch (status) { case CYW43_LINK_JOIN: - case CYW43_LINK_NOIP: + // WiFi joined, check if we have an IP address via the Arduino framework's WiFi class + if (WiFi.status() == WL_CONNECTED) { + return WiFiSTAConnectStatus::CONNECTED; + } return WiFiSTAConnectStatus::CONNECTING; - case CYW43_LINK_UP: - return WiFiSTAConnectStatus::CONNECTED; case CYW43_LINK_FAIL: case CYW43_LINK_BADAUTH: return WiFiSTAConnectStatus::ERROR_CONNECT_FAILED; @@ -139,18 +150,24 @@ int WiFiComponent::s_wifi_scan_result(void *env, const cyw43_ev_scan_result_t *r void WiFiComponent::wifi_scan_result(void *env, const cyw43_ev_scan_result_t *result) { s_scan_result_count++; - const char *ssid_cstr = reinterpret_cast(result->ssid); + + // CYW43 scan results have ssid as a 32-byte buffer that is NOT null-terminated. + // Use ssid_len to create a properly terminated copy for string operations. + uint8_t len = std::min(result->ssid_len, static_cast(sizeof(result->ssid))); + char ssid_buf[33]; // 32 max + null terminator + memcpy(ssid_buf, result->ssid, len); + ssid_buf[len] = '\0'; // Skip networks that don't match any configured network (unless full results needed) - if (!this->needs_full_scan_results_() && !this->matches_configured_network_(ssid_cstr, result->bssid)) { - this->log_discarded_scan_result_(ssid_cstr, result->bssid, result->rssi, result->channel); + if (!this->needs_full_scan_results_() && !this->matches_configured_network_(ssid_buf, result->bssid)) { + this->log_discarded_scan_result_(ssid_buf, result->bssid, result->rssi, result->channel); return; } bssid_t bssid; std::copy(result->bssid, result->bssid + 6, bssid.begin()); - WiFiScanResult res(bssid, ssid_cstr, strlen(ssid_cstr), result->channel, result->rssi, - result->auth_mode != CYW43_AUTH_OPEN, ssid_cstr[0] == '\0'); + WiFiScanResult res(bssid, ssid_buf, len, result->channel, result->rssi, result->auth_mode != CYW43_AUTH_OPEN, + len == 0); if (std::find(this->scan_result_.begin(), this->scan_result_.end(), res) == this->scan_result_.end()) { this->scan_result_.push_back(res); } @@ -167,7 +184,6 @@ bool WiFiComponent::wifi_scan_start_(bool passive) { ESP_LOGV(TAG, "cyw43_wifi_scan failed"); } return err == 0; - return true; } #ifdef USE_WIFI_AP @@ -212,8 +228,10 @@ network::IPAddress WiFiComponent::wifi_soft_ap_ip() { return {(const ip_addr_t * #endif // USE_WIFI_AP bool WiFiComponent::wifi_disconnect_() { - int err = cyw43_wifi_leave(&cyw43_state, CYW43_ITF_STA); - return err == 0; + // Use Arduino WiFi.disconnect() instead of raw cyw43_wifi_leave() to properly + // clean up the lwIP netif, DHCP client, and internal Arduino state. + WiFi.disconnect(); + return true; } bssid_t WiFiComponent::wifi_bssid() { @@ -269,9 +287,10 @@ void WiFiComponent::wifi_loop_() { // Poll for connection state changes // The arduino-pico WiFi library doesn't have event callbacks like ESP8266/ESP32, - // so we need to poll the link status to detect state changes - auto status = cyw43_tcpip_link_status(&cyw43_state, CYW43_ITF_STA); - bool is_connected = (status == CYW43_LINK_UP); + // so we need to poll the link status to detect state changes. + // Use WiFi.connected() which checks both the WiFi link and IP address via the + // Arduino framework's own netif (not the SDK's uninitialized one). + bool is_connected = WiFi.connected(); // Detect connection state change if (is_connected && !s_sta_was_connected) { diff --git a/platformio.ini b/platformio.ini index e35dce2228..16a1b18211 100644 --- a/platformio.ini +++ b/platformio.ini @@ -193,10 +193,10 @@ extra_scripts = post:esphome/components/esp32/post_build.py.script extends = common:arduino board_build.filesystem_size = 0.5m -platform = https://github.com/maxgerhardt/platform-raspberrypi.git#v1.2.0-gcc12 +platform = https://github.com/maxgerhardt/platform-raspberrypi.git#v1.4.0-gcc14-arduinopico460 platform_packages = ; earlephilhower/framework-arduinopico@~1.20602.0 ; Cannot use the platformio package until old releases stop getting deleted - earlephilhower/framework-arduinopico@https://github.com/earlephilhower/arduino-pico/releases/download/3.9.4/rp2040-3.9.4.zip + earlephilhower/framework-arduinopico@https://github.com/earlephilhower/arduino-pico/releases/download/5.5.0/rp2040-5.5.0.zip framework = arduino lib_deps = From 04db37a34ac43d0a9c5fb8c807b56ed58a551bce Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 26 Feb 2026 20:38:38 -0700 Subject: [PATCH 116/147] [esp8266] Remove forced scanf linkage to save ~8KB flash (#13678) Co-authored-by: Claude Opus 4.6 --- esphome/components/esp8266/__init__.py | 6 +++ .../esp8266/remove_float_scanf.py.script | 46 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 esphome/components/esp8266/remove_float_scanf.py.script diff --git a/esphome/components/esp8266/__init__.py b/esphome/components/esp8266/__init__.py index c7b5d5c130..927a59fd61 100644 --- a/esphome/components/esp8266/__init__.py +++ b/esphome/components/esp8266/__init__.py @@ -205,6 +205,7 @@ async def to_code(config): "pre:testing_mode.py", "pre:exclude_updater.py", "pre:exclude_waveform.py", + "pre:remove_float_scanf.py", "post:post_build.py", ], ) @@ -342,3 +343,8 @@ def copy_files() -> None: exclude_waveform_file, CORE.relative_build_path("exclude_waveform.py"), ) + remove_float_scanf_file = dir / "remove_float_scanf.py.script" + copy_file_if_changed( + remove_float_scanf_file, + CORE.relative_build_path("remove_float_scanf.py"), + ) diff --git a/esphome/components/esp8266/remove_float_scanf.py.script b/esphome/components/esp8266/remove_float_scanf.py.script new file mode 100644 index 0000000000..b1d03a4d46 --- /dev/null +++ b/esphome/components/esp8266/remove_float_scanf.py.script @@ -0,0 +1,46 @@ +# pylint: disable=E0602 +Import("env") # noqa + +# Remove forced scanf linkage to allow garbage collection of unused code +# +# The ESP8266 Arduino framework unconditionally adds: +# -u _printf_float -u _scanf_float +# +# The -u flag forces symbols to be linked even if unreferenced, which pulls +# in the entire scanf family (~7-8KB). ESPHome doesn't use scanf at all +# (verified by CI check in PR #13657), so this is pure dead weight. +# +# By removing -u _scanf_float, --gc-sections can eliminate: +# - scanf family functions (~7KB) +# - _strtod_l (~3.7KB) +# - Related parsing infrastructure +# +# We keep -u _printf_float because components still use %f in logging. + + +def remove_scanf_float_flag(source, target, env): + """Remove -u _scanf_float from linker flags. + + This is called as a pre-action before the link step, after the + Arduino framework has added its default flags. + """ + linkflags = env.get("LINKFLAGS", []) + new_linkflags = [] + i = 0 + + while i < len(linkflags): + flag = linkflags[i] + if flag == "-u" and i + 1 < len(linkflags): + next_flag = linkflags[i + 1] + if next_flag == "_scanf_float": + print("ESPHome: Removing _scanf_float (saves ~8KB flash)") + i += 2 # Skip both -u and the symbol + continue + new_linkflags.append(flag) + i += 1 + + env.Replace(LINKFLAGS=new_linkflags) + + +# Register the callback to run before the link step +env.AddPreAction("$BUILD_DIR/${PROGNAME}.elf", remove_scanf_float_flag) From 656389f2158b0723630839c385aa26648c6f53b1 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Thu, 26 Feb 2026 23:41:35 -0600 Subject: [PATCH 117/147] [usb_uart] Performance, correctness and reliability improvements (#14333) --- .../components/usb_host/usb_host_client.cpp | 19 +- esphome/components/usb_uart/ch34x.cpp | 9 +- esphome/components/usb_uart/cp210x.cpp | 9 +- esphome/components/usb_uart/usb_uart.cpp | 205 ++++++++++++++---- esphome/components/usb_uart/usb_uart.h | 45 +++- 5 files changed, 224 insertions(+), 63 deletions(-) diff --git a/esphome/components/usb_host/usb_host_client.cpp b/esphome/components/usb_host/usb_host_client.cpp index 5b0aed4c59..c77d738ace 100644 --- a/esphome/components/usb_host/usb_host_client.cpp +++ b/esphome/components/usb_host/usb_host_client.cpp @@ -424,9 +424,9 @@ bool USBClient::control_transfer(uint8_t type, uint8_t request, uint16_t value, if (trq == nullptr) return false; auto length = data.size(); - if (length > sizeof(trq->transfer->data_buffer_size) - SETUP_PACKET_SIZE) { + if (length > trq->transfer->data_buffer_size - SETUP_PACKET_SIZE) { ESP_LOGE(TAG, "Control transfer data size too large: %u > %u", length, - sizeof(trq->transfer->data_buffer_size) - sizeof(usb_setup_packet_t)); + trq->transfer->data_buffer_size - SETUP_PACKET_SIZE); this->release_trq(trq); return false; } @@ -507,9 +507,13 @@ bool USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, u /** * Performs an output transfer operation. - * THREAD CONTEXT: Called from main loop thread only - * - USB UART output uses defer() to ensure main loop context - * - Modbus and other components call from loop() + * THREAD CONTEXT: Called from both USB task and main loop threads. + * - USB task: output transfer callback restarts output directly (no defer) + * - Main loop: initial output trigger from write_array() and loop() + * Thread safety is ensured by: + * - get_trq_() uses atomic CAS (multi-consumer safe) + * - claimed trq slot is exclusively owned until submission + * - usb_host_transfer_submit() is safe to call from any task context * * @param ep_address The endpoint address. * @param callback The callback function to be called when the transfer is complete. @@ -524,6 +528,11 @@ bool USBClient::transfer_out(uint8_t ep_address, const transfer_cb_t &callback, ESP_LOGE(TAG, "Too many requests queued"); return false; } + if (length > trq->transfer->data_buffer_size) { + ESP_LOGE(TAG, "transfer_out: data length %u exceeds buffer size %u", length, trq->transfer->data_buffer_size); + this->release_trq(trq); + return false; + } trq->callback = callback; trq->transfer->callback = transfer_callback; trq->transfer->bEndpointAddress = ep_address | USB_DIR_OUT; diff --git a/esphome/components/usb_uart/ch34x.cpp b/esphome/components/usb_uart/ch34x.cpp index caa4b65657..7fa964c0cb 100644 --- a/esphome/components/usb_uart/ch34x.cpp +++ b/esphome/components/usb_uart/ch34x.cpp @@ -5,8 +5,7 @@ #include "esphome/components/bytebuffer/bytebuffer.h" -namespace esphome { -namespace usb_uart { +namespace esphome::usb_uart { using namespace bytebuffer; /** @@ -74,8 +73,8 @@ void USBUartTypeCH34X::enable_channels() { this->control_transfer(USB_VENDOR_DEV | usb_host::USB_DIR_OUT, cmd, value, (factor << 8) | divisor, callback); this->control_transfer(USB_VENDOR_DEV | usb_host::USB_DIR_OUT, cmd + 3, 0x80, 0, callback); } - USBUartTypeCdcAcm::enable_channels(); + this->start_channels(); } -} // namespace usb_uart -} // namespace esphome +} // namespace esphome::usb_uart + #endif // USE_ESP32_VARIANT_ESP32P4 || USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 diff --git a/esphome/components/usb_uart/cp210x.cpp b/esphome/components/usb_uart/cp210x.cpp index fa8c2331b2..ae9170c5fb 100644 --- a/esphome/components/usb_uart/cp210x.cpp +++ b/esphome/components/usb_uart/cp210x.cpp @@ -5,8 +5,7 @@ #include "esphome/components/bytebuffer/bytebuffer.h" -namespace esphome { -namespace usb_uart { +namespace esphome::usb_uart { using namespace bytebuffer; /** @@ -119,8 +118,8 @@ void USBUartTypeCP210X::enable_channels() { this->control_transfer(USB_VENDOR_IFC | usb_host::USB_DIR_OUT, SET_BAUDRATE, 0, channel->index_, callback, baud.get_data()); } - USBUartTypeCdcAcm::enable_channels(); + this->start_channels(); } -} // namespace usb_uart -} // namespace esphome +} // namespace esphome::usb_uart + #endif // USE_ESP32_VARIANT_ESP32P4 || USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 diff --git a/esphome/components/usb_uart/usb_uart.cpp b/esphome/components/usb_uart/usb_uart.cpp index 5c2806c456..de81bfc587 100644 --- a/esphome/components/usb_uart/usb_uart.cpp +++ b/esphome/components/usb_uart/usb_uart.cpp @@ -3,12 +3,10 @@ #include "usb_uart.h" #include "esphome/core/log.h" #include "esphome/core/application.h" -#include "esphome/components/uart/uart_debugger.h" #include -namespace esphome { -namespace usb_uart { +namespace esphome::usb_uart { /** * @@ -135,16 +133,51 @@ void USBUartChannel::write_array(const uint8_t *data, size_t len) { ESP_LOGV(TAG, "Channel not initialised - write ignored"); return; } - while (this->output_buffer_.get_free_space() != 0 && len-- != 0) { - this->output_buffer_.push(*data++); +#ifdef USE_UART_DEBUGGER + if (this->debug_) { + constexpr size_t BATCH = 16; + char buf[4 + format_hex_pretty_size(BATCH)]; // ">>> " + "XX,XX,...,XX\0" + for (size_t off = 0; off < len; off += BATCH) { + size_t n = std::min(len - off, BATCH); + memcpy(buf, ">>> ", 4); + format_hex_pretty_to(buf + 4, sizeof(buf) - 4, data + off, n, ','); + ESP_LOGD(TAG, "%s", buf); + } } - len++; - if (len > 0) { - ESP_LOGE(TAG, "Buffer full - failed to write %d bytes", len); +#endif + while (len > 0) { + UsbOutputChunk *chunk = this->output_pool_.allocate(); + if (chunk == nullptr) { + ESP_LOGE(TAG, "Output pool full - lost %zu bytes", len); + break; + } + size_t chunk_len = std::min(len, UsbOutputChunk::MAX_CHUNK_SIZE); + memcpy(chunk->data, data, chunk_len); + chunk->length = static_cast(chunk_len); + if (!this->output_queue_.push(chunk)) { + this->output_pool_.release(chunk); + ESP_LOGE(TAG, "Output queue full - lost %zu bytes", len); + break; + } + data += chunk_len; + len -= chunk_len; } this->parent_->start_output(this); } +void USBUartChannel::flush() { + // Spin until the output queue is drained and the last USB transfer completes. + // Safe to call from the main loop only. + // The 100 ms timeout guards against a device that stops responding mid-flush; + // in that case the main loop is blocked for the full duration. + uint32_t deadline = millis() + 100; // 100 ms safety timeout + while ((!this->output_queue_.empty() || this->output_started_.load()) && millis() < deadline) { + // Kick start_output() in case data arrived but no transfer is in flight yet. + this->parent_->start_output(this); + yield(); + } +} + bool USBUartChannel::peek_byte(uint8_t *data) { if (this->input_buffer_.is_empty()) { return false; @@ -182,8 +215,10 @@ void USBUartComponent::loop() { #ifdef USE_UART_DEBUGGER if (channel->debug_) { - uart::UARTDebug::log_hex(uart::UART_DIRECTION_RX, std::vector(chunk->data, chunk->data + chunk->length), - ','); // NOLINT() + char buf[4 + format_hex_pretty_size(UsbDataChunk::MAX_CHUNK_SIZE)]; // "<<< " + hex + memcpy(buf, "<<< ", 4); + format_hex_pretty_to(buf + 4, sizeof(buf) - 4, chunk->data, chunk->length, ','); + ESP_LOGD(TAG, "%s", buf); } #endif @@ -192,6 +227,13 @@ void USBUartComponent::loop() { // Return chunk to pool for reuse this->chunk_pool_.release(chunk); + + // Invoke the RX callback (if registered) immediately after data lands in the + // ring buffer. This lets consumers such as ZigbeeProxy process incoming bytes + // in the same loop iteration they are delivered, avoiding an extra wakeup cycle. + if (channel->rx_callback_) { + channel->rx_callback_(); + } } // Log dropped USB data periodically @@ -234,10 +276,10 @@ void USBUartComponent::start_input(USBUartChannel *channel) { // The underlying transfer_in() uses lock-free atomic allocation from the // TransferRequest pool, making this multi-threaded access safe - // if already started, don't restart. A spurious failure in compare_exchange_weak - // is not a problem, as it will be retried on the next read_array() + // Use compare_exchange_strong to avoid spurious failures: a missed submit here is + // never retried by read_array() because no data will ever arrive to trigger it. auto started = false; - if (!channel->input_started_.compare_exchange_weak(started, true)) + if (!channel->input_started_.compare_exchange_strong(started, true)) return; const auto *ep = channel->cdc_dev_.in_ep; // CALLBACK CONTEXT: This lambda is executed in USB task via transfer_callback @@ -285,37 +327,56 @@ void USBUartComponent::start_input(USBUartChannel *channel) { this->start_input(channel); }; if (!this->transfer_in(ep->bEndpointAddress, callback, ep->wMaxPacketSize)) { + ESP_LOGE(TAG, "IN transfer submission failed for ep=0x%02X", ep->bEndpointAddress); channel->input_started_.store(false); } } void USBUartComponent::start_output(USBUartChannel *channel) { - // IMPORTANT: This function must only be called from the main loop! - // The output_buffer_ is not thread-safe and can only be accessed from main loop. - // USB callbacks use defer() to ensure this function runs in the correct context. - if (channel->output_started_.load()) - return; - if (channel->output_buffer_.is_empty()) { + // THREAD CONTEXT: Called from both main loop and USB task threads. + // The output_queue_ is a lock-free SPSC queue, so pop() is safe from either thread. + // The output_started_ atomic flag is claimed via compare_exchange to guarantee that + // only one thread starts a transfer at a time. + + // Atomically claim the "output in progress" flag. If already set, another thread + // is handling the transfer; return immediately. + bool expected = false; + if (!channel->output_started_.compare_exchange_strong(expected, true, std::memory_order_acq_rel)) { return; } + + UsbOutputChunk *chunk = channel->output_queue_.pop(); + if (chunk == nullptr) { + // Nothing to send — release the flag and return. + channel->output_started_.store(false, std::memory_order_release); + return; + } + const auto *ep = channel->cdc_dev_.out_ep; - // CALLBACK CONTEXT: This lambda is executed in USB task via transfer_callback - auto callback = [this, channel](const usb_host::TransferStatus &status) { - ESP_LOGV(TAG, "Output Transfer result: length: %u; status %X", status.data_len, status.error_code); - channel->output_started_.store(false); - // Defer restart to main loop (defer is thread-safe) - this->defer([this, channel] { this->start_output(channel); }); + // CALLBACK CONTEXT: This lambda is executed in the USB task via transfer_callback. + // It releases the chunk, clears the flag, and directly restarts output without + // going through defer() — eliminating one full main-loop-wakeup cycle of latency. + auto callback = [this, channel, chunk](const usb_host::TransferStatus &status) { + if (!status.success) { + ESP_LOGW(TAG, "Output transfer failed: status %X", status.error_code); + } else { + ESP_LOGV(TAG, "Output Transfer result: length: %u; status %X", status.data_len, status.error_code); + } + channel->output_pool_.release(chunk); + channel->output_started_.store(false, std::memory_order_release); + // Restart directly from USB task — safe because output_queue_ is lock-free + // and transfer_out() uses thread-safe atomic slot allocation. + this->start_output(channel); }; - channel->output_started_.store(true); - uint8_t data[ep->wMaxPacketSize]; - auto len = channel->output_buffer_.pop(data, ep->wMaxPacketSize); - this->transfer_out(ep->bEndpointAddress, callback, data, len); -#ifdef USE_UART_DEBUGGER - if (channel->debug_) { - uart::UARTDebug::log_hex(uart::UART_DIRECTION_TX, std::vector(data, data + len), ','); // NOLINT() + + const uint8_t len = chunk->length; + if (!this->transfer_out(ep->bEndpointAddress, callback, chunk->data, len)) { + // Transfer submission failed — return chunk and release flag so callers can retry. + channel->output_pool_.release(chunk); + channel->output_started_.store(false, std::memory_order_release); + return; } -#endif - ESP_LOGV(TAG, "Output %d bytes started", len); + ESP_LOGV(TAG, "Output %u bytes started", len); } /** @@ -351,6 +412,20 @@ void USBUartTypeCdcAcm::on_connected() { fix_mps(channel->cdc_dev_.in_ep); fix_mps(channel->cdc_dev_.out_ep); channel->initialised_.store(true); + // Claim the communication (interrupt) interface so CDC class requests are accepted + // by the device. Some CDC ACM implementations (e.g. EFR32 NCP) require this before + // they enable data flow on the bulk endpoints. + if (channel->cdc_dev_.interrupt_interface_number != channel->cdc_dev_.bulk_interface_number) { + auto err_comm = usb_host_interface_claim(this->handle_, this->device_handle_, + channel->cdc_dev_.interrupt_interface_number, 0); + if (err_comm != ESP_OK) { + ESP_LOGW(TAG, "Could not claim comm interface %d: %s", channel->cdc_dev_.interrupt_interface_number, + esp_err_to_name(err_comm)); + } else { + channel->cdc_dev_.comm_interface_claimed = true; + ESP_LOGD(TAG, "Claimed comm interface %d", channel->cdc_dev_.interrupt_interface_number); + } + } auto err = usb_host_interface_claim(this->handle_, this->device_handle_, channel->cdc_dev_.bulk_interface_number, 0); if (err != ESP_OK) { @@ -378,18 +453,74 @@ void USBUartTypeCdcAcm::on_disconnected() { usb_host_endpoint_halt(this->device_handle_, channel->cdc_dev_.notify_ep->bEndpointAddress); usb_host_endpoint_flush(this->device_handle_, channel->cdc_dev_.notify_ep->bEndpointAddress); } + if (channel->cdc_dev_.comm_interface_claimed) { + usb_host_interface_release(this->handle_, this->device_handle_, channel->cdc_dev_.interrupt_interface_number); + channel->cdc_dev_.comm_interface_claimed = false; + } usb_host_interface_release(this->handle_, this->device_handle_, channel->cdc_dev_.bulk_interface_number); // Reset the input and output started flags to their initial state to avoid the possibility of spurious restarts channel->input_started_.store(true); channel->output_started_.store(true); channel->input_buffer_.clear(); - channel->output_buffer_.clear(); + // Drain any pending output chunks and return them to the pool + { + UsbOutputChunk *chunk; + while ((chunk = channel->output_queue_.pop()) != nullptr) { + channel->output_pool_.release(chunk); + } + } channel->initialised_.store(false); } USBClient::on_disconnected(); } void USBUartTypeCdcAcm::enable_channels() { + static constexpr uint8_t CDC_REQUEST_TYPE = usb_host::USB_TYPE_CLASS | usb_host::USB_RECIP_INTERFACE; + static constexpr uint8_t CDC_SET_LINE_CODING = 0x20; + static constexpr uint8_t CDC_SET_CONTROL_LINE_STATE = 0x22; + static constexpr uint16_t CDC_DTR_RTS = 0x0003; // D0=DTR, D1=RTS + + for (auto *channel : this->channels_) { + if (!channel->initialised_.load()) + continue; + // Configure the bridge's UART parameters. A USB-UART bridge will not forward data + // at the correct speed until SET_LINE_CODING is sent; without it the UART may run + // at an indeterminate default rate so the NCP receives garbled bytes and never + // sends RSTACK. + uint32_t baud = channel->baud_rate_; + std::vector line_coding = { + static_cast(baud & 0xFF), static_cast((baud >> 8) & 0xFF), + static_cast((baud >> 16) & 0xFF), static_cast((baud >> 24) & 0xFF), + static_cast(channel->stop_bits_), // bCharFormat: 0=1stop, 1=1.5stop, 2=2stop + static_cast(channel->parity_), // bParityType: 0=None, 1=Odd, 2=Even, 3=Mark, 4=Space + static_cast(channel->data_bits_), // bDataBits + }; + ESP_LOGD(TAG, "SET_LINE_CODING: baud=%u stop=%u parity=%u data=%u", (unsigned) baud, channel->stop_bits_, + (unsigned) channel->parity_, channel->data_bits_); + this->control_transfer( + CDC_REQUEST_TYPE, CDC_SET_LINE_CODING, 0, channel->cdc_dev_.interrupt_interface_number, + [](const usb_host::TransferStatus &status) { + if (!status.success) { + ESP_LOGW(TAG, "SET_LINE_CODING failed: %X", status.error_code); + } else { + ESP_LOGD(TAG, "SET_LINE_CODING OK"); + } + }, + line_coding); + // Assert DTR+RTS to signal DTE is present. + this->control_transfer(CDC_REQUEST_TYPE, CDC_SET_CONTROL_LINE_STATE, CDC_DTR_RTS, + channel->cdc_dev_.interrupt_interface_number, [](const usb_host::TransferStatus &status) { + if (!status.success) { + ESP_LOGW(TAG, "SET_CONTROL_LINE_STATE failed: %X", status.error_code); + } else { + ESP_LOGD(TAG, "SET_CONTROL_LINE_STATE (DTR+RTS) OK"); + } + }); + } + this->start_channels(); +} + +void USBUartTypeCdcAcm::start_channels() { for (auto *channel : this->channels_) { if (!channel->initialised_.load()) continue; @@ -399,6 +530,6 @@ void USBUartTypeCdcAcm::enable_channels() { } } -} // namespace usb_uart -} // namespace esphome +} // namespace esphome::usb_uart + #endif // USE_ESP32_VARIANT_ESP32P4 || USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 diff --git a/esphome/components/usb_uart/usb_uart.h b/esphome/components/usb_uart/usb_uart.h index 94e6120457..9a9fe1c2ca 100644 --- a/esphome/components/usb_uart/usb_uart.h +++ b/esphome/components/usb_uart/usb_uart.h @@ -8,9 +8,10 @@ #include "esphome/core/lock_free_queue.h" #include "esphome/core/event_pool.h" #include +#include + +namespace esphome::usb_uart { -namespace esphome { -namespace usb_uart { class USBUartTypeCdcAcm; class USBUartComponent; class USBUartChannel; @@ -31,6 +32,7 @@ struct CdcEps { const usb_ep_desc_t *out_ep; uint8_t bulk_interface_number; uint8_t interrupt_interface_number; + bool comm_interface_claimed{false}; }; enum UARTParityOptions { @@ -83,6 +85,16 @@ struct UsbDataChunk { void release() {} }; +// Structure for queuing outgoing USB data chunks (one per USB FS packet) +struct UsbOutputChunk { + static constexpr size_t MAX_CHUNK_SIZE = 64; // USB FS MPS + uint8_t data[MAX_CHUNK_SIZE]; + uint8_t length; + + // Required for EventPool - no cleanup needed for POD types + void release() {} +}; + class USBUartChannel : public uart::UARTComponent, public Parented { friend class USBUartComponent; friend class USBUartTypeCdcAcm; @@ -90,24 +102,32 @@ class USBUartChannel : public uart::UARTComponent, public Parentedinput_buffer_.get_available(); } - void flush() override {} + void flush() override; void check_logger_conflict() override {} void set_parity(UARTParityOptions parity) { this->parity_ = parity; } void set_debug(bool debug) { this->debug_ = debug; } void set_dummy_receiver(bool dummy_receiver) { this->dummy_receiver_ = dummy_receiver; } + /// Register a callback invoked immediately after data is pushed to the input ring buffer. + /// Called from USBUartComponent::loop() in the main loop context. + /// Allows consumers (e.g. ZigbeeProxy) to process bytes in the same loop iteration + /// they arrive, eliminating one full main-loop-wakeup cycle of latency. + void set_rx_callback(std::function cb) { this->rx_callback_ = std::move(cb); } + protected: // Larger structures first for better alignment RingBuffer input_buffer_; - RingBuffer output_buffer_; + LockFreeQueue output_queue_; + EventPool output_pool_; + std::function rx_callback_{}; CdcEps cdc_dev_{}; // Enum (likely 4 bytes) UARTParityOptions parity_{UART_CONFIG_PARITY_NONE}; @@ -150,8 +170,12 @@ class USBUartTypeCdcAcm : public USBUartComponent { protected: virtual std::vector parse_descriptors(usb_device_handle_t dev_hdl); void on_connected() override; - virtual void enable_channels(); void on_disconnected() override; + virtual void enable_channels(); + /// Resets per-channel transfer flags and posts the first bulk IN transfer. + /// Called by enable_channels() and by vendor-specific subclass overrides that + /// handle their own line-coding setup before starting data flow. + void start_channels(); }; class USBUartTypeCP210X : public USBUartTypeCdcAcm { @@ -170,7 +194,6 @@ class USBUartTypeCH34X : public USBUartTypeCdcAcm { void enable_channels() override; }; -} // namespace usb_uart -} // namespace esphome +} // namespace esphome::usb_uart #endif // USE_ESP32_VARIANT_ESP32P4 || USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 From 4044520ccc3a17b1162a6b7aec970f5658f1f641 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Fri, 27 Feb 2026 01:38:36 -0500 Subject: [PATCH 118/147] [esp32_touch] Migrate to new unified touch sensor driver (esp_driver_touch_sens) (#14033) Co-authored-by: Claude Opus 4.6 Co-authored-by: J. Nick Koston --- esphome/components/esp32_touch/__init__.py | 319 ++++++----- .../components/esp32_touch/esp32_touch.cpp | 500 ++++++++++++++++++ esphome/components/esp32_touch/esp32_touch.h | 284 ++++------ .../esp32_touch/esp32_touch_common.cpp | 173 ------ .../components/esp32_touch/esp32_touch_v1.cpp | 244 --------- .../components/esp32_touch/esp32_touch_v2.cpp | 402 -------------- .../esp32_touch/common-variants.yaml | 1 - .../esp32_touch/test.esp32-p4-idf.yaml | 5 + 8 files changed, 800 insertions(+), 1128 deletions(-) create mode 100644 esphome/components/esp32_touch/esp32_touch.cpp delete mode 100644 esphome/components/esp32_touch/esp32_touch_common.cpp delete mode 100644 esphome/components/esp32_touch/esp32_touch_v1.cpp delete mode 100644 esphome/components/esp32_touch/esp32_touch_v2.cpp create mode 100644 tests/components/esp32_touch/test.esp32-p4-idf.yaml diff --git a/esphome/components/esp32_touch/__init__.py b/esphome/components/esp32_touch/__init__.py index a02370a343..10ad339b12 100644 --- a/esphome/components/esp32_touch/__init__.py +++ b/esphome/components/esp32_touch/__init__.py @@ -1,7 +1,10 @@ +import logging + import esphome.codegen as cg from esphome.components import esp32 from esphome.components.esp32 import ( VARIANT_ESP32, + VARIANT_ESP32P4, VARIANT_ESP32S2, VARIANT_ESP32S3, get_esp32_variant, @@ -21,6 +24,8 @@ from esphome.const import ( ) from esphome.core import TimePeriod +_LOGGER = logging.getLogger(__name__) + AUTO_LOAD = ["binary_sensor"] DEPENDENCIES = ["esp32"] @@ -37,135 +42,161 @@ CONF_WATERPROOF_SHIELD_DRIVER = "waterproof_shield_driver" esp32_touch_ns = cg.esphome_ns.namespace("esp32_touch") ESP32TouchComponent = esp32_touch_ns.class_("ESP32TouchComponent", cg.Component) +# Channel ID mappings: GPIO pin number -> integer channel ID +# These are plain integers - the new unified API uses int chan_id directly. TOUCH_PADS = { VARIANT_ESP32: { - 4: cg.global_ns.TOUCH_PAD_NUM0, - 0: cg.global_ns.TOUCH_PAD_NUM1, - 2: cg.global_ns.TOUCH_PAD_NUM2, - 15: cg.global_ns.TOUCH_PAD_NUM3, - 13: cg.global_ns.TOUCH_PAD_NUM4, - 12: cg.global_ns.TOUCH_PAD_NUM5, - 14: cg.global_ns.TOUCH_PAD_NUM6, - 27: cg.global_ns.TOUCH_PAD_NUM7, - 33: cg.global_ns.TOUCH_PAD_NUM8, - 32: cg.global_ns.TOUCH_PAD_NUM9, + 4: 0, + 0: 1, + 2: 2, + 15: 3, + 13: 4, + 12: 5, + 14: 6, + 27: 7, + 33: 8, + 32: 9, }, VARIANT_ESP32S2: { - 1: cg.global_ns.TOUCH_PAD_NUM1, - 2: cg.global_ns.TOUCH_PAD_NUM2, - 3: cg.global_ns.TOUCH_PAD_NUM3, - 4: cg.global_ns.TOUCH_PAD_NUM4, - 5: cg.global_ns.TOUCH_PAD_NUM5, - 6: cg.global_ns.TOUCH_PAD_NUM6, - 7: cg.global_ns.TOUCH_PAD_NUM7, - 8: cg.global_ns.TOUCH_PAD_NUM8, - 9: cg.global_ns.TOUCH_PAD_NUM9, - 10: cg.global_ns.TOUCH_PAD_NUM10, - 11: cg.global_ns.TOUCH_PAD_NUM11, - 12: cg.global_ns.TOUCH_PAD_NUM12, - 13: cg.global_ns.TOUCH_PAD_NUM13, - 14: cg.global_ns.TOUCH_PAD_NUM14, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + 10: 10, + 11: 11, + 12: 12, + 13: 13, + 14: 14, }, VARIANT_ESP32S3: { - 1: cg.global_ns.TOUCH_PAD_NUM1, - 2: cg.global_ns.TOUCH_PAD_NUM2, - 3: cg.global_ns.TOUCH_PAD_NUM3, - 4: cg.global_ns.TOUCH_PAD_NUM4, - 5: cg.global_ns.TOUCH_PAD_NUM5, - 6: cg.global_ns.TOUCH_PAD_NUM6, - 7: cg.global_ns.TOUCH_PAD_NUM7, - 8: cg.global_ns.TOUCH_PAD_NUM8, - 9: cg.global_ns.TOUCH_PAD_NUM9, - 10: cg.global_ns.TOUCH_PAD_NUM10, - 11: cg.global_ns.TOUCH_PAD_NUM11, - 12: cg.global_ns.TOUCH_PAD_NUM12, - 13: cg.global_ns.TOUCH_PAD_NUM13, - 14: cg.global_ns.TOUCH_PAD_NUM14, + 1: 1, + 2: 2, + 3: 3, + 4: 4, + 5: 5, + 6: 6, + 7: 7, + 8: 8, + 9: 9, + 10: 10, + 11: 11, + 12: 12, + 13: 13, + 14: 14, + }, + VARIANT_ESP32P4: { + 2: 1, + 3: 2, + 4: 3, + 5: 4, + 6: 5, + 7: 6, + 8: 7, + 9: 8, + 10: 9, + 11: 10, + 12: 11, + 13: 12, + 14: 13, + 15: 14, }, } TOUCH_PAD_DENOISE_GRADE = { - "BIT12": cg.global_ns.TOUCH_PAD_DENOISE_BIT12, - "BIT10": cg.global_ns.TOUCH_PAD_DENOISE_BIT10, - "BIT8": cg.global_ns.TOUCH_PAD_DENOISE_BIT8, - "BIT4": cg.global_ns.TOUCH_PAD_DENOISE_BIT4, + "BIT12": cg.global_ns.TOUCH_DENOISE_CHAN_RESOLUTION_BIT12, + "BIT10": cg.global_ns.TOUCH_DENOISE_CHAN_RESOLUTION_BIT10, + "BIT8": cg.global_ns.TOUCH_DENOISE_CHAN_RESOLUTION_BIT8, + "BIT4": cg.global_ns.TOUCH_DENOISE_CHAN_RESOLUTION_BIT4, } TOUCH_PAD_DENOISE_CAP_LEVEL = { - "L0": cg.global_ns.TOUCH_PAD_DENOISE_CAP_L0, - "L1": cg.global_ns.TOUCH_PAD_DENOISE_CAP_L1, - "L2": cg.global_ns.TOUCH_PAD_DENOISE_CAP_L2, - "L3": cg.global_ns.TOUCH_PAD_DENOISE_CAP_L3, - "L4": cg.global_ns.TOUCH_PAD_DENOISE_CAP_L4, - "L5": cg.global_ns.TOUCH_PAD_DENOISE_CAP_L5, - "L6": cg.global_ns.TOUCH_PAD_DENOISE_CAP_L6, - "L7": cg.global_ns.TOUCH_PAD_DENOISE_CAP_L7, + "L0": cg.global_ns.TOUCH_DENOISE_CHAN_CAP_5PF, + "L1": cg.global_ns.TOUCH_DENOISE_CHAN_CAP_6PF, + "L2": cg.global_ns.TOUCH_DENOISE_CHAN_CAP_7PF, + "L3": cg.global_ns.TOUCH_DENOISE_CHAN_CAP_9PF, + "L4": cg.global_ns.TOUCH_DENOISE_CHAN_CAP_10PF, + "L5": cg.global_ns.TOUCH_DENOISE_CHAN_CAP_12PF, + "L6": cg.global_ns.TOUCH_DENOISE_CHAN_CAP_13PF, + "L7": cg.global_ns.TOUCH_DENOISE_CHAN_CAP_14PF, } TOUCH_PAD_FILTER_MODE = { - "IIR_4": cg.global_ns.TOUCH_PAD_FILTER_IIR_4, - "IIR_8": cg.global_ns.TOUCH_PAD_FILTER_IIR_8, - "IIR_16": cg.global_ns.TOUCH_PAD_FILTER_IIR_16, - "IIR_32": cg.global_ns.TOUCH_PAD_FILTER_IIR_32, - "IIR_64": cg.global_ns.TOUCH_PAD_FILTER_IIR_64, - "IIR_128": cg.global_ns.TOUCH_PAD_FILTER_IIR_128, - "IIR_256": cg.global_ns.TOUCH_PAD_FILTER_IIR_256, - "JITTER": cg.global_ns.TOUCH_PAD_FILTER_JITTER, + "IIR_4": cg.global_ns.TOUCH_BM_IIR_FILTER_4, + "IIR_8": cg.global_ns.TOUCH_BM_IIR_FILTER_8, + "IIR_16": cg.global_ns.TOUCH_BM_IIR_FILTER_16, + "IIR_32": cg.global_ns.TOUCH_BM_IIR_FILTER_32, + "IIR_64": cg.global_ns.TOUCH_BM_IIR_FILTER_64, + "IIR_128": cg.global_ns.TOUCH_BM_IIR_FILTER_128, + "IIR_256": cg.global_ns.TOUCH_BM_IIR_FILTER_256, + "JITTER": cg.global_ns.TOUCH_BM_JITTER_FILTER, } TOUCH_PAD_SMOOTH_MODE = { - "OFF": cg.global_ns.TOUCH_PAD_SMOOTH_OFF, - "IIR_2": cg.global_ns.TOUCH_PAD_SMOOTH_IIR_2, - "IIR_4": cg.global_ns.TOUCH_PAD_SMOOTH_IIR_4, - "IIR_8": cg.global_ns.TOUCH_PAD_SMOOTH_IIR_8, + "OFF": cg.global_ns.TOUCH_SMOOTH_NO_FILTER, + "IIR_2": cg.global_ns.TOUCH_SMOOTH_IIR_FILTER_2, + "IIR_4": cg.global_ns.TOUCH_SMOOTH_IIR_FILTER_4, + "IIR_8": cg.global_ns.TOUCH_SMOOTH_IIR_FILTER_8, } LOW_VOLTAGE_REFERENCE = { - "0.5V": cg.global_ns.TOUCH_LVOLT_0V5, - "0.6V": cg.global_ns.TOUCH_LVOLT_0V6, - "0.7V": cg.global_ns.TOUCH_LVOLT_0V7, - "0.8V": cg.global_ns.TOUCH_LVOLT_0V8, + "0.5V": cg.global_ns.TOUCH_VOLT_LIM_L_0V5, + "0.6V": cg.global_ns.TOUCH_VOLT_LIM_L_0V6, + "0.7V": cg.global_ns.TOUCH_VOLT_LIM_L_0V7, + "0.8V": cg.global_ns.TOUCH_VOLT_LIM_L_0V8, } HIGH_VOLTAGE_REFERENCE = { - "2.4V": cg.global_ns.TOUCH_HVOLT_2V4, - "2.5V": cg.global_ns.TOUCH_HVOLT_2V5, - "2.6V": cg.global_ns.TOUCH_HVOLT_2V6, - "2.7V": cg.global_ns.TOUCH_HVOLT_2V7, + "2.4V": cg.global_ns.TOUCH_VOLT_LIM_H_2V4, + "2.5V": cg.global_ns.TOUCH_VOLT_LIM_H_2V5, + "2.6V": cg.global_ns.TOUCH_VOLT_LIM_H_2V6, + "2.7V": cg.global_ns.TOUCH_VOLT_LIM_H_2V7, } -VOLTAGE_ATTENUATION = { - "1.5V": cg.global_ns.TOUCH_HVOLT_ATTEN_1V5, - "1V": cg.global_ns.TOUCH_HVOLT_ATTEN_1V, - "0.5V": cg.global_ns.TOUCH_HVOLT_ATTEN_0V5, - "0V": cg.global_ns.TOUCH_HVOLT_ATTEN_0V, -} -TOUCH_PAD_WATERPROOF_SHIELD_DRIVER = { - "L0": cg.global_ns.TOUCH_PAD_SHIELD_DRV_L0, - "L1": cg.global_ns.TOUCH_PAD_SHIELD_DRV_L1, - "L2": cg.global_ns.TOUCH_PAD_SHIELD_DRV_L2, - "L3": cg.global_ns.TOUCH_PAD_SHIELD_DRV_L3, - "L4": cg.global_ns.TOUCH_PAD_SHIELD_DRV_L4, - "L5": cg.global_ns.TOUCH_PAD_SHIELD_DRV_L5, - "L6": cg.global_ns.TOUCH_PAD_SHIELD_DRV_L6, - "L7": cg.global_ns.TOUCH_PAD_SHIELD_DRV_L7, +VOLTAGE_ATTENUATION = {"1.5V", "1V", "0.5V", "0V"} + +# ESP32 V1: The new API's touch_volt_lim_h_t combines the old high_voltage_reference +# and voltage_attenuation into a single enum representing the effective upper voltage. +# Effective voltage = high_voltage_reference - voltage_attenuation +EFFECTIVE_HIGH_VOLTAGE = { + ("2.4V", "1.5V"): cg.global_ns.TOUCH_VOLT_LIM_H_0V9, + ("2.5V", "1.5V"): cg.global_ns.TOUCH_VOLT_LIM_H_1V0, + ("2.6V", "1.5V"): cg.global_ns.TOUCH_VOLT_LIM_H_1V1, + ("2.7V", "1.5V"): cg.global_ns.TOUCH_VOLT_LIM_H_1V2, + ("2.4V", "1V"): cg.global_ns.TOUCH_VOLT_LIM_H_1V4, + ("2.5V", "1V"): cg.global_ns.TOUCH_VOLT_LIM_H_1V5, + ("2.6V", "1V"): cg.global_ns.TOUCH_VOLT_LIM_H_1V6, + ("2.7V", "1V"): cg.global_ns.TOUCH_VOLT_LIM_H_1V7, + ("2.4V", "0.5V"): cg.global_ns.TOUCH_VOLT_LIM_H_1V9, + ("2.5V", "0.5V"): cg.global_ns.TOUCH_VOLT_LIM_H_2V0, + ("2.6V", "0.5V"): cg.global_ns.TOUCH_VOLT_LIM_H_2V1, + ("2.7V", "0.5V"): cg.global_ns.TOUCH_VOLT_LIM_H_2V2, + ("2.4V", "0V"): cg.global_ns.TOUCH_VOLT_LIM_H_2V4, + ("2.5V", "0V"): cg.global_ns.TOUCH_VOLT_LIM_H_2V5, + ("2.6V", "0V"): cg.global_ns.TOUCH_VOLT_LIM_H_2V6, + ("2.7V", "0V"): cg.global_ns.TOUCH_VOLT_LIM_H_2V7, } def validate_touch_pad(value): value = gpio.gpio_pin_number_validator(value) variant = get_esp32_variant() - if variant not in TOUCH_PADS: + pads = TOUCH_PADS.get(variant) + if pads is None: raise cv.Invalid(f"ESP32 variant {variant} does not support touch pads.") - - pads = TOUCH_PADS[variant] if value not in pads: raise cv.Invalid(f"Pin {value} does not support touch pads.") - return cv.enum(pads)(value) + return pads[value] # Return integer channel ID def validate_variant_vars(config): - if get_esp32_variant() == VARIANT_ESP32: - variant_vars = { + variant = get_esp32_variant() + invalid_vars = set() + if variant == VARIANT_ESP32: + invalid_vars = { CONF_DEBOUNCE_COUNT, CONF_DENOISE_GRADE, CONF_DENOISE_CAP_LEVEL, @@ -176,15 +207,14 @@ def validate_variant_vars(config): CONF_WATERPROOF_GUARD_RING, CONF_WATERPROOF_SHIELD_DRIVER, } - for vvar in variant_vars: - if vvar in config: - raise cv.Invalid(f"{vvar} is not valid on {VARIANT_ESP32}") - elif ( - get_esp32_variant() == VARIANT_ESP32S2 or get_esp32_variant() == VARIANT_ESP32S3 - ) and CONF_IIR_FILTER in config: - raise cv.Invalid( - f"{CONF_IIR_FILTER} is not valid on {VARIANT_ESP32S2} or {VARIANT_ESP32S3}" - ) + elif variant in (VARIANT_ESP32S2, VARIANT_ESP32S3, VARIANT_ESP32P4): + invalid_vars = {CONF_IIR_FILTER} + if variant == VARIANT_ESP32P4: + invalid_vars |= {CONF_DENOISE_GRADE, CONF_DENOISE_CAP_LEVEL} + unsupported = invalid_vars.intersection(config) + if unsupported: + keys = ", ".join(sorted(f"'{k}'" for k in unsupported)) + raise cv.Invalid(f"{keys} not valid on {variant}") return config @@ -219,12 +249,17 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_HIGH_VOLTAGE_REFERENCE, default="2.7V"): validate_voltage( HIGH_VOLTAGE_REFERENCE ), - cv.Optional(CONF_VOLTAGE_ATTENUATION, default="0V"): validate_voltage( - VOLTAGE_ATTENUATION - ), + # ESP32 V1 only: attenuates the high voltage reference + cv.SplitDefault( + CONF_VOLTAGE_ATTENUATION, + esp32="0V", + esp32_s2=cv.UNDEFINED, + esp32_s3=cv.UNDEFINED, + esp32_p4=cv.UNDEFINED, + ): validate_voltage(VOLTAGE_ATTENUATION), # ESP32 only cv.Optional(CONF_IIR_FILTER): cv.positive_time_period_milliseconds, - # ESP32-S2/S3 only + # ESP32-S2/S3/P4 only cv.Optional(CONF_DEBOUNCE_COUNT): cv.int_range(min=0, max=7), cv.Optional(CONF_FILTER_MODE): cv.enum( TOUCH_PAD_FILTER_MODE, upper=True, space="_" @@ -241,9 +276,7 @@ CONFIG_SCHEMA = cv.All( TOUCH_PAD_DENOISE_CAP_LEVEL, upper=True, space="_" ), cv.Optional(CONF_WATERPROOF_GUARD_RING): validate_touch_pad, - cv.Optional(CONF_WATERPROOF_SHIELD_DRIVER): cv.enum( - TOUCH_PAD_WATERPROOF_SHIELD_DRIVER, upper=True, space="_" - ), + cv.Optional(CONF_WATERPROOF_SHIELD_DRIVER): cv.int_range(min=0, max=7), } ).extend(cv.COMPONENT_SCHEMA), cv.has_none_or_all_keys(CONF_DENOISE_GRADE, CONF_DENOISE_CAP_LEVEL), @@ -260,6 +293,7 @@ CONFIG_SCHEMA = cv.All( esp32.VARIANT_ESP32, esp32.VARIANT_ESP32S2, esp32.VARIANT_ESP32S3, + esp32.VARIANT_ESP32P4, ] ), validate_variant_vars, @@ -267,44 +301,67 @@ CONFIG_SCHEMA = cv.All( async def to_code(config): - # Re-enable ESP-IDF's touch sensor driver (excluded by default to save compile time) + # New unified touch sensor driver include_builtin_idf_component("esp_driver_touch_sens") - # Legacy driver component provides driver/touch_sensor.h header - include_builtin_idf_component("driver") touch = cg.new_Pvariable(config[CONF_ID]) await cg.register_component(touch, config) cg.add(touch.set_setup_mode(config[CONF_SETUP_MODE])) - sleep_duration = int(round(config[CONF_SLEEP_DURATION].total_microseconds * 0.15)) - cg.add(touch.set_sleep_duration(sleep_duration)) + # sleep_duration -> meas_interval_us (pass microseconds directly) + cg.add(touch.set_meas_interval_us(config[CONF_SLEEP_DURATION].total_microseconds)) - measurement_duration = int( - round(config[CONF_MEASUREMENT_DURATION].total_microseconds * 7.99987793) - ) - cg.add(touch.set_measurement_duration(measurement_duration)) + variant = get_esp32_variant() - cg.add( - touch.set_low_voltage_reference( - LOW_VOLTAGE_REFERENCE[config[CONF_LOW_VOLTAGE_REFERENCE]] + # measurement_duration handling differs per variant + if variant == VARIANT_ESP32: + # V1: charge_duration_ms (convert from microseconds to milliseconds) + charge_duration_ms = ( + config[CONF_MEASUREMENT_DURATION].total_microseconds / 1000.0 ) - ) - cg.add( - touch.set_high_voltage_reference( - HIGH_VOLTAGE_REFERENCE[config[CONF_HIGH_VOLTAGE_REFERENCE]] + cg.add(touch.set_charge_duration_ms(charge_duration_ms)) + else: + # V2/V3: charge_times (approximate conversion from duration) + # The old API used clock cycles; the new API uses charge_times count. + # Default is 500 for V2/V3. Use measurement_duration as a rough scaling factor. + # 65535 / 8192 ≈ 7.9999 maps the microsecond duration to charge_times. + charge_times = int( + round(config[CONF_MEASUREMENT_DURATION].total_microseconds * (65535 / 8192)) ) - ) - cg.add( - touch.set_voltage_attenuation( - VOLTAGE_ATTENUATION[config[CONF_VOLTAGE_ATTENUATION]] - ) - ) + charge_times = max(charge_times, 1) + cg.add(touch.set_charge_times(charge_times)) - if get_esp32_variant() == VARIANT_ESP32 and CONF_IIR_FILTER in config: + # Voltage references (not applicable to P4) + if variant != VARIANT_ESP32P4: + if CONF_LOW_VOLTAGE_REFERENCE in config: + cg.add( + touch.set_low_voltage_reference( + LOW_VOLTAGE_REFERENCE[config[CONF_LOW_VOLTAGE_REFERENCE]] + ) + ) + if CONF_HIGH_VOLTAGE_REFERENCE in config: + if variant == VARIANT_ESP32: + # V1: combine high_voltage_reference with voltage_attenuation + high_ref = config[CONF_HIGH_VOLTAGE_REFERENCE] + atten = config[CONF_VOLTAGE_ATTENUATION] + cg.add( + touch.set_high_voltage_reference( + EFFECTIVE_HIGH_VOLTAGE[(high_ref, atten)] + ) + ) + else: + # V2/V3: no attenuation concept, use directly + cg.add( + touch.set_high_voltage_reference( + HIGH_VOLTAGE_REFERENCE[config[CONF_HIGH_VOLTAGE_REFERENCE]] + ) + ) + + if variant == VARIANT_ESP32 and CONF_IIR_FILTER in config: cg.add(touch.set_iir_filter(config[CONF_IIR_FILTER])) - if get_esp32_variant() == VARIANT_ESP32S2 or get_esp32_variant() == VARIANT_ESP32S3: + if variant in (VARIANT_ESP32S2, VARIANT_ESP32S3, VARIANT_ESP32P4): if CONF_FILTER_MODE in config: cg.add(touch.set_filter_mode(config[CONF_FILTER_MODE])) if CONF_DEBOUNCE_COUNT in config: diff --git a/esphome/components/esp32_touch/esp32_touch.cpp b/esphome/components/esp32_touch/esp32_touch.cpp new file mode 100644 index 0000000000..e7124ce92f --- /dev/null +++ b/esphome/components/esp32_touch/esp32_touch.cpp @@ -0,0 +1,500 @@ +#ifdef USE_ESP32 + +#include "esp32_touch.h" +#include "esphome/core/application.h" +#include "esphome/core/log.h" +#include "esphome/core/hal.h" + +#include + +namespace esphome::esp32_touch { + +template static const char *lookup_str(const char *const (&table)[N], size_t index) { + return (index < N) ? table[index] : "UNKNOWN"; +} + +static const char *const TAG = "esp32_touch"; + +static constexpr uint32_t SETUP_MODE_LOG_INTERVAL_MS = 250; +static constexpr uint32_t INITIAL_STATE_DELAY_MS = 1500; +static constexpr uint32_t ONESHOT_SCAN_COUNT = 3; +static constexpr uint32_t ONESHOT_SCAN_TIMEOUT_MS = 2000; + +// V1: called from esp_timer context (software filter) +// V2/V3: called from ISR context +// xQueueSendFromISR is safe from both contexts. + +bool IRAM_ATTR ESP32TouchComponent::on_active_cb(touch_sensor_handle_t handle, const touch_active_event_data_t *event, + void *ctx) { + auto *comp = static_cast(ctx); + TouchEvent te{event->chan_id, true}; + BaseType_t higher = pdFALSE; + xQueueSendFromISR(comp->touch_queue_, &te, &higher); + comp->enable_loop_soon_any_context(); + return higher == pdTRUE; +} + +bool IRAM_ATTR ESP32TouchComponent::on_inactive_cb(touch_sensor_handle_t handle, + const touch_inactive_event_data_t *event, void *ctx) { + auto *comp = static_cast(ctx); + TouchEvent te{event->chan_id, false}; + BaseType_t higher = pdFALSE; + xQueueSendFromISR(comp->touch_queue_, &te, &higher); + comp->enable_loop_soon_any_context(); + return higher == pdTRUE; +} + +void ESP32TouchComponent::setup() { + if (!this->create_touch_queue_()) { + return; + } + + // Create sample config - differs per hardware version +#ifdef USE_ESP32_VARIANT_ESP32 + touch_sensor_sample_config_t sample_cfg = TOUCH_SENSOR_V1_DEFAULT_SAMPLE_CONFIG( + this->charge_duration_ms_, this->low_voltage_reference_, this->high_voltage_reference_); +#elif defined(USE_ESP32_VARIANT_ESP32P4) + // div_num=8 (data scaling divisor), coarse_freq_tune=2, fine_freq_tune=2 + touch_sensor_sample_config_t sample_cfg = TOUCH_SENSOR_V3_DEFAULT_SAMPLE_CONFIG(8, 2, 2); + sample_cfg.charge_times = this->charge_times_; +#else + // ESP32-S2/S3 (V2) + touch_sensor_sample_config_t sample_cfg = TOUCH_SENSOR_V2_DEFAULT_SAMPLE_CONFIG( + this->charge_times_, this->low_voltage_reference_, this->high_voltage_reference_); +#endif + + // Create controller + touch_sensor_config_t sens_cfg = TOUCH_SENSOR_DEFAULT_BASIC_CONFIG(1, &sample_cfg); + sens_cfg.meas_interval_us = this->meas_interval_us_; +#ifndef USE_ESP32_VARIANT_ESP32 + sens_cfg.max_meas_time_us = 0; // Disable measurement timeout (V2/V3 only) +#endif + + esp_err_t err = touch_sensor_new_controller(&sens_cfg, &this->sens_handle_); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to create touch controller: %s", esp_err_to_name(err)); + this->cleanup_touch_queue_(); + this->mark_failed(); + return; + } + + // Create channels for all children + for (auto *child : this->children_) { + touch_channel_config_t chan_cfg = {}; +#ifdef USE_ESP32_VARIANT_ESP32 + chan_cfg.abs_active_thresh[0] = child->get_threshold(); + chan_cfg.charge_speed = TOUCH_CHARGE_SPEED_7; + chan_cfg.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT; + chan_cfg.group = TOUCH_CHAN_TRIG_GROUP_BOTH; +#elif defined(USE_ESP32_VARIANT_ESP32P4) + chan_cfg.active_thresh[0] = child->get_threshold(); +#else + // ESP32-S2/S3 (V2) + chan_cfg.active_thresh[0] = child->get_threshold(); + chan_cfg.charge_speed = TOUCH_CHARGE_SPEED_7; + chan_cfg.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT; +#endif + + err = touch_sensor_new_channel(this->sens_handle_, child->get_channel_id(), &chan_cfg, &child->chan_handle_); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to create touch channel %d: %s", child->get_channel_id(), esp_err_to_name(err)); + this->cleanup_touch_queue_(); + this->mark_failed(); + return; + } + } + + // Configure filter +#ifdef USE_ESP32_VARIANT_ESP32 + // Software filter is REQUIRED for V1 on_active/on_inactive callbacks + { + touch_sensor_filter_config_t filter_cfg = TOUCH_SENSOR_DEFAULT_FILTER_CONFIG(); + if (this->iir_filter_enabled_()) { + filter_cfg.interval_ms = this->iir_filter_; + } + err = touch_sensor_config_filter(this->sens_handle_, &filter_cfg); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to configure filter: %s", esp_err_to_name(err)); + this->cleanup_touch_queue_(); + this->mark_failed(); + return; + } + } +#else + // V2/V3: Hardware benchmark filter + { + touch_sensor_filter_config_t filter_cfg = TOUCH_SENSOR_DEFAULT_FILTER_CONFIG(); + if (this->filter_configured_) { + filter_cfg.benchmark.filter_mode = this->filter_mode_; + filter_cfg.benchmark.jitter_step = this->jitter_step_; + filter_cfg.benchmark.denoise_lvl = this->noise_threshold_; + filter_cfg.data.smooth_filter = this->smooth_level_; + filter_cfg.data.debounce_cnt = this->debounce_count_; + } + err = touch_sensor_config_filter(this->sens_handle_, &filter_cfg); + if (err != ESP_OK) { + ESP_LOGW(TAG, "Failed to configure filter: %s", esp_err_to_name(err)); + } + } +#endif + +#if SOC_TOUCH_SUPPORT_DENOISE_CHAN + if (this->denoise_configured_) { + touch_denoise_chan_config_t denoise_cfg = {}; + denoise_cfg.charge_speed = TOUCH_CHARGE_SPEED_7; + denoise_cfg.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT; + denoise_cfg.ref_cap = this->denoise_cap_level_; + denoise_cfg.resolution = this->denoise_grade_; + err = touch_sensor_config_denoise_channel(this->sens_handle_, &denoise_cfg); + if (err != ESP_OK) { + ESP_LOGW(TAG, "Failed to configure denoise: %s", esp_err_to_name(err)); + } + } +#endif + +#if SOC_TOUCH_SUPPORT_WATERPROOF + if (this->waterproof_configured_) { + touch_channel_handle_t guard_chan = nullptr; + for (auto *child : this->children_) { + if (child->get_channel_id() == this->waterproof_guard_ring_pad_) { + guard_chan = child->chan_handle_; + break; + } + } + + touch_channel_handle_t shield_chan = nullptr; + touch_channel_config_t shield_cfg = {}; +#ifdef USE_ESP32_VARIANT_ESP32P4 + shield_cfg.active_thresh[0] = 0; + err = touch_sensor_new_channel(this->sens_handle_, SOC_TOUCH_MAX_CHAN_ID, &shield_cfg, &shield_chan); +#else + shield_cfg.active_thresh[0] = 0; + shield_cfg.charge_speed = TOUCH_CHARGE_SPEED_7; + shield_cfg.init_charge_volt = TOUCH_INIT_CHARGE_VOLT_DEFAULT; + err = touch_sensor_new_channel(this->sens_handle_, TOUCH_SHIELD_CHAN_ID, &shield_cfg, &shield_chan); +#endif + if (err == ESP_OK) { + touch_waterproof_config_t wp_cfg = {}; + wp_cfg.guard_chan = guard_chan; + wp_cfg.shield_chan = shield_chan; + wp_cfg.shield_drv = this->waterproof_shield_driver_; + wp_cfg.flags.immersion_proof = 1; + err = touch_sensor_config_waterproof(this->sens_handle_, &wp_cfg); + if (err != ESP_OK) { + ESP_LOGW(TAG, "Failed to configure waterproof: %s", esp_err_to_name(err)); + } + } else { + ESP_LOGW(TAG, "Failed to create shield channel: %s", esp_err_to_name(err)); + } + } +#endif + + // Configure wakeup pads before enabling (must be done in INIT state) + this->configure_wakeup_pads_(); + + // Register callbacks + touch_event_callbacks_t cbs = {}; + cbs.on_active = on_active_cb; + cbs.on_inactive = on_inactive_cb; + err = touch_sensor_register_callbacks(this->sens_handle_, &cbs, this); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to register callbacks: %s", esp_err_to_name(err)); + this->cleanup_touch_queue_(); + this->mark_failed(); + return; + } + + // Enable and start scanning + err = touch_sensor_enable(this->sens_handle_); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to enable touch sensor: %s", esp_err_to_name(err)); + this->cleanup_touch_queue_(); + this->mark_failed(); + return; + } + + // Do initial oneshot scans to populate baseline values + for (uint32_t i = 0; i < ONESHOT_SCAN_COUNT; i++) { + err = touch_sensor_trigger_oneshot_scanning(this->sens_handle_, ONESHOT_SCAN_TIMEOUT_MS); + if (err != ESP_OK) { + ESP_LOGW(TAG, "Oneshot scan %d failed: %s", i, esp_err_to_name(err)); + } + } + + err = touch_sensor_start_continuous_scanning(this->sens_handle_); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to start continuous scanning: %s", esp_err_to_name(err)); + this->mark_failed(); + return; + } +} + +void ESP32TouchComponent::dump_config() { +#if !defined(USE_ESP32_VARIANT_ESP32P4) + static constexpr const char *LV_STRS[] = {"0.5V", "0.6V", "0.7V", "0.8V"}; + static constexpr const char *HV_STRS[] = {"0.9V", "1.0V", "1.1V", "1.2V", "1.4V", "1.5V", "1.6V", "1.7V", + "1.9V", "2.0V", "2.1V", "2.2V", "2.4V", "2.5V", "2.6V", "2.7V"}; + const char *lv_s = lookup_str(LV_STRS, this->low_voltage_reference_); + const char *hv_s = lookup_str(HV_STRS, this->high_voltage_reference_); + + ESP_LOGCONFIG(TAG, + "Config for ESP32 Touch Hub:\n" + " Measurement interval: %.1fus\n" + " Low Voltage Reference: %s\n" + " High Voltage Reference: %s", + this->meas_interval_us_, lv_s, hv_s); +#else + ESP_LOGCONFIG(TAG, + "Config for ESP32 Touch Hub:\n" + " Measurement interval: %.1fus", + this->meas_interval_us_); +#endif + +#ifdef USE_ESP32_VARIANT_ESP32 + if (this->iir_filter_enabled_()) { + ESP_LOGCONFIG(TAG, " IIR Filter: %" PRIu32 "ms", this->iir_filter_); + } else { + ESP_LOGCONFIG(TAG, " IIR Filter: 10ms (default)"); + } +#else + if (this->filter_configured_) { + // TOUCH_BM_IIR_FILTER_256 only exists on V2, shifting JITTER's position + static constexpr const char *FILTER_STRS[] = { + "IIR_4", + "IIR_8", + "IIR_16", + "IIR_32", + "IIR_64", + "IIR_128", +#if SOC_TOUCH_SENSOR_VERSION == 2 + "IIR_256", +#endif + "JITTER", + }; + static constexpr const char *SMOOTH_STRS[] = {"OFF", "IIR_2", "IIR_4", "IIR_8"}; + const char *filter_s = lookup_str(FILTER_STRS, this->filter_mode_); + const char *smooth_s = lookup_str(SMOOTH_STRS, this->smooth_level_); + ESP_LOGCONFIG(TAG, + " Filter mode: %s\n" + " Debounce count: %" PRIu32 "\n" + " Noise threshold coefficient: %" PRIu32 "\n" + " Jitter filter step size: %" PRIu32 "\n" + " Smooth level: %s", + filter_s, this->debounce_count_, this->noise_threshold_, this->jitter_step_, smooth_s); + } + +#if SOC_TOUCH_SUPPORT_DENOISE_CHAN + if (this->denoise_configured_) { + static constexpr const char *GRADE_STRS[] = {"BIT12", "BIT10", "BIT8", "BIT4"}; + static constexpr const char *CAP_STRS[] = {"5pF", "6.4pF", "7.8pF", "9.2pF", "10.6pF", "12pF", "13.4pF", "14.8pF"}; + const char *grade_s = lookup_str(GRADE_STRS, this->denoise_grade_); + const char *cap_s = lookup_str(CAP_STRS, this->denoise_cap_level_); + ESP_LOGCONFIG(TAG, + " Denoise grade: %s\n" + " Denoise capacitance level: %s", + grade_s, cap_s); + } +#endif +#endif // !USE_ESP32_VARIANT_ESP32 + + if (this->setup_mode_) { + ESP_LOGCONFIG(TAG, " Setup Mode ENABLED"); + } + + for (auto *child : this->children_) { + LOG_BINARY_SENSOR(" ", "Touch Pad", child); + ESP_LOGCONFIG(TAG, + " Channel: %d\n" + " Threshold: %" PRIu32 "\n" + " Benchmark: %" PRIu32, + child->channel_id_, child->threshold_, child->benchmark_); + } +} + +void ESP32TouchComponent::loop() { + const uint32_t now = App.get_loop_component_start_time(); + + // In setup mode, periodically log all pad values + this->process_setup_mode_logging_(now); + + // Process queued touch events from callbacks + TouchEvent event; + while (xQueueReceive(this->touch_queue_, &event, 0) == pdTRUE) { + for (auto *child : this->children_) { + if (child->get_channel_id() != event.chan_id) { + continue; + } + + // Read current smooth value + uint32_t value = 0; + touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_SMOOTH, &value); + child->value_ = value; + +#ifndef USE_ESP32_VARIANT_ESP32 + // V2/V3: also read benchmark + uint32_t benchmark = 0; + touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_BENCHMARK, &benchmark); + child->benchmark_ = benchmark; +#endif + + bool new_state = event.is_active; + + if (new_state != child->last_state_) { + child->initial_state_published_ = true; + child->last_state_ = new_state; + child->publish_state(new_state); +#ifdef USE_ESP32_VARIANT_ESP32 + ESP_LOGV(TAG, "Touch Pad '%s' state: %s (value: %" PRIu32 ", threshold: %" PRIu32 ")", + child->get_name().c_str(), ONOFF(new_state), value, child->get_threshold()); +#else + if (new_state) { + ESP_LOGV(TAG, "Touch Pad '%s' state: ON (value: %" PRIu32 ", benchmark: %" PRIu32 ", threshold: %" PRIu32 ")", + child->get_name().c_str(), value, benchmark, child->get_threshold()); + } else { + ESP_LOGV(TAG, "Touch Pad '%s' state: OFF", child->get_name().c_str()); + } +#endif + } + break; + } + } + + // Publish initial OFF state for sensors that haven't received events yet + for (auto *child : this->children_) { + this->publish_initial_state_if_needed_(child, now); + } + + if (!this->setup_mode_) { + this->disable_loop(); + } +} + +void ESP32TouchComponent::on_shutdown() { + if (this->sens_handle_ == nullptr) + return; + + touch_sensor_stop_continuous_scanning(this->sens_handle_); + touch_sensor_disable(this->sens_handle_); + + for (auto *child : this->children_) { + if (child->chan_handle_ != nullptr) { + touch_sensor_del_channel(child->chan_handle_); + child->chan_handle_ = nullptr; + } + } + + touch_sensor_del_controller(this->sens_handle_); + this->sens_handle_ = nullptr; + + this->cleanup_touch_queue_(); +} + +bool ESP32TouchComponent::create_touch_queue_() { + size_t queue_size = this->children_.size() * 4; + if (queue_size < 8) + queue_size = 8; + + this->touch_queue_ = xQueueCreate(queue_size, sizeof(TouchEvent)); + + if (this->touch_queue_ == nullptr) { + ESP_LOGE(TAG, "Failed to create touch event queue of size %" PRIu32, (uint32_t) queue_size); + this->mark_failed(); + return false; + } + return true; +} + +void ESP32TouchComponent::cleanup_touch_queue_() { + if (this->touch_queue_) { + vQueueDelete(this->touch_queue_); + this->touch_queue_ = nullptr; + } +} + +void ESP32TouchComponent::configure_wakeup_pads_() { +#if SOC_TOUCH_SUPPORT_SLEEP_WAKEUP + bool has_wakeup = false; + for (auto *child : this->children_) { + if (child->get_wakeup_threshold() != 0) { + has_wakeup = true; + break; + } + } + + if (!has_wakeup) + return; + +#ifdef USE_ESP32_VARIANT_ESP32 + // V1: Simple sleep config - threshold is set via channel config's abs_active_thresh + touch_sleep_config_t sleep_cfg = TOUCH_SENSOR_DEFAULT_DSLP_CONFIG(); + sleep_cfg.deep_slp_sens_cfg = nullptr; + esp_err_t err = touch_sensor_config_sleep_wakeup(this->sens_handle_, &sleep_cfg); + if (err != ESP_OK) { + ESP_LOGW(TAG, "Failed to configure touch sleep wakeup: %s", esp_err_to_name(err)); + } +#else + // V2/V3: Need to specify a deep sleep channel and threshold + touch_channel_handle_t wakeup_chan = nullptr; + uint32_t wakeup_thresh = 0; + for (auto *child : this->children_) { + if (child->get_wakeup_threshold() != 0) { + wakeup_chan = child->chan_handle_; + wakeup_thresh = child->get_wakeup_threshold(); + break; // Only one deep sleep wakeup channel is supported + } + } + + if (wakeup_chan != nullptr) { + touch_sleep_config_t sleep_cfg = TOUCH_SENSOR_DEFAULT_DSLP_CONFIG(); + sleep_cfg.deep_slp_chan = wakeup_chan; + sleep_cfg.deep_slp_thresh[0] = wakeup_thresh; + sleep_cfg.deep_slp_sens_cfg = nullptr; + esp_err_t err = touch_sensor_config_sleep_wakeup(this->sens_handle_, &sleep_cfg); + if (err != ESP_OK) { + ESP_LOGW(TAG, "Failed to configure touch sleep wakeup: %s", esp_err_to_name(err)); + } + } +#endif +#endif // SOC_TOUCH_SUPPORT_SLEEP_WAKEUP +} + +void ESP32TouchComponent::process_setup_mode_logging_(uint32_t now) { + if (this->setup_mode_ && now - this->setup_mode_last_log_print_ > SETUP_MODE_LOG_INTERVAL_MS) { + for (auto *child : this->children_) { + if (child->chan_handle_ == nullptr) + continue; + + uint32_t smooth_value = 0; + touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_SMOOTH, &smooth_value); + child->value_ = smooth_value; + +#ifdef USE_ESP32_VARIANT_ESP32 + ESP_LOGD(TAG, "Touch Pad '%s' (Ch%d): %" PRIu32, child->get_name().c_str(), child->channel_id_, smooth_value); +#else + uint32_t benchmark = 0; + touch_channel_read_data(child->chan_handle_, TOUCH_CHAN_DATA_TYPE_BENCHMARK, &benchmark); + child->benchmark_ = benchmark; + int32_t difference = static_cast(smooth_value) - static_cast(benchmark); + ESP_LOGD(TAG, + "Touch Pad '%s' (Ch%d): value=%" PRIu32 ", benchmark=%" PRIu32 ", difference=%" PRId32 + " (set threshold < %" PRId32 " to detect touch)", + child->get_name().c_str(), child->channel_id_, smooth_value, benchmark, difference, difference); +#endif + } + this->setup_mode_last_log_print_ = now; + } +} + +void ESP32TouchComponent::publish_initial_state_if_needed_(ESP32TouchBinarySensor *child, uint32_t now) { + if (!child->initial_state_published_) { + if (now > INITIAL_STATE_DELAY_MS) { + child->publish_initial_state(false); + child->initial_state_published_ = true; + ESP_LOGV(TAG, "Touch Pad '%s' state: OFF (initial)", child->get_name().c_str()); + } + } +} + +} // namespace esphome::esp32_touch + +#endif // USE_ESP32 diff --git a/esphome/components/esp32_touch/esp32_touch.h b/esphome/components/esp32_touch/esp32_touch.h index 7f45f2ccb4..d51b2d4922 100644 --- a/esphome/components/esp32_touch/esp32_touch.h +++ b/esphome/components/esp32_touch/esp32_touch.h @@ -4,49 +4,49 @@ #include "esphome/core/component.h" #include "esphome/components/binary_sensor/binary_sensor.h" -#include #include -#include +#include #include #include -namespace esphome { -namespace esp32_touch { +namespace esphome::esp32_touch { // IMPORTANT: Touch detection logic differs between ESP32 variants: -// - ESP32 v1 (original): Touch detected when value < threshold (capacitance increase causes value decrease) -// - ESP32-S2/S3 v2: Touch detected when value > threshold (capacitance increase causes value increase) -// This inversion is due to different hardware implementations between chip generations. +// - ESP32 v1 (original): Touch detected when value < threshold (absolute threshold, capacitance increase causes +// value decrease) +// - ESP32-S2/S3 v2, ESP32-P4 v3: Touch detected when (smooth - benchmark) > threshold (relative threshold) // -// INTERRUPT BEHAVIOR: -// - ESP32 v1: Interrupts fire when ANY pad is touched and continue while touched. -// Releases are detected by timeout since hardware doesn't generate release interrupts. -// - ESP32-S2/S3 v2: Hardware supports both touch and release interrupts, but release -// interrupts are unreliable and sometimes don't fire. We now only use touch interrupts -// and detect releases via timeout, similar to v1. - -static const uint32_t SETUP_MODE_LOG_INTERVAL_MS = 250; +// CALLBACK BEHAVIOR: +// - ESP32 v1: on_active/on_inactive fire from a software filter timer (esp_timer context). +// The software filter MUST be configured for these callbacks to fire. +// - ESP32-S2/S3 v2, ESP32-P4 v3: on_active/on_inactive fire from hardware ISR context. +// Release detection via on_inactive is used, with timeout as safety fallback. class ESP32TouchBinarySensor; -class ESP32TouchComponent : public Component { +class ESP32TouchComponent final : public Component { public: void register_touch_pad(ESP32TouchBinarySensor *pad) { this->children_.push_back(pad); } void set_setup_mode(bool setup_mode) { this->setup_mode_ = setup_mode; } - void set_sleep_duration(uint16_t sleep_duration) { this->sleep_cycle_ = sleep_duration; } - void set_measurement_duration(uint16_t meas_cycle) { this->meas_cycle_ = meas_cycle; } - void set_low_voltage_reference(touch_low_volt_t low_voltage_reference) { + void set_meas_interval_us(float meas_interval_us) { this->meas_interval_us_ = meas_interval_us; } + +#ifdef USE_ESP32_VARIANT_ESP32 + void set_charge_duration_ms(float charge_duration_ms) { this->charge_duration_ms_ = charge_duration_ms; } +#else + void set_charge_times(uint32_t charge_times) { this->charge_times_ = charge_times; } +#endif + +#if !defined(USE_ESP32_VARIANT_ESP32P4) + void set_low_voltage_reference(touch_volt_lim_l_t low_voltage_reference) { this->low_voltage_reference_ = low_voltage_reference; } - void set_high_voltage_reference(touch_high_volt_t high_voltage_reference) { + void set_high_voltage_reference(touch_volt_lim_h_t high_voltage_reference) { this->high_voltage_reference_ = high_voltage_reference; } - void set_voltage_attenuation(touch_volt_atten_t voltage_attenuation) { - this->voltage_attenuation_ = voltage_attenuation; - } +#endif void setup() override; void dump_config() override; @@ -54,183 +54,130 @@ class ESP32TouchComponent : public Component { void on_shutdown() override; -#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) - void set_filter_mode(touch_filter_mode_t filter_mode) { this->filter_mode_ = filter_mode; } - void set_debounce_count(uint32_t debounce_count) { this->debounce_count_ = debounce_count; } - void set_noise_threshold(uint32_t noise_threshold) { this->noise_threshold_ = noise_threshold; } - void set_jitter_step(uint32_t jitter_step) { this->jitter_step_ = jitter_step; } - void set_smooth_level(touch_smooth_mode_t smooth_level) { this->smooth_level_ = smooth_level; } - void set_denoise_grade(touch_pad_denoise_grade_t denoise_grade) { this->grade_ = denoise_grade; } - void set_denoise_cap(touch_pad_denoise_cap_t cap_level) { this->cap_level_ = cap_level; } - void set_waterproof_guard_ring_pad(touch_pad_t pad) { this->waterproof_guard_ring_pad_ = pad; } - void set_waterproof_shield_driver(touch_pad_shield_driver_t drive_capability) { +#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32P4) + void set_filter_mode(touch_benchmark_filter_mode_t filter_mode) { + this->filter_mode_ = filter_mode; + this->filter_configured_ = true; + } + void set_debounce_count(uint32_t debounce_count) { + this->debounce_count_ = debounce_count; + this->filter_configured_ = true; + } + void set_noise_threshold(uint32_t noise_threshold) { + this->noise_threshold_ = noise_threshold; + this->filter_configured_ = true; + } + void set_jitter_step(uint32_t jitter_step) { + this->jitter_step_ = jitter_step; + this->filter_configured_ = true; + } + void set_smooth_level(touch_smooth_filter_mode_t smooth_level) { + this->smooth_level_ = smooth_level; + this->filter_configured_ = true; + } +#if SOC_TOUCH_SUPPORT_DENOISE_CHAN + void set_denoise_grade(touch_denoise_chan_resolution_t denoise_grade) { + this->denoise_grade_ = denoise_grade; + this->denoise_configured_ = true; + } + void set_denoise_cap(touch_denoise_chan_cap_t cap_level) { + this->denoise_cap_level_ = cap_level; + this->denoise_configured_ = true; + } +#endif + void set_waterproof_guard_ring_pad(int channel_id) { + this->waterproof_guard_ring_pad_ = channel_id; + this->waterproof_configured_ = true; + } + void set_waterproof_shield_driver(uint32_t drive_capability) { this->waterproof_shield_driver_ = drive_capability; + this->waterproof_configured_ = true; } #else void set_iir_filter(uint32_t iir_filter) { this->iir_filter_ = iir_filter; } #endif protected: + // Unified touch event for queue communication + struct TouchEvent { + int chan_id; + bool is_active; + }; + // Common helper methods - void dump_config_base_(); - void dump_config_sensors_(); bool create_touch_queue_(); void cleanup_touch_queue_(); void configure_wakeup_pads_(); // Helper methods for loop() logic void process_setup_mode_logging_(uint32_t now); - bool should_check_for_releases_(uint32_t now); void publish_initial_state_if_needed_(ESP32TouchBinarySensor *child, uint32_t now); - void check_and_disable_loop_if_all_released_(size_t pads_off); - void calculate_release_timeout_(); + + // Unified callbacks for new API + static bool on_active_cb(touch_sensor_handle_t handle, const touch_active_event_data_t *event, void *ctx); + static bool on_inactive_cb(touch_sensor_handle_t handle, const touch_inactive_event_data_t *event, void *ctx); // Common members std::vector children_; bool setup_mode_{false}; uint32_t setup_mode_last_log_print_{0}; - uint32_t last_release_check_{0}; - uint32_t release_timeout_ms_{1500}; - uint32_t release_check_interval_ms_{50}; + + // Controller handle (new API) + touch_sensor_handle_t sens_handle_{nullptr}; + QueueHandle_t touch_queue_{nullptr}; // Common configuration parameters - uint16_t sleep_cycle_{4095}; - uint16_t meas_cycle_{65535}; - touch_low_volt_t low_voltage_reference_{TOUCH_LVOLT_0V5}; - touch_high_volt_t high_voltage_reference_{TOUCH_HVOLT_2V7}; - touch_volt_atten_t voltage_attenuation_{TOUCH_HVOLT_ATTEN_0V}; + float meas_interval_us_{320.0f}; - // Common constants - static constexpr uint32_t MINIMUM_RELEASE_TIME_MS = 100; +#ifdef USE_ESP32_VARIANT_ESP32 + float charge_duration_ms_{1.0f}; +#else + uint32_t charge_times_{500}; +#endif - // ==================== PLATFORM SPECIFIC ==================== +#if !defined(USE_ESP32_VARIANT_ESP32P4) + touch_volt_lim_l_t low_voltage_reference_{TOUCH_VOLT_LIM_L_0V5}; + touch_volt_lim_h_t high_voltage_reference_{TOUCH_VOLT_LIM_H_2V7}; +#endif #ifdef USE_ESP32_VARIANT_ESP32 // ESP32 v1 specific - - static void touch_isr_handler(void *arg); - QueueHandle_t touch_queue_{nullptr}; - - private: - // Touch event structure for ESP32 v1 - // Contains touch pad info, value, and touch state for queue communication - struct TouchPadEventV1 { - touch_pad_t pad; - uint32_t value; - bool is_touched; - }; - - protected: uint32_t iir_filter_{0}; bool iir_filter_enabled_() const { return this->iir_filter_ > 0; } -#elif defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) - // ESP32-S2/S3 v2 specific - static void touch_isr_handler(void *arg); - QueueHandle_t touch_queue_{nullptr}; +#elif defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || defined(USE_ESP32_VARIANT_ESP32P4) + // ESP32-S2/S3/P4 v2/v3 specific - private: - // Touch event structure for ESP32 v2 (S2/S3) - // Contains touch pad and interrupt mask for queue communication - struct TouchPadEventV2 { - touch_pad_t pad; - uint32_t intr_mask; - }; - - protected: - // Filter configuration - touch_filter_mode_t filter_mode_{TOUCH_PAD_FILTER_MAX}; + // Filter configuration - use sentinel values to detect "not configured" + touch_benchmark_filter_mode_t filter_mode_{TOUCH_BM_JITTER_FILTER}; uint32_t debounce_count_{0}; uint32_t noise_threshold_{0}; uint32_t jitter_step_{0}; - touch_smooth_mode_t smooth_level_{TOUCH_PAD_SMOOTH_MAX}; + touch_smooth_filter_mode_t smooth_level_{TOUCH_SMOOTH_NO_FILTER}; + bool filter_configured_{false}; +#if SOC_TOUCH_SUPPORT_DENOISE_CHAN // Denoise configuration - touch_pad_denoise_grade_t grade_{TOUCH_PAD_DENOISE_MAX}; - touch_pad_denoise_cap_t cap_level_{TOUCH_PAD_DENOISE_CAP_MAX}; - - // Waterproof configuration - touch_pad_t waterproof_guard_ring_pad_{TOUCH_PAD_MAX}; - touch_pad_shield_driver_t waterproof_shield_driver_{TOUCH_PAD_SHIELD_DRV_MAX}; - - bool filter_configured_() const { - return (this->filter_mode_ != TOUCH_PAD_FILTER_MAX) && (this->smooth_level_ != TOUCH_PAD_SMOOTH_MAX); - } - bool denoise_configured_() const { - return (this->grade_ != TOUCH_PAD_DENOISE_MAX) && (this->cap_level_ != TOUCH_PAD_DENOISE_CAP_MAX); - } - bool waterproof_configured_() const { - return (this->waterproof_guard_ring_pad_ != TOUCH_PAD_MAX) && - (this->waterproof_shield_driver_ != TOUCH_PAD_SHIELD_DRV_MAX); - } - - // Helper method to read touch values - non-blocking operation - // Returns the current touch pad value using either filtered or raw reading - // based on the filter configuration - uint32_t read_touch_value(touch_pad_t pad) const; - - // Helper to update touch state with a known state and value - void update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched, uint32_t value); - - // Helper to read touch value and update state for a given child - bool check_and_update_touch_state_(ESP32TouchBinarySensor *child); + touch_denoise_chan_resolution_t denoise_grade_{TOUCH_DENOISE_CHAN_RESOLUTION_BIT12}; + touch_denoise_chan_cap_t denoise_cap_level_{TOUCH_DENOISE_CHAN_CAP_5PF}; + bool denoise_configured_{false}; #endif - // Helper functions for dump_config - common to both implementations - static const char *get_low_voltage_reference_str(touch_low_volt_t ref) { - switch (ref) { - case TOUCH_LVOLT_0V5: - return "0.5V"; - case TOUCH_LVOLT_0V6: - return "0.6V"; - case TOUCH_LVOLT_0V7: - return "0.7V"; - case TOUCH_LVOLT_0V8: - return "0.8V"; - default: - return "UNKNOWN"; - } - } - - static const char *get_high_voltage_reference_str(touch_high_volt_t ref) { - switch (ref) { - case TOUCH_HVOLT_2V4: - return "2.4V"; - case TOUCH_HVOLT_2V5: - return "2.5V"; - case TOUCH_HVOLT_2V6: - return "2.6V"; - case TOUCH_HVOLT_2V7: - return "2.7V"; - default: - return "UNKNOWN"; - } - } - - static const char *get_voltage_attenuation_str(touch_volt_atten_t atten) { - switch (atten) { - case TOUCH_HVOLT_ATTEN_1V5: - return "1.5V"; - case TOUCH_HVOLT_ATTEN_1V: - return "1V"; - case TOUCH_HVOLT_ATTEN_0V5: - return "0.5V"; - case TOUCH_HVOLT_ATTEN_0V: - return "0V"; - default: - return "UNKNOWN"; - } - } + // Waterproof configuration + int waterproof_guard_ring_pad_{-1}; + uint32_t waterproof_shield_driver_{0}; + bool waterproof_configured_{false}; +#endif }; /// Simple helper class to expose a touch pad value as a binary sensor. class ESP32TouchBinarySensor : public binary_sensor::BinarySensor { public: - ESP32TouchBinarySensor(touch_pad_t touch_pad, uint32_t threshold, uint32_t wakeup_threshold) - : touch_pad_(touch_pad), threshold_(threshold), wakeup_threshold_(wakeup_threshold) {} + ESP32TouchBinarySensor(int channel_id, uint32_t threshold, uint32_t wakeup_threshold) + : channel_id_(channel_id), threshold_(threshold), wakeup_threshold_(wakeup_threshold) {} - touch_pad_t get_touch_pad() const { return this->touch_pad_; } + int get_channel_id() const { return this->channel_id_; } uint32_t get_threshold() const { return this->threshold_; } void set_threshold(uint32_t threshold) { this->threshold_ = threshold; } @@ -242,39 +189,22 @@ class ESP32TouchBinarySensor : public binary_sensor::BinarySensor { uint32_t get_wakeup_threshold() const { return this->wakeup_threshold_; } -#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) - /// Ensure benchmark value is read (v2 touch hardware only). - /// Called from multiple places - kept as helper to document shared usage. - void ensure_benchmark_read() { - if (this->benchmark_ == 0) { - touch_pad_read_benchmark(this->touch_pad_, &this->benchmark_); - } - } -#endif - protected: friend ESP32TouchComponent; - touch_pad_t touch_pad_{TOUCH_PAD_MAX}; + int channel_id_; + touch_channel_handle_t chan_handle_{nullptr}; uint32_t threshold_{0}; - uint32_t benchmark_{}; + uint32_t benchmark_{0}; /// Stores the last raw touch measurement value. uint32_t value_{0}; bool last_state_{false}; const uint32_t wakeup_threshold_{0}; // Track last touch time for timeout-based release detection - // Design note: last_touch_time_ does not require synchronization primitives because: - // 1. ESP32 guarantees atomic 32-bit aligned reads/writes - // 2. ISR only writes timestamps, main loop only reads - // 3. Timing tolerance allows for occasional stale reads (50ms check interval) - // 4. Queue operations provide implicit memory barriers - // Using atomic/critical sections would add overhead without meaningful benefit - uint32_t last_touch_time_{}; - bool initial_state_published_{}; + bool initial_state_published_{false}; }; -} // namespace esp32_touch -} // namespace esphome +} // namespace esphome::esp32_touch #endif diff --git a/esphome/components/esp32_touch/esp32_touch_common.cpp b/esphome/components/esp32_touch/esp32_touch_common.cpp deleted file mode 100644 index 429b5173be..0000000000 --- a/esphome/components/esp32_touch/esp32_touch_common.cpp +++ /dev/null @@ -1,173 +0,0 @@ -#ifdef USE_ESP32 - -#include "esp32_touch.h" -#include "esphome/core/log.h" -#include - -#include "soc/rtc.h" - -namespace esphome { -namespace esp32_touch { - -static const char *const TAG = "esp32_touch"; - -void ESP32TouchComponent::dump_config_base_() { - const char *lv_s = get_low_voltage_reference_str(this->low_voltage_reference_); - const char *hv_s = get_high_voltage_reference_str(this->high_voltage_reference_); - const char *atten_s = get_voltage_attenuation_str(this->voltage_attenuation_); - - ESP_LOGCONFIG(TAG, - "Config for ESP32 Touch Hub:\n" - " Meas cycle: %.2fms\n" - " Sleep cycle: %.2fms\n" - " Low Voltage Reference: %s\n" - " High Voltage Reference: %s\n" - " Voltage Attenuation: %s\n" - " Release Timeout: %" PRIu32 "ms\n", - this->meas_cycle_ / (8000000.0f / 1000.0f), this->sleep_cycle_ / (150000.0f / 1000.0f), lv_s, hv_s, - atten_s, this->release_timeout_ms_); -} - -void ESP32TouchComponent::dump_config_sensors_() { - for (auto *child : this->children_) { - LOG_BINARY_SENSOR(" ", "Touch Pad", child); - ESP_LOGCONFIG(TAG, - " Pad: T%u\n" - " Threshold: %" PRIu32 "\n" - " Benchmark: %" PRIu32, - (unsigned) child->touch_pad_, child->threshold_, child->benchmark_); - } -} - -bool ESP32TouchComponent::create_touch_queue_() { - // Queue size calculation: children * 4 allows for burst scenarios where ISR - // fires multiple times before main loop processes. - size_t queue_size = this->children_.size() * 4; - if (queue_size < 8) - queue_size = 8; - -#ifdef USE_ESP32_VARIANT_ESP32 - this->touch_queue_ = xQueueCreate(queue_size, sizeof(TouchPadEventV1)); -#else - this->touch_queue_ = xQueueCreate(queue_size, sizeof(TouchPadEventV2)); -#endif - - if (this->touch_queue_ == nullptr) { - ESP_LOGE(TAG, "Failed to create touch event queue of size %" PRIu32, (uint32_t) queue_size); - this->mark_failed(); - return false; - } - return true; -} - -void ESP32TouchComponent::cleanup_touch_queue_() { - if (this->touch_queue_) { - vQueueDelete(this->touch_queue_); - this->touch_queue_ = nullptr; - } -} - -void ESP32TouchComponent::configure_wakeup_pads_() { - bool is_wakeup_source = false; - - // Check if any pad is configured for wakeup - for (auto *child : this->children_) { - if (child->get_wakeup_threshold() != 0) { - is_wakeup_source = true; - -#ifdef USE_ESP32_VARIANT_ESP32 - // ESP32 v1: No filter available when using as wake-up source. - touch_pad_config(child->get_touch_pad(), child->get_wakeup_threshold()); -#else - // ESP32-S2/S3 v2: Set threshold for wakeup - touch_pad_set_thresh(child->get_touch_pad(), child->get_wakeup_threshold()); -#endif - } - } - - if (!is_wakeup_source) { - // If no pad is configured for wakeup, deinitialize touch pad - touch_pad_deinit(); - } -} - -void ESP32TouchComponent::process_setup_mode_logging_(uint32_t now) { - if (this->setup_mode_ && now - this->setup_mode_last_log_print_ > SETUP_MODE_LOG_INTERVAL_MS) { - for (auto *child : this->children_) { -#ifdef USE_ESP32_VARIANT_ESP32 - ESP_LOGD(TAG, "Touch Pad '%s' (T%" PRIu32 "): %" PRIu32, child->get_name().c_str(), - (uint32_t) child->get_touch_pad(), child->value_); -#else - // Read the value being used for touch detection - uint32_t value = this->read_touch_value(child->get_touch_pad()); - // Store the value for get_value() access in lambdas - child->value_ = value; - // Read benchmark if not already read - child->ensure_benchmark_read(); - // Calculate difference to help user set threshold - // For ESP32-S2/S3 v2: touch detected when value > benchmark + threshold - // So threshold should be < (value - benchmark) when touched - int32_t difference = static_cast(value) - static_cast(child->benchmark_); - ESP_LOGD(TAG, - "Touch Pad '%s' (T%d): value=%d, benchmark=%" PRIu32 ", difference=%" PRId32 " (set threshold < %" PRId32 - " to detect touch)", - child->get_name().c_str(), child->get_touch_pad(), value, child->benchmark_, difference, difference); -#endif - } - this->setup_mode_last_log_print_ = now; - } -} - -bool ESP32TouchComponent::should_check_for_releases_(uint32_t now) { - if (now - this->last_release_check_ < this->release_check_interval_ms_) { - return false; - } - this->last_release_check_ = now; - return true; -} - -void ESP32TouchComponent::publish_initial_state_if_needed_(ESP32TouchBinarySensor *child, uint32_t now) { - if (!child->initial_state_published_) { - // Check if enough time has passed since startup - if (now > this->release_timeout_ms_) { - child->publish_initial_state(false); - child->initial_state_published_ = true; - ESP_LOGV(TAG, "Touch Pad '%s' state: OFF (initial)", child->get_name().c_str()); - } - } -} - -void ESP32TouchComponent::check_and_disable_loop_if_all_released_(size_t pads_off) { - // Disable the loop to save CPU cycles when all pads are off and not in setup mode. - if (pads_off == this->children_.size() && !this->setup_mode_) { - this->disable_loop(); - } -} - -void ESP32TouchComponent::calculate_release_timeout_() { - // Calculate release timeout based on sleep cycle - // Design note: Hardware limitation - interrupts only fire reliably on touch (not release) - // We must use timeout-based detection for release events - // Formula: 3 sleep cycles converted to ms, with MINIMUM_RELEASE_TIME_MS minimum - // Per ESP-IDF docs: t_sleep = sleep_cycle / SOC_CLK_RC_SLOW_FREQ_APPROX - - uint32_t rtc_freq = rtc_clk_slow_freq_get_hz(); - - // Calculate timeout as 3 sleep cycles - this->release_timeout_ms_ = (this->sleep_cycle_ * 1000 * 3) / rtc_freq; - - if (this->release_timeout_ms_ < MINIMUM_RELEASE_TIME_MS) { - this->release_timeout_ms_ = MINIMUM_RELEASE_TIME_MS; - } - - // Check for releases at 1/4 the timeout interval - // Since hardware doesn't generate reliable release interrupts, we must poll - // for releases in the main loop. Checking at 1/4 the timeout interval provides - // a good balance between responsiveness and efficiency. - this->release_check_interval_ms_ = this->release_timeout_ms_ / 4; -} - -} // namespace esp32_touch -} // namespace esphome - -#endif // USE_ESP32 diff --git a/esphome/components/esp32_touch/esp32_touch_v1.cpp b/esphome/components/esp32_touch/esp32_touch_v1.cpp deleted file mode 100644 index ffb805e008..0000000000 --- a/esphome/components/esp32_touch/esp32_touch_v1.cpp +++ /dev/null @@ -1,244 +0,0 @@ -#ifdef USE_ESP32_VARIANT_ESP32 - -#include "esp32_touch.h" -#include "esphome/core/application.h" -#include "esphome/core/log.h" -#include "esphome/core/hal.h" - -#include -#include - -// Include HAL for ISR-safe touch reading -#include "hal/touch_sensor_ll.h" - -namespace esphome { -namespace esp32_touch { - -static const char *const TAG = "esp32_touch"; - -static const uint32_t SETUP_MODE_THRESHOLD = 0xFFFF; - -void ESP32TouchComponent::setup() { - // Create queue for touch events - // Queue size calculation: children * 4 allows for burst scenarios where ISR - // fires multiple times before main loop processes. This is important because - // ESP32 v1 scans all pads on each interrupt, potentially sending multiple events. - if (!this->create_touch_queue_()) { - return; - } - - touch_pad_init(); - touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER); - - // Set up IIR filter if enabled - if (this->iir_filter_enabled_()) { - touch_pad_filter_start(this->iir_filter_); - } - - // Configure measurement parameters -#if ESP_IDF_VERSION_MAJOR >= 5 - touch_pad_set_measurement_clock_cycles(this->meas_cycle_); - touch_pad_set_measurement_interval(this->sleep_cycle_); -#else - touch_pad_set_meas_time(this->sleep_cycle_, this->meas_cycle_); -#endif - touch_pad_set_voltage(this->high_voltage_reference_, this->low_voltage_reference_, this->voltage_attenuation_); - - // Configure each touch pad - for (auto *child : this->children_) { - if (this->setup_mode_) { - touch_pad_config(child->get_touch_pad(), SETUP_MODE_THRESHOLD); - } else { - touch_pad_config(child->get_touch_pad(), child->get_threshold()); - } - } - - // Register ISR handler - esp_err_t err = touch_pad_isr_register(touch_isr_handler, this); - if (err != ESP_OK) { - ESP_LOGE(TAG, "Failed to register touch ISR: %s", esp_err_to_name(err)); - this->cleanup_touch_queue_(); - this->mark_failed(); - return; - } - - // Calculate release timeout based on sleep cycle - this->calculate_release_timeout_(); - - // Enable touch pad interrupt - touch_pad_intr_enable(); -} - -void ESP32TouchComponent::dump_config() { - this->dump_config_base_(); - - if (this->iir_filter_enabled_()) { - ESP_LOGCONFIG(TAG, " IIR Filter: %" PRIu32 "ms", this->iir_filter_); - } else { - ESP_LOGCONFIG(TAG, " IIR Filter DISABLED"); - } - - if (this->setup_mode_) { - ESP_LOGCONFIG(TAG, " Setup Mode ENABLED"); - } - - this->dump_config_sensors_(); -} - -void ESP32TouchComponent::loop() { - const uint32_t now = App.get_loop_component_start_time(); - - // Print debug info for all pads in setup mode - this->process_setup_mode_logging_(now); - - // Process any queued touch events from interrupts - // Note: Events are only sent by ISR for pads that were measured in that cycle (value != 0) - // This is more efficient than sending all pad states every interrupt - TouchPadEventV1 event; - while (xQueueReceive(this->touch_queue_, &event, 0) == pdTRUE) { - // Find the corresponding sensor - O(n) search is acceptable since events are infrequent - for (auto *child : this->children_) { - if (child->get_touch_pad() != event.pad) { - continue; - } - - // Found matching pad - process it - child->value_ = event.value; - - // The interrupt gives us the touch state directly - bool new_state = event.is_touched; - - // Track when we last saw this pad as touched - if (new_state) { - child->last_touch_time_ = now; - } - - // Only publish if state changed - this filters out repeated events - if (new_state != child->last_state_) { - child->initial_state_published_ = true; - child->last_state_ = new_state; - child->publish_state(new_state); - // Original ESP32: ISR only fires when touched, release is detected by timeout - // Note: ESP32 v1 uses inverted logic - touched when value < threshold - ESP_LOGV(TAG, "Touch Pad '%s' state: %s (value: %" PRIu32 " < threshold: %" PRIu32 ")", - child->get_name().c_str(), ONOFF(new_state), event.value, child->get_threshold()); - } - break; // Exit inner loop after processing matching pad - } - } - - // Check for released pads periodically - if (!this->should_check_for_releases_(now)) { - return; - } - - size_t pads_off = 0; - for (auto *child : this->children_) { - // Handle initial state publication after startup - this->publish_initial_state_if_needed_(child, now); - - if (child->last_state_) { - // Pad is currently in touched state - check for release timeout - // Using subtraction handles 32-bit rollover correctly - uint32_t time_diff = now - child->last_touch_time_; - - // Check if we haven't seen this pad recently - if (time_diff > this->release_timeout_ms_) { - // Haven't seen this pad recently, assume it's released - child->last_state_ = false; - child->publish_state(false); - ESP_LOGV(TAG, "Touch Pad '%s' state: OFF (timeout)", child->get_name().c_str()); - pads_off++; - } - } else { - // Pad is already off - pads_off++; - } - } - - // Disable the loop to save CPU cycles when all pads are off and not in setup mode. - // The loop will be re-enabled by the ISR when any touch pad is touched. - // v1 hardware limitations require us to check all pads are off because: - // - v1 only generates interrupts on touch events (not releases) - // - We must poll for release timeouts in the main loop - // - We can only safely disable when no pads need timeout monitoring - this->check_and_disable_loop_if_all_released_(pads_off); -} - -void ESP32TouchComponent::on_shutdown() { - touch_pad_intr_disable(); - touch_pad_isr_deregister(touch_isr_handler, this); - this->cleanup_touch_queue_(); - - if (this->iir_filter_enabled_()) { - touch_pad_filter_stop(); - touch_pad_filter_delete(); - } - - // Configure wakeup pads if any are set - this->configure_wakeup_pads_(); -} - -void IRAM_ATTR ESP32TouchComponent::touch_isr_handler(void *arg) { - ESP32TouchComponent *component = static_cast(arg); - - uint32_t mask = 0; - touch_ll_read_trigger_status_mask(&mask); - touch_ll_clear_trigger_status_mask(); - touch_pad_clear_status(); - - // INTERRUPT BEHAVIOR: On ESP32 v1 hardware, the interrupt fires when ANY configured - // touch pad detects a touch (value goes below threshold). The hardware does NOT - // generate interrupts on release - only on touch events. - // The interrupt will continue to fire periodically (based on sleep_cycle) as long - // as any pad remains touched. This allows us to detect both new touches and - // continued touches, but releases must be detected by timeout in the main loop. - - // Process all configured pads to check their current state - // Note: ESP32 v1 doesn't tell us which specific pad triggered the interrupt, - // so we must scan all configured pads to find which ones were touched - for (auto *child : component->children_) { - touch_pad_t pad = child->get_touch_pad(); - - // Read current value using ISR-safe API - // IMPORTANT: ESP-IDF v5.4 regression - touch_pad_read_filtered() is no longer ISR-safe - // In ESP-IDF v5.3 and earlier it was ISR-safe, but ESP-IDF v5.4 added mutex protection that causes: - // "assert failed: xQueueSemaphoreTake queue.c:1718" - // We must use raw values even when filter is enabled as a workaround. - // Users should adjust thresholds to compensate for the lack of IIR filtering. - // See: https://github.com/espressif/esp-idf/issues/17045 - uint32_t value = touch_ll_read_raw_data(pad); - - // Skip pads that aren’t in the trigger mask - if (((mask >> pad) & 1) == 0) { - continue; - } - - // IMPORTANT: ESP32 v1 touch detection logic - INVERTED compared to v2! - // ESP32 v1: Touch is detected when capacitance INCREASES, causing the measured value to DECREASE - // Therefore: touched = (value < threshold) - // This is opposite to ESP32-S2/S3 v2 where touched = (value > threshold) - bool is_touched = value < child->get_threshold(); - - // Always send the current state - the main loop will filter for changes - // We send both touched and untouched states because the ISR doesn't - // track previous state (to keep ISR fast and simple) - TouchPadEventV1 event; - event.pad = pad; - event.value = value; - event.is_touched = is_touched; - - // Send to queue from ISR - non-blocking, drops if queue full - BaseType_t x_higher_priority_task_woken = pdFALSE; - xQueueSendFromISR(component->touch_queue_, &event, &x_higher_priority_task_woken); - component->enable_loop_soon_any_context(); - if (x_higher_priority_task_woken) { - portYIELD_FROM_ISR(); - } - } -} - -} // namespace esp32_touch -} // namespace esphome - -#endif // USE_ESP32_VARIANT_ESP32 diff --git a/esphome/components/esp32_touch/esp32_touch_v2.cpp b/esphome/components/esp32_touch/esp32_touch_v2.cpp deleted file mode 100644 index b34ca1abd3..0000000000 --- a/esphome/components/esp32_touch/esp32_touch_v2.cpp +++ /dev/null @@ -1,402 +0,0 @@ -#if defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) - -#include "esp32_touch.h" -#include "esphome/core/application.h" -#include "esphome/core/log.h" -#include "esphome/core/hal.h" - -namespace esphome { -namespace esp32_touch { - -static const char *const TAG = "esp32_touch"; - -// Helper to update touch state with a known state and value -void ESP32TouchComponent::update_touch_state_(ESP32TouchBinarySensor *child, bool is_touched, uint32_t value) { - // Store the value for get_value() access in lambdas - child->value_ = value; - - // Always update timer when touched - if (is_touched) { - child->last_touch_time_ = App.get_loop_component_start_time(); - } - - if (child->last_state_ != is_touched) { - child->last_state_ = is_touched; - child->publish_state(is_touched); - if (is_touched) { - ESP_LOGV(TAG, "Touch Pad '%s' state: ON (value: %" PRIu32 " > threshold: %" PRIu32 ")", child->get_name().c_str(), - value, child->threshold_ + child->benchmark_); - } else { - ESP_LOGV(TAG, "Touch Pad '%s' state: OFF", child->get_name().c_str()); - } - } -} - -// Helper to read touch value and update state for a given child (used for timeout events) -bool ESP32TouchComponent::check_and_update_touch_state_(ESP32TouchBinarySensor *child) { - // Read current touch value - uint32_t value = this->read_touch_value(child->touch_pad_); - - // ESP32-S2/S3 v2: Touch is detected when value > threshold + benchmark - ESP_LOGV(TAG, - "Checking touch state for '%s' (T%d): value = %" PRIu32 ", threshold = %" PRIu32 ", benchmark = %" PRIu32, - child->get_name().c_str(), child->touch_pad_, value, child->threshold_, child->benchmark_); - bool is_touched = value > child->benchmark_ + child->threshold_; - - this->update_touch_state_(child, is_touched, value); - return is_touched; -} - -void ESP32TouchComponent::setup() { - // Create queue for touch events first - if (!this->create_touch_queue_()) { - return; - } - - // Initialize touch pad peripheral - esp_err_t init_err = touch_pad_init(); - if (init_err != ESP_OK) { - ESP_LOGE(TAG, "Failed to initialize touch pad: %s", esp_err_to_name(init_err)); - this->mark_failed(); - return; - } - - // Configure each touch pad first - for (auto *child : this->children_) { - esp_err_t config_err = touch_pad_config(child->touch_pad_); - if (config_err != ESP_OK) { - ESP_LOGE(TAG, "Failed to configure touch pad %d: %s", child->touch_pad_, esp_err_to_name(config_err)); - } - } - - // Set up filtering if configured - if (this->filter_configured_()) { - touch_filter_config_t filter_info = { - .mode = this->filter_mode_, - .debounce_cnt = this->debounce_count_, - .noise_thr = this->noise_threshold_, - .jitter_step = this->jitter_step_, - .smh_lvl = this->smooth_level_, - }; - touch_pad_filter_set_config(&filter_info); - touch_pad_filter_enable(); - } - - if (this->denoise_configured_()) { - touch_pad_denoise_t denoise = { - .grade = this->grade_, - .cap_level = this->cap_level_, - }; - touch_pad_denoise_set_config(&denoise); - touch_pad_denoise_enable(); - } - - if (this->waterproof_configured_()) { - touch_pad_waterproof_t waterproof = { - .guard_ring_pad = this->waterproof_guard_ring_pad_, - .shield_driver = this->waterproof_shield_driver_, - }; - touch_pad_waterproof_set_config(&waterproof); - touch_pad_waterproof_enable(); - } - - // Configure measurement parameters - touch_pad_set_voltage(this->high_voltage_reference_, this->low_voltage_reference_, this->voltage_attenuation_); - touch_pad_set_charge_discharge_times(this->meas_cycle_); - touch_pad_set_measurement_interval(this->sleep_cycle_); - - // Disable hardware timeout - it causes continuous interrupts with high-capacitance - // setups (e.g., pressure sensors under cushions). The periodic release check in - // loop() handles state detection reliably without needing hardware timeout. - touch_pad_timeout_set(false, TOUCH_PAD_THRESHOLD_MAX); - - // Register ISR handler with interrupt mask - esp_err_t err = - touch_pad_isr_register(touch_isr_handler, this, static_cast(TOUCH_PAD_INTR_MASK_ALL)); - if (err != ESP_OK) { - ESP_LOGE(TAG, "Failed to register touch ISR: %s", esp_err_to_name(err)); - this->cleanup_touch_queue_(); - this->mark_failed(); - return; - } - - // Set thresholds for each pad BEFORE starting FSM - for (auto *child : this->children_) { - if (child->threshold_ != 0) { - touch_pad_set_thresh(child->touch_pad_, child->threshold_); - } - } - - // Enable interrupts - only ACTIVE and TIMEOUT - // NOTE: We intentionally don't enable INACTIVE interrupts because they are unreliable - // on ESP32-S2/S3 hardware and sometimes don't fire. Instead, we use timeout-based - // release detection with the ability to verify the actual state. - touch_pad_intr_enable(static_cast(TOUCH_PAD_INTR_MASK_ACTIVE | TOUCH_PAD_INTR_MASK_TIMEOUT)); - - // Set FSM mode before starting - touch_pad_set_fsm_mode(TOUCH_FSM_MODE_TIMER); - - // Start FSM - touch_pad_fsm_start(); - - // Calculate release timeout based on sleep cycle - this->calculate_release_timeout_(); -} - -void ESP32TouchComponent::dump_config() { - this->dump_config_base_(); - - if (this->filter_configured_()) { - const char *filter_mode_s; - switch (this->filter_mode_) { - case TOUCH_PAD_FILTER_IIR_4: - filter_mode_s = "IIR_4"; - break; - case TOUCH_PAD_FILTER_IIR_8: - filter_mode_s = "IIR_8"; - break; - case TOUCH_PAD_FILTER_IIR_16: - filter_mode_s = "IIR_16"; - break; - case TOUCH_PAD_FILTER_IIR_32: - filter_mode_s = "IIR_32"; - break; - case TOUCH_PAD_FILTER_IIR_64: - filter_mode_s = "IIR_64"; - break; - case TOUCH_PAD_FILTER_IIR_128: - filter_mode_s = "IIR_128"; - break; - case TOUCH_PAD_FILTER_IIR_256: - filter_mode_s = "IIR_256"; - break; - case TOUCH_PAD_FILTER_JITTER: - filter_mode_s = "JITTER"; - break; - default: - filter_mode_s = "UNKNOWN"; - break; - } - ESP_LOGCONFIG(TAG, - " Filter mode: %s\n" - " Debounce count: %" PRIu32 "\n" - " Noise threshold coefficient: %" PRIu32 "\n" - " Jitter filter step size: %" PRIu32, - filter_mode_s, this->debounce_count_, this->noise_threshold_, this->jitter_step_); - const char *smooth_level_s; - switch (this->smooth_level_) { - case TOUCH_PAD_SMOOTH_OFF: - smooth_level_s = "OFF"; - break; - case TOUCH_PAD_SMOOTH_IIR_2: - smooth_level_s = "IIR_2"; - break; - case TOUCH_PAD_SMOOTH_IIR_4: - smooth_level_s = "IIR_4"; - break; - case TOUCH_PAD_SMOOTH_IIR_8: - smooth_level_s = "IIR_8"; - break; - default: - smooth_level_s = "UNKNOWN"; - break; - } - ESP_LOGCONFIG(TAG, " Smooth level: %s", smooth_level_s); - } - - if (this->denoise_configured_()) { - const char *grade_s; - switch (this->grade_) { - case TOUCH_PAD_DENOISE_BIT12: - grade_s = "BIT12"; - break; - case TOUCH_PAD_DENOISE_BIT10: - grade_s = "BIT10"; - break; - case TOUCH_PAD_DENOISE_BIT8: - grade_s = "BIT8"; - break; - case TOUCH_PAD_DENOISE_BIT4: - grade_s = "BIT4"; - break; - default: - grade_s = "UNKNOWN"; - break; - } - ESP_LOGCONFIG(TAG, " Denoise grade: %s", grade_s); - - const char *cap_level_s; - switch (this->cap_level_) { - case TOUCH_PAD_DENOISE_CAP_L0: - cap_level_s = "L0"; - break; - case TOUCH_PAD_DENOISE_CAP_L1: - cap_level_s = "L1"; - break; - case TOUCH_PAD_DENOISE_CAP_L2: - cap_level_s = "L2"; - break; - case TOUCH_PAD_DENOISE_CAP_L3: - cap_level_s = "L3"; - break; - case TOUCH_PAD_DENOISE_CAP_L4: - cap_level_s = "L4"; - break; - case TOUCH_PAD_DENOISE_CAP_L5: - cap_level_s = "L5"; - break; - case TOUCH_PAD_DENOISE_CAP_L6: - cap_level_s = "L6"; - break; - case TOUCH_PAD_DENOISE_CAP_L7: - cap_level_s = "L7"; - break; - default: - cap_level_s = "UNKNOWN"; - break; - } - ESP_LOGCONFIG(TAG, " Denoise capacitance level: %s", cap_level_s); - } - - if (this->setup_mode_) { - ESP_LOGCONFIG(TAG, " Setup Mode ENABLED"); - } - - this->dump_config_sensors_(); -} - -void ESP32TouchComponent::loop() { - const uint32_t now = App.get_loop_component_start_time(); - - // V2 TOUCH HANDLING: - // Due to unreliable INACTIVE interrupts on ESP32-S2/S3, we use a hybrid approach: - // 1. Process ACTIVE interrupts when pads are touched - // 2. Use timeout-based release detection (like v1) - // 3. But smarter than v1: verify actual state before releasing on timeout - // This prevents false releases if we missed interrupts - - // In setup mode, periodically log all pad values - this->process_setup_mode_logging_(now); - - // Process any queued touch events from interrupts - TouchPadEventV2 event; - while (xQueueReceive(this->touch_queue_, &event, 0) == pdTRUE) { - ESP_LOGD(TAG, "Event received, mask = 0x%" PRIx32 ", pad = %d", event.intr_mask, event.pad); - // Handle timeout events - if (event.intr_mask & TOUCH_PAD_INTR_MASK_TIMEOUT) { - // Resume measurement after timeout - touch_pad_timeout_resume(); - // For timeout events, always check the current state - } else if (!(event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE)) { - // Skip if not an active/timeout event - continue; - } - - // Find the child for the pad that triggered the interrupt - for (auto *child : this->children_) { - if (child->touch_pad_ == event.pad) { - if (event.intr_mask & TOUCH_PAD_INTR_MASK_TIMEOUT) { - // For timeout events, we need to read the value to determine state - this->check_and_update_touch_state_(child); - } else if (event.intr_mask & TOUCH_PAD_INTR_MASK_ACTIVE) { - // We only get ACTIVE interrupts now, releases are detected by timeout - // Read the current value - uint32_t value = this->read_touch_value(child->touch_pad_); - this->update_touch_state_(child, true, value); // Always touched for ACTIVE interrupts - } - break; - } - } - } - - // Check for released pads periodically (like v1) - if (!this->should_check_for_releases_(now)) { - return; - } - - size_t pads_off = 0; - for (auto *child : this->children_) { - child->ensure_benchmark_read(); - // Handle initial state publication after startup - this->publish_initial_state_if_needed_(child, now); - - if (child->last_state_) { - // Pad is currently in touched state - check for release timeout - // Using subtraction handles 32-bit rollover correctly - uint32_t time_diff = now - child->last_touch_time_; - - // Check if we haven't seen this pad recently - if (time_diff > this->release_timeout_ms_) { - // Haven't seen this pad recently - verify actual state - // Unlike v1, v2 hardware allows us to read the current state anytime - // This makes v2 smarter: we can verify if it's actually released before - // declaring a timeout, preventing false releases if interrupts were missed - bool still_touched = this->check_and_update_touch_state_(child); - - if (still_touched) { - // Still touched! Timer was reset in update_touch_state_ - ESP_LOGVV(TAG, "Touch Pad '%s' still touched after %" PRIu32 "ms timeout, resetting timer", - child->get_name().c_str(), this->release_timeout_ms_); - } else { - // Actually released - already handled by check_and_update_touch_state_ - pads_off++; - } - } - } else { - // Pad is already off - pads_off++; - } - } - - // Disable the loop when all pads are off and not in setup mode (like v1) - // We need to keep checking for timeouts, so only disable when all pads are confirmed off - this->check_and_disable_loop_if_all_released_(pads_off); -} - -void ESP32TouchComponent::on_shutdown() { - // Disable interrupts - touch_pad_intr_disable(TOUCH_PAD_INTR_MASK_ACTIVE); - touch_pad_isr_deregister(touch_isr_handler, this); - this->cleanup_touch_queue_(); - - // Configure wakeup pads if any are set - this->configure_wakeup_pads_(); -} - -void IRAM_ATTR ESP32TouchComponent::touch_isr_handler(void *arg) { - ESP32TouchComponent *component = static_cast(arg); - BaseType_t x_higher_priority_task_woken = pdFALSE; - - // Read interrupt status - TouchPadEventV2 event; - event.intr_mask = touch_pad_read_intr_status_mask(); - event.pad = touch_pad_get_current_meas_channel(); - - // Send event to queue for processing in main loop - xQueueSendFromISR(component->touch_queue_, &event, &x_higher_priority_task_woken); - component->enable_loop_soon_any_context(); - - if (x_higher_priority_task_woken) { - portYIELD_FROM_ISR(); - } -} - -uint32_t ESP32TouchComponent::read_touch_value(touch_pad_t pad) const { - // Unlike ESP32 v1, touch reads on ESP32-S2/S3 v2 are non-blocking operations. - // The hardware continuously samples in the background and we can read the - // latest value at any time without waiting. - uint32_t value = 0; - if (this->filter_configured_()) { - // Read filtered/smoothed value when filter is enabled - touch_pad_filter_read_smooth(pad, &value); - } else { - // Read raw value when filter is not configured - touch_pad_read_raw_data(pad, &value); - } - return value; -} - -} // namespace esp32_touch -} // namespace esphome - -#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 diff --git a/tests/components/esp32_touch/common-variants.yaml b/tests/components/esp32_touch/common-variants.yaml index 69a3dbd969..5d6d0bbd19 100644 --- a/tests/components/esp32_touch/common-variants.yaml +++ b/tests/components/esp32_touch/common-variants.yaml @@ -4,7 +4,6 @@ esp32_touch: measurement_duration: 8ms low_voltage_reference: 0.5V high_voltage_reference: 2.7V - voltage_attenuation: 1.5V binary_sensor: - platform: esp32_touch diff --git a/tests/components/esp32_touch/test.esp32-p4-idf.yaml b/tests/components/esp32_touch/test.esp32-p4-idf.yaml new file mode 100644 index 0000000000..ab5484af44 --- /dev/null +++ b/tests/components/esp32_touch/test.esp32-p4-idf.yaml @@ -0,0 +1,5 @@ +substitutions: + pin: GPIO5 + +<<: !include common-variants.yaml +<<: !include common-get-value.yaml From 07406c96e136b61a4521ba86c00325b96f65fc66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 26 Feb 2026 21:35:15 -1000 Subject: [PATCH 119/147] Bump actions/upload-artifact from 6.0.0 to 7.0.0 (#14326) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-api-proto.yml | 2 +- .github/workflows/ci.yml | 4 ++-- .github/workflows/release.yml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-api-proto.yml b/.github/workflows/ci-api-proto.yml index 0328611f5c..6d200956e9 100644 --- a/.github/workflows/ci-api-proto.yml +++ b/.github/workflows/ci-api-proto.yml @@ -62,7 +62,7 @@ jobs: run: git diff - if: failure() name: Archive artifacts - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: generated-proto-files path: | diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8718772f53..c2a93d37fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -822,7 +822,7 @@ jobs: fi - name: Upload memory analysis JSON - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: memory-analysis-target path: memory-analysis-target.json @@ -886,7 +886,7 @@ jobs: --platform "$platform" - name: Upload memory analysis JSON - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: memory-analysis-pr path: memory-analysis-pr.json diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 479b01ee37..0cca4dcaf6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -138,7 +138,7 @@ jobs: # version: ${{ needs.init.outputs.tag }} - name: Upload digests - uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: digests-${{ matrix.platform.arch }} path: /tmp/digests From bd3f8e006c40dfc5e64dc37f3f90e9bc2c4ec5ac Mon Sep 17 00:00:00 2001 From: whitty Date: Sat, 28 Feb 2026 03:02:29 +1100 Subject: [PATCH 120/147] [esp32_ble] allow setting of min/max key_size and auth_req_mode (#7138) Co-authored-by: J. Nick Koston Co-authored-by: J. Nick Koston --- esphome/components/esp32_ble/__init__.py | 52 +++++++++++++ esphome/components/esp32_ble/ble.cpp | 74 ++++++++++++++++++- esphome/components/esp32_ble/ble.h | 26 +++++++ esphome/core/defines.h | 1 + ...nded-auth-req-params-single.esp32-idf.yaml | 6 ++ ...st-extended-auth-req-params.esp32-idf.yaml | 5 ++ 6 files changed, 162 insertions(+), 2 deletions(-) create mode 100644 tests/components/esp32_ble/test-extended-auth-req-params-single.esp32-idf.yaml create mode 100644 tests/components/esp32_ble/test-extended-auth-req-params.esp32-idf.yaml diff --git a/esphome/components/esp32_ble/__init__.py b/esphome/components/esp32_ble/__init__.py index c0e2f78bde..8b368afc2e 100644 --- a/esphome/components/esp32_ble/__init__.py +++ b/esphome/components/esp32_ble/__init__.py @@ -21,6 +21,7 @@ from esphome.const import ( ) from esphome.core import CORE, CoroPriority, TimePeriod, coroutine_with_priority import esphome.final_validate as fv +from esphome.types import ConfigType DEPENDENCIES = ["esp32"] CODEOWNERS = ["@jesserockz", "@Rapsssito", "@bdraco"] @@ -188,6 +189,9 @@ def register_bt_logger(*loggers: BTLoggers) -> None: CONF_BLE_ID = "ble_id" CONF_IO_CAPABILITY = "io_capability" +CONF_AUTH_REQ_MODE = "auth_req_mode" +CONF_MAX_KEY_SIZE = "max_key_size" +CONF_MIN_KEY_SIZE = "min_key_size" CONF_ADVERTISING = "advertising" CONF_ADVERTISING_CYCLE_TIME = "advertising_cycle_time" CONF_DISABLE_BT_LOGS = "disable_bt_logs" @@ -238,6 +242,18 @@ IO_CAPABILITY = { "display_yes_no": IoCapability.IO_CAP_IO, } +AuthReqMode = esp32_ble_ns.enum("AuthReqMode") +AUTH_REQ_MODE = { + "no_bond": AuthReqMode.AUTH_REQ_NO_BOND, + "bond": AuthReqMode.AUTH_REQ_BOND, + "mitm": AuthReqMode.AUTH_REQ_MITM, + "bond_mitm": AuthReqMode.AUTH_REQ_BOND_MITM, + "sc_only": AuthReqMode.AUTH_REQ_SC_ONLY, + "sc_bond": AuthReqMode.AUTH_REQ_SC_BOND, + "sc_mitm": AuthReqMode.AUTH_REQ_SC_MITM, + "sc_mitm_bond": AuthReqMode.AUTH_REQ_SC_MITM_BOND, +} + esp_power_level_t = cg.global_ns.enum("esp_power_level_t") TX_POWER_LEVELS = { @@ -258,6 +274,10 @@ CONFIG_SCHEMA = cv.Schema( cv.Optional(CONF_IO_CAPABILITY, default="none"): cv.enum( IO_CAPABILITY, lower=True ), + # note: no defaults so we can action them not being present + cv.Optional(CONF_AUTH_REQ_MODE): cv.enum(AUTH_REQ_MODE, lower=True), + cv.Optional(CONF_MAX_KEY_SIZE): cv.int_range(min=7, max=16), + cv.Optional(CONF_MIN_KEY_SIZE): cv.int_range(min=7, max=16), cv.Optional(CONF_ENABLE_ON_BOOT, default=True): cv.boolean, cv.Optional(CONF_ADVERTISING, default=False): cv.boolean, cv.Optional( @@ -279,6 +299,23 @@ CONFIG_SCHEMA = cv.Schema( ).extend(cv.COMPONENT_SCHEMA) +def _validate_key_sizes(config: ConfigType) -> ConfigType: + if ( + CONF_MIN_KEY_SIZE in config + and CONF_MAX_KEY_SIZE in config + and config[CONF_MIN_KEY_SIZE] > config[CONF_MAX_KEY_SIZE] + ): + raise cv.Invalid( + f"min_key_size ({config[CONF_MIN_KEY_SIZE]}) must be " + f"less than or equal to " + f"max_key_size ({config[CONF_MAX_KEY_SIZE]})" + ) + return config + + +CONFIG_SCHEMA = cv.All(CONFIG_SCHEMA, _validate_key_sizes) + + bt_uuid16_format = "XXXX" bt_uuid32_format = "XXXXXXXX" bt_uuid128_format = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" @@ -487,6 +524,21 @@ async def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) cg.add(var.set_enable_on_boot(config[CONF_ENABLE_ON_BOOT])) cg.add(var.set_io_capability(config[CONF_IO_CAPABILITY])) + + if ( + CONF_AUTH_REQ_MODE in config + or CONF_MAX_KEY_SIZE in config + or CONF_MIN_KEY_SIZE in config + ): + cg.add_define("ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS", None) + + if CONF_AUTH_REQ_MODE in config: + cg.add(var.set_auth_req(config[CONF_AUTH_REQ_MODE])) + if CONF_MAX_KEY_SIZE in config: + cg.add(var.set_max_key_size(config[CONF_MAX_KEY_SIZE])) + if CONF_MIN_KEY_SIZE in config: + cg.add(var.set_min_key_size(config[CONF_MIN_KEY_SIZE])) + cg.add(var.set_advertising_cycle_time(config[CONF_ADVERTISING_CYCLE_TIME])) if (name := config.get(CONF_NAME)) is not None: cg.add(var.set_name(name)) diff --git a/esphome/components/esp32_ble/ble.cpp b/esphome/components/esp32_ble/ble.cpp index acbe9d88fc..9d26018800 100644 --- a/esphome/components/esp32_ble/ble.cpp +++ b/esphome/components/esp32_ble/ble.cpp @@ -296,12 +296,39 @@ bool ESP32BLE::ble_setup_() { return false; } - err = esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &(this->io_cap_), sizeof(uint8_t)); + err = esp_ble_gap_set_security_param(ESP_BLE_SM_IOCAP_MODE, &(this->io_cap_), sizeof(esp_ble_io_cap_t)); if (err != ESP_OK) { - ESP_LOGE(TAG, "esp_ble_gap_set_security_param failed: %d", err); + ESP_LOGE(TAG, "esp_ble_gap_set_security_param iocap_mode failed: %d", err); return false; } +#ifdef ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS + if (this->max_key_size_) { + err = esp_ble_gap_set_security_param(ESP_BLE_SM_MAX_KEY_SIZE, &(this->max_key_size_), sizeof(uint8_t)); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_ble_gap_set_security_param max_key_size failed: %d", err); + return false; + } + } + + if (this->min_key_size_) { + err = esp_ble_gap_set_security_param(ESP_BLE_SM_MIN_KEY_SIZE, &(this->min_key_size_), sizeof(uint8_t)); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_ble_gap_set_security_param min_key_size failed: %d", err); + return false; + } + } + + if (this->auth_req_mode_) { + err = esp_ble_gap_set_security_param(ESP_BLE_SM_AUTHEN_REQ_MODE, &(this->auth_req_mode_.value()), + sizeof(esp_ble_auth_req_t)); + if (err != ESP_OK) { + ESP_LOGE(TAG, "esp_ble_gap_set_security_param authen_req_mode failed: %d", err); + return false; + } + } +#endif // ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS + // BLE takes some time to be fully set up, 200ms should be more than enough delay(200); // NOLINT @@ -645,6 +672,7 @@ void ESP32BLE::dump_config() { io_capability_s = "invalid"; break; } + char mac_s[18]; format_mac_addr_upper(mac_address, mac_s); ESP_LOGCONFIG(TAG, @@ -652,6 +680,48 @@ void ESP32BLE::dump_config() { " MAC address: %s\n" " IO Capability: %s", mac_s, io_capability_s); + +#ifdef ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS + const char *auth_req_mode_s = ""; + if (this->auth_req_mode_) { + switch (this->auth_req_mode_.value()) { + case AUTH_REQ_NO_BOND: + auth_req_mode_s = "no_bond"; + break; + case AUTH_REQ_BOND: + auth_req_mode_s = "bond"; + break; + case AUTH_REQ_MITM: + auth_req_mode_s = "mitm"; + break; + case AUTH_REQ_BOND_MITM: + auth_req_mode_s = "bond_mitm"; + break; + case AUTH_REQ_SC_ONLY: + auth_req_mode_s = "sc_only"; + break; + case AUTH_REQ_SC_BOND: + auth_req_mode_s = "sc_bond"; + break; + case AUTH_REQ_SC_MITM: + auth_req_mode_s = "sc_mitm"; + break; + case AUTH_REQ_SC_MITM_BOND: + auth_req_mode_s = "sc_mitm_bond"; + break; + } + } + + ESP_LOGCONFIG(TAG, " Auth Req Mode: %s", auth_req_mode_s); + if (this->max_key_size_ && this->min_key_size_) { + ESP_LOGCONFIG(TAG, " Key Size: %u - %u", this->min_key_size_, this->max_key_size_); + } else if (this->max_key_size_) { + ESP_LOGCONFIG(TAG, " Key Size: - %u", this->max_key_size_); + } else if (this->min_key_size_) { + ESP_LOGCONFIG(TAG, " Key Size: %u - ", this->min_key_size_); + } +#endif // ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS + } else { ESP_LOGCONFIG(TAG, "Bluetooth stack is not enabled"); } diff --git a/esphome/components/esp32_ble/ble.h b/esphome/components/esp32_ble/ble.h index f1ab81b6dc..2ce17e97be 100644 --- a/esphome/components/esp32_ble/ble.h +++ b/esphome/components/esp32_ble/ble.h @@ -52,6 +52,19 @@ enum IoCapability { IO_CAP_KBDISP = ESP_IO_CAP_KBDISP, }; +#ifdef ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS +enum AuthReqMode { + AUTH_REQ_NO_BOND = ESP_LE_AUTH_NO_BOND, + AUTH_REQ_BOND = ESP_LE_AUTH_BOND, + AUTH_REQ_MITM = ESP_LE_AUTH_REQ_MITM, + AUTH_REQ_BOND_MITM = ESP_LE_AUTH_REQ_BOND_MITM, + AUTH_REQ_SC_ONLY = ESP_LE_AUTH_REQ_SC_ONLY, + AUTH_REQ_SC_BOND = ESP_LE_AUTH_REQ_SC_BOND, + AUTH_REQ_SC_MITM = ESP_LE_AUTH_REQ_SC_MITM, + AUTH_REQ_SC_MITM_BOND = ESP_LE_AUTH_REQ_SC_MITM_BOND, +}; +#endif + enum BLEComponentState : uint8_t { /** Nothing has been initialized yet. */ BLE_COMPONENT_STATE_OFF = 0, @@ -100,6 +113,12 @@ class ESP32BLE : public Component { public: void set_io_capability(IoCapability io_capability) { this->io_cap_ = (esp_ble_io_cap_t) io_capability; } +#ifdef ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS + void set_max_key_size(uint8_t key_size) { this->max_key_size_ = key_size; } + void set_min_key_size(uint8_t key_size) { this->min_key_size_ = key_size; } + void set_auth_req(AuthReqMode req) { this->auth_req_mode_ = (esp_ble_auth_req_t) req; } +#endif + void set_advertising_cycle_time(uint32_t advertising_cycle_time) { this->advertising_cycle_time_ = advertising_cycle_time; } @@ -209,6 +228,13 @@ class ESP32BLE : public Component { // 1-byte aligned members (grouped together to minimize padding) BLEComponentState state_{BLE_COMPONENT_STATE_OFF}; // 1 byte (uint8_t enum) bool enable_on_boot_{}; // 1 byte + +#ifdef ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS + optional auth_req_mode_; + + uint8_t max_key_size_{0}; // range is 7..16, 0 is unset + uint8_t min_key_size_{0}; // range is 7..16, 0 is unset +#endif }; // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 673aa246fe..9b55ae93b1 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -209,6 +209,7 @@ #define ESPHOME_ESP32_BLE_GATTC_EVENT_HANDLER_COUNT 1 #define ESPHOME_ESP32_BLE_GATTS_EVENT_HANDLER_COUNT 1 #define ESPHOME_ESP32_BLE_BLE_STATUS_EVENT_HANDLER_COUNT 2 +#define ESPHOME_ESP32_BLE_EXTENDED_AUTH_PARAMS #define ESPHOME_LOOP_TASK_STACK_SIZE 8192 #define USE_ESP32_CAMERA_JPEG_ENCODER #define USE_HTTP_REQUEST_RESPONSE diff --git a/tests/components/esp32_ble/test-extended-auth-req-params-single.esp32-idf.yaml b/tests/components/esp32_ble/test-extended-auth-req-params-single.esp32-idf.yaml new file mode 100644 index 0000000000..6e191c132f --- /dev/null +++ b/tests/components/esp32_ble/test-extended-auth-req-params-single.esp32-idf.yaml @@ -0,0 +1,6 @@ +esp32_ble: + io_capability: keyboard_display + # Explicitly not setting some parameters to test ifdef selection + # max_key_size: 16 + # min_key_size: 7 + auth_req_mode: sc_mitm_bond diff --git a/tests/components/esp32_ble/test-extended-auth-req-params.esp32-idf.yaml b/tests/components/esp32_ble/test-extended-auth-req-params.esp32-idf.yaml new file mode 100644 index 0000000000..f05b9bac96 --- /dev/null +++ b/tests/components/esp32_ble/test-extended-auth-req-params.esp32-idf.yaml @@ -0,0 +1,5 @@ +esp32_ble: + io_capability: keyboard_display + max_key_size: 16 + min_key_size: 7 + auth_req_mode: sc_mitm_bond From 0f7ac1726d9fea8cdb7ff481fbfcaa8b4b49620e Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 09:03:37 -0700 Subject: [PATCH 121/147] [core] Extend fast select optimization to LibreTiny platforms (#14254) Co-authored-by: Claude Opus 4.6 --- esphome/components/socket/__init__.py | 11 ++-- esphome/core/application.cpp | 43 ++++++++------- esphome/core/application.h | 27 +++++----- esphome/core/defines.h | 2 + esphome/core/lwip_fast_select.c | 54 +++++++++++-------- esphome/core/lwip_fast_select.h | 2 +- .../socket/test_wake_loop_threadsafe.py | 23 +++++--- 7 files changed, 100 insertions(+), 62 deletions(-) diff --git a/esphome/components/socket/__init__.py b/esphome/components/socket/__init__.py index 5f4d04eb44..a83648979c 100644 --- a/esphome/components/socket/__init__.py +++ b/esphome/components/socket/__init__.py @@ -149,9 +149,10 @@ def require_wake_loop_threadsafe() -> None: ): CORE.data[KEY_WAKE_LOOP_THREADSAFE_REQUIRED] = True cg.add_define("USE_WAKE_LOOP_THREADSAFE") - if not CORE.is_esp32: - # Only non-ESP32 platforms need a UDP socket for wake notifications. - # ESP32 uses FreeRTOS task notifications instead (no socket needed). + if not CORE.is_esp32 and not CORE.is_libretiny: + # Only platforms without fast select need a UDP socket for wake + # notifications. ESP32 and LibreTiny use FreeRTOS task notifications + # instead (no socket needed). consume_sockets(1, "socket.wake_loop_threadsafe", SocketType.UDP)({}) @@ -187,6 +188,10 @@ async def to_code(config): elif impl == IMPLEMENTATION_BSD_SOCKETS: cg.add_define("USE_SOCKET_IMPL_BSD_SOCKETS") cg.add_define("USE_SOCKET_SELECT_SUPPORT") + # ESP32 and LibreTiny both have LwIP >= 2.1.3 with lwip_socket_dbg_get_socket() + # and FreeRTOS task notifications — enable fast select to bypass lwip_select() + if CORE.is_esp32 or CORE.is_libretiny: + cg.add_define("USE_LWIP_FAST_SELECT") def FILTER_SOURCE_FILES() -> list[str]: diff --git a/esphome/core/application.cpp b/esphome/core/application.cpp index a9753da1b5..3bd4c1c670 100644 --- a/esphome/core/application.cpp +++ b/esphome/core/application.cpp @@ -9,10 +9,17 @@ #endif #ifdef USE_ESP32 #include +#endif +#ifdef USE_LWIP_FAST_SELECT #include "esphome/core/lwip_fast_select.h" +#ifdef USE_ESP32 #include #include +#else +#include +#include #endif +#endif // USE_LWIP_FAST_SELECT #include "esphome/core/version.h" #include "esphome/core/hal.h" #include @@ -147,14 +154,14 @@ void Application::setup() { clear_setup_priority_overrides(); #endif -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_ESP32) +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_LWIP_FAST_SELECT) // Initialize fast select: saves main loop task handle for xTaskNotifyGive wake. - // Always init on ESP32 — the fast path (rcvevent reads + ulTaskNotifyTake) is used - // unconditionally when USE_SOCKET_SELECT_SUPPORT is enabled. + // The fast path (rcvevent reads + ulTaskNotifyTake) is used unconditionally + // when USE_LWIP_FAST_SELECT is enabled (ESP32 and LibreTiny). esphome_lwip_fast_select_init(); #endif -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) - // Set up wake socket for waking main loop from tasks (non-ESP32 only) +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_LWIP_FAST_SELECT) + // Set up wake socket for waking main loop from tasks (platforms without fast select only) this->setup_wake_loop_threadsafe_(); #endif @@ -532,7 +539,7 @@ void Application::enable_pending_loops_() { } void Application::before_loop_tasks_(uint32_t loop_start_time) { -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_LWIP_FAST_SELECT) // Drain wake notifications first to clear socket for next wake this->drain_wake_notifications_(); #endif @@ -585,7 +592,7 @@ bool Application::register_socket_fd(int fd) { #endif this->socket_fds_.push_back(fd); -#ifdef USE_ESP32 +#ifdef USE_LWIP_FAST_SELECT // Hook the socket's netconn callback for instant wake on receive events esphome_lwip_hook_socket(fd); #else @@ -609,12 +616,13 @@ void Application::unregister_socket_fd(int fd) { continue; // Swap with last element and pop - O(1) removal since order doesn't matter. - // No need to unhook the netconn callback on ESP32 — all LwIP sockets share - // the same static event_callback, and the socket will be closed by the caller. + // No need to unhook the netconn callback on fast select platforms — all LwIP + // sockets share the same static event_callback, and the socket will be closed + // by the caller. if (i < this->socket_fds_.size() - 1) this->socket_fds_[i] = this->socket_fds_.back(); this->socket_fds_.pop_back(); -#ifndef USE_ESP32 +#ifndef USE_LWIP_FAST_SELECT this->socket_fds_changed_ = true; // Only recalculate max_fd if we removed the current max if (fd == this->max_fd_) { @@ -633,8 +641,8 @@ void Application::unregister_socket_fd(int fd) { void Application::yield_with_select_(uint32_t delay_ms) { // Delay while monitoring sockets. When delay_ms is 0, always yield() to ensure other tasks run. -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_ESP32) - // ESP32 fast path: reads rcvevent directly via lwip_socket_dbg_get_socket() (~215 ns per socket). +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_LWIP_FAST_SELECT) + // Fast path (ESP32/LibreTiny): reads rcvevent directly via lwip_socket_dbg_get_socket(). // Safe because this runs on the main loop which owns socket lifetime (create, read, close). if (delay_ms == 0) [[unlikely]] { yield(); @@ -659,9 +667,8 @@ void Application::yield_with_select_(uint32_t delay_ms) { ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(delay_ms)); #elif defined(USE_SOCKET_SELECT_SUPPORT) - // Non-ESP32 select() path (LibreTiny bk72xx/rtl87xx, host platform). - // ESP32 is excluded by the #if above — both BSD_SOCKETS and LWIP_SOCKETS on ESP32 - // use LwIP under the hood, so the fast path handles all ESP32 socket implementations. + // Fallback select() path (host platform and any future platforms without fast select). + // ESP32 and LibreTiny are excluded by the #if above — they use the fast path. if (!this->socket_fds_.empty()) [[likely]] { // Update fd_set if socket list has changed if (this->socket_fds_changed_) [[unlikely]] { @@ -725,12 +732,12 @@ alignas(Application) char app_storage[sizeof(Application)] asm("_ZN7esphome3AppE #if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) -#ifdef USE_ESP32 +#ifdef USE_LWIP_FAST_SELECT void Application::wake_loop_threadsafe() { // Direct FreeRTOS task notification — <1 us, task context only (NOT ISR-safe) esphome_lwip_wake_main_loop(); } -#else // !USE_ESP32 +#else // !USE_LWIP_FAST_SELECT void Application::setup_wake_loop_threadsafe_() { // Create UDP socket for wake notifications @@ -798,7 +805,7 @@ void Application::wake_loop_threadsafe() { lwip_send(this->wake_socket_fd_, &dummy, 1, 0); } } -#endif // USE_ESP32 +#endif // USE_LWIP_FAST_SELECT #endif // defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) diff --git a/esphome/core/application.h b/esphome/core/application.h index f5df5e7bdf..0cc29af8e7 100644 --- a/esphome/core/application.h +++ b/esphome/core/application.h @@ -24,7 +24,7 @@ #endif #ifdef USE_SOCKET_SELECT_SUPPORT -#ifdef USE_ESP32 +#ifdef USE_LWIP_FAST_SELECT #include "esphome/core/lwip_fast_select.h" #else #include @@ -511,10 +511,11 @@ class Application { #ifdef USE_SOCKET_SELECT_SUPPORT /// Fast path for Socket::ready() via friendship - skips negative fd check. - /// Main loop only — on ESP32, reads rcvevent via lwip_socket_dbg_get_socket() - /// which has no refcount; safe only because the main loop owns socket lifetime - /// (creates, reads, and closes sockets on the same thread). -#ifdef USE_ESP32 + /// Main loop only — with USE_LWIP_FAST_SELECT, reads rcvevent via + /// lwip_socket_dbg_get_socket(), which has no refcount; safe only because + /// the main loop owns socket lifetime (creates, reads, and closes sockets + /// on the same thread). +#ifdef USE_LWIP_FAST_SELECT bool is_socket_ready_(int fd) const { return esphome_lwip_socket_has_data(fd); } #else bool is_socket_ready_(int fd) const { return FD_ISSET(fd, &this->read_fds_); } @@ -546,7 +547,7 @@ class Application { /// Perform a delay while also monitoring socket file descriptors for readiness void yield_with_select_(uint32_t delay_ms); -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_LWIP_FAST_SELECT) void setup_wake_loop_threadsafe_(); // Create wake notification socket inline void drain_wake_notifications_(); // Read pending wake notifications in main loop (hot path - inlined) #endif @@ -576,7 +577,7 @@ class Application { FixedVector looping_components_{}; #ifdef USE_SOCKET_SELECT_SUPPORT std::vector socket_fds_; // Vector of all monitored socket file descriptors -#if defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) +#if defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_LWIP_FAST_SELECT) int wake_socket_fd_{-1}; // Shared wake notification socket for waking main loop from tasks #endif #endif @@ -589,7 +590,7 @@ class Application { uint32_t last_loop_{0}; uint32_t loop_component_start_time_{0}; -#if defined(USE_SOCKET_SELECT_SUPPORT) && !defined(USE_ESP32) +#if defined(USE_SOCKET_SELECT_SUPPORT) && !defined(USE_LWIP_FAST_SELECT) int max_fd_{-1}; // Highest file descriptor number for select() #endif @@ -605,12 +606,12 @@ class Application { bool in_loop_{false}; volatile bool has_pending_enable_loop_requests_{false}; -#if defined(USE_SOCKET_SELECT_SUPPORT) && !defined(USE_ESP32) +#if defined(USE_SOCKET_SELECT_SUPPORT) && !defined(USE_LWIP_FAST_SELECT) bool socket_fds_changed_{false}; // Flag to rebuild base_read_fds_ when socket_fds_ changes #endif -#if defined(USE_SOCKET_SELECT_SUPPORT) && !defined(USE_ESP32) - // Variable-sized members (not needed on ESP32 — is_socket_ready_ reads rcvevent directly) +#if defined(USE_SOCKET_SELECT_SUPPORT) && !defined(USE_LWIP_FAST_SELECT) + // Variable-sized members (not needed with fast select — is_socket_ready_ reads rcvevent directly) fd_set read_fds_{}; // Working fd_set: populated by select() fd_set base_read_fds_{}; // Cached fd_set rebuilt only when socket_fds_ changes #endif @@ -699,7 +700,7 @@ class Application { /// Global storage of Application pointer - only one Application can exist. extern Application App; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) +#if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_LWIP_FAST_SELECT) // Inline implementations for hot-path functions // drain_wake_notifications_() is called on every loop iteration @@ -721,6 +722,6 @@ inline void Application::drain_wake_notifications_() { } } } -#endif // defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_ESP32) +#endif // defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) && !defined(USE_LWIP_FAST_SELECT) } // namespace esphome diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 9b55ae93b1..5c982c94b1 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -222,6 +222,7 @@ #define USE_SENDSPIN_PORT 8928 // NOLINT #define USE_SOCKET_IMPL_BSD_SOCKETS #define USE_SOCKET_SELECT_SUPPORT +#define USE_LWIP_FAST_SELECT #define USE_WAKE_LOOP_THREADSAFE #define USE_SPEAKER #define USE_SPI @@ -330,6 +331,7 @@ #define USE_CAPTIVE_PORTAL #define USE_SOCKET_IMPL_LWIP_SOCKETS #define USE_SOCKET_SELECT_SUPPORT +#define USE_LWIP_FAST_SELECT #define USE_WEBSERVER #define USE_WEBSERVER_AUTH #define USE_WEBSERVER_PORT 80 // NOLINT diff --git a/esphome/core/lwip_fast_select.c b/esphome/core/lwip_fast_select.c index 70a6482d48..88cf23b67e 100644 --- a/esphome/core/lwip_fast_select.c +++ b/esphome/core/lwip_fast_select.c @@ -1,11 +1,12 @@ -// Fast socket monitoring for ESP32 (ESP-IDF LwIP) +// Fast socket monitoring for ESP32 and LibreTiny (LwIP >= 2.1.3) // Replaces lwip_select() with direct rcvevent reads and FreeRTOS task notifications. // // This must be a .c file (not .cpp) because: -// 1. lwip/priv/sockets_priv.h conflicts with C++ compilation units that include bootloader headers +// 1. lwip/priv/sockets_priv.h conflicts with C++ compilation units // 2. The netconn callback is a C function pointer // -// defines.h is force-included by the build system (-include flag), providing USE_ESP32 etc. +// USE_ESP32 and USE_LIBRETINY platform flags (-D) control compilation of this file. +// See the guard at the bottom of the header comment for details. // // Thread safety analysis // ====================== @@ -81,20 +82,21 @@ // Written by main loop in hook_socket(). Never restored — all LwIP sockets share // the same static event_callback (DEFAULT_SOCKET_EVENTCB), so the wrapper stays permanently. // Read by TCP/IP thread when invoking the callback. -// Safe: 32-bit aligned pointer writes are atomic on Xtensa and RISC-V (ESP32). -// The TCP/IP thread will see either the old or new pointer atomically — never a -// torn value. Both the wrapper and original callbacks are valid at all times -// (the wrapper itself calls the original), so either value is correct. +// Safe: 32-bit aligned pointer writes are atomic on Xtensa, RISC-V (ESP32), +// and ARM Cortex-M (LibreTiny). The TCP/IP thread will see either the old or +// new pointer atomically — never a torn value. Both the wrapper and original +// callbacks are valid at all times (the wrapper itself calls the original), +// so either value is correct. // // sock->rcvevent (s16_t, 2 bytes): // Written by TCP/IP thread in event_callback under SYS_ARCH_PROTECT. // Read by main loop in has_data() via volatile cast. -// Safe: SYS_ARCH_UNPROTECT releases a FreeRTOS mutex, which internally -// uses a critical section with memory barrier (rsync on dual-core Xtensa; on -// single-core builds the spinlock is compiled out, but cross-core visibility is -// not an issue). The volatile cast prevents the compiler -// from caching the read. Aligned 16-bit reads are single-instruction loads on -// Xtensa (L16SI) and RISC-V (LH), which cannot produce torn values. +// Safe: SYS_ARCH_UNPROTECT releases a FreeRTOS mutex (ESP32) or resumes the +// scheduler (LibreTiny), both providing a memory barrier. The volatile cast +// prevents the compiler from caching the read. Aligned 16-bit reads are +// single-instruction loads on Xtensa (L16SI), RISC-V (LH), and ARM Cortex-M +// (LDRH), which cannot produce torn values. On single-core chips (LibreTiny, +// ESP32-C3/C6/H2) cross-core visibility is not an issue. // // FreeRTOS task notification value: // Written by TCP/IP thread (xTaskNotifyGive in callback) and background tasks @@ -103,20 +105,30 @@ // critical sections). Multiple concurrent xTaskNotifyGive calls are safe — // the notification count simply increments. -#ifdef USE_ESP32 +// USE_ESP32 and USE_LIBRETINY are compiler -D flags, so they are always visible in this .c file. +// Feature macros like USE_LWIP_FAST_SELECT may come from generated headers that are not included here, +// so this implementation is enabled based on platform flags instead of USE_LWIP_FAST_SELECT. +#if defined(USE_ESP32) || defined(USE_LIBRETINY) // LwIP headers must come first — they define netconn_callback, struct lwip_sock, etc. #include #include +// FreeRTOS include paths differ: ESP-IDF uses freertos/ prefix, LibreTiny does not +#ifdef USE_ESP32 #include #include +#else +#include +#include +#endif #include "esphome/core/lwip_fast_select.h" #include // Compile-time verification of thread safety assumptions. -// On ESP32 (Xtensa/RISC-V), naturally-aligned reads/writes up to 32 bits are atomic. +// On ESP32 (Xtensa/RISC-V) and LibreTiny (ARM Cortex-M), naturally-aligned +// reads/writes up to 32 bits are atomic. // These asserts ensure our cross-thread shared state meets those requirements. // Pointer types must fit in a single 32-bit store (atomic write) @@ -126,7 +138,7 @@ _Static_assert(sizeof(netconn_callback) <= 4, "netconn_callback must be <= 4 byt // rcvevent must fit in a single atomic read _Static_assert(sizeof(((struct lwip_sock *) 0)->rcvevent) <= 4, "rcvevent must be <= 4 bytes for atomic access"); -// Struct member alignment — natural alignment guarantees atomicity on Xtensa/RISC-V. +// Struct member alignment — natural alignment guarantees atomicity on Xtensa/RISC-V/ARM. // Misaligned access would not be atomic even if the size is <= 4 bytes. _Static_assert(offsetof(struct netconn, callback) % sizeof(netconn_callback) == 0, "netconn.callback must be naturally aligned for atomic access"); @@ -183,9 +195,9 @@ bool esphome_lwip_socket_has_data(int fd) { return false; // volatile prevents the compiler from caching/reordering this cross-thread read. // The write side (TCP/IP thread) commits via SYS_ARCH_UNPROTECT which releases a - // FreeRTOS mutex with a memory barrier (rsync on Xtensa), ensuring the value is - // visible. Aligned 16-bit reads are single-instruction loads (L16SI/LH) on - // Xtensa/RISC-V and cannot produce torn values. + // FreeRTOS mutex (ESP32) or resumes the scheduler (LibreTiny), ensuring the value + // is visible. Aligned 16-bit reads are single-instruction loads (L16SI/LH/LDRH) on + // Xtensa/RISC-V/ARM and cannot produce torn values. return *(volatile s16_t *) &sock->rcvevent > 0; } @@ -200,7 +212,7 @@ void esphome_lwip_hook_socket(int fd) { s_original_callback = sock->conn->callback; } - // Replace with our wrapper. Atomic on ESP32 (32-bit aligned pointer write). + // Replace with our wrapper. Atomic on all supported platforms (32-bit aligned pointer write). // TCP/IP thread sees either old or new pointer — both are valid. sock->conn->callback = esphome_socket_event_callback; } @@ -213,4 +225,4 @@ void esphome_lwip_wake_main_loop(void) { } } -#endif // USE_ESP32 +#endif // defined(USE_ESP32) || defined(USE_LIBRETINY) diff --git a/esphome/core/lwip_fast_select.h b/esphome/core/lwip_fast_select.h index 73a89fdc3d..b08c946212 100644 --- a/esphome/core/lwip_fast_select.h +++ b/esphome/core/lwip_fast_select.h @@ -1,6 +1,6 @@ #pragma once -// Fast socket monitoring for ESP32 (ESP-IDF LwIP) +// Fast socket monitoring for ESP32 and LibreTiny (LwIP >= 2.1.3) // Replaces lwip_select() with direct rcvevent reads and FreeRTOS task notifications. #include diff --git a/tests/components/socket/test_wake_loop_threadsafe.py b/tests/components/socket/test_wake_loop_threadsafe.py index 28b4ee564f..0434b3e1b5 100644 --- a/tests/components/socket/test_wake_loop_threadsafe.py +++ b/tests/components/socket/test_wake_loop_threadsafe.py @@ -1,9 +1,14 @@ +import pytest + from esphome.components import socket from esphome.const import ( KEY_CORE, KEY_TARGET_PLATFORM, + PLATFORM_BK72XX, PLATFORM_ESP32, PLATFORM_ESP8266, + PLATFORM_LN882X, + PLATFORM_RTL87XX, ) from esphome.core import CORE @@ -90,9 +95,15 @@ def test_require_wake_loop_threadsafe__no_networking_does_not_consume_socket() - assert udp_consumers == initial_udp -def test_require_wake_loop_threadsafe__esp32_no_udp_socket() -> None: - """Test that ESP32 uses task notifications instead of UDP socket.""" - _setup_platform(PLATFORM_ESP32) +@pytest.mark.parametrize( + "platform", + [PLATFORM_ESP32, PLATFORM_BK72XX, PLATFORM_RTL87XX, PLATFORM_LN882X], +) +def test_require_wake_loop_threadsafe__fast_select_no_udp_socket( + platform: str, +) -> None: + """Test that fast select platforms use task notifications instead of UDP socket.""" + _setup_platform(platform) CORE.config = {"wifi": True} socket.require_wake_loop_threadsafe() @@ -100,13 +111,13 @@ def test_require_wake_loop_threadsafe__esp32_no_udp_socket() -> None: assert CORE.data[socket.KEY_WAKE_LOOP_THREADSAFE_REQUIRED] is True assert any(d.name == "USE_WAKE_LOOP_THREADSAFE" for d in CORE.defines) - # Verify no UDP socket was consumed (ESP32 uses FreeRTOS task notifications) + # Verify no UDP socket was consumed (fast select platforms use FreeRTOS task notifications) udp_consumers = CORE.data.get(socket.KEY_SOCKET_CONSUMERS_UDP, {}) assert "socket.wake_loop_threadsafe" not in udp_consumers -def test_require_wake_loop_threadsafe__non_esp32_consumes_udp_socket() -> None: - """Test that non-ESP32 platforms consume a UDP socket for wake notifications.""" +def test_require_wake_loop_threadsafe__non_fast_select_consumes_udp_socket() -> None: + """Test that platforms without fast select consume a UDP socket for wake notifications.""" _setup_platform(PLATFORM_ESP8266) CORE.config = {"wifi": True} socket.require_wake_loop_threadsafe() From ef9fc87351a288293c0ad3e9ab59c7788af8db09 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Fri, 27 Feb 2026 11:17:04 -0500 Subject: [PATCH 122/147] [zigbee] Fix codegen ordering for basic/identify attribute lists (#14343) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/zigbee/__init__.py | 3 ++- esphome/components/zigbee/zigbee_zephyr.py | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/esphome/components/zigbee/__init__.py b/esphome/components/zigbee/__init__.py index 7e917a9d70..a327cc2988 100644 --- a/esphome/components/zigbee/__init__.py +++ b/esphome/components/zigbee/__init__.py @@ -8,7 +8,7 @@ from esphome.components.zephyr import zephyr_add_pm_static, zephyr_data from esphome.components.zephyr.const import KEY_BOOTLOADER import esphome.config_validation as cv from esphome.const import CONF_ID, CONF_INTERNAL, CONF_NAME -from esphome.core import CORE +from esphome.core import CORE, CoroPriority, coroutine_with_priority from esphome.types import ConfigType from .const_zephyr import ( @@ -96,6 +96,7 @@ FINAL_VALIDATE_SCHEMA = cv.All( ) +@coroutine_with_priority(CoroPriority.CORE) async def to_code(config: ConfigType) -> None: cg.add_define("USE_ZIGBEE") if CORE.using_zephyr: diff --git a/esphome/components/zigbee/zigbee_zephyr.py b/esphome/components/zigbee/zigbee_zephyr.py index 0b6daa9476..a1e6ad3097 100644 --- a/esphome/components/zigbee/zigbee_zephyr.py +++ b/esphome/components/zigbee/zigbee_zephyr.py @@ -179,6 +179,13 @@ async def zephyr_to_code(config: ConfigType) -> None: "USE_ZIGBEE_WIPE_ON_BOOT_MAGIC", random.randint(0x000001, 0xFFFFFF) ) cg.add_define("USE_ZIGBEE_WIPE_ON_BOOT") + + # Generate attribute lists before any await that could yield (e.g., build_automation + # waiting for variables from other components). If the hub's priority decays while + # yielding, deferred entity jobs may add cluster list globals that reference these + # attribute lists before they're declared. + await _attr_to_code(config) + var = cg.new_Pvariable(config[CONF_ID]) if on_join_config := config.get(CONF_ON_JOIN): @@ -186,7 +193,6 @@ async def zephyr_to_code(config: ConfigType) -> None: await cg.register_component(var, config) - await _attr_to_code(config) CORE.add_job(_ctx_to_code, config) From 017d1b2872b9ad85bf5b8a2fb563d14ff517975c Mon Sep 17 00:00:00 2001 From: Kevin Ahrendt Date: Fri, 27 Feb 2026 11:12:50 -0600 Subject: [PATCH 123/147] [audio] Bump microOpus to v0.3.4 (#14346) --- esphome/components/audio/__init__.py | 2 +- esphome/idf_component.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/audio/__init__.py b/esphome/components/audio/__init__.py index d8d426ec63..d95fcf66d7 100644 --- a/esphome/components/audio/__init__.py +++ b/esphome/components/audio/__init__.py @@ -214,4 +214,4 @@ async def to_code(config): cg.add_define("USE_AUDIO_MP3_SUPPORT") if data.opus_support: cg.add_define("USE_AUDIO_OPUS_SUPPORT") - add_idf_component(name="esphome/micro-opus", ref="0.3.3") + add_idf_component(name="esphome/micro-opus", ref="0.3.4") diff --git a/esphome/idf_component.yml b/esphome/idf_component.yml index 83b2d9d95c..37bda65afd 100644 --- a/esphome/idf_component.yml +++ b/esphome/idf_component.yml @@ -4,7 +4,7 @@ dependencies: esphome/esp-audio-libs: version: 2.0.3 esphome/micro-opus: - version: 0.3.3 + version: 0.3.4 espressif/esp-tflite-micro: version: 1.3.3~1 espressif/esp32-camera: From 20314b4d63ee07d97840c821cf1ca0003393a339 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 10:20:08 -0700 Subject: [PATCH 124/147] [mdns] Update espressif/mdns to v1.10.0 (#14338) --- esphome/components/mdns/__init__.py | 2 +- esphome/idf_component.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/mdns/__init__.py b/esphome/components/mdns/__init__.py index 420e6a60e3..0d535d6970 100644 --- a/esphome/components/mdns/__init__.py +++ b/esphome/components/mdns/__init__.py @@ -163,7 +163,7 @@ async def to_code(config): cg.add_library("LEAmDNS", None) if CORE.is_esp32: - add_idf_component(name="espressif/mdns", ref="1.9.1") + add_idf_component(name="espressif/mdns", ref="1.10.0") cg.add_define("USE_MDNS") diff --git a/esphome/idf_component.yml b/esphome/idf_component.yml index 37bda65afd..550e7b9af7 100644 --- a/esphome/idf_component.yml +++ b/esphome/idf_component.yml @@ -10,7 +10,7 @@ dependencies: espressif/esp32-camera: version: 2.1.1 espressif/mdns: - version: 1.9.1 + version: 1.10.0 espressif/esp_wifi_remote: version: 1.3.2 rules: From 72ca514cc2650e641faa774a7d43a81dcdf6fb98 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Fri, 27 Feb 2026 17:25:53 +0000 Subject: [PATCH 125/147] [esp32_hosted] Add configurable SDIO clock frequency (#14319) Co-authored-by: pre-commit-ci-lite[bot] <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Co-authored-by: Deirdre Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> --- esphome/components/esp32_hosted/__init__.py | 8 ++++++++ .../test-sdio-speed.esp32-p4-idf.yaml | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 tests/components/esp32_hosted/test-sdio-speed.esp32-p4-idf.yaml diff --git a/esphome/components/esp32_hosted/__init__.py b/esphome/components/esp32_hosted/__init__.py index 287c780769..720d81acc4 100644 --- a/esphome/components/esp32_hosted/__init__.py +++ b/esphome/components/esp32_hosted/__init__.py @@ -23,6 +23,7 @@ CONF_D1_PIN = "d1_pin" CONF_D2_PIN = "d2_pin" CONF_D3_PIN = "d3_pin" CONF_SLOT = "slot" +CONF_SDIO_FREQUENCY = "sdio_frequency" CONFIG_SCHEMA = cv.All( cv.Schema( @@ -37,6 +38,9 @@ CONFIG_SCHEMA = cv.All( cv.Required(CONF_D3_PIN): pins.internal_gpio_output_pin_number, cv.Required(CONF_RESET_PIN): pins.internal_gpio_output_pin_number, cv.Optional(CONF_SLOT, default=1): cv.int_range(min=0, max=1), + cv.Optional(CONF_SDIO_FREQUENCY, default="40MHz"): cv.All( + cv.frequency, cv.Range(min=400e3, max=50e6) + ), } ), ) @@ -91,6 +95,10 @@ async def to_code(config): config[CONF_D3_PIN], ) esp32.add_idf_sdkconfig_option("CONFIG_ESP_HOSTED_CUSTOM_SDIO_PINS", True) + esp32.add_idf_sdkconfig_option( + "CONFIG_ESP_HOSTED_SDIO_CLOCK_FREQ_KHZ", + int(config[CONF_SDIO_FREQUENCY] // 1000), + ) framework_ver: cv.Version = CORE.data[KEY_CORE][KEY_FRAMEWORK_VERSION] os.environ["ESP_IDF_VERSION"] = f"{framework_ver.major}.{framework_ver.minor}" diff --git a/tests/components/esp32_hosted/test-sdio-speed.esp32-p4-idf.yaml b/tests/components/esp32_hosted/test-sdio-speed.esp32-p4-idf.yaml new file mode 100644 index 0000000000..9268c9ae41 --- /dev/null +++ b/tests/components/esp32_hosted/test-sdio-speed.esp32-p4-idf.yaml @@ -0,0 +1,16 @@ +esp32_hosted: + variant: ESP32C6 + slot: 1 + active_high: true + reset_pin: GPIO15 + cmd_pin: GPIO13 + clk_pin: GPIO12 + d0_pin: GPIO11 + d1_pin: GPIO10 + d2_pin: GPIO9 + d3_pin: GPIO8 + sdio_frequency: 8MHz + +wifi: + ssid: MySSID + password: password1 From 1c7f769ec7f54775c3d31f426dcfbb14f66a911f Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 10:48:21 -0700 Subject: [PATCH 126/147] [core] Add millis_64() HAL function with native ESP32 implementation (#14339) --- esphome/components/esp32/core.cpp | 1 + esphome/components/esp8266/core.cpp | 2 ++ esphome/components/host/core.cpp | 2 ++ esphome/components/libretiny/core.cpp | 2 ++ esphome/components/rp2040/core.cpp | 2 ++ .../uptime/sensor/uptime_seconds_sensor.cpp | 4 +-- .../uptime/text_sensor/uptime_text_sensor.cpp | 4 +-- esphome/components/web_server/web_server.cpp | 4 +-- esphome/components/zephyr/core.cpp | 2 ++ esphome/core/hal.h | 1 + esphome/core/scheduler.cpp | 34 ++++++++++-------- esphome/core/scheduler.h | 35 +++++++++++++++---- 12 files changed, 66 insertions(+), 27 deletions(-) diff --git a/esphome/components/esp32/core.cpp b/esphome/components/esp32/core.cpp index 202d929ab9..b9ae871abf 100644 --- a/esphome/components/esp32/core.cpp +++ b/esphome/components/esp32/core.cpp @@ -23,6 +23,7 @@ namespace esphome { void HOT yield() { vPortYield(); } uint32_t IRAM_ATTR HOT millis() { return (uint32_t) (esp_timer_get_time() / 1000ULL); } +uint64_t HOT millis_64() { return static_cast(esp_timer_get_time()) / 1000ULL; } void HOT delay(uint32_t ms) { vTaskDelay(ms / portTICK_PERIOD_MS); } uint32_t IRAM_ATTR HOT micros() { return (uint32_t) esp_timer_get_time(); } void IRAM_ATTR HOT delayMicroseconds(uint32_t us) { delay_microseconds_safe(us); } diff --git a/esphome/components/esp8266/core.cpp b/esphome/components/esp8266/core.cpp index 236d3022be..497e99b61f 100644 --- a/esphome/components/esp8266/core.cpp +++ b/esphome/components/esp8266/core.cpp @@ -3,6 +3,7 @@ #include "core.h" #include "esphome/core/defines.h" #include "esphome/core/hal.h" +#include "esphome/core/application.h" #include "esphome/core/helpers.h" #include "preferences.h" #include @@ -16,6 +17,7 @@ namespace esphome { void HOT yield() { ::yield(); } uint32_t IRAM_ATTR HOT millis() { return ::millis(); } +uint64_t millis_64() { return App.scheduler.millis_64_impl_(::millis()); } void HOT delay(uint32_t ms) { ::delay(ms); } uint32_t IRAM_ATTR HOT micros() { return ::micros(); } void IRAM_ATTR HOT delayMicroseconds(uint32_t us) { delay_microseconds_safe(us); } diff --git a/esphome/components/host/core.cpp b/esphome/components/host/core.cpp index c20a33fa37..5c08717ac9 100644 --- a/esphome/components/host/core.cpp +++ b/esphome/components/host/core.cpp @@ -1,5 +1,6 @@ #ifdef USE_HOST +#include "esphome/core/application.h" #include "esphome/core/hal.h" #include "esphome/core/helpers.h" #include "preferences.h" @@ -19,6 +20,7 @@ uint32_t IRAM_ATTR HOT millis() { uint32_t ms = round(spec.tv_nsec / 1e6); return ((uint32_t) seconds) * 1000U + ms; } +uint64_t millis_64() { return App.scheduler.millis_64_impl_(millis()); } void HOT delay(uint32_t ms) { struct timespec ts; ts.tv_sec = ms / 1000; diff --git a/esphome/components/libretiny/core.cpp b/esphome/components/libretiny/core.cpp index 4dda7c3856..6cbc81938d 100644 --- a/esphome/components/libretiny/core.cpp +++ b/esphome/components/libretiny/core.cpp @@ -3,6 +3,7 @@ #include "core.h" #include "esphome/core/defines.h" #include "esphome/core/hal.h" +#include "esphome/core/application.h" #include "esphome/core/helpers.h" #include "preferences.h" @@ -13,6 +14,7 @@ namespace esphome { void HOT yield() { ::yield(); } uint32_t IRAM_ATTR HOT millis() { return ::millis(); } +uint64_t millis_64() { return App.scheduler.millis_64_impl_(::millis()); } uint32_t IRAM_ATTR HOT micros() { return ::micros(); } void HOT delay(uint32_t ms) { ::delay(ms); } void IRAM_ATTR HOT delayMicroseconds(uint32_t us) { ::delayMicroseconds(us); } diff --git a/esphome/components/rp2040/core.cpp b/esphome/components/rp2040/core.cpp index 37378d88bb..52c6f1185c 100644 --- a/esphome/components/rp2040/core.cpp +++ b/esphome/components/rp2040/core.cpp @@ -3,6 +3,7 @@ #include "core.h" #include "esphome/core/defines.h" #include "esphome/core/hal.h" +#include "esphome/core/application.h" #include "esphome/core/helpers.h" #include "hardware/watchdog.h" @@ -11,6 +12,7 @@ namespace esphome { void HOT yield() { ::yield(); } uint32_t IRAM_ATTR HOT millis() { return ::millis(); } +uint64_t millis_64() { return App.scheduler.millis_64_impl_(::millis()); } void HOT delay(uint32_t ms) { ::delay(ms); } uint32_t IRAM_ATTR HOT micros() { return ::micros(); } void IRAM_ATTR HOT delayMicroseconds(uint32_t us) { delay_microseconds_safe(us); } diff --git a/esphome/components/uptime/sensor/uptime_seconds_sensor.cpp b/esphome/components/uptime/sensor/uptime_seconds_sensor.cpp index 20e8ed8fda..552e4e5da4 100644 --- a/esphome/components/uptime/sensor/uptime_seconds_sensor.cpp +++ b/esphome/components/uptime/sensor/uptime_seconds_sensor.cpp @@ -1,6 +1,6 @@ #include "uptime_seconds_sensor.h" -#include "esphome/core/application.h" +#include "esphome/core/hal.h" #include "esphome/core/log.h" namespace esphome::uptime { @@ -8,7 +8,7 @@ namespace esphome::uptime { static const char *const TAG = "uptime.sensor"; void UptimeSecondsSensor::update() { - const uint64_t uptime = App.scheduler.millis_64(); + const uint64_t uptime = millis_64(); const uint64_t seconds_int = uptime / 1000ULL; const float seconds = float(seconds_int) + (uptime % 1000ULL) / 1000.0f; this->publish_state(seconds); diff --git a/esphome/components/uptime/text_sensor/uptime_text_sensor.cpp b/esphome/components/uptime/text_sensor/uptime_text_sensor.cpp index 88ae53fbfc..c89d23672e 100644 --- a/esphome/components/uptime/text_sensor/uptime_text_sensor.cpp +++ b/esphome/components/uptime/text_sensor/uptime_text_sensor.cpp @@ -1,6 +1,6 @@ #include "uptime_text_sensor.h" -#include "esphome/core/application.h" +#include "esphome/core/hal.h" #include "esphome/core/helpers.h" #include "esphome/core/log.h" @@ -19,7 +19,7 @@ static void append_unit(char *buf, size_t buf_size, size_t &pos, const char *sep void UptimeTextSensor::setup() { this->update(); } void UptimeTextSensor::update() { - uint32_t uptime = static_cast(App.scheduler.millis_64() / 1000); + uint32_t uptime = static_cast(millis_64() / 1000); unsigned interval = this->get_update_interval() / 1000; // Calculate all time units diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp index e2f9c21331..16674321c9 100644 --- a/esphome/components/web_server/web_server.cpp +++ b/esphome/components/web_server/web_server.cpp @@ -385,7 +385,7 @@ json::SerializationBuffer<> WebServer::get_config_json() { #endif root[ESPHOME_F("log")] = this->expose_log_; root[ESPHOME_F("lang")] = "en"; - root[ESPHOME_F("uptime")] = static_cast(App.scheduler.millis_64() / 1000); + root[ESPHOME_F("uptime")] = static_cast(millis_64() / 1000); return builder.serialize(); } @@ -414,7 +414,7 @@ void WebServer::setup() { // getting a lot of events this->set_interval(10000, [this]() { char buf[32]; - auto uptime = static_cast(App.scheduler.millis_64() / 1000); + auto uptime = static_cast(millis_64() / 1000); buf_append_printf(buf, sizeof(buf), 0, "{\"uptime\":%u}", uptime); this->events_.try_send_nodefer(buf, "ping", millis(), 30000); }); diff --git a/esphome/components/zephyr/core.cpp b/esphome/components/zephyr/core.cpp index d7027b33f5..7f5d6d44fa 100644 --- a/esphome/components/zephyr/core.cpp +++ b/esphome/components/zephyr/core.cpp @@ -4,6 +4,7 @@ #include #include #include +#include "esphome/core/application.h" #include "esphome/core/hal.h" #include "esphome/core/helpers.h" #include "esphome/core/defines.h" @@ -17,6 +18,7 @@ static const device *const WDT = DEVICE_DT_GET(DT_ALIAS(watchdog0)); void yield() { ::k_yield(); } uint32_t millis() { return k_ticks_to_ms_floor32(k_uptime_ticks()); } +uint64_t millis_64() { return App.scheduler.millis_64_impl_(millis()); } uint32_t micros() { return k_ticks_to_us_floor32(k_uptime_ticks()); } void delayMicroseconds(uint32_t us) { ::k_usleep(us); } void delay(uint32_t ms) { ::k_msleep(ms); } diff --git a/esphome/core/hal.h b/esphome/core/hal.h index 1a4230e421..fa5ca646f2 100644 --- a/esphome/core/hal.h +++ b/esphome/core/hal.h @@ -32,6 +32,7 @@ namespace esphome { void yield(); uint32_t millis(); +uint64_t millis_64(); uint32_t micros(); void delay(uint32_t ms); void delayMicroseconds(uint32_t us); // NOLINT(readability-identifier-naming) diff --git a/esphome/core/scheduler.cpp b/esphome/core/scheduler.cpp index d9c66b2000..06c0bb8b1b 100644 --- a/esphome/core/scheduler.cpp +++ b/esphome/core/scheduler.cpp @@ -28,8 +28,10 @@ static constexpr size_t MAX_POOL_SIZE = 5; // Set to 5 to match the pool size - when we have as many cancelled items as our // pool can hold, it's time to clean up and recycle them. static constexpr uint32_t MAX_LOGICALLY_DELETED_ITEMS = 5; +#ifndef USE_ESP32 // Half the 32-bit range - used to detect rollovers vs normal time progression static constexpr uint32_t HALF_MAX_UINT32 = std::numeric_limits::max() / 2; +#endif // max delay to start an interval sequence static constexpr uint32_t MAX_INTERVAL_DELAY = 5000; @@ -150,8 +152,8 @@ void HOT Scheduler::set_timer_common_(Component *component, SchedulerItem::Type return; } - // Get fresh timestamp BEFORE taking lock - millis_64_ may need to acquire lock itself - const uint64_t now = this->millis_64_(millis()); + // Get fresh 64-bit timestamp BEFORE taking lock + const uint64_t now_64 = millis_64(); // Take lock early to protect scheduler_item_pool_ access LockGuard guard{this->lock_}; @@ -184,7 +186,7 @@ void HOT Scheduler::set_timer_common_(Component *component, SchedulerItem::Type item->interval = delay; // first execution happens immediately after a random smallish offset uint32_t offset = this->calculate_interval_offset_(delay); - item->set_next_execution(now + offset); + item->set_next_execution(now_64 + offset); #ifdef ESPHOME_LOG_HAS_VERBOSE SchedulerNameLog name_log; ESP_LOGV(TAG, "Scheduler interval for %s is %" PRIu32 "ms, offset %" PRIu32 "ms", @@ -192,11 +194,11 @@ void HOT Scheduler::set_timer_common_(Component *component, SchedulerItem::Type #endif } else { item->interval = 0; - item->set_next_execution(now + delay); + item->set_next_execution(now_64 + delay); } #ifdef ESPHOME_DEBUG_SCHEDULER - this->debug_log_timer_(item.get(), name_type, static_name, hash_or_id, type, delay, now); + this->debug_log_timer_(item.get(), name_type, static_name, hash_or_id, type, delay, now_64); #endif /* ESPHOME_DEBUG_SCHEDULER */ // For retries, check if there's a cancelled timeout first @@ -399,8 +401,7 @@ optional HOT Scheduler::next_schedule_in(uint32_t now) { return {}; auto &item = this->items_[0]; - // Convert the fresh timestamp from caller (usually Application::loop()) to 64-bit - const auto now_64 = this->millis_64_(now); // 'now' from parameter - fresh from caller + const auto now_64 = this->millis_64_from_(now); const uint64_t next_exec = item->get_next_execution(); if (next_exec < now_64) return 0; @@ -461,8 +462,8 @@ void HOT Scheduler::call(uint32_t now) { this->process_defer_queue_(now); #endif /* not ESPHOME_THREAD_SINGLE */ - // Convert the fresh timestamp from main loop to 64-bit for scheduler operations - const auto now_64 = this->millis_64_(now); // 'now' from parameter - fresh from Application::loop() + // Extend the caller's 32-bit timestamp to 64-bit for scheduler operations + const auto now_64 = this->millis_64_from_(now); this->process_to_add(); // Track if any items were added to to_add_ during this call (intervals or from callbacks) @@ -474,15 +475,18 @@ void HOT Scheduler::call(uint32_t now) { if (now_64 - last_print > 2000) { last_print = now_64; std::vector old_items; -#ifdef ESPHOME_THREAD_MULTI_ATOMICS +#if !defined(USE_ESP32) && defined(ESPHOME_THREAD_MULTI_ATOMICS) const auto last_dbg = this->last_millis_.load(std::memory_order_relaxed); const auto major_dbg = this->millis_major_.load(std::memory_order_relaxed); ESP_LOGD(TAG, "Items: count=%zu, pool=%zu, now=%" PRIu64 " (%" PRIu16 ", %" PRIu32 ")", this->items_.size(), this->scheduler_item_pool_.size(), now_64, major_dbg, last_dbg); -#else /* not ESPHOME_THREAD_MULTI_ATOMICS */ +#elif !defined(USE_ESP32) ESP_LOGD(TAG, "Items: count=%zu, pool=%zu, now=%" PRIu64 " (%" PRIu16 ", %" PRIu32 ")", this->items_.size(), this->scheduler_item_pool_.size(), now_64, this->millis_major_, this->last_millis_); -#endif /* else ESPHOME_THREAD_MULTI_ATOMICS */ +#else + ESP_LOGD(TAG, "Items: count=%zu, pool=%zu, now=%" PRIu64, this->items_.size(), this->scheduler_item_pool_.size(), + now_64); +#endif // Cleanup before debug output this->cleanup_(); while (!this->items_.empty()) { @@ -710,9 +714,8 @@ bool HOT Scheduler::cancel_item_locked_(Component *component, NameType name_type return total_cancelled > 0; } -uint64_t Scheduler::millis_64() { return this->millis_64_(millis()); } - -uint64_t Scheduler::millis_64_(uint32_t now) { +#ifndef USE_ESP32 +uint64_t Scheduler::millis_64_impl_(uint32_t now) { // THREAD SAFETY NOTE: // This function has three implementations, based on the precompiler flags // - ESPHOME_THREAD_SINGLE - Runs on single-threaded platforms (ESP8266, RP2040, etc.) @@ -869,6 +872,7 @@ uint64_t Scheduler::millis_64_(uint32_t now) { "No platform threading model defined. One of ESPHOME_THREAD_SINGLE, ESPHOME_THREAD_MULTI_NO_ATOMICS, or ESPHOME_THREAD_MULTI_ATOMICS must be defined." #endif } +#endif // not USE_ESP32 bool HOT Scheduler::SchedulerItem::cmp(const SchedulerItemPtr &a, const SchedulerItemPtr &b) { // High bits are almost always equal (change only on 32-bit rollover ~49 days) diff --git a/esphome/core/scheduler.h b/esphome/core/scheduler.h index 840ee7159a..c605325810 100644 --- a/esphome/core/scheduler.h +++ b/esphome/core/scheduler.h @@ -10,6 +10,7 @@ #endif #include "esphome/core/component.h" +#include "esphome/core/hal.h" #include "esphome/core/helpers.h" namespace esphome { @@ -117,12 +118,12 @@ class Scheduler { bool cancel_retry(Component *component, uint32_t id); /// Get 64-bit millisecond timestamp (handles 32-bit millis() rollover) - uint64_t millis_64(); + uint64_t millis_64() { return esphome::millis_64(); } - // Calculate when the next scheduled item should run - // @param now Fresh timestamp from millis() - must not be stale/cached - // Returns the time in milliseconds until the next scheduled item, or nullopt if no items - // This method performs cleanup of removed items before checking the schedule + // Calculate when the next scheduled item should run. + // @param now On ESP32, unused for 64-bit extension (native); on other platforms, extended to 64-bit via rollover. + // Returns the time in milliseconds until the next scheduled item, or nullopt if no items. + // This method performs cleanup of removed items before checking the schedule. // IMPORTANT: This method should only be called from the main thread (loop task). optional next_schedule_in(uint32_t now); @@ -282,7 +283,25 @@ class Scheduler { // Common implementation for cancel_retry bool cancel_retry_(Component *component, NameType name_type, const char *static_name, uint32_t hash_or_id); - uint64_t millis_64_(uint32_t now); + // Extend a 32-bit millis() value to 64-bit. Use when the caller already has a fresh now. + // On ESP32, ignores now and uses esp_timer_get_time() directly (native 64-bit). + // On non-ESP32, extends now to 64-bit using rollover tracking. + uint64_t millis_64_from_(uint32_t now) { +#ifdef USE_ESP32 + (void) now; + return millis_64(); +#else + return this->millis_64_impl_(now); +#endif + } + +#ifndef USE_ESP32 + // On non-ESP32 platforms, millis_64() HAL function delegates to this method + // which tracks 32-bit millis() rollover using millis_major_ and last_millis_. + // On ESP32, millis_64() uses esp_timer_get_time() directly. + friend uint64_t millis_64(); + uint64_t millis_64_impl_(uint32_t now); +#endif // Cleanup logically deleted items from the scheduler // Returns the number of items remaining after cleanup // IMPORTANT: This method should only be called from the main thread (loop task). @@ -549,6 +568,9 @@ class Scheduler { // to synchronize between tasks (see https://github.com/esphome/backlog/issues/52) std::vector scheduler_item_pool_; +#ifndef USE_ESP32 + // On ESP32, millis_64() uses esp_timer_get_time() directly; no rollover tracking needed. + // On other platforms, these fields track 32-bit millis() rollover for millis_64_impl_(). #ifdef ESPHOME_THREAD_MULTI_ATOMICS /* * Multi-threaded platforms with atomic support: last_millis_ needs atomic for lock-free updates @@ -577,6 +599,7 @@ class Scheduler { #else /* not ESPHOME_THREAD_MULTI_ATOMICS */ uint16_t millis_major_{0}; #endif /* else ESPHOME_THREAD_MULTI_ATOMICS */ +#endif /* not USE_ESP32 */ }; } // namespace esphome From 4fe173b64487b90d17fbca26727e0ad19bdd0d20 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 10:56:57 -0700 Subject: [PATCH 127/147] [wifi] Remove stale TODO comment for ESP8266 callback deferral (#14347) --- esphome/components/wifi/wifi_component_esp8266.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/esphome/components/wifi/wifi_component_esp8266.cpp b/esphome/components/wifi/wifi_component_esp8266.cpp index cbf7d7d80f..8911bf15e0 100644 --- a/esphome/components/wifi/wifi_component_esp8266.cpp +++ b/esphome/components/wifi/wifi_component_esp8266.cpp @@ -470,10 +470,6 @@ const LogString *get_disconnect_reason_str(uint8_t reason) { return LOG_STR("Unspecified"); } -// TODO: This callback runs in ESP8266 system context with limited stack (~2KB). -// All listener notifications should be deferred to wifi_loop_() via pending_ flags -// to avoid stack overflow. Currently only connect_state is deferred; disconnect, -// IP, and scan listeners still run in this context and should be migrated. void WiFiComponent::wifi_event_callback(System_Event_t *event) { switch (event->event) { case EVENT_STAMODE_CONNECTED: { From c3a0eeceec21b6f7e97a2044078c611c843679e2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 11:17:17 -0700 Subject: [PATCH 128/147] [wifi] Use direct SDK APIs for LibreTiny SSID retrieval (#14349) --- .../wifi/wifi_component_libretiny.cpp | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/esphome/components/wifi/wifi_component_libretiny.cpp b/esphome/components/wifi/wifi_component_libretiny.cpp index 2cc05928af..1c5490a3ac 100644 --- a/esphome/components/wifi/wifi_component_libretiny.cpp +++ b/esphome/components/wifi/wifi_component_libretiny.cpp @@ -13,6 +13,19 @@ #include #include +#ifdef USE_BK72XX +extern "C" { +#include +} +#endif + +#ifdef USE_RTL87XX +extern "C" { +#include +#include +} +#endif + #include "esphome/core/application.h" #include "esphome/core/hal.h" #include "esphome/core/helpers.h" @@ -760,10 +773,22 @@ bssid_t WiFiComponent::wifi_bssid() { } std::string WiFiComponent::wifi_ssid() { return WiFi.SSID().c_str(); } const char *WiFiComponent::wifi_ssid_to(std::span buffer) { - // TODO: Find direct LibreTiny API to avoid Arduino String allocation +#ifdef USE_BK72XX + LinkStatusTypeDef link_status{}; + bk_wlan_get_link_status(&link_status); + size_t len = strnlen(reinterpret_cast(link_status.ssid), SSID_BUFFER_SIZE - 1); + memcpy(buffer.data(), link_status.ssid, len); +#elif defined(USE_RTL87XX) + rtw_wifi_setting_t setting{}; + wifi_get_setting("wlan0", &setting); + size_t len = strnlen(reinterpret_cast(setting.ssid), SSID_BUFFER_SIZE - 1); + memcpy(buffer.data(), setting.ssid, len); +#else + // LN882X: wifi_get_sta_conn_info() provides direct pointer access String ssid = WiFi.SSID(); size_t len = std::min(static_cast(ssid.length()), SSID_BUFFER_SIZE - 1); memcpy(buffer.data(), ssid.c_str(), len); +#endif buffer[len] = '\0'; return buffer.data(); } From 4ae7633418716d4f606e189ad1eb532d7ec00cb5 Mon Sep 17 00:00:00 2001 From: Michael Cassaniti Date: Sat, 28 Feb 2026 05:23:02 +1100 Subject: [PATCH 129/147] [safe_mode] Add feature to explicitly mark a boot as successful (#14306) Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> --- esphome/components/safe_mode/__init__.py | 17 ++++++++++++++++ esphome/components/safe_mode/automation.h | 14 +++++++------ esphome/components/safe_mode/safe_mode.cpp | 20 +++++++++++-------- esphome/components/safe_mode/safe_mode.h | 2 ++ .../components/safe_mode/common-enabled.yaml | 4 ++++ 5 files changed, 43 insertions(+), 14 deletions(-) diff --git a/esphome/components/safe_mode/__init__.py b/esphome/components/safe_mode/__init__.py index d1754aaad7..f54151b746 100644 --- a/esphome/components/safe_mode/__init__.py +++ b/esphome/components/safe_mode/__init__.py @@ -21,6 +21,7 @@ CONF_ON_SAFE_MODE = "on_safe_mode" safe_mode_ns = cg.esphome_ns.namespace("safe_mode") SafeModeComponent = safe_mode_ns.class_("SafeModeComponent", cg.Component) SafeModeTrigger = safe_mode_ns.class_("SafeModeTrigger", automation.Trigger.template()) +MarkSuccessfulAction = safe_mode_ns.class_("MarkSuccessfulAction", automation.Action) def _remove_id_if_disabled(value): @@ -53,6 +54,22 @@ CONFIG_SCHEMA = cv.All( ) +@automation.register_action( + "safe_mode.mark_successful", + MarkSuccessfulAction, + cv.Schema( + { + cv.GenerateID(): cv.use_id(SafeModeComponent), + } + ), +) +async def safe_mode_mark_successful_to_code(config, action_id, template_arg, args): + parent = await cg.get_variable(config[CONF_ID]) + var = cg.new_Pvariable(action_id, template_arg) + cg.add(var.set_parent(parent)) + return var + + @coroutine_with_priority(CoroPriority.APPLICATION) async def to_code(config): if not config[CONF_DISABLED]: diff --git a/esphome/components/safe_mode/automation.h b/esphome/components/safe_mode/automation.h index 1d82ac45f1..dee02c64a0 100644 --- a/esphome/components/safe_mode/automation.h +++ b/esphome/components/safe_mode/automation.h @@ -1,20 +1,22 @@ #pragma once #include "esphome/core/defines.h" - -#ifdef USE_SAFE_MODE_CALLBACK -#include "safe_mode.h" - #include "esphome/core/automation.h" +#include "safe_mode.h" namespace esphome::safe_mode { +#ifdef USE_SAFE_MODE_CALLBACK class SafeModeTrigger final : public Trigger<> { public: explicit SafeModeTrigger(SafeModeComponent *parent) { parent->add_on_safe_mode_callback([this]() { trigger(); }); } }; +#endif // USE_SAFE_MODE_CALLBACK + +template class MarkSuccessfulAction : public Action, public Parented { + public: + void play(const Ts &...x) override { this->parent_->mark_successful(); } +}; } // namespace esphome::safe_mode - -#endif // USE_SAFE_MODE_CALLBACK diff --git a/esphome/components/safe_mode/safe_mode.cpp b/esphome/components/safe_mode/safe_mode.cpp index aa4fdb8291..fe2acd9612 100644 --- a/esphome/components/safe_mode/safe_mode.cpp +++ b/esphome/components/safe_mode/safe_mode.cpp @@ -63,18 +63,22 @@ void SafeModeComponent::dump_config() { float SafeModeComponent::get_setup_priority() const { return setup_priority::AFTER_WIFI; } +void SafeModeComponent::mark_successful() { + this->clean_rtc(); + this->boot_successful_ = true; +#if defined(USE_ESP32) && defined(USE_OTA_ROLLBACK) + // Mark OTA partition as valid to prevent rollback + esp_ota_mark_app_valid_cancel_rollback(); +#endif + // Disable loop since we no longer need to check + this->disable_loop(); +} + void SafeModeComponent::loop() { if (!this->boot_successful_ && (millis() - this->safe_mode_start_time_) > this->safe_mode_boot_is_good_after_) { // successful boot, reset counter ESP_LOGI(TAG, "Boot seems successful; resetting boot loop counter"); - this->clean_rtc(); - this->boot_successful_ = true; -#if defined(USE_ESP32) && defined(USE_OTA_ROLLBACK) - // Mark OTA partition as valid to prevent rollback - esp_ota_mark_app_valid_cancel_rollback(); -#endif - // Disable loop since we no longer need to check - this->disable_loop(); + this->mark_successful(); } } diff --git a/esphome/components/safe_mode/safe_mode.h b/esphome/components/safe_mode/safe_mode.h index 902b8c415d..1b28ea28f2 100644 --- a/esphome/components/safe_mode/safe_mode.h +++ b/esphome/components/safe_mode/safe_mode.h @@ -31,6 +31,8 @@ class SafeModeComponent final : public Component { void on_safe_shutdown() override; + void mark_successful(); + #ifdef USE_SAFE_MODE_CALLBACK void add_on_safe_mode_callback(std::function &&callback) { this->safe_mode_callback_.add(std::move(callback)); diff --git a/tests/components/safe_mode/common-enabled.yaml b/tests/components/safe_mode/common-enabled.yaml index c24f49e6b6..43025c60db 100644 --- a/tests/components/safe_mode/common-enabled.yaml +++ b/tests/components/safe_mode/common-enabled.yaml @@ -16,3 +16,7 @@ button: switch: - platform: safe_mode name: Safe Mode Switch + +esphome: + on_boot: + - safe_mode.mark_successful From 317dd5b2da73d39839695abb066cb976443dba05 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 11:42:08 -0700 Subject: [PATCH 130/147] [ci] Skip memory impact target branch build when tests don't exist (#14316) --- .github/workflows/ci.yml | 49 ++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c2a93d37fd..b752701920 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -686,7 +686,7 @@ jobs: ram_usage: ${{ steps.extract.outputs.ram_usage }} flash_usage: ${{ steps.extract.outputs.flash_usage }} cache_hit: ${{ steps.cache-memory-analysis.outputs.cache-hit }} - skip: ${{ steps.check-script.outputs.skip }} + skip: ${{ steps.check-script.outputs.skip || steps.check-tests.outputs.skip }} steps: - name: Check out target branch uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 @@ -705,10 +705,39 @@ jobs: echo "::warning::ci_memory_impact_extract.py not found on target branch, skipping memory impact analysis" fi - # All remaining steps only run if script exists + # Check if test files exist on the target branch for the requested + # components and platform. When a PR adds new test files for a platform, + # the target branch won't have them yet, so skip instead of failing. + # This check must be done here (not in determine-jobs.py) because + # determine-jobs runs on the PR branch and cannot see what the target + # branch has. + - name: Check for test files on target branch + id: check-tests + if: steps.check-script.outputs.skip != 'true' + run: | + components='${{ toJSON(fromJSON(needs.determine-jobs.outputs.memory_impact).components) }}' + platform="${{ fromJSON(needs.determine-jobs.outputs.memory_impact).platform }}" + found=false + for component in $(echo "$components" | jq -r '.[]'); do + # Check for test files matching the platform (test.platform.yaml or test-*.platform.yaml) + for f in tests/components/${component}/test*.${platform}.yaml; do + if [ -f "$f" ]; then + found=true + break 2 + fi + done + done + if [ "$found" = false ]; then + echo "skip=true" >> $GITHUB_OUTPUT + echo "::warning::No test files found on target branch for platform ${platform}, skipping memory impact analysis" + else + echo "skip=false" >> $GITHUB_OUTPUT + fi + + # All remaining steps only run if script and tests exist - name: Generate cache key id: cache-key - if: steps.check-script.outputs.skip != 'true' + if: steps.check-script.outputs.skip != 'true' && steps.check-tests.outputs.skip != 'true' run: | # Get the commit SHA of the target branch target_sha=$(git rev-parse HEAD) @@ -735,14 +764,14 @@ jobs: - name: Restore cached memory analysis id: cache-memory-analysis - if: steps.check-script.outputs.skip != 'true' + if: steps.check-script.outputs.skip != 'true' && steps.check-tests.outputs.skip != 'true' uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: memory-analysis-target.json key: ${{ steps.cache-key.outputs.cache-key }} - name: Cache status - if: steps.check-script.outputs.skip != 'true' + if: steps.check-script.outputs.skip != 'true' && steps.check-tests.outputs.skip != 'true' run: | if [ "${{ steps.cache-memory-analysis.outputs.cache-hit }}" == "true" ]; then echo "✓ Cache hit! Using cached memory analysis results." @@ -752,21 +781,21 @@ jobs: fi - name: Restore Python - if: steps.check-script.outputs.skip != 'true' && steps.cache-memory-analysis.outputs.cache-hit != 'true' + if: steps.check-script.outputs.skip != 'true' && steps.check-tests.outputs.skip != 'true' && steps.cache-memory-analysis.outputs.cache-hit != 'true' uses: ./.github/actions/restore-python with: python-version: ${{ env.DEFAULT_PYTHON }} cache-key: ${{ needs.common.outputs.cache-key }} - name: Cache platformio - if: steps.check-script.outputs.skip != 'true' && steps.cache-memory-analysis.outputs.cache-hit != 'true' + if: steps.check-script.outputs.skip != 'true' && steps.check-tests.outputs.skip != 'true' && steps.cache-memory-analysis.outputs.cache-hit != 'true' uses: actions/cache/restore@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: ~/.platformio key: platformio-memory-${{ fromJSON(needs.determine-jobs.outputs.memory_impact).platform }}-${{ hashFiles('platformio.ini') }} - name: Build, compile, and analyze memory - if: steps.check-script.outputs.skip != 'true' && steps.cache-memory-analysis.outputs.cache-hit != 'true' + if: steps.check-script.outputs.skip != 'true' && steps.check-tests.outputs.skip != 'true' && steps.cache-memory-analysis.outputs.cache-hit != 'true' id: build run: | . venv/bin/activate @@ -800,7 +829,7 @@ jobs: --platform "$platform" - name: Save memory analysis to cache - if: steps.check-script.outputs.skip != 'true' && steps.cache-memory-analysis.outputs.cache-hit != 'true' && steps.build.outcome == 'success' + if: steps.check-script.outputs.skip != 'true' && steps.check-tests.outputs.skip != 'true' && steps.cache-memory-analysis.outputs.cache-hit != 'true' && steps.build.outcome == 'success' uses: actions/cache/save@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3 with: path: memory-analysis-target.json @@ -808,7 +837,7 @@ jobs: - name: Extract memory usage for outputs id: extract - if: steps.check-script.outputs.skip != 'true' + if: steps.check-script.outputs.skip != 'true' && steps.check-tests.outputs.skip != 'true' run: | if [ -f memory-analysis-target.json ]; then ram=$(jq -r '.ram_bytes' memory-analysis-target.json) From 29e1e8bdfd9ce8068cb97f8e0b1c8e8f64af50c4 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 11:45:20 -0700 Subject: [PATCH 131/147] [wifi] Add LibreTiny component test configs (#14351) --- tests/components/wifi/test.bk72xx-ard.yaml | 1 + tests/components/wifi/test.ln882x-ard.yaml | 1 + tests/components/wifi/test.rtl87xx-ard.yaml | 1 + 3 files changed, 3 insertions(+) create mode 100644 tests/components/wifi/test.bk72xx-ard.yaml create mode 100644 tests/components/wifi/test.ln882x-ard.yaml create mode 100644 tests/components/wifi/test.rtl87xx-ard.yaml diff --git a/tests/components/wifi/test.bk72xx-ard.yaml b/tests/components/wifi/test.bk72xx-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/wifi/test.bk72xx-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/wifi/test.ln882x-ard.yaml b/tests/components/wifi/test.ln882x-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/wifi/test.ln882x-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/wifi/test.rtl87xx-ard.yaml b/tests/components/wifi/test.rtl87xx-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/wifi/test.rtl87xx-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From 3411ce21505cd8fdcf74885199ba7627f5ac105b Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 11:49:57 -0700 Subject: [PATCH 132/147] [core] Fix Application asm label for Mach-O using __USER_LABEL_PREFIX__ (#14334) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- esphome/core/application.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/esphome/core/application.cpp b/esphome/core/application.cpp index 3bd4c1c670..e27c2cdfc6 100644 --- a/esphome/core/application.cpp +++ b/esphome/core/application.cpp @@ -727,8 +727,17 @@ void Application::yield_with_select_(uint32_t delay_ms) { #error "Application placement new requires Itanium C++ ABI (GCC/Clang)" #endif static_assert(std::is_default_constructible::value, "Application must be default-constructible"); +// __USER_LABEL_PREFIX__ is "_" on Mach-O (macOS) and empty on ELF (embedded targets). +// String literal concatenation produces the correct platform-specific mangled symbol. +// Two-level macro needed: # stringifies before expansion, so the +// indirection forces __USER_LABEL_PREFIX__ to expand first. +#define ESPHOME_STRINGIFY_IMPL_(x) #x +#define ESPHOME_STRINGIFY_(x) ESPHOME_STRINGIFY_IMPL_(x) // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) -alignas(Application) char app_storage[sizeof(Application)] asm("_ZN7esphome3AppE"); +alignas(Application) char app_storage[sizeof(Application)] asm( + ESPHOME_STRINGIFY_(__USER_LABEL_PREFIX__) "_ZN7esphome3AppE"); +#undef ESPHOME_STRINGIFY_ +#undef ESPHOME_STRINGIFY_IMPL_ #if defined(USE_SOCKET_SELECT_SUPPORT) && defined(USE_WAKE_LOOP_THREADSAFE) From 8698b01bc7314443867327e11f8431a7f14bf7e7 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 11:54:13 -0700 Subject: [PATCH 133/147] [host] Use native clock_gettime for millis_64() (#14340) Co-authored-by: Claude Opus 4.6 --- esphome/components/host/core.cpp | 6 +++++- esphome/core/scheduler.cpp | 10 +++++----- esphome/core/scheduler.h | 15 +++++++-------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/esphome/components/host/core.cpp b/esphome/components/host/core.cpp index 5c08717ac9..9af85bec58 100644 --- a/esphome/components/host/core.cpp +++ b/esphome/components/host/core.cpp @@ -20,7 +20,11 @@ uint32_t IRAM_ATTR HOT millis() { uint32_t ms = round(spec.tv_nsec / 1e6); return ((uint32_t) seconds) * 1000U + ms; } -uint64_t millis_64() { return App.scheduler.millis_64_impl_(millis()); } +uint64_t millis_64() { + struct timespec spec; + clock_gettime(CLOCK_MONOTONIC, &spec); + return static_cast(spec.tv_sec) * 1000ULL + static_cast(spec.tv_nsec) / 1000000ULL; +} void HOT delay(uint32_t ms) { struct timespec ts; ts.tv_sec = ms / 1000; diff --git a/esphome/core/scheduler.cpp b/esphome/core/scheduler.cpp index 06c0bb8b1b..97735c4876 100644 --- a/esphome/core/scheduler.cpp +++ b/esphome/core/scheduler.cpp @@ -28,7 +28,7 @@ static constexpr size_t MAX_POOL_SIZE = 5; // Set to 5 to match the pool size - when we have as many cancelled items as our // pool can hold, it's time to clean up and recycle them. static constexpr uint32_t MAX_LOGICALLY_DELETED_ITEMS = 5; -#ifndef USE_ESP32 +#if !defined(USE_ESP32) && !defined(USE_HOST) // Half the 32-bit range - used to detect rollovers vs normal time progression static constexpr uint32_t HALF_MAX_UINT32 = std::numeric_limits::max() / 2; #endif @@ -475,12 +475,12 @@ void HOT Scheduler::call(uint32_t now) { if (now_64 - last_print > 2000) { last_print = now_64; std::vector old_items; -#if !defined(USE_ESP32) && defined(ESPHOME_THREAD_MULTI_ATOMICS) +#if !defined(USE_ESP32) && !defined(USE_HOST) && defined(ESPHOME_THREAD_MULTI_ATOMICS) const auto last_dbg = this->last_millis_.load(std::memory_order_relaxed); const auto major_dbg = this->millis_major_.load(std::memory_order_relaxed); ESP_LOGD(TAG, "Items: count=%zu, pool=%zu, now=%" PRIu64 " (%" PRIu16 ", %" PRIu32 ")", this->items_.size(), this->scheduler_item_pool_.size(), now_64, major_dbg, last_dbg); -#elif !defined(USE_ESP32) +#elif !defined(USE_ESP32) && !defined(USE_HOST) ESP_LOGD(TAG, "Items: count=%zu, pool=%zu, now=%" PRIu64 " (%" PRIu16 ", %" PRIu32 ")", this->items_.size(), this->scheduler_item_pool_.size(), now_64, this->millis_major_, this->last_millis_); #else @@ -714,7 +714,7 @@ bool HOT Scheduler::cancel_item_locked_(Component *component, NameType name_type return total_cancelled > 0; } -#ifndef USE_ESP32 +#if !defined(USE_ESP32) && !defined(USE_HOST) uint64_t Scheduler::millis_64_impl_(uint32_t now) { // THREAD SAFETY NOTE: // This function has three implementations, based on the precompiler flags @@ -872,7 +872,7 @@ uint64_t Scheduler::millis_64_impl_(uint32_t now) { "No platform threading model defined. One of ESPHOME_THREAD_SINGLE, ESPHOME_THREAD_MULTI_NO_ATOMICS, or ESPHOME_THREAD_MULTI_ATOMICS must be defined." #endif } -#endif // not USE_ESP32 +#endif // !USE_ESP32 && !USE_HOST bool HOT Scheduler::SchedulerItem::cmp(const SchedulerItemPtr &a, const SchedulerItemPtr &b) { // High bits are almost always equal (change only on 32-bit rollover ~49 days) diff --git a/esphome/core/scheduler.h b/esphome/core/scheduler.h index c605325810..9a62ac1634 100644 --- a/esphome/core/scheduler.h +++ b/esphome/core/scheduler.h @@ -287,7 +287,7 @@ class Scheduler { // On ESP32, ignores now and uses esp_timer_get_time() directly (native 64-bit). // On non-ESP32, extends now to 64-bit using rollover tracking. uint64_t millis_64_from_(uint32_t now) { -#ifdef USE_ESP32 +#if defined(USE_ESP32) || defined(USE_HOST) (void) now; return millis_64(); #else @@ -295,10 +295,9 @@ class Scheduler { #endif } -#ifndef USE_ESP32 - // On non-ESP32 platforms, millis_64() HAL function delegates to this method - // which tracks 32-bit millis() rollover using millis_major_ and last_millis_. - // On ESP32, millis_64() uses esp_timer_get_time() directly. +#if !defined(USE_ESP32) && !defined(USE_HOST) + // On platforms without native 64-bit time, millis_64() HAL function delegates to this + // method which tracks 32-bit millis() rollover using millis_major_ and last_millis_. friend uint64_t millis_64(); uint64_t millis_64_impl_(uint32_t now); #endif @@ -568,8 +567,8 @@ class Scheduler { // to synchronize between tasks (see https://github.com/esphome/backlog/issues/52) std::vector scheduler_item_pool_; -#ifndef USE_ESP32 - // On ESP32, millis_64() uses esp_timer_get_time() directly; no rollover tracking needed. +#if !defined(USE_ESP32) && !defined(USE_HOST) + // On platforms with native 64-bit time (ESP32, Host), no rollover tracking needed. // On other platforms, these fields track 32-bit millis() rollover for millis_64_impl_(). #ifdef ESPHOME_THREAD_MULTI_ATOMICS /* @@ -599,7 +598,7 @@ class Scheduler { #else /* not ESPHOME_THREAD_MULTI_ATOMICS */ uint16_t millis_major_{0}; #endif /* else ESPHOME_THREAD_MULTI_ATOMICS */ -#endif /* not USE_ESP32 */ +#endif /* !USE_ESP32 && !USE_HOST */ }; } // namespace esphome From 9c1d1a0d9fba57b92e083437d422a3e7ca3137ad Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 12:25:13 -0700 Subject: [PATCH 134/147] [color] Use integer math in Color::gradient to reduce code size (#14354) --- esphome/core/color.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/esphome/core/color.cpp b/esphome/core/color.cpp index 14c41c2b0d..edbc771472 100644 --- a/esphome/core/color.cpp +++ b/esphome/core/color.cpp @@ -7,12 +7,12 @@ constinit const Color Color::BLACK(0, 0, 0, 0); constinit const Color Color::WHITE(255, 255, 255, 255); Color Color::gradient(const Color &to_color, uint8_t amnt) { + uint8_t inv = 255 - amnt; Color new_color; - float amnt_f = float(amnt) / 255.0f; - new_color.r = amnt_f * (to_color.r - this->r) + this->r; - new_color.g = amnt_f * (to_color.g - this->g) + this->g; - new_color.b = amnt_f * (to_color.b - this->b) + this->b; - new_color.w = amnt_f * (to_color.w - this->w) + this->w; + new_color.r = (uint16_t(this->r) * inv + uint16_t(to_color.r) * amnt) / 255; + new_color.g = (uint16_t(this->g) * inv + uint16_t(to_color.g) * amnt) / 255; + new_color.b = (uint16_t(this->b) * inv + uint16_t(to_color.b) * amnt) / 255; + new_color.w = (uint16_t(this->w) * inv + uint16_t(to_color.w) * amnt) / 255; return new_color; } From 2255c68377304c81ab75da9fda8b79cbcf5c756c Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Sat, 28 Feb 2026 06:40:55 +1100 Subject: [PATCH 135/147] [esp32] Enable `execute_from_psram` for P4 (#14329) --- esphome/components/esp32/__init__.py | 13 +++-- .../config/execute_from_psram_disabled.yaml | 10 ++++ .../esp32/config/execute_from_psram_p4.yaml | 11 ++++ .../esp32/config/execute_from_psram_s3.yaml | 12 ++++ tests/component_tests/esp32/test_esp32.py | 55 ++++++++++++++++++- 5 files changed, 95 insertions(+), 6 deletions(-) create mode 100644 tests/component_tests/esp32/config/execute_from_psram_disabled.yaml create mode 100644 tests/component_tests/esp32/config/execute_from_psram_p4.yaml create mode 100644 tests/component_tests/esp32/config/execute_from_psram_s3.yaml diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index a34747a183..998913ecec 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -890,10 +890,10 @@ def final_validate(config): ) ) if advanced[CONF_EXECUTE_FROM_PSRAM]: - if config[CONF_VARIANT] != VARIANT_ESP32S3: + if config[CONF_VARIANT] not in {VARIANT_ESP32S3, VARIANT_ESP32P4}: errs.append( cv.Invalid( - f"'{CONF_EXECUTE_FROM_PSRAM}' is only supported on {VARIANT_ESP32S3} variant", + f"'{CONF_EXECUTE_FROM_PSRAM}' is not available on this esp32 variant", path=[CONF_FRAMEWORK, CONF_ADVANCED, CONF_EXECUTE_FROM_PSRAM], ) ) @@ -1627,8 +1627,13 @@ async def to_code(config): _configure_lwip_max_sockets(conf) if advanced[CONF_EXECUTE_FROM_PSRAM]: - add_idf_sdkconfig_option("CONFIG_SPIRAM_FETCH_INSTRUCTIONS", True) - add_idf_sdkconfig_option("CONFIG_SPIRAM_RODATA", True) + if variant == VARIANT_ESP32S3: + add_idf_sdkconfig_option("CONFIG_SPIRAM_FETCH_INSTRUCTIONS", True) + add_idf_sdkconfig_option("CONFIG_SPIRAM_RODATA", True) + elif variant == VARIANT_ESP32P4: + add_idf_sdkconfig_option("CONFIG_SPIRAM_XIP_FROM_PSRAM", True) + else: + raise ValueError("Unhandled ESP32 variant") # Apply LWIP core locking for better socket performance # This is already enabled by default in Arduino framework, where it provides diff --git a/tests/component_tests/esp32/config/execute_from_psram_disabled.yaml b/tests/component_tests/esp32/config/execute_from_psram_disabled.yaml new file mode 100644 index 0000000000..b52255c5ad --- /dev/null +++ b/tests/component_tests/esp32/config/execute_from_psram_disabled.yaml @@ -0,0 +1,10 @@ +esphome: + name: test + +esp32: + variant: esp32s3 + framework: + type: esp-idf + +psram: + mode: octal diff --git a/tests/component_tests/esp32/config/execute_from_psram_p4.yaml b/tests/component_tests/esp32/config/execute_from_psram_p4.yaml new file mode 100644 index 0000000000..e9070a5ae1 --- /dev/null +++ b/tests/component_tests/esp32/config/execute_from_psram_p4.yaml @@ -0,0 +1,11 @@ +esphome: + name: test + +esp32: + variant: esp32p4 + framework: + type: esp-idf + advanced: + execute_from_psram: true + +psram: diff --git a/tests/component_tests/esp32/config/execute_from_psram_s3.yaml b/tests/component_tests/esp32/config/execute_from_psram_s3.yaml new file mode 100644 index 0000000000..aec020ddff --- /dev/null +++ b/tests/component_tests/esp32/config/execute_from_psram_s3.yaml @@ -0,0 +1,12 @@ +esphome: + name: test + +esp32: + variant: esp32s3 + framework: + type: esp-idf + advanced: + execute_from_psram: true + +psram: + mode: octal diff --git a/tests/component_tests/esp32/test_esp32.py b/tests/component_tests/esp32/test_esp32.py index 68bd3a5965..bd4f9828ce 100644 --- a/tests/component_tests/esp32/test_esp32.py +++ b/tests/component_tests/esp32/test_esp32.py @@ -2,13 +2,17 @@ Test ESP32 configuration """ +from collections.abc import Callable +from pathlib import Path from typing import Any import pytest from esphome.components.esp32 import VARIANTS +from esphome.components.esp32.const import KEY_ESP32, KEY_SDKCONFIG_OPTIONS import esphome.config_validation as cv from esphome.const import CONF_ESPHOME, PlatformFramework +from esphome.core import CORE from tests.component_tests.types import SetCoreConfigCallable @@ -70,7 +74,7 @@ def test_esp32_config( "advanced": {"execute_from_psram": True}, }, }, - r"'execute_from_psram' is only supported on ESP32S3 variant @ data\['framework'\]\['advanced'\]\['execute_from_psram'\]", + r"'execute_from_psram' is not available on this esp32 variant @ data\['framework'\]\['advanced'\]\['execute_from_psram'\]", id="execute_from_psram_invalid_for_variant_config", ), pytest.param( @@ -82,7 +86,18 @@ def test_esp32_config( }, }, r"'execute_from_psram' requires PSRAM to be configured @ data\['framework'\]\['advanced'\]\['execute_from_psram'\]", - id="execute_from_psram_requires_psram_config", + id="execute_from_psram_requires_psram_s3_config", + ), + pytest.param( + { + "variant": "esp32p4", + "framework": { + "type": "esp-idf", + "advanced": {"execute_from_psram": True}, + }, + }, + r"'execute_from_psram' requires PSRAM to be configured @ data\['framework'\]\['advanced'\]\['execute_from_psram'\]", + id="execute_from_psram_requires_psram_p4_config", ), pytest.param( { @@ -108,3 +123,39 @@ def test_esp32_configuration_errors( with pytest.raises(cv.Invalid, match=error_match): FINAL_VALIDATE_SCHEMA(CONFIG_SCHEMA(config)) + + +def test_execute_from_psram_s3_sdkconfig( + generate_main: Callable[[str | Path], str], + component_config_path: Callable[[str], Path], +) -> None: + """Test that execute_from_psram on ESP32-S3 sets the correct sdkconfig options.""" + generate_main(component_config_path("execute_from_psram_s3.yaml")) + sdkconfig = CORE.data[KEY_ESP32][KEY_SDKCONFIG_OPTIONS] + assert sdkconfig.get("CONFIG_SPIRAM_FETCH_INSTRUCTIONS") is True + assert sdkconfig.get("CONFIG_SPIRAM_RODATA") is True + assert "CONFIG_SPIRAM_XIP_FROM_PSRAM" not in sdkconfig + + +def test_execute_from_psram_p4_sdkconfig( + generate_main: Callable[[str | Path], str], + component_config_path: Callable[[str], Path], +) -> None: + """Test that execute_from_psram on ESP32-P4 sets the correct sdkconfig options.""" + generate_main(component_config_path("execute_from_psram_p4.yaml")) + sdkconfig = CORE.data[KEY_ESP32][KEY_SDKCONFIG_OPTIONS] + assert sdkconfig.get("CONFIG_SPIRAM_XIP_FROM_PSRAM") is True + assert "CONFIG_SPIRAM_FETCH_INSTRUCTIONS" not in sdkconfig + assert "CONFIG_SPIRAM_RODATA" not in sdkconfig + + +def test_execute_from_psram_disabled_sdkconfig( + generate_main: Callable[[str | Path], str], + component_config_path: Callable[[str], Path], +) -> None: + """Test that without execute_from_psram, no XIP sdkconfig options are set.""" + generate_main(component_config_path("execute_from_psram_disabled.yaml")) + sdkconfig = CORE.data[KEY_ESP32][KEY_SDKCONFIG_OPTIONS] + assert "CONFIG_SPIRAM_FETCH_INSTRUCTIONS" not in sdkconfig + assert "CONFIG_SPIRAM_RODATA" not in sdkconfig + assert "CONFIG_SPIRAM_XIP_FROM_PSRAM" not in sdkconfig From 32133e2f464ec93c968d44cf97e9e689ac81f1ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:42:20 -0500 Subject: [PATCH 136/147] Bump ruff from 0.15.3 to 0.15.4 (#14357) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements_test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements_test.txt b/requirements_test.txt index 88a38ffa99..6b2617b656 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -1,6 +1,6 @@ pylint==4.0.5 flake8==7.3.0 # also change in .pre-commit-config.yaml when updating -ruff==0.15.3 # also change in .pre-commit-config.yaml when updating +ruff==0.15.4 # also change in .pre-commit-config.yaml when updating pyupgrade==3.21.2 # also change in .pre-commit-config.yaml when updating pre-commit From edd63e3d2d82bfc6585c391ebdae25b0313c91e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:43:10 -0500 Subject: [PATCH 137/147] Bump actions/download-artifact from 7.0.0 to 8.0.0 (#14327) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 4 ++-- .github/workflows/release.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b752701920..4c9e8c58bc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -945,13 +945,13 @@ jobs: python-version: ${{ env.DEFAULT_PYTHON }} cache-key: ${{ needs.common.outputs.cache-key }} - name: Download target analysis JSON - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 with: name: memory-analysis-target path: ./memory-analysis continue-on-error: true - name: Download PR analysis JSON - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 with: name: memory-analysis-pr path: ./memory-analysis diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0cca4dcaf6..17a2616dff 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -171,7 +171,7 @@ jobs: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Download digests - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0 with: pattern: digests-* path: /tmp/digests From 63e757807ee2a522f493bc65dd38ced7f3d601dc Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 13:01:09 -0700 Subject: [PATCH 138/147] [zephyr] Use native k_uptime_get() for millis_64() (#14350) Co-authored-by: Claude Opus 4.6 --- esphome/components/zephyr/core.cpp | 5 ++--- esphome/core/scheduler.cpp | 10 +++++----- esphome/core/scheduler.h | 10 +++++----- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/esphome/components/zephyr/core.cpp b/esphome/components/zephyr/core.cpp index 7f5d6d44fa..f0772a4422 100644 --- a/esphome/components/zephyr/core.cpp +++ b/esphome/components/zephyr/core.cpp @@ -4,7 +4,6 @@ #include #include #include -#include "esphome/core/application.h" #include "esphome/core/hal.h" #include "esphome/core/helpers.h" #include "esphome/core/defines.h" @@ -17,8 +16,8 @@ static const device *const WDT = DEVICE_DT_GET(DT_ALIAS(watchdog0)); #endif void yield() { ::k_yield(); } -uint32_t millis() { return k_ticks_to_ms_floor32(k_uptime_ticks()); } -uint64_t millis_64() { return App.scheduler.millis_64_impl_(millis()); } +uint32_t millis() { return static_cast(millis_64()); } +uint64_t millis_64() { return static_cast(k_uptime_get()); } uint32_t micros() { return k_ticks_to_us_floor32(k_uptime_ticks()); } void delayMicroseconds(uint32_t us) { ::k_usleep(us); } void delay(uint32_t ms) { ::k_msleep(ms); } diff --git a/esphome/core/scheduler.cpp b/esphome/core/scheduler.cpp index 97735c4876..73b6a6c9b3 100644 --- a/esphome/core/scheduler.cpp +++ b/esphome/core/scheduler.cpp @@ -28,7 +28,7 @@ static constexpr size_t MAX_POOL_SIZE = 5; // Set to 5 to match the pool size - when we have as many cancelled items as our // pool can hold, it's time to clean up and recycle them. static constexpr uint32_t MAX_LOGICALLY_DELETED_ITEMS = 5; -#if !defined(USE_ESP32) && !defined(USE_HOST) +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) // Half the 32-bit range - used to detect rollovers vs normal time progression static constexpr uint32_t HALF_MAX_UINT32 = std::numeric_limits::max() / 2; #endif @@ -475,12 +475,12 @@ void HOT Scheduler::call(uint32_t now) { if (now_64 - last_print > 2000) { last_print = now_64; std::vector old_items; -#if !defined(USE_ESP32) && !defined(USE_HOST) && defined(ESPHOME_THREAD_MULTI_ATOMICS) +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) && defined(ESPHOME_THREAD_MULTI_ATOMICS) const auto last_dbg = this->last_millis_.load(std::memory_order_relaxed); const auto major_dbg = this->millis_major_.load(std::memory_order_relaxed); ESP_LOGD(TAG, "Items: count=%zu, pool=%zu, now=%" PRIu64 " (%" PRIu16 ", %" PRIu32 ")", this->items_.size(), this->scheduler_item_pool_.size(), now_64, major_dbg, last_dbg); -#elif !defined(USE_ESP32) && !defined(USE_HOST) +#elif !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) ESP_LOGD(TAG, "Items: count=%zu, pool=%zu, now=%" PRIu64 " (%" PRIu16 ", %" PRIu32 ")", this->items_.size(), this->scheduler_item_pool_.size(), now_64, this->millis_major_, this->last_millis_); #else @@ -714,7 +714,7 @@ bool HOT Scheduler::cancel_item_locked_(Component *component, NameType name_type return total_cancelled > 0; } -#if !defined(USE_ESP32) && !defined(USE_HOST) +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) uint64_t Scheduler::millis_64_impl_(uint32_t now) { // THREAD SAFETY NOTE: // This function has three implementations, based on the precompiler flags @@ -872,7 +872,7 @@ uint64_t Scheduler::millis_64_impl_(uint32_t now) { "No platform threading model defined. One of ESPHOME_THREAD_SINGLE, ESPHOME_THREAD_MULTI_NO_ATOMICS, or ESPHOME_THREAD_MULTI_ATOMICS must be defined." #endif } -#endif // !USE_ESP32 && !USE_HOST +#endif // !USE_ESP32 && !USE_HOST && !USE_ZEPHYR bool HOT Scheduler::SchedulerItem::cmp(const SchedulerItemPtr &a, const SchedulerItemPtr &b) { // High bits are almost always equal (change only on 32-bit rollover ~49 days) diff --git a/esphome/core/scheduler.h b/esphome/core/scheduler.h index 9a62ac1634..282f4c66ef 100644 --- a/esphome/core/scheduler.h +++ b/esphome/core/scheduler.h @@ -287,7 +287,7 @@ class Scheduler { // On ESP32, ignores now and uses esp_timer_get_time() directly (native 64-bit). // On non-ESP32, extends now to 64-bit using rollover tracking. uint64_t millis_64_from_(uint32_t now) { -#if defined(USE_ESP32) || defined(USE_HOST) +#if defined(USE_ESP32) || defined(USE_HOST) || defined(USE_ZEPHYR) (void) now; return millis_64(); #else @@ -295,7 +295,7 @@ class Scheduler { #endif } -#if !defined(USE_ESP32) && !defined(USE_HOST) +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) // On platforms without native 64-bit time, millis_64() HAL function delegates to this // method which tracks 32-bit millis() rollover using millis_major_ and last_millis_. friend uint64_t millis_64(); @@ -567,8 +567,8 @@ class Scheduler { // to synchronize between tasks (see https://github.com/esphome/backlog/issues/52) std::vector scheduler_item_pool_; -#if !defined(USE_ESP32) && !defined(USE_HOST) - // On platforms with native 64-bit time (ESP32, Host), no rollover tracking needed. +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) + // On platforms with native 64-bit time (ESP32, Host, Zephyr), no rollover tracking needed. // On other platforms, these fields track 32-bit millis() rollover for millis_64_impl_(). #ifdef ESPHOME_THREAD_MULTI_ATOMICS /* @@ -598,7 +598,7 @@ class Scheduler { #else /* not ESPHOME_THREAD_MULTI_ATOMICS */ uint16_t millis_major_{0}; #endif /* else ESPHOME_THREAD_MULTI_ATOMICS */ -#endif /* !USE_ESP32 && !USE_HOST */ +#endif /* !USE_ESP32 && !USE_HOST && !USE_ZEPHYR */ }; } // namespace esphome From 52af4bced0fdbe0c89a21aa8bb826422467f1936 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 13:01:23 -0700 Subject: [PATCH 139/147] [component] Devirtualize call_dump_config (#14355) --- esphome/components/mqtt/mqtt_component.cpp | 6 ------ esphome/components/mqtt/mqtt_component.h | 2 -- esphome/core/application.cpp | 2 +- esphome/core/component.cpp | 2 +- esphome/core/component.h | 2 +- 5 files changed, 3 insertions(+), 11 deletions(-) diff --git a/esphome/components/mqtt/mqtt_component.cpp b/esphome/components/mqtt/mqtt_component.cpp index 09570106df..f49069960b 100644 --- a/esphome/components/mqtt/mqtt_component.cpp +++ b/esphome/components/mqtt/mqtt_component.cpp @@ -405,12 +405,6 @@ void MQTTComponent::process_resend() { this->schedule_resend_state(); } } -void MQTTComponent::call_dump_config() { - if (this->is_internal()) - return; - - this->dump_config(); -} void MQTTComponent::schedule_resend_state() { this->resend_state_ = true; } bool MQTTComponent::is_connected_() const { return global_mqtt_client->is_connected(); } diff --git a/esphome/components/mqtt/mqtt_component.h b/esphome/components/mqtt/mqtt_component.h index 853712940a..0ffe6341d3 100644 --- a/esphome/components/mqtt/mqtt_component.h +++ b/esphome/components/mqtt/mqtt_component.h @@ -98,8 +98,6 @@ class MQTTComponent : public Component { /// Override setup_ so that we can call send_discovery() when needed. void call_setup() override; - void call_dump_config() override; - /// Send discovery info the Home Assistant, override this. virtual void send_discovery(JsonObject root, SendDiscoveryConfig &config) = 0; diff --git a/esphome/core/application.cpp b/esphome/core/application.cpp index e27c2cdfc6..b1ece86701 100644 --- a/esphome/core/application.cpp +++ b/esphome/core/application.cpp @@ -256,7 +256,7 @@ void Application::process_dump_config_() { #endif } - this->components_[this->dump_config_at_]->call_dump_config(); + this->components_[this->dump_config_at_]->call_dump_config_(); this->dump_config_at_++; } diff --git a/esphome/core/component.cpp b/esphome/core/component.cpp index b4a19a0776..e14fae5e08 100644 --- a/esphome/core/component.cpp +++ b/esphome/core/component.cpp @@ -211,7 +211,7 @@ bool Component::cancel_retry(uint32_t id) { void Component::call_loop_() { this->loop(); } void Component::call_setup() { this->setup(); } -void Component::call_dump_config() { +void Component::call_dump_config_() { this->dump_config(); if (this->is_failed()) { // Look up error message from global vector diff --git a/esphome/core/component.h b/esphome/core/component.h index 7ea9fdf3b3..2620e8eb2a 100644 --- a/esphome/core/component.h +++ b/esphome/core/component.h @@ -291,7 +291,7 @@ class Component { void call_loop_(); virtual void call_setup(); - virtual void call_dump_config(); + void call_dump_config_(); /// Helper to set component state (clears state bits and sets new state) void set_component_state_(uint8_t state); From f6755aabae2fad7ea5c082571502baf281c6d8b8 Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Fri, 27 Feb 2026 15:18:07 -0500 Subject: [PATCH 140/147] [ci] Add PR title format check (#14345) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/scripts/auto-label-pr/detectors.js | 42 +++++------- .github/scripts/detect-tags.js | 66 +++++++++++++++++++ .github/workflows/pr-title-check.yml | 76 ++++++++++++++++++++++ 3 files changed, 157 insertions(+), 27 deletions(-) create mode 100644 .github/scripts/detect-tags.js create mode 100644 .github/workflows/pr-title-check.yml diff --git a/.github/scripts/auto-label-pr/detectors.js b/.github/scripts/auto-label-pr/detectors.js index a45a84f219..80d8847bc1 100644 --- a/.github/scripts/auto-label-pr/detectors.js +++ b/.github/scripts/auto-label-pr/detectors.js @@ -1,5 +1,12 @@ const fs = require('fs'); const { DOCS_PR_PATTERNS } = require('./constants'); +const { + COMPONENT_REGEX, + detectComponents, + hasCoreChanges, + hasDashboardChanges, + hasGitHubActionsChanges, +} = require('../detect-tags'); // Strategy: Merge branch detection async function detectMergeBranch(context) { @@ -20,15 +27,13 @@ async function detectMergeBranch(context) { // Strategy: Component and platform labeling async function detectComponentPlatforms(changedFiles, apiData) { const labels = new Set(); - const componentRegex = /^esphome\/components\/([^\/]+)\//; const targetPlatformRegex = new RegExp(`^esphome\/components\/(${apiData.targetPlatforms.join('|')})/`); - for (const file of changedFiles) { - const componentMatch = file.match(componentRegex); - if (componentMatch) { - labels.add(`component: ${componentMatch[1]}`); - } + for (const comp of detectComponents(changedFiles)) { + labels.add(`component: ${comp}`); + } + for (const file of changedFiles) { const platformMatch = file.match(targetPlatformRegex); if (platformMatch) { labels.add(`platform: ${platformMatch[1]}`); @@ -90,15 +95,9 @@ async function detectNewPlatforms(prFiles, apiData) { // Strategy: Core files detection async function detectCoreChanges(changedFiles) { const labels = new Set(); - const coreFiles = changedFiles.filter(file => - file.startsWith('esphome/core/') || - (file.startsWith('esphome/') && file.split('/').length === 2) - ); - - if (coreFiles.length > 0) { + if (hasCoreChanges(changedFiles)) { labels.add('core'); } - return labels; } @@ -131,29 +130,18 @@ async function detectPRSize(prFiles, totalAdditions, totalDeletions, totalChange // Strategy: Dashboard changes async function detectDashboardChanges(changedFiles) { const labels = new Set(); - const dashboardFiles = changedFiles.filter(file => - file.startsWith('esphome/dashboard/') || - file.startsWith('esphome/components/dashboard_import/') - ); - - if (dashboardFiles.length > 0) { + if (hasDashboardChanges(changedFiles)) { labels.add('dashboard'); } - return labels; } // Strategy: GitHub Actions changes async function detectGitHubActionsChanges(changedFiles) { const labels = new Set(); - const githubActionsFiles = changedFiles.filter(file => - file.startsWith('.github/workflows/') - ); - - if (githubActionsFiles.length > 0) { + if (hasGitHubActionsChanges(changedFiles)) { labels.add('github-actions'); } - return labels; } @@ -259,7 +247,7 @@ async function detectDeprecatedComponents(github, context, changedFiles) { const { owner, repo } = context.repo; // Compile regex once for better performance - const componentFileRegex = /^esphome\/components\/([^\/]+)\//; + const componentFileRegex = COMPONENT_REGEX; // Get files that are modified or added in components directory const componentFiles = changedFiles.filter(file => componentFileRegex.test(file)); diff --git a/.github/scripts/detect-tags.js b/.github/scripts/detect-tags.js new file mode 100644 index 0000000000..3933776c61 --- /dev/null +++ b/.github/scripts/detect-tags.js @@ -0,0 +1,66 @@ +/** + * Shared tag detection from changed file paths. + * Used by pr-title-check and auto-label-pr workflows. + */ + +const COMPONENT_REGEX = /^esphome\/components\/([^\/]+)\//; + +/** + * Detect component names from changed files. + * @param {string[]} changedFiles - List of changed file paths + * @returns {Set} Set of component names + */ +function detectComponents(changedFiles) { + const components = new Set(); + for (const file of changedFiles) { + const match = file.match(COMPONENT_REGEX); + if (match) { + components.add(match[1]); + } + } + return components; +} + +/** + * Detect if core files were changed. + * Core files are in esphome/core/ or top-level esphome/ directory. + * @param {string[]} changedFiles - List of changed file paths + * @returns {boolean} + */ +function hasCoreChanges(changedFiles) { + return changedFiles.some(file => + file.startsWith('esphome/core/') || + (file.startsWith('esphome/') && file.split('/').length === 2) + ); +} + +/** + * Detect if dashboard files were changed. + * @param {string[]} changedFiles - List of changed file paths + * @returns {boolean} + */ +function hasDashboardChanges(changedFiles) { + return changedFiles.some(file => + file.startsWith('esphome/dashboard/') || + file.startsWith('esphome/components/dashboard_import/') + ); +} + +/** + * Detect if GitHub Actions files were changed. + * @param {string[]} changedFiles - List of changed file paths + * @returns {boolean} + */ +function hasGitHubActionsChanges(changedFiles) { + return changedFiles.some(file => + file.startsWith('.github/workflows/') + ); +} + +module.exports = { + COMPONENT_REGEX, + detectComponents, + hasCoreChanges, + hasDashboardChanges, + hasGitHubActionsChanges, +}; diff --git a/.github/workflows/pr-title-check.yml b/.github/workflows/pr-title-check.yml new file mode 100644 index 0000000000..f23c2c870e --- /dev/null +++ b/.github/workflows/pr-title-check.yml @@ -0,0 +1,76 @@ +name: PR Title Check + +on: + pull_request: + types: [opened, edited, synchronize, reopened] + +permissions: + contents: read + pull-requests: read + +jobs: + check: + name: Validate PR title + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0 + with: + script: | + const { + detectComponents, + hasCoreChanges, + hasDashboardChanges, + hasGitHubActionsChanges, + } = require('./.github/scripts/detect-tags.js'); + + const title = context.payload.pull_request.title; + + // Block titles starting with "word:" or "word(scope):" patterns + const commitStylePattern = /^\w+(\(.*?\))?[!]?\s*:/; + if (commitStylePattern.test(title)) { + core.setFailed( + `PR title should not start with a "prefix:" style format.\n` + + `Please use the format: [component] Brief description\n` + + `Example: [pn532] Add health checking and auto-reset` + ); + return; + } + + // Get changed files to detect tags + const files = await github.paginate(github.rest.pulls.listFiles, { + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: context.issue.number, + }); + const filenames = files.map(f => f.filename); + + // Detect tags from changed files using shared logic + const tags = new Set(); + + for (const comp of detectComponents(filenames)) { + tags.add(comp); + } + if (hasCoreChanges(filenames)) tags.add('core'); + if (hasDashboardChanges(filenames)) tags.add('dashboard'); + if (hasGitHubActionsChanges(filenames)) tags.add('ci'); + + if (tags.size === 0) { + return; + } + + // Check title starts with [tag] prefix + const bracketPattern = /^\[\w+\]/; + if (!bracketPattern.test(title)) { + const suggestion = [...tags].map(c => `[${c}]`).join(''); + // Skip if the suggested prefix would be too long for a readable title + if (suggestion.length > 40) { + return; + } + core.setFailed( + `PR modifies: ${[...tags].join(', ')}\n` + + `Title must start with a [tag] prefix.\n` + + `Suggested: ${suggestion} ` + ); + } From 280f874edc36ce5127d005a526c5f4537d453f70 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 14:18:02 -0700 Subject: [PATCH 141/147] [rp2040] Use native time_us_64() for millis_64() (#14356) Co-authored-by: Claude Opus 4.6 --- esphome/components/rp2040/core.cpp | 12 ++++++------ esphome/core/scheduler.cpp | 11 ++++++----- esphome/core/scheduler.h | 14 +++++++------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/esphome/components/rp2040/core.cpp b/esphome/components/rp2040/core.cpp index 52c6f1185c..8b86de4be1 100644 --- a/esphome/components/rp2040/core.cpp +++ b/esphome/components/rp2040/core.cpp @@ -3,19 +3,19 @@ #include "core.h" #include "esphome/core/defines.h" #include "esphome/core/hal.h" -#include "esphome/core/application.h" #include "esphome/core/helpers.h" +#include "hardware/timer.h" #include "hardware/watchdog.h" namespace esphome { void HOT yield() { ::yield(); } -uint32_t IRAM_ATTR HOT millis() { return ::millis(); } -uint64_t millis_64() { return App.scheduler.millis_64_impl_(::millis()); } +uint64_t millis_64() { return time_us_64() / 1000ULL; } +uint32_t HOT millis() { return static_cast(millis_64()); } void HOT delay(uint32_t ms) { ::delay(ms); } -uint32_t IRAM_ATTR HOT micros() { return ::micros(); } -void IRAM_ATTR HOT delayMicroseconds(uint32_t us) { delay_microseconds_safe(us); } +uint32_t HOT micros() { return ::micros(); } +void HOT delayMicroseconds(uint32_t us) { delay_microseconds_safe(us); } void arch_restart() { watchdog_reboot(0, 0, 10); while (1) { @@ -34,7 +34,7 @@ void HOT arch_feed_wdt() { watchdog_update(); } uint8_t progmem_read_byte(const uint8_t *addr) { return pgm_read_byte(addr); // NOLINT } -uint32_t IRAM_ATTR HOT arch_get_cpu_cycle_count() { return ulMainGetRunTimeCounterValue(); } +uint32_t HOT arch_get_cpu_cycle_count() { return ulMainGetRunTimeCounterValue(); } uint32_t arch_get_cpu_freq_hz() { return RP2040::f_cpu(); } } // namespace esphome diff --git a/esphome/core/scheduler.cpp b/esphome/core/scheduler.cpp index 73b6a6c9b3..2c10e7e2da 100644 --- a/esphome/core/scheduler.cpp +++ b/esphome/core/scheduler.cpp @@ -28,7 +28,7 @@ static constexpr size_t MAX_POOL_SIZE = 5; // Set to 5 to match the pool size - when we have as many cancelled items as our // pool can hold, it's time to clean up and recycle them. static constexpr uint32_t MAX_LOGICALLY_DELETED_ITEMS = 5; -#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) && !defined(USE_RP2040) // Half the 32-bit range - used to detect rollovers vs normal time progression static constexpr uint32_t HALF_MAX_UINT32 = std::numeric_limits::max() / 2; #endif @@ -475,12 +475,13 @@ void HOT Scheduler::call(uint32_t now) { if (now_64 - last_print > 2000) { last_print = now_64; std::vector old_items; -#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) && defined(ESPHOME_THREAD_MULTI_ATOMICS) +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) && !defined(USE_RP2040) && \ + defined(ESPHOME_THREAD_MULTI_ATOMICS) const auto last_dbg = this->last_millis_.load(std::memory_order_relaxed); const auto major_dbg = this->millis_major_.load(std::memory_order_relaxed); ESP_LOGD(TAG, "Items: count=%zu, pool=%zu, now=%" PRIu64 " (%" PRIu16 ", %" PRIu32 ")", this->items_.size(), this->scheduler_item_pool_.size(), now_64, major_dbg, last_dbg); -#elif !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) +#elif !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) && !defined(USE_RP2040) ESP_LOGD(TAG, "Items: count=%zu, pool=%zu, now=%" PRIu64 " (%" PRIu16 ", %" PRIu32 ")", this->items_.size(), this->scheduler_item_pool_.size(), now_64, this->millis_major_, this->last_millis_); #else @@ -714,7 +715,7 @@ bool HOT Scheduler::cancel_item_locked_(Component *component, NameType name_type return total_cancelled > 0; } -#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) && !defined(USE_RP2040) uint64_t Scheduler::millis_64_impl_(uint32_t now) { // THREAD SAFETY NOTE: // This function has three implementations, based on the precompiler flags @@ -872,7 +873,7 @@ uint64_t Scheduler::millis_64_impl_(uint32_t now) { "No platform threading model defined. One of ESPHOME_THREAD_SINGLE, ESPHOME_THREAD_MULTI_NO_ATOMICS, or ESPHOME_THREAD_MULTI_ATOMICS must be defined." #endif } -#endif // !USE_ESP32 && !USE_HOST && !USE_ZEPHYR +#endif // !USE_ESP32 && !USE_HOST && !USE_ZEPHYR && !USE_RP2040 bool HOT Scheduler::SchedulerItem::cmp(const SchedulerItemPtr &a, const SchedulerItemPtr &b) { // High bits are almost always equal (change only on 32-bit rollover ~49 days) diff --git a/esphome/core/scheduler.h b/esphome/core/scheduler.h index 282f4c66ef..d52cf5147d 100644 --- a/esphome/core/scheduler.h +++ b/esphome/core/scheduler.h @@ -284,10 +284,10 @@ class Scheduler { bool cancel_retry_(Component *component, NameType name_type, const char *static_name, uint32_t hash_or_id); // Extend a 32-bit millis() value to 64-bit. Use when the caller already has a fresh now. - // On ESP32, ignores now and uses esp_timer_get_time() directly (native 64-bit). - // On non-ESP32, extends now to 64-bit using rollover tracking. + // On ESP32, Host, Zephyr, and RP2040, ignores now and uses the native 64-bit time source via millis_64(). + // On other platforms, extends now to 64-bit using rollover tracking. uint64_t millis_64_from_(uint32_t now) { -#if defined(USE_ESP32) || defined(USE_HOST) || defined(USE_ZEPHYR) +#if defined(USE_ESP32) || defined(USE_HOST) || defined(USE_ZEPHYR) || defined(USE_RP2040) (void) now; return millis_64(); #else @@ -295,7 +295,7 @@ class Scheduler { #endif } -#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) && !defined(USE_RP2040) // On platforms without native 64-bit time, millis_64() HAL function delegates to this // method which tracks 32-bit millis() rollover using millis_major_ and last_millis_. friend uint64_t millis_64(); @@ -567,8 +567,8 @@ class Scheduler { // to synchronize between tasks (see https://github.com/esphome/backlog/issues/52) std::vector scheduler_item_pool_; -#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) - // On platforms with native 64-bit time (ESP32, Host, Zephyr), no rollover tracking needed. +#if !defined(USE_ESP32) && !defined(USE_HOST) && !defined(USE_ZEPHYR) && !defined(USE_RP2040) + // On platforms with native 64-bit time (ESP32, Host, Zephyr, RP2040), no rollover tracking needed. // On other platforms, these fields track 32-bit millis() rollover for millis_64_impl_(). #ifdef ESPHOME_THREAD_MULTI_ATOMICS /* @@ -598,7 +598,7 @@ class Scheduler { #else /* not ESPHOME_THREAD_MULTI_ATOMICS */ uint16_t millis_major_{0}; #endif /* else ESPHOME_THREAD_MULTI_ATOMICS */ -#endif /* !USE_ESP32 && !USE_HOST && !USE_ZEPHYR */ +#endif /* !USE_ESP32 && !USE_HOST && !USE_ZEPHYR && !USE_RP2040 */ }; } // namespace esphome From bb567827a1e2f67a362d0a385868e438df8b71aa Mon Sep 17 00:00:00 2001 From: Laura Wratten Date: Sat, 28 Feb 2026 08:23:32 +1100 Subject: [PATCH 142/147] [sht3xd] Allow sensors that don't support serial number read (#14224) Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> --- esphome/components/sht3xd/sht3xd.cpp | 43 ++++++++-------------------- esphome/components/sht3xd/sht3xd.h | 9 ------ 2 files changed, 12 insertions(+), 40 deletions(-) diff --git a/esphome/components/sht3xd/sht3xd.cpp b/esphome/components/sht3xd/sht3xd.cpp index bd3dec6fb8..8050a2d5f9 100644 --- a/esphome/components/sht3xd/sht3xd.cpp +++ b/esphome/components/sht3xd/sht3xd.cpp @@ -12,6 +12,8 @@ static const char *const TAG = "sht3xd"; // To ensure compatibility, reading serial number using the register with clock stretching register enabled // (used originally in this component) is tried first and if that fails the alternate register address // with clock stretching disabled is read. +// If both fail (e.g. some clones don't support the command), we continue so temp/humidity still work. +// Second attempt uses 10ms delay for boards that need more time before read (max permitted by ESPHome guidelines). static const uint16_t SHT3XD_COMMAND_READ_SERIAL_NUMBER_CLOCK_STRETCHING = 0x3780; static const uint16_t SHT3XD_COMMAND_READ_SERIAL_NUMBER = 0x3682; @@ -25,49 +27,28 @@ static const uint16_t SHT3XD_COMMAND_POLLING_H = 0x2400; static const uint16_t SHT3XD_COMMAND_FETCH_DATA = 0xE000; void SHT3XDComponent::setup() { - uint16_t raw_serial_number[2]; + uint16_t raw_serial_number[2]{0}; if (!this->get_register(SHT3XD_COMMAND_READ_SERIAL_NUMBER_CLOCK_STRETCHING, raw_serial_number, 2)) { - this->error_code_ = READ_SERIAL_STRETCHED_FAILED; - if (!this->get_register(SHT3XD_COMMAND_READ_SERIAL_NUMBER, raw_serial_number, 2)) { - this->error_code_ = READ_SERIAL_FAILED; - this->mark_failed(); - return; + if (!this->get_register(SHT3XD_COMMAND_READ_SERIAL_NUMBER, raw_serial_number, 2, 10)) { + ESP_LOGW(TAG, "Serial number read failed, continuing without it (clone or non-standard sensor)"); } } - this->serial_number_ = (uint32_t(raw_serial_number[0]) << 16) | uint32_t(raw_serial_number[1]); - if (!this->write_command(heater_enabled_ ? SHT3XD_COMMAND_HEATER_ENABLE : SHT3XD_COMMAND_HEATER_DISABLE)) { - this->error_code_ = WRITE_HEATER_MODE_FAILED; - this->mark_failed(); + if (!this->write_command(this->heater_enabled_ ? SHT3XD_COMMAND_HEATER_ENABLE : SHT3XD_COMMAND_HEATER_DISABLE)) { + this->mark_failed(LOG_STR("Failed to set heater mode")); return; } } void SHT3XDComponent::dump_config() { - ESP_LOGCONFIG(TAG, "SHT3xD:"); - switch (this->error_code_) { - case READ_SERIAL_FAILED: - ESP_LOGD(TAG, " Error reading serial number"); - break; - case WRITE_HEATER_MODE_FAILED: - ESP_LOGD(TAG, " Error writing heater mode"); - break; - default: - break; - } - if (this->is_failed()) { - ESP_LOGE(TAG, " Communication with SHT3xD failed!"); - return; - } - ESP_LOGD(TAG, - " Serial Number: 0x%08" PRIX32 "\n" - " Heater Enabled: %s", - this->serial_number_, TRUEFALSE(this->heater_enabled_)); - + ESP_LOGCONFIG(TAG, + "SHT3xD:\n" + " Serial Number: 0x%08" PRIX32 "\n" + " Heater Enabled: %s", + this->serial_number_, TRUEFALSE(this->heater_enabled_)); LOG_I2C_DEVICE(this); LOG_UPDATE_INTERVAL(this); - LOG_SENSOR(" ", "Temperature", this->temperature_sensor_); LOG_SENSOR(" ", "Humidity", this->humidity_sensor_); } diff --git a/esphome/components/sht3xd/sht3xd.h b/esphome/components/sht3xd/sht3xd.h index 43f1a4d8e2..54514d6de7 100644 --- a/esphome/components/sht3xd/sht3xd.h +++ b/esphome/components/sht3xd/sht3xd.h @@ -4,8 +4,6 @@ #include "esphome/components/sensor/sensor.h" #include "esphome/components/sensirion_common/i2c_sensirion.h" -#include - namespace esphome { namespace sht3xd { @@ -21,13 +19,6 @@ class SHT3XDComponent : public PollingComponent, public sensirion_common::Sensir void set_heater_enabled(bool heater_enabled) { heater_enabled_ = heater_enabled; } protected: - enum ErrorCode { - NONE = 0, - READ_SERIAL_STRETCHED_FAILED, - READ_SERIAL_FAILED, - WRITE_HEATER_MODE_FAILED, - } error_code_{NONE}; - sensor::Sensor *temperature_sensor_{nullptr}; sensor::Sensor *humidity_sensor_{nullptr}; bool heater_enabled_{true}; From 5e3857abf7dded7d731cdd5663b23ca0edb6491f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Feb 2026 16:25:36 -0500 Subject: [PATCH 143/147] Bump click from 8.1.7 to 8.3.1 (#11955) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 95e3710f9e..f111e05a9d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,7 +10,7 @@ tzdata>=2021.1 # from time pyserial==3.5 platformio==6.1.19 esptool==5.2.0 -click==8.1.7 +click==8.3.1 esphome-dashboard==20260210.0 aioesphomeapi==44.2.0 zeroconf==0.148.0 From b9d70dcda2d5ff6bad34c6c72ae12f5c9b9cd6e6 Mon Sep 17 00:00:00 2001 From: Martin Ebner <185941678+mebner86@users.noreply.github.com> Date: Sat, 28 Feb 2026 03:11:28 +0530 Subject: [PATCH 144/147] [sen6x] Add SEN6x sensor support (#12553) Co-authored-by: Martin Ebner Co-authored-by: Tobias Stanzel Co-authored-by: Big Mike Co-authored-by: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> --- CODEOWNERS | 1 + esphome/components/sen6x/__init__.py | 0 esphome/components/sen6x/sen6x.cpp | 376 +++++++++++++++++++ esphome/components/sen6x/sen6x.h | 43 +++ esphome/components/sen6x/sensor.py | 149 ++++++++ tests/components/sen6x/common.yaml | 37 ++ tests/components/sen6x/test.esp32-idf.yaml | 4 + tests/components/sen6x/test.esp8266-ard.yaml | 4 + tests/components/sen6x/test.rp2040-ard.yaml | 4 + 9 files changed, 618 insertions(+) create mode 100644 esphome/components/sen6x/__init__.py create mode 100644 esphome/components/sen6x/sen6x.cpp create mode 100644 esphome/components/sen6x/sen6x.h create mode 100644 esphome/components/sen6x/sensor.py create mode 100644 tests/components/sen6x/common.yaml create mode 100644 tests/components/sen6x/test.esp32-idf.yaml create mode 100644 tests/components/sen6x/test.esp8266-ard.yaml create mode 100644 tests/components/sen6x/test.rp2040-ard.yaml diff --git a/CODEOWNERS b/CODEOWNERS index 6728e76bba..4c97b7f99d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -429,6 +429,7 @@ esphome/components/select/* @esphome/core esphome/components/sen0321/* @notjj esphome/components/sen21231/* @shreyaskarnik esphome/components/sen5x/* @martgras +esphome/components/sen6x/* @martgras @mebner86 @mikelawrence @tuct esphome/components/sensirion_common/* @martgras esphome/components/sensor/* @esphome/core esphome/components/sfa30/* @ghsensdev diff --git a/esphome/components/sen6x/__init__.py b/esphome/components/sen6x/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/esphome/components/sen6x/sen6x.cpp b/esphome/components/sen6x/sen6x.cpp new file mode 100644 index 0000000000..baaadd6463 --- /dev/null +++ b/esphome/components/sen6x/sen6x.cpp @@ -0,0 +1,376 @@ +#include "sen6x.h" +#include "esphome/core/hal.h" +#include "esphome/core/log.h" +#include +#include +#include + +namespace esphome::sen6x { + +static const char *const TAG = "sen6x"; + +static constexpr uint16_t SEN6X_CMD_GET_DATA_READY_STATUS = 0x0202; +static constexpr uint16_t SEN6X_CMD_GET_FIRMWARE_VERSION = 0xD100; +static constexpr uint16_t SEN6X_CMD_GET_PRODUCT_NAME = 0xD014; +static constexpr uint16_t SEN6X_CMD_GET_SERIAL_NUMBER = 0xD033; + +static constexpr uint16_t SEN6X_CMD_READ_MEASUREMENT = 0x0300; // SEN66 only! +static constexpr uint16_t SEN6X_CMD_READ_MEASUREMENT_SEN62 = 0x04A3; +static constexpr uint16_t SEN6X_CMD_READ_MEASUREMENT_SEN63C = 0x0471; +static constexpr uint16_t SEN6X_CMD_READ_MEASUREMENT_SEN65 = 0x0446; +static constexpr uint16_t SEN6X_CMD_READ_MEASUREMENT_SEN68 = 0x0467; +static constexpr uint16_t SEN6X_CMD_READ_MEASUREMENT_SEN69C = 0x04B5; + +static constexpr uint16_t SEN6X_CMD_START_MEASUREMENTS = 0x0021; +static constexpr uint16_t SEN6X_CMD_RESET = 0xD304; + +static inline void set_read_command_and_words(SEN6XComponent::Sen6xType type, uint16_t &read_cmd, uint8_t &read_words) { + read_cmd = SEN6X_CMD_READ_MEASUREMENT; + read_words = 9; + switch (type) { + case SEN6XComponent::SEN62: + read_cmd = SEN6X_CMD_READ_MEASUREMENT_SEN62; + read_words = 6; + break; + case SEN6XComponent::SEN63C: + read_cmd = SEN6X_CMD_READ_MEASUREMENT_SEN63C; + read_words = 7; + break; + case SEN6XComponent::SEN65: + read_cmd = SEN6X_CMD_READ_MEASUREMENT_SEN65; + read_words = 8; + break; + case SEN6XComponent::SEN66: + read_cmd = SEN6X_CMD_READ_MEASUREMENT; + read_words = 9; + break; + case SEN6XComponent::SEN68: + read_cmd = SEN6X_CMD_READ_MEASUREMENT_SEN68; + read_words = 9; + break; + case SEN6XComponent::SEN69C: + read_cmd = SEN6X_CMD_READ_MEASUREMENT_SEN69C; + read_words = 10; + break; + default: + break; + } +} + +void SEN6XComponent::setup() { + ESP_LOGCONFIG(TAG, "Setting up sen6x..."); + + // the sensor needs 100 ms to enter the idle state + this->set_timeout(100, [this]() { + // Reset the sensor to ensure a clean state regardless of prior commands or power issues + if (!this->write_command(SEN6X_CMD_RESET)) { + ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL); + this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL)); + return; + } + + // After reset the sensor needs 100 ms to become ready + this->set_timeout(100, [this]() { + // Step 1: Read serial number (~25ms with I2C delay) + uint16_t raw_serial_number[16]; + if (!this->get_register(SEN6X_CMD_GET_SERIAL_NUMBER, raw_serial_number, 16, 20)) { + ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL); + this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL)); + return; + } + this->serial_number_ = SEN6XComponent::sensirion_convert_to_string_in_place(raw_serial_number, 16); + ESP_LOGI(TAG, "Serial number: %s", this->serial_number_.c_str()); + + // Step 2: Read product name in next loop iteration + this->set_timeout(0, [this]() { + uint16_t raw_product_name[16]; + if (!this->get_register(SEN6X_CMD_GET_PRODUCT_NAME, raw_product_name, 16, 20)) { + ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL); + this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL)); + return; + } + + this->product_name_ = SEN6XComponent::sensirion_convert_to_string_in_place(raw_product_name, 16); + + Sen6xType inferred_type = this->infer_type_from_product_name_(this->product_name_); + if (this->sen6x_type_ == UNKNOWN) { + this->sen6x_type_ = inferred_type; + if (inferred_type == UNKNOWN) { + ESP_LOGE(TAG, "Unknown product '%s'", this->product_name_.c_str()); + this->mark_failed(); + return; + } + ESP_LOGD(TAG, "Type inferred from product: %s", this->product_name_.c_str()); + } else if (this->sen6x_type_ != inferred_type && inferred_type != UNKNOWN) { + ESP_LOGW(TAG, "Configured type (used) mismatches product '%s'", this->product_name_.c_str()); + } + ESP_LOGI(TAG, "Product: %s", this->product_name_.c_str()); + + // Validate configured sensors against detected type and disable unsupported ones + const bool has_voc_nox = (this->sen6x_type_ == SEN65 || this->sen6x_type_ == SEN66 || + this->sen6x_type_ == SEN68 || this->sen6x_type_ == SEN69C); + const bool has_co2 = (this->sen6x_type_ == SEN63C || this->sen6x_type_ == SEN66 || this->sen6x_type_ == SEN69C); + const bool has_hcho = (this->sen6x_type_ == SEN68 || this->sen6x_type_ == SEN69C); + if (this->voc_sensor_ && !has_voc_nox) { + ESP_LOGE(TAG, "VOC requires SEN65, SEN66, SEN68, or SEN69C"); + this->voc_sensor_ = nullptr; + } + if (this->nox_sensor_ && !has_voc_nox) { + ESP_LOGE(TAG, "NOx requires SEN65, SEN66, SEN68, or SEN69C"); + this->nox_sensor_ = nullptr; + } + if (this->co2_sensor_ && !has_co2) { + ESP_LOGE(TAG, "CO2 requires SEN63C, SEN66, or SEN69C"); + this->co2_sensor_ = nullptr; + } + if (this->hcho_sensor_ && !has_hcho) { + ESP_LOGE(TAG, "Formaldehyde requires SEN68 or SEN69C"); + this->hcho_sensor_ = nullptr; + } + + // Step 3: Read firmware version and start measurements in next loop iteration + this->set_timeout(0, [this]() { + uint16_t raw_firmware_version = 0; + if (!this->get_register(SEN6X_CMD_GET_FIRMWARE_VERSION, raw_firmware_version, 20)) { + ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL); + this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL)); + return; + } + this->firmware_version_major_ = (raw_firmware_version >> 8) & 0xFF; + this->firmware_version_minor_ = raw_firmware_version & 0xFF; + ESP_LOGI(TAG, "Firmware: %u.%u", this->firmware_version_major_, this->firmware_version_minor_); + + if (!this->write_command(SEN6X_CMD_START_MEASUREMENTS)) { + ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL); + this->mark_failed(LOG_STR(ESP_LOG_MSG_COMM_FAIL)); + return; + } + + this->set_timeout(60000, [this]() { this->startup_complete_ = true; }); + this->initialized_ = true; + ESP_LOGD(TAG, "Initialized"); + }); + }); + }); + }); +} + +void SEN6XComponent::dump_config() { + ESP_LOGCONFIG(TAG, + "sen6x:\n" + " Product: %s\n" + " Serial: %s\n" + " Firmware: %u.%u\n" + " Address: 0x%02X", + this->product_name_.c_str(), this->serial_number_.c_str(), this->firmware_version_major_, + this->firmware_version_minor_, this->address_); + LOG_UPDATE_INTERVAL(this); + LOG_SENSOR(" ", "PM 1.0", this->pm_1_0_sensor_); + LOG_SENSOR(" ", "PM 2.5", this->pm_2_5_sensor_); + LOG_SENSOR(" ", "PM 4.0", this->pm_4_0_sensor_); + LOG_SENSOR(" ", "PM 10.0", this->pm_10_0_sensor_); + LOG_SENSOR(" ", "Temperature", this->temperature_sensor_); + LOG_SENSOR(" ", "Humidity", this->humidity_sensor_); + LOG_SENSOR(" ", "VOC", this->voc_sensor_); + LOG_SENSOR(" ", "NOx", this->nox_sensor_); + LOG_SENSOR(" ", "HCHO", this->hcho_sensor_); + LOG_SENSOR(" ", "CO2", this->co2_sensor_); +} + +void SEN6XComponent::update() { + if (!this->initialized_) { + return; + } + + uint16_t read_cmd; + uint8_t read_words; + set_read_command_and_words(this->sen6x_type_, read_cmd, read_words); + + const uint8_t poll_retries = 24; + auto poll_ready = std::make_shared>(); + *poll_ready = [this, poll_ready, read_cmd, read_words](uint8_t retries_left) { + const uint8_t attempt = static_cast(poll_retries - retries_left + 1); + ESP_LOGV(TAG, "Data ready polling attempt %u", attempt); + + if (!this->write_command(SEN6X_CMD_GET_DATA_READY_STATUS)) { + this->status_set_warning(); + ESP_LOGD(TAG, "write data ready status error (%d)", this->last_error_); + return; + } + + this->set_timeout(20, [this, poll_ready, retries_left, read_cmd, read_words]() { + uint16_t raw_read_status; + if (!this->read_data(&raw_read_status, 1)) { + this->status_set_warning(); + ESP_LOGD(TAG, "read data ready status error (%d)", this->last_error_); + return; + } + + if ((raw_read_status & 0x0001) == 0) { + if (retries_left == 0) { + this->status_set_warning(); + ESP_LOGD(TAG, "Data not ready"); + return; + } + this->set_timeout(50, [poll_ready, retries_left]() { (*poll_ready)(retries_left - 1); }); + return; + } + + if (!this->write_command(read_cmd)) { + this->status_set_warning(); + ESP_LOGD(TAG, "Read measurement failed (%d)", this->last_error_); + return; + } + + this->set_timeout(20, [this, read_words]() { + uint16_t measurements[10]; + + if (!this->read_data(measurements, read_words)) { + this->status_set_warning(); + ESP_LOGD(TAG, "Read data failed (%d)", this->last_error_); + return; + } + int8_t voc_index = -1; + int8_t nox_index = -1; + int8_t hcho_index = -1; + int8_t co2_index = -1; + bool co2_uint16 = false; + switch (this->sen6x_type_) { + case SEN62: + break; + case SEN63C: + co2_index = 6; + break; + case SEN65: + voc_index = 6; + nox_index = 7; + break; + case SEN66: + voc_index = 6; + nox_index = 7; + co2_index = 8; + co2_uint16 = true; + break; + case SEN68: + voc_index = 6; + nox_index = 7; + hcho_index = 8; + break; + case SEN69C: + voc_index = 6; + nox_index = 7; + hcho_index = 8; + co2_index = 9; + break; + default: + break; + } + + float pm_1_0 = measurements[0] / 10.0f; + if (measurements[0] == 0xFFFF) + pm_1_0 = NAN; + float pm_2_5 = measurements[1] / 10.0f; + if (measurements[1] == 0xFFFF) + pm_2_5 = NAN; + float pm_4_0 = measurements[2] / 10.0f; + if (measurements[2] == 0xFFFF) + pm_4_0 = NAN; + float pm_10_0 = measurements[3] / 10.0f; + if (measurements[3] == 0xFFFF) + pm_10_0 = NAN; + float humidity = static_cast(measurements[4]) / 100.0f; + if (measurements[4] == 0x7FFF) + humidity = NAN; + float temperature = static_cast(measurements[5]) / 200.0f; + if (measurements[5] == 0x7FFF) + temperature = NAN; + + float voc = NAN; + float nox = NAN; + float hcho = NAN; + float co2 = NAN; + + if (voc_index >= 0) { + voc = static_cast(measurements[voc_index]) / 10.0f; + if (measurements[voc_index] == 0x7FFF) + voc = NAN; + } + if (nox_index >= 0) { + nox = static_cast(measurements[nox_index]) / 10.0f; + if (measurements[nox_index] == 0x7FFF) + nox = NAN; + } + + if (hcho_index >= 0) { + const uint16_t hcho_raw = measurements[hcho_index]; + hcho = hcho_raw / 10.0f; + if (hcho_raw == 0xFFFF) + hcho = NAN; + } + + if (co2_index >= 0) { + if (co2_uint16) { + const uint16_t co2_raw = measurements[co2_index]; + co2 = static_cast(co2_raw); + if (co2_raw == 0xFFFF) + co2 = NAN; + } else { + const int16_t co2_raw = static_cast(measurements[co2_index]); + co2 = static_cast(co2_raw); + if (co2_raw == 0x7FFF) + co2 = NAN; + } + } + + if (!this->startup_complete_) { + ESP_LOGD(TAG, "Startup delay, ignoring values"); + this->status_clear_warning(); + return; + } + + if (this->pm_1_0_sensor_ != nullptr) + this->pm_1_0_sensor_->publish_state(pm_1_0); + if (this->pm_2_5_sensor_ != nullptr) + this->pm_2_5_sensor_->publish_state(pm_2_5); + if (this->pm_4_0_sensor_ != nullptr) + this->pm_4_0_sensor_->publish_state(pm_4_0); + if (this->pm_10_0_sensor_ != nullptr) + this->pm_10_0_sensor_->publish_state(pm_10_0); + if (this->temperature_sensor_ != nullptr) + this->temperature_sensor_->publish_state(temperature); + if (this->humidity_sensor_ != nullptr) + this->humidity_sensor_->publish_state(humidity); + if (this->voc_sensor_ != nullptr) + this->voc_sensor_->publish_state(voc); + if (this->nox_sensor_ != nullptr) + this->nox_sensor_->publish_state(nox); + if (this->hcho_sensor_ != nullptr) + this->hcho_sensor_->publish_state(hcho); + if (this->co2_sensor_ != nullptr) + this->co2_sensor_->publish_state(co2); + + this->status_clear_warning(); + }); + }); + }; + + (*poll_ready)(poll_retries); +} + +SEN6XComponent::Sen6xType SEN6XComponent::infer_type_from_product_name_(const std::string &product_name) { + if (product_name == "SEN62") + return SEN62; + if (product_name == "SEN63C") + return SEN63C; + if (product_name == "SEN65") + return SEN65; + if (product_name == "SEN66") + return SEN66; + if (product_name == "SEN68") + return SEN68; + if (product_name == "SEN69C") + return SEN69C; + return UNKNOWN; +} + +} // namespace esphome::sen6x diff --git a/esphome/components/sen6x/sen6x.h b/esphome/components/sen6x/sen6x.h new file mode 100644 index 0000000000..01e89dce1b --- /dev/null +++ b/esphome/components/sen6x/sen6x.h @@ -0,0 +1,43 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/components/sensor/sensor.h" +#include "esphome/components/sensirion_common/i2c_sensirion.h" + +namespace esphome::sen6x { + +class SEN6XComponent : public PollingComponent, public sensirion_common::SensirionI2CDevice { + SUB_SENSOR(pm_1_0) + SUB_SENSOR(pm_2_5) + SUB_SENSOR(pm_4_0) + SUB_SENSOR(pm_10_0) + SUB_SENSOR(temperature) + SUB_SENSOR(humidity) + SUB_SENSOR(voc) + SUB_SENSOR(nox) + SUB_SENSOR(co2) + SUB_SENSOR(hcho) + + public: + float get_setup_priority() const override { return setup_priority::DATA; } + void setup() override; + void dump_config() override; + void update() override; + + enum Sen6xType { SEN62, SEN63C, SEN65, SEN66, SEN68, SEN69C, UNKNOWN }; + + void set_type(const std::string &type) { sen6x_type_ = infer_type_from_product_name_(type); } + + protected: + Sen6xType infer_type_from_product_name_(const std::string &product_name); + + bool initialized_{false}; + std::string product_name_; + Sen6xType sen6x_type_{UNKNOWN}; + std::string serial_number_; + uint8_t firmware_version_major_{0}; + uint8_t firmware_version_minor_{0}; + bool startup_complete_{false}; +}; + +} // namespace esphome::sen6x diff --git a/esphome/components/sen6x/sensor.py b/esphome/components/sen6x/sensor.py new file mode 100644 index 0000000000..071478e719 --- /dev/null +++ b/esphome/components/sen6x/sensor.py @@ -0,0 +1,149 @@ +import esphome.codegen as cg +from esphome.components import i2c, sensirion_common, sensor +import esphome.config_validation as cv +from esphome.const import ( + CONF_CO2, + CONF_FORMALDEHYDE, + CONF_HUMIDITY, + CONF_ID, + CONF_NOX, + CONF_PM_1_0, + CONF_PM_2_5, + CONF_PM_4_0, + CONF_PM_10_0, + CONF_TEMPERATURE, + CONF_TYPE, + CONF_VOC, + DEVICE_CLASS_AQI, + DEVICE_CLASS_CARBON_DIOXIDE, + DEVICE_CLASS_HUMIDITY, + DEVICE_CLASS_PM1, + DEVICE_CLASS_PM10, + DEVICE_CLASS_PM25, + DEVICE_CLASS_TEMPERATURE, + ICON_CHEMICAL_WEAPON, + ICON_MOLECULE_CO2, + ICON_RADIATOR, + ICON_THERMOMETER, + ICON_WATER_PERCENT, + STATE_CLASS_MEASUREMENT, + UNIT_CELSIUS, + UNIT_MICROGRAMS_PER_CUBIC_METER, + UNIT_PARTS_PER_MILLION, + UNIT_PERCENT, +) + +CODEOWNERS = ["@martgras", "@mebner86", "@mikelawrence", "@tuct"] +DEPENDENCIES = ["i2c"] +AUTO_LOAD = ["sensirion_common"] + +sen6x_ns = cg.esphome_ns.namespace("sen6x") +SEN6XComponent = sen6x_ns.class_( + "SEN6XComponent", cg.PollingComponent, sensirion_common.SensirionI2CDevice +) + +CONFIG_SCHEMA = ( + cv.Schema( + { + cv.GenerateID(): cv.declare_id(SEN6XComponent), + cv.Optional(CONF_TYPE): cv.one_of( + "SEN62", "SEN63C", "SEN65", "SEN66", "SEN68", "SEN69C", upper=True + ), + cv.Optional(CONF_PM_1_0): sensor.sensor_schema( + unit_of_measurement=UNIT_MICROGRAMS_PER_CUBIC_METER, + icon=ICON_CHEMICAL_WEAPON, + accuracy_decimals=2, + device_class=DEVICE_CLASS_PM1, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_PM_2_5): sensor.sensor_schema( + unit_of_measurement=UNIT_MICROGRAMS_PER_CUBIC_METER, + icon=ICON_CHEMICAL_WEAPON, + accuracy_decimals=2, + device_class=DEVICE_CLASS_PM25, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_PM_4_0): sensor.sensor_schema( + unit_of_measurement=UNIT_MICROGRAMS_PER_CUBIC_METER, + icon=ICON_CHEMICAL_WEAPON, + accuracy_decimals=2, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_PM_10_0): sensor.sensor_schema( + unit_of_measurement=UNIT_MICROGRAMS_PER_CUBIC_METER, + icon=ICON_CHEMICAL_WEAPON, + accuracy_decimals=2, + device_class=DEVICE_CLASS_PM10, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema( + unit_of_measurement=UNIT_CELSIUS, + icon=ICON_THERMOMETER, + accuracy_decimals=2, + device_class=DEVICE_CLASS_TEMPERATURE, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_HUMIDITY): sensor.sensor_schema( + unit_of_measurement=UNIT_PERCENT, + icon=ICON_WATER_PERCENT, + accuracy_decimals=2, + device_class=DEVICE_CLASS_HUMIDITY, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_VOC): sensor.sensor_schema( + icon=ICON_RADIATOR, + accuracy_decimals=0, + device_class=DEVICE_CLASS_AQI, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_NOX): sensor.sensor_schema( + icon=ICON_RADIATOR, + accuracy_decimals=0, + device_class=DEVICE_CLASS_AQI, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_CO2): sensor.sensor_schema( + unit_of_measurement=UNIT_PARTS_PER_MILLION, + icon=ICON_MOLECULE_CO2, + accuracy_decimals=0, + device_class=DEVICE_CLASS_CARBON_DIOXIDE, + state_class=STATE_CLASS_MEASUREMENT, + ), + cv.Optional(CONF_FORMALDEHYDE): sensor.sensor_schema( + unit_of_measurement="ppb", + icon=ICON_RADIATOR, + accuracy_decimals=0, + state_class=STATE_CLASS_MEASUREMENT, + ), + } + ) + .extend(cv.polling_component_schema("60s")) + .extend(i2c.i2c_device_schema(0x6B)) +) + +SENSOR_MAP = { + CONF_PM_1_0: "set_pm_1_0_sensor", + CONF_PM_2_5: "set_pm_2_5_sensor", + CONF_PM_4_0: "set_pm_4_0_sensor", + CONF_PM_10_0: "set_pm_10_0_sensor", + CONF_TEMPERATURE: "set_temperature_sensor", + CONF_HUMIDITY: "set_humidity_sensor", + CONF_VOC: "set_voc_sensor", + CONF_NOX: "set_nox_sensor", + CONF_CO2: "set_co2_sensor", + CONF_FORMALDEHYDE: "set_hcho_sensor", +} + + +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) + await i2c.register_i2c_device(var, config) + + if CONF_TYPE in config: + cg.add(var.set_type(config[CONF_TYPE])) + + for key, func_name in SENSOR_MAP.items(): + if cfg := config.get(key): + sens = await sensor.new_sensor(cfg) + cg.add(getattr(var, func_name)(sens)) diff --git a/tests/components/sen6x/common.yaml b/tests/components/sen6x/common.yaml new file mode 100644 index 0000000000..fdb8a485e2 --- /dev/null +++ b/tests/components/sen6x/common.yaml @@ -0,0 +1,37 @@ +sensor: + # Test with explicit type parameter + - platform: sen6x + id: sen6x_sensor + type: SEN69C + i2c_id: i2c_bus + temperature: + name: Temperature + accuracy_decimals: 1 + humidity: + name: Humidity + accuracy_decimals: 0 + pm_1_0: + name: PM <1µm Weight concentration + id: pm_1_0 + accuracy_decimals: 1 + pm_2_5: + name: PM <2.5µm Weight concentration + id: pm_2_5 + accuracy_decimals: 1 + pm_4_0: + name: PM <4µm Weight concentration + id: pm_4_0 + accuracy_decimals: 1 + pm_10_0: + name: PM <10µm Weight concentration + id: pm_10_0 + accuracy_decimals: 1 + nox: + name: NOx + voc: + name: VOC + co2: + name: Carbon Dioxide + formaldehyde: + name: Formaldehyde + address: 0x6B diff --git a/tests/components/sen6x/test.esp32-idf.yaml b/tests/components/sen6x/test.esp32-idf.yaml new file mode 100644 index 0000000000..b47e39c389 --- /dev/null +++ b/tests/components/sen6x/test.esp32-idf.yaml @@ -0,0 +1,4 @@ +packages: + i2c: !include ../../test_build_components/common/i2c/esp32-idf.yaml + +<<: !include common.yaml diff --git a/tests/components/sen6x/test.esp8266-ard.yaml b/tests/components/sen6x/test.esp8266-ard.yaml new file mode 100644 index 0000000000..4a98b9388a --- /dev/null +++ b/tests/components/sen6x/test.esp8266-ard.yaml @@ -0,0 +1,4 @@ +packages: + i2c: !include ../../test_build_components/common/i2c/esp8266-ard.yaml + +<<: !include common.yaml diff --git a/tests/components/sen6x/test.rp2040-ard.yaml b/tests/components/sen6x/test.rp2040-ard.yaml new file mode 100644 index 0000000000..319a7c71a6 --- /dev/null +++ b/tests/components/sen6x/test.rp2040-ard.yaml @@ -0,0 +1,4 @@ +packages: + i2c: !include ../../test_build_components/common/i2c/rp2040-ard.yaml + +<<: !include common.yaml From 5c56b99742a12cfde9cbeb0f91641db96cd132d7 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 27 Feb 2026 16:19:11 -0700 Subject: [PATCH 145/147] [ci] Fix C++ unit tests missing time component dependency (#14364) --- script/cpp_unit_test.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/script/cpp_unit_test.py b/script/cpp_unit_test.py index 78b65092ae..02b133060a 100755 --- a/script/cpp_unit_test.py +++ b/script/cpp_unit_test.py @@ -98,8 +98,12 @@ def run_tests(selected_components: list[str]) -> int: components = sorted(components) - # Obtain possible dependencies for the requested components: - components_with_dependencies = sorted(get_all_dependencies(set(components))) + # Obtain possible dependencies for the requested components. + # Always include 'time' because USE_TIME_TIMEZONE is defined as a build flag, + # which causes core/time.h to include components/time/posix_tz.h. + components_with_dependencies = sorted( + get_all_dependencies(set(components) | {"time"}) + ) # Build a list of include folders, one folder per component containing tests. # A special replacement main.cpp is located in /tests/components/main.cpp From 298ee7b92e4d0a1ad17fcd3995a689deadcb890f Mon Sep 17 00:00:00 2001 From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com> Date: Fri, 27 Feb 2026 19:08:42 -0500 Subject: [PATCH 146/147] [gps] Fix codegen deadlock when automations reference sibling sensors (#14365) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- esphome/components/gps/__init__.py | 44 ++++++++++++------------------ tests/components/gps/common.yaml | 7 +++++ 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/esphome/components/gps/__init__.py b/esphome/components/gps/__init__.py index 2135189bd5..045a5a6c84 100644 --- a/esphome/components/gps/__init__.py +++ b/esphome/components/gps/__init__.py @@ -98,33 +98,25 @@ async def to_code(config): await cg.register_component(var, config) await uart.register_uart_device(var, config) - if latitude_config := config.get(CONF_LATITUDE): - sens = await sensor.new_sensor(latitude_config) - cg.add(var.set_latitude_sensor(sens)) + # Pre-create all sensor variables so automations that reference + # sibling sensors don't deadlock waiting for unregistered IDs. + sensors = [ + (cg.new_Pvariable(conf[CONF_ID]), conf, setter) + for key, setter in ( + (CONF_LATITUDE, "set_latitude_sensor"), + (CONF_LONGITUDE, "set_longitude_sensor"), + (CONF_SPEED, "set_speed_sensor"), + (CONF_COURSE, "set_course_sensor"), + (CONF_ALTITUDE, "set_altitude_sensor"), + (CONF_SATELLITES, "set_satellites_sensor"), + (CONF_HDOP, "set_hdop_sensor"), + ) + if (conf := config.get(key)) + ] - if longitude_config := config.get(CONF_LONGITUDE): - sens = await sensor.new_sensor(longitude_config) - cg.add(var.set_longitude_sensor(sens)) - - if speed_config := config.get(CONF_SPEED): - sens = await sensor.new_sensor(speed_config) - cg.add(var.set_speed_sensor(sens)) - - if course_config := config.get(CONF_COURSE): - sens = await sensor.new_sensor(course_config) - cg.add(var.set_course_sensor(sens)) - - if altitude_config := config.get(CONF_ALTITUDE): - sens = await sensor.new_sensor(altitude_config) - cg.add(var.set_altitude_sensor(sens)) - - if satellites_config := config.get(CONF_SATELLITES): - sens = await sensor.new_sensor(satellites_config) - cg.add(var.set_satellites_sensor(sens)) - - if hdop_config := config.get(CONF_HDOP): - sens = await sensor.new_sensor(hdop_config) - cg.add(var.set_hdop_sensor(sens)) + for sens, conf, setter in sensors: + await sensor.register_sensor(sens, conf) + cg.add(getattr(var, setter)(sens)) # https://platformio.org/lib/show/1655/TinyGPSPlus # Using fork of TinyGPSPlus patched to build on ESP-IDF diff --git a/tests/components/gps/common.yaml b/tests/components/gps/common.yaml index a99e3ef7e0..568f2cc7c7 100644 --- a/tests/components/gps/common.yaml +++ b/tests/components/gps/common.yaml @@ -1,8 +1,15 @@ gps: latitude: name: "Latitude" + id: gps_lat + on_value: + then: + - logger.log: + format: "%.6f, %.6f" + args: [id(gps_lat).state, id(gps_long).state] longitude: name: "Longitude" + id: gps_long altitude: name: "Altitude" speed: From d1b481319773a38d4a24cae0a4e7c86ea0ab1908 Mon Sep 17 00:00:00 2001 From: Ryan Wagoner <8441200+rwagoner@users.noreply.github.com> Date: Fri, 27 Feb 2026 19:20:13 -0500 Subject: [PATCH 147/147] [web_server] Add climate preset, fan mode, and humidity support (#14061) --- esphome/components/web_server/web_server.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp index 16674321c9..4824e33dcd 100644 --- a/esphome/components/web_server/web_server.cpp +++ b/esphome/components/web_server/web_server.cpp @@ -1490,6 +1490,7 @@ void WebServer::handle_climate_request(AsyncWebServerRequest *request, const Url parse_string_param_(request, ESPHOME_F("mode"), call, &decltype(call)::set_mode); parse_string_param_(request, ESPHOME_F("fan_mode"), call, &decltype(call)::set_fan_mode); parse_string_param_(request, ESPHOME_F("swing_mode"), call, &decltype(call)::set_swing_mode); + parse_string_param_(request, ESPHOME_F("preset"), call, &decltype(call)::set_preset); // Parse temperature parameters // static_cast needed to disambiguate overloaded setters (float vs optional) @@ -1530,7 +1531,7 @@ json::SerializationBuffer<> WebServer::climate_json_(climate::Climate *obj, Json JsonArray opt = root[ESPHOME_F("modes")].to(); for (climate::ClimateMode m : traits.get_supported_modes()) opt.add(PSTR_LOCAL(climate::climate_mode_to_string(m))); - if (!traits.get_supported_custom_fan_modes().empty()) { + if (traits.get_supports_fan_modes()) { JsonArray opt = root[ESPHOME_F("fan_modes")].to(); for (climate::ClimateFanMode m : traits.get_supported_fan_modes()) opt.add(PSTR_LOCAL(climate::climate_fan_mode_to_string(m))); @@ -1546,12 +1547,12 @@ json::SerializationBuffer<> WebServer::climate_json_(climate::Climate *obj, Json for (auto swing_mode : traits.get_supported_swing_modes()) opt.add(PSTR_LOCAL(climate::climate_swing_mode_to_string(swing_mode))); } - if (traits.get_supports_presets() && obj->preset.has_value()) { + if (traits.get_supports_presets()) { JsonArray opt = root[ESPHOME_F("presets")].to(); for (climate::ClimatePreset m : traits.get_supported_presets()) opt.add(PSTR_LOCAL(climate::climate_preset_to_string(m))); } - if (!traits.get_supported_custom_presets().empty() && obj->has_custom_preset()) { + if (!traits.get_supported_custom_presets().empty()) { JsonArray opt = root[ESPHOME_F("custom_presets")].to(); for (auto const &custom_preset : traits.get_supported_custom_presets()) opt.add(custom_preset); @@ -1592,6 +1593,11 @@ json::SerializationBuffer<> WebServer::climate_json_(climate::Climate *obj, Json ? "NA" : (value_accuracy_to_buf(temp_buf, obj->current_temperature, current_accuracy), temp_buf); } + if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_CURRENT_HUMIDITY)) { + root[ESPHOME_F("current_humidity")] = std::isnan(obj->current_humidity) + ? "NA" + : (value_accuracy_to_buf(temp_buf, obj->current_humidity, 0), temp_buf); + } if (traits.has_feature_flags(climate::CLIMATE_SUPPORTS_TWO_POINT_TARGET_TEMPERATURE | climate::CLIMATE_REQUIRES_TWO_POINT_TARGET_TEMPERATURE)) { root[ESPHOME_F("target_temperature_low")] =