From 9944ca414e45c52f560349c420212a7cbb875bdb Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 13:51:08 +1300 Subject: [PATCH 0001/1556] Support ADC on RP2040 (#4040) --- esphome/components/adc/adc_sensor.cpp | 51 +++++++++++++++++++++++++-- esphome/components/adc/adc_sensor.h | 8 +++++ esphome/components/adc/sensor.py | 11 ++++++ esphome/config_validation.py | 1 + 4 files changed, 69 insertions(+), 2 deletions(-) diff --git a/esphome/components/adc/adc_sensor.cpp b/esphome/components/adc/adc_sensor.cpp index 5a29d86404..1e8d740062 100644 --- a/esphome/components/adc/adc_sensor.cpp +++ b/esphome/components/adc/adc_sensor.cpp @@ -11,6 +11,10 @@ ADC_MODE(ADC_VCC) #endif #endif +#ifdef USE_RP2040 +#include +#endif + namespace esphome { namespace adc { @@ -32,9 +36,13 @@ static const int ADC_MAX = (1 << SOC_ADC_RTC_MAX_BITWIDTH) - 1; // 4095 (12 b static const int ADC_HALF = (1 << SOC_ADC_RTC_MAX_BITWIDTH) >> 1; // 2048 (12 bit) or 4096 (13 bit) #endif -void ADCSensor::setup() { +#ifdef USE_RP2040 +extern "C" +#endif + void + ADCSensor::setup() { ESP_LOGCONFIG(TAG, "Setting up ADC '%s'...", this->get_name().c_str()); -#ifndef USE_ADC_SENSOR_VCC +#if !defined(USE_ADC_SENSOR_VCC) && !defined(USE_RP2040) pin_->setup(); #endif @@ -63,6 +71,16 @@ void ADCSensor::setup() { } #endif // USE_ESP32 + +#ifdef USE_RP2040 + static bool initialized = false; + if (!initialized) { + adc_init(); + initialized = true; + } +#endif + + ESP_LOGCONFIG(TAG, "ADC '%s' setup finished!", this->get_name().c_str()); } void ADCSensor::dump_config() { @@ -98,6 +116,12 @@ void ADCSensor::dump_config() { } } #endif // USE_ESP32 +#ifdef USE_RP2040 + if (this->is_temperature_) + ESP_LOGCONFIG(TAG, " Pin: Temperature"); + else + LOG_PIN(" Pin: ", pin_); +#endif LOG_UPDATE_INTERVAL(this); } @@ -175,6 +199,29 @@ float ADCSensor::sample() { } #endif // USE_ESP32 +#ifdef USE_RP2040 +float ADCSensor::sample() { + if (this->is_temperature_) { + adc_set_temp_sensor_enabled(true); + delay(1); + adc_select_input(4); + } else { + uint8_t pin = this->pin_->get_pin(); + adc_gpio_init(pin); + adc_select_input(pin - 26); + } + + int raw = adc_read(); + if (this->is_temperature_) { + adc_set_temp_sensor_enabled(false); + } + if (output_raw_) { + return raw; + } + return raw * 3.3f / 4096.0f; +} +#endif + #ifdef USE_ESP8266 std::string ADCSensor::unique_id() { return get_mac_address() + "-adc"; } #endif diff --git a/esphome/components/adc/adc_sensor.h b/esphome/components/adc/adc_sensor.h index 12272a1577..22cddde6f8 100644 --- a/esphome/components/adc/adc_sensor.h +++ b/esphome/components/adc/adc_sensor.h @@ -38,10 +38,18 @@ class ADCSensor : public sensor::Sensor, public PollingComponent, public voltage std::string unique_id() override; #endif +#ifdef USE_RP2040 + void set_is_temperature() { is_temperature_ = true; } +#endif + protected: InternalGPIOPin *pin_; bool output_raw_{false}; +#ifdef USE_RP2040 + bool is_temperature_{false}; +#endif + #ifdef USE_ESP32 adc_atten_t attenuation_{ADC_ATTEN_DB_0}; adc1_channel_t channel_{}; diff --git a/esphome/components/adc/sensor.py b/esphome/components/adc/sensor.py index 5443b9875a..1a519d7506 100644 --- a/esphome/components/adc/sensor.py +++ b/esphome/components/adc/sensor.py @@ -94,6 +94,9 @@ def validate_adc_pin(value): if str(value).upper() == "VCC": return cv.only_on_esp8266("VCC") + if str(value).upper() == "TEMPERATURE": + return cv.only_on_rp2040("TEMPERATURE") + if CORE.is_esp32: value = pins.internal_gpio_input_pin_number(value) variant = get_esp32_variant() @@ -117,6 +120,12 @@ def validate_adc_pin(value): {CONF_ANALOG: True, CONF_INPUT: True}, internal=True )(value) + if CORE.is_rp2040: + value = pins.internal_gpio_input_pin_number(value) + if value not in (26, 27, 28, 29): + raise cv.Invalid("RP2040: Only pins 26, 27, 28 and 29 support ADC.") + return pins.internal_gpio_input_pin_schema(value) + raise NotImplementedError @@ -160,6 +169,8 @@ async def to_code(config): if config[CONF_PIN] == "VCC": cg.add_define("USE_ADC_SENSOR_VCC") + elif config[CONF_PIN] == "TEMPERATURE": + cg.add(var.set_is_temperature()) else: pin = await cg.gpio_pin_expression(config[CONF_PIN]) cg.add(var.set_pin(pin)) diff --git a/esphome/config_validation.py b/esphome/config_validation.py index afc800f3f2..90018b4d56 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -548,6 +548,7 @@ def only_with_framework(frameworks): only_on_esp32 = only_on("esp32") only_on_esp8266 = only_on("esp8266") +only_on_rp2040 = only_on("rp2040") only_with_arduino = only_with_framework("arduino") only_with_esp_idf = only_with_framework("esp-idf") From 98f8feb625d79b1b71b5f013ad385c4c97a218ee Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 17 Nov 2022 13:52:15 +1300 Subject: [PATCH 0002/1556] Bump version to 2022.11.1 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index da386cb3d8..67345c8849 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.11.0" +__version__ = "2022.11.1" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From 5c2c1560bbfa5e5a162fe5e158d3dc3be6c199ac Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 22 Nov 2022 12:19:52 +1300 Subject: [PATCH 0003/1556] Fix rp2040 pwm to use pico-sdk, not mbed (#4059) --- esphome/components/rp2040_pwm/rp2040_pwm.cpp | 26 ++++++++++++++------ esphome/components/rp2040_pwm/rp2040_pwm.h | 8 +++--- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/esphome/components/rp2040_pwm/rp2040_pwm.cpp b/esphome/components/rp2040_pwm/rp2040_pwm.cpp index bf2a446edf..3f95125578 100644 --- a/esphome/components/rp2040_pwm/rp2040_pwm.cpp +++ b/esphome/components/rp2040_pwm/rp2040_pwm.cpp @@ -6,7 +6,9 @@ #include "esphome/core/log.h" #include "esphome/core/macros.h" -#include +#include +#include +#include namespace esphome { namespace rp2040_pwm { @@ -15,10 +17,17 @@ static const char *const TAG = "rp2040_pwm"; void RP2040PWM::setup() { ESP_LOGCONFIG(TAG, "Setting up RP2040 PWM Output..."); - this->pin_->setup(); - this->pwm_ = new mbed::PwmOut((PinName) this->pin_->get_pin()); - this->turn_off(); + + this->setup_pwm_(); } + +void RP2040PWM::setup_pwm_() { + pwm_config config = pwm_get_default_config(); + pwm_config_set_clkdiv(&config, clock_get_hz(clk_sys) / (255.0f * this->frequency_)); + pwm_config_set_wrap(&config, 254); + pwm_init(pwm_gpio_to_slice_num(this->pin_->get_pin()), &config, true); +} + void RP2040PWM::dump_config() { ESP_LOGCONFIG(TAG, "RP2040 PWM:"); LOG_PIN(" Pin: ", this->pin_); @@ -33,10 +42,13 @@ void HOT RP2040PWM::write_state(float state) { state = 1.0f - state; } - auto total_time_us = static_cast(roundf(1e6f / this->frequency_)); + if (frequency_changed_) { + this->setup_pwm_(); + frequency_changed_ = false; + } - this->pwm_->period_us(total_time_us); - this->pwm_->write(state); + gpio_set_function(this->pin_->get_pin(), GPIO_FUNC_PWM); + pwm_set_gpio_level(this->pin_->get_pin(), state * 255.0f); } } // namespace rp2040_pwm diff --git a/esphome/components/rp2040_pwm/rp2040_pwm.h b/esphome/components/rp2040_pwm/rp2040_pwm.h index e348f131c2..903079df17 100644 --- a/esphome/components/rp2040_pwm/rp2040_pwm.h +++ b/esphome/components/rp2040_pwm/rp2040_pwm.h @@ -7,11 +7,11 @@ #include "esphome/core/component.h" #include "esphome/core/hal.h" -#include "drivers/PwmOut.h" - namespace esphome { namespace rp2040_pwm { +static bool frequency_changed_ = false; + class RP2040PWM : public output::FloatOutput, public Component { public: void set_pin(InternalGPIOPin *pin) { pin_ = pin; } @@ -19,6 +19,7 @@ class RP2040PWM : public output::FloatOutput, public Component { /// Dynamically update frequency void update_frequency(float frequency) override { this->set_frequency(frequency); + frequency_changed_ = true; this->write_state(this->last_output_); } @@ -31,8 +32,9 @@ class RP2040PWM : public output::FloatOutput, public Component { protected: void write_state(float state) override; + void setup_pwm_(); + InternalGPIOPin *pin_; - mbed::PwmOut *pwm_; float frequency_{1000.0}; /// Cache last output level for dynamic frequency updating float last_output_{0.0}; From 2bfaf9dce36cbfd8e0ec6ed2c5028d861d91d716 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 22 Nov 2022 12:41:51 +1300 Subject: [PATCH 0004/1556] Update web_server index (#4060) --- esphome/components/web_server/server_index.h | 378 ++++++++++--------- 1 file changed, 190 insertions(+), 188 deletions(-) diff --git a/esphome/components/web_server/server_index.h b/esphome/components/web_server/server_index.h index 88c62baf50..8eaaaf4581 100644 --- a/esphome/components/web_server/server_index.h +++ b/esphome/components/web_server/server_index.h @@ -395,194 +395,196 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x5e, 0x6e, 0x73, 0x19, 0x48, 0x16, 0xa1, 0x79, 0x8d, 0x2a, 0xa5, 0x48, 0xda, 0x93, 0x28, 0x5d, 0xd7, 0x14, 0xa0, 0x9f, 0x33, 0x36, 0xf6, 0x6c, 0x0b, 0xe4, 0xab, 0x78, 0xfe, 0x98, 0xb0, 0x53, 0x26, 0x3f, 0xcc, 0xa2, 0x07, 0xd1, 0x95, 0x23, 0xb0, 0x00, 0xb8, 0xbc, 0x33, 0x2a, 0xd9, 0x53, 0xe1, 0x28, 0x29, 0x51, 0x47, 0xc4, 0xb3, 0x8d, 0x41, - 0x9b, 0x73, 0xb4, 0xeb, 0xc3, 0x7a, 0xa0, 0x93, 0x6c, 0x5b, 0xc0, 0x4b, 0x66, 0xe3, 0xcd, 0xc8, 0xc1, 0x00, 0x6c, - 0x32, 0x81, 0xed, 0xa2, 0x02, 0xd9, 0x5a, 0x3e, 0x08, 0xa8, 0xc0, 0x07, 0xf6, 0x6c, 0xd1, 0xc2, 0xae, 0xda, 0xea, - 0x27, 0x49, 0x1c, 0xd0, 0x9f, 0x9f, 0xd6, 0xcc, 0x05, 0xdc, 0xb1, 0x21, 0x02, 0xbb, 0x0d, 0x99, 0x67, 0xff, 0xeb, - 0x3f, 0xfd, 0xaf, 0xff, 0x06, 0x03, 0x53, 0x3f, 0xb7, 0xb4, 0xae, 0x6e, 0xf5, 0x3f, 0xa1, 0xd5, 0x22, 0xbd, 0xa1, - 0xdd, 0x5f, 0xff, 0xe1, 0xbf, 0x43, 0x33, 0xba, 0x00, 0x04, 0xb2, 0x84, 0x20, 0x1a, 0xa1, 0xcd, 0xf5, 0x59, 0x20, - 0xd5, 0x06, 0xb9, 0x72, 0xa6, 0x7f, 0x44, 0xb0, 0x0b, 0x9e, 0xcd, 0xaf, 0x05, 0x07, 0xa1, 0x1e, 0x25, 0x59, 0xc1, - 0x34, 0x3c, 0x42, 0xfe, 0x7e, 0x1e, 0x40, 0x34, 0xd7, 0x1c, 0xb8, 0xbc, 0xb0, 0xf4, 0x38, 0x62, 0x79, 0xd6, 0x8d, - 0xd3, 0x58, 0xbd, 0x82, 0x71, 0x42, 0x87, 0xc2, 0x18, 0xb0, 0x5e, 0xe2, 0x09, 0x1e, 0x48, 0x20, 0xb8, 0xf5, 0x8f, - 0x8a, 0xad, 0x1f, 0x4c, 0xf3, 0xa7, 0x18, 0x4b, 0x44, 0x6e, 0xd4, 0x08, 0xf0, 0x13, 0x84, 0xd6, 0x47, 0xfd, 0x1c, - 0x9d, 0xeb, 0x67, 0x14, 0x6c, 0x62, 0x02, 0xd0, 0x4f, 0x33, 0x34, 0x3d, 0xcc, 0x19, 0x44, 0xd6, 0x41, 0xe5, 0xb6, - 0x1a, 0xc9, 0x2b, 0x42, 0x78, 0x7d, 0xc4, 0x1c, 0x4f, 0xbc, 0xd1, 0xb3, 0xc8, 0xd9, 0xc7, 0x24, 0x3b, 0xc3, 0x58, - 0x18, 0x12, 0xe9, 0xaa, 0xfa, 0xf2, 0x5f, 0xfe, 0xd9, 0xf7, 0xff, 0xe5, 0x9f, 0xaf, 0x68, 0x30, 0x85, 0x7d, 0x00, - 0xc6, 0x2b, 0x0f, 0x35, 0x9d, 0x1b, 0x68, 0xad, 0x1f, 0x14, 0xf1, 0x5c, 0x5f, 0x23, 0x11, 0xc7, 0x52, 0x89, 0xb7, - 0x7c, 0x24, 0xb4, 0x35, 0x53, 0xdc, 0x3c, 0x0b, 0x42, 0x76, 0xc5, 0x34, 0x58, 0x75, 0xc3, 0x3c, 0x47, 0x6e, 0x70, - 0x0d, 0x5d, 0x3e, 0x13, 0xe3, 0xf5, 0x60, 0xdc, 0x08, 0x81, 0x07, 0xd2, 0x5f, 0xe8, 0x87, 0x27, 0x42, 0xba, 0x07, - 0x62, 0x19, 0xa4, 0xac, 0xaf, 0x01, 0xe4, 0x59, 0x07, 0x34, 0x01, 0x35, 0x89, 0x2b, 0xdd, 0x4a, 0xe6, 0xc9, 0x71, - 0xde, 0x7f, 0x85, 0x97, 0xf8, 0x2c, 0xec, 0x8d, 0x9a, 0xb5, 0x20, 0x43, 0x80, 0x93, 0x21, 0x20, 0x35, 0x90, 0xa9, - 0x83, 0xd1, 0xa1, 0xc9, 0xd6, 0xeb, 0xda, 0x8f, 0xd8, 0xbd, 0xa6, 0x2d, 0xb9, 0xd4, 0x96, 0xb1, 0xb4, 0x6e, 0xa5, - 0xb6, 0xc4, 0x4f, 0xb5, 0x34, 0xb4, 0x65, 0x7c, 0xa5, 0xb6, 0x44, 0xca, 0x0d, 0x70, 0xe4, 0xd0, 0xde, 0xc4, 0xa8, - 0x8d, 0xa1, 0x9b, 0x39, 0xda, 0x25, 0xe0, 0xaa, 0x8f, 0x3e, 0x49, 0xb3, 0x84, 0x10, 0xc0, 0xb0, 0x85, 0x36, 0xbe, - 0x04, 0x06, 0xa0, 0x62, 0x8f, 0x4a, 0xbd, 0xe9, 0xf1, 0xd1, 0x98, 0x80, 0xbb, 0xcb, 0x09, 0x43, 0x91, 0x0c, 0x6b, - 0xf6, 0x35, 0x2b, 0xb7, 0x70, 0x1c, 0xb1, 0x61, 0xc4, 0x33, 0x60, 0xb6, 0x85, 0x83, 0x1d, 0x79, 0x4b, 0x11, 0x04, - 0x0b, 0xec, 0xb7, 0x6f, 0xf6, 0x0f, 0x6c, 0xef, 0x38, 0x1b, 0x5f, 0x04, 0x36, 0x78, 0x19, 0x60, 0x7d, 0xb8, 0x3e, - 0x9f, 0xb2, 0xd4, 0x51, 0x76, 0x7e, 0x96, 0x80, 0x0b, 0x95, 0x9d, 0x88, 0x6f, 0x36, 0x34, 0x03, 0xf8, 0x40, 0x58, - 0xfa, 0xa8, 0x63, 0x7f, 0x97, 0x8b, 0xef, 0x9d, 0xf2, 0x1c, 0x1f, 0xfb, 0x98, 0xc2, 0xb0, 0xbb, 0x05, 0x0f, 0xf8, - 0xb2, 0x8f, 0xfa, 0x48, 0xbf, 0x09, 0x60, 0x0b, 0xf1, 0xbe, 0x85, 0xed, 0xb7, 0x54, 0x5f, 0x84, 0xa2, 0x2f, 0xb9, - 0x4d, 0x9b, 0xe2, 0x95, 0x2d, 0x47, 0x63, 0x8f, 0xd1, 0x54, 0x23, 0x53, 0x1c, 0x48, 0xc2, 0xc7, 0xba, 0x44, 0xa8, - 0x7f, 0xa3, 0x88, 0x46, 0xa9, 0x94, 0xb5, 0xac, 0xc2, 0x09, 0xc9, 0xbc, 0x13, 0x93, 0xc1, 0x4f, 0x02, 0xff, 0xc8, - 0xfc, 0x3e, 0x99, 0xf8, 0x94, 0x90, 0x46, 0xf2, 0xf0, 0x2f, 0xde, 0x19, 0xf3, 0x2e, 0x8e, 0xa8, 0xa5, 0x72, 0x86, - 0x31, 0x4a, 0x83, 0x41, 0x83, 0xb6, 0x8a, 0x7a, 0x80, 0x7d, 0x92, 0x44, 0xf3, 0x82, 0x05, 0xea, 0x41, 0xfa, 0xc5, - 0xe8, 0x5e, 0xaf, 0x06, 0x22, 0x4c, 0x3b, 0xa6, 0xe4, 0xd3, 0xa5, 0xe9, 0x38, 0x3f, 0x00, 0xc7, 0x19, 0x93, 0xfe, - 0x5b, 0x11, 0x68, 0xdf, 0x34, 0x48, 0xd8, 0x84, 0x97, 0x1c, 0x6f, 0x95, 0x2f, 0x55, 0xa4, 0xc2, 0xef, 0xee, 0x80, - 0x33, 0x6d, 0xf9, 0xf8, 0xff, 0x4d, 0x63, 0x8f, 0x83, 0x14, 0x9c, 0x5f, 0xba, 0x66, 0x82, 0x57, 0xf8, 0x00, 0x22, - 0xf3, 0x7d, 0x69, 0x4c, 0x34, 0x62, 0x18, 0xc5, 0x29, 0x79, 0x0e, 0x72, 0xdb, 0xe3, 0xb9, 0xd9, 0x0e, 0xe4, 0xed, - 0x4a, 0x28, 0x67, 0x35, 0x98, 0xb0, 0xed, 0x4a, 0xbf, 0x60, 0xb5, 0xb1, 0x8a, 0xc8, 0xd4, 0xdf, 0x56, 0x28, 0x64, - 0xc4, 0x8e, 0x4a, 0xa1, 0x6a, 0x96, 0xa2, 0x87, 0x89, 0xd3, 0x6a, 0x54, 0xe9, 0x46, 0x4b, 0xb1, 0xa4, 0x6d, 0x7f, - 0x48, 0xdb, 0x9e, 0xc4, 0xd8, 0x70, 0x29, 0xe6, 0x1e, 0x45, 0xc9, 0xc8, 0x41, 0x00, 0xac, 0x96, 0xf5, 0x08, 0xa8, - 0xe9, 0xaa, 0xc8, 0x86, 0xff, 0x10, 0x89, 0x5b, 0x0a, 0xa1, 0xb7, 0x86, 0x4a, 0x47, 0xc3, 0xb2, 0xec, 0x5d, 0x30, - 0xe7, 0xf0, 0x37, 0x79, 0x49, 0x41, 0xdc, 0x4d, 0xd5, 0xdf, 0xf7, 0x6b, 0x97, 0xee, 0x10, 0x9c, 0x79, 0xe3, 0xab, - 0x69, 0xb6, 0xe2, 0x68, 0xdb, 0xeb, 0x92, 0x9f, 0x8f, 0xbd, 0x5f, 0x39, 0x36, 0x1a, 0x97, 0x54, 0x75, 0xd1, 0x22, - 0x0e, 0xb3, 0xa9, 0xa3, 0x88, 0xb2, 0x7f, 0x73, 0x55, 0xb0, 0xe4, 0xdb, 0x9b, 0x83, 0x25, 0xfc, 0x96, 0xc1, 0x92, - 0x6f, 0xff, 0xe0, 0x60, 0xc9, 0x37, 0x66, 0xb0, 0x04, 0x65, 0xe5, 0x8b, 0xcf, 0x89, 0x68, 0xe4, 0xd9, 0x59, 0x11, - 0x76, 0xe4, 0xe1, 0x3c, 0x88, 0x9d, 0xff, 0x98, 0xd0, 0x06, 0x4c, 0xd4, 0x08, 0x6c, 0x50, 0x24, 0x43, 0xe4, 0x13, - 0x82, 0x84, 0x97, 0x71, 0x84, 0xb6, 0x4e, 0xdc, 0x6b, 0xdd, 0x57, 0x37, 0x95, 0xc0, 0x6b, 0x73, 0x75, 0x38, 0xa7, - 0xab, 0x22, 0x0d, 0x01, 0x7d, 0x6a, 0x54, 0x77, 0xec, 0x6e, 0xaa, 0x8c, 0x31, 0x73, 0x84, 0x9e, 0x3a, 0x08, 0x10, - 0x1c, 0xb4, 0xb4, 0xff, 0xf3, 0x61, 0xa7, 0xb7, 0xdd, 0x99, 0x41, 0x6f, 0xd0, 0xa5, 0xf0, 0xd6, 0xee, 0x6d, 0x6f, - 0xe3, 0xdb, 0x99, 0x7a, 0xeb, 0xe2, 0x5b, 0xac, 0xde, 0x76, 0xf0, 0x6d, 0xa4, 0xde, 0x1e, 0xe0, 0xdb, 0x58, 0xbd, - 0x3d, 0xc4, 0xb7, 0x53, 0xbb, 0x3c, 0xe4, 0x1a, 0xb8, 0x87, 0xc0, 0x58, 0x64, 0xf0, 0x07, 0xaa, 0x0c, 0xf6, 0x2d, - 0xde, 0xf0, 0x8b, 0x4e, 0x82, 0xd8, 0x13, 0x8e, 0x51, 0x90, 0x7b, 0x67, 0x20, 0xfc, 0x03, 0x4a, 0x68, 0x7b, 0x8a, - 0x9f, 0x7a, 0x00, 0x3f, 0xe2, 0x20, 0x9e, 0x31, 0xf5, 0xcd, 0x5b, 0x85, 0x35, 0xd8, 0x92, 0x87, 0xed, 0x61, 0xd9, - 0xd3, 0xeb, 0x24, 0x02, 0x29, 0x2a, 0x61, 0x80, 0x56, 0xae, 0xaa, 0x13, 0xd3, 0xb5, 0xf4, 0x0a, 0x5f, 0xa1, 0x4a, - 0x0c, 0x57, 0x7a, 0x02, 0x36, 0x52, 0xeb, 0x1c, 0x9c, 0xaf, 0xb5, 0xea, 0x05, 0x21, 0xd2, 0x0a, 0x85, 0x70, 0xd2, - 0x6f, 0x07, 0xd1, 0x89, 0x7e, 0x7e, 0x05, 0x46, 0x6f, 0x74, 0xc2, 0x6e, 0x52, 0x35, 0x04, 0xa2, 0xa9, 0x66, 0x14, - 0x10, 0x64, 0x15, 0xc1, 0xd2, 0xa0, 0x13, 0x28, 0xd5, 0x0c, 0x52, 0xa7, 0xae, 0x78, 0x68, 0xfa, 0x7a, 0x11, 0x50, - 0xb4, 0x2a, 0xd8, 0x05, 0xdb, 0x9b, 0x4a, 0x05, 0x85, 0xa1, 0x02, 0x0b, 0xae, 0xd5, 0x46, 0xda, 0x4f, 0xbe, 0x52, - 0x27, 0x59, 0x4a, 0x1d, 0x99, 0x07, 0x08, 0xfa, 0xf4, 0x60, 0x55, 0x42, 0x7e, 0xd1, 0x19, 0xe1, 0x1f, 0x29, 0x7f, - 0xbf, 0x98, 0x4c, 0x26, 0xd7, 0xaa, 0xa7, 0x2f, 0xc6, 0x13, 0xd6, 0x65, 0x3b, 0x3d, 0x0c, 0x2e, 0xb7, 0xa4, 0x44, - 0xec, 0x94, 0x44, 0xbb, 0xe5, 0xed, 0x1a, 0xa3, 0xf0, 0x04, 0x8d, 0x75, 0x7b, 0x3d, 0x56, 0x02, 0x55, 0x96, 0x20, - 0xbf, 0x4f, 0xe2, 0x34, 0x68, 0x97, 0xfe, 0xa9, 0x14, 0xfc, 0x5f, 0x3c, 0x7a, 0xf4, 0xa8, 0xf4, 0xc7, 0xea, 0xad, - 0x3d, 0x1e, 0x97, 0xfe, 0x68, 0xa9, 0xd1, 0x68, 0xb7, 0x27, 0x93, 0xd2, 0x8f, 0x55, 0xc1, 0x76, 0x77, 0x34, 0xde, - 0xee, 0x96, 0xfe, 0x99, 0xd1, 0xa2, 0xf4, 0x99, 0x7c, 0xcb, 0xd9, 0xb8, 0x16, 0xa1, 0x7e, 0xd8, 0x86, 0x4a, 0xc1, - 0x68, 0x4b, 0x74, 0xf4, 0xc4, 0x63, 0x10, 0x2d, 0x78, 0x06, 0x36, 0x16, 0xf0, 0x36, 0x08, 0xe8, 0x89, 0x14, 0xef, - 0xe2, 0x93, 0xb2, 0x28, 0xd4, 0x5f, 0x98, 0x32, 0x1d, 0x99, 0x99, 0xe4, 0x39, 0x27, 0x55, 0xd0, 0xac, 0x46, 0xce, - 0xa2, 0xea, 0x17, 0x21, 0xaf, 0xa4, 0x3d, 0x4a, 0x1b, 0x6c, 0x29, 0x64, 0xfc, 0x8f, 0x57, 0xc9, 0xf8, 0x1f, 0x6e, - 0x96, 0xf1, 0xc7, 0xb7, 0x13, 0xf1, 0x3f, 0xfc, 0xc1, 0x22, 0xfe, 0x47, 0x53, 0xc4, 0x0b, 0x21, 0xb6, 0x07, 0x56, - 0x2c, 0x99, 0xaf, 0xc7, 0xd9, 0x79, 0x0b, 0xb7, 0x44, 0x6e, 0x93, 0xf4, 0xdc, 0xb8, 0x95, 0xf0, 0x5f, 0x93, 0x72, - 0xa4, 0x06, 0x33, 0xbe, 0x4f, 0xcb, 0xb3, 0x93, 0x93, 0x84, 0x29, 0x19, 0x6f, 0x54, 0x90, 0x65, 0xfc, 0x26, 0x0d, - 0xed, 0x37, 0xe0, 0xa4, 0x1a, 0x25, 0x93, 0x09, 0x14, 0x4d, 0x26, 0xb6, 0x4a, 0xc9, 0x05, 0x79, 0x46, 0xad, 0x5e, - 0xd7, 0x4a, 0xa8, 0xd5, 0x57, 0x5f, 0x99, 0x65, 0x66, 0x81, 0x8c, 0x46, 0x99, 0xf6, 0x84, 0xac, 0x19, 0xc7, 0x05, - 0xee, 0xc1, 0xea, 0x7b, 0xba, 0x68, 0xb2, 0xcc, 0x40, 0xa9, 0xc4, 0x23, 0xfc, 0x50, 0x4b, 0xf3, 0xdb, 0x25, 0x22, - 0x7d, 0x7a, 0x15, 0xb9, 0xea, 0x88, 0xd5, 0xf8, 0x4c, 0x5e, 0x75, 0xac, 0x0a, 0x8b, 0x2f, 0x53, 0x28, 0x1e, 0x5f, - 0xbc, 0x18, 0x3b, 0x7b, 0x60, 0xca, 0xc6, 0xc5, 0x9b, 0xb4, 0x91, 0x9a, 0x26, 0xc0, 0x0e, 0x43, 0x13, 0xd3, 0x52, - 0x10, 0xac, 0xca, 0xd1, 0xaf, 0x2a, 0x7b, 0x46, 0x27, 0x99, 0xc1, 0x84, 0x43, 0x0e, 0x6a, 0x64, 0x09, 0xcc, 0xc1, - 0xa4, 0x2e, 0xa4, 0xef, 0xa5, 0x8b, 0xbc, 0x8e, 0x53, 0xf9, 0x61, 0x6d, 0x3a, 0x15, 0x58, 0x4a, 0xfd, 0x21, 0x4f, - 0xfc, 0xab, 0x9e, 0x18, 0x88, 0x17, 0x33, 0x8c, 0x4b, 0x15, 0x7c, 0x07, 0xc2, 0xcd, 0xf1, 0x2b, 0x40, 0x62, 0x08, - 0x15, 0xe3, 0xae, 0xa8, 0x77, 0x79, 0x69, 0x7e, 0x8c, 0xb2, 0xf6, 0xe1, 0xc2, 0x06, 0x0f, 0x30, 0xfc, 0x8a, 0x2c, - 0x6a, 0x83, 0x6c, 0xc1, 0x1d, 0x87, 0x5a, 0x39, 0x6e, 0xe9, 0xed, 0xb4, 0xdb, 0xa0, 0x62, 0x7c, 0xf1, 0xa9, 0x21, - 0x47, 0x77, 0x96, 0xf8, 0x5e, 0x15, 0x52, 0x5f, 0xf9, 0xf4, 0x97, 0x26, 0x31, 0x7e, 0x9b, 0x44, 0x20, 0x6a, 0x5c, - 0x4f, 0x51, 0x8b, 0xd8, 0x7c, 0xf7, 0x95, 0x1b, 0x67, 0x10, 0xd6, 0x5d, 0xc7, 0xc1, 0x32, 0x56, 0x56, 0x2f, 0xc4, - 0xb6, 0xc2, 0xaa, 0x59, 0x05, 0xe7, 0x06, 0x9d, 0x59, 0x9c, 0x19, 0xb1, 0xe7, 0xda, 0x36, 0x28, 0x55, 0xf0, 0x59, - 0x44, 0x90, 0xf7, 0x30, 0x4e, 0x2a, 0x7c, 0x60, 0x05, 0x74, 0xdd, 0xfb, 0x34, 0x20, 0x47, 0xbf, 0x54, 0x33, 0xba, - 0xaa, 0x52, 0x05, 0xa5, 0x79, 0x7a, 0x60, 0x20, 0x43, 0x41, 0x60, 0x58, 0xe3, 0x54, 0xe8, 0x2d, 0x98, 0x86, 0x04, - 0xb0, 0x76, 0xca, 0xd0, 0x33, 0xb1, 0x15, 0xd8, 0x42, 0x5a, 0x80, 0xd2, 0xc3, 0x0e, 0x7d, 0xab, 0x06, 0x7a, 0xba, - 0x1a, 0x3b, 0xbe, 0xce, 0x4f, 0xbb, 0x38, 0xf2, 0x8b, 0x33, 0x0f, 0xfe, 0x59, 0x7f, 0x5a, 0x82, 0x94, 0x3f, 0xfe, - 0x14, 0x73, 0x30, 0xaa, 0xe7, 0x2d, 0x8c, 0x84, 0x50, 0x28, 0x53, 0xaa, 0x43, 0x3a, 0xed, 0x14, 0xb7, 0x92, 0x7a, - 0x8b, 0x02, 0xdd, 0x39, 0xf2, 0x5b, 0x82, 0x34, 0x4b, 0x59, 0xaf, 0x7e, 0xaa, 0x6d, 0xba, 0x0e, 0x8a, 0x58, 0xc3, - 0x65, 0x86, 0xee, 0x1f, 0xbf, 0x00, 0xf7, 0x4f, 0xa8, 0xd1, 0xb6, 0xf2, 0x1b, 0xda, 0x6b, 0xdb, 0x07, 0x92, 0xb6, - 0x9b, 0x64, 0x2d, 0xe4, 0xab, 0xfe, 0xd1, 0x55, 0xfe, 0xcd, 0x4d, 0x67, 0xbc, 0xdd, 0x9d, 0x1d, 0x4f, 0xfd, 0x33, - 0x0e, 0xc7, 0x9b, 0xc5, 0x74, 0xc6, 0x7b, 0x1b, 0xc8, 0x82, 0x68, 0x82, 0x1f, 0xf1, 0xbb, 0x4d, 0xcb, 0x63, 0x4a, - 0xb0, 0x5c, 0xa2, 0x5a, 0x0f, 0x3a, 0x8f, 0xc0, 0x61, 0xbb, 0xf5, 0xf0, 0xd7, 0xa3, 0x5f, 0x4a, 0x1a, 0xa9, 0x7b, - 0xb2, 0xb6, 0xdd, 0x43, 0x79, 0x91, 0x44, 0x17, 0xe0, 0x37, 0x92, 0x8d, 0x71, 0x8c, 0x81, 0xdc, 0xde, 0x3c, 0x93, - 0xc9, 0x0a, 0x39, 0x4b, 0xe8, 0x37, 0x65, 0xc8, 0xa5, 0xd8, 0x7e, 0x30, 0x3f, 0x57, 0xab, 0xd1, 0x69, 0x24, 0x21, - 0xfc, 0xa1, 0xb9, 0x06, 0x57, 0x27, 0x37, 0xd4, 0xcf, 0xcb, 0x77, 0x00, 0x06, 0x61, 0xd8, 0xb4, 0x72, 0x01, 0x55, - 0x1b, 0x4a, 0x8c, 0x6c, 0x8b, 0x6a, 0x20, 0xcb, 0xdf, 0x06, 0x55, 0x19, 0x15, 0xac, 0x87, 0x5f, 0x53, 0x8c, 0xc1, - 0x3b, 0x95, 0xc6, 0xd3, 0x2c, 0x1e, 0x8f, 0x13, 0xd6, 0x53, 0xf6, 0x91, 0xd5, 0x79, 0x80, 0xc9, 0x0a, 0xe6, 0x92, - 0xd5, 0x57, 0xc5, 0x20, 0x9e, 0xa6, 0x53, 0x74, 0x0c, 0xf6, 0x1a, 0x7e, 0x12, 0x71, 0x2d, 0x39, 0xe5, 0x29, 0x7e, - 0xbb, 0x22, 0x1e, 0x3d, 0xd7, 0x71, 0xd9, 0x01, 0x63, 0x91, 0x16, 0xbc, 0xdd, 0xe3, 0xd9, 0x3c, 0x68, 0x6d, 0xd7, - 0x11, 0xc1, 0x2a, 0x8d, 0x82, 0xb7, 0x06, 0x2d, 0x0f, 0xad, 0x03, 0xa1, 0xe5, 0x2c, 0xbf, 0x23, 0xcb, 0x68, 0x00, - 0xfc, 0xec, 0x9e, 0x2e, 0x2a, 0xeb, 0xc8, 0xfc, 0xfb, 0xec, 0x96, 0x2f, 0xd7, 0xef, 0x96, 0x2f, 0xd5, 0x6e, 0xb9, - 0x9e, 0x63, 0xbf, 0x98, 0x74, 0xf0, 0x4f, 0xaf, 0x42, 0x08, 0x56, 0x05, 0xc8, 0x61, 0xa1, 0x5d, 0xdc, 0xea, 0xc2, - 0x7f, 0x34, 0x74, 0xdb, 0xc3, 0x3f, 0x3e, 0x58, 0x80, 0x6d, 0x0b, 0x0b, 0xf1, 0x5f, 0xbb, 0x56, 0xd5, 0xb9, 0x8f, - 0x75, 0xd8, 0x6b, 0x67, 0xb5, 0xae, 0x7b, 0xfd, 0xa6, 0x05, 0x79, 0xc5, 0x9d, 0x40, 0x09, 0x63, 0x70, 0xd5, 0xa2, - 0xe3, 0x63, 0x28, 0x9d, 0x64, 0xa3, 0x45, 0xf1, 0x77, 0x12, 0x7e, 0x49, 0xc4, 0x6b, 0xb7, 0x74, 0x63, 0x1c, 0xd5, - 0x55, 0x64, 0xbe, 0xa8, 0x11, 0x96, 0x7a, 0x9d, 0x82, 0x02, 0x18, 0x93, 0x39, 0x5d, 0xff, 0xfe, 0x9a, 0x4d, 0xf0, - 0x1f, 0xb2, 0x36, 0x6b, 0x91, 0xf9, 0xb7, 0x12, 0xe3, 0x5a, 0x22, 0x7c, 0x16, 0x0d, 0xcc, 0x35, 0x6c, 0x3f, 0x5a, - 0x0f, 0xee, 0xa1, 0x9a, 0x69, 0xa8, 0x94, 0x82, 0xd4, 0x3b, 0xe0, 0x05, 0x44, 0x8b, 0x84, 0x5f, 0x3f, 0xea, 0x55, - 0x9c, 0xb1, 0x32, 0xea, 0x35, 0x02, 0xbd, 0x6a, 0x7b, 0x4b, 0x29, 0xfd, 0xc5, 0x97, 0xf7, 0xf1, 0x8f, 0x88, 0x7d, - 0x1d, 0x57, 0xbe, 0x91, 0x88, 0x0d, 0xa0, 0x6f, 0xb4, 0x51, 0x73, 0x7e, 0x84, 0x06, 0x27, 0xff, 0xe7, 0xb6, 0xad, - 0xd1, 0x58, 0xbf, 0x55, 0x73, 0x69, 0x95, 0x7e, 0x56, 0xeb, 0xcf, 0x1b, 0xfc, 0x96, 0x6d, 0x47, 0xc2, 0x21, 0xa8, - 0xb7, 0x95, 0xbf, 0xb5, 0x64, 0xa5, 0xb1, 0xa2, 0xf8, 0x6d, 0xdb, 0x57, 0x26, 0x31, 0xf5, 0xd8, 0x08, 0x8f, 0xb5, - 0x13, 0x29, 0xcf, 0x9d, 0xb1, 0x87, 0xf0, 0x23, 0xff, 0xc2, 0xc2, 0x7b, 0xf8, 0xc1, 0x2f, 0xeb, 0x7c, 0x96, 0xa4, - 0x60, 0x56, 0x4d, 0x39, 0x9f, 0x07, 0x5b, 0x5b, 0x67, 0x67, 0x67, 0xfe, 0xd9, 0xb6, 0x9f, 0xe5, 0x27, 0x5b, 0xdd, - 0x76, 0xbb, 0x8d, 0xdf, 0x69, 0xb2, 0xad, 0xd3, 0x98, 0x9d, 0x3d, 0x06, 0xf7, 0xc3, 0x7e, 0x68, 0x3d, 0xb2, 0x1e, - 0x6e, 0x5b, 0x3b, 0x0f, 0x6c, 0x8b, 0x14, 0x00, 0x94, 0x6c, 0xdb, 0x96, 0x50, 0x00, 0xa1, 0x0d, 0xc5, 0xfd, 0xdd, - 0x13, 0x65, 0xc3, 0x61, 0x1e, 0xbc, 0xb0, 0x90, 0xc0, 0x7f, 0xcb, 0x3e, 0xb1, 0xfa, 0x56, 0x17, 0x65, 0x2d, 0xa9, - 0x46, 0xd4, 0x2b, 0xee, 0xf7, 0x51, 0x34, 0x0f, 0x88, 0x8d, 0xcc, 0x42, 0x0c, 0x93, 0x89, 0x52, 0x9a, 0x02, 0xed, - 0xd2, 0x63, 0x78, 0xc2, 0xcc, 0x29, 0x0b, 0x9e, 0x5f, 0x75, 0x1f, 0x82, 0x8e, 0x3b, 0x6d, 0xdd, 0x1f, 0xb5, 0x5b, - 0x1d, 0xab, 0xd3, 0xea, 0xfa, 0x0f, 0xad, 0xae, 0xf8, 0x1f, 0x64, 0xe4, 0xb6, 0xd5, 0x81, 0xa7, 0x6d, 0x0b, 0xde, - 0x4f, 0xef, 0x8b, 0xb4, 0x88, 0xc8, 0xde, 0xea, 0xef, 0xe2, 0xaf, 0x2d, 0x02, 0xa4, 0xbe, 0xb4, 0xc5, 0x2f, 0x5a, - 0xb3, 0xbf, 0x30, 0x4b, 0x3b, 0x8f, 0xd6, 0x16, 0x77, 0x1f, 0xae, 0x2d, 0xde, 0x7e, 0xb0, 0xb6, 0xf8, 0xfe, 0x4e, - 0xbd, 0x78, 0xeb, 0x44, 0x54, 0x69, 0xb9, 0x10, 0xda, 0xb3, 0x08, 0x18, 0xe5, 0xdc, 0xe9, 0x00, 0x9c, 0x6d, 0xab, - 0x85, 0x3f, 0x1e, 0x76, 0x5d, 0xdd, 0xeb, 0x18, 0x7b, 0x69, 0x2c, 0x1f, 0x3e, 0x02, 0x2c, 0x9f, 0x77, 0x1f, 0x8c, - 0xb0, 0x1d, 0x21, 0x0a, 0xff, 0x4e, 0xb7, 0x1f, 0x8d, 0x40, 0x23, 0x58, 0xf8, 0x0f, 0xfe, 0x4c, 0x77, 0xba, 0x23, - 0xf1, 0xd2, 0xc6, 0xfa, 0x0f, 0x9d, 0x87, 0x05, 0x34, 0xc5, 0x3f, 0xbf, 0x69, 0x13, 0x1a, 0x0d, 0x78, 0x73, 0xdc, - 0xfb, 0x40, 0xa3, 0x47, 0xd3, 0xae, 0xff, 0xe5, 0xe9, 0x43, 0xff, 0xd1, 0xb4, 0xf3, 0xf0, 0x83, 0x78, 0x4b, 0x80, - 0x82, 0x5f, 0xe2, 0xbf, 0x0f, 0xdb, 0xed, 0x69, 0xab, 0xe3, 0x3f, 0x3a, 0xdd, 0xf6, 0xb7, 0x93, 0xd6, 0x03, 0xff, - 0x11, 0xfe, 0xab, 0x86, 0x9b, 0x66, 0x33, 0x66, 0x5b, 0xb8, 0xde, 0x0d, 0xbf, 0xd7, 0x9c, 0xa3, 0x7b, 0xdf, 0xda, - 0xb9, 0xff, 0xfc, 0x11, 0xac, 0xd1, 0xb4, 0xd3, 0x85, 0xff, 0xaf, 0x7a, 0xfc, 0x80, 0x84, 0x97, 0x03, 0x47, 0x0c, - 0x33, 0x58, 0x15, 0xe1, 0xe8, 0x9b, 0x61, 0xf7, 0xbc, 0xef, 0xaf, 0x0a, 0x80, 0x30, 0x7e, 0x73, 0x90, 0x9b, 0xdf, - 0x2e, 0x02, 0x42, 0x1f, 0xb4, 0xff, 0x03, 0x23, 0x20, 0xdf, 0x37, 0x83, 0xdc, 0xe7, 0xab, 0x79, 0x7b, 0x4d, 0x67, - 0xed, 0x35, 0x73, 0x0e, 0xff, 0xc2, 0x86, 0x98, 0xad, 0x0d, 0xad, 0x39, 0x37, 0xe3, 0x41, 0x19, 0x6e, 0xe4, 0x73, - 0x19, 0xf5, 0x2f, 0xf8, 0x15, 0x04, 0x89, 0x6f, 0x26, 0xc8, 0xaf, 0xb7, 0xa3, 0x47, 0xfc, 0x07, 0xd3, 0xa3, 0xe0, - 0x06, 0x3d, 0x6a, 0x11, 0x77, 0x8a, 0x18, 0x90, 0xa3, 0xbf, 0x4f, 0xef, 0xce, 0xf7, 0xf8, 0xb5, 0xaf, 0x2d, 0x86, - 0x25, 0x85, 0x2d, 0x72, 0x05, 0xdf, 0x7d, 0xce, 0x09, 0x81, 0x48, 0x68, 0x0e, 0x6d, 0x19, 0x84, 0x99, 0xe3, 0x67, - 0x71, 0xd5, 0xcb, 0xa9, 0xb8, 0x34, 0x13, 0xd2, 0x8d, 0xb7, 0x1d, 0x1d, 0xc0, 0xc1, 0x1c, 0xf3, 0x70, 0x99, 0xf1, - 0x08, 0x7f, 0xef, 0x12, 0x8f, 0x79, 0x82, 0xf7, 0x71, 0xe5, 0xdd, 0x35, 0x4c, 0x89, 0xfe, 0x16, 0xd3, 0xb9, 0xd5, - 0x41, 0xc1, 0x0c, 0x83, 0x06, 0xaf, 0xd8, 0x38, 0x8e, 0x1c, 0xdb, 0x99, 0xc3, 0xae, 0x85, 0x31, 0x5b, 0xb5, 0x5c, - 0x6a, 0x4a, 0xa3, 0x76, 0x6d, 0xf5, 0xab, 0x7e, 0x72, 0xfc, 0x74, 0x5a, 0x78, 0x28, 0x83, 0x8c, 0xb6, 0xf4, 0x02, - 0x60, 0x7c, 0x55, 0x92, 0xa3, 0xc0, 0xaf, 0x2c, 0x07, 0x5b, 0x98, 0x0e, 0x1d, 0xbf, 0x0b, 0xae, 0x04, 0x15, 0xe3, - 0xa7, 0xa8, 0x7e, 0x70, 0x5a, 0xdb, 0x60, 0xda, 0x18, 0xdd, 0xf4, 0x40, 0xc3, 0x95, 0x50, 0x92, 0x08, 0x10, 0x34, - 0x4a, 0x3d, 0xfd, 0xbb, 0xcf, 0xaa, 0x90, 0x51, 0xf1, 0xf8, 0xe2, 0x40, 0x5e, 0x37, 0xb7, 0x31, 0x7a, 0x4b, 0x51, - 0xfb, 0xea, 0x53, 0x57, 0x9b, 0xa0, 0x32, 0xe8, 0x17, 0x50, 0xd2, 0x19, 0x38, 0x6a, 0x05, 0xcc, 0xf6, 0xb6, 0xa4, - 0xf7, 0x10, 0xda, 0x42, 0x27, 0x8c, 0xd9, 0x69, 0x3c, 0x92, 0xa2, 0xdd, 0xb3, 0xe4, 0x2d, 0x95, 0x16, 0x61, 0x11, - 0x76, 0x3c, 0xe1, 0x3f, 0xc3, 0x0b, 0x6a, 0xb6, 0x30, 0xcd, 0xec, 0xfe, 0xbd, 0x9e, 0x86, 0xa4, 0x9e, 0x28, 0x6f, - 0xe3, 0x6f, 0xc3, 0x3c, 0x04, 0x7f, 0xed, 0xef, 0xc2, 0x7b, 0xf8, 0xfb, 0x30, 0xef, 0x0d, 0x6d, 0xd7, 0x27, 0xc1, - 0x78, 0xaf, 0xfa, 0xa5, 0x98, 0x28, 0x15, 0x36, 0x41, 0x87, 0x79, 0xb7, 0x55, 0x66, 0x52, 0x71, 0x75, 0x77, 0x2a, - 0xc5, 0x05, 0xcf, 0x86, 0xa4, 0x02, 0x21, 0xda, 0xf5, 0x77, 0x0c, 0x71, 0x78, 0xda, 0xc2, 0x9f, 0x35, 0x81, 0x78, - 0x1f, 0x1a, 0x28, 0x89, 0xf8, 0x12, 0x9a, 0x6f, 0x0b, 0xe1, 0x0b, 0xfd, 0x7e, 0x24, 0x71, 0x25, 0x44, 0x55, 0x9d, - 0x63, 0xd6, 0x1c, 0x24, 0x89, 0x7c, 0x01, 0xdb, 0x33, 0x62, 0x4e, 0x82, 0x5d, 0x65, 0x44, 0xe5, 0x29, 0xf4, 0x75, - 0xf4, 0x17, 0xa4, 0xd7, 0xd5, 0x79, 0xb5, 0xdd, 0xb3, 0x66, 0x0a, 0x64, 0xf8, 0xc6, 0x61, 0x15, 0xdd, 0x9a, 0x10, - 0x5f, 0x52, 0x13, 0x5b, 0xb9, 0xfa, 0xd6, 0xdc, 0x9a, 0xec, 0x5c, 0x73, 0x53, 0xb0, 0x8a, 0x69, 0x68, 0x5f, 0x60, - 0xfa, 0x0c, 0xfe, 0xac, 0x8a, 0xd5, 0x83, 0x64, 0x28, 0x3f, 0x89, 0xf0, 0x17, 0xc1, 0xd0, 0x8f, 0xb2, 0xda, 0x80, - 0x9c, 0x3e, 0x95, 0x49, 0x90, 0xbe, 0x18, 0x97, 0x4d, 0x24, 0xc0, 0x66, 0xc0, 0xdf, 0x2b, 0x58, 0xdd, 0xd2, 0x90, - 0xd7, 0x2f, 0x31, 0xb5, 0x60, 0x1c, 0xe7, 0x74, 0xab, 0x57, 0xe1, 0x5f, 0x8b, 0x6a, 0x56, 0xa4, 0xa6, 0x5d, 0xc9, - 0x8a, 0x81, 0x8d, 0x45, 0x76, 0x20, 0x13, 0xd3, 0xcc, 0x6f, 0x45, 0x9b, 0xd7, 0x2e, 0xc7, 0x22, 0x27, 0x0d, 0xbf, - 0xa5, 0x6f, 0x0b, 0x22, 0xdb, 0x20, 0xca, 0xae, 0xc4, 0x89, 0x0c, 0x1c, 0xbc, 0xad, 0x58, 0xfd, 0x72, 0x24, 0x73, - 0xc3, 0xdb, 0xe6, 0x6a, 0xe9, 0x71, 0x69, 0x1d, 0x5c, 0x19, 0xc3, 0x3b, 0x66, 0x11, 0xf7, 0xa3, 0x94, 0xf2, 0x94, - 0x1c, 0x43, 0x2c, 0x78, 0x1d, 0xb6, 0xed, 0x96, 0x20, 0x79, 0x8c, 0xdf, 0x1e, 0x25, 0x48, 0xef, 0x43, 0xa1, 0xca, - 0x71, 0xfe, 0xbe, 0x96, 0xa2, 0x3b, 0xed, 0xf6, 0xdf, 0x1c, 0xec, 0x59, 0x62, 0x63, 0xef, 0x6e, 0xc1, 0xeb, 0x2e, - 0x79, 0xc7, 0x22, 0x63, 0x23, 0x14, 0x19, 0x1b, 0x96, 0xc8, 0xf3, 0x12, 0x29, 0xad, 0x5b, 0x02, 0x6b, 0xdb, 0x62, - 0xe9, 0x48, 0x84, 0xf5, 0x66, 0xe0, 0x41, 0xc4, 0xf8, 0x79, 0xb1, 0x2d, 0xec, 0xda, 0xc2, 0x85, 0xb7, 0x55, 0xf2, - 0x8b, 0xb2, 0x19, 0x78, 0xaa, 0x82, 0x80, 0xa0, 0xe9, 0x99, 0xca, 0x83, 0x91, 0x43, 0xe9, 0x74, 0xd5, 0xd5, 0xd6, - 0xc5, 0xe2, 0x78, 0x06, 0x62, 0x49, 0xe5, 0xae, 0xbc, 0x97, 0x1d, 0x76, 0x69, 0xaa, 0xfe, 0x51, 0xb9, 0x2e, 0x4a, - 0x39, 0xed, 0xf4, 0x77, 0x23, 0x69, 0x03, 0xe1, 0x5e, 0x2e, 0x60, 0x33, 0x83, 0xea, 0x43, 0x43, 0xc3, 0x8f, 0xb3, - 0xad, 0x33, 0x76, 0xdc, 0x8a, 0xe6, 0x71, 0x15, 0x12, 0x44, 0x8d, 0xd8, 0xdf, 0x55, 0xca, 0x51, 0xa6, 0x60, 0xca, - 0xc7, 0xc8, 0x48, 0xee, 0x40, 0x42, 0x12, 0xc3, 0x96, 0x32, 0xde, 0x48, 0x86, 0x24, 0x2c, 0x06, 0x00, 0x4b, 0xfc, - 0xac, 0xe2, 0x92, 0x52, 0x33, 0x94, 0x76, 0xff, 0xaf, 0xff, 0xfb, 0xff, 0xc8, 0x50, 0x23, 0xd0, 0x16, 0xc0, 0xc2, - 0xec, 0x98, 0xea, 0xd4, 0x91, 0x9d, 0x83, 0x73, 0x1a, 0x8f, 0x5b, 0xd3, 0x28, 0x99, 0x00, 0x04, 0x05, 0x13, 0xb9, - 0xfe, 0xb2, 0x1e, 0xb8, 0x42, 0x82, 0x65, 0x9e, 0xd8, 0x4b, 0xf0, 0xea, 0x45, 0xb8, 0x6c, 0xbf, 0x2b, 0xa7, 0x55, - 0xe5, 0x12, 0x13, 0x83, 0x1b, 0x19, 0xae, 0x06, 0x0f, 0xd6, 0xb2, 0x5c, 0xd5, 0xef, 0x6a, 0x92, 0xc2, 0x84, 0xd5, - 0x52, 0x5c, 0xa1, 0xa5, 0x3e, 0x1c, 0xf9, 0xd7, 0x7f, 0xfa, 0x2f, 0xff, 0x43, 0xbd, 0xe2, 0x99, 0xc7, 0x5f, 0xff, - 0xf1, 0xef, 0xff, 0xdf, 0xff, 0xfd, 0xaf, 0x98, 0x41, 0x2c, 0xcf, 0x45, 0x68, 0x6b, 0x59, 0xd5, 0xa1, 0x88, 0xd8, - 0x63, 0x56, 0xe5, 0x84, 0xd4, 0x53, 0x61, 0xf7, 0x69, 0x42, 0x62, 0x50, 0x09, 0x1d, 0xf1, 0x39, 0xa5, 0x4e, 0x13, - 0xd5, 0xae, 0x21, 0x1f, 0x2c, 0xa5, 0x45, 0x47, 0xfd, 0xf6, 0x4e, 0xdb, 0xae, 0x96, 0xb7, 0x6f, 0xf4, 0xdd, 0xc2, - 0x85, 0xb9, 0x55, 0x62, 0x8e, 0xaf, 0x97, 0x6d, 0xa9, 0x42, 0x5b, 0x58, 0x52, 0x56, 0xe5, 0x16, 0xc6, 0x9c, 0x97, - 0xf8, 0x1a, 0x74, 0x8d, 0x62, 0x5a, 0xe5, 0x5a, 0x9f, 0xde, 0x2f, 0x0b, 0x40, 0x74, 0x82, 0x4b, 0x23, 0x02, 0x68, - 0x74, 0x9e, 0xda, 0x42, 0x6b, 0x25, 0xb9, 0x28, 0x69, 0x14, 0xe1, 0xe1, 0xdc, 0x7f, 0xf4, 0xb7, 0xe5, 0x9f, 0x67, - 0x68, 0x25, 0x58, 0xce, 0x2c, 0x3a, 0x97, 0x7e, 0xcf, 0x83, 0x76, 0x7b, 0x7e, 0xee, 0x2e, 0xab, 0x19, 0xbc, 0xab, - 0x26, 0xa3, 0xa0, 0x9b, 0x39, 0x20, 0x1d, 0xc4, 0xea, 0xf8, 0x1e, 0x98, 0xfa, 0x6d, 0x0c, 0x07, 0x95, 0xe5, 0x9f, - 0x96, 0x14, 0x62, 0x8a, 0x7f, 0xc3, 0x03, 0x53, 0x19, 0x8d, 0x83, 0x12, 0x03, 0x8b, 0xa5, 0xd1, 0xab, 0x2b, 0x7a, - 0x4d, 0x3b, 0xab, 0x29, 0x2b, 0xe6, 0x81, 0xaf, 0x79, 0x54, 0x7b, 0x1f, 0x0f, 0x5f, 0xa7, 0x1d, 0x6f, 0xda, 0x5d, - 0xea, 0xe1, 0x39, 0xcf, 0x66, 0xe6, 0x09, 0x2f, 0x8b, 0xd8, 0x88, 0x4d, 0x54, 0x14, 0x53, 0xd6, 0x8b, 0xd3, 0xdb, - 0xf2, 0x0b, 0xdc, 0x6e, 0x40, 0xdb, 0x2c, 0xe2, 0x01, 0x31, 0x6d, 0xcf, 0x3c, 0x03, 0x8e, 0xf0, 0x74, 0x3d, 0x5b, - 0x1a, 0x73, 0xf5, 0x44, 0x53, 0x8c, 0x15, 0xd6, 0xd3, 0x81, 0x4a, 0x9f, 0xba, 0x9b, 0x43, 0x89, 0x50, 0xc3, 0xaf, - 0xf2, 0x68, 0xf5, 0x5d, 0xcd, 0x47, 0x97, 0xa2, 0x19, 0xdc, 0xe2, 0xb5, 0xf5, 0x42, 0x4d, 0x8a, 0xda, 0x0f, 0x60, - 0xfd, 0x10, 0x98, 0x76, 0xb3, 0x15, 0x15, 0x62, 0xab, 0x77, 0xe1, 0xaf, 0xda, 0x1e, 0x8f, 0xe6, 0x73, 0x6a, 0xe8, - 0x02, 0x37, 0x92, 0x5d, 0x8d, 0x92, 0x82, 0xd2, 0x06, 0xc4, 0x29, 0xbd, 0x6c, 0x23, 0xd9, 0x56, 0x3c, 0xc9, 0xf3, - 0x7b, 0xfa, 0xd5, 0xdf, 0xff, 0x1f, 0x2a, 0x12, 0x27, 0x08, 0x10, 0x7c, 0x00, 0x00}; + 0x9b, 0x73, 0xb4, 0xeb, 0xc3, 0x7a, 0xa0, 0x93, 0x6c, 0x5b, 0xc0, 0x4b, 0x66, 0xe3, 0xcd, 0xc8, 0xc1, 0x00, 0xc7, + 0x39, 0x36, 0x4d, 0x59, 0x51, 0xac, 0x03, 0x0b, 0x9c, 0x60, 0xcf, 0xae, 0x9a, 0xd8, 0xb5, 0x0e, 0x00, 0x40, 0x77, + 0x67, 0x47, 0x4c, 0x0b, 0x15, 0x6c, 0x32, 0x81, 0x8d, 0x87, 0x1a, 0x23, 0xe1, 0x18, 0xf6, 0x0f, 0xfb, 0xf6, 0x6b, + 0xd8, 0xe3, 0x36, 0xf8, 0x57, 0xae, 0x3e, 0xc0, 0xa5, 0xe9, 0x95, 0x10, 0x32, 0xe6, 0x10, 0x9d, 0x8d, 0x61, 0xf4, + 0x93, 0x81, 0x54, 0x36, 0xfa, 0xb4, 0x06, 0x27, 0xe0, 0xc2, 0x0d, 0x11, 0x40, 0x6e, 0xc8, 0x56, 0xfb, 0x5f, 0xff, + 0xe9, 0x7f, 0xfd, 0x37, 0x18, 0x9b, 0xfa, 0xb9, 0xa5, 0x75, 0x75, 0xab, 0xff, 0x09, 0xad, 0x16, 0xe9, 0x0d, 0xed, + 0xfe, 0xfa, 0x0f, 0xff, 0x1d, 0x9a, 0xd1, 0x45, 0x23, 0x90, 0x59, 0x04, 0xd1, 0x08, 0x6d, 0xbb, 0xcf, 0x02, 0xa9, + 0x36, 0xc8, 0x95, 0x33, 0xfd, 0x23, 0x82, 0x5d, 0xf0, 0x6c, 0x7e, 0x2d, 0x38, 0x08, 0xf5, 0x28, 0xc9, 0x0a, 0xa6, + 0xe1, 0x11, 0x72, 0xfe, 0xf3, 0x00, 0xa2, 0xb9, 0xe6, 0xb0, 0x9b, 0x0a, 0x4b, 0x8f, 0x23, 0x56, 0x68, 0xdd, 0x38, + 0x8d, 0x05, 0x2c, 0x18, 0x27, 0x74, 0x28, 0x5c, 0x02, 0x4b, 0x26, 0x9e, 0xe0, 0x81, 0x04, 0x8f, 0x5b, 0xff, 0x78, + 0xd9, 0xfa, 0xc1, 0x34, 0xc3, 0x89, 0xb1, 0x44, 0x84, 0x48, 0x8d, 0x00, 0x3f, 0x41, 0x38, 0x7e, 0xd4, 0xcf, 0xd1, + 0xb9, 0x7e, 0x46, 0x01, 0x2a, 0x26, 0x00, 0x3d, 0x38, 0x43, 0x13, 0xc7, 0x9c, 0x41, 0x64, 0x37, 0x54, 0xee, 0xb1, + 0x91, 0x24, 0x23, 0x84, 0xe4, 0x47, 0xcc, 0x25, 0xc5, 0x9b, 0x43, 0x8b, 0x9c, 0x7d, 0x4c, 0xb2, 0x33, 0x8c, 0xb9, + 0x21, 0x91, 0xae, 0xaa, 0x2f, 0xff, 0xe5, 0x9f, 0x7d, 0xff, 0x5f, 0xfe, 0xf9, 0x8a, 0x06, 0x53, 0xd8, 0x13, 0x60, + 0x24, 0xf3, 0x50, 0xd3, 0xb9, 0x81, 0xd6, 0xfa, 0x41, 0x11, 0xcf, 0xf5, 0x35, 0x12, 0x71, 0x2c, 0x95, 0x78, 0xcb, + 0x47, 0x42, 0x5b, 0x33, 0xc5, 0xcd, 0xb3, 0x20, 0x64, 0x57, 0x4c, 0x83, 0x55, 0x37, 0xcc, 0x73, 0xe4, 0x06, 0xd7, + 0xd0, 0xe5, 0x33, 0x31, 0x5e, 0x0f, 0xc6, 0x8d, 0x10, 0x78, 0xa0, 0x65, 0x84, 0x1e, 0x7a, 0x22, 0xb4, 0x48, 0x20, + 0x96, 0x41, 0xea, 0x94, 0x1a, 0x40, 0x9e, 0x75, 0x40, 0x13, 0x50, 0x93, 0xb8, 0xd2, 0xe1, 0x64, 0x06, 0x1d, 0xe7, + 0xfd, 0x57, 0x78, 0x59, 0xd0, 0xc2, 0xde, 0xa8, 0xc1, 0x0b, 0x32, 0x38, 0x38, 0x19, 0x1c, 0x52, 0xd3, 0x99, 0xba, + 0x1e, 0x1d, 0xa7, 0x6c, 0xbd, 0x4e, 0xff, 0x88, 0xdd, 0x6b, 0x5a, 0x99, 0x4b, 0xad, 0x1c, 0x4b, 0x2b, 0x5a, 0x6a, + 0x65, 0xfc, 0x24, 0x4c, 0x43, 0x2b, 0xc7, 0x57, 0x6a, 0x65, 0xa4, 0xdc, 0x00, 0x47, 0x0e, 0xed, 0x4d, 0x8c, 0x0e, + 0x19, 0x36, 0x00, 0x47, 0xfb, 0x67, 0x34, 0x65, 0xa3, 0x4f, 0xd2, 0xfc, 0x21, 0x04, 0x30, 0x3c, 0xa2, 0x8d, 0x3c, + 0x81, 0x01, 0xa8, 0xf2, 0xa3, 0x52, 0x6f, 0x7a, 0x7c, 0x34, 0x26, 0xe0, 0xee, 0x72, 0xc2, 0x50, 0xf4, 0xc3, 0x9a, + 0x7d, 0xcd, 0xca, 0x2d, 0x1c, 0x47, 0x6c, 0x18, 0xf1, 0x0c, 0x98, 0x6d, 0xe1, 0x60, 0x47, 0xde, 0x52, 0x04, 0xdb, + 0x02, 0xfb, 0xed, 0x9b, 0xfd, 0x03, 0xdb, 0x3b, 0xce, 0xc6, 0x17, 0x81, 0x0d, 0xde, 0x0c, 0x58, 0x39, 0xae, 0xcf, + 0xa7, 0x2c, 0x75, 0x94, 0x3f, 0x91, 0x25, 0xe0, 0xaa, 0x65, 0x27, 0xe2, 0xdb, 0x10, 0xcd, 0x83, 0x02, 0x20, 0x2c, + 0x7d, 0x3c, 0xb2, 0xbf, 0xcb, 0xc5, 0x77, 0x55, 0x79, 0x8e, 0x8f, 0x7d, 0x4c, 0x95, 0xd8, 0xdd, 0x82, 0x07, 0x7c, + 0xd9, 0x47, 0xbd, 0xa7, 0xdf, 0x04, 0xb0, 0x85, 0x78, 0xdf, 0xc2, 0xf6, 0x5b, 0xaa, 0x2f, 0x42, 0xd1, 0x97, 0xdc, + 0xa6, 0x4d, 0xfe, 0xca, 0x66, 0xa4, 0xb1, 0xc7, 0x68, 0x12, 0x92, 0xc9, 0x0f, 0x24, 0xe1, 0x63, 0x5d, 0x22, 0xcc, + 0x0c, 0xa3, 0x88, 0x46, 0xa9, 0x8c, 0x02, 0x59, 0x85, 0x13, 0x92, 0x19, 0x29, 0x26, 0x83, 0x9f, 0x04, 0xfe, 0x91, + 0xf9, 0x1d, 0x34, 0xf1, 0xc9, 0x22, 0x8d, 0xe4, 0xe1, 0x5f, 0xbc, 0x33, 0xe6, 0x5d, 0x1c, 0x51, 0x4b, 0xe5, 0x74, + 0x63, 0x34, 0x08, 0x83, 0x13, 0x6d, 0x15, 0x5d, 0x01, 0x3b, 0x28, 0x89, 0xe6, 0x05, 0x0b, 0xd4, 0x83, 0xf4, 0xbf, + 0xd1, 0x8d, 0x5f, 0x0d, 0x78, 0x98, 0xf6, 0x52, 0xc9, 0xa7, 0x4b, 0xd3, 0x41, 0x7f, 0x00, 0x0e, 0x3a, 0x5e, 0x2e, + 0x68, 0x45, 0xa0, 0xe5, 0xd3, 0x20, 0x61, 0x13, 0x5e, 0x72, 0xbc, 0xbd, 0xbe, 0x54, 0x11, 0x11, 0xbf, 0xbb, 0x03, + 0x4e, 0xbb, 0xe5, 0xe3, 0xff, 0x37, 0x8d, 0x3d, 0x0e, 0x52, 0x70, 0xb2, 0xe9, 0x3a, 0x0b, 0x5e, 0x15, 0x04, 0x88, + 0xcc, 0xf7, 0xa5, 0x31, 0xd1, 0x88, 0x61, 0xb4, 0xa8, 0xe4, 0x39, 0xc8, 0x6d, 0x8f, 0xe7, 0x66, 0x3b, 0x90, 0xb7, + 0x2b, 0x21, 0xa3, 0xd5, 0xa0, 0xc5, 0xb6, 0x2b, 0xfd, 0x8f, 0xd5, 0xc6, 0x2a, 0xf2, 0x53, 0x7f, 0x5b, 0xa1, 0x90, + 0x11, 0xa3, 0x2a, 0x85, 0xaa, 0x59, 0x8a, 0x1e, 0x26, 0x4e, 0xab, 0xd1, 0xab, 0x1b, 0x2d, 0xd2, 0x92, 0xb6, 0xfd, + 0x21, 0x6d, 0x7b, 0x12, 0x63, 0xc3, 0xa5, 0x98, 0x7b, 0x14, 0x25, 0x23, 0x07, 0x01, 0xb0, 0x5a, 0xd6, 0x23, 0xa0, + 0xa6, 0xab, 0x22, 0x28, 0xfe, 0x43, 0x24, 0x6e, 0x29, 0x84, 0xde, 0x1a, 0x2a, 0x1d, 0x0d, 0xcb, 0xb2, 0x77, 0xc1, + 0x9c, 0xc3, 0xdf, 0xe4, 0x65, 0x08, 0x71, 0x07, 0x56, 0x7f, 0x47, 0xb0, 0x5d, 0xba, 0x43, 0x8f, 0x31, 0xe3, 0xeb, + 0x6c, 0xb6, 0xe2, 0x68, 0xdb, 0xeb, 0x52, 0x3c, 0x01, 0x7b, 0xbf, 0x72, 0x6c, 0x34, 0x62, 0xa9, 0xea, 0xa2, 0x45, + 0x1c, 0x66, 0x53, 0x47, 0x11, 0xcd, 0xff, 0xe6, 0xaa, 0xa0, 0xcc, 0xb7, 0x37, 0x07, 0x65, 0xf8, 0x2d, 0x83, 0x32, + 0xdf, 0xfe, 0xc1, 0x41, 0x99, 0x6f, 0xcc, 0xa0, 0x0c, 0xca, 0xca, 0x17, 0x9f, 0x13, 0x39, 0xc9, 0xb3, 0xb3, 0x22, + 0xec, 0xc8, 0x24, 0x00, 0x10, 0x3b, 0xff, 0x31, 0x21, 0x14, 0x98, 0xa8, 0x11, 0x40, 0xa1, 0x88, 0x89, 0xc8, 0x5b, + 0x04, 0x09, 0x2f, 0xe3, 0x15, 0x6d, 0x9d, 0x20, 0xd8, 0xba, 0xaf, 0x6e, 0x44, 0x81, 0x77, 0xe8, 0xea, 0xb0, 0x51, + 0x57, 0x45, 0x34, 0x02, 0xfa, 0xa4, 0xa9, 0xee, 0xd8, 0xdd, 0x54, 0x99, 0x69, 0xe6, 0x08, 0x3d, 0x75, 0xe0, 0x20, + 0x38, 0x68, 0x69, 0xff, 0xe7, 0xc3, 0x4e, 0x6f, 0xbb, 0x33, 0x83, 0xde, 0xa0, 0x4b, 0xe1, 0xad, 0xdd, 0xdb, 0xde, + 0xc6, 0xb7, 0x33, 0xf5, 0xd6, 0xc5, 0xb7, 0x58, 0xbd, 0xed, 0xe0, 0xdb, 0x48, 0xbd, 0x3d, 0xc0, 0xb7, 0xb1, 0x7a, + 0x7b, 0x88, 0x6f, 0xa7, 0x76, 0x79, 0xc8, 0x35, 0x70, 0x0f, 0x81, 0xb1, 0xc8, 0xb1, 0x08, 0x54, 0x19, 0xec, 0x5b, + 0xbc, 0x49, 0x18, 0x9d, 0x04, 0xb1, 0x27, 0x1c, 0xb0, 0x20, 0xf7, 0xce, 0x40, 0xf8, 0x07, 0x94, 0x38, 0xf7, 0x14, + 0x3f, 0x29, 0x01, 0xfe, 0xca, 0x41, 0x3c, 0x63, 0xea, 0xdb, 0xba, 0x0a, 0x6b, 0xb0, 0x25, 0x0f, 0xdb, 0xc3, 0xb2, + 0xa7, 0xd7, 0x49, 0x04, 0x6c, 0x54, 0x62, 0x02, 0xad, 0x5c, 0x55, 0x27, 0xa6, 0x6b, 0xe9, 0x15, 0xbe, 0x42, 0x95, + 0x18, 0x2e, 0xfb, 0x04, 0x6c, 0xa4, 0xd6, 0x39, 0x38, 0x79, 0x6b, 0xd5, 0x0b, 0x42, 0xa4, 0x15, 0x0a, 0xe1, 0xa4, + 0xdf, 0x0e, 0xa2, 0x13, 0xfd, 0xfc, 0x0a, 0x8c, 0xde, 0xe8, 0x84, 0xdd, 0xa4, 0x6a, 0x08, 0x44, 0x53, 0xcd, 0x28, + 0x20, 0xc8, 0x2a, 0x82, 0xa5, 0x41, 0x67, 0x53, 0xaa, 0x19, 0xa4, 0x4e, 0x5d, 0xf1, 0xd0, 0xf4, 0xf5, 0x22, 0xa0, + 0x68, 0x55, 0xb0, 0x0b, 0xb6, 0x37, 0x95, 0x0a, 0x0a, 0x43, 0x05, 0x16, 0x5c, 0xab, 0x8d, 0xb4, 0x3f, 0x7e, 0xa5, + 0x4e, 0xb2, 0x94, 0x3a, 0x32, 0x0f, 0x2a, 0xf4, 0x29, 0xc5, 0xaa, 0x84, 0xfc, 0xa2, 0x33, 0xc2, 0x3f, 0x52, 0xfe, + 0x7e, 0x31, 0x99, 0x4c, 0xae, 0x55, 0x4f, 0x5f, 0x8c, 0x27, 0xac, 0xcb, 0x76, 0x7a, 0x18, 0xc4, 0x6e, 0x49, 0x89, + 0xd8, 0x29, 0x89, 0x76, 0xcb, 0xdb, 0x35, 0x46, 0xe1, 0x09, 0x1a, 0xeb, 0xf6, 0x7a, 0xac, 0x04, 0xaa, 0x2c, 0x41, + 0x7e, 0x9f, 0xc4, 0x69, 0xd0, 0x2e, 0xfd, 0x53, 0x29, 0xf8, 0xbf, 0x78, 0xf4, 0xe8, 0x51, 0xe9, 0x8f, 0xd5, 0x5b, + 0x7b, 0x3c, 0x2e, 0xfd, 0xd1, 0x52, 0xa3, 0xd1, 0x6e, 0x4f, 0x26, 0xa5, 0x1f, 0xab, 0x82, 0xed, 0xee, 0x68, 0xbc, + 0xdd, 0x2d, 0xfd, 0x33, 0xa3, 0x45, 0xe9, 0x33, 0xf9, 0x96, 0xb3, 0x71, 0x2d, 0x12, 0xfe, 0xb0, 0x0d, 0x95, 0x82, + 0xd1, 0x96, 0xe8, 0xe8, 0x89, 0xc7, 0x20, 0x5a, 0xf0, 0x0c, 0x6c, 0x2c, 0xe0, 0x6d, 0x10, 0xd0, 0x13, 0x29, 0xde, + 0xc5, 0xa7, 0x6b, 0x51, 0xa8, 0xbf, 0x30, 0x65, 0x3a, 0x32, 0x33, 0xc9, 0x73, 0x4e, 0xaa, 0xa0, 0x59, 0x8d, 0x9c, + 0x45, 0xd5, 0x2f, 0x42, 0x5e, 0x49, 0x7b, 0x94, 0x36, 0xd8, 0x52, 0xc8, 0xf8, 0x1f, 0xaf, 0x92, 0xf1, 0x3f, 0xdc, + 0x2c, 0xe3, 0x8f, 0x6f, 0x27, 0xe2, 0x7f, 0xf8, 0x83, 0x45, 0xfc, 0x8f, 0xa6, 0x88, 0x17, 0x42, 0x6c, 0x0f, 0xac, + 0x58, 0x32, 0x5f, 0x8f, 0xb3, 0xf3, 0x16, 0x6e, 0x89, 0xdc, 0x26, 0xe9, 0xb9, 0x71, 0x2b, 0xe1, 0xbf, 0x26, 0xb5, + 0x49, 0x0d, 0x66, 0x7c, 0x07, 0x97, 0x67, 0x27, 0x27, 0x09, 0x53, 0x32, 0xde, 0xa8, 0x20, 0xcb, 0xf8, 0x4d, 0x1a, + 0xda, 0x6f, 0xc0, 0x49, 0x35, 0x4a, 0x26, 0x13, 0x28, 0x9a, 0x4c, 0x6c, 0x95, 0xfa, 0x0b, 0xf2, 0x8c, 0x5a, 0xbd, + 0xae, 0x95, 0x50, 0xab, 0xaf, 0xbe, 0x32, 0xcb, 0xcc, 0x02, 0x19, 0xf5, 0x32, 0xed, 0x09, 0x59, 0x33, 0x8e, 0x0b, + 0xdc, 0x83, 0xd5, 0x77, 0x7b, 0xd1, 0x64, 0x99, 0x81, 0x52, 0x89, 0x47, 0xf8, 0x41, 0x98, 0xe6, 0x37, 0x52, 0x44, + 0x9a, 0xf6, 0x2a, 0x72, 0xd5, 0x51, 0xae, 0xf1, 0x39, 0xbe, 0xea, 0xf8, 0x16, 0x16, 0x5f, 0xa6, 0x6a, 0x3c, 0xbe, + 0x78, 0x31, 0x76, 0xf6, 0xc0, 0x94, 0x8d, 0x8b, 0x37, 0x69, 0x23, 0x05, 0x4e, 0x80, 0x1d, 0x86, 0x26, 0xa6, 0xa5, + 0x20, 0x58, 0x75, 0x17, 0xa0, 0xaa, 0xec, 0x19, 0x9d, 0x64, 0xa6, 0x14, 0x0e, 0x39, 0xa8, 0x91, 0x25, 0x30, 0x07, + 0x93, 0xba, 0x90, 0xbe, 0xcb, 0x2e, 0xf2, 0x47, 0x4e, 0xe5, 0x07, 0xbc, 0xe9, 0xf4, 0x61, 0x29, 0xf5, 0x87, 0xcc, + 0x2c, 0xa8, 0x7a, 0x62, 0xc0, 0x5f, 0xcc, 0x30, 0x2e, 0x55, 0x90, 0x1f, 0x08, 0x37, 0xc7, 0xaf, 0x0d, 0x89, 0x21, + 0x54, 0x2c, 0xbd, 0xa2, 0xde, 0xe5, 0xa5, 0xf9, 0xd1, 0xcb, 0xda, 0x07, 0x12, 0x1b, 0x3c, 0xc0, 0xf0, 0x6b, 0xb5, + 0xa8, 0x0d, 0xb2, 0x05, 0x77, 0x1c, 0x6a, 0xe5, 0xb8, 0xa5, 0xb7, 0xd3, 0x6e, 0x83, 0x8a, 0xf1, 0xc5, 0x27, 0x8d, + 0x1c, 0xdd, 0x59, 0xe2, 0x7b, 0x55, 0xe8, 0x7e, 0xe5, 0x13, 0x63, 0x9a, 0xc4, 0xf8, 0x0d, 0x14, 0x81, 0xa8, 0x71, + 0x0d, 0x46, 0x2d, 0x62, 0xf3, 0xdd, 0x57, 0x6e, 0x9c, 0x41, 0x58, 0x77, 0x1d, 0x07, 0xcb, 0x34, 0xd1, 0x7a, 0x21, + 0xb6, 0x15, 0x56, 0xcd, 0x2a, 0x38, 0x37, 0xe8, 0xcc, 0xe2, 0xcc, 0x88, 0x71, 0xd7, 0xb6, 0x41, 0xa9, 0x82, 0xdc, + 0x22, 0x52, 0xbd, 0x87, 0xf1, 0x58, 0xe1, 0x03, 0x2b, 0xa0, 0xeb, 0xde, 0xa7, 0x01, 0x39, 0xfa, 0xa5, 0x9a, 0xd1, + 0x55, 0x95, 0x2a, 0x28, 0xcd, 0x53, 0x0a, 0x03, 0x19, 0x0a, 0x36, 0xc3, 0x1a, 0xa7, 0x42, 0x6f, 0xc1, 0x34, 0x24, + 0x80, 0xb5, 0x53, 0x86, 0x9e, 0x89, 0xad, 0xc0, 0x16, 0xd2, 0x02, 0x94, 0x1e, 0x76, 0xe8, 0x5b, 0x35, 0xd0, 0xd3, + 0xd5, 0x18, 0xf5, 0x75, 0x7e, 0xda, 0xc5, 0x91, 0x5f, 0x9c, 0x79, 0xf0, 0xcf, 0xfa, 0xd3, 0x12, 0xa4, 0xfc, 0xf1, + 0xa7, 0x98, 0x83, 0x51, 0x3d, 0x6f, 0x61, 0x24, 0x84, 0x42, 0xa6, 0x52, 0x1d, 0xd2, 0xa9, 0xaa, 0xb8, 0xfd, 0xd4, + 0x5b, 0x14, 0xe8, 0xce, 0x91, 0xdf, 0x12, 0xa4, 0x59, 0xca, 0x7a, 0xf5, 0xd3, 0x73, 0xd3, 0x75, 0x50, 0xc4, 0x1a, + 0x2e, 0x33, 0x74, 0xff, 0xf8, 0x05, 0xb8, 0x7f, 0x42, 0x8d, 0xb6, 0x95, 0xdf, 0xd0, 0x5e, 0xdb, 0x3e, 0x90, 0xb4, + 0xdd, 0x24, 0x6b, 0x21, 0x5f, 0xf5, 0x8f, 0xae, 0xf2, 0x6f, 0x6e, 0x3a, 0x4b, 0xc6, 0xf8, 0xac, 0xfa, 0x67, 0x1c, + 0xc2, 0x37, 0x8b, 0xe9, 0x2c, 0xf9, 0x36, 0x90, 0x05, 0xd1, 0x04, 0x3f, 0x16, 0x78, 0x9b, 0x96, 0xc7, 0x94, 0xc8, + 0xb9, 0x44, 0xb5, 0x1e, 0x74, 0x1e, 0x81, 0xc3, 0x76, 0xeb, 0xe1, 0xaf, 0x47, 0xbf, 0x94, 0x34, 0x52, 0xf7, 0x71, + 0x6d, 0xbb, 0x87, 0xf2, 0x22, 0x89, 0x2e, 0xc0, 0x6f, 0x24, 0x1b, 0xe3, 0x18, 0x03, 0xb9, 0xbd, 0x79, 0x26, 0x93, + 0x22, 0x72, 0x96, 0xd0, 0x6f, 0xe4, 0x90, 0x4b, 0xb1, 0xfd, 0x60, 0x7e, 0xae, 0x56, 0xa3, 0xd3, 0x48, 0x76, 0xf8, + 0x43, 0x73, 0x1a, 0xae, 0x4e, 0xa2, 0xa8, 0x9f, 0xcb, 0xef, 0x00, 0x0c, 0xc2, 0xb0, 0x69, 0xe5, 0x02, 0xaa, 0x36, + 0x94, 0x18, 0x59, 0x1d, 0xd5, 0x40, 0x96, 0xbf, 0x0d, 0xaa, 0x32, 0x2a, 0x58, 0x0f, 0xbf, 0xda, 0x18, 0x83, 0x77, + 0x2a, 0x8d, 0xa7, 0x59, 0x3c, 0x1e, 0x27, 0xac, 0xa7, 0xec, 0x23, 0xab, 0xf3, 0x00, 0x93, 0x22, 0xcc, 0x25, 0xab, + 0xaf, 0x8a, 0x41, 0x3c, 0x4d, 0xa7, 0xe8, 0x18, 0xec, 0x35, 0xfc, 0xf4, 0xe2, 0x5a, 0x72, 0xca, 0x6c, 0x81, 0x76, + 0x45, 0x3c, 0x7a, 0xae, 0xe3, 0xb2, 0x03, 0xc6, 0x22, 0x2d, 0x78, 0xbb, 0xc7, 0xb3, 0x79, 0xd0, 0xda, 0xae, 0x23, + 0x82, 0x55, 0x1a, 0x05, 0x6f, 0x0d, 0x5a, 0x1e, 0x5a, 0x07, 0x42, 0xcb, 0x59, 0x7e, 0x47, 0x96, 0xd1, 0x00, 0xf8, + 0x79, 0x3f, 0x5d, 0x54, 0xd6, 0x91, 0xf9, 0xf7, 0xd9, 0x2d, 0x5f, 0xae, 0xdf, 0x2d, 0x5f, 0xaa, 0xdd, 0x72, 0x3d, + 0xc7, 0x7e, 0x31, 0xe9, 0xe0, 0x9f, 0x5e, 0x85, 0x10, 0xac, 0x0a, 0x90, 0xc3, 0x42, 0xbb, 0xb8, 0xd5, 0x85, 0xff, + 0x68, 0xe8, 0xb6, 0x87, 0x7f, 0x7c, 0xb0, 0x00, 0xdb, 0x16, 0x16, 0xe2, 0xbf, 0x76, 0xad, 0xaa, 0x73, 0x1f, 0xeb, + 0xb0, 0xd7, 0xce, 0x6a, 0x5d, 0xf7, 0xfa, 0x4d, 0x0b, 0xf2, 0x8a, 0x3b, 0x81, 0x12, 0xc6, 0xe0, 0xaa, 0x45, 0xc7, + 0xc7, 0x50, 0x3a, 0xc9, 0x46, 0x8b, 0xe2, 0xef, 0x24, 0xfc, 0x92, 0x88, 0xd7, 0x6e, 0xe9, 0xc6, 0x38, 0xaa, 0xab, + 0xc8, 0xb0, 0x51, 0x23, 0x2c, 0xf5, 0x3a, 0x05, 0x05, 0x30, 0x26, 0x73, 0xba, 0xfe, 0xfd, 0x35, 0x9b, 0xe0, 0x3f, + 0x64, 0x6d, 0xd6, 0x22, 0xf3, 0x6f, 0x25, 0xc6, 0xb5, 0x44, 0xf8, 0x2c, 0x1a, 0x98, 0x6b, 0xd8, 0x7e, 0xb4, 0x1e, + 0xdc, 0x43, 0x35, 0xd3, 0x50, 0x29, 0x05, 0xa9, 0x77, 0xc0, 0x0b, 0x88, 0x16, 0x09, 0xbf, 0x7e, 0xd4, 0xab, 0x38, + 0x63, 0x65, 0xd4, 0x6b, 0x04, 0x7a, 0xd5, 0xf6, 0x96, 0x52, 0xfa, 0x8b, 0x2f, 0xef, 0xe3, 0x1f, 0x11, 0xfb, 0x3a, + 0xae, 0x7c, 0x23, 0x11, 0x1b, 0x40, 0xdf, 0x68, 0xa3, 0xe6, 0xfc, 0x08, 0x0d, 0x4e, 0xfe, 0xcf, 0x6d, 0x5b, 0xa3, + 0xb1, 0x7e, 0xab, 0xe6, 0xd2, 0x2a, 0xfd, 0xac, 0xd6, 0x9f, 0x37, 0xf8, 0x2d, 0xdb, 0x8e, 0x84, 0x43, 0x50, 0x6f, + 0x2b, 0x7f, 0x3b, 0xca, 0x4a, 0x63, 0x45, 0xf1, 0xdb, 0xb6, 0xaf, 0x4c, 0x62, 0xea, 0xb1, 0x11, 0x1e, 0x6b, 0x27, + 0x52, 0x9e, 0x6f, 0x63, 0x0f, 0xe1, 0x47, 0xfe, 0x85, 0x85, 0xf7, 0xf0, 0xc3, 0x62, 0xd6, 0xf9, 0x2c, 0x49, 0xc1, + 0xac, 0x9a, 0x72, 0x3e, 0x0f, 0xb6, 0xb6, 0xce, 0xce, 0xce, 0xfc, 0xb3, 0x6d, 0x3f, 0xcb, 0x4f, 0xb6, 0xba, 0xed, + 0x76, 0x1b, 0xbf, 0x07, 0x65, 0x5b, 0xa7, 0x31, 0x3b, 0x7b, 0x0c, 0xee, 0x87, 0xfd, 0xd0, 0x7a, 0x64, 0x3d, 0xdc, + 0xb6, 0x76, 0x1e, 0xd8, 0x16, 0x29, 0x00, 0x28, 0xd9, 0xb6, 0x2d, 0xa1, 0x00, 0x42, 0x1b, 0x8a, 0xfb, 0xbb, 0x27, + 0xca, 0x86, 0xc3, 0x7c, 0x7b, 0x61, 0x21, 0x81, 0xff, 0x96, 0x7d, 0x62, 0xf5, 0xad, 0x2e, 0xca, 0x5a, 0x52, 0x8d, + 0xa8, 0x57, 0xdc, 0xef, 0xa3, 0x68, 0x1e, 0x10, 0x1b, 0x99, 0x85, 0x18, 0x26, 0x13, 0xa5, 0x34, 0x05, 0xda, 0xa5, + 0xc7, 0xf0, 0x84, 0x19, 0x5a, 0x16, 0x3c, 0xbf, 0xea, 0x3e, 0x04, 0x1d, 0x77, 0xda, 0xba, 0x3f, 0x6a, 0xb7, 0x3a, + 0x56, 0xa7, 0xd5, 0xf5, 0x1f, 0x5a, 0x5d, 0xf1, 0x3f, 0xc8, 0xc8, 0x6d, 0xab, 0x03, 0x4f, 0xdb, 0x16, 0xbc, 0x9f, + 0xde, 0x17, 0xe9, 0x17, 0x91, 0xbd, 0xd5, 0xdf, 0xc5, 0x5f, 0x8f, 0x04, 0x48, 0x7d, 0x69, 0x8b, 0x5f, 0xe8, 0x66, + 0x7f, 0x61, 0x96, 0x76, 0x1e, 0xad, 0x2d, 0xee, 0x3e, 0x5c, 0x5b, 0xbc, 0xfd, 0x60, 0x6d, 0xf1, 0xfd, 0x9d, 0x7a, + 0xf1, 0xd6, 0x89, 0xa8, 0xd2, 0x72, 0x21, 0xb4, 0x67, 0x11, 0x30, 0xca, 0xb9, 0xd3, 0x01, 0x38, 0xdb, 0x56, 0x0b, + 0x7f, 0x3c, 0xec, 0xba, 0xba, 0xd7, 0x31, 0xf6, 0xd2, 0x58, 0x3e, 0x7c, 0x04, 0x58, 0x3e, 0xef, 0x3e, 0x18, 0x61, + 0x3b, 0x42, 0x14, 0xfe, 0x9d, 0x6e, 0x3f, 0x1a, 0x81, 0x46, 0xb0, 0xf0, 0x1f, 0xfc, 0x99, 0xee, 0x74, 0x47, 0xe2, + 0xa5, 0x8d, 0xf5, 0x1f, 0x3a, 0x0f, 0x0b, 0x68, 0x8a, 0x7f, 0x7e, 0xd3, 0x26, 0x34, 0x1a, 0xf0, 0xe6, 0xb8, 0xf7, + 0x81, 0x46, 0x8f, 0xa6, 0x5d, 0xff, 0xcb, 0xd3, 0x87, 0xfe, 0xa3, 0x69, 0xe7, 0xe1, 0x07, 0xf1, 0x96, 0x00, 0x05, + 0xbf, 0xc4, 0x7f, 0x1f, 0xb6, 0xdb, 0xd3, 0x56, 0xc7, 0x7f, 0x74, 0xba, 0xed, 0x6f, 0x27, 0xad, 0x07, 0xfe, 0x23, + 0xfc, 0x57, 0x0d, 0x37, 0xcd, 0x66, 0xcc, 0xb6, 0x70, 0xbd, 0x1b, 0x7e, 0xaf, 0x39, 0x47, 0xf7, 0xbe, 0xb5, 0x73, + 0xff, 0xf9, 0x23, 0x58, 0xa3, 0x69, 0xa7, 0x0b, 0xff, 0x5f, 0xf5, 0xf8, 0x01, 0x09, 0x2f, 0x07, 0x8e, 0x18, 0x66, + 0xca, 0x2a, 0xc2, 0xd1, 0xb7, 0xc9, 0xee, 0x79, 0xdf, 0x5f, 0x15, 0x00, 0x61, 0xfc, 0xe6, 0x20, 0x37, 0xbf, 0x5d, + 0x04, 0x84, 0x3e, 0x9c, 0xff, 0x07, 0x46, 0x40, 0xbe, 0x6f, 0x06, 0xb9, 0xcf, 0x57, 0xf3, 0x03, 0x9b, 0xce, 0xda, + 0x6b, 0xe6, 0x1c, 0xfe, 0x85, 0x0d, 0x31, 0x2b, 0x1c, 0x5a, 0x73, 0x6e, 0xc6, 0x83, 0x32, 0xdc, 0xc8, 0xe7, 0x32, + 0xea, 0x5f, 0xf0, 0x2b, 0x08, 0x12, 0xdf, 0x4c, 0x90, 0x5f, 0x6f, 0x47, 0x8f, 0xf8, 0x0f, 0xa6, 0x47, 0xc1, 0x0d, + 0x7a, 0xd4, 0x22, 0xee, 0x14, 0x31, 0x20, 0x47, 0x7f, 0x9f, 0xde, 0x9d, 0xef, 0xf1, 0xab, 0x62, 0x5b, 0x0c, 0x4b, + 0x0a, 0x5b, 0xe4, 0x24, 0xbe, 0xfb, 0x9c, 0x13, 0x02, 0x91, 0x38, 0x1d, 0xda, 0x32, 0x08, 0x33, 0xc7, 0xcf, 0xef, + 0xaa, 0x97, 0x53, 0x71, 0x39, 0x27, 0xa4, 0x9b, 0x75, 0x3b, 0x3a, 0x80, 0x83, 0xb9, 0xec, 0xe1, 0x32, 0xe3, 0x11, + 0xfe, 0x7e, 0x27, 0x1e, 0xf3, 0x04, 0xef, 0xfd, 0xca, 0x3b, 0x72, 0x98, 0x7a, 0xfd, 0x2d, 0xa6, 0x8d, 0xab, 0x83, + 0x82, 0x19, 0x06, 0x0d, 0x5e, 0xb1, 0x71, 0x1c, 0x39, 0xb6, 0x33, 0x87, 0x5d, 0x0b, 0x63, 0xb6, 0x6a, 0x39, 0xdb, + 0x94, 0xae, 0xed, 0xda, 0xea, 0x57, 0x0a, 0xe5, 0xf8, 0x89, 0xb6, 0xf0, 0x50, 0x06, 0x19, 0x6d, 0xe9, 0x05, 0xc0, + 0xf8, 0xaa, 0x24, 0x47, 0x81, 0x5f, 0x59, 0x0e, 0xb6, 0x30, 0x1d, 0x3a, 0x7e, 0x17, 0x5c, 0x09, 0x2a, 0xc6, 0x4f, + 0x5e, 0xfd, 0xe0, 0xb4, 0xb6, 0xc1, 0xb4, 0x31, 0xba, 0xe9, 0x81, 0x86, 0x2b, 0xa1, 0x24, 0x11, 0x20, 0x68, 0x94, + 0x7a, 0xfa, 0x77, 0xac, 0x55, 0x21, 0xa3, 0xe2, 0xf1, 0xc5, 0x81, 0xbc, 0xd6, 0x6e, 0x63, 0xf4, 0x96, 0xa2, 0xf6, + 0xd5, 0x27, 0xb5, 0x36, 0x41, 0x65, 0xd0, 0x2f, 0xba, 0xa4, 0x33, 0x70, 0xd4, 0x0a, 0x98, 0x55, 0x6e, 0x49, 0xef, + 0x21, 0xb4, 0x85, 0x4e, 0x18, 0xb3, 0xd3, 0x78, 0x24, 0x45, 0xbb, 0x67, 0xc9, 0xdb, 0x30, 0x2d, 0xc2, 0x22, 0xec, + 0x78, 0xc2, 0x7f, 0x86, 0x17, 0xd4, 0x6c, 0x61, 0x9a, 0xd9, 0xfd, 0x7b, 0x3d, 0x0d, 0x49, 0x3d, 0x21, 0xdf, 0xc6, + 0xdf, 0xba, 0x79, 0x08, 0xfe, 0xda, 0xdf, 0x85, 0xf7, 0xf0, 0xf7, 0x6e, 0xde, 0x1b, 0xda, 0xae, 0x4f, 0x82, 0xf1, + 0x5e, 0xf5, 0xcb, 0x37, 0x51, 0x2a, 0x6c, 0x82, 0x0e, 0xf3, 0x6e, 0xab, 0xcc, 0xa4, 0xe2, 0xea, 0xee, 0x54, 0x8a, + 0x0b, 0x9e, 0x0d, 0x49, 0x05, 0x42, 0xb4, 0xeb, 0xef, 0x18, 0xe2, 0xf0, 0xb4, 0x85, 0x3f, 0x6b, 0x02, 0xf1, 0x3e, + 0x34, 0x50, 0x12, 0xf1, 0x25, 0x34, 0xdf, 0x16, 0xc2, 0x17, 0xfa, 0xfd, 0x48, 0xe2, 0x4a, 0x88, 0xaa, 0x3a, 0xc7, + 0xac, 0x39, 0x48, 0x12, 0xf9, 0x02, 0xb6, 0x67, 0xc4, 0x9c, 0x04, 0xbb, 0xca, 0x88, 0xca, 0x53, 0xe8, 0xeb, 0xe8, + 0x2f, 0x55, 0xaf, 0xab, 0xf3, 0x6a, 0xbb, 0x67, 0xcd, 0x14, 0xc8, 0xf0, 0x8d, 0xc3, 0x2a, 0xba, 0x9d, 0x21, 0xbe, + 0xd8, 0x26, 0xb6, 0x72, 0xf5, 0x4d, 0xbb, 0x35, 0x59, 0xc0, 0xe6, 0xa6, 0x60, 0x15, 0xd3, 0xd0, 0xbe, 0xc0, 0xf4, + 0x19, 0xfc, 0x59, 0x15, 0xab, 0x07, 0xc9, 0x50, 0x7e, 0x12, 0xe1, 0x2f, 0x9c, 0xa1, 0x1f, 0x65, 0xb5, 0x01, 0x39, + 0x7d, 0x92, 0x93, 0x20, 0x7d, 0x31, 0x2e, 0x9b, 0x48, 0x80, 0xcd, 0x80, 0xbf, 0xbf, 0xb0, 0xba, 0x0d, 0x22, 0xaf, + 0x79, 0x62, 0x6a, 0xc1, 0x38, 0xce, 0xe9, 0xf6, 0xb0, 0xc2, 0xbf, 0x16, 0xd5, 0xac, 0x48, 0x4d, 0xbb, 0x92, 0x15, + 0x03, 0x1b, 0x8b, 0xec, 0x40, 0x26, 0xc0, 0x99, 0xdf, 0xa4, 0x36, 0xaf, 0x77, 0x8e, 0x45, 0xee, 0x1b, 0x7e, 0xb3, + 0xdf, 0x16, 0x44, 0xb6, 0x41, 0x94, 0x5d, 0x89, 0x13, 0x19, 0x38, 0x78, 0x2b, 0xb2, 0xfa, 0x25, 0x4c, 0xe6, 0x86, + 0xb7, 0xcd, 0xd5, 0xd2, 0xe3, 0xd2, 0x3a, 0xb8, 0x32, 0x86, 0x77, 0xcc, 0x22, 0xee, 0x47, 0x29, 0xe5, 0x29, 0x39, + 0x86, 0x58, 0xf0, 0x3a, 0x6c, 0xdb, 0x2d, 0x41, 0xf2, 0x18, 0xbf, 0xa5, 0x4a, 0x90, 0xde, 0x87, 0x42, 0x95, 0x4b, + 0xfd, 0x7d, 0x2d, 0x15, 0x78, 0xda, 0xed, 0xbf, 0x39, 0xd8, 0xb3, 0xc4, 0xc6, 0xde, 0xdd, 0x82, 0xd7, 0x5d, 0xf2, + 0x8e, 0x45, 0xc6, 0x46, 0x28, 0x32, 0x36, 0x2c, 0x91, 0xe7, 0x25, 0x52, 0x67, 0xb7, 0x04, 0xd6, 0xb6, 0xc5, 0xd2, + 0x91, 0x08, 0xeb, 0xcd, 0xc0, 0x83, 0x88, 0xf1, 0x33, 0x66, 0x5b, 0xd8, 0xb5, 0x85, 0x0b, 0x6f, 0xab, 0xe4, 0x17, + 0x65, 0x33, 0xf0, 0x54, 0x05, 0x01, 0x41, 0xd3, 0x33, 0x95, 0x07, 0x23, 0x87, 0xd2, 0x69, 0xb1, 0xab, 0xad, 0x8b, + 0xc5, 0xf1, 0x0c, 0xc4, 0x92, 0xca, 0x5d, 0x79, 0x2f, 0x3b, 0xec, 0xd2, 0x54, 0xfd, 0xa3, 0x72, 0x5d, 0x94, 0x72, + 0xda, 0xe9, 0xef, 0x46, 0xd2, 0x06, 0xc2, 0xbd, 0x5c, 0xc0, 0x66, 0x06, 0xd5, 0x87, 0x86, 0x86, 0x1f, 0x67, 0x5b, + 0x67, 0xec, 0xb8, 0x15, 0xcd, 0xe3, 0x2a, 0x24, 0x88, 0x1a, 0xb1, 0xbf, 0xab, 0x94, 0xa3, 0x4c, 0xf5, 0x94, 0x8f, + 0x91, 0x91, 0xdc, 0x81, 0x84, 0x24, 0x86, 0x2d, 0x65, 0xbc, 0x91, 0x0c, 0x49, 0x58, 0x0c, 0x00, 0x96, 0xf8, 0x59, + 0xc5, 0x25, 0xa5, 0x66, 0x28, 0xed, 0xfe, 0x5f, 0xff, 0xf7, 0xff, 0x91, 0xa1, 0x46, 0xa0, 0x2d, 0x80, 0x85, 0xd9, + 0x31, 0xd5, 0xa9, 0x23, 0x3b, 0x07, 0xe7, 0x34, 0x1e, 0xb7, 0xa6, 0x51, 0x32, 0x01, 0x08, 0x0a, 0x26, 0xee, 0x14, + 0xc8, 0x7a, 0xe0, 0x0a, 0x09, 0x96, 0x79, 0x62, 0x2f, 0xc1, 0xab, 0x17, 0xe1, 0xb2, 0xfd, 0xae, 0xdc, 0x59, 0x95, + 0xb3, 0x4c, 0x0c, 0x6e, 0x64, 0xd2, 0x1a, 0x3c, 0x58, 0xcb, 0xa6, 0x55, 0xbf, 0x13, 0x4a, 0x0a, 0x13, 0x56, 0x4b, + 0xa5, 0x85, 0x96, 0xfa, 0x70, 0xe4, 0x5f, 0xff, 0xe9, 0xbf, 0xfc, 0x0f, 0xf5, 0x8a, 0x67, 0x1e, 0x7f, 0xfd, 0xc7, + 0xbf, 0xff, 0x7f, 0xff, 0xf7, 0xbf, 0x62, 0xa6, 0xb2, 0x3c, 0x17, 0xa1, 0xad, 0x65, 0x55, 0x87, 0x22, 0x62, 0x8f, + 0x59, 0x95, 0x13, 0x52, 0x4f, 0xb9, 0xdd, 0xa7, 0x09, 0x89, 0x41, 0x25, 0x74, 0xc4, 0xe7, 0x94, 0xa2, 0x4d, 0x54, + 0xbb, 0x86, 0x7c, 0xb0, 0x94, 0x16, 0x1d, 0xf5, 0xdb, 0x3b, 0x6d, 0xbb, 0x5a, 0xde, 0xbe, 0xd1, 0x77, 0x0b, 0x17, + 0xe6, 0x56, 0x89, 0x39, 0xbe, 0x5e, 0xb6, 0xa5, 0x0a, 0x6d, 0x61, 0x49, 0x59, 0x95, 0x5b, 0x18, 0x73, 0x5e, 0xe2, + 0x6b, 0xd0, 0x35, 0x8a, 0x69, 0x95, 0x6b, 0x7d, 0x7a, 0xbf, 0x2c, 0x00, 0xd1, 0x09, 0x2e, 0x8d, 0x08, 0xa0, 0xd1, + 0x79, 0x6a, 0x0b, 0xad, 0x95, 0xe4, 0xa2, 0xa4, 0x51, 0x84, 0x87, 0x73, 0xff, 0xd1, 0xdf, 0x96, 0x7f, 0x9e, 0xa1, + 0x95, 0x60, 0x39, 0xb3, 0xe8, 0x5c, 0xfa, 0x3d, 0x0f, 0xda, 0xed, 0xf9, 0xb9, 0xbb, 0xac, 0x66, 0xf0, 0xae, 0x9a, + 0x8c, 0x82, 0x6e, 0xe6, 0x80, 0x74, 0x10, 0xab, 0xe3, 0x7b, 0x60, 0xea, 0xb7, 0x31, 0x1c, 0x54, 0x96, 0x7f, 0x5a, + 0x52, 0x88, 0x29, 0xfe, 0x0d, 0x0f, 0x4c, 0x65, 0x34, 0x0e, 0x4a, 0x0c, 0x2c, 0x96, 0x46, 0xaf, 0xae, 0xe8, 0x35, + 0xed, 0xac, 0xa6, 0xac, 0x98, 0x07, 0xbe, 0xe6, 0x51, 0xed, 0x7d, 0x3c, 0x7c, 0x9d, 0x76, 0xbc, 0x69, 0x77, 0xa9, + 0x87, 0xe7, 0x3c, 0x9b, 0x99, 0x27, 0xbc, 0x2c, 0x62, 0x23, 0x36, 0x51, 0x51, 0x4c, 0x59, 0x2f, 0x4e, 0x6f, 0xcb, + 0x2f, 0x70, 0xbb, 0x01, 0x6d, 0xb3, 0x88, 0x07, 0xc4, 0xb4, 0x3d, 0xf3, 0x0c, 0x38, 0xc2, 0xd3, 0xf5, 0x6c, 0x69, + 0xcc, 0xd5, 0x13, 0x4d, 0x31, 0x56, 0x58, 0x4f, 0x07, 0x2a, 0x7d, 0xea, 0x6e, 0x0e, 0x25, 0x42, 0x0d, 0xbf, 0xca, + 0xa3, 0xd5, 0x77, 0x35, 0x1f, 0x5d, 0x8a, 0x66, 0x70, 0x8b, 0xd7, 0xd6, 0x0b, 0x35, 0x29, 0x6a, 0x3f, 0x80, 0xf5, + 0x43, 0x60, 0xda, 0xcd, 0x56, 0x54, 0x88, 0xad, 0xde, 0x85, 0xbf, 0x6a, 0x7b, 0x3c, 0x9a, 0xcf, 0xa9, 0xa1, 0x0b, + 0xdc, 0x48, 0x76, 0x35, 0x4a, 0x0a, 0x4a, 0x1b, 0x10, 0xa7, 0xf4, 0xb2, 0x8d, 0x64, 0x5b, 0xf1, 0x24, 0xcf, 0xef, + 0xe9, 0x57, 0x8c, 0xff, 0x7f, 0x2a, 0xa5, 0xd0, 0x17, 0x78, 0x7c, 0x00, 0x00}; } // namespace web_server } // namespace esphome From 7623f6384688d909d1d2e22217942bc59668a2c6 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 22 Nov 2022 21:12:33 +1300 Subject: [PATCH 0005/1556] rp2040_pwm frequency is per pair of pins (#4061) --- esphome/components/rp2040_pwm/rp2040_pwm.cpp | 4 ++-- esphome/components/rp2040_pwm/rp2040_pwm.h | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/esphome/components/rp2040_pwm/rp2040_pwm.cpp b/esphome/components/rp2040_pwm/rp2040_pwm.cpp index 3f95125578..664a3734f7 100644 --- a/esphome/components/rp2040_pwm/rp2040_pwm.cpp +++ b/esphome/components/rp2040_pwm/rp2040_pwm.cpp @@ -42,9 +42,9 @@ void HOT RP2040PWM::write_state(float state) { state = 1.0f - state; } - if (frequency_changed_) { + if (this->frequency_changed_) { this->setup_pwm_(); - frequency_changed_ = false; + this->frequency_changed_ = false; } gpio_set_function(this->pin_->get_pin(), GPIO_FUNC_PWM); diff --git a/esphome/components/rp2040_pwm/rp2040_pwm.h b/esphome/components/rp2040_pwm/rp2040_pwm.h index 903079df17..9c88826ae9 100644 --- a/esphome/components/rp2040_pwm/rp2040_pwm.h +++ b/esphome/components/rp2040_pwm/rp2040_pwm.h @@ -10,8 +10,6 @@ namespace esphome { namespace rp2040_pwm { -static bool frequency_changed_ = false; - class RP2040PWM : public output::FloatOutput, public Component { public: void set_pin(InternalGPIOPin *pin) { pin_ = pin; } @@ -19,7 +17,7 @@ class RP2040PWM : public output::FloatOutput, public Component { /// Dynamically update frequency void update_frequency(float frequency) override { this->set_frequency(frequency); - frequency_changed_ = true; + this->frequency_changed_ = true; this->write_state(this->last_output_); } @@ -38,6 +36,7 @@ class RP2040PWM : public output::FloatOutput, public Component { float frequency_{1000.0}; /// Cache last output level for dynamic frequency updating float last_output_{0.0}; + bool frequency_changed_{false}; }; template class SetFrequencyAction : public Action { From b2e6b9d31f6df32b9a436bed043d3889b42c47be Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 22 Nov 2022 14:46:23 -0600 Subject: [PATCH 0006/1556] Avoid 128bit uuid loop for 16/32 bit uuids (#4068) --- .../esp32_ble_tracker/esp32_ble_tracker.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp index 4aaa6dfa32..223034578b 100644 --- a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +++ b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp @@ -449,10 +449,13 @@ ESPBTUUID ESPBTUUID::from_raw(const std::string &data) { ESPBTUUID ESPBTUUID::from_uuid(esp_bt_uuid_t uuid) { ESPBTUUID ret; ret.uuid_.len = uuid.len; - ret.uuid_.uuid.uuid16 = uuid.uuid.uuid16; - ret.uuid_.uuid.uuid32 = uuid.uuid.uuid32; - for (size_t i = 0; i < ESP_UUID_LEN_128; i++) - ret.uuid_.uuid.uuid128[i] = uuid.uuid.uuid128[i]; + if (uuid.len == ESP_UUID_LEN_16) { + ret.uuid_.uuid.uuid16 = uuid.uuid.uuid16; + } else if (uuid.len == ESP_UUID_LEN_32) { + ret.uuid_.uuid.uuid32 = uuid.uuid.uuid32; + } else if (uuid.len == ESP_UUID_LEN_128) { + memcpy(ret.uuid_.uuid.uuid128, uuid.uuid.uuid128, ESP_UUID_LEN_128); + } return ret; } ESPBTUUID ESPBTUUID::as_128bit() const { From 1c9c700d7f2081bd43ddebb3805b36d88f3be2fd Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Tue, 22 Nov 2022 14:46:59 -0600 Subject: [PATCH 0007/1556] Avoid creating a new espbt::ESPBTUUID each loop when registering for notify (#4069) --- esphome/components/esp32_ble_client/ble_client_base.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/esp32_ble_client/ble_client_base.cpp b/esphome/components/esp32_ble_client/ble_client_base.cpp index 3579d93c5a..964ff29771 100644 --- a/esphome/components/esp32_ble_client/ble_client_base.cpp +++ b/esphome/components/esp32_ble_client/ble_client_base.cpp @@ -299,7 +299,7 @@ BLEDescriptor *BLEClientBase::get_config_descriptor(uint16_t handle) { auto *chr = this->get_characteristic(handle); if (chr != nullptr) { for (auto &desc : chr->descriptors) { - if (desc->uuid == espbt::ESPBTUUID::from_uint16(0x2902)) + if (desc->uuid.get_uuid().uuid.uuid16 == 0x2902) return desc; } } From 366e29439e73b981674e7aed10202a9eae959fcd Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 23 Nov 2022 13:04:21 +1300 Subject: [PATCH 0008/1556] Bump version to 2022.11.2 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 67345c8849..f88280a4ac 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.11.1" +__version__ = "2022.11.2" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From ae74189fc25bec5715b69b3feea38cd29b62bb95 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Wed, 23 Nov 2022 16:22:04 -0800 Subject: [PATCH 0009/1556] fix missing library (#4051) --- esphome/components/nextion/display.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/nextion/display.py b/esphome/components/nextion/display.py index c6372fbaf0..72f56bd6f3 100644 --- a/esphome/components/nextion/display.py +++ b/esphome/components/nextion/display.py @@ -86,6 +86,8 @@ async def to_code(config): if CORE.is_esp32: cg.add_library("WiFiClientSecure", None) cg.add_library("HTTPClient", None) + if CORE.is_esp8266: + cg.add_library("ESP8266HTTPClient", None) if CONF_TOUCH_SLEEP_TIMEOUT in config: cg.add(var.set_touch_sleep_timeout_internal(config[CONF_TOUCH_SLEEP_TIMEOUT])) From 81b6562c2501a17372264754005f98c2af02f74c Mon Sep 17 00:00:00 2001 From: Brian Kaufman Date: Wed, 23 Nov 2022 17:31:37 -0700 Subject: [PATCH 0010/1556] Fix units for refresh: never (#4048) --- esphome/config_validation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/config_validation.py b/esphome/config_validation.py index 90018b4d56..7498f7c505 100644 --- a/esphome/config_validation.py +++ b/esphome/config_validation.py @@ -1680,7 +1680,7 @@ def source_refresh(value: str): if value.lower() == "always": return source_refresh("0s") if value.lower() == "never": - return source_refresh("1000y") + return source_refresh("365250d") return positive_time_period_seconds(value) From 25bc6761f64357aab9b21f31add73b01eeb61a62 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 24 Nov 2022 16:00:09 +1300 Subject: [PATCH 0011/1556] Don't convert climate temperature step (#4082) --- esphome/components/climate/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/components/climate/__init__.py b/esphome/components/climate/__init__.py index 1de9aa3f3a..8a3cd38444 100644 --- a/esphome/components/climate/__init__.py +++ b/esphome/components/climate/__init__.py @@ -113,7 +113,9 @@ CLIMATE_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA). { cv.Optional(CONF_MIN_TEMPERATURE): cv.temperature, cv.Optional(CONF_MAX_TEMPERATURE): cv.temperature, - cv.Optional(CONF_TEMPERATURE_STEP): cv.temperature, + cv.Optional(CONF_TEMPERATURE_STEP): cv.float_with_unit( + "visual_temperature", "(°C|° C|°|C|° K|° K|K|°F|° F|F)?" + ), } ), cv.Optional(CONF_ACTION_STATE_TOPIC): cv.All( From 4ec0ef75481fe4813e176210b0fb78c8f4330788 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 24 Nov 2022 17:01:52 +1300 Subject: [PATCH 0012/1556] Bump version to 2022.11.3 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index f88280a4ac..8ac844b2b1 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.11.2" +__version__ = "2022.11.3" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From bae9a950c03f2036456c40b1e7fff4f1f59f9894 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 30 Nov 2022 10:59:20 +1300 Subject: [PATCH 0013/1556] current-based cover fix copy paste mistake (#4124) --- esphome/components/current_based/current_based_cover.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/current_based/current_based_cover.cpp b/esphome/components/current_based/current_based_cover.cpp index 3d7a9b8425..7edbdf5a72 100644 --- a/esphome/components/current_based/current_based_cover.cpp +++ b/esphome/components/current_based/current_based_cover.cpp @@ -179,7 +179,7 @@ bool CurrentBasedCover::is_closing_blocked_() const { if (this->close_obstacle_current_threshold_ == FLT_MAX) { return false; } - return this->open_sensor_->get_state() > this->open_obstacle_current_threshold_; + return this->close_sensor_->get_state() > this->close_obstacle_current_threshold_; } bool CurrentBasedCover::is_initial_delay_finished_() const { return millis() - this->start_dir_time_ > this->start_sensing_delay_; From 0a19b1e32c7d4ad06c22a6056216b94a4dfee7d5 Mon Sep 17 00:00:00 2001 From: Nicolas Graziano Date: Thu, 1 Dec 2022 01:15:32 +0100 Subject: [PATCH 0014/1556] Dashboard, after login use relative url. (#4103) --- esphome/dashboard/dashboard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/dashboard/dashboard.py b/esphome/dashboard/dashboard.py index b7c24f9e2e..2153f15a35 100644 --- a/esphome/dashboard/dashboard.py +++ b/esphome/dashboard/dashboard.py @@ -849,7 +849,7 @@ PING_REQUEST = threading.Event() class LoginHandler(BaseHandler): def get(self): if is_authenticated(self): - self.redirect("/") + self.redirect("./") else: self.render_login_page() @@ -894,7 +894,7 @@ class LoginHandler(BaseHandler): password = self.get_argument("password", "") if settings.check_password(username, password): self.set_secure_cookie("authenticated", cookie_authenticated_yes) - self.redirect("/") + self.redirect("./") return error_str = ( "Invalid username or password" if settings.username else "Invalid password" From e16ba2adb5edfb041545ae05050cfeef2a16a953 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 1 Dec 2022 13:17:44 +1300 Subject: [PATCH 0015/1556] Fix queuing scripts not compiling (#4077) --- esphome/components/script/script.h | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/esphome/components/script/script.h b/esphome/components/script/script.h index f3a83cd6ec..165f90ed11 100644 --- a/esphome/components/script/script.h +++ b/esphome/components/script/script.h @@ -4,6 +4,7 @@ #include "esphome/core/component.h" #include "esphome/core/log.h" +#include namespace esphome { namespace script { @@ -88,7 +89,7 @@ template class RestartScript : public Script { template class QueueingScript : public Script, public Component { public: void execute(Ts... x) override { - if (this->is_action_running()) { + if (this->is_action_running() || this->num_runs_ > 0) { // num_runs_ is the number of *queued* instances, so total number of instances is // num_runs_ + 1 if (this->max_runs_ != 0 && this->num_runs_ + 1 >= this->max_runs_) { @@ -98,6 +99,7 @@ template class QueueingScript : public Script, public Com this->esp_logd_(__LINE__, "Script '%s' queueing new instance (mode: queued)", this->name_.c_str()); this->num_runs_++; + this->var_queue_.push(std::make_tuple(x...)); return; } @@ -114,15 +116,22 @@ template class QueueingScript : public Script, public Com void loop() override { if (this->num_runs_ != 0 && !this->is_action_running()) { this->num_runs_--; - this->trigger(); + auto &vars = this->var_queue_.front(); + this->var_queue_.pop(); + this->trigger_tuple_(vars, typename gens::type()); } } void set_max_runs(int max_runs) { max_runs_ = max_runs; } protected: + template void trigger_tuple_(const std::tuple &tuple, seq /*unused*/) { + this->trigger(std::get(tuple)...); + } + int num_runs_ = 0; int max_runs_ = 0; + std::queue> var_queue_; }; /** A script type that executes new instances in parallel. From 47b3267ed4e57fca2a005abd4fb3db4a5318cdf4 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 1 Dec 2022 13:47:50 +1300 Subject: [PATCH 0016/1556] Bump version to 2022.11.4 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 8ac844b2b1..f36d776ee4 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.11.3" +__version__ = "2022.11.4" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From 6911639617b9857adc06d424b25b1d92b4a0ae91 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 5 Dec 2022 19:46:00 +1300 Subject: [PATCH 0017/1556] Fix board pin alias lookup (#4147) --- esphome/components/esp32/gpio.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/esphome/components/esp32/gpio.py b/esphome/components/esp32/gpio.py index 518514a6a3..0c46bc9801 100644 --- a/esphome/components/esp32/gpio.py +++ b/esphome/components/esp32/gpio.py @@ -108,6 +108,10 @@ def validate_gpio_pin(value): board = CORE.data[KEY_ESP32][KEY_BOARD] board_pins = boards.ESP32_BOARD_PINS.get(board, {}) + # Resolved aliased board pins (shorthand when two boards have the same pin configuration) + while isinstance(board_pins, str): + board_pins = boards.ESP32_BOARD_PINS[board_pins] + if value in board_pins.values(): return value From ab736c89bbf4bd3ba0f4728aadbd7e6d4b0162ff Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 6 Dec 2022 12:52:48 +1300 Subject: [PATCH 0018/1556] Bump version to 2022.11.5 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index f36d776ee4..0dc5af2894 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.11.4" +__version__ = "2022.11.5" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From dee4d0ccb7b9bb64a1fda768085a02fabd5e823b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 7 Dec 2022 17:00:10 +1300 Subject: [PATCH 0019/1556] Bump version to 2022.12.0b1 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index f0005d7e08..1fc09b400f 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.12.0-dev" +__version__ = "2022.12.0b1" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From 21679cf2ba4e1288bcb87007a8cf688b18b53232 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 8 Dec 2022 13:39:33 +1300 Subject: [PATCH 0020/1556] Fix ble parsing with zero padded advertisements (#4162) --- esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp index 853e998c80..fb377e2be2 100644 --- a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +++ b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp @@ -705,8 +705,13 @@ void ESPBTDevice::parse_adv_(const esp_ble_gap_cb_param_t::ble_scan_result_evt_p while (offset + 2 < len) { const uint8_t field_length = payload[offset++]; // First byte is length of adv record - if (field_length == 0) + if (field_length == 0) { + if (offset < param.adv_data_len && param.scan_rsp_len > 0) { // Zero padded advertisement data + offset = param.adv_data_len; + continue; + } break; + } // first byte of adv record is adv record type const uint8_t record_type = payload[offset++]; From 7b0a298497512682bff744cac96970b96a964f0b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 8 Dec 2022 13:42:25 +1300 Subject: [PATCH 0021/1556] Bump version to 2022.12.0b2 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 1fc09b400f..851dcbe1d2 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.12.0b1" +__version__ = "2022.12.0b2" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From 5d98e2923b67fdf33097506a1521cd8ad233162c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 12 Dec 2022 16:16:24 +1300 Subject: [PATCH 0022/1556] Increase watchdog timeout when starting OTA (#4172) --- esphome/components/ota/ota_backend_esp_idf.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/esphome/components/ota/ota_backend_esp_idf.cpp b/esphome/components/ota/ota_backend_esp_idf.cpp index 167f8c059b..2fdc00c54d 100644 --- a/esphome/components/ota/ota_backend_esp_idf.cpp +++ b/esphome/components/ota/ota_backend_esp_idf.cpp @@ -1,6 +1,8 @@ #include "esphome/core/defines.h" #ifdef USE_ESP_IDF +#include + #include "ota_backend_esp_idf.h" #include "ota_component.h" #include @@ -14,7 +16,9 @@ OTAResponseTypes IDFOTABackend::begin(size_t image_size) { if (this->partition_ == nullptr) { return OTA_RESPONSE_ERROR_NO_UPDATE_PARTITION; } + esp_task_wdt_init(15, false); // The following function takes longer than the 5 seconds timeout of WDT esp_err_t err = esp_ota_begin(this->partition_, image_size, &this->update_handle_); + esp_task_wdt_init(CONFIG_ESP_TASK_WDT_TIMEOUT_S, false); // Set the WDT back to the configured timeout if (err != ESP_OK) { esp_ota_abort(this->update_handle_); this->update_handle_ = 0; From cc7e2bf8db5d07b04d7edef5f12e3c512921d834 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 12 Dec 2022 17:19:12 +1300 Subject: [PATCH 0023/1556] Bump version to 2022.12.0b3 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 851dcbe1d2..415ff8c6ec 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.12.0b2" +__version__ = "2022.12.0b3" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From fc0347c86c96f648850613500ae1a1c607ec7087 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 13 Dec 2022 08:14:18 +1300 Subject: [PATCH 0024/1556] Bump esphome-dashboard to 20221213.0 (#4176) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 6366a252fa..9c12253160 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,7 @@ pyserial==3.5 platformio==6.1.5 # When updating platformio, also update Dockerfile esptool==4.4 click==8.1.3 -esphome-dashboard==20221207.0 +esphome-dashboard==20221213.0 aioesphomeapi==13.0.1 zeroconf==0.39.4 From bcae2596a60e3e2269b54bbc09a6abd853b7fff2 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 13 Dec 2022 09:13:28 +1300 Subject: [PATCH 0025/1556] Bump version to 2022.12.0b4 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 415ff8c6ec..4783d868d7 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.12.0b3" +__version__ = "2022.12.0b4" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From 1952c1880bd67533b63131eccc2cf78d749a3588 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 13 Dec 2022 13:44:52 +1300 Subject: [PATCH 0026/1556] Remove internal pin restriction from cd74hc4067 (#4179) --- esphome/components/cd74hc4067/__init__.py | 8 ++++---- esphome/components/cd74hc4067/cd74hc4067.h | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/esphome/components/cd74hc4067/__init__.py b/esphome/components/cd74hc4067/__init__.py index 4fb15d1bf3..d57061b710 100644 --- a/esphome/components/cd74hc4067/__init__.py +++ b/esphome/components/cd74hc4067/__init__.py @@ -27,10 +27,10 @@ DEFAULT_DELAY = "2ms" CONFIG_SCHEMA = cv.Schema( { cv.GenerateID(): cv.declare_id(CD74HC4067Component), - cv.Required(CONF_PIN_S0): pins.internal_gpio_output_pin_schema, - cv.Required(CONF_PIN_S1): pins.internal_gpio_output_pin_schema, - cv.Required(CONF_PIN_S2): pins.internal_gpio_output_pin_schema, - cv.Required(CONF_PIN_S3): pins.internal_gpio_output_pin_schema, + cv.Required(CONF_PIN_S0): pins.gpio_output_pin_schema, + cv.Required(CONF_PIN_S1): pins.gpio_output_pin_schema, + cv.Required(CONF_PIN_S2): pins.gpio_output_pin_schema, + cv.Required(CONF_PIN_S3): pins.gpio_output_pin_schema, cv.Optional( CONF_DELAY, default=DEFAULT_DELAY ): cv.positive_time_period_milliseconds, diff --git a/esphome/components/cd74hc4067/cd74hc4067.h b/esphome/components/cd74hc4067/cd74hc4067.h index 4a5c2e4e35..6193513575 100644 --- a/esphome/components/cd74hc4067/cd74hc4067.h +++ b/esphome/components/cd74hc4067/cd74hc4067.h @@ -19,22 +19,22 @@ class CD74HC4067Component : public Component { void activate_pin(uint8_t pin); /// set the pin connected to multiplexer control pin 0 - void set_pin_s0(InternalGPIOPin *pin) { this->pin_s0_ = pin; } + void set_pin_s0(GPIOPin *pin) { this->pin_s0_ = pin; } /// set the pin connected to multiplexer control pin 1 - void set_pin_s1(InternalGPIOPin *pin) { this->pin_s1_ = pin; } + void set_pin_s1(GPIOPin *pin) { this->pin_s1_ = pin; } /// set the pin connected to multiplexer control pin 2 - void set_pin_s2(InternalGPIOPin *pin) { this->pin_s2_ = pin; } + void set_pin_s2(GPIOPin *pin) { this->pin_s2_ = pin; } /// set the pin connected to multiplexer control pin 3 - void set_pin_s3(InternalGPIOPin *pin) { this->pin_s3_ = pin; } + void set_pin_s3(GPIOPin *pin) { this->pin_s3_ = pin; } /// set the delay needed after an input switch void set_switch_delay(uint32_t switch_delay) { this->switch_delay_ = switch_delay; } private: - InternalGPIOPin *pin_s0_; - InternalGPIOPin *pin_s1_; - InternalGPIOPin *pin_s2_; - InternalGPIOPin *pin_s3_; + GPIOPin *pin_s0_; + GPIOPin *pin_s1_; + GPIOPin *pin_s2_; + GPIOPin *pin_s3_; /// the currently active pin uint8_t active_pin_; uint32_t switch_delay_; From 0a1f705fdabc0088b3738319a402cd56829ef9de Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 12 Dec 2022 14:57:12 -1000 Subject: [PATCH 0027/1556] Speed up bluetooth proxy connections when using esp-idf (#4171) --- esphome/components/bluetooth_proxy/__init__.py | 8 ++++++++ esphome/components/esp32/__init__.py | 2 +- esphome/components/esp32_ble_client/ble_client_base.cpp | 2 ++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/esphome/components/bluetooth_proxy/__init__.py b/esphome/components/bluetooth_proxy/__init__.py index 9c566c56a5..bec1579d8e 100644 --- a/esphome/components/bluetooth_proxy/__init__.py +++ b/esphome/components/bluetooth_proxy/__init__.py @@ -2,11 +2,13 @@ from esphome.components import esp32_ble_tracker, esp32_ble_client import esphome.config_validation as cv import esphome.codegen as cg from esphome.const import CONF_ACTIVE, CONF_ID +from esphome.components.esp32 import add_idf_sdkconfig_option AUTO_LOAD = ["esp32_ble_client", "esp32_ble_tracker"] DEPENDENCIES = ["api", "esp32"] CODEOWNERS = ["@jesserockz"] +CONF_CACHE_SERVICES = "cache_services" CONF_CONNECTIONS = "connections" MAX_CONNECTIONS = 3 @@ -47,6 +49,9 @@ CONFIG_SCHEMA = cv.All( { cv.GenerateID(): cv.declare_id(BluetoothProxy), cv.Optional(CONF_ACTIVE, default=False): cv.boolean, + cv.SplitDefault(CONF_CACHE_SERVICES, esp32_idf=True): cv.All( + cv.only_with_esp_idf, cv.boolean + ), cv.Optional(CONF_CONNECTIONS): cv.All( cv.ensure_list(CONNECTION_SCHEMA), cv.Length(min=1, max=MAX_CONNECTIONS), @@ -72,4 +77,7 @@ async def to_code(config): cg.add(var.register_connection(connection_var)) await esp32_ble_tracker.register_client(connection_var, connection_conf) + if config.get(CONF_CACHE_SERVICES): + add_idf_sdkconfig_option("CONFIG_BT_GATTC_CACHE_NVS_FLASH", True) + cg.add_define("USE_BLUETOOTH_PROXY") diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 75dc68020f..3989b62842 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -398,11 +398,11 @@ spiffs, data, spiffs, 0x391000, 0x00F000 IDF_PARTITIONS_CSV = """\ # Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, , 0x4000, otadata, data, ota, , 0x2000, phy_init, data, phy, , 0x1000, app0, app, ota_0, , 0x1C0000, app1, app, ota_1, , 0x1C0000, +nvs, data, nvs, , 0x6d000, """ diff --git a/esphome/components/esp32_ble_client/ble_client_base.cpp b/esphome/components/esp32_ble_client/ble_client_base.cpp index 658f6c464e..dd6fc94127 100644 --- a/esphome/components/esp32_ble_client/ble_client_base.cpp +++ b/esphome/components/esp32_ble_client/ble_client_base.cpp @@ -95,7 +95,9 @@ void BLEClientBase::release_services() { for (auto &svc : this->services_) delete svc; // NOLINT(cppcoreguidelines-owning-memory) this->services_.clear(); +#ifndef CONFIG_BT_GATTC_CACHE_NVS_FLASH esp_ble_gattc_cache_clean(this->remote_bda_); +#endif } bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t esp_gattc_if, From 7d8d563c6294eca347d259bfe9f7fa4f02c7c8ca Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 13 Dec 2022 13:58:44 +1300 Subject: [PATCH 0028/1556] Bump version to 2022.12.0b5 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 4783d868d7..4b14ce7e40 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.12.0b4" +__version__ = "2022.12.0b5" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From fcb9b51978bb17c8def7f29b2bff44e4c90ab44c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 14 Dec 2022 11:45:43 +1300 Subject: [PATCH 0029/1556] Remove warnings when falling through switch cases on purpose (#4181) --- esphome/components/esp32_ble_client/ble_client_base.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/esphome/components/esp32_ble_client/ble_client_base.cpp b/esphome/components/esp32_ble_client/ble_client_base.cpp index dd6fc94127..017d65573d 100644 --- a/esphome/components/esp32_ble_client/ble_client_base.cpp +++ b/esphome/components/esp32_ble_client/ble_client_base.cpp @@ -290,14 +290,17 @@ float BLEClientBase::parse_char_value(uint8_t *value, uint16_t length) { if (length > 2) { return (float) encode_uint16(value[1], value[2]); } + // fall through case 0x7: // uint24. if (length > 3) { return (float) encode_uint24(value[1], value[2], value[3]); } + // fall through case 0x8: // uint32. if (length > 4) { return (float) encode_uint32(value[1], value[2], value[3], value[4]); } + // fall through case 0xC: // int8. return (float) ((int8_t) value[1]); case 0xD: // int12. @@ -305,10 +308,12 @@ float BLEClientBase::parse_char_value(uint8_t *value, uint16_t length) { if (length > 2) { return (float) ((int16_t)(value[1] << 8) + (int16_t) value[2]); } + // fall through case 0xF: // int24. if (length > 3) { return (float) ((int32_t)(value[1] << 16) + (int32_t)(value[2] << 8) + (int32_t)(value[3])); } + // fall through case 0x10: // int32. if (length > 4) { return (float) ((int32_t)(value[1] << 24) + (int32_t)(value[2] << 16) + (int32_t)(value[3] << 8) + From 96512b80cc65ea0a78ceebd5987e1248b9773218 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 14 Dec 2022 11:45:51 +1300 Subject: [PATCH 0030/1556] Revert camera config change for esp-idf (#4182) --- esphome/components/esp32_camera/esp32_camera.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/esphome/components/esp32_camera/esp32_camera.cpp b/esphome/components/esp32_camera/esp32_camera.cpp index 9598541143..b1bf1d8532 100644 --- a/esphome/components/esp32_camera/esp32_camera.cpp +++ b/esphome/components/esp32_camera/esp32_camera.cpp @@ -54,7 +54,11 @@ void ESP32Camera::dump_config() { ESP_LOGCONFIG(TAG, " HREF Pin: %d", conf.pin_href); ESP_LOGCONFIG(TAG, " Pixel Clock Pin: %d", conf.pin_pclk); ESP_LOGCONFIG(TAG, " External Clock: Pin:%d Frequency:%u", conf.pin_xclk, conf.xclk_freq_hz); +#ifdef USE_ESP_IDF // Temporary until the espressif/esp32-camera library is updated + ESP_LOGCONFIG(TAG, " I2C Pins: SDA:%d SCL:%d", conf.pin_sscb_sda, conf.pin_sscb_scl); +#else ESP_LOGCONFIG(TAG, " I2C Pins: SDA:%d SCL:%d", conf.pin_sccb_sda, conf.pin_sccb_scl); +#endif ESP_LOGCONFIG(TAG, " Reset Pin: %d", conf.pin_reset); switch (this->config_.frame_size) { case FRAMESIZE_QQVGA: @@ -209,8 +213,13 @@ void ESP32Camera::set_external_clock(uint8_t pin, uint32_t frequency) { this->config_.xclk_freq_hz = frequency; } void ESP32Camera::set_i2c_pins(uint8_t sda, uint8_t scl) { +#ifdef USE_ESP_IDF // Temporary until the espressif/esp32-camera library is updated + this->config_.pin_sscb_sda = sda; + this->config_.pin_sscb_scl = scl; +#else this->config_.pin_sccb_sda = sda; this->config_.pin_sccb_scl = scl; +#endif } void ESP32Camera::set_reset_pin(uint8_t pin) { this->config_.pin_reset = pin; } void ESP32Camera::set_power_down_pin(uint8_t pin) { this->config_.pin_pwdn = pin; } From 2f241383450eaaac34a53206983ed1fde176782b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 14 Dec 2022 12:03:03 +1300 Subject: [PATCH 0031/1556] Bump version to 2022.12.0b6 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 4b14ce7e40..60752d0578 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.12.0b5" +__version__ = "2022.12.0b6" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From 391316c9b56f074870083e73b37370fddd377317 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 14 Dec 2022 16:37:39 +1300 Subject: [PATCH 0032/1556] Bump version to 2022.12.0 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 60752d0578..7c2b9a624e 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2022.12.0b6" +__version__ = "2022.12.0" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" From 3f1af1690b7387a20a939325441aca8b28e1042e Mon Sep 17 00:00:00 2001 From: Stefan Agner Date: Thu, 15 Dec 2022 21:27:59 +0100 Subject: [PATCH 0033/1556] Support non-multiarch toolchains on 32-bit ARM (#4191) fixes https://github.com/esphome/issues/issues/3904 --- docker/Dockerfile | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docker/Dockerfile b/docker/Dockerfile index a49ad5a9ef..0dd505a9b8 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -12,6 +12,9 @@ FROM debian:bullseye-20221024-slim AS base-docker FROM base-${BASEIMGTYPE} AS base +ARG TARGETARCH +ARG TARGETVARIANT + RUN \ apt-get update \ # Use pinned versions so that we get updates with build caching @@ -36,6 +39,14 @@ ENV \ # Store globally installed pio libs in /piolibs PLATFORMIO_GLOBALLIB_DIR=/piolibs +# Support legacy binaries on Debian multiarch system. There is no "correct" way +# to do this, other than using properly built toolchains... +# See: https://unix.stackexchange.com/questions/553743/correct-way-to-add-lib-ld-linux-so-3-in-debian +RUN \ + if [ "$TARGETARCH$TARGETVARIANT" = "armv7" ]; then \ + ln -s /lib/arm-linux-gnueabihf/ld-linux.so.3 /lib/ld-linux.so.3; \ + fi + RUN \ # Ubuntu python3-pip is missing wheel pip3 install --no-cache-dir \ From e6d8ef98d3ddbccbda644fc088e92e2977b62938 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 16 Dec 2022 10:09:07 +1300 Subject: [PATCH 0034/1556] Mark ESP32-S2 as not having Bluetooth (#4194) --- esphome/components/esp32_ble/__init__.py | 13 ++++++++++++- esphome/components/esp32_ble_beacon/__init__.py | 3 +++ esphome/components/esp32_ble_tracker/__init__.py | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/esphome/components/esp32_ble/__init__.py b/esphome/components/esp32_ble/__init__.py index 4b5c741ad9..c6bb296cdc 100644 --- a/esphome/components/esp32_ble/__init__.py +++ b/esphome/components/esp32_ble/__init__.py @@ -2,12 +2,14 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.const import CONF_ID from esphome.core import CORE -from esphome.components.esp32 import add_idf_sdkconfig_option +from esphome.components.esp32 import add_idf_sdkconfig_option, get_esp32_variant, const DEPENDENCIES = ["esp32"] CODEOWNERS = ["@jesserockz"] CONFLICTS_WITH = ["esp32_ble_tracker", "esp32_ble_beacon"] +NO_BLUTOOTH_VARIANTS = [const.VARIANT_ESP32S2] + esp32_ble_ns = cg.esphome_ns.namespace("esp32_ble") ESP32BLE = esp32_ble_ns.class_("ESP32BLE", cg.Component) @@ -19,6 +21,15 @@ CONFIG_SCHEMA = cv.Schema( ).extend(cv.COMPONENT_SCHEMA) +def validate_variant(_): + variant = get_esp32_variant() + if variant in NO_BLUTOOTH_VARIANTS: + raise cv.Invalid(f"{variant} does not support Bluetooth") + + +FINAL_VALIDATE_SCHEMA = validate_variant + + async def to_code(config): var = cg.new_Pvariable(config[CONF_ID]) await cg.register_component(var, config) diff --git a/esphome/components/esp32_ble_beacon/__init__.py b/esphome/components/esp32_ble_beacon/__init__.py index c3bd4ee418..311919dcd4 100644 --- a/esphome/components/esp32_ble_beacon/__init__.py +++ b/esphome/components/esp32_ble_beacon/__init__.py @@ -3,6 +3,7 @@ import esphome.config_validation as cv from esphome.const import CONF_ID, CONF_TYPE, CONF_UUID, CONF_TX_POWER from esphome.core import CORE, TimePeriod from esphome.components.esp32 import add_idf_sdkconfig_option +from esphome.components import esp32_ble DEPENDENCIES = ["esp32"] CONFLICTS_WITH = ["esp32_ble_tracker"] @@ -54,6 +55,8 @@ CONFIG_SCHEMA = cv.All( validate_config, ) +FINAL_VALIDATE_SCHEMA = esp32_ble.validate_variant + async def to_code(config): uuid = config[CONF_UUID].hex diff --git a/esphome/components/esp32_ble_tracker/__init__.py b/esphome/components/esp32_ble_tracker/__init__.py index a3938faff2..c20491e701 100644 --- a/esphome/components/esp32_ble_tracker/__init__.py +++ b/esphome/components/esp32_ble_tracker/__init__.py @@ -17,6 +17,7 @@ from esphome.const import ( ) from esphome.core import CORE from esphome.components.esp32 import add_idf_sdkconfig_option +from esphome.components import esp32_ble DEPENDENCIES = ["esp32"] @@ -187,6 +188,8 @@ CONFIG_SCHEMA = cv.Schema( } ).extend(cv.COMPONENT_SCHEMA) +FINAL_VALIDATE_SCHEMA = esp32_ble.validate_variant + ESP_BLE_DEVICE_SCHEMA = cv.Schema( { cv.GenerateID(CONF_ESP32_BLE_ID): cv.use_id(ESP32BLETracker), From 9c69b98a49ff85c91d4c8a796788b458258696c1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 16 Dec 2022 10:38:52 +1300 Subject: [PATCH 0035/1556] Fix i2s_audio media_player compiling for esp32-s2 (#4195) --- .../i2s_audio/i2s_audio_media_player.cpp | 6 ++++++ .../components/i2s_audio/i2s_audio_media_player.h | 4 ++++ esphome/components/i2s_audio/media_player.py | 15 ++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/esphome/components/i2s_audio/i2s_audio_media_player.cpp b/esphome/components/i2s_audio/i2s_audio_media_player.cpp index f1f1dc0d51..2b00a5ec26 100644 --- a/esphome/components/i2s_audio/i2s_audio_media_player.cpp +++ b/esphome/components/i2s_audio/i2s_audio_media_player.cpp @@ -103,9 +103,11 @@ void I2SAudioMediaPlayer::stop_() { void I2SAudioMediaPlayer::setup() { ESP_LOGCONFIG(TAG, "Setting up Audio..."); +#if SOC_I2S_SUPPORTS_DAC if (this->internal_dac_mode_ != I2S_DAC_CHANNEL_DISABLE) { this->audio_ = make_unique