From 77966e932e2f579b1c02dcd4da216d036b2a9cdb Mon Sep 17 00:00:00 2001 From: j0ta29 <125505649+j0ta29@users.noreply.github.com> Date: Sat, 25 Nov 2023 19:56:29 +0100 Subject: [PATCH 001/233] Update issue templates --- .github/ISSUE_TEMPLATE/bug_report.md | 38 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/feature_request.md | 20 ++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..dd84ea7824 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,38 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + - OS: [e.g. iOS] + - Browser [e.g. chrome, safari] + - Version [e.g. 22] + +**Smartphone (please complete the following information):** + - Device: [e.g. iPhone6] + - OS: [e.g. iOS8.1] + - Browser [e.g. stock browser, safari] + - Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000000..bbcbbe7d61 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. From f33d759a94c9832f5c126a3074c78643a452952e Mon Sep 17 00:00:00 2001 From: j0ta29 Date: Sat, 25 Nov 2023 20:22:44 +0100 Subject: [PATCH 002/233] Issue tracking for fork --- .github/ISSUE_TEMPLATE/bug_report.md | 38 ----------------------- .github/ISSUE_TEMPLATE/config.yml | 15 +-------- .github/ISSUE_TEMPLATE/feature_request.md | 20 ------------ 3 files changed, 1 insertion(+), 72 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index dd84ea7824..0000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Version [e.g. 22] - -**Smartphone (please complete the following information):** - - Device: [e.g. iPhone6] - - OS: [e.g. iOS8.1] - - Browser [e.g. stock browser, safari] - - Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 804dad47c7..341f6afac7 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,15 +1,2 @@ --- -blank_issues_enabled: false -contact_links: - - name: Issue Tracker - url: https://github.com/esphome/issues - about: Please create bug reports in the dedicated issue tracker. - - name: Feature Request Tracker - url: https://github.com/esphome/feature-requests - about: | - Please create feature requests in the dedicated feature request tracker. - - name: Frequently Asked Question - url: https://esphome.io/guides/faq.html - about: | - Please view the FAQ for common questions and what - to include in a bug report. +blank_issues_enabled: true diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index bbcbbe7d61..0000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: '' -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. From 51a8a7e875fff4d9687f743a4fc8c02a6f201e9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:17:18 +1200 Subject: [PATCH 003/233] Bump docker/build-push-action from 5.3.0 to 5.4.0 in /.github/actions/build-image (#6883) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index d36bd65bb6..d792ab5f4c 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v5.4.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v5.3.0 + uses: docker/build-push-action@v5.4.0 with: context: . file: ./docker/Dockerfile From 95e45dc12c9e313cbb5787978b3e067f581c76c9 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 11 Jun 2024 10:40:56 +1200 Subject: [PATCH 004/233] Allow parse_json to return a boolean result (#6884) * Allow parse_json to return a boolean result * Remove pass variable --- esphome/components/json/json_util.cpp | 17 ++++++++--------- esphome/components/json/json_util.h | 4 ++-- esphome/components/mqtt/mqtt_client.cpp | 5 ++++- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/esphome/components/json/json_util.cpp b/esphome/components/json/json_util.cpp index bef494b64d..89ec13fe5b 100644 --- a/esphome/components/json/json_util.cpp +++ b/esphome/components/json/json_util.cpp @@ -62,7 +62,7 @@ std::string build_json(const json_build_t &f) { } } -void parse_json(const std::string &data, const json_parse_t &f) { +bool parse_json(const std::string &data, const json_parse_t &f) { // Here we are allocating 1.5 times the data size, // with the heap size minus 2kb to be safe if less than that // as we can not have a true dynamic sized document. @@ -76,14 +76,13 @@ void parse_json(const std::string &data, const json_parse_t &f) { #elif defined(USE_LIBRETINY) const size_t free_heap = lt_heap_get_free(); #endif - bool pass = false; size_t request_size = std::min(free_heap, (size_t) (data.size() * 1.5)); - do { + while (true) { DynamicJsonDocument json_document(request_size); if (json_document.capacity() == 0) { ESP_LOGE(TAG, "Could not allocate memory for JSON document! Requested %u bytes, free heap: %u", request_size, free_heap); - return; + return false; } DeserializationError err = deserializeJson(json_document, data); json_document.shrinkToFit(); @@ -91,21 +90,21 @@ void parse_json(const std::string &data, const json_parse_t &f) { JsonObject root = json_document.as(); if (err == DeserializationError::Ok) { - pass = true; - f(root); + return f(root); } else if (err == DeserializationError::NoMemory) { if (request_size * 2 >= free_heap) { ESP_LOGE(TAG, "Can not allocate more memory for deserialization. Consider making source string smaller"); - return; + return false; } ESP_LOGV(TAG, "Increasing memory allocation."); request_size *= 2; continue; } else { ESP_LOGE(TAG, "JSON parse error: %s", err.c_str()); - return; + return false; } - } while (!pass); + }; + return false; } } // namespace json diff --git a/esphome/components/json/json_util.h b/esphome/components/json/json_util.h index 2299a4cfed..72d31c8afe 100644 --- a/esphome/components/json/json_util.h +++ b/esphome/components/json/json_util.h @@ -14,7 +14,7 @@ namespace esphome { namespace json { /// Callback function typedef for parsing JsonObjects. -using json_parse_t = std::function; +using json_parse_t = std::function; /// Callback function typedef for building JsonObjects. using json_build_t = std::function; @@ -23,7 +23,7 @@ using json_build_t = std::function; std::string build_json(const json_build_t &f); /// Parse a JSON string and run the provided json parse function if it's valid. -void parse_json(const std::string &data, const json_parse_t &f); +bool parse_json(const std::string &data, const json_parse_t &f); } // namespace json } // namespace esphome diff --git a/esphome/components/mqtt/mqtt_client.cpp b/esphome/components/mqtt/mqtt_client.cpp index abcbb414d9..d70b9cbd30 100644 --- a/esphome/components/mqtt/mqtt_client.cpp +++ b/esphome/components/mqtt/mqtt_client.cpp @@ -410,7 +410,10 @@ void MQTTClientComponent::subscribe(const std::string &topic, mqtt_callback_t ca void MQTTClientComponent::subscribe_json(const std::string &topic, const mqtt_json_callback_t &callback, uint8_t qos) { auto f = [callback](const std::string &topic, const std::string &payload) { - json::parse_json(payload, [topic, callback](JsonObject root) { callback(topic, root); }); + json::parse_json(payload, [topic, callback](JsonObject root) -> bool { + callback(topic, root); + return true; + }); }; MQTTSubscription subscription{ .topic = topic, From 7dc07c5632a14986c7050639897eca8a7768d100 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Tue, 11 Jun 2024 11:33:42 +1200 Subject: [PATCH 005/233] Update webserver local assets to 20240610-230854 (#6886) --- .../components/web_server/server_index_v2.h | 1246 +++++++++-------- .../components/web_server/server_index_v3.h | 728 +++++----- 2 files changed, 994 insertions(+), 980 deletions(-) diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h index 7417f37015..c942cda592 100644 --- a/esphome/components/web_server/server_index_v2.h +++ b/esphome/components/web_server/server_index_v2.h @@ -10,625 +10,633 @@ namespace esphome { namespace web_server { const uint8_t INDEX_GZ[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcd, 0x7d, 0xd9, 0x92, 0xdb, 0x46, 0xb6, 0xe0, 0xf3, - 0xdc, 0xaf, 0x40, 0xa5, 0xab, 0x4b, 0xc8, 0x66, 0x12, 0x45, 0xb2, 0xb4, 0x19, 0xac, 0x24, 0xbb, 0x54, 0x92, 0x5b, - 0x76, 0x6b, 0xb1, 0x55, 0x92, 0xdd, 0x36, 0xcd, 0xae, 0x42, 0x11, 0x49, 0x32, 0x2d, 0x10, 0x49, 0x03, 0xc9, 0x5a, - 0x4c, 0xe2, 0xc6, 0x7c, 0xc0, 0x44, 0x4c, 0xc4, 0x3c, 0xcd, 0xcb, 0xc4, 0xdc, 0x87, 0xf9, 0x88, 0x79, 0xbe, 0x9f, - 0x72, 0x7f, 0x60, 0xe6, 0x13, 0x26, 0x4e, 0x2e, 0x40, 0x82, 0x4b, 0xa9, 0xbc, 0xdc, 0x1b, 0x13, 0x0a, 0x49, 0x44, - 0xae, 0x27, 0x4f, 0x9e, 0x3c, 0x7b, 0x02, 0xc7, 0x7b, 0xb1, 0x18, 0xc9, 0xdb, 0x39, 0xf3, 0xa6, 0x72, 0x96, 0xf4, - 0x8e, 0xcd, 0xbf, 0x2c, 0x8a, 0x7b, 0xc7, 0x09, 0x4f, 0x3f, 0x7a, 0x19, 0x4b, 0x28, 0x1f, 0x89, 0xd4, 0x9b, 0x66, - 0x6c, 0x4c, 0xe3, 0x48, 0x46, 0x21, 0x9f, 0x45, 0x13, 0xe6, 0x1d, 0xf6, 0x8e, 0x67, 0x4c, 0x46, 0xde, 0x68, 0x1a, - 0x65, 0x39, 0x93, 0xf4, 0xc3, 0xfb, 0x2f, 0x9a, 0x4f, 0x7b, 0xc7, 0xf9, 0x28, 0xe3, 0x73, 0xe9, 0xc1, 0x90, 0x74, - 0x26, 0xe2, 0x45, 0xc2, 0x7a, 0x87, 0x87, 0xd7, 0xd7, 0xd7, 0xc1, 0x4f, 0xf9, 0x3f, 0x8d, 0x44, 0x9a, 0x4b, 0xef, - 0x15, 0xbd, 0xe6, 0x69, 0x2c, 0xae, 0x09, 0x93, 0xf4, 0x55, 0x70, 0x36, 0x8d, 0x62, 0x71, 0xfd, 0x4e, 0x08, 0x79, - 0x70, 0xe0, 0xeb, 0xc7, 0xdb, 0xd3, 0xb3, 0x33, 0x4a, 0xe9, 0x95, 0xe0, 0xb1, 0xd7, 0x5a, 0xad, 0xaa, 0xc2, 0x20, - 0x8d, 0x24, 0xbf, 0x62, 0xba, 0x0b, 0x3e, 0x38, 0x40, 0x51, 0x2c, 0xe6, 0x92, 0xc5, 0x67, 0xf2, 0x36, 0x61, 0x67, - 0x53, 0xc6, 0x64, 0x8e, 0x78, 0xea, 0x3d, 0x17, 0xa3, 0xc5, 0x8c, 0xa5, 0x32, 0x98, 0x67, 0x42, 0x0a, 0x80, 0xe4, - 0xe0, 0x00, 0x65, 0x6c, 0x9e, 0x44, 0x23, 0x06, 0xf5, 0xa7, 0x67, 0x67, 0x55, 0x8f, 0xaa, 0x11, 0xe1, 0x92, 0x9e, - 0xdd, 0xce, 0x2e, 0x45, 0xe2, 0x63, 0x92, 0x48, 0x9a, 0xb2, 0x6b, 0xef, 0x3b, 0x16, 0x7d, 0x7c, 0x1d, 0xcd, 0xbb, - 0xa3, 0x24, 0xca, 0x73, 0xef, 0x52, 0x2e, 0xd5, 0x12, 0xb2, 0xc5, 0x48, 0x8a, 0xcc, 0x97, 0x84, 0x11, 0x8e, 0x97, - 0x7c, 0xec, 0xcb, 0x29, 0xcf, 0x83, 0xf3, 0xfd, 0x51, 0x9e, 0xbf, 0x63, 0xf9, 0x22, 0x91, 0xfb, 0x74, 0xaf, 0x45, - 0xf8, 0x1e, 0xa5, 0x5c, 0x62, 0x39, 0xcd, 0xc4, 0xb5, 0xf7, 0x22, 0xcb, 0x44, 0xe6, 0xa3, 0xd3, 0xb3, 0x33, 0xdd, - 0xc2, 0xe3, 0xb9, 0x97, 0x0a, 0xe9, 0x95, 0xe3, 0x45, 0x97, 0x09, 0x0b, 0xbc, 0x0f, 0x39, 0xf3, 0x2e, 0x16, 0x69, - 0x1e, 0x8d, 0xd9, 0xe9, 0xd9, 0xd9, 0x85, 0x27, 0x32, 0xef, 0x62, 0x94, 0xe7, 0x17, 0x1e, 0x4f, 0x73, 0xc9, 0xa2, - 0x38, 0x40, 0xb8, 0xab, 0x26, 0x1b, 0xe5, 0xf9, 0x7b, 0x76, 0x23, 0xa9, 0x24, 0xea, 0x51, 0x52, 0x56, 0x4c, 0x98, - 0xf4, 0xf2, 0x72, 0x5d, 0x3e, 0x5e, 0x26, 0x4c, 0x7a, 0x92, 0xaa, 0x7a, 0xd1, 0xd5, 0xb8, 0x67, 0xfa, 0x51, 0x76, - 0xf9, 0xd8, 0x67, 0xf2, 0xe0, 0x40, 0x96, 0x78, 0xc6, 0x7a, 0x69, 0x1e, 0xa7, 0x6c, 0xcf, 0x96, 0x1d, 0x1c, 0xb0, - 0x20, 0x61, 0xe9, 0x44, 0x4e, 0x29, 0xa5, 0xed, 0x2e, 0x3f, 0x38, 0xf0, 0x25, 0x4d, 0x64, 0x30, 0x61, 0xd2, 0x67, - 0x18, 0x93, 0xaa, 0xf7, 0xc1, 0x81, 0xaf, 0x91, 0x20, 0xa8, 0x46, 0x5c, 0x0d, 0xc7, 0x38, 0x30, 0xd8, 0x3f, 0xbb, - 0x4d, 0x47, 0xbe, 0x0b, 0x3f, 0x26, 0xfc, 0xe0, 0x20, 0x91, 0x41, 0x0e, 0x23, 0x12, 0x89, 0x71, 0x91, 0x31, 0xb9, - 0xc8, 0x52, 0x4f, 0x16, 0x52, 0x9c, 0xc9, 0x8c, 0xa7, 0x13, 0x1f, 0x2f, 0x6d, 0x99, 0xd3, 0xb1, 0x28, 0x34, 0xb8, - 0x5f, 0x4b, 0x9a, 0xd1, 0x1e, 0xcc, 0x78, 0x29, 0x7d, 0xd8, 0x45, 0x31, 0xf6, 0x32, 0x4a, 0x51, 0xae, 0xfa, 0xa2, - 0x7e, 0x16, 0x66, 0x0d, 0x84, 0x88, 0x86, 0x92, 0x70, 0x89, 0xc9, 0x47, 0xea, 0x67, 0x24, 0x08, 0x02, 0x89, 0x69, - 0x6f, 0x69, 0xb1, 0x92, 0x39, 0xeb, 0xec, 0x67, 0x83, 0xd6, 0x30, 0x94, 0x41, 0xc6, 0xe2, 0xc5, 0x88, 0xf9, 0x3e, - 0x27, 0x39, 0x49, 0x31, 0xed, 0xf1, 0x86, 0x2f, 0x68, 0x0f, 0xb6, 0x5b, 0xd4, 0xf7, 0x9a, 0xd2, 0xbd, 0x16, 0x36, - 0x30, 0x0a, 0x0b, 0x20, 0x60, 0xd8, 0xc0, 0x23, 0x28, 0x45, 0xe9, 0x62, 0x76, 0xc9, 0x32, 0x54, 0x36, 0xeb, 0xd6, - 0xc8, 0x62, 0x91, 0x33, 0x6f, 0x94, 0xe7, 0xde, 0x78, 0x91, 0x8e, 0x24, 0x17, 0xa9, 0x87, 0x1a, 0xa2, 0x81, 0x34, - 0x39, 0x94, 0xd4, 0x80, 0x70, 0x81, 0xfd, 0x1c, 0x37, 0xb2, 0x41, 0xda, 0x68, 0x0f, 0x09, 0x40, 0x89, 0xbb, 0x66, - 0x3c, 0x83, 0x00, 0x46, 0x32, 0x58, 0x63, 0x41, 0x3e, 0x48, 0x58, 0xa5, 0x5a, 0x22, 0x93, 0xfd, 0x2c, 0xd8, 0x3c, - 0x28, 0x54, 0x06, 0xb3, 0x68, 0xee, 0x33, 0xda, 0x63, 0x8a, 0xb8, 0xa2, 0x74, 0x04, 0xb0, 0xd6, 0xf6, 0xad, 0xcf, - 0x42, 0x16, 0x54, 0x24, 0x85, 0x43, 0x19, 0x8c, 0x45, 0xf6, 0x22, 0x1a, 0x4d, 0xa1, 0x5f, 0x49, 0x30, 0xb1, 0x3d, - 0x6f, 0xa3, 0x8c, 0x45, 0x92, 0xbd, 0x48, 0x18, 0x3c, 0xf9, 0x48, 0xf5, 0x44, 0x98, 0xe4, 0xf4, 0x55, 0x90, 0x70, - 0xf9, 0x46, 0xa4, 0x23, 0xd6, 0xcd, 0x1d, 0xea, 0xe2, 0xb0, 0xef, 0x27, 0x52, 0x66, 0xfc, 0x72, 0x21, 0x99, 0x8f, - 0x52, 0x68, 0x81, 0x48, 0x8e, 0x09, 0x0f, 0x24, 0xbb, 0x91, 0xa7, 0x22, 0x95, 0x2c, 0x95, 0x94, 0x59, 0xa4, 0x92, - 0x2c, 0x88, 0xe6, 0x73, 0x96, 0xc6, 0xa7, 0x53, 0x9e, 0xc4, 0x3e, 0xc7, 0x05, 0x2e, 0x48, 0x24, 0x29, 0xac, 0x91, - 0xf6, 0xb2, 0x10, 0xfe, 0xd9, 0xbd, 0x1a, 0x5f, 0xd2, 0x9e, 0x3a, 0x14, 0x8c, 0x22, 0xd4, 0x1d, 0x8b, 0xcc, 0x37, - 0x2b, 0xf0, 0xc4, 0xd8, 0x93, 0x30, 0xc7, 0xbb, 0x45, 0xc2, 0x72, 0xcc, 0x1a, 0x94, 0x97, 0xdb, 0x68, 0x10, 0xfc, - 0x35, 0x50, 0x7c, 0x81, 0xfd, 0x0c, 0x87, 0x59, 0xf7, 0x2a, 0xca, 0xbc, 0x2f, 0xcc, 0x89, 0xfa, 0xc9, 0x72, 0xb3, - 0xa9, 0xa4, 0x3f, 0x05, 0x32, 0x5b, 0xe4, 0x92, 0xc5, 0xef, 0x6f, 0xe7, 0x2c, 0x27, 0xef, 0x25, 0x9d, 0xca, 0xfe, - 0x54, 0x06, 0x6c, 0x36, 0x97, 0xb7, 0x67, 0x8a, 0x31, 0x86, 0x08, 0x91, 0x11, 0xb4, 0xcc, 0x58, 0x34, 0x02, 0x66, - 0x66, 0xb0, 0xf5, 0xb5, 0x48, 0x6e, 0xc7, 0x3c, 0x49, 0xce, 0x16, 0xf3, 0xb9, 0xc8, 0x24, 0xf9, 0x2b, 0x5d, 0x4a, - 0x51, 0xa1, 0x06, 0xf6, 0x72, 0x99, 0x5f, 0x73, 0x39, 0x9a, 0xfa, 0x12, 0x2f, 0x47, 0x51, 0xce, 0xbc, 0x67, 0x42, - 0x24, 0x2c, 0x4a, 0xc3, 0x8c, 0x66, 0xfd, 0xf7, 0x32, 0x4c, 0x17, 0x49, 0xd2, 0xbd, 0xcc, 0x58, 0xf4, 0xb1, 0xab, - 0xaa, 0xdf, 0x5e, 0xfe, 0xc4, 0x46, 0x32, 0x54, 0xbf, 0x4f, 0xb2, 0x2c, 0xba, 0x85, 0x86, 0x94, 0x42, 0xb3, 0x7e, - 0x16, 0x7e, 0x75, 0xf6, 0xf6, 0x4d, 0xa0, 0x0f, 0x09, 0x1f, 0xdf, 0xfa, 0x59, 0x79, 0xf0, 0xb2, 0x82, 0x8c, 0x33, - 0x31, 0x5b, 0x9b, 0x5a, 0x63, 0x2d, 0xeb, 0xee, 0x00, 0x81, 0xd1, 0x6c, 0x4f, 0x0f, 0xed, 0x42, 0xf0, 0x46, 0xd1, - 0x3c, 0x54, 0x52, 0x33, 0x2f, 0xfc, 0x13, 0xea, 0x62, 0x3f, 0xc3, 0x77, 0x43, 0x2b, 0xb3, 0xdb, 0x25, 0xa3, 0x0a, - 0xce, 0x39, 0x48, 0x18, 0x80, 0x71, 0x14, 0xc9, 0xd1, 0x74, 0xc9, 0xd4, 0x60, 0x85, 0x85, 0x98, 0x15, 0x05, 0xb9, - 0x2e, 0xe9, 0x5d, 0xee, 0x51, 0x9a, 0x29, 0x46, 0x45, 0xe5, 0x6a, 0x95, 0x51, 0x9a, 0x61, 0xf2, 0x1d, 0x5d, 0x46, - 0x76, 0x3d, 0xe1, 0x5e, 0x8b, 0xc0, 0xb9, 0x0c, 0x35, 0x77, 0x21, 0x23, 0x91, 0x5e, 0xb1, 0x4c, 0xb2, 0x2c, 0xfc, - 0x2b, 0xc9, 0xd8, 0x38, 0x01, 0x28, 0xf6, 0xda, 0x64, 0x1a, 0xe5, 0xa7, 0xd3, 0x28, 0x9d, 0xb0, 0x38, 0xbc, 0x96, - 0x05, 0xf9, 0x3b, 0x45, 0x63, 0x9e, 0x46, 0x09, 0xff, 0x85, 0xc5, 0xc8, 0x48, 0x83, 0x13, 0x8f, 0xdd, 0x48, 0x96, - 0xc6, 0xb9, 0xf7, 0xf2, 0xfd, 0xeb, 0x57, 0x66, 0x1f, 0x6b, 0x02, 0x02, 0x2f, 0xf3, 0xc5, 0x9c, 0x65, 0x3e, 0x26, - 0x46, 0x40, 0xbc, 0xe0, 0x8a, 0x39, 0xbe, 0x8e, 0xe6, 0xba, 0x84, 0xe7, 0x1f, 0xe6, 0x71, 0x24, 0xd9, 0xd7, 0x2c, - 0x8d, 0x79, 0x3a, 0xa1, 0x7b, 0x6d, 0x5d, 0x3e, 0x8d, 0x4c, 0x45, 0x5c, 0x16, 0x9d, 0xef, 0xbf, 0x48, 0xd4, 0xba, - 0xcb, 0xc7, 0x85, 0x8f, 0x8b, 0x5c, 0x46, 0x92, 0x8f, 0xbc, 0x28, 0x8e, 0xbf, 0x4c, 0xb9, 0xe4, 0x0a, 0xc0, 0x0c, - 0xb6, 0x07, 0x48, 0x94, 0x69, 0x51, 0x61, 0x01, 0xf7, 0x31, 0xf1, 0x7d, 0x23, 0x00, 0xa6, 0xd8, 0xec, 0xd7, 0xc1, - 0x41, 0xc5, 0xee, 0xfb, 0x2c, 0xd4, 0x95, 0x74, 0x30, 0xc4, 0xc1, 0x7c, 0x91, 0xc3, 0x46, 0xdb, 0x29, 0x40, 0xba, - 0x88, 0xcb, 0x9c, 0x65, 0x57, 0x2c, 0x2e, 0x89, 0x23, 0xf7, 0xf1, 0x72, 0x6d, 0x0e, 0x73, 0x2c, 0x24, 0x1d, 0x0c, - 0xbb, 0x2e, 0xdf, 0x66, 0x86, 0xce, 0x33, 0x31, 0x67, 0x99, 0xe4, 0x2c, 0x2f, 0x59, 0x89, 0x0f, 0x52, 0xb4, 0x64, - 0x27, 0x39, 0xb5, 0xeb, 0x9b, 0xfb, 0x9c, 0x30, 0x5c, 0x63, 0x18, 0x56, 0xd0, 0xbe, 0xb8, 0x52, 0x12, 0x23, 0x27, - 0x1c, 0x13, 0xa9, 0x21, 0xcd, 0x31, 0x2e, 0x30, 0x91, 0x16, 0x5c, 0xcd, 0x8a, 0xcc, 0x6c, 0xb7, 0x20, 0xaa, 0xe9, - 0x77, 0x4a, 0x54, 0x03, 0x43, 0x8b, 0x24, 0x3b, 0x38, 0xf0, 0x59, 0x50, 0x12, 0x05, 0xdd, 0x6b, 0x9b, 0x3d, 0x72, - 0x90, 0xb5, 0x03, 0x6c, 0x98, 0x58, 0x12, 0x86, 0xc9, 0x1e, 0x0b, 0x52, 0x71, 0x32, 0x1a, 0xb1, 0x3c, 0x17, 0xd9, - 0xc1, 0xc1, 0x9e, 0x6a, 0x5f, 0x6a, 0x13, 0xb0, 0x87, 0x6f, 0xaf, 0xd3, 0x0a, 0x02, 0x5c, 0x49, 0x58, 0x23, 0x17, - 0x24, 0xc8, 0x29, 0xa5, 0x70, 0xa0, 0xbe, 0x55, 0x3c, 0x42, 0x74, 0x7e, 0x8e, 0x1a, 0x92, 0x18, 0x34, 0x4c, 0x98, - 0x9d, 0xfa, 0xf6, 0x39, 0xd3, 0xaa, 0x95, 0x52, 0x3c, 0x36, 0x30, 0xa3, 0xcf, 0x4f, 0x10, 0xb3, 0x31, 0x4f, 0x9d, - 0x65, 0xd7, 0x40, 0x22, 0x92, 0xe4, 0xb8, 0x70, 0x36, 0x74, 0xeb, 0xd0, 0x4a, 0xa7, 0xd1, 0x3b, 0xb7, 0x9c, 0x28, - 0x3d, 0xc2, 0xd9, 0xc6, 0x01, 0x1b, 0x16, 0x44, 0xa1, 0xde, 0xae, 0x26, 0x55, 0x80, 0x0e, 0xe4, 0xb0, 0x6b, 0xea, - 0x69, 0xae, 0x31, 0x97, 0xb1, 0x9f, 0x17, 0x2c, 0x97, 0x9a, 0x8e, 0x7d, 0x49, 0x52, 0xc2, 0x71, 0x01, 0xc7, 0x6d, - 0xcc, 0x27, 0x8b, 0x0c, 0xd4, 0x1d, 0x38, 0x8a, 0x2c, 0x5d, 0xcc, 0x98, 0x7d, 0xda, 0x06, 0xdb, 0xdb, 0x39, 0x08, - 0xc4, 0x1c, 0x68, 0xfa, 0x6e, 0x72, 0x02, 0x58, 0x25, 0x5e, 0xad, 0xbe, 0xb3, 0x83, 0x54, 0x5b, 0x59, 0xaa, 0x68, - 0x6b, 0x7b, 0xf2, 0x77, 0x6c, 0xe4, 0xf1, 0x5e, 0x5b, 0x43, 0xff, 0xf7, 0x21, 0xdd, 0x6b, 0x95, 0x14, 0x6c, 0x70, - 0xaa, 0x81, 0xd1, 0x28, 0x7c, 0xab, 0x07, 0xc2, 0x4a, 0xba, 0xd7, 0x88, 0x25, 0x98, 0x6e, 0xd0, 0xe9, 0x94, 0x0e, - 0x40, 0xcf, 0x08, 0xa6, 0xc3, 0x5d, 0xc4, 0x64, 0xb9, 0x81, 0x2f, 0x37, 0xeb, 0x2a, 0xa6, 0x71, 0x55, 0x67, 0x1a, - 0x6b, 0x8b, 0x40, 0xf3, 0xb2, 0x0b, 0x2a, 0x69, 0xcc, 0x1c, 0xf3, 0xaa, 0x8a, 0x70, 0x05, 0x4c, 0xb5, 0x24, 0x67, - 0x88, 0x37, 0xd1, 0x8c, 0xe5, 0x3e, 0xc3, 0x64, 0x57, 0x03, 0x4d, 0x9c, 0xd0, 0x64, 0xe8, 0x88, 0xcd, 0x1c, 0xc4, - 0x26, 0xc7, 0x5a, 0x2b, 0xab, 0x1f, 0xb7, 0x9c, 0xb0, 0x41, 0x3e, 0xac, 0x94, 0x39, 0x67, 0xf1, 0x4a, 0x1e, 0x1b, - 0xea, 0xb6, 0xf8, 0xd3, 0x65, 0x1a, 0x69, 0x4a, 0x69, 0xc8, 0x31, 0xd9, 0x6b, 0xad, 0xef, 0xa3, 0x6d, 0x55, 0xad, - 0x71, 0x30, 0x84, 0x7d, 0x50, 0xe2, 0x22, 0xe0, 0xb9, 0xfa, 0xbf, 0x76, 0xce, 0x00, 0x6d, 0x67, 0x40, 0x16, 0xc1, - 0x38, 0x89, 0xa4, 0xdf, 0x3e, 0x6c, 0x81, 0x26, 0x7a, 0xc5, 0x40, 0x9a, 0x60, 0xbc, 0xb9, 0x14, 0x16, 0x2c, 0xd2, - 0x7c, 0xca, 0xc7, 0xd2, 0x8f, 0xa4, 0x62, 0x28, 0x2c, 0xc9, 0x99, 0x27, 0x6b, 0xfa, 0xb0, 0x62, 0x36, 0x11, 0x90, - 0x5a, 0xa9, 0x7c, 0x31, 0x0b, 0xa9, 0x62, 0x5a, 0xc0, 0x1b, 0x2a, 0x5d, 0xba, 0xe2, 0x31, 0xb6, 0x35, 0x07, 0x7d, - 0xb1, 0xdd, 0xd7, 0x23, 0x86, 0x86, 0x15, 0x70, 0x47, 0x65, 0xe5, 0xa1, 0xcb, 0x1f, 0x4c, 0xa1, 0x0c, 0xa4, 0x78, - 0x25, 0xae, 0x59, 0x76, 0x1a, 0x01, 0xf0, 0xa1, 0xee, 0x5e, 0x68, 0x31, 0xa0, 0xb8, 0xbd, 0xec, 0x5a, 0x7a, 0x39, - 0x57, 0x0b, 0xff, 0x3a, 0x13, 0x33, 0x9e, 0x33, 0xd0, 0xd4, 0x34, 0xfe, 0x53, 0x38, 0x65, 0xea, 0x38, 0x82, 0xa8, - 0x61, 0x25, 0x7d, 0x9d, 0xbc, 0xaa, 0xd3, 0xd7, 0xf9, 0xfe, 0x8b, 0x89, 0x65, 0x7f, 0xf5, 0x43, 0x8c, 0x89, 0x6f, - 0xec, 0x09, 0x47, 0xca, 0x05, 0x53, 0x6c, 0xc4, 0xfb, 0x6a, 0x25, 0x1d, 0xb3, 0xad, 0xa6, 0x2b, 0x32, 0x7d, 0x6c, - 0x70, 0x11, 0xc5, 0x31, 0x68, 0x75, 0x99, 0x48, 0x12, 0x47, 0x50, 0x11, 0xde, 0x2d, 0x45, 0xd3, 0xf9, 0xfe, 0x8b, - 0xb3, 0xbb, 0xa4, 0x13, 0xd4, 0xbb, 0x02, 0xca, 0x02, 0x9a, 0xc6, 0x2c, 0x03, 0x33, 0xd2, 0xd9, 0x2d, 0x23, 0x63, - 0x4f, 0x45, 0x9a, 0xb2, 0x91, 0x64, 0x31, 0x58, 0x29, 0x9c, 0xca, 0x60, 0x2a, 0x72, 0x59, 0x16, 0x56, 0xd0, 0x73, - 0x07, 0x7a, 0x1e, 0x8c, 0xa2, 0x24, 0xf1, 0xb5, 0x45, 0x32, 0x13, 0x57, 0x6c, 0x0b, 0xd4, 0xdd, 0x1a, 0xc8, 0xe5, - 0x30, 0xcc, 0x19, 0x86, 0x05, 0xf9, 0x3c, 0xe1, 0x23, 0x56, 0x0a, 0xae, 0xb3, 0x80, 0xa7, 0x31, 0xbb, 0x01, 0x3e, - 0x82, 0x7b, 0xbd, 0x5e, 0x8b, 0xb4, 0x71, 0xa1, 0x11, 0xbe, 0xdc, 0x40, 0xec, 0x1d, 0x22, 0x13, 0x88, 0x8c, 0xf6, - 0x96, 0xdb, 0xf8, 0x01, 0xc3, 0x8e, 0x9c, 0xe4, 0xd6, 0xb2, 0xd2, 0xbc, 0x19, 0x93, 0x98, 0x25, 0x4c, 0x32, 0xcb, - 0xcb, 0x41, 0x7f, 0xd6, 0x47, 0xf7, 0x5d, 0x89, 0xbf, 0x92, 0x9c, 0xec, 0x29, 0xb3, 0x7b, 0x9e, 0x97, 0x96, 0x7a, - 0xb5, 0x3d, 0x15, 0xb6, 0xfb, 0x52, 0x6f, 0x4f, 0x24, 0x65, 0x34, 0x9a, 0x6a, 0x13, 0xdd, 0xdf, 0x58, 0x52, 0x35, - 0x86, 0xe1, 0xeb, 0xe5, 0x21, 0xfa, 0x60, 0xc1, 0xdc, 0x86, 0x82, 0x33, 0xc3, 0x14, 0x18, 0x58, 0x7d, 0x7a, 0xdb, - 0x4e, 0xa3, 0x24, 0xb9, 0x8c, 0x46, 0x1f, 0xeb, 0xd4, 0x5f, 0x91, 0x01, 0x5d, 0xe7, 0xc6, 0x4e, 0x95, 0xc3, 0xb2, - 0xdc, 0x75, 0x5b, 0x2e, 0x5d, 0x3b, 0x28, 0xfe, 0x5e, 0xab, 0x22, 0xfb, 0xfa, 0x46, 0xef, 0xa4, 0x76, 0x05, 0x11, - 0x37, 0x2b, 0xf3, 0x81, 0x0b, 0x7c, 0x92, 0xe2, 0x2c, 0x3f, 0x30, 0x74, 0x07, 0xb6, 0x46, 0xb1, 0x06, 0x88, 0xc4, - 0xcb, 0x22, 0xe6, 0xf9, 0x6e, 0x0c, 0xfc, 0x21, 0x50, 0x3e, 0x77, 0x66, 0xb8, 0x2f, 0xa0, 0x25, 0x8f, 0x33, 0x2a, - 0x73, 0x09, 0x99, 0xd1, 0x26, 0x2c, 0xa3, 0xf9, 0x1b, 0x68, 0x2e, 0x8a, 0xde, 0xdf, 0xea, 0x2a, 0xd0, 0xc9, 0x00, - 0x8a, 0xbc, 0xeb, 0x2a, 0x13, 0x35, 0x0a, 0x30, 0x3c, 0x95, 0x2b, 0x91, 0x9b, 0xd6, 0x8c, 0x47, 0xa3, 0xae, 0x6b, - 0xfb, 0xdb, 0xb0, 0x5c, 0x41, 0x7d, 0xdf, 0xcf, 0xc1, 0x7e, 0xb3, 0x7a, 0x7d, 0xb5, 0x88, 0x7c, 0x63, 0x11, 0x79, - 0xe0, 0x18, 0x59, 0xb8, 0xa2, 0x65, 0xa7, 0x7b, 0xf8, 0x57, 0xec, 0x36, 0x02, 0x65, 0x35, 0x00, 0xfe, 0x8c, 0x4b, - 0x76, 0x9b, 0x50, 0x49, 0x84, 0x31, 0x70, 0x0c, 0xa5, 0x01, 0xc3, 0xa8, 0xba, 0xa4, 0x58, 0x1f, 0x8d, 0x9a, 0xb1, - 0x9b, 0x12, 0x81, 0xd7, 0x34, 0xfb, 0xa2, 0x30, 0x38, 0x62, 0xd8, 0xec, 0x4d, 0x4d, 0x25, 0x76, 0xb0, 0x42, 0x52, - 0x6a, 0xd4, 0x60, 0xad, 0xf5, 0xac, 0xe3, 0xa6, 0x1c, 0x17, 0x0e, 0x6a, 0x85, 0x9a, 0x9a, 0x3e, 0x69, 0x15, 0xab, - 0x14, 0x93, 0xa9, 0xd5, 0x48, 0x45, 0xb5, 0x6e, 0x4a, 0x91, 0xf5, 0x46, 0xa0, 0xfe, 0xb2, 0x66, 0x12, 0x86, 0x4e, - 0xb3, 0x22, 0x04, 0x96, 0x2a, 0xb6, 0xa1, 0x7b, 0x1b, 0xcd, 0xd4, 0xc6, 0x71, 0x10, 0x2e, 0x5c, 0x84, 0x3b, 0x98, - 0x4d, 0x35, 0xe7, 0x4a, 0x87, 0x74, 0x5a, 0xef, 0xeb, 0x33, 0x22, 0xf4, 0x3e, 0x6c, 0x20, 0x71, 0x5d, 0xf1, 0x54, - 0x24, 0x08, 0x06, 0x6c, 0x0e, 0xca, 0x9d, 0x2b, 0x1f, 0x7c, 0x80, 0x9d, 0xaf, 0x56, 0x1b, 0x44, 0xb7, 0x55, 0xff, - 0xc4, 0x41, 0x65, 0x14, 0xae, 0x56, 0xd7, 0x12, 0xfb, 0x46, 0xf3, 0x25, 0x0c, 0xf7, 0x2d, 0xc7, 0x3d, 0x79, 0x05, - 0xad, 0x94, 0x22, 0x5a, 0x95, 0x94, 0x26, 0x43, 0x9d, 0x66, 0xeb, 0xfb, 0x24, 0x1d, 0xb6, 0x7d, 0xba, 0xc1, 0xbd, - 0x54, 0xa1, 0x11, 0xd3, 0xd5, 0x92, 0x4f, 0xcd, 0xd0, 0x1c, 0x63, 0x1c, 0xe6, 0xca, 0x8a, 0xd9, 0xdb, 0x66, 0x58, - 0x1e, 0x1c, 0xe4, 0xce, 0x40, 0xe7, 0x25, 0x9b, 0xf8, 0xc9, 0x07, 0x91, 0x9c, 0xdf, 0xa6, 0x4a, 0x77, 0xf9, 0xc9, - 0x0a, 0xa1, 0x0d, 0xb3, 0xb4, 0xd5, 0x05, 0x6b, 0x3c, 0xba, 0x8e, 0xb8, 0xf4, 0xca, 0x51, 0xb4, 0x35, 0xee, 0x33, - 0xbc, 0x34, 0xaa, 0x46, 0x90, 0x31, 0x50, 0x1e, 0x81, 0x27, 0x58, 0x15, 0x5a, 0xd3, 0xfd, 0x68, 0xca, 0xc0, 0x11, - 0x6c, 0xb5, 0x88, 0xd2, 0x2e, 0xdc, 0x33, 0x52, 0xc4, 0x0c, 0xbc, 0x1d, 0xf6, 0x62, 0xbd, 0x7b, 0xcd, 0x0e, 0x98, - 0xb3, 0x6c, 0x2c, 0xb2, 0x99, 0xad, 0x2b, 0xd6, 0x9e, 0x0d, 0x67, 0xe4, 0x63, 0x7f, 0xeb, 0xd8, 0x46, 0xfd, 0xef, - 0xae, 0x19, 0xdd, 0x95, 0xb9, 0x5e, 0x13, 0xa5, 0xa5, 0xf4, 0xd5, 0xfe, 0x40, 0x4b, 0x99, 0xb9, 0x6b, 0xde, 0x1b, - 0x67, 0x6a, 0x57, 0x3b, 0x4c, 0xf6, 0xda, 0xdd, 0xd2, 0xe6, 0xb3, 0xd4, 0xd0, 0xd5, 0x8e, 0x0d, 0x23, 0x52, 0xc5, - 0x22, 0x89, 0x0d, 0xb0, 0x1c, 0x13, 0x66, 0xe8, 0xe8, 0x9a, 0x27, 0x49, 0x55, 0xfa, 0x6b, 0xf8, 0x7a, 0x6e, 0xf8, - 0x7a, 0x6a, 0xf9, 0x3a, 0x70, 0x0a, 0xe0, 0xeb, 0x7a, 0xb8, 0xaa, 0x7b, 0xba, 0x71, 0x3a, 0x53, 0xcd, 0xd1, 0x73, - 0x65, 0x47, 0xc3, 0x7c, 0x0b, 0x0b, 0x01, 0x2e, 0x35, 0xaf, 0x8f, 0xbe, 0x71, 0xc2, 0x80, 0x01, 0xa8, 0x5d, 0x98, - 0xcc, 0x75, 0x51, 0x7c, 0xf4, 0x31, 0xc9, 0x0b, 0x56, 0x52, 0xf6, 0xc9, 0x0b, 0x70, 0xd2, 0x39, 0xcb, 0x01, 0x21, - 0xa6, 0x8a, 0x7f, 0x95, 0x12, 0x65, 0x57, 0xc7, 0xcd, 0xea, 0x72, 0xbb, 0x3a, 0xe0, 0xf4, 0xd5, 0xea, 0xe2, 0xbb, - 0x79, 0xbd, 0x5a, 0x1e, 0x2f, 0x97, 0x57, 0xed, 0xf7, 0x6a, 0xe5, 0xaf, 0x95, 0x80, 0xff, 0xde, 0x98, 0x28, 0x59, - 0x39, 0x3a, 0xf0, 0x00, 0x17, 0x33, 0x50, 0x50, 0xe8, 0x45, 0x97, 0x22, 0xee, 0xd5, 0xa7, 0x1c, 0x3c, 0xca, 0x4d, - 0xaf, 0xfb, 0x9f, 0x8a, 0xd9, 0x1c, 0xb4, 0xb1, 0x35, 0x92, 0x9e, 0x30, 0x33, 0x61, 0x55, 0x5f, 0x6c, 0x29, 0xab, - 0xf5, 0x51, 0xe7, 0xb1, 0x46, 0x4d, 0xa5, 0xbd, 0xbc, 0xd7, 0x2a, 0x16, 0x65, 0x51, 0xc9, 0x38, 0xb6, 0x39, 0x55, - 0x4e, 0xd7, 0x5d, 0x32, 0xb6, 0xe2, 0xad, 0xcf, 0x35, 0x1f, 0xe6, 0xc0, 0xeb, 0x1c, 0xf6, 0x63, 0xc9, 0xdd, 0xdd, - 0xff, 0xa2, 0x42, 0xce, 0xb2, 0x58, 0x43, 0xdf, 0xb2, 0x28, 0x4e, 0xb4, 0x91, 0x4d, 0x4e, 0x76, 0x5b, 0xc3, 0x55, - 0x9d, 0x31, 0x16, 0x07, 0x43, 0x72, 0xb2, 0xa9, 0x3a, 0xd2, 0xe5, 0x4c, 0xc4, 0x2c, 0x44, 0x62, 0xce, 0x52, 0x54, - 0x80, 0x57, 0xd5, 0xec, 0xfd, 0x48, 0xfa, 0xcb, 0x77, 0x75, 0xf7, 0x6a, 0x78, 0x52, 0x80, 0xf7, 0xeb, 0x8b, 0x4d, - 0xc7, 0xeb, 0xb7, 0x2c, 0xcb, 0x95, 0x22, 0x5a, 0xea, 0xb4, 0x5f, 0x54, 0x62, 0xe9, 0x8b, 0x70, 0x67, 0xfb, 0xca, - 0x04, 0x41, 0xed, 0xe0, 0x71, 0x70, 0x84, 0xb0, 0x72, 0x0b, 0x7f, 0x65, 0x0e, 0xfc, 0x73, 0xeb, 0x16, 0x7e, 0x41, - 0x9f, 0xd7, 0xbd, 0xc2, 0xb1, 0xa4, 0x2f, 0xfa, 0x2f, 0xac, 0xc5, 0x2c, 0x12, 0x3e, 0xba, 0xf5, 0x51, 0xc2, 0x65, - 0x13, 0x42, 0x6f, 0x88, 0x2c, 0x75, 0x05, 0xb8, 0x14, 0x95, 0x3b, 0xbb, 0xb0, 0xb6, 0x1e, 0x91, 0x92, 0xa2, 0xfd, - 0x84, 0xcb, 0x7d, 0x44, 0x66, 0xf4, 0x02, 0x7e, 0xec, 0x2f, 0xfd, 0xd7, 0x91, 0x9c, 0x06, 0x59, 0x94, 0xc6, 0x62, - 0xe6, 0xe3, 0x06, 0x42, 0x38, 0xc8, 0x95, 0xbd, 0xf1, 0x39, 0x2e, 0xf6, 0x2f, 0xc8, 0x8d, 0xa4, 0xa8, 0x8f, 0x1a, - 0x33, 0xf2, 0x52, 0xd2, 0x8b, 0xe3, 0xfd, 0xe5, 0x8d, 0x2c, 0x7a, 0x17, 0xe4, 0xa6, 0xf4, 0xd8, 0x93, 0xaf, 0xa9, - 0x8f, 0x69, 0xef, 0xc6, 0x40, 0x73, 0x2a, 0x66, 0xda, 0x73, 0x8f, 0x30, 0xf9, 0x00, 0x71, 0x95, 0xac, 0xe2, 0x36, - 0x26, 0xb4, 0xb2, 0x47, 0x91, 0x50, 0x2e, 0x02, 0x74, 0x70, 0xe0, 0x94, 0x95, 0xaa, 0x02, 0x39, 0x91, 0xb4, 0x66, - 0x90, 0x93, 0x37, 0x2a, 0x42, 0x73, 0x22, 0xfd, 0x0c, 0xdb, 0x61, 0x7c, 0xeb, 0x87, 0x36, 0x47, 0x33, 0x1b, 0x68, - 0x0f, 0x43, 0xc0, 0x25, 0xcb, 0x22, 0x29, 0xb2, 0x21, 0x76, 0xd5, 0x0f, 0xf2, 0x37, 0x7a, 0x31, 0xf0, 0xfe, 0xd3, - 0x3f, 0xfd, 0x38, 0xfe, 0x31, 0x1b, 0x5e, 0x90, 0xb7, 0xf4, 0xf0, 0xd8, 0xef, 0x87, 0xfe, 0x5e, 0xb3, 0xb9, 0xfa, - 0xf1, 0x70, 0xf0, 0x8f, 0xa8, 0xf9, 0xcb, 0x49, 0xf3, 0x87, 0x21, 0x5e, 0xf9, 0x3f, 0x1e, 0xf6, 0x07, 0xe6, 0x69, - 0xf0, 0x8f, 0xde, 0x8f, 0xf9, 0xf0, 0xcf, 0xba, 0x70, 0x1f, 0xe3, 0xc3, 0x09, 0x59, 0x48, 0x7a, 0xd8, 0x6c, 0xf6, - 0x0e, 0x27, 0x64, 0x2e, 0xe9, 0x21, 0xfc, 0x7f, 0x49, 0xdf, 0xb1, 0xc9, 0x8b, 0x9b, 0xb9, 0x7f, 0xd1, 0x5b, 0xed, - 0x2f, 0xff, 0x56, 0xc0, 0xa8, 0x83, 0x7f, 0xfc, 0xf8, 0x63, 0x8e, 0x1e, 0xf4, 0xe8, 0xe1, 0xb0, 0x81, 0x7d, 0x28, - 0xfd, 0x33, 0x55, 0xff, 0xfa, 0xfd, 0x70, 0xf0, 0x0f, 0x03, 0x05, 0x7a, 0xf0, 0xe3, 0xc5, 0x71, 0x8f, 0x0e, 0x57, - 0x3e, 0x5a, 0x3d, 0xc0, 0x2b, 0x8c, 0x57, 0xfb, 0xf8, 0x82, 0xa0, 0x09, 0xc2, 0x64, 0x22, 0xe9, 0xe1, 0x83, 0xc3, - 0x09, 0xb9, 0x92, 0xf4, 0x10, 0x1d, 0x4e, 0xc8, 0x0b, 0x49, 0x0f, 0xff, 0xe1, 0xf7, 0x43, 0xed, 0x61, 0x5b, 0x29, - 0xf7, 0xc6, 0x0a, 0x82, 0x1b, 0x51, 0xc6, 0xa2, 0x95, 0xe4, 0x32, 0x61, 0x78, 0xff, 0x90, 0x93, 0x33, 0x85, 0x26, - 0x5f, 0x82, 0x13, 0x06, 0x6c, 0x3b, 0x7f, 0x79, 0x0e, 0x9b, 0x0d, 0x34, 0xb3, 0x1f, 0x66, 0x44, 0xfb, 0x01, 0xf2, - 0x50, 0x92, 0xab, 0x28, 0x59, 0xb0, 0x3c, 0x64, 0x05, 0x26, 0x23, 0x7a, 0x26, 0xfd, 0x36, 0x26, 0xef, 0x24, 0xfc, - 0xe8, 0x60, 0x72, 0x66, 0x02, 0x98, 0x70, 0x90, 0x35, 0x51, 0xa5, 0x42, 0x6b, 0x2c, 0x08, 0x93, 0xf9, 0x96, 0x4a, - 0x39, 0x05, 0xef, 0x02, 0x26, 0xe3, 0x5a, 0xb8, 0x93, 0x5c, 0x53, 0x4b, 0x12, 0xef, 0x33, 0xc6, 0xbe, 0x8b, 0x92, - 0x8f, 0x2c, 0xf3, 0x6f, 0x48, 0xbb, 0xf3, 0x39, 0x51, 0x2e, 0xe8, 0xbd, 0x36, 0xee, 0x96, 0xb1, 0xaa, 0x53, 0xa9, - 0x63, 0x04, 0x20, 0x64, 0xeb, 0xbe, 0x18, 0xd8, 0xf1, 0xbd, 0x6c, 0xc3, 0x61, 0x95, 0x45, 0xd7, 0x08, 0xd7, 0xe3, - 0xa2, 0x3c, 0xbd, 0x8a, 0x12, 0x1e, 0x7b, 0x92, 0xcd, 0xe6, 0x49, 0x24, 0x99, 0x67, 0xd6, 0xeb, 0x45, 0x30, 0x10, - 0x2a, 0x55, 0x86, 0xd8, 0x31, 0x38, 0x63, 0x1b, 0x70, 0x82, 0xb3, 0xe2, 0x43, 0x74, 0xca, 0xa8, 0x1d, 0xaf, 0xab, - 0xe0, 0xd7, 0x7a, 0x7c, 0xaf, 0xd9, 0x06, 0x47, 0xd8, 0x50, 0x89, 0xe7, 0x9c, 0xa4, 0x14, 0x84, 0x68, 0xa7, 0x8f, - 0x8e, 0xf3, 0xab, 0x49, 0x0f, 0x41, 0x6c, 0x46, 0xd0, 0xb7, 0xca, 0x2f, 0x04, 0x0d, 0xa6, 0xb4, 0xd5, 0x9d, 0x1e, - 0xb3, 0xee, 0xb4, 0xd1, 0xb0, 0x3a, 0x74, 0x42, 0xb3, 0xc1, 0x54, 0x77, 0x8f, 0x48, 0x4c, 0x16, 0xb4, 0xd9, 0x26, - 0x13, 0xda, 0x52, 0x5d, 0xba, 0x93, 0xe3, 0xc4, 0x4c, 0x73, 0x70, 0xe0, 0x8b, 0x20, 0x89, 0x72, 0xf9, 0x25, 0x18, - 0xfb, 0x74, 0x42, 0x62, 0x2a, 0x02, 0x76, 0xc3, 0x46, 0x7e, 0x82, 0x49, 0x6c, 0x38, 0x0d, 0xee, 0xe2, 0x09, 0x75, - 0x9a, 0x81, 0x11, 0x41, 0xdf, 0xf6, 0xe3, 0x41, 0x7b, 0x48, 0x29, 0x45, 0x7b, 0xcd, 0x26, 0xea, 0x0b, 0xba, 0x90, - 0x21, 0x94, 0x38, 0xaa, 0x32, 0x9d, 0x43, 0x51, 0xc7, 0x29, 0xf2, 0x5f, 0xc8, 0x40, 0xb2, 0x5c, 0xfa, 0x50, 0x0c, - 0xe6, 0x7f, 0x6e, 0x09, 0x1b, 0x1d, 0x1f, 0xa2, 0x06, 0x94, 0x2a, 0xe2, 0xc4, 0x44, 0xd0, 0x4b, 0x1c, 0xc6, 0x83, - 0xa3, 0xa1, 0xcb, 0xff, 0x55, 0x21, 0x4c, 0x7e, 0xd9, 0x8f, 0x07, 0x2d, 0x35, 0x79, 0x0f, 0xf5, 0x7d, 0x41, 0x73, - 0xad, 0xa0, 0xf5, 0xf3, 0xf0, 0xad, 0x5a, 0x2a, 0x0e, 0x0d, 0x70, 0x66, 0xde, 0x05, 0x6d, 0x76, 0x42, 0x7f, 0xe1, - 0x2e, 0xa2, 0x09, 0x93, 0x19, 0x2c, 0x90, 0x88, 0x42, 0x7b, 0x22, 0x28, 0xcc, 0x58, 0x75, 0xbb, 0x0c, 0xcd, 0xf3, - 0x03, 0xf4, 0xa0, 0x7f, 0x25, 0xc3, 0x89, 0xd4, 0xd3, 0x5f, 0xc9, 0xd5, 0x0a, 0xfe, 0x9f, 0xc8, 0xbe, 0xa0, 0x97, - 0xaa, 0x68, 0x61, 0x8a, 0xe6, 0x50, 0xf4, 0x36, 0x04, 0x50, 0x49, 0x5e, 0x2a, 0x59, 0x7a, 0x4f, 0xae, 0xa8, 0x82, - 0xfd, 0xe0, 0x20, 0x1b, 0x4c, 0x1b, 0xed, 0x21, 0xf8, 0xf7, 0x33, 0x99, 0x7f, 0xc7, 0xe5, 0xd4, 0x47, 0x87, 0x3d, - 0x84, 0xfb, 0xc8, 0x83, 0xad, 0xed, 0xa6, 0x0d, 0xaa, 0x31, 0x9c, 0x34, 0x5e, 0xca, 0x70, 0xd1, 0xa3, 0xad, 0xbe, - 0xcf, 0x8d, 0x3f, 0x0f, 0x93, 0xc4, 0x30, 0xce, 0x16, 0x59, 0xe0, 0x86, 0x94, 0x0d, 0xfb, 0xbc, 0xc0, 0x8d, 0x59, - 0xe3, 0x0a, 0x87, 0x49, 0x63, 0xd6, 0xf0, 0x17, 0x94, 0xd2, 0x66, 0xa7, 0xec, 0x66, 0xa5, 0xdf, 0x14, 0x87, 0x57, - 0xd6, 0xd9, 0x39, 0x50, 0xc7, 0x21, 0x6d, 0xf8, 0xd9, 0x80, 0x0d, 0x57, 0x2b, 0x74, 0xdc, 0xef, 0x21, 0xdc, 0xf0, - 0x2d, 0xa1, 0x1d, 0x5a, 0x4a, 0xc3, 0x98, 0xf0, 0x61, 0x61, 0x42, 0x49, 0xef, 0x6b, 0x61, 0xa3, 0x65, 0x75, 0xd8, - 0x1d, 0x1e, 0xc0, 0x8a, 0xd2, 0x8e, 0xd1, 0xfa, 0xea, 0x1c, 0x96, 0x69, 0x89, 0x39, 0xa5, 0x2d, 0x22, 0xa8, 0xf5, - 0x5d, 0x4f, 0xa9, 0xac, 0x08, 0x3e, 0xa1, 0x55, 0x73, 0x32, 0x88, 0x48, 0x3c, 0xa4, 0xaf, 0xb5, 0x3d, 0xd2, 0xb5, - 0x7e, 0x71, 0x96, 0xd0, 0xf7, 0x6b, 0xd1, 0xdb, 0x08, 0x62, 0x2b, 0xd7, 0xc1, 0x68, 0x91, 0x65, 0x2c, 0x95, 0x6f, - 0x44, 0x6c, 0xd4, 0x34, 0x96, 0x80, 0xa5, 0x04, 0x61, 0x59, 0x02, 0x3a, 0x5a, 0xc7, 0x9e, 0x8c, 0xc5, 0x46, 0xf5, - 0x84, 0x2e, 0xb4, 0xfa, 0xa4, 0x82, 0xb5, 0xdd, 0x89, 0xb1, 0x8b, 0x7d, 0x4c, 0x16, 0x26, 0x8a, 0xeb, 0x07, 0x41, - 0x30, 0x09, 0x46, 0x50, 0x0d, 0x13, 0xe4, 0xb8, 0x50, 0xe7, 0xc8, 0xcf, 0xe9, 0x75, 0x90, 0xb2, 0x1b, 0x35, 0xab, - 0x8f, 0x2b, 0xc9, 0x6c, 0x8f, 0xd7, 0xf1, 0xb4, 0xab, 0xd8, 0x4d, 0x1e, 0xa4, 0x22, 0x66, 0x80, 0x1e, 0x88, 0xdb, - 0x9b, 0xa2, 0x69, 0x94, 0xbb, 0xf1, 0xa9, 0x0a, 0xbe, 0x81, 0xeb, 0xbc, 0x9e, 0x80, 0xc7, 0x57, 0xe9, 0x5a, 0x65, - 0x63, 0xed, 0x06, 0xc7, 0x98, 0x8f, 0xfd, 0x49, 0x00, 0x71, 0x3d, 0x45, 0x42, 0x12, 0x4c, 0xb9, 0x89, 0x4b, 0x54, - 0xb3, 0x72, 0xcc, 0x2b, 0x1a, 0x0f, 0x44, 0xa3, 0xa1, 0xbc, 0xd0, 0x0b, 0x4d, 0x12, 0x13, 0x4c, 0xae, 0xca, 0xb3, - 0x65, 0xdb, 0xbd, 0x95, 0xb4, 0x3e, 0x95, 0x7f, 0x55, 0x77, 0xe7, 0x36, 0xa4, 0xc4, 0xca, 0x53, 0x28, 0xfd, 0x19, - 0x26, 0xcf, 0xe8, 0xa1, 0x3f, 0x08, 0xfa, 0x7f, 0x19, 0xe2, 0xbe, 0x1f, 0xfc, 0x19, 0x1f, 0x6a, 0xce, 0x71, 0x85, - 0xbb, 0x89, 0x9e, 0x63, 0xa9, 0xe2, 0x97, 0x6d, 0xa2, 0x3c, 0x89, 0x61, 0x4a, 0xd2, 0x68, 0xc6, 0xc2, 0x67, 0x70, - 0xc8, 0x2d, 0xe1, 0xbc, 0x95, 0x04, 0x28, 0x29, 0x7c, 0x66, 0x78, 0x49, 0x80, 0xfa, 0xaf, 0x64, 0xf9, 0xd4, 0x47, - 0xfd, 0xe7, 0xd5, 0xd3, 0x5f, 0x50, 0xff, 0x17, 0x19, 0xfe, 0x5c, 0x18, 0x6f, 0x77, 0x6d, 0x8e, 0xc7, 0x76, 0x8e, - 0x42, 0x6f, 0x8d, 0x83, 0xbb, 0x05, 0xde, 0x74, 0x74, 0x4c, 0x70, 0xc1, 0xc7, 0x25, 0x33, 0xca, 0x03, 0x19, 0x4d, - 0x00, 0xa9, 0xce, 0x1e, 0xe4, 0x6e, 0x5c, 0xbf, 0x5a, 0x31, 0x90, 0x8a, 0xa5, 0x57, 0x40, 0xe6, 0xa4, 0xd7, 0xc2, - 0xcb, 0x5a, 0x5b, 0xa5, 0x33, 0xd5, 0xe3, 0xe8, 0x25, 0x9f, 0xbe, 0xa2, 0xad, 0xee, 0xd5, 0xf1, 0xa4, 0x7b, 0xd5, - 0x68, 0xe0, 0xdc, 0x92, 0xd6, 0x62, 0x70, 0x35, 0x24, 0x5f, 0x83, 0x53, 0xcf, 0xa5, 0x25, 0x52, 0x5b, 0x5e, 0xc7, - 0x2c, 0xaf, 0xd1, 0x48, 0x0b, 0xdc, 0x75, 0xba, 0x4e, 0x74, 0xd7, 0xa2, 0xd0, 0x38, 0x59, 0x27, 0xb5, 0xa7, 0x58, - 0x95, 0x40, 0x32, 0x14, 0xa5, 0xf4, 0x46, 0xe2, 0xad, 0xa3, 0xc2, 0x98, 0xd0, 0x5d, 0x9d, 0x59, 0x60, 0x9f, 0x5a, - 0x4a, 0xf8, 0x80, 0x05, 0xe8, 0x5a, 0x7a, 0x82, 0x67, 0x64, 0xd1, 0x68, 0x2b, 0x32, 0x6f, 0xb6, 0xbb, 0xf5, 0xb1, - 0x9e, 0x54, 0x63, 0x91, 0x45, 0x83, 0xce, 0x4a, 0x2c, 0x15, 0x69, 0xa3, 0x51, 0xd4, 0x83, 0x9d, 0xf6, 0xe4, 0xd6, - 0x02, 0x10, 0x37, 0xeb, 0x49, 0x19, 0x56, 0xc2, 0x56, 0x32, 0x95, 0x07, 0x3c, 0x4d, 0x59, 0x06, 0x52, 0x94, 0x4a, - 0xc2, 0x8b, 0xa2, 0x92, 0xec, 0x20, 0x46, 0x09, 0xa3, 0x19, 0x70, 0x1e, 0x65, 0x77, 0x91, 0x94, 0x08, 0x32, 0x55, - 0x7c, 0x83, 0x52, 0x7a, 0x66, 0xd3, 0x59, 0xa4, 0xe2, 0x41, 0x09, 0xe5, 0x8e, 0x4c, 0xca, 0x29, 0x0b, 0xce, 0xf7, - 0x4f, 0xc5, 0x9d, 0x36, 0xd9, 0x80, 0x0f, 0x43, 0xd5, 0x2c, 0x31, 0x9c, 0x2b, 0xa2, 0x1f, 0x7c, 0x89, 0xcb, 0xe8, - 0x48, 0xa0, 0x18, 0xe0, 0x73, 0x9e, 0x31, 0xa5, 0x83, 0xef, 0x5b, 0xbb, 0x2f, 0xa9, 0x2b, 0x90, 0x89, 0xeb, 0xbd, - 0x01, 0x44, 0x46, 0xe0, 0xdc, 0x49, 0xe9, 0x46, 0xb3, 0xf3, 0xfd, 0x93, 0xb7, 0xdb, 0x6c, 0xe0, 0xd5, 0xca, 0x58, - 0xbf, 0x4a, 0xb7, 0x21, 0x51, 0x05, 0x69, 0x62, 0x7e, 0x84, 0x7e, 0xa2, 0x54, 0xa4, 0xc8, 0xcf, 0x80, 0x8a, 0xce, - 0xf7, 0x4f, 0xde, 0xfb, 0x99, 0xf2, 0x2d, 0x61, 0xe2, 0x2e, 0xdb, 0x17, 0xd4, 0x9f, 0x52, 0x86, 0xf5, 0xda, 0x4b, - 0xd6, 0x25, 0x1c, 0x01, 0x1e, 0x4e, 0x55, 0x25, 0x58, 0x10, 0x03, 0x3e, 0xa4, 0x89, 0xc1, 0x00, 0x4d, 0x30, 0x49, - 0x6a, 0x76, 0x19, 0x85, 0x0d, 0x50, 0x73, 0x9d, 0xc1, 0x4e, 0x04, 0x5a, 0xf5, 0xc3, 0x24, 0x51, 0xb3, 0xca, 0x42, - 0x0b, 0x8f, 0x67, 0x1b, 0x59, 0x69, 0x95, 0x39, 0xfa, 0x2d, 0xd8, 0x4e, 0xf6, 0xe1, 0x0d, 0xb5, 0x96, 0x84, 0x29, - 0x78, 0x6e, 0xd3, 0xc7, 0xce, 0xf7, 0x4f, 0x5e, 0x9b, 0x0c, 0xb2, 0x79, 0x64, 0xf9, 0xfd, 0x86, 0x89, 0x79, 0xf2, - 0x3a, 0xa8, 0x6a, 0x55, 0xe3, 0xf3, 0xfd, 0x93, 0x0f, 0xdb, 0x9a, 0x41, 0x79, 0xb1, 0xa8, 0x6c, 0x7c, 0x05, 0xdf, - 0x92, 0x25, 0xe1, 0xd2, 0x08, 0x87, 0x90, 0x17, 0x44, 0x09, 0xa4, 0x30, 0x2f, 0x4a, 0xd7, 0xc8, 0x73, 0x92, 0x52, - 0x15, 0x06, 0xaa, 0xef, 0x9a, 0x51, 0xf3, 0xb8, 0x48, 0xcf, 0x46, 0x62, 0xce, 0x76, 0xc4, 0x86, 0x6e, 0x70, 0xc0, - 0x67, 0x90, 0x3a, 0xa3, 0x40, 0xe7, 0x64, 0xaf, 0x85, 0xbb, 0x75, 0xf1, 0x95, 0x2a, 0x22, 0x15, 0x35, 0xd9, 0x42, - 0xa6, 0xb4, 0x45, 0x12, 0xda, 0x22, 0x11, 0xcd, 0x07, 0x2d, 0x2d, 0x20, 0xba, 0x51, 0x39, 0xae, 0x16, 0x33, 0x90, - 0x15, 0x66, 0x4e, 0xab, 0x16, 0xc0, 0x71, 0x37, 0x52, 0xbe, 0x47, 0x25, 0xd3, 0x63, 0x45, 0x16, 0x6f, 0x7c, 0x41, - 0x84, 0x1a, 0xf8, 0x8c, 0x5f, 0x26, 0x90, 0x58, 0x02, 0xab, 0x22, 0x12, 0x87, 0x65, 0xd3, 0xb6, 0x69, 0x1a, 0x05, - 0x6a, 0x9f, 0x04, 0x89, 0x02, 0xe0, 0xdc, 0x24, 0x32, 0x79, 0x38, 0xf9, 0x66, 0x97, 0xc7, 0x07, 0x07, 0xbe, 0xee, - 0xf4, 0xa5, 0xf4, 0x85, 0xad, 0xaf, 0x22, 0x77, 0xdf, 0x6a, 0x5e, 0x11, 0x63, 0x05, 0x7f, 0xa3, 0x91, 0x0c, 0x0b, - 0x08, 0x43, 0xfb, 0x51, 0x1d, 0x83, 0x16, 0x78, 0xa5, 0xeb, 0xd5, 0x97, 0xdf, 0x68, 0x94, 0x51, 0xda, 0x3a, 0xb6, - 0x6e, 0x48, 0x5a, 0x5c, 0xf9, 0x65, 0xea, 0x4f, 0x6b, 0x23, 0x5f, 0xca, 0x82, 0x80, 0xb9, 0x4b, 0xb3, 0xdc, 0x2e, - 0xc6, 0x39, 0x12, 0x1c, 0xda, 0x7d, 0x69, 0xb2, 0x16, 0x88, 0xca, 0xae, 0x32, 0x8d, 0x2c, 0x3b, 0xeb, 0xe0, 0xd0, - 0x36, 0x82, 0xa8, 0x14, 0x34, 0x6a, 0x14, 0x86, 0xbc, 0xdf, 0x6c, 0xe6, 0x5c, 0x92, 0x1c, 0x1b, 0x27, 0x97, 0x82, - 0x42, 0x21, 0xab, 0x53, 0x22, 0xe5, 0x25, 0x9d, 0xef, 0x26, 0xf9, 0x13, 0x87, 0xe4, 0x9f, 0x51, 0xe6, 0x90, 0xbf, - 0x76, 0x71, 0x04, 0xc2, 0x38, 0x17, 0x72, 0x5b, 0x75, 0x3a, 0xa7, 0xe0, 0x44, 0xab, 0x63, 0xb4, 0x16, 0x56, 0xdc, - 0xc1, 0x50, 0xdc, 0x13, 0xa2, 0xdc, 0x90, 0xc4, 0xc6, 0x80, 0xfd, 0x2a, 0xa8, 0x06, 0x53, 0x6f, 0xf3, 0xe9, 0xb9, - 0x1c, 0xf0, 0xe4, 0xc3, 0xdd, 0xf1, 0xd0, 0xd3, 0xf9, 0xe6, 0xc9, 0x75, 0x72, 0x3f, 0x61, 0xd5, 0xce, 0xc1, 0xad, - 0x67, 0x82, 0xc2, 0xfc, 0x65, 0x1c, 0xbb, 0xce, 0x7c, 0xd6, 0x0e, 0xa1, 0x95, 0x7f, 0x00, 0x6d, 0xbb, 0xad, 0x5a, - 0x30, 0x67, 0x58, 0xe0, 0x47, 0x3a, 0x03, 0x35, 0xca, 0x76, 0xb0, 0x8f, 0x13, 0xd5, 0x80, 0xa5, 0xf1, 0xf6, 0xea, - 0x67, 0x85, 0x21, 0x13, 0x0d, 0x1a, 0x5e, 0x02, 0xff, 0xd3, 0x24, 0x0f, 0x74, 0xa3, 0xe4, 0x02, 0x20, 0x68, 0xae, - 0xf0, 0x54, 0x21, 0x0c, 0xa1, 0xca, 0xfb, 0xfe, 0x72, 0x8f, 0xd2, 0x79, 0xe5, 0x7d, 0x7c, 0x57, 0xa5, 0x5e, 0x01, - 0x59, 0xe0, 0x10, 0xcc, 0xc7, 0xb2, 0x40, 0x87, 0x2f, 0xcf, 0x6c, 0x73, 0x65, 0x42, 0x06, 0x95, 0xc6, 0xed, 0x84, - 0x36, 0x95, 0x5b, 0x4e, 0xd7, 0x5b, 0x34, 0xac, 0xd5, 0xee, 0x43, 0xed, 0x1b, 0xa9, 0x60, 0x84, 0xe7, 0xf7, 0xaa, - 0xb5, 0x1d, 0xb7, 0xf8, 0xb8, 0x9e, 0xbf, 0xb2, 0xb6, 0x29, 0x01, 0x4f, 0x73, 0x96, 0xc9, 0x67, 0x6c, 0x2c, 0x32, - 0x88, 0x59, 0x94, 0x38, 0xc1, 0xc5, 0xbe, 0xe3, 0xb7, 0x53, 0xeb, 0x73, 0x02, 0x05, 0x6b, 0x0b, 0x54, 0xbf, 0x3e, - 0xaa, 0xa0, 0xf5, 0xf9, 0x7a, 0xaf, 0xf9, 0xc1, 0xc1, 0x87, 0x0a, 0x4d, 0x06, 0x4a, 0x05, 0x85, 0xc3, 0xb4, 0xb4, - 0x4a, 0x63, 0x22, 0xb9, 0xfb, 0x7e, 0xe9, 0x04, 0xb0, 0x0c, 0xc3, 0xe5, 0x3d, 0x2f, 0xa9, 0x2c, 0x26, 0xeb, 0x2c, - 0xde, 0x38, 0x27, 0xb8, 0x6b, 0xb8, 0x00, 0x87, 0x07, 0x53, 0x5b, 0x7b, 0x8b, 0xf2, 0x2a, 0x19, 0xb6, 0x84, 0xe1, - 0x14, 0x90, 0xe5, 0x2b, 0x33, 0xc4, 0xa1, 0xc0, 0xad, 0x66, 0xc9, 0x29, 0xe8, 0x95, 0x53, 0x92, 0x07, 0x53, 0x48, - 0x7f, 0xad, 0x1d, 0x59, 0x8c, 0x89, 0x4e, 0xcc, 0x71, 0x52, 0x09, 0x4e, 0x5e, 0x6e, 0x73, 0x29, 0x5b, 0xa2, 0x66, - 0x4a, 0xea, 0xa8, 0x16, 0xb8, 0xec, 0x10, 0x5c, 0xf9, 0xdc, 0x28, 0x6e, 0x36, 0x6e, 0x06, 0x0c, 0xf8, 0x99, 0xf4, - 0x75, 0x30, 0x0a, 0x64, 0x86, 0x08, 0x16, 0x7e, 0x6d, 0xea, 0xae, 0x50, 0xdd, 0x88, 0x41, 0xdc, 0xd4, 0x45, 0x93, - 0x50, 0x71, 0xbd, 0xd3, 0x8a, 0x97, 0x8e, 0x75, 0x06, 0xb5, 0xb4, 0x5c, 0xb0, 0x4a, 0x24, 0x71, 0x96, 0x3f, 0xd6, - 0x49, 0xd1, 0x65, 0x23, 0xc2, 0x14, 0x18, 0xef, 0xd5, 0x1e, 0xb0, 0x02, 0xfe, 0x5f, 0x9e, 0x48, 0x67, 0x47, 0xad, - 0x13, 0x5b, 0xcd, 0xe9, 0x48, 0xfd, 0x77, 0x90, 0xea, 0xb2, 0x7e, 0xe6, 0x5f, 0x2a, 0x59, 0xc8, 0x49, 0x5e, 0x63, - 0xec, 0xa9, 0x62, 0xec, 0x18, 0xf4, 0x34, 0x9b, 0xf8, 0xdd, 0x37, 0x19, 0x2f, 0xdc, 0x48, 0x39, 0x43, 0x62, 0x5f, - 0x97, 0xd1, 0x72, 0xe7, 0xf7, 0xda, 0x6e, 0x84, 0x9c, 0x42, 0x16, 0x10, 0x31, 0x9c, 0x3d, 0xc5, 0x24, 0x6f, 0x34, - 0xba, 0xf9, 0x31, 0xab, 0x9c, 0x24, 0x15, 0x8c, 0x1c, 0x02, 0xba, 0x40, 0xf0, 0x35, 0x19, 0x0a, 0x21, 0x7f, 0x9b, - 0x99, 0x9d, 0x83, 0xaf, 0xfd, 0xe4, 0x9d, 0xef, 0x72, 0x35, 0xb7, 0x6d, 0x19, 0x34, 0x85, 0xf5, 0xf8, 0x55, 0xc0, - 0xe5, 0xeb, 0xbb, 0x13, 0x3c, 0x00, 0xee, 0xbd, 0x36, 0x81, 0x54, 0x34, 0xdc, 0x95, 0x9a, 0x25, 0x94, 0xa7, 0xaf, - 0x8b, 0xab, 0xac, 0x44, 0x77, 0xb2, 0xae, 0xac, 0x8c, 0x59, 0x49, 0xf3, 0xa2, 0xc8, 0x59, 0x15, 0xde, 0x5f, 0x4b, - 0xbf, 0x54, 0xc2, 0x65, 0xd3, 0xdb, 0x7e, 0x3a, 0xa7, 0x92, 0x38, 0x84, 0xfa, 0xf5, 0xae, 0xd8, 0x47, 0x05, 0x26, - 0x9c, 0x6b, 0x23, 0x14, 0x7f, 0xde, 0x26, 0x14, 0x49, 0x6a, 0x8e, 0xbc, 0x12, 0x88, 0xed, 0x7b, 0x08, 0x44, 0xe3, - 0x66, 0xb7, 0x32, 0x11, 0xd4, 0x91, 0x9a, 0x4c, 0xac, 0x6f, 0x29, 0x4d, 0x09, 0x37, 0xbb, 0xd1, 0xeb, 0xac, 0x56, - 0x7c, 0xd0, 0x02, 0x37, 0x12, 0x42, 0xf0, 0xb3, 0xad, 0x7f, 0x3a, 0x9c, 0x58, 0xbb, 0x81, 0x7d, 0x5e, 0x9a, 0x2c, - 0x38, 0x80, 0x04, 0x67, 0x5f, 0x25, 0x65, 0x29, 0x9a, 0x36, 0x14, 0x64, 0x08, 0x9c, 0xf2, 0x32, 0xcc, 0x04, 0x10, - 0x2b, 0x59, 0x61, 0x0c, 0x48, 0x7f, 0x6b, 0xee, 0x9f, 0x35, 0x2f, 0x3f, 0xad, 0x89, 0xd6, 0xe4, 0x8a, 0x56, 0x1f, - 0x6a, 0xf9, 0x06, 0x06, 0x02, 0xa3, 0x1f, 0xee, 0x29, 0x13, 0xb4, 0x12, 0xe5, 0xd8, 0x95, 0x43, 0xa4, 0x05, 0x4e, - 0xb4, 0xbd, 0x0f, 0x3a, 0xc2, 0xbb, 0x45, 0x9a, 0x10, 0xe1, 0xd0, 0xf5, 0x4b, 0x2a, 0x6b, 0xac, 0x64, 0x4a, 0x8d, - 0xa5, 0x44, 0x22, 0x45, 0xa6, 0x92, 0xa6, 0x83, 0xd6, 0x10, 0x14, 0xd0, 0x6e, 0x72, 0x9c, 0x56, 0x26, 0x70, 0xd2, - 0x68, 0xe0, 0xc8, 0xce, 0x3a, 0x1d, 0xf0, 0x46, 0x32, 0x24, 0x8c, 0x24, 0xda, 0x30, 0x39, 0x3b, 0x38, 0xf0, 0xa3, - 0x6a, 0xde, 0x41, 0x32, 0xc4, 0x44, 0xac, 0x56, 0xbe, 0x02, 0x2b, 0xc2, 0xab, 0x55, 0xe4, 0x82, 0xa5, 0xaa, 0xa1, - 0xdb, 0xbc, 0x2f, 0xe9, 0x5c, 0x09, 0xc0, 0x39, 0x40, 0xd8, 0xa0, 0x7e, 0x64, 0xdc, 0x7b, 0x11, 0xb8, 0xa3, 0x1a, - 0xe9, 0x20, 0x69, 0xb4, 0x87, 0x0e, 0xe3, 0x1a, 0x24, 0x43, 0x1a, 0x15, 0xe2, 0xe0, 0x60, 0x2f, 0x37, 0x22, 0xf2, - 0x27, 0x10, 0x65, 0x3f, 0x29, 0xc9, 0xa2, 0x07, 0x74, 0x77, 0x63, 0xdd, 0x19, 0x50, 0x52, 0x94, 0xd9, 0x56, 0xdb, - 0xae, 0x96, 0x05, 0x51, 0x36, 0x22, 0x26, 0x18, 0xdc, 0x07, 0xcb, 0xbe, 0x24, 0xf3, 0x57, 0xb2, 0xcc, 0xb1, 0xfe, - 0x79, 0x6b, 0x66, 0x75, 0x10, 0x04, 0x51, 0x36, 0x51, 0xb1, 0x0c, 0x1b, 0x86, 0x55, 0xc4, 0x7f, 0x64, 0xc0, 0x74, - 0x26, 0x1e, 0x94, 0x73, 0x0d, 0xa9, 0x06, 0xdf, 0xaa, 0x36, 0xf6, 0x2e, 0xc9, 0x4f, 0x5b, 0xbd, 0x0c, 0x1a, 0x92, - 0xe7, 0xbf, 0x15, 0x92, 0x87, 0x06, 0x12, 0x4d, 0x1e, 0x6b, 0x38, 0xdb, 0x81, 0x8b, 0x9f, 0xe4, 0x1a, 0xce, 0x76, - 0xe3, 0xd6, 0x62, 0xea, 0x97, 0x5d, 0xf0, 0x39, 0xbc, 0x41, 0x03, 0x5a, 0x15, 0x38, 0x50, 0x3e, 0x5a, 0xd7, 0xbd, - 0x34, 0x2b, 0x05, 0x61, 0x2a, 0xa9, 0xcf, 0xeb, 0x07, 0xa0, 0xd2, 0x46, 0x1d, 0xc3, 0x97, 0x87, 0x73, 0xec, 0xb8, - 0x04, 0xea, 0xa9, 0x2b, 0x40, 0x4e, 0xc6, 0xdb, 0x3e, 0x3f, 0x38, 0x00, 0xdb, 0x00, 0x94, 0xb8, 0x60, 0x14, 0xcd, - 0xe5, 0x22, 0x03, 0x55, 0x2a, 0xb7, 0xbf, 0xa1, 0x18, 0x6e, 0x81, 0xa8, 0x32, 0xf8, 0x01, 0x05, 0xf3, 0x28, 0xcf, - 0xf9, 0x95, 0x2e, 0x33, 0xbf, 0x89, 0xa0, 0x96, 0x94, 0x73, 0xad, 0x13, 0xa6, 0xb8, 0x9b, 0x1a, 0x3a, 0xad, 0xa3, - 0xed, 0xc5, 0x15, 0x4b, 0xe5, 0x2b, 0x9e, 0x4b, 0x96, 0xc2, 0xf2, 0x2b, 0x8a, 0x83, 0x15, 0xe5, 0x18, 0x0e, 0x6c, - 0xad, 0x57, 0x14, 0xc7, 0x77, 0x76, 0x91, 0x75, 0x1d, 0x68, 0x1a, 0xa5, 0x71, 0xa2, 0x27, 0x71, 0xf3, 0x19, 0x6d, - 0x0e, 0x67, 0xd9, 0xd2, 0xcd, 0xa7, 0xa9, 0x94, 0x0d, 0xc5, 0xdd, 0x7d, 0x4e, 0xad, 0x24, 0xb0, 0xd2, 0xf3, 0x4e, - 0xad, 0x05, 0x22, 0xde, 0x3b, 0x36, 0xc1, 0x5d, 0x09, 0x91, 0x0e, 0x47, 0x0d, 0xea, 0x70, 0x5a, 0xba, 0xf9, 0x72, - 0xeb, 0x95, 0xb6, 0x6d, 0xc2, 0x41, 0xd1, 0xc9, 0xe3, 0xdd, 0x96, 0xd5, 0x6b, 0x2b, 0x39, 0xac, 0xb4, 0xe0, 0xf7, - 0x65, 0xcc, 0x78, 0x69, 0xc9, 0x0b, 0xdb, 0xa3, 0xb8, 0x2f, 0xe9, 0x73, 0xb8, 0x33, 0xf4, 0x52, 0xce, 0x92, 0xb5, - 0xab, 0x31, 0xdd, 0xfd, 0x52, 0xfb, 0xdf, 0x97, 0xfe, 0x7b, 0xf2, 0x06, 0x02, 0xbb, 0x5f, 0x55, 0xcd, 0x37, 0x03, - 0xba, 0x5f, 0x55, 0x08, 0xfa, 0x2a, 0xdc, 0x68, 0xe7, 0x04, 0x72, 0x3b, 0xc1, 0xd3, 0xa0, 0x85, 0xac, 0xb6, 0xf4, - 0xb3, 0x0e, 0x23, 0xe9, 0x4c, 0x4b, 0x75, 0x1e, 0x48, 0x95, 0xa7, 0x06, 0xf9, 0x72, 0x75, 0x0b, 0x89, 0x99, 0x0c, - 0x43, 0xad, 0xc3, 0xef, 0xda, 0x1e, 0x23, 0x63, 0x52, 0x6d, 0x67, 0x7c, 0x1d, 0x65, 0x72, 0x1f, 0x4e, 0x99, 0xd8, - 0xb8, 0x87, 0x37, 0xa5, 0xe0, 0x41, 0xbb, 0xdf, 0x14, 0x8e, 0xb1, 0x9d, 0xeb, 0x7b, 0x40, 0xee, 0xf8, 0x54, 0x58, - 0xdd, 0xad, 0x6e, 0x65, 0x7c, 0x0d, 0xf6, 0x3f, 0x26, 0x53, 0x7b, 0x39, 0x8e, 0x19, 0x0e, 0xcc, 0xc2, 0x65, 0x51, - 0x3a, 0x05, 0x84, 0x56, 0xde, 0x32, 0x4c, 0x44, 0xa1, 0x02, 0xdc, 0x3f, 0x90, 0x6f, 0x0c, 0x4b, 0x1c, 0x97, 0x1c, - 0xe7, 0xe4, 0xbe, 0x1c, 0x51, 0x83, 0x5f, 0xc6, 0xef, 0x81, 0x8e, 0x15, 0x85, 0x16, 0x96, 0x8a, 0x9e, 0x0b, 0xb3, - 0x90, 0x9d, 0x69, 0xa9, 0x84, 0x95, 0x29, 0x35, 0x6a, 0x9a, 0x2d, 0x79, 0x9c, 0xd6, 0xca, 0x96, 0xe5, 0xa9, 0xaa, - 0xcd, 0x8b, 0x77, 0x60, 0xb1, 0x0a, 0x2d, 0xae, 0x56, 0x7e, 0x1d, 0xd5, 0x94, 0x3b, 0x91, 0x0c, 0x4c, 0xb8, 0x93, - 0x51, 0x51, 0xd3, 0xac, 0x75, 0x1f, 0x1f, 0xaf, 0x27, 0x14, 0x59, 0xdd, 0xbc, 0x06, 0x87, 0xeb, 0x42, 0xd0, 0xdd, - 0x5d, 0x9f, 0x02, 0xd1, 0xab, 0x2b, 0x27, 0x72, 0x30, 0xf4, 0x73, 0x99, 0x2a, 0x5b, 0xe5, 0xb4, 0x6e, 0xc1, 0x2f, - 0xbe, 0x23, 0x59, 0xd6, 0xa0, 0x6e, 0xb3, 0xde, 0x49, 0x36, 0x7a, 0x2e, 0x76, 0x25, 0x1b, 0xd5, 0xb4, 0xdd, 0xbd, - 0x16, 0xbe, 0x3b, 0x2d, 0x55, 0xcf, 0xb5, 0xbd, 0xc9, 0x6f, 0x98, 0xae, 0x0d, 0xb4, 0xa9, 0xd1, 0x6c, 0xb9, 0xca, - 0x59, 0x51, 0x8c, 0xcb, 0xcb, 0x04, 0x2a, 0x77, 0x67, 0xac, 0xe9, 0xdf, 0x58, 0x8d, 0xea, 0x3a, 0xae, 0xff, 0x03, - 0x9d, 0x24, 0xe2, 0x32, 0x4a, 0xde, 0xc3, 0x7c, 0x55, 0xe5, 0xcb, 0xdb, 0x38, 0x8b, 0x24, 0x33, 0xdc, 0xa5, 0x82, - 0xe1, 0x07, 0x07, 0x86, 0x1f, 0x34, 0x9f, 0xae, 0xfa, 0x93, 0xe5, 0xab, 0x72, 0x80, 0x70, 0x5c, 0x58, 0x96, 0x71, - 0x2e, 0xb7, 0xcf, 0xb1, 0xce, 0xc2, 0xce, 0x4b, 0x16, 0x76, 0x2e, 0xfd, 0xf5, 0xa1, 0x7c, 0xff, 0x9b, 0xed, 0xa3, - 0x6c, 0x72, 0xb6, 0x6f, 0xaa, 0x83, 0xff, 0x4d, 0x78, 0x67, 0x1f, 0x87, 0xcb, 0x1d, 0x05, 0x47, 0x2a, 0x5d, 0x45, - 0x83, 0xfc, 0x0e, 0xd2, 0x0e, 0x24, 0xed, 0x39, 0x77, 0x0e, 0x2a, 0x39, 0x65, 0x13, 0x81, 0xfc, 0xd1, 0x22, 0x97, - 0x62, 0x66, 0xc6, 0xcc, 0xcd, 0x35, 0x23, 0x55, 0x09, 0xae, 0x68, 0x15, 0x6d, 0x0f, 0xeb, 0x17, 0xb9, 0x96, 0x1f, - 0x79, 0x1a, 0x87, 0x39, 0x31, 0x52, 0x24, 0x0f, 0xd3, 0x82, 0xda, 0x64, 0xe3, 0xcd, 0x3a, 0x32, 0xe6, 0x29, 0xcf, - 0xa7, 0x2c, 0xf3, 0x05, 0x5e, 0xee, 0x9a, 0x4c, 0x40, 0x40, 0x46, 0x4f, 0x46, 0xbe, 0xad, 0x2e, 0xfc, 0x05, 0x30, - 0x1a, 0xf8, 0x81, 0x66, 0x4c, 0x4e, 0x45, 0x0c, 0x89, 0x29, 0x41, 0x5c, 0xde, 0x68, 0x3a, 0x38, 0xd8, 0xf3, 0x91, - 0x72, 0x4b, 0xc0, 0xd5, 0x6f, 0xb7, 0x06, 0xf7, 0x97, 0x70, 0x3d, 0xa7, 0x9a, 0x9a, 0xe1, 0x25, 0x5b, 0xbf, 0xc9, - 0x22, 0x83, 0x8f, 0xec, 0x96, 0x64, 0xb8, 0x28, 0x42, 0x0d, 0x35, 0x1a, 0x73, 0x96, 0xc4, 0x88, 0x7c, 0x64, 0xb7, - 0x61, 0x79, 0x5b, 0x5c, 0x5d, 0x6e, 0x56, 0x1b, 0x88, 0xc4, 0x75, 0x8a, 0x48, 0x35, 0x49, 0xb8, 0x2c, 0x88, 0xc8, - 0xf8, 0x04, 0x88, 0xf3, 0x6f, 0xec, 0x36, 0xd4, 0xe3, 0x71, 0xe7, 0xb2, 0x1e, 0x5e, 0x5a, 0xd4, 0x07, 0x4e, 0xb1, - 0xbb, 0x0d, 0xc6, 0xa0, 0x18, 0xa8, 0xbe, 0x43, 0x5a, 0x6b, 0x57, 0x99, 0x87, 0x18, 0x17, 0xf7, 0x5d, 0x0a, 0xf9, - 0xc2, 0x15, 0x6d, 0xb2, 0x96, 0xfa, 0xba, 0xd6, 0x89, 0x41, 0x87, 0x2a, 0xd7, 0xe3, 0xdc, 0xcf, 0xec, 0xa9, 0x33, - 0x77, 0x10, 0x1c, 0x47, 0xd8, 0x17, 0xd2, 0x0c, 0x1a, 0x7e, 0xab, 0x53, 0x42, 0xaa, 0x48, 0xd2, 0xeb, 0xaa, 0x9f, - 0x77, 0xee, 0x03, 0xde, 0x21, 0xa5, 0x25, 0x52, 0xd7, 0x31, 0x0b, 0x9b, 0x2e, 0xfa, 0x9d, 0xa4, 0xfe, 0xd2, 0x2e, - 0x21, 0xcc, 0x5c, 0x2c, 0xca, 0x02, 0xa8, 0xd0, 0xd0, 0x97, 0xce, 0x00, 0xe4, 0x63, 0x9f, 0x6f, 0x48, 0xcd, 0x54, - 0x49, 0xcd, 0xc0, 0xc1, 0xf8, 0x0e, 0x29, 0xc9, 0x14, 0x32, 0x94, 0x12, 0xa9, 0x84, 0x9e, 0xd9, 0x5c, 0x43, 0x42, - 0xee, 0x86, 0x96, 0xd7, 0xe7, 0xf4, 0x9e, 0xa7, 0x35, 0xb0, 0x7c, 0x35, 0x0e, 0x2e, 0x42, 0x58, 0x12, 0xd3, 0x0d, - 0x0a, 0xeb, 0xce, 0xc9, 0x6c, 0x7e, 0xab, 0x2f, 0x02, 0xbb, 0x2c, 0x6a, 0x51, 0xe2, 0x4f, 0xf1, 0x32, 0xf3, 0xa7, - 0x24, 0x85, 0x7c, 0x44, 0x51, 0x94, 0xf0, 0x33, 0x77, 0x37, 0x6a, 0xd9, 0xca, 0xdb, 0xaf, 0xf8, 0x81, 0x32, 0x2f, - 0x21, 0x47, 0x93, 0x64, 0x96, 0xa7, 0x64, 0xbe, 0xba, 0x6b, 0xe7, 0x6c, 0xdb, 0x57, 0x26, 0x45, 0xc7, 0x00, 0xf6, - 0x9d, 0xf4, 0x97, 0xce, 0x2a, 0xdc, 0xbb, 0xdc, 0xe6, 0xca, 0x9f, 0x09, 0xf6, 0x55, 0x49, 0xa4, 0x7e, 0x4e, 0xd7, - 0x24, 0xce, 0xdd, 0xb9, 0x96, 0x3f, 0x2f, 0x58, 0x76, 0x7b, 0xc6, 0x20, 0xd7, 0x59, 0xc0, 0x5d, 0xdf, 0x6a, 0x1b, - 0xaa, 0x3c, 0xf5, 0x7e, 0xaa, 0x94, 0x95, 0xa2, 0x7e, 0x09, 0x70, 0xfd, 0x8a, 0x60, 0xa1, 0xa2, 0x8d, 0x8e, 0x23, - 0x46, 0x9f, 0x16, 0xb6, 0xf3, 0xf2, 0x24, 0xeb, 0x72, 0xf0, 0xaf, 0x55, 0x98, 0x36, 0xc1, 0x02, 0x22, 0xdc, 0x0b, - 0xa9, 0x83, 0x7c, 0xb8, 0xee, 0x95, 0x81, 0x22, 0x08, 0xdf, 0xa5, 0xbb, 0x97, 0xba, 0x2d, 0x6b, 0x76, 0xf7, 0x52, - 0x6b, 0x41, 0x3f, 0x95, 0xf2, 0x43, 0xcc, 0x3c, 0xe5, 0xe5, 0x65, 0x5e, 0x14, 0xb8, 0x00, 0xf0, 0xbe, 0xef, 0xfa, - 0xfe, 0xf7, 0x26, 0x69, 0x30, 0x80, 0x58, 0xec, 0x59, 0x22, 0x2c, 0x13, 0xaf, 0xe6, 0xff, 0x7e, 0x63, 0xfe, 0xef, - 0x9d, 0x2b, 0xa7, 0x60, 0x1a, 0x4d, 0x52, 0x16, 0x5b, 0xd6, 0x89, 0x35, 0x01, 0x2a, 0xbd, 0x2d, 0x97, 0xf4, 0xe3, - 0x45, 0x08, 0x1a, 0xd7, 0x72, 0x2c, 0x52, 0xd9, 0x1c, 0x47, 0x33, 0x9e, 0xdc, 0x86, 0x0b, 0xde, 0x9c, 0x89, 0x54, - 0xe4, 0xf3, 0x68, 0xc4, 0x48, 0x7e, 0x9b, 0x4b, 0x36, 0x6b, 0x2e, 0x38, 0x79, 0xc9, 0x92, 0x2b, 0x26, 0xf9, 0x28, - 0x22, 0xe8, 0x24, 0xe3, 0x51, 0xe2, 0xbd, 0x89, 0xb2, 0x4c, 0x5c, 0x23, 0xf2, 0x4e, 0x5c, 0x0a, 0x29, 0xc8, 0xdb, - 0x9b, 0xdb, 0x09, 0x4b, 0xc9, 0x87, 0xcb, 0x45, 0x2a, 0x17, 0x24, 0x8f, 0xd2, 0xbc, 0x99, 0xb3, 0x8c, 0x8f, 0xbb, - 0x23, 0x91, 0x88, 0xac, 0x09, 0x29, 0xdb, 0x33, 0x16, 0x26, 0x7c, 0x32, 0x95, 0x5e, 0x1c, 0x65, 0x1f, 0xbb, 0xcd, - 0xe6, 0x3c, 0xe3, 0xb3, 0x28, 0xbb, 0x6d, 0xaa, 0x16, 0xe1, 0x67, 0xad, 0xa3, 0xe8, 0xf3, 0xf1, 0xc3, 0xae, 0xcc, - 0xa2, 0x34, 0xe7, 0xb0, 0x4d, 0x61, 0x94, 0x24, 0xde, 0xd1, 0xa3, 0xd6, 0x2c, 0xdf, 0xd3, 0x81, 0xbc, 0x28, 0x95, - 0xc5, 0x05, 0xf9, 0x08, 0x70, 0x07, 0x97, 0x32, 0x25, 0x97, 0x0b, 0x29, 0x45, 0xba, 0x1c, 0x2d, 0xb2, 0x5c, 0x64, - 0xe1, 0x5c, 0xf0, 0x54, 0xb2, 0xac, 0x7b, 0x29, 0xb2, 0x98, 0x65, 0xcd, 0x2c, 0x8a, 0xf9, 0x22, 0x0f, 0x1f, 0xce, - 0x6f, 0xba, 0xa0, 0x59, 0x4c, 0x32, 0xb1, 0x48, 0x63, 0x33, 0x17, 0x4f, 0xa7, 0x2c, 0xe3, 0xd2, 0xad, 0x50, 0xaf, - 0x30, 0x09, 0x13, 0x9e, 0xb2, 0x28, 0x6b, 0x4e, 0xa0, 0x33, 0x98, 0x45, 0xad, 0x98, 0x4d, 0x48, 0x36, 0xb9, 0x8c, - 0xfc, 0x76, 0xe7, 0x09, 0xb1, 0x7f, 0x83, 0x47, 0xd8, 0x6b, 0x6d, 0x2f, 0x6e, 0xb7, 0x5a, 0x7f, 0xc2, 0xdd, 0xb5, - 0x59, 0x14, 0x40, 0x61, 0x7b, 0x7e, 0xe3, 0xe5, 0x02, 0x72, 0xda, 0xb6, 0xf5, 0xec, 0xce, 0xa3, 0x18, 0x12, 0x82, - 0xc3, 0xce, 0xfc, 0xa6, 0x80, 0xd5, 0x85, 0x3a, 0xc9, 0xd4, 0x2c, 0xd2, 0x3c, 0x2d, 0x7f, 0x2b, 0xc4, 0x4f, 0xb7, - 0x43, 0xdc, 0xb1, 0x10, 0x57, 0x58, 0x6f, 0xc6, 0x8b, 0x4c, 0xc5, 0x56, 0xc3, 0x76, 0xae, 0x01, 0x99, 0x8a, 0x2b, - 0x96, 0x59, 0x38, 0xd4, 0xc3, 0x6f, 0x06, 0xa3, 0xb3, 0x1d, 0x8c, 0xa7, 0x9f, 0x02, 0x23, 0x4b, 0xe3, 0x65, 0x7d, - 0x5f, 0xdb, 0x19, 0x9b, 0x75, 0xa7, 0x0c, 0xe8, 0x29, 0xec, 0xc0, 0xef, 0x6b, 0x1e, 0xcb, 0xa9, 0xfe, 0xa9, 0xc8, - 0xf9, 0x5a, 0xd7, 0x3d, 0x6a, 0xb5, 0xf4, 0x73, 0xce, 0x7f, 0x61, 0x61, 0x3b, 0x80, 0x06, 0xc5, 0x05, 0xf9, 0x5b, - 0x79, 0x99, 0xb7, 0xce, 0x3d, 0xc9, 0x0f, 0xee, 0x2d, 0x5f, 0x27, 0x49, 0xb1, 0xba, 0x11, 0x4d, 0x32, 0x2b, 0x2b, - 0xb5, 0xf0, 0x01, 0xb7, 0x9d, 0x3a, 0x4f, 0x94, 0xf7, 0xca, 0x5b, 0x9c, 0xbc, 0xff, 0x83, 0xce, 0xbb, 0x08, 0x21, - 0xd2, 0xe1, 0x24, 0x1b, 0x8a, 0x6e, 0xda, 0xa3, 0xad, 0x6e, 0xda, 0x6c, 0x62, 0x5f, 0xd0, 0x6c, 0x90, 0x9a, 0xf4, - 0x3c, 0x9f, 0xf7, 0x85, 0x32, 0xb6, 0x73, 0x1c, 0x0a, 0xb8, 0x6a, 0xba, 0x5a, 0x55, 0x61, 0x00, 0xae, 0xae, 0x6b, - 0xfc, 0x4d, 0x9a, 0x06, 0x24, 0x77, 0x38, 0x79, 0x6a, 0x5f, 0xec, 0x92, 0x59, 0x5e, 0x91, 0x88, 0x91, 0xc2, 0x5c, - 0x30, 0x8f, 0xe4, 0x14, 0xbc, 0x14, 0xa5, 0xf8, 0xa9, 0x92, 0x98, 0xd0, 0x21, 0xc2, 0xfd, 0xac, 0xcc, 0x70, 0x83, - 0x4c, 0xbe, 0xac, 0x80, 0x51, 0xbe, 0x91, 0x14, 0x46, 0x24, 0xbf, 0x50, 0x6d, 0xd3, 0x59, 0x8b, 0x6e, 0x7c, 0x5f, - 0x8b, 0x8e, 0xa5, 0x92, 0xab, 0xdc, 0x6d, 0x1b, 0x71, 0x98, 0x46, 0xf9, 0xf9, 0x48, 0xdf, 0x95, 0xcc, 0xab, 0x9b, - 0x01, 0x91, 0x82, 0x5e, 0x1b, 0x69, 0x2c, 0x53, 0xf6, 0xe8, 0xf7, 0x72, 0xa7, 0x7d, 0x92, 0xdd, 0x65, 0x9f, 0x94, - 0x0b, 0xcf, 0xc5, 0x22, 0x1b, 0x41, 0x38, 0xd2, 0x48, 0xbd, 0x4d, 0xc7, 0x0d, 0x52, 0x2a, 0x06, 0x22, 0xd2, 0xc9, - 0x04, 0x95, 0x84, 0xbb, 0x2f, 0x95, 0x60, 0x2a, 0xe4, 0xa5, 0xef, 0x6b, 0x18, 0x11, 0x67, 0x97, 0x04, 0x32, 0x3b, - 0x56, 0x49, 0x8d, 0x7e, 0x4a, 0x7b, 0x69, 0xb0, 0x48, 0xf9, 0xcf, 0x0b, 0x76, 0xce, 0x41, 0xd7, 0xe4, 0x01, 0x8f, - 0x55, 0xac, 0x09, 0x64, 0x5f, 0xb3, 0x0d, 0xc1, 0x0b, 0x1e, 0xeb, 0x8d, 0x49, 0x55, 0xa5, 0xc9, 0x6d, 0x42, 0x4d, - 0x04, 0xfe, 0x62, 0xd0, 0x0e, 0x38, 0x89, 0xc5, 0x2c, 0xe2, 0x69, 0xa8, 0x5c, 0xbe, 0xe5, 0x60, 0x21, 0xb4, 0x26, - 0x3c, 0x0e, 0x53, 0xb3, 0x3d, 0x6d, 0x1c, 0xfc, 0x24, 0x78, 0xaa, 0xba, 0x16, 0x5d, 0xa1, 0x10, 0xaa, 0xd1, 0x47, - 0x2d, 0x82, 0x4f, 0xb4, 0x5c, 0x13, 0x98, 0xb8, 0xd5, 0xe5, 0xb5, 0xf3, 0xda, 0x0e, 0xb4, 0xd6, 0x36, 0x4a, 0x1b, - 0x01, 0x62, 0xbd, 0x34, 0x17, 0x99, 0xf4, 0xfd, 0x29, 0x49, 0x30, 0xed, 0x4d, 0x95, 0xb3, 0xeb, 0x38, 0x51, 0xff, - 0xf5, 0x9b, 0xed, 0xb0, 0x5d, 0x9a, 0xef, 0xb5, 0xdb, 0xc0, 0x3a, 0x39, 0xca, 0xdc, 0x28, 0x55, 0xcb, 0x28, 0x7f, - 0xeb, 0xa5, 0x56, 0xcf, 0xe5, 0x72, 0x89, 0x39, 0x6e, 0x5a, 0x54, 0xf9, 0x35, 0x20, 0x54, 0xb0, 0x68, 0xc7, 0x54, - 0xb8, 0xa8, 0xd6, 0x5d, 0xaa, 0x92, 0x17, 0x5a, 0x44, 0x9f, 0xef, 0x2f, 0x33, 0x33, 0x63, 0x71, 0xc1, 0xad, 0x93, - 0xa9, 0x4e, 0x72, 0x85, 0xc1, 0x88, 0xa3, 0x87, 0x6e, 0x6b, 0xa6, 0x61, 0xb9, 0xa5, 0xd9, 0x56, 0xba, 0x0d, 0xf4, - 0x23, 0xcb, 0x68, 0x15, 0xee, 0xda, 0x18, 0x00, 0x72, 0xf5, 0xb6, 0x01, 0x06, 0x66, 0x6b, 0x2e, 0xed, 0x12, 0x40, - 0x1b, 0x1b, 0x33, 0xb8, 0x48, 0x73, 0xb1, 0xbf, 0xfc, 0x46, 0x16, 0x87, 0x4e, 0x53, 0xf5, 0x9b, 0xc7, 0xf0, 0x3f, - 0x48, 0xc0, 0xa5, 0x56, 0x4a, 0x43, 0xf4, 0xf5, 0xdb, 0xb3, 0xf7, 0x88, 0x5c, 0x8a, 0xf8, 0x36, 0x44, 0x32, 0x5b, - 0x30, 0x54, 0xe0, 0x40, 0x4e, 0x59, 0x5a, 0xbe, 0x8c, 0x47, 0x24, 0x2c, 0x48, 0xc4, 0x44, 0x5f, 0xca, 0x5c, 0x37, - 0x92, 0x47, 0x17, 0xc7, 0xea, 0x25, 0x53, 0xbd, 0x63, 0xa9, 0x5f, 0xef, 0x25, 0x33, 0xf8, 0xd9, 0x83, 0x10, 0xca, - 0xf1, 0xa1, 0x9c, 0xaa, 0x87, 0x33, 0x38, 0x30, 0xea, 0x69, 0x7f, 0xb9, 0x41, 0x4c, 0x7d, 0x18, 0x62, 0xda, 0xd3, - 0x4b, 0xc8, 0x55, 0xab, 0x8b, 0x70, 0x74, 0x71, 0x51, 0x1c, 0x1f, 0xc2, 0x58, 0x87, 0x76, 0x5c, 0x80, 0xd0, 0xf6, - 0x2f, 0x09, 0x0c, 0x5e, 0x36, 0x94, 0xd1, 0x1e, 0x0c, 0x01, 0xf3, 0xc6, 0x3d, 0x58, 0x24, 0x10, 0x18, 0xf4, 0x8e, - 0xcb, 0x12, 0x75, 0x62, 0x75, 0xd1, 0x2e, 0x08, 0x74, 0xc3, 0x8a, 0xee, 0xb5, 0x37, 0xb5, 0xda, 0x5f, 0x0b, 0x52, - 0xec, 0x42, 0x77, 0x81, 0xe1, 0x7f, 0x05, 0xd9, 0xf1, 0xa1, 0xc6, 0xc3, 0x85, 0xfb, 0x6a, 0x13, 0xfd, 0xda, 0x81, - 0x12, 0x5b, 0x83, 0x5c, 0x92, 0x8f, 0x92, 0x7c, 0xbc, 0x50, 0x4d, 0xad, 0x30, 0x02, 0x2d, 0x09, 0x84, 0x76, 0xcb, - 0x6a, 0x1d, 0x23, 0x91, 0x24, 0xd1, 0x3c, 0x67, 0xa1, 0xfd, 0x61, 0xe4, 0x12, 0x88, 0xb7, 0x4d, 0x45, 0xc0, 0xa4, - 0xd7, 0x9c, 0x82, 0xba, 0xb0, 0xa9, 0xa5, 0x5c, 0x45, 0x99, 0xdf, 0x6c, 0x8e, 0x9a, 0x97, 0x13, 0x5c, 0xc8, 0xe9, - 0xd2, 0x95, 0x6a, 0x8f, 0x5b, 0xad, 0x2e, 0xe4, 0x42, 0x36, 0xa3, 0x84, 0x4f, 0xd2, 0x30, 0x61, 0x63, 0x59, 0x48, - 0xb8, 0xa5, 0xb6, 0xb4, 0x6a, 0x44, 0xd0, 0x79, 0x94, 0xb1, 0x99, 0x17, 0xc0, 0xbf, 0x77, 0x4f, 0x5c, 0xc8, 0x38, - 0x4c, 0xe5, 0xb4, 0xa9, 0xb2, 0x6e, 0xe1, 0xce, 0x80, 0x9c, 0xd6, 0x9e, 0x97, 0xce, 0x44, 0x23, 0x06, 0x2a, 0x56, - 0x21, 0x33, 0x4f, 0x4e, 0x89, 0xcc, 0xdc, 0x76, 0x29, 0x5e, 0x6e, 0xac, 0x60, 0x53, 0xd2, 0x1f, 0xe1, 0x22, 0x57, - 0x8a, 0xf1, 0x66, 0x63, 0xab, 0x2e, 0xd5, 0x9f, 0x36, 0xd0, 0xe7, 0x28, 0x76, 0x85, 0x76, 0x2c, 0x2f, 0x75, 0x8f, - 0xfb, 0x20, 0xb3, 0xa6, 0x72, 0x12, 0xb7, 0x07, 0x2e, 0x78, 0x3a, 0x5f, 0xc8, 0x81, 0x72, 0x6a, 0x67, 0x70, 0x41, - 0x62, 0x48, 0x9c, 0x12, 0xc0, 0xc1, 0x70, 0xa9, 0x81, 0x19, 0x45, 0xc9, 0xc8, 0x07, 0x88, 0xbc, 0xa6, 0xf7, 0x34, - 0x63, 0x33, 0xdc, 0x9d, 0xf1, 0xb4, 0xa9, 0xeb, 0x1e, 0x39, 0x6a, 0x49, 0xf0, 0x04, 0x9e, 0x8a, 0x40, 0x8d, 0x46, - 0x54, 0xee, 0xea, 0x16, 0x5c, 0x5e, 0x0c, 0x8b, 0xa2, 0x9b, 0x49, 0x7f, 0xf0, 0xda, 0xc7, 0x43, 0xf2, 0x8b, 0xf3, - 0x72, 0x16, 0x64, 0x8f, 0x0a, 0x22, 0x1d, 0xbc, 0xa3, 0x89, 0x7b, 0x16, 0x54, 0xb3, 0x5f, 0x28, 0x34, 0x7c, 0xe7, - 0x23, 0x96, 0xcf, 0x9b, 0x9a, 0x77, 0x35, 0x15, 0xc9, 0x22, 0xe8, 0x8a, 0x8d, 0xa7, 0xf6, 0x7b, 0xb9, 0x54, 0x6c, - 0xc9, 0x5c, 0xd2, 0xd0, 0xce, 0x84, 0x61, 0x79, 0xa9, 0xc7, 0x3c, 0xbb, 0xd7, 0x78, 0x70, 0x8d, 0x9f, 0x5c, 0x9c, - 0xd4, 0x79, 0x1c, 0xf0, 0xa5, 0xf2, 0x05, 0x76, 0x51, 0x92, 0xc0, 0x84, 0x17, 0x56, 0x7d, 0x71, 0x5f, 0xfa, 0x31, - 0x90, 0x43, 0x1f, 0x17, 0xe6, 0x9c, 0x3e, 0x53, 0x2a, 0xa5, 0xf3, 0xd6, 0xbc, 0x3d, 0x69, 0x83, 0x45, 0x5a, 0xfa, - 0x72, 0x08, 0x77, 0xd7, 0xf2, 0xa2, 0xbb, 0x15, 0xef, 0xd2, 0x0a, 0xa9, 0xa7, 0x16, 0x44, 0x51, 0x96, 0xc6, 0xc8, - 0xfb, 0xcb, 0x28, 0xe1, 0xa3, 0x8f, 0x14, 0xed, 0x2f, 0x7d, 0xbc, 0x79, 0xed, 0x51, 0x71, 0x05, 0xcb, 0xb0, 0x71, - 0xdd, 0x91, 0x9e, 0x06, 0x0e, 0x2f, 0xd6, 0x6f, 0xc5, 0x41, 0xbd, 0xfd, 0x25, 0x30, 0x1e, 0x3d, 0x4f, 0xef, 0xa2, - 0x38, 0xaf, 0xde, 0x75, 0x55, 0x41, 0x01, 0x68, 0xd6, 0xe5, 0x9e, 0x22, 0x2a, 0x8a, 0x3e, 0x49, 0x69, 0xc8, 0xd3, - 0x4c, 0x0d, 0xe0, 0x94, 0x86, 0xbf, 0x21, 0xef, 0x2f, 0x65, 0x19, 0x2b, 0x3d, 0x1a, 0x2a, 0x25, 0x83, 0x22, 0x98, - 0x0b, 0xcc, 0xd8, 0x20, 0x66, 0x32, 0xe2, 0x89, 0xee, 0xd2, 0xb5, 0x06, 0xf8, 0xda, 0x8a, 0x56, 0xab, 0xbc, 0xbe, - 0x16, 0x5e, 0xc7, 0xa0, 0x5a, 0xd9, 0xf1, 0x61, 0x05, 0xb7, 0x5a, 0x99, 0x3a, 0x93, 0x6e, 0x68, 0xb0, 0x5a, 0xa1, - 0xae, 0xf3, 0xfe, 0x32, 0x52, 0xd7, 0x86, 0x00, 0x40, 0x61, 0x00, 0x84, 0xa0, 0xb5, 0xbe, 0x16, 0xe3, 0x27, 0x54, - 0x04, 0x32, 0xca, 0x26, 0x4c, 0xae, 0x21, 0x36, 0xd1, 0x39, 0xaa, 0x5d, 0x1b, 0xa0, 0xde, 0x80, 0x36, 0xaa, 0x43, - 0x7b, 0x01, 0x48, 0xef, 0xef, 0x2f, 0x79, 0x41, 0xf7, 0x97, 0x2c, 0x1d, 0x89, 0x98, 0x7d, 0x78, 0xf7, 0x25, 0x5c, - 0x72, 0x14, 0x29, 0x18, 0x16, 0x53, 0x0c, 0x82, 0x53, 0x6d, 0x8e, 0x16, 0x21, 0x42, 0x89, 0x10, 0xcd, 0x09, 0x3c, - 0x35, 0x97, 0x02, 0xb1, 0x40, 0x5e, 0x5f, 0x43, 0xce, 0x62, 0x0d, 0x33, 0x4d, 0x55, 0x2f, 0x51, 0x1c, 0x1f, 0xea, - 0xd6, 0x5a, 0x04, 0xe8, 0x46, 0x80, 0x04, 0x75, 0x4e, 0x2b, 0x1c, 0x40, 0x5e, 0xb3, 0x8b, 0x87, 0x98, 0x5f, 0x95, - 0xc4, 0xa6, 0x2e, 0x50, 0xf5, 0x8e, 0x93, 0xe8, 0x92, 0x25, 0xbd, 0xfd, 0x65, 0xba, 0x5a, 0xb5, 0x8a, 0xe3, 0x43, - 0xfd, 0xe8, 0x1d, 0x2b, 0xbe, 0xa1, 0x5f, 0x78, 0xa9, 0xb6, 0x18, 0x6e, 0x25, 0x42, 0xb6, 0xa7, 0x4d, 0x73, 0x0a, - 0xcd, 0x00, 0x05, 0xf2, 0x54, 0x82, 0x85, 0x6a, 0x54, 0x2a, 0x44, 0x05, 0xf2, 0x78, 0xbc, 0x59, 0x96, 0x4b, 0x36, - 0x87, 0xd2, 0xe9, 0x6a, 0xd5, 0x2e, 0x90, 0x37, 0xe3, 0x29, 0x3c, 0xa5, 0xab, 0x95, 0xba, 0xf0, 0x37, 0xe3, 0xa9, - 0xdf, 0x02, 0xb2, 0x45, 0xde, 0x2c, 0xba, 0x51, 0x0b, 0xb6, 0x35, 0xd1, 0x8d, 0xdf, 0x36, 0x55, 0x41, 0x89, 0x9f, - 0x1c, 0x28, 0xae, 0xda, 0xd1, 0xc4, 0xec, 0x68, 0x4c, 0x16, 0xfa, 0x2a, 0x13, 0xf5, 0x63, 0x9a, 0x6c, 0xdf, 0xd1, - 0xd8, 0xee, 0xe8, 0x62, 0xc7, 0x8e, 0x2e, 0xee, 0xd8, 0xd1, 0xc8, 0xec, 0x9e, 0x57, 0xe2, 0x4e, 0xac, 0x56, 0xed, - 0x56, 0x85, 0xbd, 0xe3, 0xc3, 0x98, 0x5f, 0xc1, 0x6e, 0x80, 0x9a, 0x27, 0xf9, 0x8c, 0x6d, 0x27, 0xca, 0x3a, 0x8a, - 0xd9, 0xaf, 0xc2, 0x64, 0x85, 0x85, 0xb4, 0x8e, 0x05, 0x97, 0xae, 0xcb, 0x98, 0xdb, 0x1f, 0x49, 0xd9, 0x1c, 0xf0, - 0x90, 0x03, 0x1e, 0xa6, 0xf6, 0x05, 0x98, 0x3e, 0x7a, 0x8f, 0x08, 0xf2, 0x90, 0x25, 0xeb, 0x8b, 0xe2, 0x1c, 0x64, - 0x84, 0x5a, 0xdf, 0xbd, 0x68, 0x11, 0x5a, 0xa3, 0xde, 0x6e, 0x9a, 0x83, 0xf0, 0xf8, 0xb5, 0xc8, 0x62, 0x14, 0xea, - 0xa6, 0xbf, 0x0a, 0x55, 0x33, 0x9e, 0x9a, 0x64, 0xab, 0x9d, 0xb4, 0x56, 0xd5, 0xbb, 0x14, 0xd7, 0x79, 0xf4, 0x48, - 0xb7, 0x98, 0x47, 0x52, 0xb2, 0x2c, 0x35, 0x94, 0x8b, 0xd0, 0xff, 0x17, 0x54, 0xb8, 0x85, 0xaf, 0x44, 0x76, 0x03, - 0x2c, 0x01, 0x1a, 0x85, 0xdd, 0xf0, 0x7c, 0x2d, 0x9e, 0xf6, 0x2a, 0x0d, 0xf6, 0x16, 0xbb, 0x46, 0x83, 0x2e, 0x02, - 0x1b, 0x66, 0x31, 0x63, 0xf1, 0xb9, 0x62, 0xd0, 0xfd, 0xd1, 0x85, 0x51, 0x58, 0xd7, 0xc4, 0x5d, 0xd5, 0x81, 0xa0, - 0x1f, 0x17, 0x9d, 0x27, 0x0f, 0x4f, 0x11, 0xd1, 0x3c, 0x5e, 0x8c, 0xc7, 0x08, 0x17, 0xde, 0xfd, 0xba, 0xb5, 0x1f, - 0xfe, 0xb8, 0xf8, 0xe2, 0x45, 0xeb, 0x8b, 0xb2, 0x73, 0x0a, 0x44, 0x64, 0xe2, 0xfb, 0x56, 0x54, 0x39, 0xf0, 0xda, - 0x15, 0x8d, 0xa3, 0x74, 0xf7, 0x72, 0x06, 0xee, 0x72, 0xf2, 0x39, 0x63, 0x31, 0x10, 0x27, 0xd9, 0x28, 0x3d, 0x4f, - 0xd8, 0x15, 0xb3, 0x6f, 0x1e, 0xdc, 0x32, 0xd9, 0x96, 0x1e, 0x23, 0xb1, 0x48, 0xa5, 0x49, 0x74, 0x30, 0xac, 0xd6, - 0x59, 0xd2, 0x85, 0x5a, 0x83, 0x6b, 0x23, 0xdc, 0x6a, 0x39, 0x57, 0x97, 0x5e, 0xc5, 0x05, 0x41, 0x0e, 0x00, 0x3b, - 0x21, 0xeb, 0xef, 0x28, 0x0f, 0x5b, 0xa4, 0xb5, 0x0b, 0x36, 0xd2, 0xc6, 0x21, 0x42, 0x43, 0x8b, 0x27, 0xe5, 0xab, - 0xac, 0xbd, 0x30, 0x62, 0x27, 0xbe, 0x3e, 0x89, 0x81, 0xcb, 0x0c, 0x06, 0x4b, 0x59, 0x9e, 0xef, 0x44, 0x40, 0xb9, - 0x89, 0x04, 0x55, 0xad, 0xd1, 0x8e, 0x51, 0x48, 0x8b, 0xc0, 0x09, 0x53, 0x00, 0x97, 0x11, 0x53, 0xd3, 0x8a, 0x8d, - 0xc7, 0x6c, 0x54, 0xba, 0x7a, 0x21, 0xf6, 0x35, 0xe6, 0x89, 0x84, 0x10, 0x90, 0x8a, 0xcd, 0xa0, 0x37, 0x22, 0x65, - 0x08, 0xdb, 0x6c, 0x4e, 0x03, 0xbf, 0x91, 0xff, 0xdb, 0xe1, 0xd1, 0x23, 0xd6, 0x61, 0x31, 0xb3, 0xac, 0x56, 0xd6, - 0xcd, 0x53, 0x2b, 0xaf, 0x23, 0x52, 0x28, 0x3f, 0xce, 0xae, 0x03, 0x74, 0xbf, 0x63, 0xb2, 0x6c, 0x7f, 0xf1, 0xa8, - 0xdd, 0x2a, 0x10, 0x41, 0x30, 0xdc, 0x7d, 0x4f, 0x89, 0xea, 0x75, 0x04, 0xbd, 0x16, 0xe9, 0xaf, 0xe9, 0xd7, 0x69, - 0x7f, 0xde, 0x46, 0x44, 0xbf, 0x48, 0x00, 0x17, 0x25, 0x33, 0x18, 0x81, 0xf3, 0xf3, 0x77, 0x2f, 0xa5, 0x3e, 0xf8, - 0xfd, 0xe0, 0x79, 0xdc, 0x6e, 0x21, 0x82, 0x72, 0x29, 0xe6, 0xbf, 0x62, 0x09, 0x47, 0x88, 0xa0, 0x51, 0x22, 0x72, - 0xe6, 0xae, 0x41, 0xab, 0xb3, 0xbf, 0x7f, 0x11, 0x1a, 0xa2, 0x79, 0xc6, 0xf2, 0xdc, 0x73, 0xc7, 0x37, 0xa4, 0xf4, - 0x09, 0x86, 0xb9, 0x95, 0xe2, 0x72, 0x26, 0x15, 0x5e, 0xf4, 0x1d, 0x7f, 0x97, 0xaa, 0x74, 0xd9, 0x06, 0xb1, 0x29, - 0x11, 0x50, 0x32, 0x36, 0xad, 0x5d, 0x7d, 0x72, 0xe6, 0x2d, 0x47, 0x4f, 0x4f, 0xac, 0x63, 0xc2, 0x9b, 0x13, 0xd4, - 0x4a, 0x66, 0x3c, 0x3d, 0xdf, 0x52, 0x1a, 0xdd, 0x6c, 0x29, 0x05, 0x95, 0xad, 0x84, 0xce, 0xbc, 0x7e, 0xe6, 0xd3, - 0x58, 0xaf, 0x14, 0x1f, 0x17, 0xc4, 0x58, 0xf9, 0x2d, 0x3f, 0x01, 0xa9, 0xb3, 0x0d, 0x6a, 0x84, 0xdf, 0x3e, 0x1d, - 0x94, 0xfc, 0x9a, 0xe9, 0xca, 0x51, 0x7e, 0xdf, 0x0a, 0xa1, 0xb4, 0x09, 0xfe, 0xeb, 0xe4, 0x57, 0xad, 0x95, 0xdd, - 0x7c, 0x9a, 0xe0, 0x1c, 0xad, 0xea, 0x77, 0x6c, 0xbd, 0xb9, 0xc7, 0xbe, 0xbe, 0xf7, 0x5b, 0x8a, 0x8d, 0xe2, 0x53, - 0xee, 0xff, 0x28, 0xe1, 0xb3, 0x8a, 0x04, 0x36, 0xc1, 0x54, 0x1a, 0x0f, 0x24, 0x33, 0xb9, 0x83, 0x68, 0xd5, 0xe7, - 0x1c, 0xae, 0x68, 0xc2, 0x7b, 0x30, 0x16, 0x19, 0x3b, 0x4f, 0xc4, 0xf5, 0xfa, 0x7b, 0xbd, 0x76, 0x37, 0x9e, 0xf2, - 0xc9, 0xd4, 0xb9, 0x77, 0xc5, 0x68, 0xb9, 0x09, 0x77, 0x4e, 0x50, 0xfc, 0xeb, 0xbf, 0x04, 0xc1, 0xbf, 0xfe, 0xcb, - 0x27, 0x9b, 0xc2, 0xf0, 0xc5, 0x05, 0x91, 0xd5, 0xb0, 0xbb, 0x4f, 0xd7, 0xf6, 0x99, 0xea, 0x38, 0xdf, 0xde, 0x66, - 0x63, 0x13, 0xa0, 0x7e, 0x63, 0x0b, 0x36, 0x0a, 0xf5, 0xe9, 0xf3, 0x7e, 0x0b, 0x60, 0xb0, 0xae, 0x4f, 0x42, 0x06, - 0x8d, 0x7e, 0x17, 0x68, 0x17, 0x38, 0xbc, 0xd7, 0x8e, 0xfc, 0x76, 0x0c, 0x7f, 0x6a, 0x0d, 0xbf, 0x13, 0x7c, 0xe3, - 0x9f, 0x18, 0x5d, 0x5c, 0x94, 0x09, 0x76, 0x6e, 0x57, 0xb8, 0xc0, 0xdf, 0xdf, 0x28, 0x31, 0x8a, 0x47, 0xd8, 0xc2, - 0x3d, 0x75, 0x3d, 0x90, 0x8e, 0x2e, 0x5e, 0xc3, 0x5b, 0x7b, 0x8e, 0x2f, 0x33, 0xeb, 0xe0, 0xbd, 0x43, 0x38, 0xc0, - 0x10, 0xf5, 0x55, 0xa9, 0x41, 0x37, 0x24, 0x03, 0x94, 0x82, 0xb9, 0x01, 0x60, 0x92, 0xd1, 0x85, 0xb1, 0x36, 0x4f, - 0xb5, 0x1b, 0x26, 0x5c, 0x27, 0x6d, 0xe3, 0x9e, 0xa9, 0x21, 0x9d, 0x78, 0xef, 0x15, 0xbe, 0x54, 0x63, 0x56, 0x59, - 0xf7, 0xca, 0xd5, 0x05, 0x76, 0xc4, 0x45, 0xa1, 0xc2, 0xf4, 0x7f, 0xdd, 0x15, 0x49, 0xfc, 0xfb, 0xa7, 0x23, 0x89, - 0xe2, 0x5e, 0x91, 0xc4, 0xbf, 0xff, 0xe1, 0x91, 0xc4, 0xbf, 0xba, 0x91, 0x44, 0xd8, 0xc4, 0x2f, 0xef, 0x15, 0xed, - 0xb3, 0x91, 0x18, 0x71, 0x9d, 0xd3, 0xb6, 0x51, 0xa3, 0x13, 0x31, 0x81, 0x50, 0xdf, 0xbf, 0x7f, 0xe4, 0x2e, 0x11, - 0x13, 0x37, 0x6e, 0x07, 0x6f, 0x6d, 0x85, 0x40, 0x5d, 0xd7, 0x46, 0xd8, 0x4c, 0xac, 0xac, 0x55, 0xde, 0x48, 0x69, - 0x3e, 0xb4, 0x6f, 0x50, 0x40, 0x61, 0xf9, 0x16, 0xa4, 0x16, 0xe9, 0xd8, 0x68, 0x5a, 0xa8, 0x02, 0x71, 0x65, 0xc7, - 0x4e, 0xc3, 0x5e, 0xb7, 0x70, 0x47, 0xe8, 0xda, 0xb7, 0xbc, 0xe8, 0xdb, 0xf7, 0x4b, 0xf4, 0xe3, 0x4d, 0xfb, 0xd9, - 0xa0, 0xdd, 0x3d, 0x6a, 0xcf, 0x50, 0x88, 0x40, 0x44, 0xaa, 0x82, 0x56, 0xf7, 0xe8, 0x08, 0x0a, 0xae, 0x9d, 0x82, - 0x0e, 0x14, 0x70, 0xa7, 0xe0, 0x11, 0x14, 0x8c, 0x9c, 0x82, 0xc7, 0x50, 0x10, 0x3b, 0x05, 0x4f, 0xa0, 0xe0, 0x0a, - 0x15, 0x03, 0x5e, 0x82, 0xfb, 0x04, 0x0f, 0x89, 0xb6, 0x5c, 0x6c, 0xd9, 0x13, 0xd2, 0x86, 0x10, 0x5e, 0x34, 0x51, - 0x99, 0x47, 0xe0, 0x10, 0x0c, 0x05, 0xb9, 0x9e, 0xb2, 0x34, 0x84, 0x20, 0xea, 0x73, 0x25, 0x63, 0x02, 0x29, 0xde, - 0xf3, 0x19, 0xb3, 0xdf, 0xcb, 0xb0, 0x78, 0xf0, 0x10, 0x1e, 0xb4, 0x86, 0x45, 0xb7, 0xdc, 0x39, 0x1d, 0xfb, 0x33, - 0x59, 0x28, 0x7a, 0x2f, 0xab, 0x3a, 0x3d, 0x5d, 0xb3, 0xdc, 0xf3, 0x1d, 0x31, 0x24, 0xc7, 0x17, 0x31, 0x4e, 0xc4, - 0x75, 0xf3, 0x06, 0xf5, 0xb6, 0xc7, 0x95, 0x00, 0xa2, 0x32, 0xae, 0xa4, 0xd6, 0x54, 0x3e, 0xbd, 0x8f, 0x26, 0xe5, - 0xef, 0xd7, 0x2c, 0xcf, 0xa3, 0x89, 0x69, 0xb9, 0x3b, 0x8e, 0xa4, 0x40, 0x74, 0x63, 0x48, 0x16, 0x08, 0x88, 0x05, - 0xc1, 0x66, 0x81, 0x2d, 0x6f, 0x42, 0x43, 0x80, 0x9d, 0x7a, 0x54, 0x49, 0x4d, 0x5f, 0x2f, 0x92, 0xd1, 0xa4, 0x2a, - 0x38, 0x9e, 0x67, 0x4c, 0x95, 0x6a, 0x0c, 0x17, 0xc7, 0x87, 0x50, 0xa0, 0xab, 0x77, 0x44, 0x8f, 0xac, 0xe3, 0x60, - 0x77, 0x0c, 0xc9, 0xb3, 0xd1, 0x23, 0x37, 0xdf, 0xa6, 0x4c, 0xb6, 0xd9, 0x8c, 0x59, 0x7c, 0xd6, 0x1e, 0xc1, 0x1f, - 0x13, 0x11, 0xf9, 0x6c, 0x3c, 0x1e, 0xdf, 0x19, 0x4d, 0xfa, 0x2c, 0x1e, 0xb3, 0x0e, 0x7b, 0xd4, 0x85, 0x5c, 0x8c, - 0xa6, 0x89, 0x41, 0xb4, 0x0b, 0x85, 0xbb, 0xe5, 0xfd, 0x1a, 0x43, 0xb8, 0x42, 0x4e, 0x97, 0xf7, 0x8f, 0x2c, 0x15, - 0xf3, 0x8c, 0x2d, 0x67, 0x51, 0x36, 0xe1, 0x69, 0xd8, 0x2a, 0x82, 0x2b, 0x13, 0x8a, 0xf9, 0xec, 0xe9, 0xd3, 0xa7, - 0x45, 0x10, 0xdb, 0xa7, 0x56, 0x1c, 0x17, 0xc1, 0x68, 0x59, 0x2e, 0xa3, 0xd5, 0x1a, 0x8f, 0x8b, 0x80, 0xdb, 0x82, - 0xa3, 0xce, 0x28, 0x3e, 0xea, 0x14, 0xc1, 0xb5, 0xd3, 0xa2, 0x08, 0x98, 0x79, 0xca, 0x58, 0x5c, 0x4b, 0xe8, 0x78, - 0xd2, 0x6a, 0x15, 0x81, 0x26, 0xb4, 0x25, 0x98, 0x63, 0xfa, 0x67, 0x18, 0x2d, 0xa4, 0x00, 0x96, 0xdc, 0x15, 0xd2, - 0x1f, 0x9c, 0x9b, 0x97, 0x65, 0xe8, 0x0f, 0x4b, 0x14, 0x78, 0x48, 0xbe, 0x74, 0x83, 0x26, 0x40, 0xcc, 0x2a, 0x58, - 0x22, 0x6c, 0x4c, 0xa5, 0x56, 0x0d, 0x94, 0xa5, 0xaa, 0xbf, 0xa4, 0xa2, 0x8a, 0xa5, 0x00, 0xff, 0x81, 0x96, 0xfa, - 0xad, 0x6e, 0x92, 0xed, 0xe0, 0xfa, 0x8c, 0x7d, 0x92, 0xeb, 0xdf, 0xde, 0x87, 0xe9, 0x33, 0xf6, 0x47, 0x33, 0x7d, - 0xf3, 0xea, 0x53, 0xcd, 0xf4, 0x35, 0x5b, 0x9b, 0x49, 0x8a, 0x46, 0x53, 0x36, 0xfa, 0x78, 0x29, 0x6e, 0x9a, 0x70, - 0x24, 0x32, 0xa4, 0xf8, 0xe9, 0xfe, 0x6f, 0x4d, 0xfe, 0xb0, 0x83, 0x39, 0xdf, 0xa5, 0x50, 0x62, 0xf3, 0x6d, 0x4a, - 0xd1, 0x5b, 0x6b, 0xd3, 0xe9, 0x92, 0xf1, 0x98, 0xa2, 0xb7, 0xe3, 0x31, 0xb2, 0x57, 0xfe, 0x22, 0xc9, 0x54, 0xab, - 0x37, 0xb5, 0x12, 0xd5, 0xea, 0x8b, 0x2f, 0xdc, 0x32, 0xb7, 0xc0, 0x84, 0x5c, 0xdc, 0xf0, 0x8a, 0xa9, 0x89, 0x79, - 0x0e, 0x47, 0x0d, 0x3e, 0x97, 0x51, 0x7f, 0xe7, 0x60, 0x56, 0x7b, 0x3d, 0x74, 0x09, 0xf0, 0x96, 0x77, 0x5a, 0xaf, - 0xdf, 0x77, 0x9f, 0x30, 0x9b, 0x7e, 0xf7, 0xec, 0xf6, 0xcb, 0xd8, 0x9f, 0x49, 0x5c, 0xf0, 0xfc, 0x6d, 0xba, 0x76, - 0x97, 0x45, 0xc3, 0x48, 0xa9, 0xbb, 0xac, 0x42, 0x8a, 0xc9, 0x24, 0x81, 0x0f, 0x96, 0x2c, 0x6b, 0xef, 0x41, 0xd5, - 0xdd, 0xfb, 0xb5, 0xf5, 0x86, 0x6e, 0x47, 0xf3, 0xd6, 0x50, 0xf5, 0xfd, 0x24, 0x9d, 0x03, 0x7d, 0x65, 0x3e, 0xa4, - 0xa3, 0xcc, 0xc1, 0xa5, 0xe1, 0xff, 0x4b, 0x9d, 0x39, 0x2b, 0x21, 0x6b, 0x44, 0x0f, 0x1c, 0x17, 0x85, 0xb9, 0x73, - 0x10, 0xf3, 0x7c, 0x0e, 0xef, 0xe7, 0xd4, 0x3d, 0xd9, 0xa7, 0x58, 0x78, 0x7e, 0xed, 0xc4, 0x35, 0x6a, 0xdb, 0x55, - 0xd8, 0xc0, 0x86, 0x76, 0x14, 0xcf, 0x64, 0x81, 0x8c, 0xbf, 0xd9, 0x22, 0x11, 0x79, 0x1a, 0x9f, 0x3a, 0xe2, 0xe2, - 0xac, 0x10, 0x9c, 0xbe, 0xe5, 0x86, 0xd8, 0x2a, 0x5b, 0x50, 0xb8, 0x71, 0x3b, 0x55, 0xa3, 0xb1, 0xa5, 0xa2, 0x04, - 0xf9, 0x3c, 0x4a, 0x35, 0x1b, 0xa5, 0x48, 0xf3, 0x83, 0xfd, 0x65, 0xb5, 0xf3, 0x05, 0xb2, 0x60, 0x6b, 0xe2, 0xed, - 0x1d, 0x1f, 0x42, 0x87, 0x9e, 0x57, 0x03, 0x3d, 0xdd, 0x08, 0x2e, 0x7c, 0x22, 0xcc, 0x7f, 0x11, 0xe4, 0xd7, 0x24, - 0xc8, 0xaf, 0xbd, 0x3f, 0x2f, 0x9b, 0xd7, 0xec, 0xf2, 0x23, 0x97, 0x4d, 0x19, 0xcd, 0x9b, 0xa0, 0xf0, 0x2b, 0xa7, - 0xa0, 0x61, 0xcf, 0x2a, 0x59, 0x4d, 0xdf, 0xd8, 0xef, 0x2e, 0x72, 0xc8, 0x06, 0x50, 0x6a, 0x6b, 0x98, 0x8a, 0x94, - 0x75, 0xeb, 0x49, 0x89, 0x6e, 0x70, 0xd9, 0x62, 0x6b, 0xb8, 0x14, 0x90, 0x3d, 0x20, 0x6f, 0xc3, 0x96, 0x61, 0xeb, - 0x2d, 0x1b, 0x39, 0x6e, 0x6d, 0x6d, 0x1f, 0x1a, 0xe4, 0x36, 0x94, 0xf4, 0xca, 0x36, 0x23, 0xe8, 0xbb, 0x22, 0xe0, - 0x9f, 0x4a, 0xd1, 0x03, 0x57, 0xa2, 0xfd, 0xeb, 0xe4, 0x36, 0xae, 0x17, 0xab, 0x14, 0xbd, 0xfb, 0x40, 0x16, 0x46, - 0x63, 0xc9, 0x32, 0x72, 0x9f, 0x96, 0x97, 0xea, 0x36, 0xcd, 0x12, 0xc4, 0x4c, 0xd8, 0x7e, 0x3a, 0xbf, 0xb9, 0xff, - 0xf0, 0x77, 0x2f, 0xbf, 0x30, 0x38, 0xb2, 0x6f, 0x97, 0x41, 0xa8, 0x0b, 0x07, 0x21, 0x89, 0x6e, 0x43, 0x9e, 0x2a, - 0x99, 0x77, 0x09, 0xfe, 0xc0, 0xee, 0x5c, 0x98, 0x5c, 0xd3, 0x8c, 0x25, 0xea, 0x53, 0x72, 0x66, 0x2b, 0x8e, 0x1e, - 0xcf, 0x6f, 0xec, 0x6e, 0xb4, 0xd7, 0x72, 0x48, 0xff, 0xd0, 0x54, 0xd1, 0xdd, 0xb9, 0xa9, 0xf5, 0x74, 0xc7, 0x47, - 0xf3, 0x9b, 0xae, 0x16, 0xb4, 0xcd, 0x4c, 0x43, 0xd5, 0x9a, 0xdf, 0xb8, 0xc9, 0xb2, 0xd5, 0x40, 0x5e, 0x70, 0x94, - 0x7b, 0x2c, 0xca, 0x59, 0x17, 0xde, 0x9f, 0xcd, 0x47, 0x51, 0x62, 0x84, 0xf9, 0x8c, 0xc7, 0x71, 0xc2, 0xba, 0x56, - 0x5e, 0x7b, 0xed, 0xc7, 0x90, 0x6b, 0xea, 0x6e, 0x59, 0x7d, 0x57, 0x1c, 0xe4, 0x95, 0x78, 0x8a, 0x2e, 0x73, 0x91, - 0xc0, 0xc7, 0x2b, 0xb6, 0xa2, 0xd3, 0x24, 0x61, 0xb6, 0x2a, 0xe4, 0xa9, 0xdf, 0xf5, 0xb5, 0x3c, 0x6a, 0xfd, 0xa9, - 0xab, 0x36, 0xbc, 0xd5, 0x95, 0x62, 0x1e, 0x36, 0x8f, 0xea, 0x0b, 0x81, 0xaa, 0x72, 0x09, 0x64, 0xcb, 0xb2, 0x08, - 0x48, 0x2b, 0xcd, 0xa7, 0xbd, 0xa0, 0x6d, 0xca, 0xd4, 0x00, 0xf0, 0xa2, 0xe7, 0xb2, 0xa8, 0xa8, 0x2f, 0xe6, 0xdf, - 0xe7, 0xb4, 0x7c, 0xbe, 0xfd, 0xb4, 0x7c, 0x6e, 0x4f, 0xcb, 0xdd, 0x14, 0xfb, 0xd9, 0xb8, 0x0d, 0x7f, 0xba, 0xd5, - 0x82, 0xc2, 0x96, 0x77, 0x34, 0xbf, 0xf1, 0x40, 0x4f, 0x6b, 0x76, 0xe6, 0x37, 0x3a, 0x55, 0x18, 0x62, 0x16, 0x2d, - 0x48, 0x9e, 0x25, 0x2d, 0x0f, 0x0a, 0xe1, 0x6f, 0xab, 0x56, 0xd5, 0x7e, 0x08, 0x75, 0xd0, 0xeb, 0xd1, 0x66, 0x5d, - 0xe7, 0xee, 0x43, 0x1b, 0xa6, 0x42, 0xfa, 0xa1, 0xe5, 0xc6, 0x38, 0x90, 0xd1, 0xe5, 0x25, 0x8b, 0xc3, 0xb1, 0x18, - 0x2d, 0xf2, 0x7f, 0x36, 0xf0, 0x1b, 0x24, 0xde, 0x79, 0xa4, 0xd7, 0xc6, 0xb1, 0x5d, 0x75, 0xe2, 0xb2, 0x1d, 0x61, - 0x59, 0xee, 0x53, 0x98, 0x8f, 0xa2, 0x84, 0xf9, 0x9d, 0xe0, 0xe1, 0x96, 0x43, 0xf0, 0x1f, 0xb2, 0x37, 0x5b, 0x17, - 0xf3, 0x7b, 0x91, 0x71, 0x27, 0x12, 0x7e, 0x15, 0x0e, 0xdc, 0x3d, 0x6c, 0x3d, 0xdd, 0x0e, 0xee, 0xc0, 0xce, 0x34, - 0xb4, 0x42, 0xc1, 0xc8, 0x9d, 0x98, 0x8d, 0xa3, 0x45, 0x22, 0xef, 0x1e, 0x75, 0x17, 0x65, 0x6c, 0x8c, 0x7a, 0x07, - 0x43, 0xaf, 0xda, 0xde, 0x93, 0x4b, 0x7f, 0xf6, 0xf9, 0x43, 0xf8, 0xa3, 0xf3, 0x9e, 0x6e, 0x2b, 0x5d, 0x5d, 0xdb, - 0xaa, 0xa0, 0xab, 0xef, 0xd7, 0x94, 0x71, 0x2d, 0xc2, 0x95, 0x3e, 0x7e, 0xdf, 0xd6, 0xa0, 0x55, 0xde, 0xab, 0xb9, - 0xd1, 0xb2, 0x7e, 0x55, 0xeb, 0x5f, 0x37, 0xf8, 0x3d, 0xdb, 0x8e, 0xb4, 0xe6, 0x5a, 0x6f, 0x6b, 0xbe, 0xa5, 0xb7, - 0xd1, 0xd8, 0x62, 0x5c, 0xb5, 0xdf, 0xa7, 0xb7, 0xa5, 0x89, 0xa2, 0xa3, 0x90, 0x60, 0xa5, 0xec, 0x6b, 0x2b, 0x85, - 0x33, 0xfa, 0x00, 0xde, 0x64, 0xeb, 0xdd, 0xcc, 0x92, 0x34, 0xa7, 0x68, 0x2a, 0xe5, 0x3c, 0xd4, 0x1f, 0x5f, 0xbd, - 0x3e, 0x0a, 0x44, 0x36, 0x39, 0xec, 0xb4, 0x5a, 0x2d, 0x78, 0x03, 0x29, 0xf2, 0xae, 0x38, 0xbb, 0x7e, 0x26, 0x6e, - 0x28, 0x7a, 0xe2, 0x3d, 0xf5, 0x9e, 0x1c, 0x79, 0x8f, 0x1e, 0x23, 0x4f, 0xb1, 0x73, 0x8a, 0x9e, 0x1c, 0x21, 0x4f, - 0xb3, 0x73, 0x8a, 0x1e, 0x3d, 0x46, 0xbd, 0xe3, 0x89, 0x55, 0xc9, 0xe0, 0x0a, 0xa3, 0xd6, 0x77, 0x72, 0x99, 0x89, - 0x8f, 0xac, 0x7e, 0x70, 0x75, 0x99, 0xc9, 0x8c, 0xeb, 0xd8, 0x47, 0x38, 0xbd, 0xa3, 0x68, 0x1e, 0x2a, 0xa2, 0x70, - 0x0b, 0xc1, 0x2d, 0xa3, 0x4b, 0xd5, 0x14, 0xa0, 0x66, 0x5e, 0xa2, 0xde, 0x31, 0x64, 0xb1, 0x7b, 0x31, 0x45, 0xaf, - 0x3b, 0x4f, 0xbc, 0xf6, 0xe3, 0xab, 0xe6, 0xc3, 0x51, 0xab, 0xd9, 0xf6, 0xda, 0xcd, 0x4e, 0xf0, 0xc4, 0xeb, 0xe8, - 0x7f, 0xbd, 0x96, 0x77, 0xe4, 0xb5, 0x83, 0x27, 0xde, 0x91, 0xd7, 0x09, 0x9e, 0x5c, 0x3d, 0xd4, 0xc9, 0x0c, 0x11, - 0x3a, 0xec, 0x1d, 0xc3, 0x87, 0x34, 0x6f, 0x28, 0xfa, 0x1c, 0xe9, 0xcf, 0xd5, 0xa2, 0xcf, 0xdc, 0xd2, 0xf6, 0xd3, - 0xad, 0xc5, 0x9d, 0x27, 0x5b, 0x8b, 0x8f, 0x1e, 0x6f, 0x2d, 0x7e, 0xf8, 0xa8, 0x5e, 0x7c, 0x38, 0xd1, 0x55, 0xe5, - 0x29, 0xa7, 0x68, 0x16, 0xc9, 0x8c, 0xdf, 0xf8, 0x6d, 0xaf, 0xe5, 0xb5, 0xbc, 0x26, 0xfc, 0xf7, 0xa4, 0x83, 0xcb, - 0x5e, 0x97, 0xd0, 0xab, 0x5c, 0xe5, 0x93, 0xa7, 0x5e, 0xfb, 0xf1, 0xcb, 0xce, 0xe3, 0x11, 0xb4, 0x53, 0x0b, 0x6d, - 0x7b, 0xed, 0xab, 0xa3, 0xa7, 0xa3, 0x96, 0x07, 0x1d, 0xdb, 0xf0, 0x67, 0xfa, 0xa8, 0x33, 0xd2, 0x0f, 0x2d, 0xa8, - 0xff, 0xb6, 0xfd, 0x24, 0x6f, 0x35, 0xdb, 0xf0, 0xe7, 0x97, 0x52, 0x23, 0x06, 0x7d, 0xdc, 0x1d, 0xf7, 0x61, 0xcb, - 0x3b, 0x7a, 0x3a, 0xed, 0x04, 0x9f, 0x5f, 0x3d, 0x09, 0x9e, 0x4e, 0xdb, 0x4f, 0xbe, 0xd5, 0x4f, 0x49, 0xb3, 0x13, - 0x7c, 0x0e, 0x7f, 0xbf, 0x3d, 0x6a, 0x4d, 0x9b, 0xed, 0xe0, 0xe9, 0xd5, 0x51, 0x70, 0x94, 0x34, 0x1f, 0x07, 0x4f, - 0xe1, 0x6f, 0x35, 0xdc, 0x54, 0xcc, 0x18, 0xf2, 0x60, 0xbf, 0xd7, 0xcc, 0x2d, 0x77, 0x8e, 0xce, 0x43, 0xef, 0xd1, - 0xc3, 0x97, 0x4f, 0xaf, 0x9a, 0x0f, 0xa7, 0xed, 0xce, 0x55, 0x73, 0xe7, 0xcf, 0x6f, 0x01, 0xf1, 0x66, 0xe0, 0x88, - 0xc1, 0x75, 0x22, 0x8b, 0x38, 0xf5, 0x36, 0xdc, 0x07, 0x24, 0xdf, 0x65, 0x5e, 0x67, 0x9f, 0x36, 0xaf, 0x53, 0x76, - 0x1f, 0xfb, 0x3a, 0xfb, 0xc3, 0xed, 0xeb, 0x9c, 0xad, 0x39, 0x55, 0x6f, 0xe5, 0x86, 0x19, 0xbd, 0x6e, 0x7b, 0xbd, - 0x93, 0xfe, 0x80, 0xc3, 0x57, 0x97, 0x8a, 0xee, 0x2d, 0xbc, 0x70, 0xdb, 0xf5, 0x36, 0x08, 0x38, 0xc8, 0xb7, 0x52, - 0x9f, 0x64, 0xb1, 0x0b, 0x21, 0xc9, 0xa7, 0x11, 0xf2, 0xed, 0x7d, 0xf0, 0x91, 0xfc, 0xe1, 0xf8, 0x10, 0x2e, 0x3e, - 0x6a, 0x7e, 0x5e, 0x65, 0xcf, 0x2a, 0x7b, 0xf4, 0x4c, 0x3d, 0xfb, 0x70, 0xe3, 0xa4, 0x81, 0x0e, 0x19, 0x14, 0xe5, - 0x48, 0xc7, 0x15, 0x5e, 0xfe, 0x1a, 0x97, 0xb4, 0xbe, 0x5e, 0x46, 0x91, 0x31, 0xfe, 0xe7, 0xf0, 0x65, 0x05, 0xfb, - 0x70, 0xa5, 0x2f, 0x3c, 0x53, 0xd4, 0x09, 0x5a, 0x41, 0xab, 0x74, 0x1c, 0xc0, 0x95, 0x42, 0xba, 0x14, 0x32, 0x82, - 0x8f, 0x7b, 0x26, 0x62, 0xa2, 0x3e, 0x03, 0x0a, 0x2f, 0x5f, 0x57, 0x1f, 0x64, 0xd5, 0xef, 0xbd, 0x0f, 0x11, 0x32, - 0x2f, 0x22, 0x80, 0x2b, 0x6b, 0xdf, 0xc0, 0xb5, 0x3e, 0xeb, 0xb1, 0x9e, 0x81, 0x4d, 0xfd, 0x9a, 0xc5, 0x3c, 0xf2, - 0x91, 0x3f, 0xcf, 0xd8, 0x98, 0x65, 0x79, 0xb3, 0x76, 0xd7, 0x4d, 0x5d, 0x73, 0xc3, 0xc8, 0x7e, 0x46, 0x32, 0x83, - 0x97, 0x09, 0xd3, 0x81, 0xf1, 0x6a, 0x21, 0xa3, 0xe6, 0xa3, 0x82, 0xd8, 0x92, 0x0c, 0x38, 0x7a, 0xa5, 0x1a, 0x20, - 0xad, 0x1b, 0xb4, 0x83, 0xce, 0x23, 0xac, 0x79, 0x09, 0xbc, 0xa4, 0xf5, 0x7b, 0xbf, 0x79, 0xd4, 0xfa, 0x13, 0x76, - 0xba, 0x95, 0x03, 0x0d, 0x8d, 0x53, 0x27, 0xab, 0x3e, 0xbf, 0x5b, 0xbf, 0x88, 0x88, 0x34, 0x45, 0x7c, 0xa6, 0xd7, - 0x0e, 0xaf, 0x7b, 0x35, 0xf1, 0x43, 0x7d, 0x9d, 0x7e, 0xcc, 0x27, 0xbe, 0xfb, 0x71, 0x55, 0xfd, 0x12, 0x58, 0xf5, - 0x4d, 0x66, 0x5c, 0x54, 0x4d, 0x32, 0xbc, 0x54, 0xbe, 0x78, 0x9e, 0x7a, 0xd9, 0x6a, 0xe5, 0x67, 0xe0, 0x88, 0xa5, - 0x0e, 0x4e, 0xe1, 0x19, 0xd7, 0x90, 0x9c, 0x91, 0x12, 0x20, 0x85, 0x60, 0x9a, 0xe9, 0xff, 0xab, 0x62, 0xfb, 0xc3, - 0xb8, 0x57, 0x82, 0x24, 0x4a, 0x27, 0x40, 0x85, 0x51, 0x3a, 0xd9, 0x70, 0xde, 0xe8, 0x70, 0xc2, 0x5a, 0x69, 0x35, - 0x54, 0xe5, 0xa4, 0xc9, 0x9f, 0xdd, 0xbe, 0x37, 0x6f, 0x8b, 0x42, 0xe0, 0x03, 0x55, 0xbe, 0xef, 0xea, 0xcd, 0xb6, - 0x0d, 0xfa, 0x40, 0x7f, 0xae, 0x5c, 0x65, 0xc3, 0x81, 0xf4, 0x83, 0x2b, 0x86, 0x9e, 0xb1, 0x79, 0x28, 0xd2, 0xb2, - 0x2f, 0x66, 0x57, 0x7c, 0x64, 0x44, 0x18, 0xf1, 0xcc, 0x35, 0xeb, 0xa6, 0xda, 0x1a, 0xda, 0x26, 0xda, 0xea, 0x1f, - 0x45, 0x2a, 0xdf, 0x99, 0xa6, 0x02, 0xf5, 0x1e, 0x94, 0xdf, 0x8a, 0xdc, 0xb5, 0x09, 0xf0, 0x0d, 0xf5, 0x41, 0xc6, - 0x92, 0x7f, 0xa6, 0x0f, 0xe0, 0x2b, 0xea, 0x0f, 0x86, 0xf0, 0x01, 0xef, 0x40, 0x89, 0x82, 0x07, 0xd5, 0xc7, 0xd4, - 0x81, 0x0f, 0x36, 0x6e, 0x66, 0x09, 0xb9, 0xaf, 0xf8, 0x36, 0xa2, 0xba, 0xf3, 0xa8, 0x12, 0xd5, 0x9d, 0x47, 0xae, - 0xf4, 0x6c, 0x7b, 0xed, 0x4e, 0xf0, 0xc8, 0x11, 0x00, 0x57, 0x4d, 0xf8, 0xbf, 0x26, 0x02, 0x1e, 0x06, 0x8f, 0x4a, - 0x19, 0xf0, 0xaa, 0xdd, 0x09, 0x8e, 0xb4, 0xb8, 0xe9, 0x04, 0x8f, 0x7e, 0x50, 0x0c, 0x5a, 0x33, 0xe7, 0xfa, 0x81, - 0xd8, 0x12, 0xaa, 0xd1, 0x19, 0x7d, 0x88, 0xf8, 0xe5, 0x17, 0xe9, 0xcc, 0xf9, 0x34, 0x2e, 0xa1, 0xe7, 0x51, 0x06, - 0x9f, 0x05, 0xa9, 0x9f, 0xdd, 0x5a, 0x1d, 0xa9, 0xf1, 0x8b, 0x2d, 0x53, 0xc0, 0x09, 0x47, 0xc4, 0xbd, 0xa7, 0x0c, - 0x97, 0x7c, 0xd5, 0x4b, 0x94, 0xed, 0xbb, 0xe4, 0x76, 0x93, 0xb6, 0x6e, 0x68, 0xdf, 0x57, 0xa7, 0x98, 0x05, 0x57, - 0x2f, 0xac, 0x57, 0x93, 0x7c, 0x19, 0x17, 0xeb, 0xf3, 0x43, 0x62, 0x61, 0x26, 0x9c, 0xab, 0xda, 0xac, 0x4a, 0x87, - 0x8f, 0x39, 0x5c, 0xae, 0x2f, 0x0a, 0x0b, 0x7a, 0xcd, 0x19, 0x58, 0x61, 0x49, 0xf1, 0x0b, 0x96, 0xf7, 0x11, 0x14, - 0xa1, 0x10, 0x29, 0x47, 0x12, 0x2a, 0x3f, 0x8d, 0x52, 0x12, 0x76, 0x55, 0x40, 0xd4, 0x95, 0x16, 0x38, 0xb5, 0x80, - 0x1f, 0x84, 0x0f, 0x0e, 0x76, 0x9e, 0x17, 0xa5, 0x8d, 0xc1, 0x5a, 0xab, 0x4f, 0x2a, 0xb8, 0xac, 0x08, 0xb9, 0x88, - 0x2e, 0xc7, 0x55, 0x28, 0xc4, 0x06, 0x4f, 0x97, 0x2c, 0x92, 0x41, 0x94, 0xea, 0x14, 0x05, 0x87, 0x61, 0x91, 0x36, - 0x3b, 0xc2, 0x85, 0x90, 0x91, 0xf3, 0xcd, 0x54, 0x73, 0xce, 0x85, 0x8c, 0xec, 0xc5, 0xc3, 0x54, 0xd6, 0x32, 0xf3, - 0xa7, 0x9d, 0xde, 0xdb, 0xf7, 0x27, 0x9e, 0x3e, 0x9e, 0xc7, 0x87, 0xd3, 0x4e, 0xef, 0x58, 0x59, 0xe6, 0xfa, 0xda, - 0x12, 0xd5, 0xd7, 0x96, 0x3c, 0x73, 0x85, 0x0d, 0xe2, 0x35, 0xc5, 0xa1, 0x5e, 0x36, 0xf2, 0x58, 0x3a, 0xd2, 0x3e, - 0xc5, 0xd9, 0x22, 0x91, 0x1c, 0x5e, 0x08, 0x7c, 0x08, 0x5d, 0x9b, 0xb0, 0x61, 0x65, 0x96, 0xab, 0xd5, 0x70, 0x64, - 0x6a, 0x3d, 0x90, 0x63, 0x9e, 0x30, 0x9b, 0xd7, 0x6a, 0x86, 0x2a, 0xf3, 0xb0, 0x37, 0x5b, 0xe7, 0x8b, 0xcb, 0x19, - 0x97, 0xc8, 0x66, 0x8b, 0x7f, 0x30, 0x1d, 0x8e, 0xd5, 0x54, 0xbd, 0x8b, 0xc2, 0xb8, 0x48, 0xed, 0xc7, 0x4f, 0xd6, - 0x3e, 0x37, 0xaf, 0x57, 0x6f, 0x24, 0x04, 0xdc, 0x3f, 0x9a, 0x1e, 0xf5, 0x4a, 0xa7, 0xa4, 0x5b, 0x57, 0x1c, 0x1f, - 0x4e, 0x8f, 0x7a, 0x17, 0xe1, 0xdc, 0x8c, 0xf7, 0x4a, 0x6c, 0x7c, 0xba, 0xbe, 0xe4, 0x98, 0x7d, 0x95, 0x68, 0xaf, - 0x6f, 0x74, 0x1a, 0x80, 0x47, 0x22, 0x41, 0xbd, 0x63, 0xa3, 0x0c, 0x78, 0x2a, 0xe8, 0x8a, 0x1e, 0xb5, 0x6c, 0xee, - 0x7e, 0x22, 0x94, 0xb6, 0xa4, 0xbb, 0x38, 0x93, 0xd4, 0xfc, 0xba, 0xd3, 0x76, 0xef, 0x38, 0x32, 0x6a, 0x26, 0x30, - 0x8f, 0x3c, 0x3c, 0x84, 0xce, 0xa0, 0xcb, 0x05, 0x5c, 0x1c, 0x5e, 0xb3, 0xcb, 0x66, 0x34, 0xe7, 0x95, 0x13, 0x15, - 0x94, 0x8e, 0x72, 0x4a, 0x51, 0xcd, 0x04, 0x3f, 0xa3, 0xb5, 0x45, 0x2a, 0x16, 0x5e, 0x18, 0x0f, 0xad, 0xd2, 0xd5, - 0x59, 0x24, 0x91, 0xa7, 0x39, 0xbc, 0xf5, 0xe4, 0x1a, 0xd9, 0x5b, 0xa0, 0xde, 0xbf, 0xfd, 0x8f, 0xff, 0x65, 0x9c, - 0xb3, 0xc7, 0x87, 0xd3, 0xb6, 0x1d, 0x6b, 0x0d, 0xd1, 0xc5, 0x31, 0x5c, 0x77, 0xab, 0xa2, 0x89, 0xec, 0xa6, 0x39, - 0xc9, 0x78, 0xdc, 0x9c, 0x46, 0xc9, 0x18, 0xf5, 0x76, 0x23, 0xc8, 0xbd, 0xe7, 0x62, 0xa0, 0xae, 0x17, 0x01, 0x09, - 0xfe, 0xa6, 0x9b, 0x1a, 0x36, 0xe1, 0x5f, 0x9d, 0x56, 0xf7, 0xde, 0x46, 0x75, 0xa0, 0x6a, 0x77, 0x37, 0x32, 0xf3, - 0x8d, 0x24, 0xc3, 0xd4, 0xb2, 0xda, 0x95, 0x8d, 0x02, 0x79, 0x65, 0x34, 0xe4, 0xff, 0xfe, 0xcf, 0xff, 0xf2, 0xdf, - 0xec, 0x23, 0x04, 0x39, 0xfe, 0xed, 0xbf, 0xff, 0xe7, 0xff, 0xf3, 0xbf, 0xff, 0x2b, 0xa4, 0xf9, 0x9b, 0x40, 0x88, - 0xe2, 0x13, 0x5e, 0x15, 0x05, 0xd1, 0x0c, 0xc3, 0x83, 0x4c, 0xb8, 0x19, 0xcf, 0x25, 0x1f, 0xd5, 0x2f, 0x71, 0x9c, - 0xa9, 0x09, 0xd5, 0x61, 0x33, 0xd0, 0xa9, 0x43, 0x5b, 0x54, 0x34, 0x52, 0x43, 0xb9, 0xa2, 0xc5, 0xe2, 0xf8, 0x10, - 0xf0, 0x7d, 0xbf, 0x7b, 0x6f, 0x41, 0xb9, 0x1d, 0x4b, 0xeb, 0xfa, 0x83, 0x92, 0xa2, 0x2a, 0xf7, 0xc0, 0x29, 0xbf, - 0x84, 0xc7, 0xb0, 0xe3, 0x14, 0xab, 0xdd, 0xab, 0xf5, 0xe9, 0xfe, 0xb4, 0xc8, 0x25, 0x1f, 0x03, 0xca, 0xb5, 0x83, - 0x51, 0xc5, 0x3f, 0x9b, 0xa0, 0xfe, 0x25, 0xb7, 0x85, 0x1a, 0x45, 0xdb, 0x8c, 0x0f, 0x9f, 0xfe, 0xa9, 0xf8, 0xcb, - 0x0c, 0x94, 0x2c, 0xcf, 0x9f, 0x45, 0x37, 0xc6, 0x92, 0x7c, 0xdc, 0x6a, 0xcd, 0x6f, 0xf0, 0xb2, 0x9a, 0x81, 0xec, - 0x9a, 0x4c, 0x39, 0x25, 0xdd, 0x01, 0x55, 0xe0, 0xb4, 0xf4, 0x7f, 0xb6, 0x3c, 0x70, 0xa2, 0x7a, 0xad, 0xa2, 0xf8, - 0xf3, 0x52, 0xb9, 0xe0, 0xf8, 0x2f, 0x10, 0xe0, 0x34, 0xde, 0xca, 0x4b, 0xe1, 0x2e, 0x6e, 0xe9, 0xf4, 0xea, 0xe8, - 0x5e, 0xd3, 0xf6, 0xe6, 0x75, 0x2e, 0x37, 0x40, 0xeb, 0x86, 0x56, 0x1f, 0x42, 0xb0, 0x74, 0xda, 0x26, 0xd3, 0xce, - 0xb2, 0x1c, 0x5e, 0x4a, 0x31, 0x73, 0x23, 0xb2, 0x2c, 0x62, 0x23, 0x36, 0xb6, 0x5e, 0x5e, 0x53, 0xaf, 0xa3, 0xad, - 0xc5, 0xf4, 0x68, 0xcb, 0x5c, 0x06, 0x24, 0x15, 0x89, 0xf5, 0x5a, 0xc5, 0x67, 0x70, 0x02, 0x97, 0xe3, 0x44, 0x44, - 0x32, 0x54, 0x04, 0xdb, 0x75, 0xe3, 0xba, 0x11, 0xb0, 0x19, 0xb1, 0x74, 0xe0, 0xe9, 0xea, 0xa6, 0xe0, 0x6f, 0xad, - 0x5f, 0xba, 0x2b, 0x02, 0xd5, 0xdd, 0x1d, 0x4a, 0xbb, 0x6b, 0xbe, 0x35, 0xe1, 0xd2, 0x97, 0x35, 0x3f, 0x87, 0x91, - 0x31, 0x1d, 0xbc, 0xbd, 0x5e, 0x8b, 0x6a, 0x5d, 0xfb, 0x95, 0xf4, 0x91, 0x02, 0x13, 0xad, 0xb7, 0x52, 0x85, 0xd0, - 0xea, 0x25, 0xfd, 0xb6, 0xb4, 0x82, 0xa2, 0xf9, 0x5c, 0x35, 0xc4, 0xdd, 0xe3, 0x43, 0xad, 0xbc, 0x02, 0xf7, 0x50, - 0xb9, 0x00, 0x3a, 0xf4, 0x6e, 0x1a, 0x99, 0xa3, 0xa0, 0x7f, 0x99, 0xa0, 0x3c, 0x7c, 0x3c, 0xab, 0xf7, 0xff, 0x00, - 0x08, 0x50, 0x84, 0x3d, 0xcd, 0x86, 0x00, 0x00}; + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcd, 0x7d, 0xdb, 0x72, 0xdb, 0xc6, 0xb6, 0xe0, 0xf3, + 0xe4, 0x2b, 0x20, 0x44, 0x5b, 0x41, 0x6f, 0x36, 0x21, 0x92, 0xba, 0x58, 0x06, 0xd5, 0xe4, 0x96, 0x65, 0x67, 0x3b, + 0x3b, 0xbe, 0xc5, 0xb2, 0x93, 0x9d, 0x30, 0xdc, 0x12, 0x44, 0x34, 0xc9, 0xb6, 0x41, 0x34, 0x03, 0x34, 0x29, 0x29, + 0x24, 0x4e, 0xcd, 0x07, 0x4c, 0xd5, 0x54, 0xcd, 0xd3, 0xbc, 0x4c, 0xcd, 0x79, 0x98, 0x8f, 0x98, 0xe7, 0xf3, 0x29, + 0xe7, 0x07, 0x66, 0x3e, 0x61, 0x6a, 0xf5, 0x05, 0x68, 0xf0, 0x22, 0xcb, 0x49, 0xce, 0x39, 0x53, 0xa9, 0x58, 0x44, + 0x5f, 0x57, 0xaf, 0x5e, 0xbd, 0xee, 0x0d, 0x9c, 0xee, 0x44, 0x7c, 0x20, 0xee, 0xa6, 0xd4, 0x19, 0x8b, 0x49, 0xdc, + 0x39, 0xd5, 0xff, 0xd2, 0x30, 0xea, 0x9c, 0xc6, 0x2c, 0xf9, 0xe8, 0xa4, 0x34, 0x26, 0x6c, 0xc0, 0x13, 0x67, 0x9c, + 0xd2, 0x21, 0x89, 0x42, 0x11, 0x06, 0x6c, 0x12, 0x8e, 0xa8, 0xb3, 0xdf, 0x39, 0x9d, 0x50, 0x11, 0x3a, 0x83, 0x71, + 0x98, 0x66, 0x54, 0x90, 0xf7, 0xef, 0xbe, 0xae, 0x9f, 0x74, 0x4e, 0xb3, 0x41, 0xca, 0xa6, 0xc2, 0x81, 0x21, 0xc9, + 0x84, 0x47, 0xb3, 0x98, 0x76, 0xf6, 0xf7, 0x6f, 0x6e, 0x6e, 0xfc, 0x0f, 0xd9, 0x17, 0x03, 0x9e, 0x64, 0xc2, 0x79, + 0x41, 0x6e, 0x58, 0x12, 0xf1, 0x1b, 0x4c, 0x05, 0x79, 0xe1, 0x5f, 0x8c, 0xc3, 0x88, 0xdf, 0xbc, 0xe5, 0x5c, 0xec, + 0xed, 0x79, 0xea, 0xf1, 0xee, 0xfc, 0xe2, 0x82, 0x10, 0x32, 0xe7, 0x2c, 0x72, 0x1a, 0xcb, 0x65, 0x59, 0xe8, 0x27, + 0xa1, 0x60, 0x73, 0xaa, 0xba, 0xa0, 0xbd, 0x3d, 0x37, 0x8c, 0xf8, 0x54, 0xd0, 0xe8, 0x42, 0xdc, 0xc5, 0xf4, 0x62, + 0x4c, 0xa9, 0xc8, 0x5c, 0x96, 0x38, 0x4f, 0xf9, 0x60, 0x36, 0xa1, 0x89, 0xf0, 0xa7, 0x29, 0x17, 0x1c, 0x20, 0xd9, + 0xdb, 0x73, 0x53, 0x3a, 0x8d, 0xc3, 0x01, 0x85, 0xfa, 0xf3, 0x8b, 0x8b, 0xb2, 0x47, 0xd9, 0x08, 0x33, 0x41, 0x2e, + 0xee, 0x26, 0xd7, 0x3c, 0xf6, 0x10, 0x8e, 0x05, 0x49, 0xe8, 0x8d, 0xf3, 0x03, 0x0d, 0x3f, 0xbe, 0x0c, 0xa7, 0xed, + 0x41, 0x1c, 0x66, 0x99, 0x73, 0x2d, 0x16, 0x72, 0x09, 0xe9, 0x6c, 0x20, 0x78, 0xea, 0x09, 0x4c, 0x31, 0x43, 0x0b, + 0x36, 0xf4, 0xc4, 0x98, 0x65, 0xfe, 0xe5, 0xee, 0x20, 0xcb, 0xde, 0xd2, 0x6c, 0x16, 0x8b, 0x5d, 0xb2, 0xd3, 0xc0, + 0x6c, 0x87, 0x10, 0x26, 0x90, 0x18, 0xa7, 0xfc, 0xc6, 0x79, 0x96, 0xa6, 0x3c, 0xf5, 0xdc, 0xf3, 0x8b, 0x0b, 0xd5, + 0xc2, 0x61, 0x99, 0x93, 0x70, 0xe1, 0x14, 0xe3, 0x85, 0xd7, 0x31, 0xf5, 0x9d, 0xf7, 0x19, 0x75, 0xae, 0x66, 0x49, + 0x16, 0x0e, 0xe9, 0xf9, 0xc5, 0xc5, 0x95, 0xc3, 0x53, 0xe7, 0x6a, 0x90, 0x65, 0x57, 0x0e, 0x4b, 0x32, 0x41, 0xc3, + 0xc8, 0x77, 0x51, 0x5b, 0x4e, 0x36, 0xc8, 0xb2, 0x77, 0xf4, 0x56, 0x10, 0x81, 0xe5, 0xa3, 0x20, 0x34, 0x1f, 0x51, + 0xe1, 0x64, 0xc5, 0xba, 0x3c, 0xb4, 0x88, 0xa9, 0x70, 0x04, 0x91, 0xf5, 0xbc, 0xad, 0x70, 0x4f, 0xd5, 0xa3, 0x68, + 0xb3, 0xa1, 0x47, 0xc5, 0xde, 0x9e, 0x28, 0xf0, 0x8c, 0xd4, 0xd2, 0x1c, 0x46, 0xe8, 0x8e, 0x29, 0xdb, 0xdb, 0xa3, + 0x7e, 0x4c, 0x93, 0x91, 0x18, 0x13, 0x42, 0x9a, 0x6d, 0xb6, 0xb7, 0xe7, 0x09, 0x12, 0x0b, 0x7f, 0x44, 0x85, 0x47, + 0x11, 0xc2, 0x65, 0xef, 0xbd, 0x3d, 0x4f, 0x21, 0x81, 0x13, 0x85, 0xb8, 0x0a, 0x8e, 0x91, 0xaf, 0xb1, 0x7f, 0x71, + 0x97, 0x0c, 0x3c, 0x1b, 0x7e, 0x84, 0xd9, 0xde, 0x5e, 0x2c, 0xfc, 0x0c, 0x46, 0xc4, 0x02, 0xa1, 0x3c, 0xa5, 0x62, + 0x96, 0x26, 0x8e, 0xc8, 0x05, 0xbf, 0x10, 0x29, 0x4b, 0x46, 0x1e, 0x5a, 0x98, 0x32, 0xab, 0x63, 0x9e, 0x2b, 0x70, + 0xdf, 0x08, 0x92, 0x92, 0x0e, 0xcc, 0x78, 0x2d, 0x3c, 0xd8, 0x45, 0x3e, 0x74, 0x52, 0x42, 0xdc, 0x4c, 0xf6, 0x75, + 0xbb, 0x69, 0x90, 0xd6, 0x5c, 0x17, 0x2b, 0x28, 0x31, 0x13, 0x08, 0x7f, 0x24, 0x5e, 0x8a, 0x7d, 0xdf, 0x17, 0x88, + 0x74, 0x16, 0x06, 0x2b, 0xa9, 0xb5, 0xce, 0x6e, 0xda, 0x6b, 0xf4, 0x03, 0xe1, 0xa7, 0x34, 0x9a, 0x0d, 0xa8, 0xe7, + 0x31, 0x9c, 0xe1, 0x04, 0x91, 0x0e, 0xab, 0x79, 0x9c, 0x74, 0x60, 0xbb, 0x79, 0x75, 0xaf, 0x09, 0xd9, 0x69, 0x20, + 0x0d, 0x23, 0x37, 0x00, 0x02, 0x86, 0x35, 0x3c, 0x9c, 0x10, 0x37, 0x99, 0x4d, 0xae, 0x69, 0xea, 0x16, 0xcd, 0xda, + 0x15, 0xb2, 0x98, 0x65, 0xd4, 0x19, 0x64, 0x99, 0x33, 0x9c, 0x25, 0x03, 0xc1, 0x78, 0xe2, 0xb8, 0x35, 0x5e, 0x73, + 0x15, 0x39, 0x14, 0xd4, 0xe0, 0xa2, 0x1c, 0x79, 0x19, 0xaa, 0xa5, 0xbd, 0xa4, 0xd6, 0xec, 0x63, 0x80, 0x12, 0xb5, + 0xf5, 0x78, 0x1a, 0x01, 0x14, 0xa7, 0xb0, 0xc6, 0x1c, 0xbf, 0x17, 0xb0, 0x4a, 0xb9, 0x44, 0x2a, 0xba, 0xa9, 0xbf, + 0x7e, 0x50, 0x88, 0xf0, 0x27, 0xe1, 0xd4, 0xa3, 0xa4, 0x43, 0x25, 0x71, 0x85, 0xc9, 0x00, 0x60, 0xad, 0xec, 0x5b, + 0x97, 0x06, 0xd4, 0x2f, 0x49, 0x0a, 0x05, 0xc2, 0x1f, 0xf2, 0xf4, 0x59, 0x38, 0x18, 0x43, 0xbf, 0x82, 0x60, 0x22, + 0x73, 0xde, 0x06, 0x29, 0x0d, 0x05, 0x7d, 0x16, 0x53, 0x78, 0xf2, 0x5c, 0xd9, 0xd3, 0x45, 0x38, 0x23, 0x2f, 0xfc, + 0x98, 0x89, 0x57, 0x3c, 0x19, 0xd0, 0x76, 0x66, 0x51, 0x17, 0x83, 0x7d, 0x3f, 0x13, 0x22, 0x65, 0xd7, 0x33, 0x41, + 0x3d, 0x37, 0x81, 0x16, 0x2e, 0xce, 0x10, 0x66, 0xbe, 0xa0, 0xb7, 0xe2, 0x9c, 0x27, 0x82, 0x26, 0x82, 0x50, 0x83, + 0x54, 0x9c, 0xfa, 0xe1, 0x74, 0x4a, 0x93, 0xe8, 0x7c, 0xcc, 0xe2, 0xc8, 0x63, 0x28, 0x47, 0x39, 0x0e, 0x05, 0x81, + 0x35, 0x92, 0x4e, 0x1a, 0xc0, 0x3f, 0xdb, 0x57, 0xe3, 0x09, 0xd2, 0x91, 0x87, 0x82, 0x12, 0xd7, 0x6d, 0x0f, 0x79, + 0xea, 0xe9, 0x15, 0x38, 0x7c, 0xe8, 0x08, 0x98, 0xe3, 0xed, 0x2c, 0xa6, 0x19, 0xa2, 0x35, 0xc2, 0x8a, 0x6d, 0xd4, + 0x08, 0x7e, 0x03, 0x14, 0x9f, 0x23, 0x2f, 0x45, 0x41, 0xda, 0x9e, 0x87, 0xa9, 0xf3, 0xb5, 0x3e, 0x51, 0x4f, 0x0d, + 0x37, 0x1b, 0x0b, 0xf2, 0xd4, 0x17, 0xe9, 0x2c, 0x13, 0x34, 0x7a, 0x77, 0x37, 0xa5, 0x19, 0x7e, 0x27, 0xc8, 0x58, + 0x74, 0xc7, 0xc2, 0xa7, 0x93, 0xa9, 0xb8, 0xbb, 0x90, 0x8c, 0x31, 0x70, 0x5d, 0x3c, 0x80, 0x96, 0x29, 0x0d, 0x07, + 0xc0, 0xcc, 0x34, 0xb6, 0xde, 0xf0, 0xf8, 0x6e, 0xc8, 0xe2, 0xf8, 0x62, 0x36, 0x9d, 0xf2, 0x54, 0xe0, 0xbf, 0x92, + 0x85, 0xe0, 0x25, 0x6a, 0x60, 0x2f, 0x17, 0xd9, 0x0d, 0x13, 0x83, 0xb1, 0x27, 0xd0, 0x62, 0x10, 0x66, 0xd4, 0x79, + 0xc2, 0x79, 0x4c, 0xc3, 0x24, 0x48, 0x49, 0xda, 0x7d, 0x27, 0x82, 0x64, 0x16, 0xc7, 0xed, 0xeb, 0x94, 0x86, 0x1f, + 0xdb, 0xb2, 0xfa, 0xf5, 0xf5, 0x07, 0x3a, 0x10, 0x81, 0xfc, 0x7d, 0x96, 0xa6, 0xe1, 0x1d, 0x34, 0x24, 0x04, 0x9a, + 0x75, 0xd3, 0xe0, 0x6f, 0x17, 0xaf, 0x5f, 0xf9, 0xea, 0x90, 0xb0, 0xe1, 0x9d, 0x97, 0x16, 0x07, 0x2f, 0xcd, 0xf1, + 0x30, 0xe5, 0x93, 0x95, 0xa9, 0x15, 0xd6, 0xd2, 0xf6, 0x16, 0x10, 0x28, 0x49, 0x77, 0xd4, 0xd0, 0x36, 0x04, 0xaf, + 0x24, 0xcd, 0x43, 0x25, 0xd1, 0xf3, 0xc2, 0x3f, 0x81, 0x2a, 0xf6, 0x52, 0x74, 0x3f, 0xb4, 0x22, 0xbd, 0x5b, 0x50, + 0x22, 0xe1, 0x9c, 0x82, 0x84, 0x01, 0x18, 0x07, 0xa1, 0x18, 0x8c, 0x17, 0x54, 0x0e, 0x96, 0x1b, 0x88, 0x69, 0x9e, + 0xe3, 0x9b, 0x82, 0xde, 0xc5, 0x0e, 0x21, 0xa9, 0x64, 0x54, 0x44, 0x2c, 0x97, 0x29, 0x21, 0x29, 0xc2, 0x3f, 0x90, + 0x45, 0x68, 0xd6, 0x13, 0xec, 0x34, 0x30, 0x9c, 0xcb, 0x40, 0x71, 0x17, 0x3c, 0xe0, 0xc9, 0x9c, 0xa6, 0x82, 0xa6, + 0xc1, 0x5f, 0x71, 0x4a, 0x87, 0x31, 0x40, 0xb1, 0xd3, 0xc4, 0xe3, 0x30, 0x3b, 0x1f, 0x87, 0xc9, 0x88, 0x46, 0xc1, + 0x8d, 0xc8, 0xf1, 0xdf, 0x89, 0x3b, 0x64, 0x49, 0x18, 0xb3, 0x5f, 0x69, 0xe4, 0x6a, 0x69, 0x70, 0xeb, 0xd0, 0x5b, + 0x41, 0x93, 0x28, 0x73, 0x9e, 0xbf, 0x7b, 0xf9, 0x42, 0xef, 0x63, 0x45, 0x40, 0xa0, 0x45, 0x36, 0x9b, 0xd2, 0xd4, + 0x43, 0x58, 0x0b, 0x88, 0x67, 0x4c, 0x32, 0xc7, 0x97, 0xe1, 0x54, 0x95, 0xb0, 0xec, 0xfd, 0x34, 0x0a, 0x05, 0x7d, + 0x43, 0x93, 0x88, 0x25, 0x23, 0xb2, 0xd3, 0x54, 0xe5, 0xe3, 0x50, 0x57, 0x44, 0x45, 0xd1, 0xe5, 0xee, 0xb3, 0x58, + 0xae, 0xbb, 0x78, 0x9c, 0x79, 0x28, 0xcf, 0x44, 0x28, 0xd8, 0xc0, 0x09, 0xa3, 0xe8, 0x9b, 0x84, 0x09, 0x26, 0x01, + 0x4c, 0x61, 0x7b, 0x80, 0x44, 0xa9, 0x12, 0x15, 0x06, 0x70, 0x0f, 0x61, 0xcf, 0xd3, 0x02, 0x60, 0x8c, 0xf4, 0x7e, + 0xed, 0xed, 0x95, 0xec, 0xbe, 0x4b, 0x03, 0x55, 0x49, 0x7a, 0x7d, 0xe4, 0x4f, 0x67, 0x19, 0x6c, 0xb4, 0x99, 0x02, + 0xa4, 0x0b, 0xbf, 0xce, 0x68, 0x3a, 0xa7, 0x51, 0x41, 0x1c, 0x99, 0x87, 0x16, 0x2b, 0x73, 0xe8, 0x63, 0x21, 0x48, + 0xaf, 0xdf, 0xb6, 0xf9, 0x36, 0xd5, 0x74, 0x9e, 0xf2, 0x29, 0x4d, 0x05, 0xa3, 0x59, 0xc1, 0x4a, 0x3c, 0x90, 0xa2, + 0x05, 0x3b, 0xc9, 0x88, 0x59, 0xdf, 0xd4, 0x63, 0x98, 0xa2, 0x0a, 0xc3, 0x30, 0x82, 0xf6, 0xd9, 0x5c, 0x4a, 0x8c, + 0x0c, 0x33, 0x84, 0x85, 0x82, 0x34, 0x43, 0x28, 0x47, 0x58, 0x18, 0x70, 0x15, 0x2b, 0xd2, 0xb3, 0xdd, 0x81, 0xa8, + 0x26, 0x3f, 0x48, 0x51, 0x0d, 0x0c, 0x2d, 0x14, 0x74, 0x6f, 0xcf, 0xa3, 0x7e, 0x41, 0x14, 0x64, 0xa7, 0xa9, 0xf7, + 0xc8, 0x42, 0xd6, 0x16, 0xb0, 0x61, 0x62, 0x81, 0x29, 0xc2, 0x3b, 0xd4, 0x4f, 0xf8, 0xd9, 0x60, 0x40, 0xb3, 0x8c, + 0xa7, 0x7b, 0x7b, 0x3b, 0xb2, 0x7d, 0xa1, 0x4d, 0xc0, 0x1e, 0xbe, 0xbe, 0x49, 0x4a, 0x08, 0x50, 0x29, 0x61, 0xb5, + 0x5c, 0x10, 0x20, 0xa7, 0xa4, 0xc2, 0xe1, 0x76, 0x8d, 0xe2, 0x11, 0xb8, 0x97, 0x97, 0x6e, 0x4d, 0x60, 0x8d, 0x86, + 0x11, 0x35, 0x53, 0xdf, 0x3d, 0xa5, 0x4a, 0xb5, 0x92, 0x8a, 0xc7, 0x1a, 0x66, 0xd4, 0xf9, 0xf1, 0x23, 0x3a, 0x64, + 0x89, 0xb5, 0xec, 0x0a, 0x48, 0x58, 0xe0, 0x0c, 0xe5, 0xd6, 0x86, 0x6e, 0x1c, 0x5a, 0xea, 0x34, 0x6a, 0xe7, 0x16, + 0x23, 0xa9, 0x47, 0x58, 0xdb, 0xd8, 0xa3, 0xfd, 0x1c, 0x4b, 0xd4, 0x9b, 0xd5, 0x24, 0x12, 0xd0, 0x9e, 0xe8, 0xb7, + 0x75, 0x3d, 0xc9, 0x14, 0xe6, 0x52, 0xfa, 0xcb, 0x8c, 0x66, 0x42, 0xd1, 0xb1, 0x27, 0x70, 0x82, 0x19, 0xca, 0xe1, + 0xb8, 0x0d, 0xd9, 0x68, 0x96, 0x82, 0xba, 0x03, 0x47, 0x91, 0x26, 0xb3, 0x09, 0x35, 0x4f, 0x9b, 0x60, 0x7b, 0x3d, + 0x05, 0x81, 0x98, 0x01, 0x4d, 0xdf, 0x4f, 0x4e, 0x00, 0xab, 0x40, 0xcb, 0xe5, 0x0f, 0x66, 0x90, 0x72, 0x2b, 0x0b, + 0x15, 0x6d, 0x65, 0x4f, 0xfe, 0x8e, 0xb4, 0x3c, 0xde, 0x69, 0x2a, 0xe8, 0xff, 0xde, 0x27, 0x3b, 0x8d, 0x82, 0x82, + 0x35, 0x4e, 0x15, 0x30, 0x0a, 0x85, 0xaf, 0xd5, 0x40, 0x48, 0x4a, 0xf7, 0x0a, 0xb1, 0xf8, 0xe3, 0x35, 0x3a, 0x1d, + 0x93, 0x1e, 0xe8, 0x19, 0xfe, 0xb8, 0xbf, 0x8d, 0x98, 0x0c, 0x37, 0xf0, 0xc4, 0x7a, 0x5d, 0xc9, 0x34, 0xe6, 0x55, + 0xa6, 0xb1, 0xb2, 0x08, 0x77, 0x5a, 0x74, 0x71, 0x0b, 0x1a, 0xd3, 0xc7, 0xbc, 0xac, 0xc2, 0x4c, 0x02, 0x53, 0x2e, + 0xc9, 0x1a, 0xe2, 0x55, 0x38, 0xa1, 0x99, 0x47, 0x11, 0xde, 0xd6, 0x40, 0x11, 0x27, 0x34, 0xe9, 0x5b, 0x62, 0x33, + 0x03, 0xb1, 0xc9, 0x90, 0xd2, 0xca, 0xaa, 0xc7, 0x2d, 0xc3, 0xb4, 0x97, 0xf5, 0x4b, 0x65, 0xce, 0x5a, 0xbc, 0x94, + 0xc7, 0x9a, 0xba, 0x0d, 0xfe, 0x54, 0x99, 0x42, 0x9a, 0x54, 0x1a, 0x32, 0x84, 0x77, 0x1a, 0xab, 0xfb, 0x68, 0x5a, + 0x95, 0x6b, 0xec, 0xf5, 0x61, 0x1f, 0xa4, 0xb8, 0xf0, 0x59, 0x26, 0xff, 0x56, 0xce, 0x19, 0xa0, 0xed, 0x02, 0xc8, + 0xc2, 0x1f, 0xc6, 0xa1, 0xf0, 0x9a, 0xfb, 0x0d, 0xd0, 0x44, 0xe7, 0x14, 0xa4, 0x09, 0x42, 0xeb, 0x4b, 0xa1, 0xfe, + 0x2c, 0xc9, 0xc6, 0x6c, 0x28, 0xbc, 0x50, 0x48, 0x86, 0x42, 0xe3, 0x8c, 0x3a, 0xa2, 0xa2, 0x0f, 0x4b, 0x66, 0x13, + 0x02, 0xa9, 0x15, 0xca, 0x17, 0x35, 0x90, 0x4a, 0xa6, 0x05, 0xbc, 0xa1, 0xd4, 0xa5, 0x4b, 0x1e, 0x63, 0x5a, 0x33, + 0xd0, 0x17, 0x9b, 0x5d, 0x35, 0x62, 0xa0, 0x59, 0x01, 0xb3, 0x54, 0x56, 0x16, 0xd8, 0xfc, 0x41, 0x17, 0x0a, 0x5f, + 0xf0, 0x17, 0xfc, 0x86, 0xa6, 0xe7, 0x21, 0x00, 0x1f, 0xa8, 0xee, 0xb9, 0x12, 0x03, 0x92, 0xdb, 0x8b, 0xb6, 0xa1, + 0x97, 0x4b, 0xb9, 0xf0, 0x37, 0x29, 0x9f, 0xb0, 0x8c, 0x82, 0xa6, 0xa6, 0xf0, 0x9f, 0xc0, 0x29, 0x93, 0xc7, 0x11, + 0x44, 0x0d, 0x2d, 0xe8, 0xeb, 0xec, 0x45, 0x95, 0xbe, 0x2e, 0x77, 0x9f, 0x8d, 0x0c, 0xfb, 0xab, 0x1e, 0x62, 0x84, + 0x3d, 0x6d, 0x4f, 0x58, 0x52, 0xce, 0x1f, 0x23, 0x2d, 0xde, 0x97, 0x4b, 0x61, 0x99, 0x6d, 0x15, 0x5d, 0x91, 0xaa, + 0x63, 0x83, 0xf2, 0x30, 0x8a, 0x40, 0xab, 0x4b, 0x79, 0x1c, 0x5b, 0x82, 0x0a, 0xb3, 0x76, 0x21, 0x9a, 0x2e, 0x77, + 0x9f, 0x5d, 0xdc, 0x27, 0x9d, 0xa0, 0xde, 0x16, 0x50, 0x06, 0xd0, 0x24, 0xa2, 0x29, 0x98, 0x91, 0xd6, 0x6e, 0x69, + 0x19, 0x7b, 0xce, 0x93, 0x84, 0x0e, 0x04, 0x8d, 0xc0, 0x4a, 0x61, 0x44, 0xf8, 0x63, 0x9e, 0x89, 0xa2, 0xb0, 0x84, + 0x9e, 0x59, 0xd0, 0x33, 0x7f, 0x10, 0xc6, 0xb1, 0xa7, 0x2c, 0x92, 0x09, 0x9f, 0xd3, 0x0d, 0x50, 0xb7, 0x2b, 0x20, + 0x17, 0xc3, 0x50, 0x6b, 0x18, 0xea, 0x67, 0xd3, 0x98, 0x0d, 0x68, 0x21, 0xb8, 0x2e, 0x7c, 0x96, 0x44, 0xf4, 0x16, + 0xf8, 0x08, 0xea, 0x74, 0x3a, 0x0d, 0xdc, 0x44, 0xb9, 0x42, 0xf8, 0x62, 0x0d, 0xb1, 0xf7, 0x88, 0x4c, 0x20, 0x32, + 0xd2, 0x59, 0x6c, 0xe2, 0x07, 0x14, 0x59, 0x72, 0x92, 0x19, 0xcb, 0x4a, 0xf1, 0x66, 0x84, 0x23, 0x1a, 0x53, 0x41, + 0x0d, 0x2f, 0x07, 0xfd, 0x59, 0x1d, 0xdd, 0xb7, 0x05, 0xfe, 0x0a, 0x72, 0x32, 0xa7, 0xcc, 0xec, 0x79, 0x56, 0x58, + 0xea, 0xe5, 0xf6, 0x94, 0xd8, 0xee, 0x0a, 0xb5, 0x3d, 0xa1, 0x10, 0xe1, 0x60, 0xac, 0x4c, 0x74, 0x6f, 0x6d, 0x49, + 0xe5, 0x18, 0x9a, 0xaf, 0x17, 0x87, 0xe8, 0xbd, 0x01, 0x73, 0x13, 0x0a, 0x2e, 0x34, 0x53, 0xa0, 0x60, 0xf5, 0xa9, + 0x6d, 0x3b, 0x0f, 0xe3, 0xf8, 0x3a, 0x1c, 0x7c, 0xac, 0x52, 0x7f, 0x49, 0x06, 0x64, 0x95, 0x1b, 0x5b, 0x55, 0x16, + 0xcb, 0xb2, 0xd7, 0x6d, 0xb8, 0x74, 0xe5, 0xa0, 0x78, 0x3b, 0x8d, 0x92, 0xec, 0xab, 0x1b, 0xbd, 0x95, 0xda, 0x25, + 0x44, 0x4c, 0xaf, 0xcc, 0x03, 0x2e, 0xf0, 0x49, 0x8a, 0x33, 0xfc, 0x40, 0xd3, 0x1d, 0xd8, 0x1a, 0xf9, 0x0a, 0x20, + 0x02, 0x2d, 0xf2, 0x88, 0x65, 0xdb, 0x31, 0xf0, 0x87, 0x40, 0xf9, 0xd4, 0x9a, 0xe1, 0xa1, 0x80, 0x16, 0x3c, 0x4e, + 0xab, 0xcc, 0x05, 0x64, 0x5a, 0x9b, 0x30, 0x8c, 0xe6, 0x5b, 0xd0, 0x5c, 0x24, 0xbd, 0xbf, 0x56, 0x55, 0xa0, 0x93, + 0x01, 0x14, 0x59, 0xdb, 0x56, 0x26, 0x2a, 0x14, 0xa0, 0x79, 0x2a, 0x93, 0x22, 0x37, 0xa9, 0x18, 0x8f, 0x5a, 0x5d, + 0x57, 0xf6, 0xb7, 0x66, 0xb9, 0x9c, 0x78, 0x9e, 0x97, 0x81, 0xfd, 0x66, 0xf4, 0xfa, 0x72, 0x11, 0xd9, 0xda, 0x22, + 0x32, 0xdf, 0x32, 0xb2, 0x50, 0x49, 0xcb, 0x56, 0xf7, 0xe0, 0xaf, 0xc8, 0x6e, 0x04, 0xca, 0xaa, 0x0f, 0xfc, 0x19, + 0x15, 0xec, 0x36, 0x26, 0x02, 0x73, 0x6d, 0xe0, 0x68, 0x4a, 0x03, 0x86, 0x51, 0x76, 0x49, 0x90, 0x3a, 0x1a, 0x15, + 0x63, 0x37, 0xc1, 0x1c, 0xad, 0x68, 0xf6, 0x79, 0xae, 0x71, 0x44, 0x91, 0xde, 0x9b, 0x8a, 0x4a, 0x6c, 0x61, 0x05, + 0x27, 0x44, 0xab, 0xc1, 0x4a, 0xeb, 0x59, 0xc5, 0x4d, 0x31, 0x2e, 0x1c, 0xd4, 0x12, 0x35, 0x15, 0x7d, 0xd2, 0x28, + 0x56, 0x09, 0xc2, 0x63, 0xa3, 0x91, 0xf2, 0x72, 0xdd, 0x84, 0xb8, 0xc6, 0x1b, 0xe1, 0x76, 0x17, 0x15, 0x93, 0x30, + 0xb0, 0x9a, 0xe5, 0x01, 0xb0, 0x54, 0xbe, 0x09, 0xdd, 0x9b, 0x68, 0xa6, 0x32, 0x8e, 0x85, 0x70, 0x6e, 0x23, 0xdc, + 0xc2, 0x6c, 0xa2, 0x38, 0x57, 0xd2, 0x27, 0xe3, 0x6a, 0x5f, 0x8f, 0x62, 0xae, 0xf6, 0x61, 0x0d, 0x89, 0xab, 0x8a, + 0xa7, 0x24, 0x41, 0x30, 0x60, 0x33, 0x50, 0xee, 0x6c, 0xf9, 0xe0, 0x01, 0xec, 0x6c, 0xb9, 0x5c, 0x23, 0xba, 0x8d, + 0xfa, 0x27, 0xf2, 0x4b, 0xa3, 0x70, 0xb9, 0xbc, 0x11, 0xc8, 0xd3, 0x9a, 0x2f, 0xa6, 0xa8, 0x6b, 0x38, 0xee, 0xd9, + 0x0b, 0x68, 0x25, 0x15, 0xd1, 0xb2, 0xa4, 0x30, 0x19, 0xaa, 0x34, 0x5b, 0xdd, 0x27, 0x61, 0xb1, 0xed, 0xf3, 0x35, + 0xee, 0x25, 0x0b, 0xb5, 0x98, 0x2e, 0x97, 0x7c, 0xae, 0x87, 0x66, 0x08, 0xa1, 0x20, 0x93, 0x56, 0xcc, 0xce, 0x26, + 0xc3, 0x72, 0x6f, 0x2f, 0xb3, 0x06, 0xba, 0x2c, 0xd8, 0xc4, 0x07, 0x0f, 0x44, 0x72, 0x76, 0x97, 0x48, 0xdd, 0xe5, + 0x83, 0x11, 0x42, 0x6b, 0x66, 0x69, 0xa3, 0x0d, 0xd6, 0x78, 0x78, 0x13, 0x32, 0xe1, 0x14, 0xa3, 0x28, 0x6b, 0xdc, + 0xa3, 0x68, 0xa1, 0x55, 0x0d, 0x3f, 0xa5, 0xa0, 0x3c, 0x02, 0x4f, 0x30, 0x2a, 0xb4, 0xa2, 0xfb, 0xc1, 0x98, 0x82, + 0x23, 0xd8, 0x68, 0x11, 0x85, 0x5d, 0xb8, 0xa3, 0xa5, 0x88, 0x1e, 0x78, 0x33, 0xec, 0xf9, 0x6a, 0xf7, 0x8a, 0x1d, + 0x30, 0xa5, 0xe9, 0x90, 0xa7, 0x13, 0x53, 0x97, 0xaf, 0x3c, 0x6b, 0xce, 0xc8, 0x86, 0xde, 0xc6, 0xb1, 0xb5, 0xfa, + 0xdf, 0x5e, 0x31, 0xba, 0x4b, 0x73, 0xbd, 0x22, 0x4a, 0x0b, 0xe9, 0xab, 0xfc, 0x81, 0x86, 0x32, 0x33, 0xdb, 0xbc, + 0xd7, 0xce, 0xd4, 0xb6, 0x72, 0x98, 0xec, 0x34, 0xdb, 0x85, 0xcd, 0x67, 0xa8, 0xa1, 0xad, 0x1c, 0x1b, 0x5a, 0xa4, + 0xf2, 0x59, 0x1c, 0x69, 0x60, 0x19, 0xc2, 0x54, 0xd3, 0xd1, 0x0d, 0x8b, 0xe3, 0xb2, 0xf4, 0x73, 0xf8, 0x7a, 0xa6, + 0xf9, 0x7a, 0x62, 0xf8, 0x3a, 0x70, 0x0a, 0xe0, 0xeb, 0x6a, 0xb8, 0xb2, 0x7b, 0xb2, 0x76, 0x3a, 0x13, 0xc5, 0xd1, + 0x33, 0x69, 0x47, 0xc3, 0x7c, 0x33, 0x03, 0x01, 0x2a, 0x34, 0xaf, 0x8f, 0x9e, 0x76, 0xc2, 0x80, 0x01, 0xa8, 0x5c, + 0x98, 0xd4, 0x76, 0x51, 0x7c, 0xf4, 0x10, 0xce, 0x72, 0x5a, 0x50, 0xf6, 0xd9, 0x33, 0x70, 0xd2, 0x59, 0xcb, 0x01, + 0x21, 0x26, 0x8b, 0x3f, 0x4b, 0x89, 0x32, 0xab, 0x63, 0x7a, 0x75, 0x99, 0x59, 0x1d, 0x70, 0xfa, 0x72, 0x75, 0xd1, + 0xfd, 0xbc, 0x5e, 0x2e, 0x8f, 0x15, 0xcb, 0x2b, 0xf7, 0x7b, 0xb9, 0xf4, 0x56, 0x4a, 0xc0, 0x7f, 0xaf, 0x4d, 0x94, + 0xb4, 0x18, 0x1d, 0x78, 0x80, 0x8d, 0x19, 0x28, 0xc8, 0xd5, 0xa2, 0x0b, 0x11, 0xf7, 0xe2, 0x53, 0x0e, 0x1e, 0xe9, + 0xa6, 0x57, 0xfd, 0xcf, 0xf9, 0x64, 0x0a, 0xda, 0xd8, 0x0a, 0x49, 0x8f, 0xa8, 0x9e, 0xb0, 0xac, 0xcf, 0x37, 0x94, + 0x55, 0xfa, 0xc8, 0xf3, 0x58, 0xa1, 0xa6, 0xc2, 0x5e, 0xde, 0x69, 0xe4, 0xb3, 0xa2, 0xa8, 0x60, 0x1c, 0x9b, 0x9c, + 0x2a, 0xe7, 0xab, 0x2e, 0x19, 0x53, 0xf1, 0xda, 0x63, 0x8a, 0x0f, 0x33, 0xe0, 0x75, 0x16, 0xfb, 0x31, 0xe4, 0x6e, + 0xef, 0x7f, 0x5e, 0x22, 0x67, 0x91, 0xaf, 0xa0, 0x6f, 0x91, 0xe7, 0xb7, 0xca, 0xc8, 0xc6, 0xb7, 0xdb, 0xad, 0xe1, + 0xb2, 0x4e, 0x1b, 0x8b, 0xbd, 0x3e, 0xbe, 0x5d, 0x57, 0x1d, 0xc9, 0x62, 0xc2, 0x23, 0x1a, 0xb8, 0x7c, 0x4a, 0x13, + 0x37, 0x07, 0xaf, 0xaa, 0xde, 0xfb, 0x81, 0xf0, 0x16, 0x6f, 0xab, 0xee, 0xd5, 0xe0, 0x36, 0x07, 0xef, 0xd7, 0xd7, + 0xeb, 0x8e, 0xd7, 0xef, 0x69, 0x9a, 0x49, 0x45, 0xb4, 0xd0, 0x69, 0xbf, 0x2e, 0xc5, 0xd2, 0xd7, 0xc1, 0xd6, 0xf6, + 0xa5, 0x09, 0xe2, 0x36, 0xfd, 0x63, 0xff, 0xc0, 0x45, 0xd2, 0x2d, 0xfc, 0x93, 0x3e, 0xf0, 0x1f, 0x8c, 0x5b, 0xf8, + 0x19, 0xf9, 0x50, 0xf5, 0x0a, 0x47, 0x82, 0x3c, 0xeb, 0x3e, 0x33, 0x16, 0x33, 0x8f, 0xd9, 0xe0, 0xce, 0x73, 0x63, + 0x26, 0xea, 0x10, 0x7a, 0x73, 0xf1, 0x42, 0x55, 0x80, 0x4b, 0x51, 0xba, 0xb3, 0x73, 0x63, 0xeb, 0x61, 0x21, 0x88, + 0xbb, 0x1b, 0x33, 0xb1, 0xeb, 0xe2, 0x09, 0xb9, 0x82, 0x1f, 0xbb, 0x0b, 0xef, 0x65, 0x28, 0xc6, 0x7e, 0x1a, 0x26, + 0x11, 0x9f, 0x78, 0xa8, 0xe6, 0xba, 0xc8, 0xcf, 0xa4, 0xbd, 0xf1, 0x18, 0xe5, 0xbb, 0x57, 0xf8, 0x4c, 0x10, 0xb7, + 0xeb, 0xd6, 0x26, 0xf8, 0x95, 0x20, 0x57, 0xa7, 0xbb, 0x8b, 0x33, 0x91, 0x77, 0xae, 0xf0, 0x59, 0xe1, 0xb1, 0xc7, + 0x6f, 0x88, 0x87, 0x48, 0xe7, 0x4c, 0x43, 0x73, 0xce, 0x27, 0xca, 0x73, 0xef, 0x22, 0xfc, 0x1e, 0xe2, 0x2a, 0x69, + 0xc9, 0x6d, 0x74, 0x68, 0x65, 0x87, 0xb8, 0x5c, 0xba, 0x08, 0xdc, 0xbd, 0x3d, 0xab, 0xac, 0x50, 0x15, 0xf0, 0xad, + 0x20, 0x15, 0x83, 0x1c, 0xbf, 0x95, 0x11, 0x9a, 0x5b, 0xe1, 0xa5, 0xc8, 0x0c, 0xe3, 0x19, 0x3f, 0xb4, 0x3e, 0x9a, + 0x69, 0x4f, 0x79, 0x18, 0x7c, 0x26, 0x68, 0x1a, 0x0a, 0x9e, 0xf6, 0x91, 0xad, 0x7e, 0xe0, 0xbf, 0x91, 0xab, 0x9e, + 0xf3, 0x9f, 0xbe, 0xf8, 0x79, 0xf8, 0x73, 0xda, 0xbf, 0xc2, 0xaf, 0xc9, 0xfe, 0xa9, 0xd7, 0x0d, 0xbc, 0x9d, 0x7a, + 0x7d, 0xf9, 0xf3, 0x7e, 0xef, 0x1f, 0x61, 0xfd, 0xd7, 0xb3, 0xfa, 0x4f, 0x7d, 0xb4, 0xf4, 0x7e, 0xde, 0xef, 0xf6, + 0xf4, 0x53, 0xef, 0x1f, 0x9d, 0x9f, 0xb3, 0xfe, 0x9f, 0x55, 0xe1, 0x2e, 0x42, 0xfb, 0x23, 0x3c, 0x13, 0x64, 0xbf, + 0x5e, 0xef, 0xec, 0x8f, 0xf0, 0x54, 0x90, 0x7d, 0xf8, 0x7b, 0x4d, 0xde, 0xd2, 0xd1, 0xb3, 0xdb, 0xa9, 0x77, 0xd5, + 0x59, 0xee, 0x2e, 0xfe, 0x96, 0xc3, 0xa8, 0xbd, 0x7f, 0xfc, 0xfc, 0x73, 0xe6, 0x7e, 0xd5, 0x21, 0xfb, 0xfd, 0x1a, + 0xf2, 0xa0, 0xf4, 0xcf, 0x44, 0xfe, 0xeb, 0x75, 0x83, 0xde, 0x3f, 0x34, 0x14, 0xee, 0x57, 0x3f, 0x5f, 0x9d, 0x76, + 0x48, 0x7f, 0xe9, 0xb9, 0xcb, 0xaf, 0xd0, 0x12, 0xa1, 0xe5, 0x2e, 0xba, 0xc2, 0xee, 0xc8, 0x45, 0x78, 0x24, 0xc8, + 0xfe, 0x57, 0xfb, 0x23, 0x3c, 0x17, 0x64, 0xdf, 0xdd, 0x1f, 0xe1, 0x67, 0x82, 0xec, 0xff, 0xc3, 0xeb, 0x06, 0xca, + 0xc3, 0xb6, 0x94, 0xee, 0x8d, 0x25, 0x04, 0x37, 0xc2, 0x94, 0x86, 0x4b, 0xc1, 0x44, 0x4c, 0xd1, 0xee, 0x3e, 0xc3, + 0x17, 0x12, 0x4d, 0x9e, 0x00, 0x27, 0x0c, 0xd8, 0x76, 0xde, 0xe2, 0x12, 0x36, 0x1b, 0x68, 0x66, 0x37, 0x48, 0xb1, + 0xf2, 0x03, 0x64, 0x81, 0xc0, 0xf3, 0x30, 0x9e, 0xd1, 0x2c, 0xa0, 0x39, 0xc2, 0x03, 0x72, 0x21, 0xbc, 0x26, 0xc2, + 0xcf, 0x05, 0xfc, 0x68, 0x21, 0x7c, 0xa1, 0x03, 0x98, 0x70, 0x90, 0x15, 0x51, 0x25, 0x5c, 0x69, 0x2c, 0x2e, 0xc2, + 0xd3, 0x0d, 0x95, 0x62, 0x0c, 0xde, 0x05, 0x84, 0x87, 0x95, 0x70, 0x27, 0xbe, 0x21, 0x86, 0x24, 0xde, 0xa5, 0x94, + 0xfe, 0x10, 0xc6, 0x1f, 0x69, 0xea, 0x9d, 0xe1, 0x66, 0xeb, 0x31, 0x96, 0x2e, 0xe8, 0x9d, 0x26, 0x6a, 0x17, 0xb1, + 0xaa, 0x73, 0xa1, 0x62, 0x04, 0x20, 0x64, 0xab, 0xbe, 0x18, 0xd8, 0xf1, 0x9d, 0x74, 0xcd, 0x61, 0x95, 0x86, 0x37, + 0x2e, 0xaa, 0xc6, 0x45, 0x59, 0x32, 0x0f, 0x63, 0x16, 0x39, 0x82, 0x4e, 0xa6, 0x71, 0x28, 0xa8, 0xa3, 0xd7, 0xeb, + 0x84, 0x30, 0x90, 0x5b, 0xa8, 0x0c, 0x91, 0x65, 0x70, 0x46, 0x26, 0xe0, 0x04, 0x67, 0xc5, 0x83, 0xe8, 0x94, 0x56, + 0x3b, 0x5e, 0x96, 0xc1, 0xaf, 0xd5, 0xf8, 0x5e, 0xbd, 0x09, 0x8e, 0xb0, 0xbe, 0x14, 0xcf, 0x19, 0x4e, 0x08, 0x08, + 0xd1, 0x56, 0xd7, 0x3d, 0xcd, 0xe6, 0xa3, 0x8e, 0x0b, 0xb1, 0x19, 0x4e, 0x5e, 0x4b, 0xbf, 0x10, 0x34, 0x18, 0x93, + 0x46, 0x7b, 0x7c, 0x4a, 0xdb, 0xe3, 0x5a, 0xcd, 0xe8, 0xd0, 0x31, 0x49, 0x7b, 0x63, 0xd5, 0x3d, 0xc4, 0x11, 0x9e, + 0x91, 0x7a, 0x13, 0x8f, 0x48, 0x43, 0x76, 0x69, 0x8f, 0x4e, 0x63, 0x3d, 0xcd, 0xde, 0x9e, 0xc7, 0xfd, 0x38, 0xcc, + 0xc4, 0x37, 0x60, 0xec, 0x93, 0x11, 0x8e, 0x08, 0xf7, 0xe9, 0x2d, 0x1d, 0x78, 0x31, 0xc2, 0x91, 0xe6, 0x34, 0xa8, + 0x8d, 0x46, 0xc4, 0x6a, 0x06, 0x46, 0x04, 0x79, 0xdd, 0x8d, 0x7a, 0xcd, 0x3e, 0x21, 0xc4, 0xdd, 0xa9, 0xd7, 0xdd, + 0x2e, 0x27, 0x33, 0x11, 0x40, 0x89, 0xa5, 0x2a, 0x93, 0x29, 0x14, 0xb5, 0xac, 0x22, 0xef, 0x99, 0xf0, 0x05, 0xcd, + 0x84, 0x07, 0xc5, 0x60, 0xfe, 0x67, 0x86, 0xb0, 0xdd, 0xd3, 0x7d, 0xb7, 0x06, 0xa5, 0x92, 0x38, 0x11, 0xe6, 0xe4, + 0x1a, 0x05, 0x51, 0xef, 0xa0, 0x6f, 0xf3, 0x7f, 0x59, 0x08, 0x93, 0x5f, 0x77, 0xa3, 0x5e, 0x43, 0x4e, 0xde, 0x71, + 0xbb, 0x1e, 0x27, 0x99, 0x52, 0xd0, 0xba, 0x59, 0xf0, 0x5a, 0x2e, 0x15, 0x05, 0x1a, 0x38, 0x3d, 0xef, 0x8c, 0xd4, + 0x5b, 0x81, 0x37, 0xb3, 0x17, 0x51, 0x87, 0xc9, 0x34, 0x16, 0x70, 0x48, 0xa0, 0x3d, 0xe6, 0x04, 0x66, 0x2c, 0xbb, + 0x5d, 0x07, 0xfa, 0xf9, 0x2b, 0xf7, 0xab, 0xee, 0x5c, 0x04, 0x23, 0xa1, 0xa6, 0x9f, 0x8b, 0xe5, 0x12, 0xfe, 0x8e, + 0x44, 0x97, 0x93, 0x6b, 0x59, 0x34, 0xd3, 0x45, 0x53, 0x28, 0x7a, 0x1d, 0x00, 0xa8, 0x38, 0x2b, 0x94, 0x2c, 0xb5, + 0x27, 0x73, 0x22, 0x61, 0xdf, 0xdb, 0x4b, 0x7b, 0xe3, 0x5a, 0xb3, 0x0f, 0xfe, 0xfd, 0x54, 0x64, 0x3f, 0x30, 0x31, + 0xf6, 0xdc, 0xfd, 0x8e, 0x8b, 0xba, 0xae, 0x03, 0x5b, 0xdb, 0x4e, 0x6a, 0x44, 0x61, 0x38, 0xae, 0xbd, 0x12, 0xc1, + 0xac, 0x43, 0x1a, 0x5d, 0x8f, 0x69, 0x7f, 0x1e, 0xc2, 0xb1, 0x66, 0x9c, 0x0d, 0x3c, 0x43, 0x35, 0x21, 0x6a, 0xe6, + 0x79, 0x86, 0x6a, 0x93, 0xda, 0x1c, 0x05, 0x71, 0x6d, 0x52, 0xf3, 0x66, 0x84, 0x90, 0x7a, 0xab, 0xe8, 0x66, 0xa4, + 0xdf, 0x18, 0x05, 0x73, 0xe3, 0xec, 0xec, 0xc9, 0xe3, 0x90, 0xd4, 0xbc, 0xb4, 0x47, 0xfb, 0xcb, 0xa5, 0x7b, 0xda, + 0xed, 0xb8, 0xa8, 0xe6, 0x19, 0x42, 0xdb, 0x37, 0x94, 0x86, 0x10, 0x66, 0xfd, 0x5c, 0x87, 0x92, 0xde, 0x55, 0xc2, + 0x46, 0x8b, 0xf2, 0xb0, 0x5b, 0x3c, 0x80, 0xe6, 0x85, 0x1d, 0xa3, 0xf4, 0xd5, 0x29, 0x2c, 0xd3, 0x10, 0x73, 0x42, + 0x1a, 0x98, 0x13, 0xe3, 0xbb, 0x1e, 0x13, 0x51, 0x12, 0x7c, 0x4c, 0xca, 0xe6, 0xb8, 0x17, 0xe2, 0xa8, 0x4f, 0x5e, + 0x2a, 0x7b, 0xa4, 0x6d, 0xfc, 0xe2, 0x34, 0x26, 0xef, 0x56, 0xa2, 0xb7, 0x21, 0xc4, 0x56, 0x6e, 0xfc, 0xc1, 0x2c, + 0x4d, 0x69, 0x22, 0x5e, 0xf1, 0x48, 0xab, 0x69, 0x34, 0x06, 0x4b, 0x09, 0xc2, 0xb2, 0x18, 0x74, 0xb4, 0x96, 0x39, + 0x19, 0xb3, 0xb5, 0xea, 0x11, 0x99, 0x29, 0xf5, 0x49, 0x06, 0x6b, 0xdb, 0x23, 0x6d, 0x17, 0x7b, 0x08, 0xcf, 0x74, + 0x14, 0xd7, 0xf3, 0x7d, 0x7f, 0xe4, 0x0f, 0xa0, 0x1a, 0x26, 0xc8, 0x50, 0x2e, 0xcf, 0x91, 0x97, 0x91, 0x1b, 0x3f, + 0xa1, 0xb7, 0x72, 0x56, 0x0f, 0x95, 0x92, 0xd9, 0x1c, 0xaf, 0xd3, 0x71, 0x5b, 0xb2, 0x9b, 0xcc, 0x4f, 0x78, 0x44, + 0x01, 0x3d, 0x10, 0xb7, 0xd7, 0x45, 0xe3, 0x30, 0xb3, 0xe3, 0x53, 0x25, 0x7c, 0x3d, 0xdb, 0x79, 0x3d, 0x02, 0x8f, + 0xaf, 0xd4, 0xb5, 0x8a, 0xc6, 0xca, 0x0d, 0x8e, 0x10, 0x1b, 0x7a, 0x23, 0x1f, 0xe2, 0x7a, 0x92, 0x84, 0x04, 0x98, + 0x72, 0x23, 0x9b, 0xa8, 0x26, 0xc5, 0x98, 0x73, 0x12, 0xf5, 0x78, 0xad, 0x26, 0xbd, 0xd0, 0x33, 0x45, 0x12, 0x23, + 0x84, 0xe7, 0xc5, 0xd9, 0x32, 0xed, 0x5e, 0x0b, 0x52, 0x9d, 0xca, 0x9b, 0x57, 0xdd, 0xb9, 0x35, 0x21, 0x90, 0xf4, + 0x14, 0x0a, 0x6f, 0x82, 0xf0, 0x13, 0xb2, 0xef, 0xf5, 0xfc, 0xee, 0x5f, 0xfa, 0xa8, 0xeb, 0xf9, 0x7f, 0x46, 0xfb, + 0x8a, 0x73, 0xcc, 0x51, 0x3b, 0x56, 0x73, 0x2c, 0x64, 0xfc, 0xb2, 0x89, 0xa5, 0x27, 0x31, 0x48, 0x70, 0x12, 0x4e, + 0x68, 0xf0, 0x04, 0x0e, 0xb9, 0x21, 0x9c, 0xd7, 0x02, 0x03, 0x25, 0x05, 0x4f, 0x34, 0x2f, 0xf1, 0xdd, 0xee, 0x0b, + 0x51, 0x3c, 0x75, 0xdd, 0xee, 0x87, 0xf2, 0xe9, 0x2f, 0x6e, 0xf7, 0x1b, 0x11, 0xfc, 0x9a, 0x6b, 0x6f, 0x77, 0x65, + 0x8e, 0x63, 0x33, 0x47, 0xae, 0xb6, 0xc6, 0xc2, 0xdd, 0x0c, 0xad, 0x3b, 0x3a, 0x46, 0x28, 0x67, 0xc3, 0x82, 0x19, + 0x65, 0xbe, 0x08, 0x47, 0x80, 0x54, 0x6b, 0x0f, 0x32, 0x3b, 0xae, 0x5f, 0xae, 0x18, 0x48, 0xc5, 0xd0, 0x2b, 0x20, + 0x73, 0xd4, 0x69, 0xa0, 0x45, 0xa5, 0xad, 0xd4, 0x99, 0xaa, 0x71, 0xf4, 0x82, 0x4f, 0xcf, 0x49, 0xa3, 0x3d, 0x3f, + 0x1d, 0xb5, 0xe7, 0xb5, 0x1a, 0xca, 0x0c, 0x69, 0xcd, 0x7a, 0xf3, 0x3e, 0x7e, 0x03, 0x4e, 0x3d, 0x9b, 0x96, 0x70, + 0x65, 0x79, 0x2d, 0xbd, 0xbc, 0x5a, 0x2d, 0xc9, 0x51, 0xdb, 0xea, 0x3a, 0x52, 0x5d, 0xf3, 0x5c, 0xe1, 0x64, 0x95, + 0xd4, 0x4e, 0x90, 0x2c, 0x81, 0x64, 0x28, 0x42, 0xc8, 0x99, 0x40, 0x1b, 0x47, 0x85, 0x31, 0xa1, 0xbb, 0x3c, 0xb3, + 0xc0, 0x3e, 0x95, 0x94, 0xf0, 0x00, 0x0b, 0xd0, 0xb5, 0xf0, 0x04, 0x4f, 0xf0, 0xac, 0xd6, 0x94, 0x64, 0x5e, 0x6f, + 0xb6, 0xab, 0x63, 0x3d, 0x2a, 0xc7, 0xc2, 0xb3, 0x1a, 0x99, 0x14, 0x58, 0xca, 0x93, 0x5a, 0x2d, 0xaf, 0x06, 0x3b, + 0xcd, 0xc9, 0xad, 0x04, 0x20, 0xce, 0x56, 0x93, 0x32, 0x8c, 0x84, 0x2d, 0x65, 0x2a, 0xf3, 0x59, 0x92, 0xd0, 0x14, + 0xa4, 0x28, 0x11, 0x98, 0xe5, 0x79, 0x29, 0xd9, 0x41, 0x8c, 0x62, 0x4a, 0x52, 0xe0, 0x3c, 0xd2, 0xee, 0xc2, 0x09, + 0xe6, 0x78, 0x2c, 0xf9, 0x06, 0x21, 0xe4, 0xc2, 0xa4, 0xb3, 0x08, 0xc9, 0x83, 0x62, 0xc2, 0x2c, 0x99, 0x94, 0x11, + 0xea, 0x5f, 0xee, 0x9e, 0xf3, 0x7b, 0x6d, 0xb2, 0x1e, 0xeb, 0x07, 0xb2, 0x59, 0xac, 0x39, 0x57, 0x48, 0xde, 0x7b, + 0x02, 0x15, 0xd1, 0x11, 0x5f, 0x32, 0xc0, 0xa7, 0x2c, 0xa5, 0x52, 0x07, 0xdf, 0x35, 0x76, 0x5f, 0x5c, 0x55, 0x20, + 0x63, 0xdb, 0x7b, 0x03, 0x88, 0x0c, 0xc1, 0xb9, 0x93, 0x90, 0xb5, 0x66, 0x97, 0xbb, 0x67, 0xaf, 0x37, 0xd9, 0xc0, + 0xcb, 0xa5, 0xb6, 0x7e, 0xa5, 0x6e, 0x83, 0xc3, 0x12, 0xd2, 0x58, 0xff, 0x08, 0xbc, 0x58, 0xaa, 0x48, 0xa1, 0x97, + 0x02, 0x15, 0x5d, 0xee, 0x9e, 0xbd, 0xf3, 0x52, 0xe9, 0x5b, 0x42, 0xd8, 0x5e, 0xb6, 0xc7, 0x89, 0x37, 0x26, 0x14, + 0xa9, 0xb5, 0x17, 0xac, 0x8b, 0x5b, 0x02, 0x3c, 0x18, 0xcb, 0x4a, 0xb0, 0x20, 0x7a, 0xac, 0x4f, 0x62, 0x8d, 0x01, + 0x12, 0x23, 0x1c, 0x57, 0xec, 0x32, 0x02, 0x1b, 0x20, 0xe7, 0xba, 0x80, 0x9d, 0xf0, 0x95, 0xea, 0x87, 0x70, 0x2c, + 0x67, 0x15, 0xb9, 0x12, 0x1e, 0x4f, 0xd6, 0xb2, 0xd2, 0x4a, 0x73, 0xf4, 0x7b, 0xb0, 0x9d, 0xcc, 0xc3, 0x2b, 0x62, + 0x2c, 0x09, 0x5d, 0xf0, 0xd4, 0xa4, 0x8f, 0x5d, 0xee, 0x9e, 0xbd, 0xd4, 0x19, 0x64, 0xd3, 0xd0, 0xf0, 0xfb, 0x35, + 0x13, 0xf3, 0xec, 0xa5, 0x5f, 0xd6, 0xca, 0xc6, 0x97, 0xbb, 0x67, 0xef, 0x37, 0x35, 0x83, 0xf2, 0x7c, 0x56, 0xda, + 0xf8, 0x12, 0xbe, 0x05, 0x8d, 0x83, 0x85, 0x16, 0x0e, 0x01, 0xcb, 0xb1, 0x14, 0x48, 0x41, 0x96, 0x17, 0xae, 0x91, + 0xa7, 0x38, 0x21, 0x32, 0x0c, 0x54, 0xdd, 0x35, 0xad, 0xe6, 0x31, 0x9e, 0x5c, 0x0c, 0xf8, 0x94, 0x6e, 0x89, 0x0d, + 0x9d, 0x21, 0x9f, 0x4d, 0x20, 0x75, 0x46, 0x82, 0xce, 0xf0, 0x4e, 0x03, 0xb5, 0xab, 0xe2, 0x2b, 0x91, 0x44, 0xca, + 0x2b, 0xb2, 0x05, 0x8f, 0x49, 0x03, 0xc7, 0xa4, 0x81, 0x43, 0x92, 0xf5, 0x1a, 0x4a, 0x40, 0xb4, 0xc3, 0x62, 0x5c, + 0x25, 0x66, 0x20, 0x2b, 0x4c, 0x9f, 0x56, 0x25, 0x80, 0xa3, 0x76, 0x28, 0x7d, 0x8f, 0x52, 0xa6, 0x47, 0x92, 0x2c, + 0xde, 0x7a, 0x1c, 0x73, 0x39, 0xf0, 0x05, 0xbb, 0x8e, 0x21, 0xb1, 0x04, 0x56, 0x85, 0x05, 0x0a, 0x8a, 0xa6, 0x4d, + 0xdd, 0x34, 0xf4, 0xe5, 0x3e, 0x71, 0x1c, 0xfa, 0xc0, 0xb9, 0x71, 0xa8, 0xf3, 0x70, 0xb2, 0xf5, 0x2e, 0xc7, 0x7b, + 0x7b, 0x9e, 0xea, 0xf4, 0x8b, 0xf0, 0xb8, 0xa9, 0x2f, 0x23, 0x77, 0xdf, 0x2b, 0x5e, 0x11, 0x21, 0x09, 0x7f, 0xad, + 0x16, 0xf7, 0x73, 0x08, 0x43, 0x7b, 0x61, 0x15, 0x83, 0x06, 0x78, 0xa9, 0xeb, 0x55, 0x97, 0x5f, 0xab, 0x15, 0x51, + 0xda, 0x2a, 0xb6, 0xce, 0x70, 0x92, 0xcf, 0xbd, 0x22, 0xf5, 0xa7, 0xb1, 0x96, 0x2f, 0x65, 0x40, 0x40, 0xcc, 0xa6, + 0x59, 0x66, 0x16, 0x63, 0x1d, 0x09, 0x06, 0xed, 0xbe, 0xd1, 0x59, 0x0b, 0x58, 0x66, 0x57, 0xe9, 0x46, 0x86, 0x9d, + 0xb5, 0x50, 0x60, 0x1a, 0x41, 0x54, 0x0a, 0x1a, 0xd5, 0x72, 0x4d, 0xde, 0x6f, 0xd7, 0x73, 0x2e, 0x71, 0x86, 0xb4, + 0x93, 0x4b, 0x42, 0x21, 0x91, 0xd5, 0x2a, 0x90, 0xf2, 0x9c, 0x4c, 0xb7, 0x93, 0xfc, 0x99, 0x45, 0xf2, 0x4f, 0x08, + 0xb5, 0xc8, 0x5f, 0xb9, 0x38, 0x7c, 0xae, 0x9d, 0x0b, 0x99, 0xa9, 0x3a, 0x9f, 0x12, 0x70, 0xa2, 0x55, 0x31, 0x5a, + 0x09, 0x2b, 0x6e, 0x61, 0x28, 0xf6, 0x09, 0x91, 0x6e, 0x48, 0x6c, 0x62, 0xc0, 0x5e, 0x19, 0x54, 0x83, 0xa9, 0x37, + 0xf9, 0xf4, 0x6c, 0x0e, 0x78, 0xf6, 0xfe, 0xfe, 0x78, 0xe8, 0xf9, 0x74, 0xfd, 0xe4, 0x5a, 0xb9, 0x9f, 0xb0, 0x6a, + 0xeb, 0xe0, 0x56, 0x33, 0x41, 0x61, 0xfe, 0x22, 0x8e, 0x5d, 0x65, 0x3e, 0x2b, 0x87, 0xd0, 0xc8, 0x3f, 0x80, 0xb6, + 0xd9, 0x94, 0x2d, 0xa8, 0x35, 0x2c, 0xf0, 0x23, 0x95, 0x81, 0x1a, 0xa6, 0x5b, 0xd8, 0xc7, 0x99, 0x6c, 0x40, 0x93, + 0x68, 0x73, 0xf5, 0x93, 0x5c, 0x93, 0x89, 0x02, 0x0d, 0x2d, 0x80, 0xff, 0x29, 0x92, 0x07, 0xba, 0x91, 0x72, 0x01, + 0x10, 0x34, 0x95, 0x78, 0x2a, 0x11, 0xe6, 0xba, 0xa5, 0xf7, 0xfd, 0xf9, 0x0e, 0x21, 0xd3, 0xd2, 0xfb, 0xf8, 0xb6, + 0x4c, 0xbd, 0x02, 0xb2, 0x40, 0x01, 0x98, 0x8f, 0x45, 0x81, 0x0a, 0x5f, 0x5e, 0x98, 0xe6, 0xd2, 0x84, 0xf4, 0x4b, + 0x8d, 0xdb, 0x0a, 0x6d, 0x4a, 0xb7, 0x9c, 0xaa, 0x37, 0x68, 0x58, 0xa9, 0xdd, 0x85, 0xda, 0xb7, 0x42, 0xc2, 0x08, + 0xcf, 0xef, 0x64, 0x6b, 0x33, 0x6e, 0xfe, 0x71, 0x35, 0x7f, 0x65, 0x65, 0x53, 0x7c, 0x96, 0x64, 0x34, 0x15, 0x4f, + 0xe8, 0x90, 0xa7, 0x10, 0xb3, 0x28, 0x70, 0x82, 0xf2, 0x5d, 0xcb, 0x6f, 0x27, 0xd7, 0x67, 0x05, 0x0a, 0x56, 0x16, + 0x28, 0x7f, 0x7d, 0x94, 0x41, 0xeb, 0xcb, 0xd5, 0x5e, 0xd3, 0xbd, 0xbd, 0xf7, 0x25, 0x9a, 0x34, 0x94, 0x12, 0x0a, + 0x8b, 0x69, 0x29, 0x95, 0x46, 0x47, 0x72, 0x77, 0xbd, 0xc2, 0x09, 0x60, 0x18, 0x86, 0xcd, 0x7b, 0x9e, 0x13, 0x91, + 0x8f, 0x56, 0x59, 0xbc, 0x76, 0x4e, 0x30, 0xdb, 0x70, 0x01, 0x0e, 0x0f, 0xa6, 0xb6, 0xf2, 0x16, 0x65, 0x65, 0x32, + 0x6c, 0x01, 0xc3, 0x39, 0x20, 0xcb, 0x93, 0x66, 0x88, 0x45, 0x81, 0x1b, 0xcd, 0x92, 0x73, 0xd0, 0x2b, 0xc7, 0x38, + 0xf3, 0xc7, 0x90, 0xfe, 0x5a, 0x39, 0xb2, 0x08, 0x61, 0x95, 0x98, 0x63, 0xa5, 0x12, 0x9c, 0x3d, 0xdf, 0xe4, 0x52, + 0x36, 0x44, 0x4d, 0xa5, 0xd4, 0x91, 0x2d, 0x50, 0xd1, 0xc1, 0x9f, 0x7b, 0x4c, 0x2b, 0x6e, 0x26, 0x6e, 0x06, 0x0c, + 0xf8, 0x89, 0xf0, 0x54, 0x30, 0x0a, 0x64, 0x06, 0xf7, 0x67, 0x5e, 0x65, 0xea, 0x36, 0x97, 0xdd, 0xb0, 0x46, 0xdc, + 0xd8, 0x46, 0x13, 0x97, 0x71, 0xbd, 0xf3, 0x92, 0x97, 0x0e, 0x55, 0x06, 0xb5, 0x30, 0x5c, 0xb0, 0x4c, 0x24, 0xb1, + 0x96, 0x3f, 0x54, 0x49, 0xd1, 0x45, 0x23, 0x4c, 0x25, 0x18, 0xef, 0xe4, 0x1e, 0xd0, 0x1c, 0xfe, 0x2e, 0x6e, 0x85, + 0xb5, 0xa3, 0xc6, 0x89, 0x2d, 0xe7, 0xb4, 0xa4, 0xfe, 0x5b, 0x48, 0x75, 0x59, 0x3d, 0xf3, 0xcf, 0xa5, 0x2c, 0x64, + 0x38, 0xab, 0x30, 0xf6, 0x44, 0x32, 0x76, 0x04, 0x7a, 0x9a, 0x49, 0xfc, 0xee, 0xea, 0x8c, 0x17, 0xa6, 0xa5, 0x9c, + 0x26, 0xb1, 0x37, 0x45, 0xb4, 0xdc, 0xfa, 0xbd, 0xb2, 0x1b, 0x01, 0x23, 0x90, 0x05, 0x84, 0x35, 0x67, 0x4f, 0x10, + 0xce, 0x6a, 0xb5, 0x76, 0x76, 0x4a, 0x4b, 0x27, 0x49, 0x09, 0x23, 0x83, 0x80, 0x2e, 0x10, 0x7c, 0x45, 0x86, 0x42, + 0xc8, 0xdf, 0x64, 0x66, 0x67, 0xe0, 0x6b, 0x3f, 0x7b, 0xeb, 0xd9, 0x5c, 0xcd, 0x6e, 0x5b, 0x04, 0x4d, 0x61, 0x3d, + 0x5e, 0x19, 0x70, 0x79, 0x73, 0x7f, 0x82, 0x07, 0xc0, 0xbd, 0xd3, 0xc4, 0x90, 0x8a, 0x86, 0xda, 0x42, 0xb1, 0x84, + 0xe2, 0xf4, 0xb5, 0x51, 0x99, 0x95, 0x68, 0x4f, 0xd6, 0x16, 0xa5, 0x31, 0x2b, 0x48, 0x96, 0xe7, 0x19, 0x2d, 0xc3, + 0xfb, 0x2b, 0xe9, 0x97, 0x52, 0xb8, 0xac, 0x7b, 0xdb, 0xcf, 0xa7, 0x44, 0x60, 0x8b, 0x50, 0xdf, 0x6c, 0x8b, 0x7d, + 0x94, 0x60, 0xc2, 0xb9, 0xd6, 0x42, 0xf1, 0xd7, 0x4d, 0x42, 0x11, 0x27, 0xfa, 0xc8, 0x4b, 0x81, 0xd8, 0x7c, 0x80, + 0x40, 0xd4, 0x6e, 0x76, 0x23, 0x13, 0x41, 0x1d, 0xa9, 0xc8, 0xc4, 0xea, 0x96, 0x92, 0x04, 0x33, 0xbd, 0x1b, 0x9d, + 0xd6, 0x72, 0xc9, 0x7a, 0x0d, 0x70, 0x23, 0xb9, 0x2e, 0xfc, 0x6c, 0xaa, 0x9f, 0x16, 0x27, 0x56, 0x6e, 0x60, 0x8f, + 0x15, 0x26, 0x0b, 0xf2, 0x21, 0xc1, 0xd9, 0x93, 0x49, 0x59, 0x92, 0xa6, 0x35, 0x05, 0x69, 0x02, 0x27, 0xac, 0x08, + 0x33, 0x01, 0xc4, 0x52, 0x56, 0x68, 0x03, 0xd2, 0xdb, 0x98, 0xfb, 0x67, 0xcc, 0xcb, 0x4f, 0x6b, 0xa2, 0x15, 0xb9, + 0xa2, 0xd4, 0x87, 0x4a, 0xbe, 0x81, 0x86, 0x40, 0xeb, 0x87, 0x3b, 0xd2, 0x04, 0x2d, 0x45, 0x39, 0xb2, 0xe5, 0x10, + 0x6e, 0x80, 0x13, 0x6d, 0xe7, 0xbd, 0x8a, 0xf0, 0x6e, 0x90, 0x26, 0x98, 0x5b, 0x74, 0xfd, 0x9c, 0x88, 0x0a, 0x2b, + 0x19, 0x13, 0x6d, 0x29, 0xe1, 0x50, 0x92, 0xa9, 0x20, 0x49, 0xaf, 0xd1, 0x07, 0x05, 0xb4, 0x1d, 0x9f, 0x26, 0xa5, + 0x09, 0x1c, 0xd7, 0x6a, 0x28, 0x34, 0xb3, 0x8e, 0x7b, 0xac, 0x16, 0xf7, 0x31, 0xc5, 0xb1, 0x32, 0x4c, 0x2e, 0xf6, + 0xf6, 0xbc, 0xb0, 0x9c, 0xb7, 0x17, 0xf7, 0x11, 0xe6, 0xcb, 0xa5, 0x27, 0xc1, 0x0a, 0xd1, 0x72, 0x19, 0xda, 0x60, + 0xc9, 0x6a, 0xe8, 0x36, 0xed, 0x0a, 0x32, 0x95, 0x02, 0x70, 0x0a, 0x10, 0xd6, 0x88, 0x17, 0x6a, 0xf7, 0x5e, 0x08, + 0xee, 0xa8, 0x5a, 0xd2, 0x8b, 0x6b, 0xcd, 0xbe, 0xc5, 0xb8, 0x7a, 0x71, 0x9f, 0x84, 0x39, 0xdf, 0xdb, 0xdb, 0xc9, + 0xb4, 0x88, 0xfc, 0x00, 0xa2, 0xec, 0x83, 0x94, 0x2c, 0x6a, 0x40, 0x7b, 0x37, 0x56, 0x9d, 0x01, 0x05, 0x45, 0xe9, + 0x6d, 0x35, 0xed, 0x2a, 0x59, 0x10, 0x45, 0x23, 0xac, 0x83, 0xc1, 0x5d, 0xb0, 0xec, 0x0b, 0x32, 0x7f, 0x21, 0x8a, + 0x1c, 0xeb, 0x5f, 0x37, 0x66, 0x56, 0xfb, 0xbe, 0x1f, 0xa6, 0x23, 0x19, 0xcb, 0x30, 0x61, 0x58, 0x49, 0xfc, 0x07, + 0x1a, 0x4c, 0x6b, 0xe2, 0x5e, 0x31, 0x57, 0x9f, 0x28, 0xf0, 0x8d, 0x6a, 0x63, 0xee, 0x92, 0x3c, 0xdd, 0xe8, 0x65, + 0x50, 0x90, 0x7c, 0xf8, 0xad, 0x90, 0x1c, 0x6a, 0x48, 0x14, 0x79, 0xac, 0xe0, 0x6c, 0x0b, 0x2e, 0x9e, 0x8a, 0x15, + 0x9c, 0x6d, 0xc7, 0xad, 0xc1, 0xd4, 0x37, 0xdb, 0xe0, 0xb3, 0x78, 0x83, 0x02, 0xb4, 0x2c, 0xb0, 0xa0, 0x3c, 0x5a, + 0xd5, 0xbd, 0x14, 0x2b, 0x05, 0x61, 0x2a, 0x88, 0xc7, 0xaa, 0x07, 0xa0, 0xd4, 0x46, 0x2d, 0xc3, 0x97, 0x05, 0x53, + 0x64, 0xb9, 0x04, 0xaa, 0xa9, 0x2b, 0x40, 0x4e, 0xda, 0xdb, 0x3e, 0xdd, 0xdb, 0x03, 0xdb, 0x00, 0x94, 0x38, 0x7f, + 0x10, 0x4e, 0xc5, 0x2c, 0x05, 0x55, 0x2a, 0x33, 0xbf, 0xa1, 0x18, 0x6e, 0x81, 0xc8, 0x32, 0xf8, 0x01, 0x05, 0xd3, + 0x30, 0xcb, 0xd8, 0x5c, 0x95, 0xe9, 0xdf, 0x98, 0x13, 0x43, 0xca, 0x99, 0xd2, 0x09, 0x13, 0xd4, 0x4e, 0x34, 0x9d, + 0x56, 0xd1, 0xf6, 0x6c, 0x4e, 0x13, 0xf1, 0x82, 0x65, 0x82, 0x26, 0xb0, 0xfc, 0x92, 0xe2, 0x60, 0x45, 0x19, 0x82, + 0x03, 0x5b, 0xe9, 0x15, 0x46, 0xd1, 0xbd, 0x5d, 0x44, 0x55, 0x07, 0x1a, 0x87, 0x49, 0x14, 0xab, 0x49, 0xec, 0x7c, + 0x46, 0x93, 0xc3, 0x59, 0xb4, 0xb4, 0xf3, 0x69, 0x4a, 0x65, 0x43, 0x72, 0x77, 0x8f, 0x11, 0x23, 0x09, 0x8c, 0xf4, + 0xbc, 0x57, 0x6b, 0x81, 0x88, 0xf7, 0x96, 0x4d, 0xb0, 0x57, 0x82, 0x85, 0xc5, 0x51, 0xfd, 0x2a, 0x9c, 0x86, 0x6e, + 0x7e, 0xd9, 0x78, 0xa5, 0x6d, 0x93, 0x70, 0x90, 0x74, 0x72, 0xbc, 0xdd, 0xb2, 0x7a, 0x69, 0x24, 0x87, 0x91, 0x16, + 0xec, 0xa1, 0x8c, 0x19, 0x2d, 0x0c, 0x79, 0x21, 0x73, 0x14, 0x77, 0x05, 0xf9, 0x00, 0x77, 0x86, 0x9e, 0x8b, 0x49, + 0xbc, 0x72, 0x35, 0xa6, 0xbd, 0x5b, 0x68, 0xff, 0xbb, 0xc2, 0x7b, 0x87, 0xdf, 0x42, 0x60, 0xf7, 0xa7, 0xb2, 0xf9, + 0x7a, 0x40, 0xf7, 0xa7, 0x12, 0x41, 0x3f, 0x05, 0x6b, 0xed, 0xac, 0x40, 0x6e, 0xcb, 0x3f, 0xf1, 0x1b, 0xae, 0xd1, + 0x96, 0x7e, 0x55, 0x61, 0x24, 0x95, 0x69, 0x29, 0xcf, 0x03, 0x2e, 0xf3, 0xd4, 0x20, 0x5f, 0xae, 0x6a, 0x21, 0x51, + 0x9d, 0x61, 0xa8, 0x74, 0xf8, 0x6d, 0xdb, 0xa3, 0x65, 0x4c, 0xa2, 0xec, 0x8c, 0x37, 0x61, 0x2a, 0x76, 0xe1, 0x94, + 0xf1, 0xb5, 0x7b, 0x78, 0x63, 0x02, 0x1e, 0xb4, 0x87, 0x4d, 0x61, 0x19, 0xdb, 0x99, 0xba, 0x07, 0x64, 0x8f, 0x4f, + 0xb8, 0xd1, 0xdd, 0xaa, 0x56, 0xc6, 0x1b, 0xb0, 0xff, 0x11, 0x1e, 0x9b, 0xcb, 0x71, 0x54, 0x73, 0x60, 0x1a, 0x2c, + 0xf2, 0xc2, 0x29, 0xc0, 0x95, 0xf2, 0x96, 0x22, 0xcc, 0x73, 0x19, 0xe0, 0xfe, 0x16, 0x7f, 0xa7, 0x59, 0xe2, 0xb0, + 0xe0, 0x38, 0xb7, 0x0f, 0xe5, 0x88, 0x0a, 0xfc, 0x22, 0x7e, 0x0f, 0x74, 0x2c, 0x29, 0x34, 0x37, 0x54, 0xf4, 0x94, + 0xeb, 0x85, 0x6c, 0x4d, 0x4b, 0xc5, 0xb4, 0x48, 0xa9, 0x91, 0xd3, 0x6c, 0xc8, 0xe3, 0x34, 0x56, 0xb6, 0x28, 0x4e, + 0x55, 0x65, 0x5e, 0xb4, 0x05, 0x8b, 0x65, 0x68, 0x71, 0xb9, 0xf4, 0xaa, 0xa8, 0x26, 0xcc, 0x8a, 0x64, 0x20, 0xcc, + 0xac, 0x8c, 0x8a, 0x8a, 0x66, 0xad, 0xfa, 0x78, 0x68, 0x35, 0xa1, 0xc8, 0xe8, 0xe6, 0x15, 0x38, 0x6c, 0x17, 0x82, + 0xea, 0x6e, 0xfb, 0x14, 0xb0, 0x5a, 0x5d, 0x31, 0x91, 0x85, 0xa1, 0x5f, 0x8b, 0x54, 0xd9, 0x32, 0xa7, 0x75, 0x03, + 0x7e, 0xd1, 0x3d, 0xc9, 0xb2, 0x1a, 0x75, 0xeb, 0xf5, 0x56, 0xb2, 0xd1, 0x53, 0xbe, 0x2d, 0xd9, 0xa8, 0xa2, 0xed, + 0xee, 0x34, 0xd0, 0xfd, 0x69, 0xa9, 0x6a, 0xae, 0xcd, 0x4d, 0x7e, 0xc3, 0x74, 0x4d, 0xa0, 0x4d, 0x85, 0x66, 0xc3, + 0x55, 0x2e, 0xf2, 0x7c, 0x58, 0x5c, 0x26, 0x90, 0xb9, 0x3b, 0x43, 0x45, 0xff, 0xda, 0x6a, 0x94, 0xd7, 0x71, 0xbd, + 0x6f, 0xc9, 0x28, 0xe6, 0xd7, 0x61, 0xfc, 0x0e, 0xe6, 0x2b, 0x2b, 0x9f, 0xdf, 0x45, 0x69, 0x28, 0xa8, 0xe6, 0x2e, + 0x25, 0x0c, 0xdf, 0x5a, 0x30, 0x7c, 0xab, 0xf8, 0x74, 0xd9, 0x1f, 0x2f, 0x5e, 0x14, 0x03, 0x04, 0xc3, 0xdc, 0xb0, + 0x8c, 0x4b, 0xb1, 0x79, 0x8e, 0x55, 0x16, 0x76, 0x59, 0xb0, 0xb0, 0x4b, 0xe1, 0xad, 0x0e, 0xe5, 0x79, 0xdf, 0x6d, + 0x1e, 0x65, 0x9d, 0xb3, 0x7d, 0x57, 0x1e, 0xfc, 0xef, 0x82, 0x7b, 0xfb, 0x58, 0x5c, 0xee, 0xc0, 0x3f, 0x90, 0xe9, + 0x2a, 0x0a, 0xe4, 0xe7, 0x90, 0x76, 0x20, 0x48, 0xc7, 0xba, 0x73, 0x50, 0xca, 0x29, 0x93, 0x08, 0xe4, 0x0d, 0x66, + 0x99, 0xe0, 0x13, 0x3d, 0x66, 0xa6, 0xaf, 0x19, 0xc9, 0x4a, 0x70, 0x45, 0xcb, 0x68, 0x7b, 0x50, 0xbd, 0xc8, 0xb5, + 0xf8, 0xc8, 0x92, 0x28, 0xc8, 0xb0, 0x96, 0x22, 0x59, 0x90, 0xe4, 0xc4, 0x24, 0x1b, 0xaf, 0xd7, 0xe1, 0x21, 0x4b, + 0x58, 0x36, 0xa6, 0xa9, 0xc7, 0xd1, 0x62, 0xdb, 0x64, 0x1c, 0x02, 0x32, 0x6a, 0x32, 0xfc, 0x7d, 0x79, 0xe1, 0xcf, + 0x87, 0xd1, 0xc0, 0x0f, 0x34, 0xa1, 0x62, 0xcc, 0x23, 0x48, 0x4c, 0xf1, 0xa3, 0xe2, 0x46, 0xd3, 0xde, 0xde, 0x8e, + 0xe7, 0x4a, 0xb7, 0x04, 0x5c, 0xfd, 0xb6, 0x6b, 0x50, 0x77, 0x01, 0xd7, 0x73, 0xca, 0xa9, 0x29, 0x5a, 0xd0, 0xd5, + 0x9b, 0x2c, 0xc2, 0xff, 0x48, 0xef, 0x70, 0x8a, 0xf2, 0x3c, 0x50, 0x50, 0xbb, 0x43, 0x46, 0xe3, 0xc8, 0xc5, 0x1f, + 0xe9, 0x5d, 0x50, 0xdc, 0x16, 0x97, 0x97, 0x9b, 0xe5, 0x06, 0xba, 0xfc, 0x26, 0x71, 0x71, 0x39, 0x49, 0xb0, 0xc8, + 0x31, 0x4f, 0xd9, 0x08, 0x88, 0xf3, 0x5b, 0x7a, 0x17, 0xa8, 0xf1, 0x98, 0x75, 0x59, 0x0f, 0x2d, 0x0c, 0xea, 0x7d, + 0xab, 0xd8, 0xde, 0x06, 0x6d, 0x50, 0xf4, 0x64, 0xdf, 0x3e, 0xa9, 0xb4, 0x2b, 0xcd, 0x43, 0x84, 0xf2, 0x87, 0x2e, + 0x05, 0x7f, 0x6d, 0x8b, 0x36, 0x51, 0x49, 0x7d, 0x5d, 0xe9, 0x44, 0xa1, 0x43, 0x99, 0xeb, 0x71, 0xe9, 0xa5, 0xe6, + 0xd4, 0xe9, 0x3b, 0x08, 0x96, 0x23, 0xec, 0x6b, 0xa1, 0x07, 0x0d, 0xbe, 0x57, 0x29, 0x21, 0x65, 0x24, 0xe9, 0x65, + 0xd9, 0xcf, 0xb9, 0xf4, 0x00, 0xef, 0x90, 0xd2, 0x12, 0xca, 0xeb, 0x98, 0xb9, 0x49, 0x17, 0xfd, 0x41, 0x10, 0x6f, + 0x61, 0x96, 0x10, 0xa4, 0x36, 0x16, 0x45, 0x0e, 0x54, 0xa8, 0xe9, 0x4b, 0x65, 0x00, 0xb2, 0xa1, 0xc7, 0xd6, 0xa4, + 0x66, 0x22, 0xa5, 0xa6, 0x6f, 0x61, 0x7c, 0x8b, 0x94, 0xa4, 0x12, 0x19, 0x52, 0x89, 0x94, 0x42, 0x4f, 0x6f, 0xae, + 0x26, 0x21, 0x7b, 0x43, 0x8b, 0xeb, 0x73, 0x6a, 0xcf, 0x93, 0x0a, 0x58, 0x9e, 0x1c, 0x07, 0xe5, 0x01, 0x2c, 0x89, + 0xaa, 0x06, 0xb9, 0x71, 0xe7, 0xa4, 0x26, 0xbf, 0xd5, 0xe3, 0xbe, 0x59, 0x16, 0x31, 0x28, 0xf1, 0xc6, 0x68, 0x91, + 0x7a, 0x63, 0x9c, 0x40, 0x3e, 0x22, 0xcf, 0x0b, 0xf8, 0xa9, 0xbd, 0x1b, 0x95, 0x6c, 0xe5, 0xcd, 0x57, 0xfc, 0x40, + 0x99, 0x17, 0x90, 0xa3, 0x89, 0x53, 0xc3, 0x53, 0x52, 0x4f, 0xde, 0xb5, 0xb3, 0xb6, 0xed, 0x27, 0x9d, 0xa2, 0xa3, + 0x01, 0xfb, 0x41, 0x78, 0x0b, 0x6b, 0x15, 0xf6, 0x5d, 0x6e, 0x7d, 0xe5, 0x4f, 0x07, 0xfb, 0xca, 0x24, 0x52, 0x2f, + 0x23, 0x2b, 0x12, 0xe7, 0xfe, 0x5c, 0xcb, 0x5f, 0x66, 0x34, 0xbd, 0xbb, 0xa0, 0x90, 0xeb, 0xcc, 0xe1, 0xae, 0x6f, + 0xb9, 0x0d, 0x65, 0x9e, 0x7a, 0x37, 0x91, 0xca, 0x4a, 0x5e, 0xbd, 0x04, 0xb8, 0x7a, 0x45, 0x30, 0x97, 0xd1, 0x46, + 0xcb, 0x11, 0xa3, 0x4e, 0x0b, 0xdd, 0x7a, 0x79, 0x92, 0xb6, 0x19, 0xf8, 0xd7, 0x4a, 0x4c, 0xeb, 0x60, 0x01, 0xe6, + 0xf6, 0x85, 0xd4, 0x5e, 0xd6, 0x5f, 0xf5, 0xca, 0x40, 0x11, 0x84, 0xef, 0x92, 0xed, 0x4b, 0xdd, 0x94, 0x35, 0xbb, + 0x7d, 0xa9, 0x95, 0xa0, 0x9f, 0x4c, 0xf9, 0xc1, 0x7a, 0x9e, 0xe2, 0xf2, 0x32, 0xcb, 0x73, 0x94, 0x03, 0x78, 0x3f, + 0xb6, 0x3d, 0xef, 0x47, 0x9d, 0x34, 0xe8, 0x43, 0x2c, 0xf6, 0x22, 0xe6, 0x86, 0x89, 0x97, 0xf3, 0xff, 0xb8, 0x36, + 0xff, 0x8f, 0xd6, 0x95, 0x53, 0x30, 0x8d, 0x46, 0x09, 0x8d, 0x0c, 0xeb, 0x44, 0x8a, 0x00, 0xa5, 0xde, 0x96, 0x09, + 0xf2, 0xf1, 0x2a, 0x00, 0x8d, 0x6b, 0x31, 0xe4, 0x89, 0xa8, 0x0f, 0xc3, 0x09, 0x8b, 0xef, 0x82, 0x19, 0xab, 0x4f, + 0x78, 0xc2, 0xb3, 0x69, 0x38, 0xa0, 0x38, 0xbb, 0xcb, 0x04, 0x9d, 0xd4, 0x67, 0x0c, 0x3f, 0xa7, 0xf1, 0x9c, 0x0a, + 0x36, 0x08, 0xb1, 0x7b, 0x96, 0xb2, 0x30, 0x76, 0x5e, 0x85, 0x69, 0xca, 0x6f, 0x5c, 0xfc, 0x96, 0x5f, 0x73, 0xc1, + 0xf1, 0xeb, 0xdb, 0xbb, 0x11, 0x4d, 0xf0, 0xfb, 0xeb, 0x59, 0x22, 0x66, 0x38, 0x0b, 0x93, 0xac, 0x9e, 0xd1, 0x94, + 0x0d, 0xdb, 0x03, 0x1e, 0xf3, 0xb4, 0x0e, 0x29, 0xdb, 0x13, 0x1a, 0xc4, 0x6c, 0x34, 0x16, 0x4e, 0x14, 0xa6, 0x1f, + 0xdb, 0xf5, 0xfa, 0x34, 0x65, 0x93, 0x30, 0xbd, 0xab, 0xcb, 0x16, 0xc1, 0x97, 0x8d, 0x83, 0xf0, 0xf1, 0xf0, 0xb0, + 0x2d, 0xd2, 0x30, 0xc9, 0x18, 0x6c, 0x53, 0x10, 0xc6, 0xb1, 0x73, 0x70, 0xd4, 0x98, 0x64, 0x3b, 0x2a, 0x90, 0x17, + 0x26, 0x22, 0xbf, 0xc2, 0x1f, 0x01, 0x6e, 0xff, 0x5a, 0x24, 0xf8, 0x7a, 0x26, 0x04, 0x4f, 0x16, 0x83, 0x59, 0x9a, + 0xf1, 0x34, 0x98, 0x72, 0x96, 0x08, 0x9a, 0xb6, 0xaf, 0x79, 0x1a, 0xd1, 0xb4, 0x9e, 0x86, 0x11, 0x9b, 0x65, 0xc1, + 0xe1, 0xf4, 0xb6, 0x0d, 0x9a, 0xc5, 0x28, 0xe5, 0xb3, 0x24, 0xd2, 0x73, 0xb1, 0x64, 0x4c, 0x53, 0x26, 0xec, 0x0a, + 0xf9, 0x0a, 0x93, 0x20, 0x66, 0x09, 0x0d, 0xd3, 0xfa, 0x08, 0x3a, 0x83, 0x59, 0xd4, 0x88, 0xe8, 0x08, 0xa7, 0xa3, + 0xeb, 0xd0, 0x6b, 0xb6, 0x1e, 0x61, 0xf3, 0xbf, 0x7f, 0x84, 0x9c, 0xc6, 0xe6, 0xe2, 0x66, 0xa3, 0xf1, 0x27, 0xd4, + 0x5e, 0x99, 0x45, 0x02, 0x14, 0x34, 0xa7, 0xb7, 0x4e, 0xc6, 0x21, 0xa7, 0x6d, 0x53, 0xcf, 0xf6, 0x34, 0x8c, 0x20, + 0x21, 0x38, 0x68, 0x4d, 0x6f, 0x73, 0x58, 0x5d, 0xa0, 0x92, 0x4c, 0xf5, 0x22, 0xf5, 0xd3, 0xe2, 0xb7, 0x42, 0x7c, + 0xb2, 0x19, 0xe2, 0x96, 0x81, 0xb8, 0xc4, 0x7a, 0x3d, 0x9a, 0xa5, 0x32, 0xb6, 0x1a, 0x34, 0x33, 0x05, 0xc8, 0x98, + 0xcf, 0x69, 0x6a, 0xe0, 0x90, 0x0f, 0xbf, 0x19, 0x8c, 0xd6, 0x66, 0x30, 0x4e, 0x3e, 0x05, 0x46, 0x9a, 0x44, 0x8b, + 0xea, 0xbe, 0x36, 0x53, 0x3a, 0x69, 0x8f, 0x29, 0xd0, 0x53, 0xd0, 0x82, 0xdf, 0x37, 0x2c, 0x12, 0x63, 0xf5, 0x53, + 0x92, 0xf3, 0x8d, 0xaa, 0x3b, 0x6a, 0x34, 0xd4, 0x73, 0xc6, 0x7e, 0xa5, 0x41, 0xd3, 0x87, 0x06, 0xf9, 0x15, 0xfe, + 0x5b, 0x71, 0x99, 0xb7, 0xca, 0x3d, 0xf1, 0xb7, 0xf6, 0x2d, 0x5f, 0x2b, 0x49, 0xb1, 0xbc, 0x11, 0x8d, 0x53, 0x23, + 0x2b, 0x95, 0xf0, 0x01, 0xb7, 0x9d, 0x3c, 0x4f, 0x84, 0x75, 0x8a, 0x5b, 0x9c, 0xac, 0xfb, 0xad, 0xca, 0xbb, 0x08, + 0x20, 0xd2, 0x61, 0x25, 0x1b, 0xf2, 0x76, 0xd2, 0x21, 0x8d, 0x76, 0x52, 0xaf, 0x23, 0x8f, 0x93, 0xb4, 0x97, 0xe8, + 0xf4, 0x3c, 0x8f, 0x75, 0xb9, 0x34, 0xb6, 0x33, 0x14, 0x70, 0xb8, 0x6a, 0xba, 0x5c, 0x96, 0x61, 0x00, 0x26, 0xaf, + 0x6b, 0xfc, 0x4d, 0xe8, 0x06, 0x38, 0xb3, 0x38, 0x79, 0x62, 0x5e, 0xec, 0x92, 0x1a, 0x5e, 0x11, 0xf3, 0x81, 0xc4, + 0x9c, 0x3f, 0x0d, 0xc5, 0x18, 0xbc, 0x14, 0x85, 0xf8, 0x29, 0x93, 0x98, 0xdc, 0x7d, 0x17, 0x75, 0xd3, 0x22, 0xc3, + 0x0d, 0x32, 0xf9, 0xd2, 0x1c, 0x46, 0xf9, 0x4e, 0x10, 0x18, 0x11, 0x7f, 0x43, 0x94, 0x4d, 0x67, 0x2c, 0xba, 0xe1, + 0x43, 0x2d, 0x3a, 0x9a, 0x08, 0x26, 0x73, 0xb7, 0x4d, 0xc4, 0x61, 0x1c, 0x66, 0x97, 0x03, 0x75, 0x57, 0x32, 0x2b, + 0x6f, 0x06, 0x84, 0x12, 0x7a, 0x65, 0xa4, 0xd1, 0x54, 0xda, 0xa3, 0x3f, 0x8a, 0xad, 0xf6, 0x49, 0x7a, 0x9f, 0x7d, + 0x52, 0x2c, 0x3c, 0xe3, 0xb3, 0x74, 0x00, 0xe1, 0x48, 0x2d, 0xf5, 0xd6, 0x1d, 0x37, 0xae, 0x54, 0x31, 0x5c, 0x2c, + 0xac, 0x4c, 0x50, 0x81, 0x99, 0xfd, 0x52, 0x09, 0x2a, 0x43, 0x5e, 0xea, 0xbe, 0x86, 0x16, 0x71, 0x66, 0x49, 0x20, + 0xb3, 0x23, 0x99, 0xd4, 0xe8, 0x25, 0xa4, 0x93, 0xf8, 0xb3, 0x84, 0xfd, 0x32, 0xa3, 0x97, 0x0c, 0x74, 0x4d, 0xe6, + 0xb3, 0x48, 0xc6, 0x9a, 0x40, 0xf6, 0xd5, 0x9b, 0x10, 0xbc, 0x60, 0x91, 0xda, 0x98, 0x44, 0x56, 0xea, 0xdc, 0x26, + 0xb7, 0xee, 0x82, 0xbf, 0x18, 0xb4, 0x03, 0x86, 0x23, 0x3e, 0x09, 0x59, 0x12, 0x48, 0x97, 0x6f, 0x31, 0x58, 0x00, + 0xad, 0x31, 0x8b, 0x82, 0x44, 0x6f, 0x4f, 0x13, 0xf9, 0x1f, 0x38, 0x4b, 0x64, 0xd7, 0xbc, 0xcd, 0x25, 0x42, 0x15, + 0xfa, 0x88, 0x41, 0xf0, 0x99, 0x92, 0x6b, 0x1c, 0x61, 0xbb, 0xba, 0xb8, 0x76, 0x5e, 0xd9, 0x81, 0xc6, 0xca, 0x46, + 0x29, 0x23, 0x80, 0xaf, 0x96, 0x66, 0x3c, 0x15, 0x9e, 0x37, 0xc6, 0x31, 0x22, 0x9d, 0xb1, 0x74, 0x76, 0x9d, 0xc6, + 0xf2, 0x4f, 0xb7, 0xde, 0x0c, 0x9a, 0x85, 0xf9, 0x5e, 0xb9, 0x0d, 0xac, 0x92, 0xa3, 0xf4, 0x8d, 0x52, 0xb9, 0x8c, + 0xe2, 0xb7, 0x5a, 0x6a, 0xf9, 0x5c, 0x2c, 0x17, 0xeb, 0xe3, 0xa6, 0x44, 0x95, 0x57, 0x01, 0x42, 0x06, 0x8b, 0xb6, + 0x4c, 0x85, 0xf2, 0x72, 0xdd, 0x85, 0x2a, 0x79, 0xa5, 0x44, 0xf4, 0xe5, 0xee, 0x22, 0xd5, 0x33, 0xe6, 0x57, 0xcc, + 0x38, 0x99, 0xaa, 0x24, 0x97, 0x6b, 0x8c, 0x58, 0x7a, 0xe8, 0xa6, 0x66, 0x0a, 0x96, 0x3b, 0x92, 0x6e, 0xa4, 0x5b, + 0x5f, 0x3d, 0xd2, 0x94, 0x94, 0xe1, 0xae, 0xb5, 0x01, 0x20, 0x57, 0x6f, 0x13, 0x60, 0x60, 0xb6, 0x66, 0xc2, 0x2c, + 0x01, 0xb4, 0xb1, 0x21, 0x85, 0x8b, 0x34, 0x57, 0xbb, 0x8b, 0xef, 0x44, 0xbe, 0x6f, 0x35, 0x95, 0xbf, 0x59, 0x04, + 0x7f, 0x41, 0x02, 0x2e, 0x94, 0x52, 0x1a, 0xb8, 0x6f, 0x5e, 0x5f, 0xbc, 0x73, 0xf1, 0x35, 0x8f, 0xee, 0x02, 0x57, + 0xa4, 0x33, 0xea, 0xe6, 0xc8, 0x17, 0x63, 0x9a, 0x14, 0x2f, 0xe3, 0xe1, 0x31, 0xf5, 0x63, 0x3e, 0x52, 0x97, 0x32, + 0x57, 0x8d, 0xe4, 0xc1, 0xd5, 0xa9, 0x7c, 0xc9, 0x54, 0xe7, 0x54, 0xa8, 0xd7, 0x7b, 0x89, 0x14, 0x7e, 0x76, 0x20, + 0x84, 0x72, 0xba, 0x2f, 0xc6, 0xf2, 0xe1, 0x02, 0x0e, 0x8c, 0x7c, 0xda, 0x5d, 0xac, 0x11, 0x53, 0x17, 0x86, 0x18, + 0x77, 0xd4, 0x12, 0x32, 0xd9, 0xea, 0x2a, 0x18, 0x5c, 0x5d, 0xe5, 0xa7, 0xfb, 0x30, 0xd6, 0xbe, 0x19, 0x17, 0x20, + 0x34, 0xfd, 0x0b, 0x02, 0x83, 0x97, 0x0d, 0xa5, 0xa4, 0x03, 0x43, 0xc0, 0xbc, 0x51, 0x07, 0x16, 0x09, 0x04, 0x06, + 0xbd, 0xa3, 0xa2, 0x44, 0x9e, 0x58, 0x55, 0xb4, 0x0d, 0x02, 0xd5, 0xb0, 0xa4, 0x7b, 0xe5, 0x4d, 0x2d, 0xf7, 0xd7, + 0x80, 0x14, 0xd9, 0xd0, 0x5d, 0x21, 0xf8, 0x2b, 0x21, 0x3b, 0xdd, 0x57, 0x78, 0xb8, 0xb2, 0x5f, 0x6d, 0xa2, 0x5e, + 0x3b, 0x50, 0x60, 0xab, 0x97, 0x09, 0xfc, 0x51, 0xe0, 0x8f, 0x57, 0xb2, 0xa9, 0x11, 0x46, 0xa0, 0x25, 0x81, 0xd0, + 0x6e, 0x18, 0xad, 0x63, 0xc0, 0xe3, 0x38, 0x9c, 0x66, 0x34, 0x30, 0x3f, 0xb4, 0x5c, 0x02, 0xf1, 0xb6, 0xae, 0x08, + 0xe8, 0xf4, 0x9a, 0x73, 0x50, 0x17, 0xd6, 0xb5, 0x94, 0x79, 0x98, 0x7a, 0xf5, 0xfa, 0xa0, 0x7e, 0x3d, 0x42, 0xb9, + 0x18, 0x2f, 0x6c, 0xa9, 0x76, 0xdc, 0x68, 0xb4, 0x21, 0x17, 0xb2, 0x1e, 0xc6, 0x6c, 0x94, 0x04, 0x31, 0x1d, 0x8a, + 0x5c, 0xc0, 0x2d, 0xb5, 0x85, 0x51, 0x23, 0xfc, 0xd6, 0x51, 0x4a, 0x27, 0x8e, 0x0f, 0xff, 0xde, 0x3f, 0x71, 0x2e, + 0xa2, 0x20, 0x11, 0xe3, 0xba, 0xcc, 0xba, 0x85, 0x3b, 0x03, 0x62, 0x5c, 0x79, 0x5e, 0x58, 0x13, 0x0d, 0x28, 0xa8, + 0x58, 0xb9, 0x48, 0x1d, 0x31, 0xc6, 0x22, 0xb5, 0xdb, 0x25, 0x68, 0xb1, 0xb6, 0x82, 0x75, 0x49, 0x7f, 0x80, 0xf2, + 0x4c, 0x2a, 0xc6, 0xeb, 0x8d, 0x8d, 0xba, 0x54, 0x7d, 0x5a, 0x43, 0x9f, 0xa5, 0xd8, 0xe5, 0xca, 0xb1, 0xbc, 0x50, + 0x3d, 0x1e, 0x82, 0xcc, 0x8a, 0xca, 0x89, 0xed, 0x1e, 0x28, 0x67, 0xc9, 0x74, 0x26, 0x7a, 0xd2, 0xa9, 0x9d, 0xc2, + 0x05, 0x89, 0x3e, 0xb6, 0x4a, 0x00, 0x07, 0xfd, 0x85, 0x02, 0x66, 0x10, 0xc6, 0x03, 0x0f, 0x20, 0x72, 0xea, 0xce, + 0x49, 0x4a, 0x27, 0xa8, 0x3d, 0x61, 0x49, 0x5d, 0xd5, 0x1d, 0x59, 0x6a, 0x89, 0xff, 0x08, 0x9e, 0x72, 0x5f, 0x8e, + 0x86, 0x65, 0xee, 0xea, 0x06, 0x5c, 0x5e, 0xf5, 0xf3, 0xbc, 0x9d, 0x0a, 0xaf, 0xf7, 0xd2, 0x43, 0x7d, 0xfc, 0x8d, + 0xf5, 0x72, 0x16, 0xd7, 0x1c, 0x15, 0x17, 0xb7, 0xd0, 0x96, 0x26, 0xf6, 0x59, 0x90, 0xcd, 0xbe, 0x21, 0xd0, 0xf0, + 0xb9, 0xe7, 0xd2, 0x6c, 0x5a, 0x57, 0xbc, 0xab, 0x2e, 0x49, 0xd6, 0x85, 0xae, 0x48, 0x7b, 0x6a, 0x7f, 0x14, 0x0b, + 0xc9, 0x96, 0xf4, 0x25, 0x0d, 0xe5, 0x4c, 0xe8, 0x17, 0x97, 0x7a, 0xf4, 0xb3, 0x7d, 0x8d, 0x07, 0x55, 0xf8, 0xc9, + 0xd5, 0x59, 0x95, 0xc7, 0x01, 0x5f, 0x2a, 0x5e, 0x60, 0x17, 0xc6, 0x31, 0x4c, 0x78, 0x65, 0xd4, 0x17, 0xfb, 0xa5, + 0x1f, 0x3d, 0xd1, 0xf7, 0x50, 0xae, 0xcf, 0xe9, 0x13, 0xa9, 0x52, 0x5a, 0x6f, 0xcd, 0xdb, 0x11, 0x26, 0x58, 0xa4, + 0xa4, 0x2f, 0x83, 0x70, 0x77, 0x25, 0x2f, 0xba, 0x5d, 0xf2, 0x2e, 0xa5, 0x90, 0x3a, 0x72, 0x41, 0xc4, 0x4d, 0x93, + 0xc8, 0x75, 0xfe, 0x32, 0x88, 0xd9, 0xe0, 0x23, 0x71, 0x77, 0x17, 0x1e, 0x5a, 0xbf, 0xf6, 0x28, 0xb9, 0x82, 0x61, + 0xd8, 0xa8, 0xea, 0x48, 0x4f, 0x7c, 0x8b, 0x17, 0xab, 0xb7, 0xe2, 0xb8, 0x9d, 0xdd, 0x05, 0x30, 0x1e, 0x35, 0x4f, + 0xe7, 0x2a, 0xbf, 0x2c, 0xdf, 0x75, 0x55, 0x42, 0x01, 0x68, 0x56, 0xe5, 0x8e, 0x24, 0x2a, 0xe2, 0x7e, 0x92, 0xd2, + 0x5c, 0x47, 0x31, 0x35, 0x80, 0x53, 0x68, 0xfe, 0xe6, 0x3a, 0x7f, 0x29, 0xca, 0x68, 0xe1, 0xd1, 0x90, 0x29, 0x19, + 0xc4, 0x85, 0xb9, 0xc0, 0x8c, 0xf5, 0x23, 0x2a, 0x42, 0x16, 0xab, 0x2e, 0x6d, 0x63, 0x80, 0xaf, 0xac, 0x68, 0xb9, + 0xcc, 0xaa, 0x6b, 0x61, 0x55, 0x0c, 0xca, 0x95, 0x9d, 0xee, 0x97, 0x70, 0xcb, 0x95, 0xc9, 0x33, 0x69, 0x87, 0x06, + 0xcb, 0x15, 0xaa, 0x3a, 0xe7, 0x2f, 0x03, 0x79, 0x6d, 0x08, 0x00, 0xe4, 0x1a, 0x40, 0x08, 0x5a, 0xab, 0x6b, 0x31, + 0x5e, 0x4c, 0xb8, 0x2f, 0xc2, 0x74, 0x44, 0xc5, 0x0a, 0x62, 0x63, 0x95, 0xa3, 0xda, 0x36, 0x01, 0xea, 0x35, 0x68, + 0xc3, 0x2a, 0xb4, 0x57, 0x80, 0xf4, 0xee, 0xee, 0x82, 0xe5, 0x64, 0x77, 0x41, 0x93, 0x01, 0x8f, 0xe8, 0xfb, 0xb7, + 0xdf, 0xc0, 0x25, 0x47, 0x9e, 0x80, 0x61, 0x31, 0x46, 0x20, 0x38, 0xe5, 0xe6, 0x28, 0x11, 0xc2, 0xa5, 0x08, 0x51, + 0x9c, 0xc0, 0x91, 0x73, 0x49, 0x10, 0x73, 0xd7, 0xe9, 0x2a, 0xc8, 0x69, 0xa4, 0x60, 0x26, 0x89, 0xec, 0xc5, 0xf3, + 0xd3, 0x7d, 0xd5, 0x5a, 0x89, 0x00, 0xd5, 0x08, 0x90, 0x20, 0xcf, 0x69, 0x89, 0x03, 0xc8, 0x6b, 0xb6, 0xf1, 0x10, + 0xb1, 0x79, 0x41, 0x6c, 0xf2, 0x02, 0x55, 0xe7, 0x34, 0x0e, 0xaf, 0x69, 0xdc, 0xd9, 0x5d, 0x24, 0xcb, 0x65, 0x23, + 0x3f, 0xdd, 0x57, 0x8f, 0xce, 0xa9, 0xe4, 0x1b, 0xea, 0x85, 0x97, 0x72, 0x8b, 0xe1, 0x56, 0x22, 0x64, 0x7b, 0x9a, + 0x34, 0xa7, 0x40, 0x0f, 0x90, 0xbb, 0x8e, 0x4c, 0xb0, 0x90, 0x8d, 0x0a, 0x85, 0x28, 0x77, 0x1d, 0x16, 0xad, 0x97, + 0x65, 0x82, 0x4e, 0xa1, 0x74, 0xbc, 0x5c, 0x36, 0x73, 0xd7, 0x99, 0xb0, 0x04, 0x9e, 0x92, 0xe5, 0x52, 0x5e, 0xf8, + 0x9b, 0xb0, 0xc4, 0x6b, 0x00, 0xd9, 0xba, 0xce, 0x24, 0xbc, 0x95, 0x0b, 0x36, 0x35, 0xe1, 0xad, 0xd7, 0xd4, 0x55, + 0x7e, 0x81, 0x9f, 0x0c, 0x28, 0xae, 0xdc, 0xd1, 0x58, 0xef, 0x68, 0x84, 0x67, 0xea, 0x2a, 0x13, 0xf1, 0x22, 0x12, + 0x6f, 0xde, 0xd1, 0xc8, 0xec, 0xe8, 0x6c, 0xcb, 0x8e, 0xce, 0xee, 0xd9, 0xd1, 0x50, 0xef, 0x9e, 0x53, 0xe0, 0x8e, + 0x2f, 0x97, 0xcd, 0x46, 0x89, 0xbd, 0xd3, 0xfd, 0x88, 0xcd, 0x61, 0x37, 0x40, 0xcd, 0x13, 0x6c, 0x42, 0x37, 0x13, + 0x65, 0x15, 0xc5, 0xf4, 0xb3, 0x30, 0x59, 0x62, 0x21, 0xa9, 0x62, 0xc1, 0xa6, 0xeb, 0x22, 0xe6, 0xf6, 0x47, 0x52, + 0x36, 0x03, 0x3c, 0x64, 0x80, 0x87, 0xb1, 0x79, 0x01, 0xa6, 0xe7, 0xbe, 0x73, 0xb1, 0xeb, 0xb8, 0x86, 0xac, 0xaf, + 0xf2, 0x4b, 0x90, 0x11, 0x72, 0x7d, 0x0f, 0xa2, 0x45, 0x68, 0xed, 0x76, 0xb6, 0xd3, 0x1c, 0x84, 0xc7, 0x6f, 0x78, + 0x1a, 0xb9, 0x81, 0x6a, 0xfa, 0x59, 0xa8, 0x9a, 0xb0, 0x44, 0x27, 0x5b, 0x6d, 0xa5, 0xb5, 0xb2, 0xde, 0xa6, 0xb8, + 0xd6, 0xd1, 0x91, 0x6a, 0x31, 0x0d, 0x85, 0xa0, 0x69, 0xa2, 0x29, 0xd7, 0x75, 0xff, 0xbf, 0xa0, 0xc2, 0x0d, 0x7c, + 0x25, 0x34, 0x1b, 0x60, 0x08, 0x50, 0x2b, 0xec, 0x9a, 0xe7, 0x2b, 0xf1, 0xb4, 0x53, 0x6a, 0xb0, 0x77, 0xc8, 0x36, + 0x1a, 0x54, 0x11, 0xd8, 0x30, 0xb3, 0x09, 0x8d, 0x2e, 0x25, 0x83, 0xee, 0x0e, 0xae, 0xb4, 0xc2, 0xba, 0x22, 0xee, + 0xca, 0x0e, 0xd8, 0xfd, 0x79, 0xd6, 0x7a, 0x74, 0x78, 0xee, 0x62, 0xc5, 0xe3, 0xf9, 0x70, 0xe8, 0xa2, 0xdc, 0x79, + 0x58, 0xb7, 0xe6, 0xe1, 0xcf, 0xb3, 0xaf, 0x9f, 0x35, 0xbe, 0x2e, 0x3a, 0x27, 0x40, 0x44, 0x3a, 0xbe, 0x6f, 0x44, + 0x95, 0x05, 0xaf, 0x59, 0xd1, 0x30, 0x4c, 0xb6, 0x2f, 0xa7, 0x67, 0x2f, 0x27, 0x9b, 0x52, 0x1a, 0x01, 0x71, 0xe2, + 0xb5, 0xd2, 0xcb, 0x98, 0xce, 0xa9, 0x79, 0xf3, 0xe0, 0x86, 0xc9, 0x36, 0xf4, 0x18, 0xf0, 0x59, 0x22, 0x74, 0xa2, + 0x83, 0x66, 0xb5, 0xd6, 0x92, 0xae, 0xe4, 0x1a, 0x6c, 0x1b, 0xe1, 0x4e, 0xc9, 0xb9, 0xaa, 0xf4, 0xca, 0xaf, 0xb0, + 0x6b, 0x01, 0xb0, 0x15, 0xb2, 0xee, 0x96, 0xf2, 0xa0, 0x81, 0x1b, 0xdb, 0x60, 0xc3, 0x4d, 0x14, 0xb8, 0x6e, 0xdf, + 0xe0, 0x49, 0xfa, 0x2a, 0x2b, 0x2f, 0x8c, 0xd8, 0x8a, 0xaf, 0x4f, 0x62, 0xe0, 0x3a, 0x85, 0xc1, 0x12, 0x9a, 0x65, + 0x5b, 0x11, 0x50, 0x6c, 0x22, 0x76, 0xcb, 0xd6, 0xee, 0x96, 0x51, 0x70, 0x03, 0xc3, 0x09, 0x93, 0x00, 0x17, 0x11, + 0x53, 0xdd, 0x8a, 0x0e, 0x87, 0x74, 0x50, 0xb8, 0x7a, 0x21, 0xf6, 0x35, 0x64, 0xb1, 0x80, 0x10, 0x90, 0x8c, 0xcd, + 0xb8, 0xaf, 0x78, 0x42, 0x5d, 0x64, 0xb2, 0x39, 0x35, 0xfc, 0x5a, 0xfe, 0x6f, 0x86, 0x47, 0x8d, 0x58, 0x85, 0x45, + 0xcf, 0xb2, 0x5c, 0x1a, 0x37, 0x4f, 0xa5, 0xbc, 0x8a, 0x48, 0x2e, 0xfd, 0x38, 0xdb, 0x0e, 0xd0, 0xc3, 0x8e, 0xc9, + 0xa2, 0xf9, 0xf5, 0x51, 0xb3, 0x91, 0xbb, 0xd8, 0x85, 0xe1, 0x1e, 0x7a, 0x4a, 0x64, 0xaf, 0x03, 0xe8, 0x35, 0x4b, + 0x3e, 0xa7, 0x5f, 0xab, 0xf9, 0xb8, 0xe9, 0x62, 0xf5, 0x22, 0x01, 0x94, 0x17, 0xcc, 0x60, 0x00, 0xce, 0xcf, 0xdf, + 0xbd, 0x94, 0xea, 0xe0, 0x0f, 0x83, 0xe7, 0xb8, 0xd9, 0x70, 0xb1, 0x9b, 0x09, 0x3e, 0xfd, 0x8c, 0x25, 0x1c, 0xb8, + 0xd8, 0x1d, 0xc4, 0x3c, 0xa3, 0xf6, 0x1a, 0x94, 0x3a, 0xfb, 0xfb, 0x17, 0xa1, 0x20, 0x9a, 0xa6, 0x34, 0xcb, 0x1c, + 0x7b, 0x7c, 0x4d, 0x4a, 0x9f, 0x60, 0x98, 0x1b, 0x29, 0x2e, 0xa3, 0x42, 0xe2, 0x45, 0xdd, 0xf1, 0xb7, 0xa9, 0x4a, + 0x95, 0xad, 0x11, 0x9b, 0x14, 0x01, 0x05, 0x63, 0x53, 0xda, 0xd5, 0x27, 0x67, 0xde, 0x70, 0xf4, 0xd4, 0xc4, 0x2a, + 0x26, 0xbc, 0x3e, 0x41, 0xa5, 0x64, 0xc2, 0x92, 0xcb, 0x0d, 0xa5, 0xe1, 0xed, 0x86, 0x52, 0x50, 0xd9, 0x0a, 0xe8, + 0xf4, 0xeb, 0x67, 0x3e, 0x8d, 0xf5, 0x52, 0xf1, 0xb1, 0x41, 0x8c, 0xa4, 0xdf, 0xf2, 0x13, 0x90, 0x5a, 0xdb, 0x20, + 0x47, 0xf8, 0xed, 0xd3, 0x41, 0xc9, 0xe7, 0x4c, 0x57, 0x8c, 0xf2, 0xfb, 0x56, 0x08, 0xa5, 0x75, 0xf0, 0x5f, 0xc7, + 0x9f, 0xb5, 0x56, 0x7a, 0xfb, 0x69, 0x82, 0xb3, 0xb4, 0xaa, 0xdf, 0xb1, 0xf5, 0xfa, 0x1e, 0xfb, 0xea, 0xde, 0x6f, + 0x28, 0xd6, 0x8a, 0x4f, 0xb1, 0xff, 0x83, 0x98, 0x4d, 0x4a, 0x12, 0x58, 0x07, 0x53, 0x6a, 0x3c, 0x90, 0xcc, 0x64, + 0x0f, 0xa2, 0x54, 0x9f, 0x4b, 0xb8, 0xa2, 0x09, 0xef, 0xc1, 0x98, 0xa5, 0xf4, 0x32, 0xe6, 0x37, 0xab, 0xef, 0xf5, + 0xda, 0xde, 0x78, 0xcc, 0x46, 0x63, 0xeb, 0xde, 0x15, 0x25, 0xc5, 0x26, 0xdc, 0x3b, 0x41, 0xfe, 0x2f, 0xff, 0xec, + 0xfb, 0xff, 0xf2, 0xcf, 0x9f, 0x6c, 0x0a, 0xc3, 0xe7, 0x57, 0x58, 0x94, 0xc3, 0x6e, 0x3f, 0x5d, 0x9b, 0x67, 0xaa, + 0xe2, 0x7c, 0x73, 0x9b, 0xb5, 0x4d, 0x80, 0xfa, 0xb5, 0x2d, 0x58, 0x2b, 0x54, 0xa7, 0xcf, 0xf9, 0x2d, 0x80, 0xc1, + 0xba, 0x3e, 0x09, 0x19, 0x34, 0xfa, 0x5d, 0xa0, 0x5d, 0xa1, 0xe0, 0x41, 0x3b, 0xf2, 0xdb, 0x31, 0xfc, 0xa9, 0x35, + 0xfc, 0x4e, 0xf0, 0xb5, 0x7f, 0x62, 0x70, 0x75, 0x55, 0x24, 0xd8, 0xd9, 0x5d, 0xe1, 0x02, 0x7f, 0x77, 0xad, 0x44, + 0x2b, 0x1e, 0x41, 0x03, 0x75, 0xe4, 0xf5, 0x40, 0x32, 0xb8, 0x7a, 0x09, 0x6f, 0xed, 0x39, 0xbd, 0x4e, 0x8d, 0x83, + 0xf7, 0x1e, 0xe1, 0x00, 0x43, 0x54, 0x57, 0x25, 0x07, 0x5d, 0x93, 0x0c, 0x50, 0x0a, 0xe6, 0x06, 0x80, 0x89, 0x07, + 0x57, 0xda, 0xda, 0x3c, 0x57, 0x6e, 0x98, 0x60, 0x95, 0xb4, 0xb5, 0x7b, 0xa6, 0x82, 0x74, 0xec, 0xbc, 0x93, 0xf8, + 0x92, 0x8d, 0x69, 0x69, 0xdd, 0x4b, 0x57, 0x17, 0xd8, 0x11, 0x57, 0xb9, 0x0c, 0xd3, 0xff, 0x75, 0x5b, 0x24, 0xf1, + 0xef, 0x9f, 0x8e, 0x24, 0xf2, 0x07, 0x45, 0x12, 0xff, 0xfe, 0x87, 0x47, 0x12, 0xff, 0x6a, 0x47, 0x12, 0x61, 0x13, + 0x7f, 0x79, 0x50, 0xb4, 0xcf, 0x44, 0x62, 0xf8, 0x4d, 0x46, 0x9a, 0x5a, 0x8d, 0x8e, 0xf9, 0x08, 0x42, 0x7d, 0xff, + 0xf6, 0x91, 0xbb, 0x98, 0x8f, 0xec, 0xb8, 0x1d, 0xbc, 0xb5, 0x15, 0x02, 0x75, 0x6d, 0x13, 0x61, 0xd3, 0xb1, 0xb2, + 0x46, 0x71, 0x23, 0xa5, 0x7e, 0x68, 0xde, 0xa0, 0xe0, 0x06, 0xc5, 0x5b, 0x90, 0x1a, 0xb8, 0x65, 0xa2, 0x69, 0x81, + 0x0c, 0xc4, 0x15, 0x1d, 0x5b, 0x35, 0x73, 0xdd, 0xc2, 0x1e, 0xa1, 0x6d, 0xde, 0xf2, 0xa2, 0x6e, 0xdf, 0x2f, 0xdc, + 0x9f, 0x6f, 0x9b, 0x4f, 0x7a, 0xcd, 0xf6, 0x41, 0x73, 0xe2, 0x06, 0x2e, 0x88, 0x48, 0x59, 0xd0, 0x68, 0x1f, 0x1c, + 0x40, 0xc1, 0x8d, 0x55, 0xd0, 0x82, 0x02, 0x66, 0x15, 0x1c, 0x41, 0xc1, 0xc0, 0x2a, 0x38, 0x86, 0x82, 0xc8, 0x2a, + 0x78, 0x04, 0x05, 0x73, 0x37, 0xef, 0xb1, 0x02, 0xdc, 0x47, 0xa8, 0x8f, 0x95, 0xe5, 0x62, 0xca, 0x1e, 0xe1, 0x26, + 0x84, 0xf0, 0xc2, 0x91, 0xcc, 0x3c, 0x02, 0x87, 0x60, 0xc0, 0xf1, 0xcd, 0x98, 0x26, 0x01, 0x04, 0x51, 0x9f, 0x4a, + 0x19, 0xe3, 0x0b, 0xfe, 0x8e, 0x4d, 0xa8, 0xf9, 0x5e, 0x86, 0xc1, 0x83, 0xe3, 0xa2, 0x5e, 0xa3, 0x9f, 0xb7, 0x8b, + 0x9d, 0x53, 0xb1, 0x3f, 0x9d, 0x85, 0xa2, 0xf6, 0xb2, 0xac, 0x53, 0xd3, 0xd5, 0x8b, 0x3d, 0xdf, 0x12, 0x43, 0xb2, + 0x7c, 0x11, 0xc3, 0x98, 0xdf, 0xd4, 0x6f, 0xdd, 0xce, 0xe6, 0xb8, 0x12, 0x40, 0x54, 0xc4, 0x95, 0xe4, 0x9a, 0x8a, + 0xa7, 0x77, 0xe1, 0xa8, 0xf8, 0xfd, 0x92, 0x66, 0x59, 0x38, 0xd2, 0x2d, 0xb7, 0xc7, 0x91, 0x24, 0x88, 0x76, 0x0c, + 0xc9, 0x00, 0x01, 0xb1, 0x20, 0xd8, 0x2c, 0xb0, 0xe5, 0x75, 0x68, 0x08, 0xb0, 0x53, 0x8d, 0x2a, 0xc9, 0xe9, 0xab, + 0x45, 0x22, 0x1c, 0x95, 0x05, 0xa7, 0xd3, 0x94, 0xca, 0x52, 0x85, 0xe1, 0xfc, 0x74, 0x1f, 0x0a, 0x54, 0xf5, 0x96, + 0xe8, 0x91, 0x71, 0x1c, 0x6c, 0x8f, 0x21, 0x39, 0x26, 0x7a, 0x64, 0xe7, 0xdb, 0x14, 0xc9, 0x36, 0xeb, 0x31, 0x8b, + 0x2f, 0x9b, 0x03, 0xf8, 0x4f, 0x47, 0x44, 0xbe, 0x1c, 0x0e, 0x87, 0xf7, 0x46, 0x93, 0xbe, 0x8c, 0x86, 0xb4, 0x45, + 0x8f, 0xda, 0x90, 0x8b, 0x51, 0xd7, 0x31, 0x88, 0x66, 0x2e, 0x71, 0xb7, 0x78, 0x58, 0x63, 0x08, 0x57, 0x88, 0xf1, + 0xe2, 0xe1, 0x91, 0xa5, 0x7c, 0x9a, 0xd2, 0xc5, 0x24, 0x4c, 0x47, 0x2c, 0x09, 0x1a, 0xb9, 0x3f, 0xd7, 0xa1, 0x98, + 0x2f, 0x4f, 0x4e, 0x4e, 0x72, 0x3f, 0x32, 0x4f, 0x8d, 0x28, 0xca, 0xfd, 0xc1, 0xa2, 0x58, 0x46, 0xa3, 0x31, 0x1c, + 0xe6, 0x3e, 0x33, 0x05, 0x07, 0xad, 0x41, 0x74, 0xd0, 0xca, 0xfd, 0x1b, 0xab, 0x45, 0xee, 0x53, 0xfd, 0x94, 0xd2, + 0xa8, 0x92, 0xd0, 0xf1, 0xa8, 0xd1, 0xc8, 0x7d, 0x45, 0x68, 0x0b, 0x30, 0xc7, 0xd4, 0xcf, 0x20, 0x9c, 0x09, 0x0e, + 0x2c, 0xb9, 0xcd, 0x85, 0xd7, 0xbb, 0xd4, 0x2f, 0xcb, 0x50, 0x1f, 0x96, 0xc8, 0x51, 0x1f, 0xff, 0x62, 0x07, 0x4d, + 0x80, 0x98, 0x65, 0xb0, 0x84, 0x9b, 0x98, 0x4a, 0xa5, 0x1a, 0x28, 0x4b, 0x56, 0xff, 0x42, 0x78, 0x19, 0x4b, 0x01, + 0xfe, 0x03, 0x2d, 0xd5, 0x5b, 0xdd, 0x04, 0xdd, 0xc2, 0xf5, 0x29, 0xfd, 0x24, 0xd7, 0xbf, 0x7b, 0x08, 0xd3, 0xa7, + 0xf4, 0x8f, 0x66, 0xfa, 0xfa, 0xd5, 0xa7, 0x8a, 0xe9, 0x2b, 0xb6, 0x36, 0x11, 0xc4, 0x1d, 0x8c, 0xe9, 0xe0, 0xe3, + 0x35, 0xbf, 0xad, 0xc3, 0x91, 0x48, 0x5d, 0xc9, 0x4f, 0x77, 0x7f, 0x6b, 0xf2, 0x87, 0x19, 0xcc, 0xfa, 0x2e, 0x85, + 0x14, 0x9b, 0xaf, 0x13, 0xe2, 0xbe, 0x36, 0x36, 0x9d, 0x2a, 0x19, 0x0e, 0x89, 0xfb, 0x7a, 0x38, 0x74, 0xcd, 0x95, + 0xbf, 0x50, 0x50, 0xd9, 0xea, 0x55, 0xa5, 0x44, 0xb6, 0xfa, 0xfa, 0x6b, 0xbb, 0xcc, 0x2e, 0xd0, 0x21, 0x17, 0x3b, + 0xbc, 0xa2, 0x6b, 0x22, 0x96, 0xc1, 0x51, 0x83, 0xcf, 0x65, 0x54, 0xdf, 0x39, 0x98, 0x56, 0x5e, 0x0f, 0x5d, 0x00, + 0xbc, 0xe1, 0x9d, 0xd6, 0xab, 0xf7, 0xdd, 0x47, 0xd4, 0xa4, 0xdf, 0x3d, 0xb9, 0xfb, 0x26, 0xf2, 0x26, 0x02, 0xe5, + 0x2c, 0x7b, 0x9d, 0xac, 0xdc, 0x65, 0x51, 0x30, 0x12, 0x62, 0x2f, 0x2b, 0x17, 0x7c, 0x34, 0x8a, 0xe1, 0x83, 0x25, + 0x8b, 0xca, 0x7b, 0x50, 0x55, 0xf7, 0x6e, 0x65, 0xbd, 0x81, 0xdd, 0x51, 0xbf, 0x35, 0x54, 0x7e, 0x3f, 0x49, 0xe5, + 0x40, 0xcf, 0xf5, 0x87, 0x74, 0xa4, 0x39, 0xb8, 0xd0, 0xfc, 0x7f, 0xa1, 0x32, 0x67, 0x05, 0x64, 0x8d, 0xa8, 0x81, + 0xa3, 0x3c, 0xd7, 0x77, 0x0e, 0x22, 0x96, 0x4d, 0xe1, 0xfd, 0x9c, 0xaa, 0x27, 0xfd, 0x14, 0x0b, 0xcf, 0x6e, 0xac, + 0xb8, 0x46, 0x65, 0xbb, 0x72, 0x13, 0xd8, 0x50, 0x8e, 0xe2, 0x89, 0xc8, 0x5d, 0xed, 0x6f, 0x36, 0x48, 0x74, 0x1d, + 0x85, 0x4f, 0x15, 0x71, 0xb1, 0x56, 0x08, 0x4e, 0xdf, 0x62, 0x43, 0x4c, 0x95, 0x29, 0xc8, 0xed, 0xb8, 0x9d, 0xac, + 0x51, 0xd8, 0x92, 0x51, 0x82, 0x6c, 0x1a, 0x26, 0x8a, 0x8d, 0x12, 0x57, 0xf1, 0x83, 0xdd, 0x45, 0xb9, 0xf3, 0xb9, + 0x6b, 0xc0, 0x56, 0xc4, 0xdb, 0x39, 0xdd, 0x87, 0x0e, 0x1d, 0xa7, 0x02, 0x7a, 0xb2, 0x16, 0x5c, 0xf8, 0x44, 0x98, + 0xff, 0xca, 0xcf, 0x6e, 0xb0, 0x9f, 0xdd, 0x38, 0x7f, 0x5e, 0xd4, 0x6f, 0xe8, 0xf5, 0x47, 0x26, 0xea, 0x22, 0x9c, + 0xd6, 0x41, 0xe1, 0x97, 0x4e, 0x41, 0xcd, 0x9e, 0x65, 0xb2, 0x9a, 0xba, 0xb1, 0xdf, 0x9e, 0x65, 0x90, 0x0d, 0x20, + 0xd5, 0xd6, 0x20, 0xe1, 0x09, 0x6d, 0x57, 0x93, 0x12, 0xed, 0xe0, 0xb2, 0xc1, 0x56, 0x7f, 0xc1, 0x21, 0x7b, 0x40, + 0xdc, 0x05, 0x0d, 0xcd, 0xd6, 0x1b, 0x26, 0x72, 0xdc, 0xd8, 0xd8, 0x3e, 0xd0, 0xc8, 0xad, 0x49, 0xe9, 0x95, 0xae, + 0x47, 0xd0, 0xb7, 0x45, 0xc0, 0x3f, 0x95, 0xa2, 0x07, 0xae, 0x44, 0xf3, 0xbf, 0x95, 0xdb, 0xb8, 0x5a, 0x2c, 0x53, + 0xf4, 0x1e, 0x02, 0x59, 0x10, 0x0e, 0x05, 0x4d, 0xf1, 0x43, 0x5a, 0x5e, 0xcb, 0xdb, 0x34, 0x0b, 0x10, 0x33, 0x41, + 0xf3, 0x64, 0x7a, 0xfb, 0xf0, 0xe1, 0xef, 0x5f, 0x7e, 0xae, 0x71, 0x64, 0xde, 0x2e, 0xe3, 0xba, 0x6d, 0x38, 0x08, + 0x71, 0x78, 0x17, 0xb0, 0x44, 0xca, 0xbc, 0x6b, 0xf0, 0x07, 0xb6, 0xa7, 0x5c, 0xe7, 0x9a, 0xa6, 0x34, 0x96, 0x9f, + 0x92, 0xd3, 0x5b, 0x71, 0x70, 0x3c, 0xbd, 0x35, 0xbb, 0xd1, 0x5c, 0xc9, 0x21, 0xfd, 0x43, 0x53, 0x45, 0xb7, 0xe7, + 0xa6, 0x56, 0xd3, 0x1d, 0x8f, 0xa6, 0xb7, 0x6d, 0x25, 0x68, 0xeb, 0xa9, 0x82, 0xaa, 0x31, 0xbd, 0xb5, 0x93, 0x65, + 0xcb, 0x81, 0x1c, 0xff, 0x20, 0x73, 0x68, 0x98, 0xd1, 0x36, 0xbc, 0x3f, 0x9b, 0x0d, 0xc2, 0x58, 0x0b, 0xf3, 0x09, + 0x8b, 0xa2, 0x98, 0xb6, 0x8d, 0xbc, 0x76, 0x9a, 0xc7, 0x90, 0x6b, 0x6a, 0x6f, 0x59, 0x75, 0x57, 0x2c, 0xe4, 0x15, + 0x78, 0x0a, 0xaf, 0x33, 0x1e, 0xc3, 0xc7, 0x2b, 0x36, 0xa2, 0x53, 0x27, 0x61, 0x36, 0x4a, 0xe4, 0xc9, 0xdf, 0xd5, + 0xb5, 0x1c, 0x35, 0xfe, 0xd4, 0x96, 0x1b, 0xde, 0x68, 0x0b, 0x3e, 0x0d, 0xea, 0x07, 0xd5, 0x85, 0x40, 0x55, 0xb1, + 0x04, 0xbc, 0x61, 0x59, 0x18, 0xa4, 0x95, 0xe2, 0xd3, 0x8e, 0xdf, 0xd4, 0x65, 0x72, 0x00, 0x78, 0xd1, 0x73, 0x51, + 0x94, 0x57, 0x17, 0xf3, 0x6f, 0x73, 0x5a, 0x1e, 0x6f, 0x3e, 0x2d, 0x8f, 0xcd, 0x69, 0xb9, 0x9f, 0x62, 0xbf, 0x1c, + 0x36, 0xe1, 0xbf, 0x76, 0xb9, 0xa0, 0xa0, 0xe1, 0x1c, 0x4c, 0x6f, 0x1d, 0xd0, 0xd3, 0xea, 0xad, 0xe9, 0xad, 0x4a, + 0x15, 0x86, 0x98, 0x45, 0x03, 0x92, 0x67, 0x71, 0xc3, 0x81, 0x42, 0xf8, 0xbf, 0x51, 0xa9, 0x6a, 0x1e, 0x42, 0x1d, + 0xf4, 0x3a, 0x5a, 0xaf, 0x6b, 0xdd, 0x7f, 0x68, 0x83, 0x84, 0x0b, 0x2f, 0x30, 0xdc, 0x18, 0xf9, 0x22, 0xbc, 0xbe, + 0xa6, 0x51, 0x30, 0xe4, 0x83, 0x59, 0xf6, 0x4f, 0x1a, 0x7e, 0x8d, 0xc4, 0x7b, 0x8f, 0xf4, 0xca, 0x38, 0xa6, 0xab, + 0x4a, 0x5c, 0x36, 0x23, 0x2c, 0x8a, 0x7d, 0x0a, 0xb2, 0x41, 0x18, 0x53, 0xaf, 0xe5, 0x1f, 0x6e, 0x38, 0x04, 0xff, + 0x2e, 0x7b, 0xb3, 0x71, 0x31, 0xbf, 0x17, 0x19, 0xf7, 0x22, 0xe1, 0xb3, 0x70, 0x60, 0xef, 0x61, 0xe3, 0x64, 0x33, + 0xb8, 0x3d, 0x33, 0x53, 0xdf, 0x08, 0x05, 0x2d, 0x77, 0x22, 0x3a, 0x0c, 0x67, 0xb1, 0xb8, 0x7f, 0xd4, 0x6d, 0x94, + 0xb1, 0x36, 0xea, 0x3d, 0x0c, 0xbd, 0x6c, 0xfb, 0x40, 0x2e, 0xfd, 0xe5, 0xe3, 0x43, 0xf8, 0x4f, 0xe5, 0x3d, 0xdd, + 0x95, 0xba, 0xba, 0xb2, 0x55, 0x41, 0x57, 0xdf, 0xad, 0x28, 0xe3, 0x4a, 0x84, 0x4b, 0x7d, 0xfc, 0xa1, 0xad, 0x41, + 0xab, 0x7c, 0x50, 0x73, 0xad, 0x65, 0x7d, 0x56, 0xeb, 0xcf, 0x1b, 0xfc, 0x81, 0x6d, 0x07, 0x4a, 0x73, 0xad, 0xb6, + 0xd5, 0xdf, 0xd2, 0x5b, 0x6b, 0x6c, 0x30, 0x2e, 0xdb, 0xef, 0x92, 0xbb, 0xc2, 0x44, 0x51, 0x51, 0x48, 0xb0, 0x52, + 0x76, 0x95, 0x95, 0xc2, 0x28, 0xb9, 0x3a, 0xed, 0xde, 0x4e, 0x62, 0x67, 0xae, 0x6e, 0xfd, 0x11, 0xb7, 0xe9, 0x37, + 0x5c, 0x47, 0xc6, 0xbf, 0xe1, 0xed, 0xe3, 0xae, 0xfc, 0x46, 0xab, 0xdb, 0x05, 0x4d, 0x6b, 0x3e, 0x92, 0x9a, 0xdd, + 0x8b, 0xf0, 0x8e, 0xa6, 0x97, 0x2d, 0xd7, 0x01, 0xef, 0x4a, 0x5d, 0xa5, 0x0a, 0xc8, 0x32, 0xa7, 0xe5, 0x3a, 0xb7, + 0x93, 0x38, 0xc9, 0x88, 0x3b, 0x16, 0x62, 0x1a, 0xa8, 0x8f, 0xb8, 0xde, 0x1c, 0xf8, 0x3c, 0x1d, 0xed, 0xb7, 0x1a, + 0x8d, 0x06, 0xbc, 0xc9, 0xd4, 0x75, 0xe6, 0x8c, 0xde, 0x3c, 0xe1, 0xb7, 0xc4, 0x6d, 0x38, 0x0d, 0xa7, 0xd9, 0x3a, + 0x71, 0x9a, 0xad, 0x43, 0xff, 0xf8, 0xc4, 0xed, 0x7c, 0xe1, 0x38, 0xa7, 0x11, 0x1d, 0x66, 0xf0, 0xc3, 0x71, 0x4e, + 0xa5, 0xe2, 0xa5, 0x7e, 0x3b, 0x8e, 0x3f, 0x88, 0xb3, 0x7a, 0xd3, 0x59, 0xe8, 0x47, 0xc7, 0x81, 0xbb, 0x91, 0x81, + 0xf3, 0xe5, 0xb0, 0x35, 0x3c, 0x1c, 0x3e, 0x6e, 0xeb, 0xe2, 0xfc, 0x8b, 0x4a, 0x73, 0xac, 0xfe, 0xb6, 0xac, 0x6e, + 0x99, 0x48, 0xf9, 0x47, 0xaa, 0x73, 0xf1, 0x1c, 0x10, 0x3d, 0x1b, 0xbb, 0xb6, 0xd6, 0x67, 0x6a, 0x9e, 0x5c, 0x0f, + 0x86, 0xad, 0xb2, 0xb9, 0x84, 0x71, 0xbf, 0x00, 0xf2, 0x74, 0xdf, 0x80, 0x7e, 0x6a, 0xa3, 0xa9, 0x59, 0xdf, 0x84, + 0xa8, 0xa6, 0xab, 0xd7, 0x38, 0x32, 0xeb, 0x3b, 0x85, 0x54, 0x7c, 0xa3, 0xab, 0x4a, 0x08, 0x5c, 0x27, 0x22, 0xee, + 0xcb, 0x66, 0xeb, 0x04, 0x37, 0x9b, 0xc7, 0xfe, 0xf1, 0xc9, 0xa0, 0x81, 0x0f, 0xfd, 0xc3, 0xfa, 0x81, 0x7f, 0x8c, + 0x4f, 0xea, 0x27, 0xf8, 0xe4, 0xf9, 0xc9, 0xa0, 0x7e, 0xe8, 0x1f, 0xe2, 0x46, 0xfd, 0x04, 0x0a, 0xeb, 0x27, 0xf5, + 0x93, 0x79, 0xfd, 0xf0, 0x64, 0xd0, 0x90, 0xa5, 0x2d, 0xff, 0xe8, 0xa8, 0xde, 0x6c, 0xf8, 0x47, 0x47, 0xf8, 0xc8, + 0x3f, 0x3e, 0xae, 0x37, 0x0f, 0xfc, 0xe3, 0xe3, 0x17, 0x47, 0x27, 0xfe, 0x01, 0xd4, 0x1d, 0x1c, 0x0c, 0x0e, 0xfc, + 0x66, 0xb3, 0x0e, 0xff, 0xe0, 0x13, 0xbf, 0xa5, 0x7e, 0x34, 0x9b, 0xfe, 0x41, 0x13, 0x37, 0xe2, 0xa3, 0x96, 0x7f, + 0xfc, 0x18, 0xcb, 0x7f, 0x65, 0x33, 0x2c, 0xff, 0x81, 0x61, 0xf0, 0x63, 0xbf, 0x75, 0xac, 0x7e, 0xc9, 0x01, 0xe7, + 0x87, 0x27, 0x3f, 0xb9, 0xfb, 0x5b, 0xd7, 0xd0, 0x54, 0x6b, 0x38, 0x39, 0xf2, 0x0f, 0x0e, 0xf0, 0x61, 0xd3, 0x3f, + 0x39, 0x18, 0xd7, 0x0f, 0x5b, 0xfe, 0xf1, 0xa3, 0x41, 0xbd, 0xe9, 0x3f, 0x7a, 0x84, 0x1b, 0xf5, 0x03, 0xbf, 0x85, + 0x9b, 0xfe, 0xe1, 0x81, 0xfc, 0x71, 0xe0, 0xb7, 0xe6, 0x8f, 0x1e, 0xfb, 0xc7, 0x47, 0xe3, 0x63, 0xff, 0xf0, 0xfb, + 0xc3, 0x13, 0xbf, 0x75, 0x30, 0x3e, 0x38, 0xf6, 0x5b, 0x8f, 0xe6, 0xc7, 0xfe, 0xe1, 0xb8, 0xde, 0x3a, 0xbe, 0xb7, + 0x67, 0xb3, 0xe5, 0x03, 0x8e, 0x64, 0x35, 0x54, 0x60, 0x5d, 0x01, 0xff, 0x8f, 0x65, 0xdf, 0x7f, 0xc7, 0x61, 0xb2, + 0xf5, 0xae, 0x8f, 0xfd, 0x93, 0x47, 0x03, 0xd5, 0x1c, 0x0a, 0xea, 0xa6, 0x05, 0x74, 0x99, 0xd7, 0xd5, 0xb4, 0x72, + 0xb8, 0xba, 0x19, 0xc8, 0xfc, 0xaf, 0x27, 0x9b, 0xd7, 0x61, 0x62, 0x35, 0xef, 0x7f, 0xe8, 0x38, 0xc5, 0x96, 0x9f, + 0xee, 0x8f, 0x14, 0xe9, 0x8f, 0x3a, 0x5f, 0xa8, 0xd7, 0x14, 0x7f, 0x71, 0x85, 0xb3, 0x6d, 0x8e, 0x8f, 0xf4, 0xd3, + 0x8e, 0x8f, 0x84, 0x3e, 0xc4, 0xf3, 0x91, 0xfe, 0xe1, 0x9e, 0x8f, 0x8c, 0xae, 0xb8, 0xbb, 0xef, 0xc4, 0x9a, 0x83, + 0x63, 0xd5, 0x2a, 0x7e, 0x2e, 0xbc, 0x1e, 0x83, 0xef, 0x61, 0xe5, 0xed, 0x3b, 0x78, 0x15, 0xba, 0xed, 0x07, 0xe2, + 0xc0, 0x62, 0xef, 0x84, 0xe2, 0xb1, 0x7c, 0x1b, 0x42, 0xe2, 0x4f, 0x23, 0xe4, 0xfb, 0x87, 0xe0, 0x23, 0xfe, 0xc3, + 0xf1, 0xc1, 0x6d, 0x7c, 0x54, 0x3c, 0xf0, 0xd2, 0xd3, 0x20, 0x3d, 0x05, 0x17, 0xf2, 0xd9, 0x83, 0xbb, 0x40, 0x35, + 0x77, 0x9f, 0x42, 0x51, 0xe6, 0xaa, 0x88, 0xcf, 0xab, 0xcf, 0x09, 0x16, 0xa8, 0x8b, 0x7f, 0xc4, 0xd5, 0x6e, 0x99, + 0xa9, 0x94, 0x3a, 0xfa, 0xa1, 0x10, 0x4a, 0x2d, 0xbf, 0xe1, 0x37, 0x0a, 0x97, 0x0e, 0x5c, 0xf6, 0x24, 0x0b, 0x2e, + 0x42, 0xf8, 0xec, 0x6a, 0xcc, 0x47, 0xf2, 0x03, 0xad, 0xf0, 0x5a, 0x7c, 0xf9, 0xa9, 0x5c, 0xf5, 0x45, 0x82, 0xc0, + 0x75, 0xf5, 0x2b, 0x22, 0xe0, 0x32, 0xe1, 0x77, 0x70, 0xe1, 0xd2, 0xc4, 0x12, 0x26, 0xe0, 0xed, 0x78, 0x49, 0x23, + 0x16, 0x7a, 0xae, 0x37, 0x4d, 0xe9, 0x90, 0xa6, 0x59, 0xbd, 0x72, 0x0b, 0x51, 0x5e, 0x40, 0x44, 0xae, 0xf9, 0xc0, + 0x67, 0x0a, 0xaf, 0x79, 0x26, 0x3d, 0xed, 0x6f, 0x74, 0xb5, 0x01, 0xe6, 0xe6, 0xd8, 0x94, 0xa4, 0x20, 0x6b, 0x4b, + 0xa5, 0xcd, 0x55, 0x5a, 0x5b, 0xd3, 0x6f, 0x1d, 0x21, 0x47, 0x16, 0xc3, 0xeb, 0x73, 0x7f, 0xf4, 0xea, 0x07, 0x8d, + 0x3f, 0x21, 0xab, 0x5b, 0x31, 0x50, 0x5f, 0xbb, 0xdb, 0xd2, 0xf2, 0xc3, 0xc8, 0xd5, 0x2b, 0xa2, 0xae, 0xa2, 0x88, + 0x2f, 0xd5, 0xda, 0xe1, 0x45, 0xbc, 0x3a, 0xb2, 0xab, 0x5e, 0x74, 0x30, 0x64, 0x23, 0xcf, 0xfe, 0xec, 0xad, 0x7a, + 0x3d, 0xaf, 0xfc, 0x5a, 0x36, 0xca, 0xcb, 0x26, 0x29, 0x5a, 0xc8, 0x28, 0x09, 0x4b, 0x9c, 0x74, 0xb9, 0xf4, 0x52, + 0x70, 0x91, 0x13, 0x0b, 0xa7, 0xf0, 0x8c, 0x2a, 0x48, 0x4e, 0x71, 0x01, 0x90, 0x44, 0x30, 0x49, 0xd5, 0xdf, 0xb2, + 0xd8, 0xfc, 0xd0, 0x8e, 0x2f, 0x3f, 0x0e, 0x93, 0x11, 0x50, 0x61, 0x98, 0x8c, 0xd6, 0xdc, 0x6a, 0x2a, 0xd0, 0xb3, + 0x52, 0x5a, 0x0e, 0x55, 0xba, 0xcf, 0xb2, 0x27, 0x77, 0xef, 0xf4, 0x7b, 0xbc, 0x5c, 0xf0, 0x4e, 0xcb, 0xa8, 0x44, + 0xf9, 0xce, 0xe1, 0x1a, 0xf9, 0x4a, 0x7d, 0x48, 0x5e, 0xca, 0x54, 0xd0, 0x27, 0xe0, 0xf2, 0xa7, 0xa3, 0xad, 0x51, + 0xe2, 0x4a, 0xe9, 0x4e, 0x22, 0x3a, 0x67, 0x03, 0x2d, 0xea, 0xb1, 0xa3, 0x2f, 0xc0, 0xd7, 0xe5, 0xd6, 0x90, 0x26, + 0x56, 0xfe, 0x98, 0x41, 0x28, 0x33, 0xd1, 0x49, 0xc2, 0xdd, 0xce, 0x57, 0xc5, 0x57, 0x3c, 0xb7, 0x6d, 0x02, 0x7c, + 0xdd, 0xbe, 0x97, 0xd2, 0xf8, 0x9f, 0xc8, 0x57, 0xf0, 0x7d, 0xfb, 0xaf, 0xfa, 0xf0, 0x69, 0x75, 0x5f, 0x7e, 0xe5, + 0xfe, 0xab, 0xf2, 0x33, 0xf7, 0xc0, 0x08, 0x6b, 0xb7, 0x93, 0x18, 0x4b, 0x8d, 0xe9, 0x01, 0x0a, 0x91, 0x02, 0xd7, + 0x6d, 0x1d, 0xb9, 0x8e, 0xb2, 0x89, 0xe5, 0xef, 0x8e, 0x12, 0xa7, 0x52, 0x09, 0x70, 0x9a, 0x2d, 0xff, 0x68, 0xdc, + 0xf2, 0x1f, 0xcf, 0x1f, 0xf9, 0x27, 0xe3, 0xe6, 0xa3, 0x79, 0x1d, 0xfe, 0xb6, 0xfc, 0xc7, 0x71, 0xbd, 0xe5, 0x3f, + 0x86, 0xff, 0xbf, 0x3f, 0xf4, 0x8f, 0xc6, 0xf5, 0xa6, 0x7f, 0x32, 0x3f, 0xf0, 0x0f, 0x5e, 0x34, 0x5b, 0xfe, 0x81, + 0xd3, 0x74, 0x54, 0x3f, 0x60, 0xd7, 0x8a, 0x3b, 0x7f, 0xb5, 0x72, 0x20, 0x36, 0x04, 0xd1, 0x54, 0xae, 0xa5, 0x8b, + 0xbd, 0xe2, 0x5b, 0x81, 0xfa, 0x7c, 0x6a, 0x67, 0xdd, 0xd3, 0x30, 0x85, 0x0f, 0xb6, 0x54, 0xcf, 0x6e, 0xa5, 0x0e, + 0x57, 0xf8, 0xc5, 0x86, 0x29, 0xe0, 0x84, 0xbb, 0xd8, 0xbe, 0x41, 0x0e, 0xd7, 0xaf, 0xe5, 0xeb, 0xad, 0xcd, 0x5b, + 0xfe, 0xb6, 0x93, 0xb6, 0x6a, 0x68, 0xde, 0x24, 0x28, 0x99, 0x05, 0x93, 0x9f, 0x12, 0x90, 0x93, 0x7c, 0x13, 0xe5, + 0xab, 0xf3, 0x43, 0xca, 0x67, 0xca, 0xad, 0x4b, 0xf4, 0xb4, 0xbc, 0xa8, 0x10, 0x31, 0x78, 0xed, 0x41, 0x9e, 0x1b, + 0xd0, 0x2b, 0x6e, 0xda, 0x12, 0x4b, 0x92, 0x5f, 0xd0, 0xac, 0xeb, 0x42, 0x91, 0x1b, 0xb8, 0xd2, 0xc5, 0xe7, 0x16, + 0x1f, 0xad, 0x29, 0x08, 0xbb, 0x2c, 0xc0, 0xf2, 0xb2, 0x11, 0x9c, 0x5a, 0xc0, 0x8f, 0x8b, 0xf6, 0xf6, 0xb6, 0x9e, + 0x17, 0xa9, 0x40, 0xc2, 0x5a, 0xcb, 0x8f, 0x5d, 0xd8, 0xac, 0xc8, 0xb5, 0x11, 0x5d, 0x8c, 0x2b, 0x51, 0x88, 0x34, + 0x9e, 0xae, 0x69, 0x28, 0xfc, 0x30, 0x51, 0xc9, 0x23, 0x16, 0xc3, 0xc2, 0x4d, 0x7a, 0x80, 0x72, 0x2e, 0x42, 0xeb, + 0x6b, 0xb6, 0xfa, 0x9c, 0x73, 0x11, 0x9a, 0x2b, 0xa1, 0x89, 0xa8, 0xdc, 0x99, 0x18, 0xb7, 0x3a, 0xaf, 0xdf, 0x9d, + 0x39, 0xea, 0x78, 0x9e, 0xee, 0x8f, 0x5b, 0x9d, 0x53, 0xe9, 0x33, 0x51, 0x17, 0xca, 0x88, 0xba, 0x50, 0xe6, 0xe8, + 0xcb, 0x85, 0x10, 0x49, 0xcb, 0xf7, 0xd5, 0xb2, 0xa5, 0xcd, 0xa0, 0xbc, 0xbd, 0x93, 0x59, 0x2c, 0x18, 0xbc, 0xaa, + 0x79, 0x1f, 0xba, 0xd6, 0x61, 0xc3, 0x8a, 0xfc, 0x63, 0xad, 0x1d, 0x5e, 0x8b, 0xc4, 0xf8, 0x86, 0x87, 0x2c, 0xa6, + 0x26, 0xe3, 0x58, 0x0f, 0x55, 0x64, 0xc8, 0xaf, 0xb7, 0xce, 0x66, 0xd7, 0x13, 0x26, 0x5c, 0x93, 0xc7, 0xff, 0x5e, + 0x77, 0x38, 0x95, 0x53, 0x75, 0xae, 0x72, 0xed, 0xbc, 0x36, 0x9f, 0xa5, 0xa9, 0x6e, 0xa9, 0x5e, 0xbd, 0x96, 0x10, + 0x70, 0x33, 0x6c, 0x7c, 0xd0, 0x29, 0xdc, 0xc5, 0x76, 0x5d, 0x7e, 0xba, 0x3f, 0x3e, 0xe8, 0x5c, 0x05, 0x53, 0x3d, + 0xde, 0x0b, 0x3e, 0xda, 0x3c, 0x56, 0xcc, 0x47, 0x5d, 0x79, 0x05, 0x42, 0xdd, 0xb5, 0x35, 0xca, 0x2f, 0x8f, 0xdd, + 0xce, 0xa9, 0x56, 0x06, 0x1c, 0x19, 0x0e, 0x77, 0x8f, 0x1a, 0xe6, 0x56, 0x45, 0xcc, 0x47, 0x70, 0x20, 0x55, 0x17, + 0x6b, 0x92, 0x8a, 0xc7, 0x7d, 0xdc, 0xec, 0x9c, 0x86, 0x8e, 0xe4, 0x2d, 0x92, 0x79, 0x64, 0xc1, 0x3e, 0x74, 0x1e, + 0xf3, 0x09, 0xf5, 0x19, 0xdf, 0xbf, 0xa1, 0xd7, 0xf5, 0x70, 0xca, 0x4a, 0xf7, 0x36, 0x28, 0x1d, 0xc5, 0x94, 0xbc, + 0x9c, 0x09, 0x7e, 0x86, 0x2b, 0x8b, 0x94, 0x2c, 0x3c, 0xd7, 0xbe, 0x73, 0xb0, 0x55, 0x80, 0x84, 0x5c, 0x47, 0x71, + 0x78, 0xe3, 0x63, 0xd7, 0xb2, 0x37, 0x77, 0x3b, 0xff, 0xfa, 0x3f, 0xfe, 0x97, 0x76, 0x9b, 0x9f, 0xee, 0x8f, 0x9b, + 0x66, 0xac, 0x15, 0x44, 0xe7, 0xa7, 0x70, 0x11, 0xb1, 0x8c, 0xf3, 0xd2, 0xdb, 0xfa, 0x28, 0x65, 0x51, 0x7d, 0x1c, + 0xc6, 0x43, 0xb7, 0xb3, 0x1d, 0x41, 0xf6, 0x0d, 0x24, 0x0d, 0x75, 0xb5, 0x08, 0x48, 0xf0, 0x37, 0xdd, 0xa1, 0x31, + 0x57, 0x31, 0xe4, 0x69, 0xb5, 0x6f, 0xd4, 0x94, 0x07, 0xaa, 0x72, 0xab, 0x26, 0xd5, 0x5f, 0xaf, 0xd2, 0x4c, 0x2d, + 0xad, 0x5c, 0xa6, 0xc9, 0x5d, 0xa7, 0x88, 0x53, 0xfd, 0xdf, 0xff, 0xf9, 0x5f, 0xfe, 0x9b, 0x79, 0x84, 0xf0, 0xd3, + 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, 0x85, 0x0b, 0x18, 0x3a, 0x44, 0x25, 0xf9, 0x84, 0x53, 0xc6, + 0xa7, 0x14, 0xc3, 0x70, 0x20, 0x47, 0x71, 0xc2, 0x32, 0xc1, 0x06, 0xd5, 0xeb, 0x35, 0x17, 0x72, 0x42, 0x79, 0xd8, + 0x34, 0x74, 0xf2, 0xd0, 0xe6, 0x25, 0x8d, 0x54, 0x50, 0x2e, 0x69, 0x31, 0x3f, 0xdd, 0x07, 0x7c, 0x3f, 0xec, 0x46, + 0xa2, 0x5f, 0x6c, 0xc7, 0xc2, 0x38, 0x65, 0xa1, 0x24, 0x2f, 0xcb, 0x1d, 0x08, 0x97, 0x2c, 0xe0, 0x31, 0x68, 0x59, + 0xc5, 0x72, 0xf7, 0x2a, 0x7d, 0xda, 0x1f, 0x66, 0x99, 0x60, 0x43, 0x40, 0xb9, 0x72, 0xfd, 0xca, 0xc8, 0x74, 0x1d, + 0xd4, 0xbf, 0xf8, 0x2e, 0x97, 0xa3, 0x28, 0xdb, 0xfa, 0xf0, 0xe4, 0x4f, 0xf9, 0x5f, 0x26, 0xa0, 0x64, 0x39, 0xde, + 0x24, 0xbc, 0xd5, 0x16, 0xf7, 0x71, 0xa3, 0x31, 0xbd, 0x45, 0x8b, 0x72, 0x06, 0xbc, 0x6d, 0x32, 0xe9, 0x2e, 0xb6, + 0x07, 0x94, 0x21, 0xed, 0xc2, 0x33, 0xdd, 0x70, 0xc0, 0xbd, 0xed, 0x34, 0xf2, 0xfc, 0xcf, 0x0b, 0xe9, 0x1c, 0x65, + 0xbf, 0x42, 0xe8, 0x59, 0xfb, 0x91, 0xaf, 0xb9, 0xbd, 0xb8, 0x85, 0xd5, 0xab, 0xa5, 0x7a, 0x8d, 0x9b, 0xeb, 0x17, + 0xed, 0xec, 0xd0, 0xb9, 0x1d, 0xf4, 0x3e, 0x84, 0x30, 0xf6, 0xb8, 0x89, 0xc7, 0xad, 0x45, 0x31, 0xbc, 0x10, 0x7c, + 0x62, 0xc7, 0xca, 0x69, 0x48, 0x07, 0x74, 0x68, 0xfc, 0xef, 0xba, 0x5e, 0xc5, 0xc1, 0xf3, 0xf1, 0xc1, 0x86, 0xb9, + 0x34, 0x48, 0x32, 0x46, 0xee, 0x34, 0xf2, 0x2f, 0xe1, 0x04, 0x2e, 0x86, 0x31, 0x0f, 0x45, 0x20, 0x09, 0xb6, 0x6d, + 0x47, 0xdc, 0x43, 0x60, 0x33, 0x7c, 0x61, 0xc1, 0xd3, 0x56, 0x4d, 0xc1, 0x13, 0x5e, 0xbd, 0x0e, 0x99, 0xfb, 0xb2, + 0xbb, 0x3d, 0x94, 0x72, 0xa4, 0x7d, 0xaf, 0x03, 0xd9, 0xaf, 0x2a, 0x1e, 0x28, 0x2d, 0x63, 0x5a, 0x68, 0x73, 0xbd, + 0x12, 0xd5, 0xaa, 0xf6, 0x27, 0xe1, 0xb9, 0x12, 0x4c, 0x77, 0xb5, 0x95, 0x2c, 0x84, 0x56, 0xaf, 0xc8, 0xf7, 0x85, + 0x15, 0x14, 0x4e, 0xa7, 0xb2, 0x21, 0x6a, 0x9f, 0xee, 0x2b, 0xe5, 0x15, 0xb8, 0x87, 0xcc, 0xd2, 0x50, 0x49, 0x11, + 0xba, 0x91, 0x3e, 0x0a, 0xea, 0x97, 0x4e, 0x97, 0x80, 0xcf, 0x9a, 0x75, 0xfe, 0x1f, 0xd6, 0xb2, 0x30, 0xa4, 0x67, + 0x88, 0x00, 0x00}; } // namespace web_server } // namespace esphome diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h index f649a9385e..bde1ce1fb5 100644 --- a/esphome/components/web_server/server_index_v3.h +++ b/esphome/components/web_server/server_index_v3.h @@ -3632,367 +3632,373 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe7, 0xec, 0xd8, 0x98, 0x31, 0x94, 0x4f, 0x43, 0x40, 0x9e, 0xd0, 0xf7, 0x01, 0xcd, 0x25, 0x67, 0x23, 0xad, 0x2b, 0xfb, 0x10, 0x17, 0x97, 0xdc, 0x84, 0x6a, 0x31, 0x6f, 0x2b, 0x3d, 0x2a, 0xc4, 0x1b, 0x16, 0x80, 0x65, 0xe9, 0x69, 0x93, 0x82, 0x6c, 0x94, 0x54, 0x45, 0xfe, 0x13, 0xbf, 0x03, 0xae, 0xad, 0xac, 0xe4, 0x0a, 0x78, 0xf5, 0xff, 0xd3, - 0xdc, 0xd3, 0x2f, 0xb7, 0x8d, 0x1b, 0xff, 0x7f, 0x9f, 0x82, 0x61, 0xd2, 0x1c, 0x99, 0x90, 0x34, 0x29, 0x59, 0xb6, - 0x23, 0x59, 0xf6, 0xdd, 0x25, 0xb9, 0xa9, 0x3b, 0xbe, 0xcb, 0x4d, 0xe2, 0x66, 0xda, 0xf3, 0x79, 0x2c, 0x4a, 0x82, - 0x24, 0x36, 0x14, 0xa9, 0x21, 0x29, 0x5b, 0x3e, 0x85, 0x7d, 0x96, 0x3e, 0x4b, 0x9f, 0xec, 0x37, 0xbb, 0x0b, 0x80, - 0xe0, 0x87, 0x3e, 0x7c, 0xc9, 0xb5, 0xbf, 0xb9, 0xba, 0x11, 0x41, 0x00, 0x04, 0x16, 0xc0, 0x62, 0xbf, 0xd7, 0x9f, - 0x72, 0xd9, 0x8b, 0x65, 0xb0, 0xfd, 0x3e, 0xf7, 0xf9, 0x33, 0x73, 0x70, 0x4b, 0x02, 0xc1, 0xe7, 0x64, 0xf1, 0x74, - 0x1a, 0x32, 0x43, 0x17, 0xc9, 0x43, 0x74, 0x4b, 0x7e, 0xe6, 0xfc, 0x89, 0x2b, 0x22, 0x76, 0x9a, 0xf9, 0xa6, 0xa3, - 0x25, 0x66, 0xcc, 0x64, 0x48, 0x3b, 0xa2, 0x5c, 0x51, 0x36, 0x7b, 0x87, 0xea, 0x0d, 0xbe, 0x2e, 0xc5, 0xd1, 0xb5, - 0xc7, 0xf1, 0x72, 0x18, 0x32, 0x1b, 0xb7, 0x3b, 0x7c, 0x72, 0x3d, 0x5c, 0x0e, 0x87, 0x90, 0xa5, 0xe5, 0x89, 0x6b, - 0x41, 0xdc, 0x99, 0x38, 0x45, 0x7e, 0x30, 0x37, 0x7b, 0x30, 0x29, 0x27, 0xab, 0x0e, 0x1f, 0x6c, 0x45, 0x40, 0xd4, - 0x43, 0x1f, 0xc8, 0x80, 0xf7, 0x6b, 0x38, 0xb5, 0x7d, 0xfd, 0x03, 0xec, 0xbe, 0x54, 0xef, 0x35, 0x1d, 0xfd, 0xfe, - 0xb5, 0xfe, 0x01, 0x61, 0x8c, 0xd9, 0x8b, 0x5f, 0xd3, 0xee, 0xd5, 0x2d, 0x9d, 0x94, 0xde, 0x4b, 0xcc, 0x63, 0x00, - 0x42, 0xdf, 0x37, 0x81, 0x3f, 0x8d, 0xe2, 0x34, 0x0b, 0x46, 0xfa, 0x4d, 0xef, 0x22, 0x30, 0xae, 0xe7, 0x99, 0x61, - 0xde, 0x58, 0xa3, 0x4c, 0x4d, 0x81, 0x22, 0x10, 0x26, 0x66, 0x40, 0xd9, 0x54, 0x49, 0x3d, 0x41, 0x5b, 0x2b, 0x0a, - 0xd4, 0x8c, 0x95, 0x46, 0x59, 0x1f, 0xea, 0x55, 0xf2, 0xa9, 0x60, 0x62, 0x28, 0x1d, 0x5b, 0x9a, 0x3d, 0xe2, 0x54, - 0x5e, 0x2f, 0xd7, 0x78, 0x95, 0x67, 0xc5, 0x6d, 0x89, 0x31, 0x80, 0x85, 0xe3, 0x0c, 0x3d, 0x3f, 0x51, 0x8d, 0x3e, - 0x4b, 0xf7, 0xee, 0xe0, 0xbb, 0x32, 0x5d, 0x00, 0xf7, 0x37, 0x58, 0x5c, 0x44, 0x71, 0xa6, 0x41, 0x60, 0x1b, 0xf8, - 0xe2, 0xa0, 0x6a, 0x24, 0xc6, 0x7b, 0x35, 0xcc, 0x9c, 0x23, 0x83, 0xef, 0xf1, 0xf2, 0x33, 0x78, 0x78, 0xb3, 0x52, - 0x04, 0x0b, 0x62, 0x16, 0x22, 0x58, 0xc0, 0x2c, 0xbe, 0x8c, 0xef, 0xab, 0x7a, 0x90, 0xd7, 0x83, 0xdd, 0x77, 0xaf, - 0x21, 0xc8, 0x64, 0x91, 0xd5, 0xcf, 0xe0, 0x89, 0x49, 0x05, 0xa1, 0x53, 0x39, 0x53, 0x68, 0xf8, 0x21, 0x68, 0x98, - 0x0c, 0xec, 0xc4, 0xf0, 0x2e, 0x00, 0x94, 0xc4, 0xaf, 0xe9, 0x41, 0x7e, 0x2b, 0x52, 0x27, 0x8b, 0xc4, 0xc5, 0xca, - 0xe5, 0x0c, 0xd8, 0x35, 0x5a, 0x2c, 0x33, 0x0c, 0xb5, 0x0b, 0x03, 0x60, 0xb9, 0xae, 0x61, 0xe8, 0x4e, 0xc0, 0xd2, - 0x05, 0x99, 0x98, 0xeb, 0x5a, 0x30, 0xae, 0x97, 0x71, 0xa2, 0x17, 0x90, 0x17, 0xe2, 0x77, 0x14, 0x54, 0xc1, 0x63, - 0xc2, 0xa7, 0x31, 0xb2, 0x8a, 0x38, 0xf5, 0xc6, 0x08, 0x15, 0x3a, 0x0d, 0x98, 0x61, 0x44, 0xfd, 0xf4, 0x8c, 0xb0, - 0x71, 0xb2, 0x10, 0x7e, 0xb3, 0x34, 0xcd, 0xc1, 0xb3, 0x75, 0x94, 0x9f, 0x3f, 0x5b, 0xa7, 0x79, 0xff, 0xd9, 0xda, - 0x97, 0xb6, 0x02, 0xfa, 0x95, 0x4e, 0x86, 0x02, 0x03, 0x04, 0xc3, 0x20, 0xbf, 0x2d, 0x3c, 0x77, 0x8a, 0xf9, 0xc2, - 0x2e, 0xa3, 0x72, 0x0d, 0x55, 0xf7, 0x7d, 0xae, 0xa0, 0x5f, 0x24, 0xc1, 0xdc, 0x4f, 0x1e, 0x48, 0x9f, 0x6f, 0xa9, - 0x4a, 0x7f, 0x53, 0xd7, 0x08, 0xd1, 0x13, 0x00, 0x08, 0xe7, 0xeb, 0xda, 0xb7, 0xb2, 0x8c, 0xf1, 0xd9, 0x4a, 0xa5, - 0x26, 0x7c, 0xeb, 0x56, 0x7f, 0xc9, 0x9c, 0x31, 0xcb, 0xfc, 0x20, 0xa4, 0x26, 0x3d, 0x91, 0xad, 0xbe, 0x36, 0xbd, - 0xb4, 0x3c, 0xbd, 0xa8, 0xbc, 0x7f, 0x70, 0x32, 0x74, 0x05, 0xd0, 0xb8, 0x71, 0x66, 0x98, 0xc5, 0xaa, 0x79, 0x45, - 0xe9, 0xdd, 0x7f, 0x75, 0x39, 0x18, 0x2c, 0x47, 0x04, 0xcb, 0xc1, 0xa2, 0x51, 0x3c, 0x66, 0x7f, 0x7b, 0x7f, 0x21, - 0xd3, 0x66, 0x81, 0x04, 0x68, 0xc0, 0x37, 0x66, 0x8a, 0xf4, 0x43, 0x82, 0xb4, 0x03, 0x25, 0xb8, 0xd2, 0xe4, 0x16, - 0x4a, 0x72, 0x5d, 0x3b, 0xa7, 0xb1, 0xb3, 0x31, 0x8d, 0xba, 0x1f, 0x63, 0xab, 0x24, 0x3f, 0x3d, 0xa0, 0xda, 0x74, - 0xdb, 0x51, 0x25, 0x00, 0x43, 0x02, 0x33, 0x2c, 0xa0, 0x00, 0x19, 0x3e, 0xfb, 0x5e, 0xc1, 0x50, 0x38, 0x73, 0x94, - 0xb3, 0x7b, 0xe7, 0x65, 0x52, 0x05, 0x5b, 0xe9, 0x67, 0xa7, 0x98, 0xb3, 0x0b, 0xee, 0x6b, 0x88, 0xf2, 0x71, 0x7a, - 0x40, 0x8f, 0x5a, 0xe5, 0x44, 0x14, 0x9d, 0x08, 0xd6, 0xae, 0xcb, 0x3b, 0x78, 0xd4, 0x51, 0x81, 0x14, 0xf1, 0x50, - 0xea, 0xe7, 0xba, 0x36, 0xe7, 0xa4, 0x11, 0x0f, 0x27, 0x04, 0xb1, 0x06, 0x5c, 0x38, 0xbb, 0xba, 0x36, 0xf7, 0x57, - 0x38, 0x73, 0xf1, 0xc6, 0x5f, 0x19, 0x1e, 0x7f, 0x55, 0x9c, 0xb5, 0xb4, 0x7c, 0xd6, 0x46, 0x7c, 0x71, 0xc1, 0x91, - 0x40, 0x72, 0xd6, 0x33, 0x54, 0xd0, 0x36, 0x2c, 0xee, 0x4c, 0x2c, 0xee, 0x78, 0xc3, 0xe2, 0x8e, 0xb7, 0x2c, 0x6e, - 0xc8, 0x17, 0x52, 0x93, 0xa0, 0x4b, 0xd0, 0x39, 0x4c, 0x02, 0x8f, 0x13, 0x1a, 0x5d, 0x7e, 0xce, 0x10, 0x4e, 0x76, - 0x1a, 0x82, 0x71, 0xd4, 0x06, 0x58, 0x35, 0xc1, 0x45, 0x01, 0x44, 0x7d, 0xe2, 0xf2, 0xd4, 0x89, 0x79, 0x43, 0x0e, - 0x4e, 0x23, 0xac, 0xce, 0x17, 0x76, 0x29, 0xe5, 0x17, 0x37, 0x66, 0x1b, 0x66, 0x3a, 0xdb, 0x32, 0xd3, 0x51, 0xe9, - 0xe8, 0xf2, 0x69, 0xd3, 0x21, 0x54, 0x27, 0x05, 0x7b, 0x10, 0x0c, 0x46, 0x71, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x1c, - 0xab, 0xec, 0xa8, 0x85, 0x9f, 0xa6, 0xf7, 0x71, 0x02, 0x1a, 0x17, 0xe8, 0xe6, 0x71, 0x5b, 0x6a, 0x1e, 0x44, 0x3c, - 0x98, 0xcb, 0xc6, 0xcd, 0x54, 0xbc, 0x57, 0xb7, 0x54, 0xab, 0xd3, 0xa1, 0x1a, 0x0b, 0x3f, 0xcb, 0x58, 0x82, 0x40, - 0xf7, 0x21, 0xea, 0xf7, 0xff, 0x93, 0x6d, 0xd6, 0x80, 0x43, 0x42, 0x05, 0xab, 0x23, 0x86, 0x5e, 0x00, 0x6d, 0x95, - 0x88, 0x8b, 0x58, 0x09, 0x0c, 0x97, 0x48, 0xc0, 0xff, 0x84, 0xc7, 0xd5, 0x48, 0x14, 0xd7, 0x25, 0xef, 0xc8, 0x74, - 0x16, 0xfe, 0xf8, 0x03, 0x28, 0xf6, 0x8c, 0x96, 0x05, 0x46, 0xba, 0x6a, 0x18, 0xb8, 0x84, 0x88, 0xbd, 0x51, 0x81, - 0x24, 0x11, 0x4b, 0x72, 0x13, 0x28, 0xf0, 0x9e, 0xf4, 0xed, 0xc9, 0xcd, 0xba, 0x95, 0x1f, 0x4c, 0x03, 0xb3, 0x86, - 0x35, 0x01, 0xb5, 0x85, 0xfd, 0x33, 0xc9, 0x73, 0x85, 0x96, 0x77, 0x64, 0x82, 0xe4, 0xf7, 0x1a, 0xf2, 0x99, 0xba, - 0x82, 0xa1, 0x1d, 0x24, 0x70, 0x6b, 0x5d, 0xbb, 0x37, 0xf9, 0xf3, 0x29, 0xfe, 0xf2, 0x6e, 0xf2, 0xe7, 0x43, 0xfc, - 0xd5, 0xba, 0xc1, 0xcc, 0x75, 0x0d, 0x8c, 0xbc, 0x32, 0x67, 0xfd, 0xac, 0xb4, 0x9f, 0xc8, 0xfe, 0xec, 0x11, 0xdb, - 0x86, 0x2f, 0xf0, 0xd3, 0x67, 0xeb, 0x14, 0x3c, 0x2e, 0xd5, 0x39, 0x44, 0x4e, 0x62, 0xe6, 0x8d, 0xe5, 0xd3, 0x0d, - 0xe5, 0x43, 0xf3, 0xbf, 0x7c, 0xf1, 0xe3, 0x2e, 0x89, 0x8b, 0x3b, 0xa5, 0x2c, 0x86, 0xb8, 0x1d, 0x06, 0x91, 0x9f, - 0x3c, 0xdc, 0x12, 0x7b, 0x61, 0x08, 0xda, 0x5d, 0x8a, 0x57, 0x88, 0xbc, 0x2c, 0xab, 0xbb, 0x32, 0x45, 0xc0, 0xfb, - 0xc0, 0x2f, 0xfa, 0xfe, 0xdf, 0x13, 0x85, 0x6c, 0x2b, 0x31, 0xa0, 0x7c, 0x41, 0x4a, 0x1f, 0xba, 0x7d, 0xb6, 0x36, - 0x58, 0xbd, 0x9b, 0xca, 0x6c, 0x2b, 0x74, 0x21, 0x2c, 0x0f, 0x32, 0xb3, 0xf3, 0x71, 0xd0, 0x45, 0x7d, 0xd6, 0x30, - 0x5e, 0xd9, 0xcf, 0xd6, 0xd9, 0xb9, 0x3e, 0xf7, 0x93, 0x4f, 0x6c, 0x6c, 0x8f, 0x82, 0x64, 0x14, 0x32, 0xbd, 0xab, - 0x0f, 0x43, 0x3f, 0xfa, 0xc4, 0x1f, 0xed, 0x78, 0x99, 0xa1, 0x86, 0x7a, 0x27, 0xef, 0x2b, 0x60, 0x42, 0x22, 0x3b, - 0x24, 0x56, 0x1b, 0xa0, 0xa0, 0xbd, 0x96, 0x02, 0xaf, 0x82, 0x50, 0x2c, 0x6a, 0x59, 0x60, 0x60, 0x09, 0x4a, 0x73, - 0xf0, 0x58, 0xb5, 0x74, 0x5c, 0x2f, 0xdd, 0x52, 0xa7, 0x4a, 0xc2, 0x4a, 0x99, 0x72, 0xf1, 0x16, 0x7b, 0xf8, 0xfd, - 0x9f, 0xa3, 0x64, 0xd8, 0xfb, 0x7f, 0x4e, 0xf6, 0xf2, 0x65, 0x33, 0x84, 0x52, 0x9b, 0x3c, 0x25, 0x1e, 0xf1, 0x71, - 0x4e, 0x60, 0x6e, 0xfe, 0xb4, 0xda, 0xd8, 0x4f, 0xd3, 0xe5, 0x9c, 0x8d, 0x49, 0x33, 0x78, 0x5e, 0x0c, 0xaa, 0xcc, - 0x59, 0xa8, 0x03, 0xfb, 0x75, 0xd9, 0x3a, 0x3e, 0x7c, 0x0d, 0x16, 0x0b, 0x40, 0x50, 0xc6, 0x93, 0x89, 0x5e, 0xf0, - 0xf8, 0x3b, 0x9a, 0x79, 0x87, 0xbf, 0x2e, 0x7f, 0x78, 0xeb, 0xfe, 0x20, 0x1b, 0x47, 0x40, 0x18, 0x0b, 0xf5, 0x2b, - 0xa7, 0x8b, 0x95, 0xf1, 0x8a, 0x19, 0x4d, 0xfc, 0x68, 0xf3, 0x74, 0xae, 0x4b, 0x5b, 0x7c, 0xc1, 0xd8, 0x18, 0x08, - 0x6e, 0xab, 0x56, 0x7a, 0x1b, 0xb2, 0x3b, 0x26, 0x55, 0xbb, 0xf5, 0x8f, 0x35, 0xb4, 0xc0, 0xd8, 0x73, 0x5c, 0x65, - 0xcc, 0xa9, 0x3a, 0x65, 0x4a, 0x03, 0x9c, 0x03, 0x9f, 0xb9, 0x7a, 0xc4, 0x2a, 0x47, 0x6a, 0x60, 0xe9, 0xca, 0x00, - 0x36, 0x8e, 0xec, 0x7c, 0x43, 0x79, 0x17, 0x13, 0x4f, 0x37, 0x8f, 0xcd, 0xf2, 0xcc, 0x2e, 0xc4, 0xea, 0xe6, 0x70, - 0x0a, 0xe1, 0xe4, 0x19, 0x85, 0x38, 0x64, 0x13, 0xc4, 0x9a, 0x84, 0x64, 0x3a, 0x49, 0x5f, 0x84, 0xb5, 0x23, 0x9a, - 0xfd, 0x0a, 0x39, 0x54, 0xe3, 0xda, 0x68, 0xe5, 0x99, 0x0f, 0x31, 0xa1, 0x6b, 0xc4, 0xd2, 0x74, 0x23, 0xc0, 0xe4, - 0xa2, 0x5b, 0x7a, 0x51, 0xbb, 0x0c, 0x8f, 0xa2, 0xdc, 0x72, 0x2d, 0x20, 0x09, 0x70, 0x82, 0xd5, 0x6f, 0xe1, 0xf5, - 0x72, 0x3b, 0xe7, 0xf6, 0x2a, 0xc9, 0x74, 0xa8, 0x73, 0x5b, 0x82, 0x4d, 0xef, 0xef, 0x75, 0x3e, 0xa8, 0xd2, 0x35, - 0xdd, 0x38, 0x34, 0xa3, 0x84, 0x7a, 0x6b, 0xe2, 0x22, 0xec, 0x40, 0x8c, 0xa9, 0x82, 0x5f, 0xd9, 0x64, 0xc2, 0x46, - 0x59, 0x6a, 0x0a, 0xe1, 0x91, 0x8c, 0x1e, 0x0b, 0x5e, 0x43, 0x4f, 0xfa, 0xfa, 0x4f, 0xe0, 0x43, 0x2f, 0x82, 0x2c, - 0xf1, 0x01, 0x09, 0x9e, 0xa9, 0x19, 0x4c, 0xd4, 0x63, 0x19, 0x44, 0xfc, 0x2b, 0x90, 0x1c, 0xbc, 0xa1, 0x1c, 0x87, - 0xc6, 0xef, 0x9f, 0x62, 0x5f, 0xc4, 0xd2, 0xaa, 0x65, 0x3b, 0x2a, 0xda, 0x76, 0x7c, 0xd7, 0xde, 0x0f, 0x1d, 0xcf, - 0xcd, 0x75, 0x0b, 0x7c, 0xb7, 0x3e, 0xed, 0x7b, 0xe8, 0xb1, 0x55, 0x1b, 0x5a, 0x2d, 0xa3, 0xc7, 0xb4, 0x6b, 0x79, - 0xaf, 0x3c, 0xdd, 0x22, 0x93, 0x39, 0x05, 0xb7, 0x8d, 0xe2, 0x3b, 0x96, 0x7c, 0xf1, 0x54, 0xca, 0x9d, 0xef, 0x37, - 0x9e, 0x23, 0xcf, 0x05, 0x24, 0x9c, 0xc5, 0x8b, 0x47, 0x4c, 0xa1, 0xad, 0x5b, 0xfa, 0x28, 0x8c, 0x53, 0xa6, 0xce, - 0x81, 0x84, 0x20, 0x5f, 0x38, 0x89, 0x9f, 0xdf, 0xbf, 0xfd, 0xf0, 0x41, 0xb7, 0x30, 0x13, 0x68, 0xaa, 0xf6, 0xce, - 0x37, 0xd4, 0x0e, 0xec, 0xdf, 0xb8, 0xef, 0xe8, 0x86, 0x21, 0xa6, 0xb6, 0xbc, 0xe7, 0xa8, 0xac, 0xb6, 0xe5, 0xf8, - 0xcd, 0xc3, 0xbf, 0x4c, 0x9c, 0xe8, 0x5e, 0xf3, 0x6a, 0xc0, 0x0d, 0xdb, 0xaf, 0xb7, 0x52, 0xc9, 0x3c, 0x88, 0x6e, - 0x1b, 0x4a, 0xfd, 0x55, 0x43, 0x29, 0xb0, 0x72, 0x35, 0x5c, 0xb5, 0x8c, 0xe7, 0x0a, 0x69, 0x00, 0x89, 0x9c, 0x77, - 0x81, 0x4b, 0xe1, 0xa7, 0xbe, 0x60, 0xd0, 0x3c, 0x92, 0x7b, 0x75, 0xd4, 0x0d, 0xc5, 0x9c, 0x09, 0x92, 0xb0, 0x1d, - 0x85, 0x60, 0xf0, 0xc7, 0x54, 0xad, 0x5c, 0x99, 0x6c, 0x94, 0xe6, 0xba, 0x4a, 0x27, 0x44, 0xde, 0xde, 0x66, 0x6c, - 0xbe, 0x60, 0x89, 0x9f, 0x2d, 0x13, 0x76, 0x1b, 0xc6, 0xf7, 0x4f, 0x0a, 0x73, 0xfa, 0x1d, 0x95, 0x67, 0xc1, 0x74, - 0x26, 0x6b, 0x9f, 0x1b, 0xac, 0x2f, 0x17, 0x70, 0xeb, 0x07, 0xf2, 0xff, 0xfc, 0xdb, 0x71, 0xfe, 0xf3, 0xef, 0x9d, - 0x55, 0xa1, 0xfb, 0x7c, 0x60, 0x65, 0xfd, 0x3d, 0xf6, 0x45, 0xf3, 0x97, 0xca, 0x30, 0x6f, 0xae, 0x53, 0x5b, 0x04, - 0x78, 0x5f, 0x5b, 0x82, 0x5a, 0x61, 0x79, 0xdf, 0x3c, 0x6a, 0x60, 0x30, 0xaf, 0x9d, 0x23, 0x83, 0x4a, 0x5f, 0x34, - 0xb4, 0x81, 0xd9, 0xdd, 0x6b, 0x45, 0x7e, 0x3f, 0x84, 0x77, 0xcd, 0xe1, 0x0b, 0x87, 0xcf, 0xe5, 0x92, 0xaf, 0x07, - 0x03, 0x99, 0x5b, 0x4e, 0x6d, 0x0a, 0x26, 0xfe, 0xe7, 0xb5, 0x12, 0x7e, 0x79, 0x76, 0x5d, 0x93, 0x7c, 0xef, 0xfb, - 0xaf, 0x07, 0x68, 0x8c, 0x76, 0x3a, 0x4c, 0x0a, 0x62, 0x65, 0x23, 0x6a, 0x23, 0x63, 0xf2, 0x5a, 0xa7, 0x35, 0xbc, - 0x06, 0xa5, 0x98, 0x70, 0x2c, 0x1f, 0x98, 0xd6, 0xeb, 0x01, 0x17, 0x2c, 0x71, 0xfb, 0xd7, 0x6e, 0x75, 0x6b, 0x73, - 0xb1, 0x6c, 0x09, 0xe8, 0x96, 0x46, 0xfa, 0x1f, 0xac, 0xcc, 0x0a, 0x39, 0x1e, 0x0a, 0xf8, 0x41, 0xa2, 0x30, 0xc8, - 0x31, 0xdf, 0xc9, 0xbb, 0x4d, 0x36, 0x62, 0x3f, 0xef, 0xb6, 0x11, 0xbb, 0xda, 0xcb, 0x46, 0xec, 0xe7, 0xaf, 0x6e, - 0x23, 0xf6, 0x4e, 0xb5, 0x11, 0x83, 0x45, 0x7c, 0xcb, 0xf6, 0x32, 0xdc, 0x12, 0x56, 0x1b, 0xf1, 0x7d, 0xda, 0xf7, - 0x38, 0x49, 0x9b, 0x8e, 0x66, 0x0c, 0x64, 0x04, 0x7c, 0x55, 0xc2, 0x78, 0x0a, 0x46, 0x5c, 0x7f, 0xbc, 0xb9, 0x55, - 0x18, 0x4f, 0x55, 0x63, 0xab, 0x88, 0x47, 0x7c, 0x2d, 0xa2, 0x38, 0x91, 0x81, 0x93, 0x6b, 0x89, 0x98, 0x4f, 0xf6, - 0xa1, 0xa9, 0x64, 0xb5, 0x96, 0xd6, 0x6b, 0x2d, 0x61, 0x02, 0xd5, 0x45, 0xeb, 0x29, 0xd9, 0xb0, 0xf5, 0x52, 0xc4, - 0xb6, 0x50, 0x7b, 0x90, 0x56, 0xc2, 0x14, 0x27, 0x62, 0xad, 0xff, 0xba, 0xf2, 0xbe, 0xbf, 0xf6, 0x7a, 0x6d, 0x0f, - 0x9c, 0xb3, 0x81, 0xc3, 0xc4, 0x02, 0xb7, 0xd7, 0x6e, 0x43, 0xc1, 0xbd, 0x52, 0xd0, 0x82, 0x82, 0x40, 0x29, 0xe8, - 0x40, 0xc1, 0x48, 0x29, 0x38, 0x82, 0x82, 0xb1, 0x52, 0x70, 0x0c, 0x05, 0x77, 0x7a, 0x7e, 0x1d, 0xc9, 0xe1, 0x1e, - 0x9b, 0x37, 0x16, 0x31, 0x15, 0xa2, 0xec, 0xd8, 0xf2, 0xc0, 0x6a, 0xca, 0x9f, 0x76, 0x63, 0x8b, 0xa4, 0x8b, 0xdd, - 0xc4, 0xba, 0x9f, 0x31, 0x0a, 0x14, 0xfd, 0x06, 0xef, 0x1c, 0x27, 0x8b, 0xc1, 0x6e, 0x5a, 0x04, 0x60, 0x10, 0x70, - 0xd0, 0x74, 0x13, 0x04, 0x46, 0x3d, 0xb9, 0x72, 0x22, 0x88, 0x85, 0xb2, 0x96, 0xc5, 0x3b, 0xfa, 0x9c, 0x2d, 0xb7, - 0x40, 0x61, 0x71, 0x62, 0xa8, 0x52, 0xc9, 0xaf, 0x61, 0x77, 0xf0, 0x86, 0x0d, 0x97, 0x53, 0xed, 0x32, 0x9e, 0xee, - 0x34, 0x21, 0x50, 0x5f, 0xc1, 0x28, 0x75, 0x52, 0xbf, 0xd8, 0x62, 0x5b, 0xf2, 0x6f, 0xd1, 0x63, 0x5e, 0xae, 0x9f, - 0xc1, 0xd8, 0xb4, 0x8c, 0x0c, 0x58, 0xe0, 0x3b, 0x00, 0x23, 0x45, 0x87, 0x7f, 0x09, 0x70, 0x56, 0x9e, 0xaf, 0x7c, - 0x65, 0x3c, 0x67, 0x3f, 0xb2, 0x34, 0xf5, 0xa7, 0xa2, 0x7e, 0x7d, 0x9c, 0x60, 0xb4, 0x23, 0xf9, 0x2f, 0x04, 0x20, - 0x48, 0xf2, 0x82, 0x9a, 0x6d, 0x46, 0x12, 0xdf, 0x6b, 0x60, 0xfd, 0x03, 0x1b, 0xaa, 0xb0, 0x53, 0x08, 0x1c, 0x58, - 0xc2, 0xb2, 0x45, 0x01, 0x1c, 0xfe, 0x3b, 0x16, 0x56, 0x0b, 0x33, 0x7f, 0x5a, 0x2d, 0xa2, 0x7d, 0x90, 0xab, 0x63, - 0x93, 0x0a, 0xfd, 0x52, 0xe1, 0x97, 0x68, 0xa8, 0xc3, 0x78, 0xfa, 0x87, 0xaa, 0xa7, 0xb7, 0x98, 0x15, 0x7c, 0x88, - 0xac, 0x20, 0x1b, 0x38, 0x08, 0x63, 0xcd, 0x01, 0x10, 0x76, 0xa3, 0x6c, 0x66, 0xa3, 0x6b, 0x99, 0xd1, 0x8a, 0x4c, - 0xcb, 0xc1, 0xb5, 0x5d, 0x57, 0x1d, 0x6a, 0xbb, 0xc9, 0x74, 0xe8, 0x1b, 0x5e, 0xeb, 0xd8, 0x12, 0x7f, 0x8e, 0xdb, - 0x31, 0x73, 0xec, 0x41, 0x1b, 0x07, 0x77, 0xeb, 0x49, 0x1c, 0x65, 0xf6, 0xc4, 0x9f, 0x07, 0xe1, 0x43, 0x77, 0x1e, - 0x47, 0x71, 0xba, 0xf0, 0x47, 0xac, 0x57, 0x30, 0xd4, 0x3d, 0x0c, 0xd5, 0xc0, 0xbd, 0x05, 0x3d, 0xa7, 0x95, 0xb0, - 0x39, 0xb5, 0x96, 0x91, 0x18, 0x26, 0x21, 0x5b, 0xe5, 0xfc, 0xf3, 0xa5, 0xca, 0x54, 0x15, 0xb7, 0x1c, 0xb5, 0x00, - 0x8a, 0x94, 0x87, 0x79, 0x80, 0xe0, 0x46, 0xbd, 0x85, 0x3f, 0xc6, 0xc8, 0x84, 0x4e, 0xab, 0x93, 0xb0, 0xb9, 0xe6, - 0x74, 0x36, 0x76, 0x9e, 0xc4, 0xf7, 0x67, 0x30, 0x5a, 0x6c, 0x6c, 0xa7, 0x2c, 0x9c, 0xe0, 0x1b, 0x1b, 0x3d, 0x4b, - 0x44, 0x3f, 0x36, 0x32, 0xe2, 0xd0, 0x1b, 0x9b, 0xf7, 0xe0, 0x75, 0xb7, 0xa5, 0xb9, 0xbd, 0x79, 0x10, 0xd9, 0x34, - 0x9d, 0x63, 0x77, 0xa1, 0xf4, 0xa5, 0xc2, 0xcf, 0x5c, 0x63, 0x75, 0x4f, 0x73, 0x7b, 0xc0, 0xac, 0x4d, 0xc2, 0xf8, - 0xbe, 0x3b, 0x0b, 0xc6, 0x63, 0x16, 0xf5, 0x70, 0xcc, 0xb2, 0x90, 0x85, 0x61, 0xb0, 0x48, 0x83, 0xb4, 0x37, 0xf7, - 0x57, 0xbc, 0xd7, 0xc3, 0x4d, 0xbd, 0xb6, 0x79, 0xaf, 0xed, 0xbd, 0x7b, 0x55, 0xba, 0x01, 0x2f, 0x16, 0xea, 0x87, - 0x0f, 0xad, 0xa3, 0xb9, 0x95, 0x79, 0xee, 0xdd, 0xeb, 0x22, 0x61, 0xeb, 0xb9, 0x9f, 0x4c, 0x83, 0xa8, 0xeb, 0xe6, - 0xce, 0xdd, 0x9a, 0x36, 0xc6, 0xd3, 0x93, 0x93, 0x93, 0xdc, 0x19, 0x8b, 0x27, 0x77, 0x3c, 0xce, 0x9d, 0x91, 0x78, - 0x9a, 0x4c, 0x5c, 0x77, 0x32, 0xc9, 0x9d, 0x40, 0x14, 0xb4, 0x5b, 0xa3, 0x71, 0xbb, 0x95, 0x3b, 0xf7, 0x4a, 0x8d, - 0xdc, 0x61, 0xfc, 0x29, 0x61, 0xe3, 0x1e, 0x6e, 0x24, 0x32, 0x2b, 0xed, 0x1e, 0xbb, 0x6e, 0x8e, 0x18, 0xe0, 0xba, - 0x84, 0x9b, 0x50, 0xd6, 0x73, 0xb3, 0xde, 0xbb, 0xa6, 0x56, 0x7c, 0x6e, 0x34, 0x6a, 0xac, 0x37, 0xf6, 0x93, 0x4f, - 0x37, 0x9a, 0x32, 0x0b, 0xdf, 0xa7, 0x6a, 0x6b, 0x01, 0x06, 0x7b, 0xd5, 0x85, 0x90, 0x5d, 0xbd, 0x61, 0x9c, 0xc0, - 0x99, 0x4d, 0xfc, 0x71, 0xb0, 0x4c, 0xbb, 0x5e, 0x6b, 0xb1, 0x12, 0x45, 0x7c, 0xaf, 0x17, 0x05, 0x78, 0xf6, 0xba, - 0x69, 0x1c, 0x06, 0x63, 0x51, 0xb4, 0xe9, 0x2c, 0x79, 0x2d, 0xb3, 0x87, 0x0e, 0xeb, 0x01, 0x86, 0x5d, 0xf0, 0xc3, - 0x50, 0x73, 0xda, 0xa9, 0xc6, 0xfc, 0x14, 0xe5, 0xcb, 0x9a, 0x9b, 0x12, 0x5c, 0xd0, 0x39, 0xdd, 0x3b, 0x5c, 0xac, - 0xe4, 0x9e, 0xf7, 0x8e, 0x16, 0xab, 0xfc, 0xdb, 0x39, 0x1b, 0x07, 0xbe, 0x66, 0x14, 0xbb, 0xc9, 0x73, 0x41, 0x06, - 0x6d, 0xae, 0x37, 0x6c, 0x53, 0x71, 0x2c, 0x20, 0xb4, 0xe1, 0x93, 0x60, 0xbe, 0x88, 0x93, 0xcc, 0x8f, 0xb2, 0x3c, - 0x1f, 0xdc, 0xe4, 0x79, 0xef, 0x2a, 0x30, 0xae, 0xff, 0x61, 0xd0, 0x3d, 0x4d, 0x3a, 0x9b, 0xdc, 0xbc, 0xb1, 0xde, - 0x32, 0xd5, 0x66, 0x04, 0xae, 0x31, 0xb4, 0x17, 0x51, 0x2b, 0xd3, 0x2d, 0x59, 0xaf, 0x4c, 0x40, 0x96, 0xd5, 0xc9, - 0x06, 0xa5, 0x5c, 0x05, 0x6f, 0x20, 0xa8, 0xf0, 0x96, 0xf5, 0xaf, 0x14, 0xfb, 0x13, 0x20, 0x56, 0xb0, 0x32, 0xf9, - 0x15, 0x3c, 0xdb, 0x44, 0x33, 0x7e, 0xb7, 0x9b, 0x66, 0xfc, 0x25, 0xdb, 0x87, 0x66, 0xfc, 0xee, 0xab, 0xd3, 0x8c, - 0xcf, 0xea, 0x7e, 0x05, 0x17, 0x71, 0x5f, 0x97, 0x1a, 0x06, 0xb8, 0x9a, 0x12, 0x8a, 0xd8, 0x73, 0xf1, 0xbb, 0xdd, - 0x00, 0x44, 0x6f, 0x94, 0x83, 0x8e, 0x6e, 0x6e, 0x90, 0xc7, 0xbe, 0x8b, 0xfa, 0x7f, 0x4f, 0xd4, 0xe7, 0xc9, 0xa4, - 0xff, 0x26, 0x56, 0x0a, 0xe4, 0x13, 0x37, 0xbe, 0x28, 0x45, 0x57, 0xa0, 0x37, 0xc2, 0x0a, 0x13, 0xf3, 0x4f, 0x80, - 0x73, 0x36, 0x59, 0x1d, 0x8f, 0xa5, 0xf5, 0x59, 0xaf, 0x3c, 0x04, 0x43, 0x9a, 0x7c, 0x0a, 0x17, 0x9c, 0x9a, 0x28, - 0x71, 0xca, 0x32, 0xee, 0x33, 0xfb, 0xfd, 0xc3, 0xc5, 0xd8, 0xb8, 0x88, 0xcd, 0x3c, 0x48, 0xdf, 0x55, 0x1d, 0x60, - 0xb8, 0xee, 0xa7, 0xaf, 0x4e, 0x27, 0xe7, 0x16, 0x64, 0x6a, 0x82, 0x69, 0x78, 0x4d, 0xcd, 0xcf, 0x4b, 0x33, 0xed, - 0xaa, 0x0d, 0x79, 0xa2, 0xab, 0xda, 0x65, 0xcc, 0xbd, 0x0f, 0xd6, 0x9c, 0x02, 0xc4, 0xdc, 0x5d, 0xe8, 0x37, 0x3c, - 0xa6, 0xe6, 0xc1, 0x38, 0xcf, 0xcd, 0x9e, 0x00, 0x84, 0x72, 0xd1, 0xb2, 0x5d, 0x44, 0x5c, 0x7a, 0x2f, 0x6d, 0x1a, - 0xb8, 0x86, 0x90, 0xd4, 0x7f, 0x17, 0xa0, 0x50, 0xe7, 0xca, 0x42, 0x0e, 0x33, 0x5d, 0x23, 0xf0, 0x91, 0xa1, 0x85, - 0x32, 0x21, 0xd0, 0x00, 0x4b, 0xf8, 0x8b, 0x57, 0xa2, 0xa0, 0x6e, 0xc3, 0x49, 0xc0, 0x41, 0x8b, 0x00, 0xf0, 0xf2, - 0x17, 0x72, 0x6d, 0x42, 0x3b, 0xbc, 0x0e, 0x3e, 0xe4, 0xba, 0xa4, 0xfd, 0x70, 0xfb, 0x9d, 0x9d, 0x1e, 0x40, 0x83, - 0xb3, 0x8a, 0xe1, 0xc0, 0x0e, 0x0b, 0x45, 0x20, 0x25, 0xd2, 0x7b, 0xcb, 0x49, 0xef, 0xb5, 0x17, 0x6b, 0x11, 0x21, - 0x23, 0xf3, 0x17, 0x36, 0xb0, 0xf8, 0x88, 0x7b, 0x39, 0xc6, 0x53, 0x82, 0x71, 0xf4, 0x96, 0x29, 0xe0, 0x46, 0x64, - 0x54, 0x11, 0xff, 0xf4, 0x46, 0xcb, 0x24, 0x8d, 0x93, 0xee, 0x22, 0x0e, 0xa2, 0x8c, 0x25, 0x39, 0x82, 0xea, 0x1a, - 0xe1, 0x23, 0xc0, 0x73, 0xb3, 0x8e, 0x17, 0xfe, 0x28, 0xc8, 0x1e, 0xba, 0x2e, 0x27, 0x29, 0xdc, 0x1e, 0xa7, 0x0e, - 0xdc, 0xc6, 0xfa, 0x5d, 0x0e, 0xcd, 0x97, 0x48, 0xf8, 0x25, 0x75, 0x72, 0x46, 0xdd, 0xe6, 0x3d, 0xe5, 0x2d, 0xc5, - 0x08, 0x01, 0xf2, 0xc3, 0x4f, 0xec, 0x29, 0x60, 0x79, 0x58, 0x6a, 0x77, 0xcc, 0xa6, 0x16, 0x62, 0x6d, 0x90, 0xcb, - 0x8b, 0x3f, 0xa7, 0x63, 0x6a, 0x6e, 0x73, 0x31, 0x50, 0x3c, 0xe6, 0x3e, 0x23, 0xeb, 0xfa, 0x90, 0x51, 0xcb, 0xda, - 0xa7, 0xe6, 0x90, 0x4d, 0xe2, 0x84, 0x51, 0x3c, 0x59, 0xef, 0x64, 0xb1, 0xda, 0xbf, 0xfb, 0xed, 0xd3, 0x6f, 0xee, - 0x27, 0x8a, 0x33, 0x43, 0x74, 0x66, 0xee, 0xe8, 0xad, 0x7e, 0x9f, 0x01, 0x69, 0x48, 0x90, 0x1f, 0x51, 0xe8, 0xae, - 0xae, 0xae, 0xf7, 0x1a, 0xc3, 0x76, 0x2d, 0x62, 0x7e, 0xe7, 0x25, 0x2c, 0xf4, 0xb3, 0xe0, 0x4e, 0xd0, 0x8c, 0xed, - 0xa3, 0xc5, 0x4a, 0xac, 0x31, 0x5e, 0x78, 0x8f, 0x58, 0xa4, 0xca, 0x50, 0xc4, 0x22, 0x55, 0x8b, 0x71, 0x91, 0x7a, - 0xb5, 0xd9, 0x88, 0x48, 0x16, 0x95, 0x9b, 0xbe, 0xb3, 0x58, 0xa9, 0x57, 0x74, 0xd1, 0x4c, 0xde, 0xd4, 0xd5, 0x10, - 0x64, 0xf3, 0x60, 0x3c, 0x0e, 0x59, 0x5e, 0x5a, 0xe8, 0xf2, 0x5a, 0x2a, 0xc0, 0x91, 0x70, 0xf0, 0x87, 0x69, 0x1c, - 0x2e, 0x33, 0xd6, 0x0c, 0x2e, 0x02, 0x4e, 0xcb, 0x2d, 0x80, 0x83, 0xbf, 0xcb, 0x63, 0xed, 0x00, 0xb9, 0x0d, 0xdb, - 0xc4, 0xed, 0x41, 0xc4, 0x61, 0xbb, 0x5d, 0x1e, 0x3a, 0xbc, 0x92, 0x83, 0xb6, 0x1a, 0x26, 0x62, 0xc1, 0xb5, 0x44, - 0xd8, 0x5b, 0x73, 0x3c, 0x5e, 0x26, 0xa3, 0xae, 0xca, 0xa2, 0xbc, 0x3c, 0x99, 0x3f, 0xe6, 0x8c, 0xbd, 0x6a, 0x3e, - 0x63, 0xaf, 0xc4, 0x19, 0xdb, 0xbe, 0x33, 0x9f, 0x4e, 0x3c, 0xf8, 0xaf, 0x57, 0x4c, 0xa8, 0xeb, 0x6a, 0xed, 0xc5, - 0x4a, 0xf3, 0x16, 0x2b, 0xcd, 0x6e, 0x2d, 0x56, 0x1a, 0x76, 0x8d, 0xf6, 0x20, 0x96, 0xd3, 0x32, 0x2d, 0x57, 0x83, - 0x42, 0xf8, 0x73, 0x4b, 0xaf, 0xbc, 0x43, 0x78, 0x07, 0xad, 0x3a, 0xf5, 0x77, 0xad, 0xed, 0x47, 0x9d, 0xce, 0x92, - 0x40, 0xda, 0xa6, 0x93, 0xf9, 0xc3, 0x21, 0x1b, 0x77, 0x27, 0xf1, 0x68, 0x99, 0xfe, 0x8b, 0x8f, 0x9f, 0x03, 0x71, - 0x2b, 0x22, 0xa8, 0xf4, 0x23, 0x9a, 0x82, 0xa2, 0xe4, 0x8e, 0x89, 0x1e, 0xd6, 0x72, 0x9d, 0xba, 0x14, 0x1e, 0xb9, - 0xe5, 0x1c, 0x36, 0x6c, 0xf2, 0x66, 0x40, 0xff, 0x61, 0xab, 0xb4, 0x19, 0xc5, 0x7c, 0x01, 0x58, 0xb6, 0x82, 0xe3, - 0xf1, 0xd0, 0xe0, 0xab, 0xe9, 0x9e, 0x34, 0x0f, 0xf7, 0x5a, 0x7c, 0xe9, 0x46, 0x5c, 0x2a, 0xfc, 0xde, 0xe2, 0x8e, - 0x29, 0xdb, 0x7b, 0xdd, 0xb4, 0x47, 0x6a, 0xbd, 0x6e, 0xb9, 0x10, 0x8a, 0xba, 0x7b, 0x62, 0xf9, 0xa7, 0xaf, 0x0e, - 0xe1, 0x3f, 0xa2, 0xea, 0x7f, 0xc9, 0x9a, 0x08, 0xf5, 0x8b, 0xb2, 0x25, 0x38, 0x91, 0x4a, 0x48, 0x88, 0xef, 0x5f, - 0x7f, 0x32, 0x79, 0x5c, 0x83, 0xbd, 0x6b, 0x93, 0x29, 0x55, 0xb5, 0xf6, 0xf7, 0x71, 0x0c, 0xa9, 0x3b, 0xeb, 0xd5, - 0x05, 0x78, 0xc8, 0xd8, 0x3d, 0xeb, 0x43, 0x23, 0xc1, 0x47, 0x90, 0x16, 0x5f, 0xc7, 0x36, 0xc4, 0x4a, 0xbc, 0xdd, - 0xc4, 0x4a, 0xbc, 0xd9, 0xcd, 0x4a, 0xfc, 0x75, 0x2f, 0x56, 0xe2, 0xcd, 0x57, 0x67, 0x25, 0xde, 0xd6, 0x59, 0x89, - 0xab, 0x58, 0xd8, 0xcf, 0x5a, 0x17, 0x4b, 0xfe, 0xf3, 0x23, 0x29, 0xe5, 0x2e, 0xe3, 0x7e, 0xc7, 0xa5, 0x90, 0xc7, - 0x57, 0xbf, 0x9b, 0xb1, 0xc0, 0x8d, 0xf8, 0x1e, 0xcd, 0xc9, 0x0a, 0xd6, 0x82, 0x63, 0x76, 0xfc, 0x8e, 0x52, 0x1c, - 0xc6, 0xd1, 0xf4, 0x67, 0x50, 0xca, 0x82, 0x38, 0x30, 0x51, 0x5e, 0x04, 0xe9, 0xcf, 0xf1, 0x62, 0xb9, 0xb8, 0x80, - 0xbe, 0x3e, 0x06, 0x69, 0x30, 0x0c, 0x99, 0xf4, 0x44, 0x26, 0xf3, 0x37, 0x2e, 0x13, 0x07, 0x8b, 0x53, 0xf1, 0xd3, - 0x5f, 0x89, 0x9f, 0x68, 0x93, 0xca, 0x7f, 0x93, 0x5d, 0x9d, 0xde, 0xcc, 0x88, 0x08, 0x25, 0xa0, 0x32, 0xe8, 0xc7, - 0x33, 0x23, 0x57, 0xb1, 0xd9, 0x30, 0x4b, 0x61, 0xef, 0xb0, 0xb1, 0x1f, 0x56, 0x63, 0x6a, 0x96, 0xa6, 0x25, 0x43, - 0x70, 0xd5, 0xc5, 0xf0, 0xf3, 0x78, 0x99, 0xb2, 0x71, 0x7c, 0x1f, 0xe9, 0x56, 0x24, 0x9d, 0x0c, 0x40, 0xc3, 0x29, - 0xdb, 0x60, 0xf2, 0xc8, 0x0f, 0x48, 0x28, 0xc7, 0x89, 0xa1, 0x43, 0xee, 0xd2, 0xe5, 0xc2, 0x26, 0x55, 0xb3, 0x8d, - 0x53, 0xd4, 0x65, 0x96, 0xa3, 0x27, 0x86, 0x11, 0xf7, 0x1f, 0xd7, 0x52, 0x98, 0x6a, 0xc4, 0x0e, 0x97, 0x0a, 0xa7, - 0x46, 0x24, 0x84, 0x8b, 0x22, 0x0e, 0x46, 0xc3, 0xc2, 0xf1, 0x37, 0xe4, 0xba, 0x5a, 0xbc, 0x85, 0x28, 0x22, 0xf9, - 0x92, 0xaf, 0x07, 0x8f, 0x0a, 0x41, 0x8f, 0xaf, 0x15, 0x30, 0xbe, 0xbb, 0x63, 0x49, 0xe8, 0x3f, 0x18, 0x66, 0x1e, - 0x47, 0x3f, 0x02, 0x00, 0xde, 0xc4, 0xf7, 0x91, 0x5a, 0x01, 0x93, 0xb5, 0x34, 0xec, 0xa5, 0xc6, 0xf8, 0x25, 0xe0, - 0xb8, 0xa2, 0x8c, 0x00, 0xd2, 0xe4, 0x4e, 0xd9, 0xdf, 0x2d, 0xfa, 0xf7, 0x1f, 0x66, 0x6e, 0x5d, 0xc6, 0xf2, 0x43, - 0x7f, 0x5b, 0xec, 0xf1, 0x99, 0xe7, 0xcf, 0x9f, 0x6c, 0x9e, 0x76, 0x39, 0x3d, 0x7b, 0x43, 0x6b, 0x73, 0xe3, 0x29, - 0x80, 0x51, 0x5c, 0xc5, 0xcb, 0xd1, 0x0c, 0x0d, 0x5d, 0xbf, 0xde, 0x7c, 0x33, 0xe8, 0x13, 0xb3, 0x94, 0xca, 0xa9, - 0x57, 0x8a, 0x0a, 0x28, 0xe0, 0xf7, 0xdf, 0x42, 0x00, 0xce, 0xff, 0x21, 0x18, 0xea, 0xbb, 0x86, 0x73, 0xf1, 0xc1, - 0xe3, 0x36, 0x6f, 0x0f, 0x92, 0x69, 0xf2, 0xd0, 0x16, 0x42, 0xb9, 0xd6, 0x8c, 0x64, 0xf2, 0x2a, 0xd0, 0xd4, 0x30, - 0x72, 0x9b, 0x22, 0xe4, 0x89, 0xaf, 0x30, 0x87, 0xd8, 0x74, 0xee, 0x68, 0x60, 0x31, 0x8e, 0xad, 0x2a, 0x48, 0x86, - 0x9b, 0x3c, 0x30, 0x44, 0x5f, 0xd5, 0x77, 0xf3, 0x20, 0xb2, 0x30, 0x0a, 0x7c, 0xfd, 0x8d, 0xbf, 0x82, 0x38, 0xc8, - 0x80, 0xdc, 0xaa, 0xaf, 0xa0, 0xd0, 0x52, 0xfd, 0xe6, 0x20, 0xd5, 0x93, 0xde, 0x08, 0x09, 0xa1, 0xc5, 0x1b, 0xfc, - 0x49, 0xd3, 0x34, 0x4d, 0xb2, 0x11, 0x9a, 0xe4, 0x23, 0xb0, 0x1c, 0xd9, 0x01, 0xd0, 0x96, 0xe4, 0x8b, 0x15, 0x95, - 0x00, 0x67, 0x80, 0x3a, 0x59, 0x51, 0xc0, 0x43, 0xfd, 0x75, 0x5c, 0x51, 0x20, 0x18, 0x7a, 0x08, 0xd3, 0xe6, 0x27, - 0x10, 0x11, 0xb8, 0xab, 0x21, 0xc3, 0x8e, 0x6f, 0xb9, 0x24, 0x58, 0x73, 0xe9, 0x71, 0xd0, 0x63, 0xcd, 0x31, 0xe1, - 0x22, 0x05, 0x0b, 0x82, 0xd6, 0xa1, 0x12, 0xe2, 0xd9, 0x62, 0x0d, 0xb8, 0x11, 0xf9, 0xa2, 0x55, 0x36, 0x67, 0xd1, - 0x52, 0xc7, 0x9c, 0x50, 0x18, 0xa3, 0x0f, 0xea, 0xbc, 0x21, 0x62, 0x0b, 0xb0, 0x4d, 0x73, 0xcb, 0x19, 0xdd, 0x85, - 0x29, 0x47, 0xa9, 0xbe, 0x35, 0xe2, 0x8a, 0xcd, 0x94, 0xe3, 0xb6, 0xea, 0x0d, 0xc1, 0x97, 0x34, 0xae, 0x3a, 0x72, - 0x91, 0x25, 0x34, 0xf4, 0x41, 0xd1, 0x31, 0xb8, 0xb8, 0x48, 0x80, 0xdd, 0xf0, 0xab, 0x8b, 0x26, 0x35, 0x32, 0x7e, - 0x45, 0x50, 0x94, 0x98, 0xf5, 0x6e, 0xf8, 0x38, 0x21, 0x30, 0xd1, 0xc6, 0x7e, 0x46, 0xb5, 0x7e, 0x36, 0x4c, 0xfa, - 0x13, 0x7b, 0xa0, 0x8b, 0x84, 0x40, 0xf5, 0x89, 0x3d, 0x80, 0xed, 0xdf, 0x5b, 0x90, 0xa6, 0xe8, 0x5b, 0xd0, 0xb5, - 0x05, 0xa1, 0xfe, 0x47, 0x10, 0xac, 0x6a, 0xcb, 0x01, 0x72, 0xf3, 0x2d, 0x58, 0x1c, 0x41, 0x0c, 0x59, 0x9d, 0xc5, - 0x21, 0xe6, 0x26, 0xfe, 0x46, 0x23, 0x8c, 0xed, 0x86, 0xa3, 0x61, 0xbe, 0xf0, 0x5c, 0xf7, 0xa0, 0x56, 0x1f, 0x04, - 0xd9, 0x4d, 0xb5, 0x4d, 0x2b, 0xeb, 0x7b, 0xae, 0x1d, 0xbc, 0x70, 0x5a, 0xbd, 0xda, 0x1d, 0xad, 0xc4, 0x92, 0x1c, - 0xa0, 0xf8, 0xeb, 0xec, 0xd9, 0xda, 0xa8, 0x1d, 0x48, 0xb3, 0x6a, 0x32, 0x8f, 0x63, 0xcb, 0xb9, 0xfc, 0x6b, 0x50, - 0xbf, 0xfa, 0x29, 0x92, 0x25, 0xe5, 0x35, 0x19, 0x40, 0x34, 0x64, 0x03, 0x8e, 0xd1, 0x9f, 0xb5, 0x97, 0x9a, 0x41, - 0xc7, 0xc7, 0x34, 0x07, 0x32, 0x5d, 0xb6, 0xf0, 0x29, 0x53, 0x3b, 0xa8, 0x7c, 0x31, 0xad, 0x62, 0x38, 0x1e, 0x77, - 0x95, 0x15, 0x1a, 0xbd, 0xad, 0xd4, 0x02, 0xf6, 0xbf, 0xe1, 0xfa, 0x74, 0x86, 0x10, 0x97, 0x00, 0x6a, 0x40, 0xec, - 0xf4, 0x9d, 0x1d, 0x2e, 0x17, 0xe5, 0xee, 0xca, 0x97, 0xe4, 0xfe, 0x9d, 0xe1, 0xa5, 0x83, 0x3a, 0x34, 0xd9, 0x5f, - 0xf3, 0x75, 0xf7, 0xc8, 0x2e, 0x59, 0x34, 0x2e, 0x77, 0x58, 0xb9, 0xbf, 0xf6, 0xef, 0xae, 0x84, 0x51, 0x20, 0xa9, - 0x40, 0xdc, 0x80, 0x51, 0xf2, 0x38, 0xc2, 0xcd, 0x4f, 0xc7, 0x2d, 0xd8, 0x8b, 0x8a, 0xc1, 0x06, 0x14, 0x11, 0x4c, - 0x36, 0x53, 0x84, 0xe2, 0x10, 0xb9, 0x1a, 0xdd, 0x82, 0x0d, 0x41, 0x88, 0x6e, 0xdc, 0x89, 0x99, 0xb0, 0x29, 0x2c, - 0xda, 0x04, 0x3c, 0x16, 0xe5, 0xbe, 0x52, 0xeb, 0x60, 0xb7, 0xd4, 0x3a, 0xdb, 0x25, 0xb5, 0x26, 0x77, 0xaa, 0xfb, - 0xc4, 0x5f, 0x28, 0x1e, 0x79, 0x82, 0x38, 0x57, 0x1d, 0xf3, 0x4a, 0xa2, 0x6e, 0xf4, 0xbe, 0x12, 0xad, 0x6a, 0xbd, - 0x91, 0x95, 0x20, 0x8a, 0xbf, 0x15, 0x06, 0x45, 0x28, 0xd4, 0x55, 0xd9, 0xf8, 0x55, 0x21, 0x1b, 0x27, 0xae, 0xa6, - 0x70, 0xa4, 0x11, 0xd4, 0xbf, 0xe2, 0xa4, 0x26, 0xb9, 0x83, 0xc2, 0x59, 0xad, 0x18, 0xa9, 0xe2, 0x7e, 0x55, 0x30, - 0x1a, 0x8a, 0x53, 0x9f, 0xe0, 0x32, 0xca, 0xbe, 0x7d, 0xe5, 0xaa, 0x85, 0xf7, 0x55, 0x51, 0x0e, 0x52, 0x77, 0x1c, - 0xb2, 0x2c, 0x56, 0xb7, 0x4d, 0xd9, 0xfd, 0x46, 0x7d, 0xad, 0x6c, 0x12, 0xe9, 0x27, 0x43, 0x00, 0x16, 0x62, 0xfa, - 0x8a, 0x5e, 0x5b, 0xda, 0x40, 0xe0, 0x20, 0x1b, 0xdc, 0xfa, 0x76, 0x4b, 0xe7, 0x29, 0x5f, 0x42, 0xa1, 0x85, 0x57, - 0x65, 0x10, 0x08, 0xdf, 0x9b, 0x75, 0xc3, 0x2d, 0x8f, 0x97, 0x3c, 0xbf, 0xdf, 0x41, 0xbc, 0xa8, 0xb9, 0xaa, 0x22, - 0x1f, 0x4f, 0xa6, 0x4d, 0xe6, 0xb9, 0x58, 0xb5, 0xde, 0x29, 0x09, 0x71, 0xd6, 0xdc, 0x33, 0xa6, 0x2c, 0xa3, 0xe7, - 0x35, 0xba, 0xe2, 0xbb, 0x7c, 0xeb, 0x24, 0xcb, 0x08, 0x63, 0xdb, 0xdb, 0x59, 0xe2, 0x8f, 0x3e, 0x29, 0x43, 0x16, - 0x72, 0x4e, 0x90, 0x01, 0x97, 0x35, 0x05, 0x3d, 0x1f, 0x43, 0x41, 0xb2, 0xae, 0xd3, 0x4a, 0x15, 0xe9, 0x4b, 0xf7, - 0xa9, 0xdb, 0xf6, 0x5f, 0x4d, 0x0e, 0x2b, 0x42, 0xd1, 0x56, 0xa7, 0x2c, 0x32, 0xdf, 0x30, 0x8e, 0x6c, 0xb6, 0x9c, - 0x0f, 0xd7, 0xaa, 0x6c, 0x55, 0x11, 0xb9, 0xd6, 0xc5, 0xac, 0xea, 0x67, 0x27, 0x93, 0x49, 0x59, 0xd0, 0xe8, 0x6a, - 0x87, 0x28, 0x2c, 0x7c, 0xea, 0xba, 0x6e, 0x75, 0xec, 0xdb, 0xc1, 0x6e, 0xa3, 0xdc, 0xf6, 0xa4, 0x71, 0xc4, 0x08, - 0xdb, 0x5d, 0xf0, 0xab, 0x83, 0x23, 0x77, 0x8a, 0x93, 0x5d, 0x32, 0x8b, 0xe8, 0x91, 0x31, 0x44, 0x90, 0xb1, 0x79, - 0xda, 0x1d, 0x31, 0xd4, 0xc1, 0x38, 0xca, 0x81, 0x46, 0xc3, 0x01, 0x7b, 0x0a, 0xa6, 0x22, 0x9e, 0xd8, 0x15, 0xae, - 0x86, 0xf2, 0xf0, 0x9a, 0xf0, 0x5e, 0x7c, 0x04, 0x0f, 0xca, 0xba, 0x2e, 0xd3, 0xc6, 0x69, 0x75, 0xdc, 0x3f, 0x97, - 0xea, 0x69, 0x70, 0x01, 0xae, 0x85, 0x42, 0x9b, 0xe4, 0xb3, 0xf8, 0xff, 0x52, 0xfe, 0xff, 0x6a, 0xb1, 0x2a, 0xdb, - 0x8f, 0x9c, 0x80, 0x44, 0xbb, 0x38, 0x2d, 0x34, 0xea, 0xa6, 0x3d, 0x20, 0xad, 0x0c, 0x26, 0xaa, 0x02, 0x1d, 0x94, - 0xf4, 0xa5, 0x04, 0x20, 0x0d, 0xe2, 0x77, 0xa4, 0x98, 0x61, 0x89, 0x0b, 0x11, 0x62, 0x91, 0xbe, 0x0e, 0xe6, 0x60, - 0xbd, 0x3c, 0x41, 0xfd, 0x41, 0x69, 0x4f, 0x80, 0x36, 0xbe, 0x36, 0xb7, 0xbd, 0xc4, 0xfd, 0x55, 0xbd, 0x96, 0xe8, - 0x18, 0x40, 0xe6, 0xc1, 0x21, 0x44, 0x43, 0x02, 0xad, 0xb2, 0xb9, 0x69, 0x94, 0xf2, 0xad, 0xaa, 0x67, 0x13, 0x03, - 0xc3, 0xee, 0x9a, 0xab, 0x50, 0xdf, 0x42, 0x5b, 0x00, 0x93, 0xe5, 0xdb, 0x0f, 0x9f, 0x6d, 0x58, 0x62, 0x75, 0x3f, - 0x7a, 0xb8, 0xe4, 0xb8, 0x7f, 0x6d, 0xbc, 0x3b, 0x53, 0x3a, 0xff, 0x28, 0x5f, 0xfc, 0x6b, 0xa3, 0x40, 0xef, 0xaa, - 0x24, 0xa1, 0xe3, 0xd6, 0xe2, 0x2d, 0x73, 0xaf, 0xda, 0xf3, 0x20, 0xda, 0xbf, 0xae, 0xbf, 0xda, 0xbb, 0x2e, 0x5c, - 0x18, 0x7b, 0x57, 0x86, 0x1b, 0x87, 0x2c, 0x17, 0xb2, 0xfe, 0x5f, 0x15, 0x81, 0xa2, 0xea, 0x75, 0xac, 0x63, 0x2b, - 0xa2, 0xf2, 0xaf, 0x96, 0x40, 0x7c, 0xee, 0x95, 0xe0, 0x41, 0x13, 0x39, 0xda, 0xf4, 0x63, 0xed, 0x44, 0x3b, 0x6e, - 0x6b, 0x47, 0xae, 0x4e, 0x5c, 0x58, 0x5f, 0xef, 0xb4, 0x0a, 0x6f, 0xc2, 0x43, 0x57, 0x3f, 0x3b, 0x9d, 0x8a, 0x4b, - 0x62, 0x12, 0x84, 0x21, 0xa1, 0x8a, 0x34, 0x4b, 0xe2, 0x4f, 0xac, 0xac, 0x66, 0xa1, 0x32, 0x6e, 0x04, 0xd2, 0x12, - 0x8f, 0x70, 0x76, 0x46, 0xfe, 0xa2, 0x8b, 0x67, 0x43, 0x2d, 0x04, 0x03, 0x4e, 0x2a, 0xc5, 0x4f, 0xc0, 0x1d, 0x3c, - 0xd4, 0xcf, 0x4e, 0x21, 0x84, 0xa1, 0x36, 0xee, 0xeb, 0x3f, 0xb6, 0x8e, 0x35, 0xaf, 0x73, 0x67, 0xb7, 0x47, 0xae, - 0xed, 0x39, 0x87, 0x9a, 0xeb, 0x1c, 0xd9, 0x2d, 0xe7, 0x58, 0x6b, 0x39, 0x1d, 0xf8, 0x77, 0xe4, 0x39, 0xaf, 0x34, - 0x17, 0x9e, 0x34, 0xcf, 0x69, 0xe3, 0xbf, 0x2d, 0xe7, 0xf8, 0xae, 0x4d, 0x37, 0xbd, 0x2f, 0xdd, 0xaa, 0x2a, 0xa3, - 0x00, 0x27, 0x10, 0xfd, 0xe0, 0xec, 0x74, 0x99, 0x32, 0x6d, 0xd5, 0xd7, 0x5f, 0xe9, 0xda, 0x2c, 0x61, 0x93, 0xbe, - 0xfe, 0xd4, 0x57, 0x4a, 0xbd, 0x93, 0xc6, 0xe2, 0xd6, 0x71, 0x63, 0x71, 0xfb, 0xa8, 0xb1, 0xf8, 0xb0, 0x53, 0x2e, - 0x3e, 0x98, 0xd2, 0x2b, 0x25, 0x83, 0xe0, 0xdc, 0xcf, 0x92, 0x60, 0x65, 0x78, 0x1a, 0xa0, 0x6b, 0x1b, 0xfe, 0x39, - 0x6e, 0x99, 0xb2, 0xd5, 0x10, 0x5a, 0x49, 0x68, 0x1c, 0x9f, 0x68, 0xde, 0xd1, 0x5f, 0x5a, 0x47, 0x23, 0xa8, 0x07, - 0xf9, 0x2e, 0xe1, 0xef, 0xae, 0x7d, 0x32, 0x72, 0x35, 0x68, 0xe8, 0xc1, 0x7f, 0xb3, 0x4e, 0x6b, 0x44, 0x0f, 0x2e, - 0xbc, 0xff, 0xe8, 0x1d, 0xa7, 0xae, 0xed, 0xc1, 0x7f, 0xbf, 0x49, 0x95, 0x3b, 0x28, 0xfc, 0xd5, 0x7e, 0x0f, 0x5d, - 0xad, 0x7d, 0x32, 0x6b, 0x39, 0xaf, 0xee, 0x8e, 0x9d, 0x93, 0x99, 0x77, 0xfc, 0x91, 0x9e, 0x42, 0xbb, 0xe5, 0xbc, - 0x82, 0xbf, 0x8f, 0x6d, 0x77, 0x66, 0x7b, 0xce, 0xc9, 0x5d, 0xdb, 0x69, 0x87, 0xf6, 0x91, 0x73, 0x02, 0x7f, 0xbf, - 0x01, 0x78, 0x01, 0xae, 0x3c, 0x41, 0xa9, 0x06, 0x1b, 0xa3, 0x62, 0xbf, 0xa1, 0x7e, 0xa4, 0x75, 0xa8, 0x75, 0x0e, - 0xff, 0x72, 0x72, 0x67, 0x1f, 0xce, 0xbc, 0xd6, 0x9d, 0xbd, 0xf1, 0xe7, 0x47, 0x80, 0xfc, 0xf6, 0x85, 0x03, 0x30, - 0x62, 0x46, 0x92, 0x3f, 0x0d, 0xac, 0xcb, 0x4d, 0x62, 0xf4, 0xf7, 0xbb, 0xc5, 0xe8, 0x3f, 0x2c, 0xf7, 0x11, 0xa3, - 0xbf, 0xff, 0xea, 0x62, 0xf4, 0xcb, 0xaa, 0x15, 0xf7, 0xfb, 0x6a, 0xe4, 0xf4, 0x5f, 0xd6, 0x55, 0x22, 0x39, 0xf0, - 0x8d, 0xeb, 0xab, 0xe5, 0x0d, 0xc4, 0xfe, 0x79, 0x1f, 0xf7, 0x7f, 0x58, 0x96, 0x4c, 0x94, 0x62, 0xc0, 0x00, 0xef, - 0x63, 0xc2, 0x00, 0xbf, 0x2d, 0xfb, 0x60, 0x17, 0xc1, 0x6f, 0xcd, 0x60, 0x6c, 0xcf, 0xfc, 0x70, 0x22, 0x6f, 0x5c, - 0x28, 0xe9, 0x61, 0x31, 0xd8, 0xcc, 0xc3, 0x65, 0x02, 0xca, 0x9a, 0xe5, 0x3c, 0x4a, 0xbb, 0x47, 0x2e, 0xa0, 0xf9, - 0xd6, 0x24, 0xc9, 0x2b, 0x8d, 0x1d, 0x11, 0x2d, 0xe9, 0x96, 0xdb, 0xf4, 0x6f, 0x7c, 0x8f, 0x26, 0x6b, 0xcd, 0xbd, - 0x7b, 0xf5, 0x7e, 0x35, 0xb0, 0x05, 0x11, 0x26, 0x7d, 0x40, 0x6c, 0x34, 0xbd, 0x2f, 0x1b, 0x8e, 0x55, 0x4c, 0x05, - 0x37, 0x8f, 0x14, 0x46, 0x52, 0x6d, 0xef, 0x95, 0x0d, 0xcf, 0x76, 0x4d, 0xb3, 0xe1, 0xf3, 0xa5, 0xe6, 0x5b, 0xac, - 0xde, 0x64, 0xc7, 0x55, 0x50, 0x55, 0xf2, 0x7e, 0x35, 0x02, 0xa4, 0xa0, 0x3d, 0x0b, 0xd3, 0xb8, 0x82, 0xf0, 0x71, - 0x35, 0xbc, 0x8d, 0x5d, 0xe5, 0x5d, 0xa9, 0x4f, 0xd5, 0x9c, 0xee, 0xc5, 0x1a, 0xe9, 0xc1, 0xe0, 0x37, 0x20, 0x6c, - 0xf8, 0x7d, 0x3c, 0x8c, 0x55, 0x38, 0xaf, 0x95, 0x7e, 0x89, 0xd4, 0xce, 0x67, 0xde, 0xba, 0x4e, 0xda, 0x6c, 0x34, - 0xa4, 0xf5, 0xd8, 0x5c, 0xdc, 0xd1, 0xf8, 0x79, 0x32, 0x5b, 0xcd, 0xc9, 0xb4, 0x18, 0x2d, 0x73, 0xb7, 0x75, 0x26, - 0xea, 0x3d, 0x85, 0x4d, 0x6c, 0xf1, 0x07, 0xd5, 0x6b, 0x7d, 0x3d, 0x81, 0x1c, 0xcd, 0x5d, 0x24, 0x22, 0x14, 0x0a, - 0xaa, 0x85, 0x36, 0xb6, 0xbd, 0x2d, 0xe6, 0x1f, 0x6a, 0xc7, 0xbc, 0x13, 0xb4, 0xd5, 0xdd, 0x66, 0x31, 0x22, 0x5d, - 0x1b, 0xd6, 0x25, 0x05, 0xaa, 0xd7, 0x39, 0xb6, 0xbc, 0x23, 0xcb, 0x39, 0xee, 0x98, 0xb9, 0x38, 0x70, 0x6a, 0x97, - 0x25, 0x80, 0x80, 0xc9, 0xae, 0x1c, 0x66, 0x10, 0x05, 0x59, 0xe0, 0x87, 0x39, 0xa0, 0xfa, 0x32, 0xcd, 0xfb, 0xcf, - 0x65, 0x9a, 0xc1, 0x1c, 0x05, 0x49, 0x86, 0xe6, 0xca, 0xf6, 0x90, 0x65, 0xf7, 0x8c, 0x45, 0x1b, 0x54, 0xb9, 0x55, - 0xeb, 0xe7, 0x3f, 0xce, 0x16, 0x34, 0x27, 0x3b, 0x8b, 0x61, 0x16, 0xf1, 0xfd, 0x21, 0x4c, 0x75, 0xf3, 0x81, 0xf5, - 0xd3, 0x26, 0x84, 0xfb, 0xcf, 0xdd, 0x08, 0x37, 0x63, 0xfb, 0x20, 0xdc, 0x7f, 0x7e, 0x75, 0x84, 0xfb, 0x93, 0x8a, - 0x70, 0x4b, 0x9e, 0x2a, 0x85, 0x4c, 0xf4, 0x03, 0x3e, 0x1b, 0x10, 0x72, 0xf8, 0xa5, 0x7e, 0x40, 0xe4, 0xa5, 0xae, - 0xa4, 0x82, 0xfd, 0x58, 0xca, 0x6d, 0x83, 0x2c, 0x3b, 0x86, 0x48, 0xa5, 0x3c, 0x1a, 0x90, 0x26, 0x55, 0x26, 0xfc, - 0x86, 0x3e, 0x2f, 0xa2, 0x2c, 0x74, 0xde, 0x73, 0xb6, 0x04, 0x54, 0x10, 0x3f, 0xc4, 0xc9, 0xdc, 0xc7, 0xf0, 0x70, - 0x3a, 0xe6, 0xc4, 0x83, 0x07, 0x17, 0xbc, 0xa3, 0x46, 0x71, 0x34, 0x96, 0x72, 0x74, 0xd6, 0xbf, 0x26, 0x7a, 0x50, - 0x7f, 0x60, 0x7e, 0xa2, 0x5b, 0xf4, 0x1a, 0x16, 0xf7, 0x45, 0xdb, 0x7d, 0xd1, 0x3a, 0x7c, 0x71, 0xe4, 0xc2, 0xff, - 0x3c, 0xd6, 0xce, 0x2d, 0x5e, 0x71, 0x1e, 0x47, 0x90, 0x96, 0x43, 0xd4, 0xdc, 0x54, 0xed, 0x9e, 0xb1, 0x4f, 0x45, - 0xad, 0xe3, 0xe6, 0x4a, 0x63, 0xff, 0xa1, 0xa8, 0xd3, 0x58, 0x63, 0x16, 0x2f, 0x95, 0x61, 0x35, 0x8c, 0x26, 0x88, - 0x96, 0x20, 0x19, 0x52, 0x6a, 0xa8, 0xaf, 0xf9, 0x74, 0x8b, 0x79, 0xb1, 0x76, 0x7e, 0x53, 0xe4, 0xfe, 0x11, 0x39, - 0x48, 0x76, 0x42, 0x90, 0x0b, 0xd5, 0x5d, 0x8c, 0x1c, 0x8e, 0xd9, 0x6f, 0x34, 0xc8, 0xbc, 0x57, 0x24, 0x78, 0xc7, - 0x05, 0xca, 0x92, 0x65, 0x34, 0xa2, 0x1c, 0xee, 0xfe, 0x30, 0x35, 0x82, 0x03, 0x88, 0x1d, 0x8a, 0x1f, 0x36, 0x71, - 0xd5, 0xfc, 0x33, 0xb7, 0x48, 0x94, 0x90, 0x8a, 0x55, 0xf1, 0x5f, 0x64, 0x56, 0x42, 0xe9, 0x55, 0x71, 0x69, 0xed, - 0xbe, 0xff, 0x42, 0x36, 0x7c, 0x91, 0x59, 0x90, 0xe2, 0x14, 0x96, 0xfb, 0xf9, 0x73, 0xaa, 0x05, 0x49, 0x07, 0x69, - 0x5a, 0xe7, 0xa3, 0x22, 0xf8, 0x98, 0xe6, 0x4f, 0x63, 0x8a, 0x3f, 0xd6, 0x1d, 0x59, 0xf1, 0xcb, 0x97, 0x67, 0x7d, - 0xcf, 0xe4, 0x29, 0x33, 0x4b, 0xf9, 0x9d, 0x2e, 0xf7, 0x53, 0x8d, 0x9b, 0x8d, 0x4e, 0x5b, 0x8b, 0x20, 0x9a, 0x0a, - 0xcd, 0xb4, 0xc4, 0x5e, 0x90, 0x6f, 0x81, 0x54, 0x60, 0xbe, 0x50, 0x51, 0x8b, 0x3a, 0x77, 0x2c, 0x81, 0x74, 0x9f, - 0x7d, 0xbd, 0xed, 0xb8, 0x8e, 0xab, 0xcb, 0x86, 0x93, 0x60, 0xda, 0x5f, 0xc7, 0x99, 0x0f, 0x99, 0x6b, 0xc2, 0x78, - 0x0a, 0x9e, 0x1f, 0x59, 0x90, 0x85, 0x90, 0x06, 0x05, 0x5c, 0x40, 0xe6, 0xc4, 0x35, 0xe6, 0xdc, 0x1e, 0xd7, 0x4f, - 0x3e, 0x61, 0x2a, 0x3c, 0xe1, 0xf4, 0x85, 0xf1, 0x70, 0x7e, 0x84, 0xcb, 0xd0, 0xd0, 0x0d, 0x48, 0xc4, 0xc8, 0x92, - 0xd4, 0x56, 0xed, 0xdb, 0xbb, 0x1a, 0xb4, 0x81, 0x24, 0xe9, 0xd8, 0xc1, 0x24, 0xf1, 0xe7, 0x10, 0x31, 0x7c, 0x9d, - 0x5b, 0x1c, 0xd3, 0xea, 0x1c, 0xd5, 0x6a, 0xde, 0xab, 0x23, 0x4b, 0x6b, 0x79, 0x96, 0xe6, 0x02, 0xba, 0xd5, 0x73, - 0x6b, 0x9d, 0xdf, 0xf4, 0x76, 0xa9, 0xe8, 0x08, 0xbf, 0x3c, 0xa5, 0x79, 0x90, 0x72, 0x8e, 0x0b, 0x3f, 0x33, 0x0a, - 0x6f, 0x68, 0x28, 0xb1, 0xbc, 0x03, 0x12, 0xd3, 0x5f, 0xb1, 0x55, 0x66, 0x62, 0x9a, 0x10, 0x5e, 0x25, 0x30, 0xd7, - 0xe8, 0x9a, 0x16, 0x44, 0x5a, 0xf0, 0xf9, 0xb3, 0x11, 0x80, 0xf9, 0x7d, 0x5f, 0x81, 0x0f, 0x3c, 0x9b, 0x25, 0x80, - 0x05, 0x85, 0x62, 0x09, 0x81, 0x05, 0xbe, 0x31, 0xf0, 0x6f, 0x51, 0x2c, 0x7e, 0x70, 0xc5, 0x9e, 0x13, 0xfa, 0xd1, - 0x14, 0x50, 0x9a, 0x1f, 0x4d, 0x6b, 0x06, 0x04, 0xe4, 0x5d, 0x57, 0x29, 0x2d, 0xba, 0x2a, 0x94, 0xfb, 0xe9, 0xf7, - 0x0f, 0x57, 0x94, 0x06, 0x09, 0x52, 0x6e, 0xfb, 0x63, 0x74, 0x05, 0x2b, 0x74, 0x0f, 0x2f, 0xfb, 0xdf, 0x9c, 0xce, - 0x59, 0xe6, 0x93, 0xe0, 0x12, 0x58, 0x3c, 0x20, 0x07, 0xb4, 0x91, 0x48, 0x61, 0x4a, 0x0c, 0xde, 0x98, 0xdd, 0x05, - 0x23, 0xce, 0xa7, 0x59, 0x1a, 0xbf, 0xa7, 0x6c, 0xb4, 0x51, 0xea, 0x7b, 0x16, 0x99, 0xc8, 0x8e, 0x7c, 0x0c, 0x82, - 0xd8, 0x8f, 0x62, 0xfd, 0xec, 0x1b, 0xe9, 0x4d, 0xb4, 0x69, 0x11, 0x20, 0x17, 0xe1, 0x75, 0xc2, 0xc2, 0x7f, 0xf5, - 0xbf, 0x81, 0x8b, 0xfb, 0x9b, 0x1b, 0xdd, 0xec, 0x65, 0x0e, 0xf2, 0x31, 0xdf, 0x34, 0xe4, 0xe4, 0x43, 0x1e, 0x95, - 0x33, 0x9b, 0x6d, 0x85, 0xd9, 0x84, 0xdf, 0xbb, 0x59, 0xd7, 0xb3, 0x53, 0xbc, 0xd0, 0xce, 0x80, 0xbb, 0x58, 0x97, - 0x78, 0x4e, 0xaf, 0x87, 0x0c, 0xea, 0x30, 0xf4, 0x47, 0x9f, 0x04, 0x87, 0xaa, 0x3e, 0xec, 0xc3, 0x8b, 0x4a, 0xca, - 0xae, 0x71, 0x2f, 0xe3, 0x56, 0x5e, 0xe3, 0x97, 0xf1, 0x53, 0xf7, 0xb3, 0x20, 0x93, 0xcc, 0x30, 0x3e, 0xe4, 0xa0, - 0xcd, 0xc1, 0xf1, 0x15, 0xec, 0x0f, 0x30, 0xa8, 0xde, 0xc9, 0x5f, 0x3a, 0x77, 0x9e, 0x3b, 0x6b, 0x79, 0x0e, 0xb0, - 0x39, 0xb3, 0xb6, 0x73, 0x1c, 0xda, 0x6d, 0xe7, 0x18, 0xfe, 0x3e, 0x02, 0xeb, 0x65, 0xb7, 0x9c, 0xc3, 0x8f, 0x5e, - 0x2b, 0xb4, 0x4f, 0x9c, 0x63, 0xf8, 0xbb, 0xa4, 0x56, 0xbf, 0x20, 0xd3, 0x03, 0x0c, 0xcf, 0x37, 0x25, 0x2c, 0xa0, - 0xfc, 0x96, 0x5a, 0x04, 0xab, 0x74, 0xbd, 0x35, 0x68, 0x22, 0x00, 0x65, 0xe8, 0x96, 0x08, 0x51, 0x18, 0xf5, 0x0c, - 0x48, 0x12, 0x8e, 0xe1, 0xed, 0x85, 0x41, 0x46, 0x54, 0x24, 0xbc, 0xdf, 0x7c, 0x8c, 0x78, 0x9b, 0xe6, 0x70, 0xe0, - 0x22, 0x6f, 0x12, 0xa9, 0x2e, 0xfe, 0xb6, 0xc0, 0x10, 0x3b, 0x22, 0x80, 0xb9, 0x82, 0x95, 0x8a, 0xdc, 0x7d, 0xf9, - 0xee, 0x81, 0xa3, 0xdf, 0x28, 0x93, 0xb9, 0x63, 0xbe, 0x6a, 0xdf, 0x5c, 0x9d, 0x21, 0x7b, 0xff, 0xbd, 0xfd, 0x60, - 0xca, 0x54, 0xea, 0x47, 0xc4, 0x1a, 0x1d, 0x07, 0x89, 0x1c, 0x9e, 0x82, 0xa2, 0xbd, 0xe6, 0x38, 0xea, 0x26, 0x24, - 0xd9, 0xb8, 0x00, 0x2a, 0xf9, 0xce, 0x0f, 0x15, 0xd3, 0x0b, 0xa5, 0xe5, 0x13, 0x89, 0xf9, 0x9f, 0x3f, 0x2f, 0x06, - 0x67, 0x57, 0xc6, 0x7d, 0xea, 0x75, 0xe0, 0xda, 0xed, 0xb0, 0xf6, 0x56, 0x2b, 0xa0, 0xdd, 0xc1, 0x6a, 0x8b, 0x60, - 0x96, 0x42, 0xd3, 0x2f, 0x74, 0x8c, 0x1b, 0x4d, 0x91, 0x6a, 0x1a, 0x46, 0x08, 0xf3, 0x5b, 0x61, 0x75, 0x74, 0xb3, - 0x17, 0x09, 0x85, 0x59, 0xb4, 0x25, 0x40, 0x2f, 0xe7, 0xc5, 0x74, 0x00, 0xcd, 0x96, 0x79, 0xec, 0x70, 0x69, 0xfc, - 0x5f, 0x4f, 0x02, 0xdd, 0x8b, 0x40, 0xc3, 0x57, 0x39, 0xad, 0x25, 0x77, 0x13, 0x79, 0xaf, 0xd2, 0x85, 0xca, 0xd2, - 0x73, 0x1d, 0x8a, 0x20, 0xfb, 0x12, 0x26, 0x5c, 0x93, 0xe6, 0x4d, 0xf2, 0xb6, 0x28, 0x0a, 0xac, 0x00, 0x22, 0x54, - 0x1b, 0xc2, 0xd5, 0xc9, 0x7c, 0xfe, 0x7c, 0xe3, 0x25, 0x44, 0xea, 0x64, 0x35, 0xef, 0xa4, 0xae, 0xe2, 0x37, 0x5d, - 0x45, 0x31, 0xb2, 0x5f, 0xc4, 0x1a, 0xc2, 0x2a, 0x8b, 0xf6, 0x1e, 0xfe, 0x1c, 0x32, 0x3f, 0x73, 0xb8, 0x1e, 0xc4, - 0x50, 0x2e, 0x77, 0xcb, 0x63, 0x6d, 0xb0, 0xc7, 0xe2, 0x91, 0xb8, 0x78, 0xa4, 0xbb, 0x67, 0xeb, 0x8f, 0x4b, 0xee, - 0x87, 0x0c, 0x7d, 0x7c, 0x76, 0x8b, 0xe0, 0x29, 0xef, 0x32, 0x9f, 0x22, 0x6c, 0xa8, 0x57, 0x6e, 0x9c, 0xf9, 0x22, - 0xcb, 0x09, 0xd0, 0xe5, 0xbd, 0x46, 0x85, 0xa1, 0xe2, 0xab, 0x7c, 0xf6, 0xee, 0xea, 0x3b, 0x8d, 0xef, 0x7f, 0xd2, - 0x6f, 0x21, 0x23, 0x43, 0x31, 0xf9, 0xfb, 0x14, 0x93, 0x5f, 0xe3, 0x49, 0x2e, 0x20, 0xb2, 0x7d, 0x7e, 0x40, 0x10, - 0xd4, 0x35, 0x16, 0x8d, 0x48, 0xeb, 0x37, 0x5f, 0x86, 0x59, 0xb0, 0xf0, 0x93, 0xec, 0x00, 0x9a, 0xda, 0x80, 0xe4, - 0xf4, 0x4d, 0x1e, 0xcc, 0xa4, 0x38, 0x14, 0x42, 0xb5, 0x2c, 0x12, 0x9a, 0xc3, 0x49, 0x10, 0x4a, 0xc5, 0xa1, 0xf8, - 0x80, 0x3f, 0x1a, 0xb1, 0x45, 0xd6, 0xd7, 0xfd, 0x05, 0xe4, 0x66, 0xc0, 0x68, 0xcb, 0x07, 0xf1, 0x28, 0x63, 0x99, - 0x9d, 0x66, 0x09, 0xf3, 0xe7, 0xba, 0x0c, 0x34, 0x5a, 0xef, 0x2f, 0x5d, 0x0e, 0xe7, 0x41, 0x26, 0x23, 0xf5, 0xd1, - 0x04, 0x41, 0x85, 0x07, 0x43, 0x3c, 0x1b, 0xe4, 0x1c, 0x84, 0x97, 0xf1, 0xb4, 0xb2, 0xa3, 0x0a, 0xca, 0xe5, 0x1c, - 0xe3, 0xc0, 0xf2, 0x78, 0xfc, 0x63, 0xf4, 0xc8, 0xb9, 0xe5, 0x5e, 0xd7, 0x32, 0xa0, 0xa0, 0x7e, 0x76, 0xca, 0xd9, - 0x5b, 0x0d, 0x03, 0x05, 0xe8, 0x1d, 0x17, 0x22, 0xdd, 0x6e, 0xf2, 0xc7, 0x3e, 0xe0, 0x95, 0xe1, 0x6a, 0xa2, 0x9e, - 0x31, 0x0a, 0x39, 0x8d, 0xe5, 0x0a, 0x08, 0xa1, 0x92, 0x8a, 0x77, 0xe6, 0x9d, 0x49, 0x07, 0x20, 0x1c, 0x15, 0xd2, - 0x4a, 0x9f, 0x3f, 0xbf, 0x1e, 0xfc, 0xe7, 0xdf, 0x10, 0x2a, 0x7d, 0xe6, 0x09, 0x2f, 0xe8, 0x6b, 0xb5, 0x16, 0xa7, - 0x3e, 0xad, 0x01, 0xaa, 0xf7, 0xd9, 0x58, 0x84, 0x05, 0x11, 0x5b, 0x2b, 0x1f, 0xdc, 0x88, 0x50, 0x4f, 0x90, 0x0e, - 0xc1, 0x14, 0xbe, 0xda, 0x03, 0x58, 0xde, 0x81, 0x08, 0x11, 0xa0, 0xfd, 0xba, 0xfa, 0xfe, 0x18, 0x42, 0x01, 0xd7, - 0xb2, 0x14, 0x28, 0x03, 0xc4, 0x3d, 0x74, 0x76, 0xea, 0x73, 0xe1, 0x2b, 0x90, 0x1f, 0x69, 0xf7, 0x00, 0xa6, 0x39, - 0x8b, 0xe7, 0xcc, 0x09, 0xe2, 0x83, 0x7b, 0x36, 0xb4, 0xfd, 0x45, 0x40, 0xf2, 0x65, 0x94, 0xbb, 0x69, 0x44, 0xf9, - 0x49, 0x05, 0x2d, 0xd1, 0xd7, 0x79, 0x01, 0xca, 0xb8, 0x00, 0x14, 0xfc, 0xf4, 0xcf, 0xca, 0xd1, 0x03, 0x1d, 0x11, - 0xbf, 0xbe, 0x8c, 0xe5, 0xcf, 0x29, 0x08, 0xa0, 0x88, 0xf7, 0x57, 0x3c, 0xd8, 0xf1, 0x64, 0xa2, 0x46, 0xfc, 0x73, - 0xca, 0xdf, 0x97, 0x50, 0x29, 0xf6, 0x6c, 0xbc, 0xa0, 0x2f, 0xd5, 0x3f, 0x21, 0x7f, 0x42, 0xee, 0x5e, 0x1e, 0x1c, - 0x12, 0xce, 0x73, 0x2d, 0x72, 0xa0, 0x04, 0xc9, 0x53, 0xaa, 0xc4, 0x11, 0x45, 0x35, 0x4e, 0xf5, 0x06, 0xd2, 0xe4, - 0x49, 0xbf, 0x4f, 0x78, 0xac, 0x8a, 0xce, 0x00, 0x4a, 0x0d, 0xb1, 0xfc, 0x61, 0xb2, 0x19, 0x34, 0xb4, 0xc9, 0x83, - 0x0b, 0x1b, 0x55, 0xa7, 0x53, 0x1f, 0xe3, 0x81, 0x2f, 0xf6, 0x57, 0x69, 0x07, 0xc2, 0xce, 0xe2, 0x0b, 0x0b, 0x08, - 0x5c, 0xf4, 0x53, 0xc1, 0xe3, 0xda, 0xb7, 0x84, 0xb2, 0xed, 0xd0, 0x7f, 0x88, 0x15, 0xcd, 0x3a, 0x77, 0xb2, 0xbf, - 0xc4, 0xd2, 0x2b, 0xe1, 0xdc, 0x56, 0x3b, 0x49, 0x32, 0x1e, 0x7a, 0xfd, 0x34, 0xa9, 0x01, 0xcc, 0x77, 0x1d, 0x26, - 0xb5, 0x6e, 0x79, 0x32, 0x88, 0x1d, 0xf3, 0xe2, 0xa0, 0x95, 0x5e, 0xe2, 0xb9, 0xcf, 0x4f, 0x0f, 0x60, 0x7e, 0x10, - 0x18, 0xa0, 0x44, 0x19, 0x05, 0x26, 0x44, 0x1f, 0xf0, 0x53, 0xb2, 0x0e, 0xb8, 0x18, 0x0b, 0xa2, 0x0e, 0x39, 0x47, - 0x19, 0x9a, 0xb4, 0x54, 0xa5, 0x4e, 0xac, 0xb8, 0xcd, 0x54, 0xde, 0xee, 0xfc, 0x01, 0xbf, 0x2d, 0x31, 0x79, 0x40, - 0xde, 0xcb, 0x98, 0xf0, 0xbb, 0xbd, 0xcc, 0x36, 0xb8, 0xe6, 0x6e, 0xaa, 0x42, 0x04, 0xeb, 0x96, 0x0a, 0xc5, 0x3e, - 0xde, 0x56, 0xab, 0x20, 0x8d, 0x64, 0xb5, 0x85, 0x6f, 0xe8, 0x4f, 0x71, 0xc7, 0xd7, 0x6a, 0x63, 0x29, 0xd4, 0xbb, - 0xcc, 0xfa, 0x50, 0x55, 0x08, 0xdb, 0xfd, 0xc5, 0x82, 0x2a, 0x9b, 0xbd, 0xd3, 0x03, 0xe2, 0x3b, 0xcf, 0x68, 0x87, - 0x9d, 0x9d, 0x82, 0x75, 0x21, 0x2d, 0xba, 0xbf, 0x58, 0xf0, 0x25, 0xa5, 0x5f, 0xf4, 0xe6, 0x60, 0x96, 0xcd, 0xc3, - 0xb3, 0xff, 0x03, 0x1c, 0x2a, 0x1a, 0x60, 0x9f, 0x5a, 0x03, 0x00}; + 0xdc, 0x93, 0x2e, 0xb7, 0x6d, 0x24, 0xfd, 0x3f, 0x4f, 0x01, 0xc3, 0x5e, 0x87, 0xb0, 0x01, 0x08, 0x00, 0x45, 0x89, + 0x26, 0x45, 0x69, 0x13, 0x1f, 0xb5, 0x4e, 0x29, 0x71, 0xca, 0x56, 0x5c, 0xbb, 0x51, 0x54, 0x22, 0x48, 0x0e, 0x49, + 0xac, 0x41, 0x80, 0x05, 0x80, 0x3a, 0x42, 0x63, 0x9f, 0x65, 0x9f, 0x65, 0x9f, 0xec, 0xab, 0xee, 0x9e, 0x19, 0x0c, + 0x0e, 0x1e, 0x8a, 0x9d, 0xdd, 0xaf, 0x12, 0xdb, 0xc4, 0xdc, 0xd3, 0x33, 0xd3, 0xd3, 0xd3, 0xa7, 0x3f, 0xe3, 0xbc, + 0x17, 0xb3, 0xc5, 0xf6, 0xeb, 0xee, 0xf3, 0x67, 0x66, 0xe3, 0x96, 0x04, 0x82, 0xcf, 0xce, 0xe2, 0xd9, 0x2c, 0x64, + 0x2d, 0x5d, 0x04, 0x0f, 0xd1, 0x4d, 0xd9, 0xcd, 0xd9, 0x23, 0x47, 0x78, 0xec, 0x34, 0xf2, 0x4d, 0x47, 0x4b, 0xcc, + 0x98, 0x49, 0x97, 0x76, 0x44, 0xb9, 0x22, 0x6f, 0xf6, 0x06, 0xc5, 0x1b, 0x7c, 0x5d, 0x8a, 0xa3, 0x6b, 0x4d, 0xe2, + 0xd5, 0x28, 0x64, 0x16, 0x6e, 0x77, 0xe8, 0x72, 0x3d, 0x5a, 0x8d, 0x46, 0x10, 0xa5, 0xe5, 0x91, 0x63, 0x82, 0xdf, + 0x99, 0x38, 0xc5, 0xf7, 0x60, 0x6e, 0xf4, 0x61, 0x52, 0x76, 0x56, 0x1d, 0x3e, 0xe8, 0x8a, 0x00, 0xab, 0x87, 0x3a, + 0xc8, 0xe0, 0xed, 0xd7, 0x70, 0x6a, 0x07, 0xfa, 0x07, 0xd8, 0x7d, 0xa9, 0xde, 0x6f, 0x3a, 0xfa, 0x83, 0x4b, 0xfd, + 0x03, 0xc2, 0x18, 0xa3, 0x17, 0xbf, 0xa4, 0xdd, 0xab, 0x9b, 0x3a, 0x09, 0xbd, 0x57, 0x18, 0xc7, 0x00, 0x98, 0xbe, + 0xaf, 0x02, 0x7f, 0x16, 0xc5, 0x69, 0x16, 0x8c, 0xf5, 0xab, 0xfe, 0xdb, 0xa0, 0x75, 0xb9, 0xc8, 0x5a, 0xc6, 0x95, + 0x39, 0xce, 0xd4, 0x10, 0x28, 0x02, 0x61, 0x62, 0x04, 0x94, 0x4d, 0x85, 0xd4, 0x13, 0xb4, 0xb5, 0xa0, 0x40, 0xcd, + 0x58, 0x68, 0x9c, 0x0d, 0xa0, 0x5c, 0x25, 0x9e, 0x0a, 0x06, 0x86, 0xd2, 0xb1, 0xa6, 0xd1, 0xa7, 0x97, 0xca, 0xcb, + 0xd5, 0x1a, 0xaf, 0xf2, 0xac, 0xb8, 0x2d, 0xd1, 0x07, 0xb0, 0x30, 0x9c, 0xa1, 0xef, 0x47, 0xaa, 0xd2, 0x67, 0xe9, + 0xde, 0x1d, 0x7e, 0x57, 0xa6, 0x0b, 0xe0, 0xfe, 0x06, 0x8d, 0x8b, 0x28, 0xce, 0x34, 0x70, 0x6c, 0x03, 0x3d, 0x0e, + 0xab, 0x4a, 0x62, 0xbc, 0xd5, 0x96, 0x91, 0x73, 0x64, 0xf0, 0x3d, 0x5e, 0x7e, 0x2d, 0xee, 0xde, 0xac, 0xe4, 0xc1, + 0x82, 0x1e, 0x0b, 0x11, 0x2c, 0x60, 0x16, 0x9f, 0xc7, 0xb7, 0x55, 0x39, 0xc8, 0xcb, 0xe1, 0xee, 0xbb, 0xb7, 0x25, + 0xc8, 0x64, 0x11, 0xd5, 0xaf, 0xc5, 0x03, 0x93, 0x0a, 0x42, 0xa7, 0x72, 0xa6, 0x50, 0xf1, 0x43, 0xd0, 0x30, 0x19, + 0xe8, 0x89, 0xe1, 0x5d, 0x00, 0x28, 0x89, 0x5f, 0xd3, 0xc3, 0xfc, 0x5a, 0x84, 0x4e, 0x16, 0x81, 0x8b, 0x95, 0xcb, + 0x19, 0xb0, 0x6b, 0xb4, 0x5c, 0x65, 0xe8, 0x6a, 0x17, 0x06, 0xc0, 0x72, 0x5d, 0x43, 0xd7, 0x9d, 0x80, 0xa5, 0x0b, + 0x32, 0x31, 0xd7, 0xb5, 0x60, 0x52, 0x4f, 0xe3, 0x44, 0x2f, 0x20, 0x2f, 0xc4, 0xef, 0xc8, 0xa8, 0x82, 0xcf, 0x84, + 0x4f, 0x63, 0x6c, 0x16, 0x7e, 0xea, 0x5b, 0x63, 0x14, 0xe8, 0x34, 0x60, 0x86, 0x31, 0xb5, 0xd3, 0x6f, 0x85, 0x8d, + 0x93, 0x05, 0xf7, 0x9b, 0xa5, 0x69, 0x0e, 0x9f, 0xac, 0xa3, 0xfc, 0xec, 0xc9, 0x3a, 0xcd, 0x07, 0x4f, 0xd6, 0xbe, + 0xd4, 0x15, 0xd0, 0x2f, 0x74, 0x52, 0x14, 0x18, 0x22, 0x18, 0x86, 0xf9, 0x75, 0x61, 0xb9, 0x53, 0xcc, 0x17, 0x76, + 0x19, 0xa5, 0x6b, 0x28, 0xba, 0x1f, 0x70, 0x01, 0xfd, 0x32, 0x09, 0x16, 0x7e, 0x72, 0x4f, 0xf2, 0x7c, 0x53, 0x15, + 0xfa, 0x1b, 0xba, 0x46, 0x88, 0x9e, 0x00, 0x40, 0x38, 0x5f, 0xd7, 0xfe, 0x2a, 0xd3, 0x18, 0x9f, 0xad, 0x14, 0x6a, + 0x42, 0x5f, 0xd7, 0xfa, 0x73, 0x66, 0x4f, 0x58, 0xe6, 0x07, 0x21, 0x55, 0xe9, 0x8b, 0x68, 0xf5, 0xb5, 0xe9, 0xa5, + 0xe5, 0xe9, 0x45, 0xe5, 0xfd, 0x83, 0x93, 0xa1, 0x2b, 0x80, 0xc6, 0x8d, 0x33, 0xc3, 0x28, 0x56, 0xcd, 0x2b, 0x4a, + 0x79, 0xff, 0xd5, 0xe5, 0x60, 0xb0, 0x1c, 0x11, 0x2c, 0x07, 0x8b, 0xc6, 0xf1, 0x84, 0xfd, 0xf2, 0xfe, 0xad, 0x0c, + 0x9b, 0x05, 0x1c, 0xa0, 0x21, 0xdf, 0x98, 0x29, 0xd2, 0x0f, 0x09, 0xd2, 0x0e, 0x14, 0xe0, 0x4a, 0x93, 0x5b, 0x28, + 0xc9, 0x75, 0xed, 0x8c, 0xc6, 0xce, 0x26, 0x34, 0xea, 0x41, 0x8c, 0xb5, 0x92, 0xfc, 0xe4, 0x80, 0x4a, 0xd3, 0x6d, + 0x47, 0x85, 0x00, 0x0c, 0x09, 0xcc, 0xb0, 0x80, 0x02, 0x44, 0xf8, 0x1c, 0xb8, 0xc5, 0x83, 0xc2, 0x5e, 0x20, 0x9f, + 0xdd, 0x3d, 0x2b, 0x93, 0x2a, 0x58, 0x4b, 0x3f, 0x3d, 0xc1, 0x98, 0x5d, 0x70, 0x5f, 0x83, 0x97, 0x8f, 0x93, 0x03, + 0xfa, 0xd4, 0x2a, 0x27, 0xa2, 0x68, 0x44, 0x3c, 0xed, 0x7a, 0xbc, 0x81, 0x07, 0x1d, 0x15, 0x08, 0x11, 0x0f, 0xa9, + 0x7e, 0xae, 0x6b, 0x0b, 0x4e, 0x1a, 0x71, 0x77, 0x42, 0xe0, 0x6b, 0xc0, 0x81, 0xb3, 0xab, 0x6b, 0x0b, 0xff, 0x0e, + 0x67, 0x2e, 0x72, 0xfc, 0xbb, 0x96, 0xcb, 0xb3, 0x8a, 0xb3, 0x96, 0x96, 0xcf, 0xda, 0x98, 0x2f, 0x2e, 0x18, 0x12, + 0xc8, 0x97, 0xf5, 0x1c, 0x05, 0xb4, 0x0d, 0x8b, 0x3b, 0x17, 0x8b, 0x3b, 0xd9, 0xb0, 0xb8, 0x93, 0x2d, 0x8b, 0x1b, + 0xf2, 0x85, 0xd4, 0x24, 0xe8, 0x12, 0x34, 0x0e, 0x93, 0xc0, 0xe3, 0x84, 0x46, 0x8f, 0x9f, 0x33, 0x84, 0x93, 0x95, + 0x86, 0xa0, 0x1c, 0xb5, 0x01, 0x56, 0x4d, 0x70, 0x51, 0x00, 0x51, 0x9f, 0xb8, 0x3c, 0x75, 0x62, 0xde, 0x10, 0x83, + 0xb3, 0x15, 0x56, 0xe7, 0x0b, 0xbb, 0x94, 0xe2, 0x8b, 0xb7, 0xe6, 0x1b, 0x66, 0x3a, 0xdf, 0x32, 0xd3, 0x71, 0xe9, + 0xe8, 0xf2, 0x69, 0xd3, 0x21, 0x54, 0x27, 0x05, 0x7b, 0x10, 0x14, 0x46, 0x71, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x1c, + 0xab, 0xec, 0xa8, 0xa5, 0x9f, 0xa6, 0xb7, 0x71, 0x02, 0x12, 0x17, 0x68, 0xe6, 0x61, 0x5b, 0x6a, 0x11, 0x44, 0xdc, + 0x99, 0xcb, 0xc6, 0xcd, 0x54, 0xe4, 0xab, 0x5b, 0xca, 0xeb, 0x74, 0xa8, 0xc4, 0xd2, 0xcf, 0x32, 0x96, 0x20, 0xd0, + 0x7d, 0xf0, 0xfa, 0xfd, 0xff, 0x64, 0x9b, 0x35, 0xe0, 0x90, 0x50, 0xc1, 0xea, 0x88, 0xa1, 0x97, 0x40, 0x5b, 0x25, + 0xe2, 0x22, 0x56, 0x1c, 0xc3, 0x25, 0x12, 0xf0, 0x3f, 0xe1, 0x71, 0x6d, 0x25, 0x8a, 0xe9, 0x92, 0x7b, 0x64, 0xd8, + 0x4b, 0x7f, 0xf2, 0x01, 0x04, 0x7b, 0x2d, 0xcf, 0x04, 0x25, 0x5d, 0xd5, 0x0d, 0x5c, 0x42, 0xc4, 0xde, 0xb8, 0x40, + 0x92, 0x88, 0x25, 0xb9, 0x0a, 0x14, 0x58, 0x4f, 0xfa, 0xd6, 0xf4, 0x6a, 0xed, 0xe5, 0x07, 0xb3, 0xc0, 0xa8, 0x61, + 0x4d, 0x40, 0x6d, 0xe1, 0xe0, 0x54, 0xbe, 0xb9, 0x42, 0xd3, 0x3d, 0x32, 0x80, 0xf3, 0x7b, 0x09, 0xf1, 0x4c, 0x1d, + 0xf1, 0xa0, 0x1d, 0x26, 0x70, 0x6b, 0x5d, 0x3a, 0x57, 0xf9, 0xd3, 0x19, 0xfe, 0x72, 0xaf, 0xf2, 0xa7, 0x23, 0xfc, + 0xe5, 0x5d, 0x61, 0xe4, 0xba, 0x86, 0x87, 0xbc, 0x32, 0x67, 0xfd, 0xb4, 0xb4, 0x9f, 0x48, 0xff, 0xec, 0x01, 0xdb, + 0x86, 0x2f, 0xf0, 0xe3, 0x27, 0xeb, 0x14, 0x2c, 0x2e, 0xd5, 0x39, 0x44, 0x76, 0x62, 0xe4, 0x8d, 0xe9, 0xb3, 0x0d, + 0xe9, 0x23, 0xe3, 0xbf, 0x7c, 0xf1, 0xe3, 0x2e, 0x89, 0x8b, 0x3b, 0xa5, 0xcc, 0x86, 0xb8, 0x1e, 0x05, 0x91, 0x9f, + 0xdc, 0x5f, 0xd3, 0xf3, 0xa2, 0x25, 0x68, 0x77, 0xc9, 0x5e, 0x21, 0xf2, 0xb2, 0x2c, 0xee, 0xca, 0x14, 0x06, 0xef, + 0x3d, 0xbf, 0xe8, 0x07, 0x7f, 0x4f, 0x14, 0xb2, 0xad, 0xf4, 0x00, 0xe5, 0x0b, 0x52, 0xea, 0xe8, 0xfa, 0xc9, 0xba, + 0xc5, 0xea, 0xcd, 0x54, 0x66, 0x5b, 0xa1, 0x0b, 0x61, 0x79, 0xf0, 0x31, 0xbb, 0x98, 0x04, 0x3d, 0x94, 0x67, 0x8d, + 0xe2, 0x3b, 0xeb, 0xc9, 0x3a, 0x3b, 0xd3, 0x17, 0x7e, 0xf2, 0x89, 0x4d, 0xac, 0x71, 0x90, 0x8c, 0x43, 0xa6, 0xf7, + 0xf4, 0x51, 0xe8, 0x47, 0x9f, 0xf8, 0xa7, 0x15, 0xaf, 0x32, 0x94, 0x50, 0xef, 0x7c, 0xfb, 0x0a, 0x98, 0x10, 0xcb, + 0x0e, 0x89, 0xd5, 0x06, 0x28, 0x68, 0x2f, 0x25, 0xc3, 0xab, 0x20, 0x14, 0x8b, 0x52, 0x26, 0x28, 0x58, 0x82, 0xd0, + 0x1c, 0x2c, 0x56, 0x4d, 0x1d, 0xd7, 0x4b, 0x37, 0xd5, 0xa9, 0x12, 0xb3, 0x52, 0x86, 0x5c, 0xbc, 0xc6, 0x16, 0xfe, + 0x78, 0x77, 0x14, 0x0c, 0x7b, 0xff, 0xee, 0x64, 0x2b, 0x5f, 0x36, 0x43, 0x48, 0xb5, 0xc8, 0x52, 0xe2, 0x01, 0x9d, + 0x73, 0x02, 0x73, 0x73, 0xd7, 0x6a, 0x65, 0x3f, 0x4d, 0x57, 0x0b, 0x36, 0x21, 0xc9, 0xe0, 0x59, 0x31, 0xa8, 0xf2, + 0xcb, 0x42, 0x1d, 0xd8, 0x6f, 0x2b, 0xef, 0xf8, 0xf0, 0x25, 0x68, 0x2c, 0x00, 0x41, 0x19, 0x4f, 0xa7, 0x7a, 0xf1, + 0xc6, 0xdf, 0x51, 0xcd, 0x3d, 0xfc, 0x6d, 0xf5, 0xe6, 0xb5, 0xf3, 0x46, 0x56, 0x8e, 0x80, 0x30, 0x16, 0xe2, 0x57, + 0x4e, 0x17, 0x2b, 0xe3, 0x15, 0x33, 0x9a, 0xfa, 0xd1, 0xe6, 0xe9, 0x5c, 0x96, 0xb6, 0xf8, 0x92, 0xb1, 0x09, 0x10, + 0xdc, 0x66, 0x2d, 0xf5, 0x3a, 0x64, 0x37, 0x4c, 0x8a, 0x76, 0xeb, 0x9d, 0x35, 0xd4, 0x40, 0xdf, 0x73, 0x5c, 0x64, + 0xcc, 0xa9, 0x3a, 0x65, 0x4a, 0x43, 0x9c, 0x03, 0x9f, 0xb9, 0x7a, 0xc4, 0x2a, 0x47, 0x6a, 0x68, 0xea, 0xca, 0x00, + 0x36, 0x8e, 0xec, 0x6c, 0x43, 0x7a, 0x0f, 0x03, 0x4f, 0x37, 0x8f, 0xcd, 0x74, 0x8d, 0x1e, 0xf8, 0xea, 0xe6, 0x70, + 0x0a, 0xe1, 0xe4, 0xb5, 0x0a, 0x76, 0xc8, 0x26, 0x88, 0x35, 0x31, 0xc9, 0x74, 0xe2, 0xbe, 0x08, 0x6d, 0x47, 0x54, + 0xfb, 0x15, 0x7c, 0xa8, 0xc6, 0xb5, 0xd1, 0xca, 0x33, 0x1f, 0x61, 0x40, 0xd7, 0x88, 0xa5, 0xe9, 0x46, 0x80, 0xc9, + 0x45, 0x37, 0xf5, 0xa2, 0x74, 0x19, 0x1e, 0x45, 0xba, 0xe9, 0x98, 0x40, 0x12, 0xe0, 0x04, 0xab, 0x7d, 0xe1, 0xf5, + 0x72, 0xbd, 0xe0, 0xfa, 0x2a, 0xc9, 0x6c, 0xa4, 0x73, 0x5d, 0x82, 0x4d, 0xf9, 0xb7, 0x3a, 0x1f, 0x54, 0xe9, 0x9a, + 0x6e, 0x1c, 0x5a, 0xab, 0x84, 0x7a, 0x6b, 0xec, 0x22, 0x6c, 0x40, 0x8c, 0xa9, 0x82, 0x5f, 0xd9, 0x74, 0xca, 0xc6, + 0x59, 0x6a, 0x08, 0xe6, 0x91, 0xf4, 0x1e, 0x0b, 0x56, 0x43, 0x8f, 0x06, 0xfa, 0x4f, 0x60, 0x43, 0x2f, 0x9c, 0x2c, + 0xf1, 0x01, 0x89, 0x37, 0x53, 0x33, 0x98, 0xa8, 0xc5, 0x32, 0x88, 0x78, 0x2f, 0x10, 0x1c, 0xbc, 0x21, 0x1d, 0x87, + 0xc6, 0xef, 0x9f, 0x62, 0x5f, 0xc4, 0x52, 0xab, 0x65, 0x3b, 0x2a, 0xda, 0x76, 0x7c, 0xd7, 0xee, 0x9b, 0x8e, 0xeb, + 0xe4, 0xba, 0x09, 0xb6, 0x5b, 0x9f, 0xf6, 0x3d, 0xf4, 0x58, 0xab, 0x0d, 0xb5, 0x56, 0xd1, 0x43, 0xea, 0x79, 0xee, + 0x0b, 0x57, 0x37, 0x49, 0x65, 0x4e, 0xc1, 0x6d, 0xe3, 0xf8, 0x86, 0x25, 0x5f, 0x3c, 0x95, 0x72, 0xe3, 0xfb, 0x8d, + 0xe7, 0xc8, 0x75, 0x00, 0x09, 0x67, 0xf1, 0xf2, 0x01, 0x53, 0x68, 0xeb, 0xa6, 0x3e, 0x0e, 0xe3, 0x94, 0xa9, 0x73, + 0x20, 0x26, 0xc8, 0x17, 0x4e, 0xe2, 0xe7, 0xf7, 0xaf, 0x3f, 0x7c, 0xd0, 0x4d, 0x8c, 0x04, 0x9a, 0xaa, 0xad, 0xf3, + 0x0d, 0xb5, 0x03, 0xfb, 0x37, 0xee, 0x3b, 0xba, 0x61, 0xe8, 0x51, 0x5b, 0xde, 0x73, 0x94, 0x56, 0xdb, 0x72, 0xfc, + 0xe6, 0xe1, 0x3d, 0xd3, 0x4b, 0x74, 0xaf, 0x79, 0x35, 0xe0, 0x86, 0xed, 0xd7, 0x5b, 0x29, 0x65, 0x11, 0x44, 0xd7, + 0x0d, 0xa9, 0xfe, 0x5d, 0x43, 0x2a, 0x3c, 0xe5, 0x6a, 0xb8, 0x6a, 0x15, 0x2f, 0x14, 0xd2, 0x00, 0x02, 0x39, 0xef, + 0x02, 0x97, 0xf2, 0x9e, 0xfa, 0x82, 0x41, 0x73, 0x4f, 0xee, 0xd5, 0x51, 0x37, 0x24, 0xf3, 0x47, 0x90, 0x84, 0xed, + 0x38, 0x04, 0x85, 0x3f, 0xa6, 0x4a, 0xe5, 0xca, 0x64, 0xa3, 0x54, 0xd7, 0x55, 0x1a, 0x21, 0xf2, 0xf6, 0x3a, 0x63, + 0x8b, 0x25, 0x4b, 0xfc, 0x6c, 0x95, 0xb0, 0xeb, 0x30, 0xbe, 0x7d, 0x54, 0xa8, 0xd3, 0xef, 0x28, 0x3c, 0x0f, 0x66, + 0x73, 0x59, 0xfa, 0xac, 0xc5, 0x06, 0x72, 0x01, 0xb7, 0x76, 0x90, 0xff, 0xe7, 0xdf, 0xb6, 0xfd, 0x9f, 0x7f, 0xef, + 0x2c, 0x0a, 0xcd, 0xe7, 0x43, 0x33, 0x1b, 0xec, 0xb1, 0x2f, 0x9a, 0x7b, 0x2a, 0xc3, 0xbc, 0xb9, 0x4c, 0x6d, 0x11, + 0x20, 0xbf, 0xb6, 0x04, 0xb5, 0xc4, 0xf2, 0xbe, 0x79, 0xd0, 0xc0, 0x60, 0x5e, 0x3b, 0x47, 0x06, 0x85, 0xbe, 0x68, + 0x68, 0x43, 0xa3, 0xb7, 0xd7, 0x8a, 0xfc, 0x71, 0x08, 0xef, 0x9a, 0xc3, 0x17, 0x0e, 0x9f, 0xf3, 0x25, 0x5f, 0x0e, + 0x87, 0x32, 0xb6, 0x9c, 0x5a, 0x15, 0x54, 0xfc, 0xcf, 0x6a, 0x29, 0xfc, 0xf2, 0xec, 0x39, 0x06, 0xd9, 0xde, 0x0f, + 0x5e, 0x0e, 0x51, 0x19, 0xed, 0x64, 0x94, 0x14, 0xc4, 0xca, 0x46, 0xd4, 0x46, 0xca, 0xe4, 0xb5, 0x46, 0x6b, 0x78, + 0x0d, 0x52, 0x31, 0xe0, 0x58, 0x3e, 0x34, 0xcc, 0x97, 0x43, 0xce, 0x58, 0xe2, 0xfa, 0xaf, 0xbd, 0xea, 0xd6, 0xe6, + 0x6c, 0xd9, 0x12, 0xd0, 0x4d, 0x8d, 0xe4, 0x3f, 0x58, 0x98, 0x15, 0x7c, 0x3c, 0x64, 0xf0, 0x03, 0x47, 0x61, 0x98, + 0x63, 0xbc, 0x93, 0x77, 0x9b, 0x74, 0xc4, 0x7e, 0xde, 0xad, 0x23, 0x76, 0xb1, 0x97, 0x8e, 0xd8, 0xcf, 0x5f, 0x5d, + 0x47, 0xec, 0x9d, 0xaa, 0x23, 0x06, 0x8b, 0xf8, 0x9a, 0xed, 0xa5, 0xb8, 0x25, 0xb4, 0x36, 0xe2, 0xdb, 0x74, 0xe0, + 0x72, 0x92, 0x36, 0x1d, 0xcf, 0x19, 0xf0, 0x08, 0xf8, 0xaa, 0x84, 0xf1, 0x0c, 0x94, 0xb8, 0xfe, 0x7c, 0x75, 0xab, + 0x30, 0x9e, 0xa9, 0xca, 0x56, 0x11, 0xf7, 0xf8, 0x5a, 0x78, 0x71, 0x22, 0x05, 0x27, 0xc7, 0x14, 0x3e, 0x9f, 0xac, + 0x43, 0x43, 0x89, 0x6a, 0x2d, 0xb5, 0xd7, 0x3c, 0xa1, 0x02, 0xd5, 0x43, 0xed, 0x29, 0x59, 0xd1, 0x7b, 0x2e, 0x7c, + 0x5b, 0xa8, 0x2d, 0x48, 0x2d, 0x61, 0xf2, 0x13, 0xb1, 0xd6, 0x7f, 0xbb, 0x73, 0xbf, 0xbf, 0x74, 0xfb, 0x6d, 0x17, + 0x8c, 0xb3, 0xe1, 0x85, 0x89, 0x09, 0x4e, 0xbf, 0xdd, 0x86, 0x84, 0x5b, 0x25, 0xc1, 0x83, 0x84, 0x40, 0x49, 0xe8, + 0x40, 0xc2, 0x58, 0x49, 0x38, 0x82, 0x84, 0x89, 0x92, 0x70, 0x0c, 0x09, 0x37, 0x7a, 0x7e, 0x19, 0xc9, 0xe1, 0x1e, + 0x1b, 0x57, 0x26, 0x3d, 0x2a, 0x44, 0xda, 0xb1, 0xe9, 0x82, 0xd6, 0x94, 0x3f, 0xeb, 0xc5, 0x26, 0x71, 0x17, 0x7b, + 0x89, 0x79, 0x3b, 0x67, 0xe4, 0x28, 0xfa, 0x15, 0xde, 0x39, 0x76, 0x16, 0x83, 0xde, 0xb4, 0x70, 0xc0, 0x20, 0xe0, + 0xa0, 0xe9, 0x06, 0x30, 0x8c, 0xfa, 0x72, 0xe5, 0x84, 0x13, 0x0b, 0x65, 0x2d, 0x8b, 0x3c, 0xea, 0xce, 0x92, 0x5b, + 0xa0, 0xd0, 0x38, 0x69, 0xa9, 0x5c, 0xc9, 0xaf, 0xa1, 0x77, 0xf0, 0x8a, 0x8d, 0x56, 0x33, 0xed, 0x3c, 0x9e, 0xed, + 0x54, 0x21, 0x50, 0xb3, 0x60, 0x94, 0x3a, 0x89, 0x5f, 0x2c, 0xb1, 0x2d, 0x79, 0x5f, 0xf4, 0x99, 0x97, 0xcb, 0x67, + 0x30, 0x36, 0x2d, 0x23, 0x05, 0x16, 0xe8, 0x07, 0x60, 0xa4, 0xc8, 0xf0, 0xcf, 0x01, 0xce, 0xca, 0xf7, 0x85, 0xaf, + 0x8c, 0xe7, 0xf4, 0x47, 0x96, 0xa6, 0xfe, 0x4c, 0x94, 0xaf, 0x8f, 0x13, 0x94, 0x76, 0xe4, 0xfb, 0x0b, 0x01, 0x08, + 0x9c, 0xbc, 0xa0, 0xa6, 0x9b, 0x91, 0xc4, 0xb7, 0x1a, 0x68, 0xff, 0xc0, 0x86, 0x2a, 0xf4, 0x14, 0x02, 0x1b, 0x96, + 0xb0, 0xac, 0x51, 0x00, 0x87, 0xff, 0x86, 0x85, 0xd5, 0xc4, 0xcc, 0x9f, 0x55, 0x93, 0x68, 0x1f, 0xe4, 0xea, 0xd8, + 0xa4, 0x40, 0xbf, 0x94, 0xf8, 0x25, 0x12, 0xea, 0x30, 0x9e, 0xfd, 0xa9, 0xe2, 0xe9, 0x2d, 0x6a, 0x05, 0x1f, 0x22, + 0x33, 0xc8, 0x86, 0x36, 0xc2, 0x58, 0xb3, 0x01, 0x84, 0xbd, 0x28, 0x9b, 0x5b, 0x68, 0x5a, 0xd6, 0xf2, 0x22, 0xc3, + 0xb4, 0x71, 0x6d, 0xd7, 0x55, 0x83, 0xda, 0x5e, 0x32, 0x1b, 0xf9, 0x2d, 0xd7, 0x3b, 0x36, 0xc5, 0x1f, 0xdb, 0xe9, + 0x18, 0x39, 0xb6, 0xa0, 0x4d, 0x82, 0x9b, 0xf5, 0x34, 0x8e, 0x32, 0x6b, 0xea, 0x2f, 0x82, 0xf0, 0xbe, 0xb7, 0x88, + 0xa3, 0x38, 0x5d, 0xfa, 0x63, 0xd6, 0x2f, 0x1e, 0xd4, 0x7d, 0x74, 0xd5, 0xc0, 0xad, 0x05, 0x5d, 0xdb, 0x4b, 0xd8, + 0x82, 0x6a, 0x4b, 0x4f, 0x0c, 0xd3, 0x90, 0xdd, 0xe5, 0xbc, 0xfb, 0x52, 0x61, 0x2a, 0x8a, 0x5b, 0x8e, 0x6a, 0x00, + 0x45, 0xca, 0xdd, 0x3c, 0x80, 0x73, 0xa3, 0xfe, 0xd2, 0x9f, 0xa0, 0x67, 0x42, 0xdb, 0xeb, 0x24, 0x6c, 0xa1, 0xd9, + 0x9d, 0x8d, 0x8d, 0x27, 0xf1, 0xed, 0x29, 0x8c, 0x16, 0x2b, 0x5b, 0x29, 0x0b, 0xa7, 0x98, 0x63, 0xa1, 0x65, 0x89, + 0x68, 0xc7, 0xc2, 0x87, 0x38, 0xb4, 0xc6, 0x16, 0x7d, 0xc8, 0xee, 0x79, 0x9a, 0xd3, 0x5f, 0x04, 0x91, 0x45, 0xd3, + 0x39, 0x76, 0x96, 0x4a, 0x5b, 0x2a, 0xfc, 0x8c, 0x35, 0x16, 0x77, 0x35, 0xa7, 0x0f, 0x8f, 0xb5, 0x69, 0x18, 0xdf, + 0xf6, 0xe6, 0xc1, 0x64, 0xc2, 0xa2, 0x3e, 0x8e, 0x59, 0x26, 0xb2, 0x30, 0x0c, 0x96, 0x69, 0x90, 0xf6, 0x17, 0xfe, + 0x1d, 0x6f, 0xf5, 0x70, 0x53, 0xab, 0x6d, 0xde, 0x6a, 0x7b, 0xef, 0x56, 0x95, 0x66, 0xc0, 0x8a, 0x85, 0xda, 0xe1, + 0x43, 0xeb, 0x68, 0x4e, 0x65, 0x9e, 0x7b, 0xb7, 0xba, 0x4c, 0xd8, 0x7a, 0xe1, 0x27, 0xb3, 0x20, 0xea, 0x39, 0xb9, + 0x7d, 0xb3, 0xa6, 0x8d, 0xf1, 0xb8, 0xdb, 0xed, 0xe6, 0xf6, 0x44, 0x7c, 0x39, 0x93, 0x49, 0x6e, 0x8f, 0xc5, 0xd7, + 0x74, 0xea, 0x38, 0xd3, 0x69, 0x6e, 0x07, 0x22, 0xa1, 0xed, 0x8d, 0x27, 0x6d, 0x2f, 0xb7, 0x6f, 0x95, 0x12, 0xb9, + 0xcd, 0xf8, 0x57, 0xc2, 0x26, 0x7d, 0xdc, 0x48, 0xa4, 0x56, 0xda, 0x3b, 0x76, 0x9c, 0x1c, 0x31, 0xc0, 0x65, 0x09, + 0x37, 0x21, 0xaf, 0xe7, 0x6a, 0xbd, 0x77, 0x49, 0xad, 0xe8, 0x6e, 0x3c, 0x6e, 0x2c, 0x37, 0xf1, 0x93, 0x4f, 0x57, + 0x9a, 0x32, 0x0b, 0xdf, 0xa7, 0x62, 0x6b, 0x01, 0x06, 0xeb, 0xae, 0x07, 0x2e, 0xbb, 0xfa, 0xa3, 0x38, 0x81, 0x33, + 0x9b, 0xf8, 0x93, 0x60, 0x95, 0xf6, 0x5c, 0x6f, 0x79, 0x27, 0x92, 0xf8, 0x5e, 0x2f, 0x12, 0xf0, 0xec, 0xf5, 0xd2, + 0x38, 0x0c, 0x26, 0x22, 0x69, 0xd3, 0x59, 0x72, 0x3d, 0xa3, 0x8f, 0x06, 0xeb, 0x01, 0xba, 0x5d, 0xf0, 0xc3, 0x50, + 0xb3, 0xdb, 0xa9, 0xc6, 0xfc, 0x14, 0xf9, 0xcb, 0x9a, 0x93, 0x12, 0x5c, 0xd0, 0x38, 0xdd, 0x3d, 0x5c, 0xde, 0xc9, + 0x3d, 0xef, 0x1e, 0x2d, 0xef, 0xf2, 0xbf, 0x2e, 0xd8, 0x24, 0xf0, 0xb5, 0x56, 0xb1, 0x9b, 0x5c, 0x07, 0x78, 0xd0, + 0xc6, 0x7a, 0xc3, 0x36, 0x15, 0xc7, 0x02, 0x5c, 0x1b, 0x3e, 0x0a, 0x16, 0xcb, 0x38, 0xc9, 0xfc, 0x28, 0xcb, 0xf3, + 0xe1, 0x55, 0x9e, 0xf7, 0x2f, 0x82, 0xd6, 0xe5, 0x3f, 0x5a, 0x74, 0x4f, 0x93, 0xcc, 0x26, 0x37, 0xae, 0xcc, 0xd7, + 0x4c, 0xd5, 0x19, 0x81, 0x6b, 0x0c, 0xf5, 0x45, 0xd4, 0xc2, 0x74, 0x4b, 0xd6, 0x0b, 0x13, 0x90, 0x65, 0x71, 0xd2, + 0x41, 0x29, 0x17, 0xc1, 0x1b, 0x08, 0x0a, 0xbc, 0x66, 0x83, 0x0b, 0x45, 0xff, 0x04, 0x88, 0x15, 0x2c, 0x4c, 0x76, + 0x05, 0x4f, 0x36, 0xd1, 0x8c, 0xdf, 0xed, 0xa6, 0x19, 0x7f, 0xcd, 0xf6, 0xa1, 0x19, 0xbf, 0xfb, 0xea, 0x34, 0xe3, + 0x93, 0xba, 0x5d, 0xc1, 0xdb, 0x78, 0xa0, 0x4b, 0x09, 0x03, 0x5c, 0x4d, 0x09, 0x79, 0xec, 0x79, 0xfb, 0x87, 0xcd, + 0x00, 0x44, 0x6b, 0x14, 0x83, 0x8e, 0x6e, 0x6e, 0xe0, 0xc7, 0xbe, 0x8b, 0x06, 0x7f, 0x4f, 0xd4, 0xef, 0xe9, 0x74, + 0xf0, 0x2a, 0x56, 0x12, 0xe4, 0x17, 0x57, 0xbe, 0x28, 0x79, 0x57, 0xa0, 0x1c, 0xa1, 0x85, 0x89, 0xf1, 0x27, 0xc0, + 0x38, 0x9b, 0xb4, 0x8e, 0x27, 0x52, 0xfb, 0xac, 0x5f, 0x1e, 0x42, 0x4b, 0xaa, 0x7c, 0x0a, 0x13, 0x9c, 0x1a, 0x2b, + 0x71, 0xc6, 0x32, 0x6e, 0x33, 0xfb, 0xfd, 0xfd, 0xdb, 0x49, 0xeb, 0x6d, 0x6c, 0xe4, 0x41, 0xfa, 0xae, 0x6a, 0x00, + 0xc3, 0x65, 0x3f, 0x03, 0x75, 0x3a, 0x39, 0xd7, 0x20, 0x53, 0x03, 0x4c, 0x43, 0x36, 0x55, 0x3f, 0x2b, 0xcd, 0xb4, + 0xa7, 0x56, 0xe4, 0x81, 0xae, 0x6a, 0x97, 0x31, 0xb7, 0x3e, 0x58, 0x73, 0x0a, 0x10, 0x63, 0x77, 0xa1, 0xdd, 0xf0, + 0x84, 0xaa, 0x07, 0x93, 0x3c, 0x37, 0xfa, 0x02, 0x10, 0xca, 0x45, 0xcb, 0x76, 0x11, 0x71, 0xe9, 0xad, 0xd4, 0x69, + 0xe0, 0x12, 0x42, 0x12, 0xff, 0xbd, 0x05, 0x81, 0x3a, 0x17, 0x16, 0x72, 0x98, 0xe9, 0x1a, 0x81, 0x8f, 0x14, 0x2d, + 0x94, 0x09, 0x81, 0x04, 0x58, 0xc2, 0x5f, 0x64, 0x89, 0x84, 0xba, 0x0e, 0x27, 0x01, 0x07, 0x35, 0x02, 0xc0, 0xca, + 0x5f, 0xf0, 0xb5, 0x09, 0xed, 0xf0, 0x32, 0xf8, 0x91, 0xeb, 0x92, 0xf6, 0xc3, 0xed, 0x77, 0x7a, 0x72, 0x00, 0x15, + 0x4e, 0x2b, 0x8a, 0x03, 0x3b, 0x34, 0x14, 0x81, 0x94, 0x48, 0x6f, 0x4d, 0x3b, 0xbd, 0xd5, 0x9e, 0xad, 0x85, 0x87, + 0x8c, 0xcc, 0x5f, 0x5a, 0xf0, 0xc4, 0x47, 0xdc, 0xcb, 0x31, 0x9e, 0xe2, 0x8c, 0xa3, 0xbf, 0x4a, 0x01, 0x37, 0xe2, + 0x43, 0x15, 0xf1, 0x4f, 0x7f, 0xbc, 0x4a, 0xd2, 0x38, 0xe9, 0x2d, 0xe3, 0x20, 0xca, 0x58, 0x92, 0x23, 0xa8, 0x2e, + 0x11, 0x3e, 0x02, 0x3c, 0x57, 0xeb, 0x78, 0xe9, 0x8f, 0x83, 0xec, 0xbe, 0xe7, 0x70, 0x92, 0xc2, 0xe9, 0x73, 0xea, + 0xc0, 0x69, 0x2c, 0xdf, 0xe3, 0xd0, 0x7c, 0x8e, 0x84, 0x5f, 0x52, 0x27, 0x67, 0xd4, 0x6d, 0xde, 0x57, 0x72, 0xc9, + 0x47, 0x08, 0x90, 0x1f, 0x7e, 0x62, 0xcd, 0x00, 0xcb, 0xc3, 0x52, 0x3b, 0x13, 0x36, 0x33, 0x11, 0x6b, 0x03, 0x5f, + 0x5e, 0xfc, 0xb1, 0x3b, 0x86, 0xe6, 0x34, 0x27, 0x03, 0xc5, 0x63, 0xec, 0x33, 0xb2, 0x9e, 0x0f, 0x11, 0xb5, 0xcc, + 0x7d, 0x4a, 0x8e, 0xd8, 0x34, 0x4e, 0x18, 0xf9, 0x93, 0x75, 0xbb, 0xcb, 0xbb, 0xfd, 0x9b, 0xdf, 0x3e, 0xfd, 0xe6, + 0x76, 0xa2, 0x38, 0x6b, 0x89, 0xc6, 0x8c, 0x1d, 0xad, 0xd5, 0xef, 0x33, 0x20, 0x0d, 0x09, 0xf2, 0x63, 0x72, 0xdd, + 0xd5, 0xd3, 0xf5, 0x7e, 0xa3, 0xdb, 0xae, 0x65, 0xcc, 0xef, 0xbc, 0x84, 0x85, 0x7e, 0x16, 0xdc, 0x08, 0x9a, 0xb1, + 0x7d, 0xb4, 0xbc, 0x13, 0x6b, 0x8c, 0x17, 0xde, 0x03, 0x16, 0xa9, 0x32, 0x14, 0xb1, 0x48, 0xd5, 0x64, 0x5c, 0xa4, + 0x7e, 0x6d, 0x36, 0xc2, 0x93, 0x45, 0xe5, 0xa6, 0xef, 0x2c, 0xef, 0xd4, 0x2b, 0xba, 0xa8, 0x26, 0x6f, 0xea, 0xaa, + 0x0b, 0xb2, 0x45, 0x30, 0x99, 0x84, 0x2c, 0x2f, 0x2d, 0x74, 0x79, 0x2d, 0x15, 0xe0, 0x48, 0x38, 0xf8, 0xa3, 0x34, + 0x0e, 0x57, 0x19, 0x6b, 0x06, 0x17, 0x01, 0xc7, 0x73, 0x0a, 0xe0, 0xe0, 0xef, 0xf2, 0x58, 0x3b, 0x40, 0x6e, 0xc3, + 0x36, 0x71, 0xfa, 0xe0, 0x71, 0xd8, 0x6a, 0x97, 0x87, 0x0e, 0x59, 0x72, 0xd0, 0x66, 0xc3, 0x44, 0x4c, 0xb8, 0x96, + 0x08, 0x7b, 0x6b, 0xb6, 0xcb, 0xd3, 0xa4, 0xd7, 0x55, 0x99, 0x94, 0x97, 0x27, 0xf3, 0xe7, 0x9c, 0xb1, 0x17, 0xcd, + 0x67, 0xec, 0x85, 0x38, 0x63, 0xdb, 0x77, 0xe6, 0xe3, 0xa9, 0x0b, 0xff, 0xf5, 0x8b, 0x09, 0xf5, 0x1c, 0xad, 0xbd, + 0xbc, 0xd3, 0xdc, 0xe5, 0x9d, 0x66, 0x79, 0xcb, 0x3b, 0x0d, 0x9b, 0x46, 0x7d, 0x10, 0xd3, 0xf6, 0x0c, 0xd3, 0xd1, + 0x20, 0x11, 0xfe, 0x38, 0xa5, 0x2c, 0xf7, 0x10, 0xf2, 0xa0, 0x56, 0xa7, 0x9e, 0xe7, 0x6d, 0x3f, 0xea, 0x74, 0x96, + 0x04, 0xd2, 0x36, 0xec, 0xcc, 0x1f, 0x8d, 0xd8, 0xa4, 0x37, 0x8d, 0xc7, 0xab, 0xf4, 0x5f, 0x7c, 0xfc, 0x1c, 0x88, + 0x5b, 0x11, 0x41, 0xa5, 0x1d, 0x51, 0x15, 0x04, 0x25, 0x37, 0x4c, 0xb4, 0xb0, 0x96, 0xeb, 0xd4, 0x23, 0xf7, 0xc8, + 0x9e, 0x7d, 0xd8, 0xb0, 0xc9, 0x9b, 0x01, 0xfd, 0xa7, 0xad, 0xd2, 0x66, 0x14, 0xf3, 0x05, 0x60, 0xd9, 0x0a, 0x8e, + 0x87, 0x43, 0x83, 0xaf, 0xa6, 0xd3, 0x6d, 0x1e, 0xee, 0xa5, 0xe8, 0xe9, 0x4a, 0x5c, 0x2a, 0xfc, 0xde, 0xe2, 0x86, + 0x29, 0xdb, 0x5b, 0xdd, 0xb4, 0x47, 0x6a, 0xad, 0x6e, 0xb9, 0x10, 0x8a, 0xb2, 0x7b, 0x62, 0xf9, 0xc7, 0x2f, 0x0e, + 0xe1, 0x3f, 0xa2, 0xea, 0x7f, 0xcd, 0x9a, 0x08, 0xf5, 0xb7, 0x65, 0x4d, 0x70, 0x22, 0x95, 0x90, 0x10, 0xdf, 0xbf, + 0xfc, 0x74, 0xfa, 0xb0, 0x0a, 0x7b, 0x97, 0x26, 0x55, 0xaa, 0x6a, 0xe9, 0xef, 0xe3, 0x18, 0x42, 0x77, 0xd6, 0x8b, + 0x0b, 0xf0, 0x90, 0xb2, 0x7b, 0x36, 0x80, 0x4a, 0xe2, 0x1d, 0x41, 0x52, 0x7c, 0x1d, 0xeb, 0xd0, 0x53, 0xe2, 0xf5, + 0xa6, 0xa7, 0xc4, 0xab, 0xdd, 0x4f, 0x89, 0x1f, 0xf6, 0x7a, 0x4a, 0xbc, 0xfa, 0xea, 0x4f, 0x89, 0xd7, 0xf5, 0xa7, + 0xc4, 0x45, 0x2c, 0xf4, 0x67, 0xcd, 0xb7, 0x2b, 0xfe, 0xf3, 0x23, 0x09, 0xe5, 0xce, 0xe3, 0x41, 0xc7, 0x21, 0x97, + 0xc7, 0x17, 0x7f, 0xf8, 0x61, 0x81, 0x1b, 0xf1, 0x3d, 0xaa, 0x93, 0x15, 0x4f, 0x0b, 0x8e, 0xd9, 0xb1, 0x1f, 0x25, + 0x39, 0x8c, 0xa3, 0xd9, 0xcf, 0x20, 0x94, 0x05, 0x76, 0x60, 0xa2, 0x64, 0x04, 0xe9, 0xcf, 0xf1, 0x72, 0xb5, 0x7c, + 0x0b, 0x6d, 0x7d, 0x0c, 0xd2, 0x60, 0x14, 0x32, 0x69, 0x89, 0x4c, 0xea, 0x6f, 0x9c, 0x27, 0x0e, 0x1a, 0xa7, 0xe2, + 0xa7, 0x7f, 0x27, 0x7e, 0xa2, 0x4e, 0x2a, 0xff, 0x4d, 0x7a, 0x75, 0x7a, 0xf3, 0x43, 0x44, 0x08, 0x01, 0x95, 0x41, + 0x3f, 0xfc, 0x31, 0x72, 0x11, 0x1b, 0x0d, 0xb3, 0x14, 0xfa, 0x0e, 0x1b, 0xdb, 0x61, 0xb5, 0x47, 0xcd, 0xca, 0x30, + 0xa5, 0x0b, 0xae, 0x3a, 0x1b, 0x7e, 0x11, 0xaf, 0x52, 0x36, 0x89, 0x6f, 0x23, 0xdd, 0x8c, 0xa4, 0x91, 0x01, 0x48, + 0x38, 0x65, 0x1d, 0x0c, 0x1e, 0xf9, 0x01, 0x09, 0xe5, 0x38, 0x69, 0xe9, 0x10, 0xbb, 0x74, 0xb5, 0xb4, 0x48, 0xd4, + 0x6c, 0xe1, 0x14, 0x75, 0x19, 0xe5, 0xe8, 0x51, 0xab, 0x15, 0x0f, 0x1e, 0x56, 0x53, 0xa8, 0x6a, 0xc4, 0x36, 0xe7, + 0x0a, 0xa7, 0xad, 0x48, 0x30, 0x17, 0x85, 0x1f, 0x8c, 0x86, 0x85, 0xe3, 0x39, 0x64, 0xba, 0x5a, 0xe4, 0x82, 0x17, + 0x91, 0x7c, 0xc5, 0xd7, 0x83, 0x7b, 0x85, 0xa0, 0xcf, 0x97, 0x0a, 0x18, 0xdf, 0xdd, 0xb0, 0x24, 0xf4, 0xef, 0x5b, + 0x46, 0x1e, 0x47, 0x3f, 0x02, 0x00, 0x5e, 0xc5, 0xb7, 0x91, 0x5a, 0x00, 0x83, 0xb5, 0x34, 0xec, 0xa5, 0x46, 0xff, + 0x25, 0x60, 0xb8, 0xa2, 0x8c, 0x00, 0xc2, 0xe4, 0xce, 0xd8, 0xdf, 0x4d, 0xfa, 0xf7, 0x1f, 0x46, 0x6e, 0x9e, 0xc7, + 0xb2, 0xa3, 0x5f, 0x96, 0x7b, 0x74, 0xf3, 0xf4, 0xe9, 0xa3, 0xcd, 0xd3, 0x2e, 0x87, 0x67, 0x6f, 0xa8, 0x6d, 0x6c, + 0x3c, 0x05, 0x30, 0x8a, 0x8b, 0x78, 0x35, 0x9e, 0xa3, 0xa2, 0xeb, 0xd7, 0x9b, 0x6f, 0x06, 0x6d, 0x62, 0x94, 0x52, + 0x39, 0xf5, 0x4a, 0x52, 0x01, 0x05, 0xec, 0xff, 0x35, 0x38, 0xe0, 0xfc, 0x1f, 0x82, 0xa1, 0xbe, 0x6b, 0xf8, 0x2b, + 0x3e, 0x78, 0xd8, 0xe6, 0xed, 0x43, 0x30, 0x4d, 0xee, 0xda, 0x42, 0x08, 0xd7, 0x9a, 0x91, 0x4c, 0x5e, 0x05, 0x9a, + 0xea, 0x46, 0x6e, 0x93, 0x87, 0x3c, 0xd1, 0x0b, 0xb3, 0xe9, 0x99, 0xce, 0x0d, 0x0d, 0x4c, 0xc6, 0xb1, 0x55, 0x05, + 0xc9, 0x70, 0x95, 0x07, 0x86, 0xe8, 0xab, 0x9a, 0xb7, 0x08, 0x22, 0x13, 0xbd, 0xc0, 0xd7, 0x73, 0xfc, 0x3b, 0xf0, + 0x83, 0x0c, 0xc8, 0xad, 0x9a, 0x05, 0x89, 0xa6, 0x6a, 0x37, 0x07, 0xa1, 0x9e, 0xf4, 0x46, 0x48, 0x08, 0x29, 0xde, + 0xf0, 0x1b, 0x4d, 0xd3, 0x34, 0xf9, 0x8c, 0xd0, 0xe4, 0x3b, 0x02, 0xd3, 0xf1, 0x39, 0x00, 0xd2, 0x92, 0x7c, 0x79, + 0x47, 0x29, 0xf0, 0x32, 0x40, 0x99, 0xac, 0x48, 0xe0, 0xae, 0xfe, 0x3a, 0x8e, 0x48, 0x10, 0x0f, 0x7a, 0x70, 0xd3, + 0xe6, 0x27, 0xe0, 0x11, 0xb8, 0xa7, 0xe1, 0x83, 0x1d, 0x73, 0x39, 0x27, 0x58, 0x73, 0xe8, 0x73, 0xd8, 0x67, 0xcd, + 0x3e, 0xe1, 0x22, 0x05, 0x0b, 0x82, 0xd4, 0xa1, 0xe2, 0xe2, 0xd9, 0x64, 0x0d, 0xb8, 0x11, 0xdf, 0x45, 0x77, 0xd9, + 0x82, 0x45, 0x2b, 0x1d, 0x63, 0x42, 0xa1, 0x8f, 0x3e, 0x28, 0xf3, 0x8a, 0x88, 0x2d, 0xc0, 0x36, 0xcd, 0x35, 0xe7, + 0x74, 0x17, 0xa6, 0x1c, 0xa5, 0xfa, 0xe6, 0x98, 0x0b, 0x36, 0x53, 0x8e, 0xdb, 0xaa, 0x37, 0x04, 0x5f, 0xd2, 0xb8, + 0x6a, 0xc8, 0x45, 0x9a, 0xd0, 0xd0, 0x06, 0x79, 0xc7, 0xe0, 0xec, 0x22, 0x01, 0xf6, 0x96, 0x5f, 0x5d, 0x34, 0x29, + 0x91, 0xf1, 0x2b, 0x8c, 0xa2, 0xc4, 0xa8, 0x37, 0xc3, 0xc7, 0x09, 0x8e, 0x89, 0x36, 0xb6, 0x33, 0xae, 0xb5, 0xb3, + 0x61, 0xd2, 0x9f, 0xd8, 0x3d, 0x5d, 0x24, 0x04, 0xaa, 0x4f, 0xec, 0x1e, 0x74, 0xff, 0x5e, 0x03, 0x37, 0x45, 0xdf, + 0x82, 0xae, 0x4d, 0x70, 0xf5, 0x3f, 0x06, 0x67, 0x55, 0x5b, 0x0e, 0x90, 0x93, 0x6f, 0xc1, 0xe2, 0x08, 0x62, 0x88, + 0xea, 0x2c, 0x0e, 0x31, 0x57, 0xf1, 0x6f, 0x35, 0xc2, 0xd8, 0x6a, 0x38, 0x1a, 0xc6, 0x33, 0xd7, 0x71, 0x0e, 0x6a, + 0xe5, 0x81, 0x91, 0xdd, 0x54, 0xda, 0x30, 0xb3, 0x81, 0xeb, 0x58, 0xc1, 0x33, 0xdb, 0xeb, 0xd7, 0xee, 0x68, 0xc5, + 0x97, 0xe4, 0x10, 0xd9, 0x5f, 0xa7, 0x4f, 0xd6, 0xad, 0xda, 0x81, 0x34, 0xaa, 0x2a, 0xf3, 0x38, 0xb6, 0x9c, 0xf3, + 0xbf, 0x86, 0xf5, 0xab, 0x9f, 0x3c, 0x59, 0x52, 0x5c, 0x93, 0x21, 0x78, 0x43, 0x6e, 0xc1, 0x31, 0xfa, 0x8b, 0xf6, + 0x5c, 0x6b, 0xd1, 0xf1, 0x31, 0x8c, 0xa1, 0x0c, 0x97, 0x2d, 0x6c, 0xca, 0xd4, 0x06, 0x2a, 0x3d, 0xa6, 0x55, 0x0c, + 0xc7, 0xfd, 0xae, 0xb2, 0x42, 0xa2, 0xb7, 0x95, 0x5a, 0xc0, 0xf6, 0x37, 0x5c, 0x9f, 0xf6, 0x08, 0xfc, 0x12, 0x40, + 0x09, 0xf0, 0x9d, 0xbe, 0xb3, 0xc1, 0xd5, 0xb2, 0xdc, 0x5c, 0xf9, 0x92, 0xdc, 0xbf, 0x31, 0xbc, 0x74, 0x50, 0x86, + 0x26, 0xdb, 0x6b, 0xbe, 0xee, 0x1e, 0xd8, 0x24, 0x8b, 0x26, 0xe5, 0x06, 0x2b, 0xf7, 0xd7, 0xfe, 0xcd, 0x95, 0x30, + 0x0a, 0x04, 0x15, 0x88, 0x1b, 0x30, 0x4a, 0x1e, 0x47, 0xb8, 0xf9, 0xe9, 0xb8, 0x05, 0x7b, 0x51, 0x31, 0x58, 0x81, + 0x3c, 0x82, 0xc9, 0x6a, 0x0a, 0x53, 0x1c, 0x3c, 0x57, 0xa3, 0x59, 0x70, 0x4b, 0x10, 0xa2, 0x1b, 0x77, 0x62, 0x26, + 0x74, 0x0a, 0x8b, 0x3a, 0x01, 0xf7, 0x45, 0xb9, 0x2f, 0xd7, 0x3a, 0xd8, 0xcd, 0xb5, 0xce, 0x76, 0x71, 0xad, 0xc9, + 0x9c, 0xea, 0x36, 0xf1, 0x97, 0x8a, 0x45, 0x9e, 0x20, 0xce, 0x55, 0xc3, 0xbc, 0x12, 0xab, 0x1b, 0xad, 0xaf, 0x44, + 0xad, 0x5a, 0x6b, 0xa4, 0x25, 0x88, 0xec, 0x6f, 0xe5, 0x81, 0x22, 0x04, 0xea, 0x2a, 0x6f, 0xfc, 0xa2, 0xe0, 0x8d, + 0xd3, 0xab, 0xa6, 0x30, 0xa4, 0x11, 0xd4, 0xbf, 0x62, 0xa4, 0x26, 0x5f, 0x07, 0x85, 0xb1, 0x5a, 0x31, 0x52, 0xc5, + 0xfc, 0xaa, 0x78, 0x68, 0x28, 0x46, 0x7d, 0xe2, 0x95, 0x51, 0xb6, 0xed, 0x2b, 0x17, 0x2d, 0xac, 0xaf, 0x8a, 0x74, + 0xe0, 0xba, 0xe3, 0x90, 0x65, 0xb2, 0xba, 0x6d, 0xca, 0xe6, 0x37, 0x6a, 0xb6, 0xb2, 0x49, 0xa4, 0x9d, 0x0c, 0x01, + 0x58, 0xb0, 0xe9, 0x2b, 0x72, 0x6d, 0xa9, 0x03, 0x81, 0x83, 0x6c, 0x30, 0xeb, 0xdb, 0xcd, 0x9d, 0xa7, 0x78, 0x09, + 0x85, 0x14, 0x5e, 0xe5, 0x41, 0x20, 0x7c, 0xaf, 0xd6, 0x0d, 0xb7, 0x3c, 0x5e, 0xf2, 0xfc, 0x7e, 0x07, 0xf6, 0xa2, + 0xe6, 0xa8, 0x82, 0x7c, 0x3c, 0x99, 0x16, 0xa9, 0xe7, 0x62, 0xd1, 0x7a, 0xa3, 0xc4, 0xc4, 0x59, 0x73, 0xcb, 0x98, + 0x32, 0x8f, 0x9e, 0x97, 0xe8, 0x89, 0x7e, 0xf9, 0xd6, 0x49, 0x56, 0x11, 0xfa, 0xb6, 0xb7, 0xb2, 0xc4, 0x1f, 0x7f, + 0x52, 0x86, 0x2c, 0xf8, 0x9c, 0xc0, 0x03, 0x2e, 0x4b, 0x0a, 0xfa, 0x3e, 0xba, 0x82, 0x64, 0x3d, 0xdb, 0x4b, 0x15, + 0xee, 0x4b, 0xef, 0xb1, 0xd3, 0xf6, 0x5f, 0x4c, 0x0f, 0x2b, 0x4c, 0x51, 0xaf, 0x53, 0x66, 0x99, 0x6f, 0x18, 0x47, + 0x36, 0x5f, 0x2d, 0x46, 0x6b, 0x95, 0xb7, 0xaa, 0xb0, 0x5c, 0xeb, 0x6c, 0x56, 0xb5, 0xdb, 0xe9, 0x74, 0x5a, 0x66, + 0x34, 0x3a, 0xda, 0x21, 0x32, 0x0b, 0x1f, 0x3b, 0x8e, 0x53, 0x1d, 0xfb, 0x76, 0xb0, 0x5b, 0xc8, 0xb7, 0xed, 0x36, + 0x8e, 0x18, 0x61, 0xbb, 0x0b, 0x7e, 0x75, 0x70, 0xe4, 0x76, 0x71, 0xb2, 0x4b, 0x6a, 0x11, 0x7d, 0x52, 0x86, 0x08, + 0x32, 0xb6, 0x48, 0x7b, 0x63, 0x86, 0x32, 0x18, 0x5b, 0x39, 0xd0, 0xa8, 0x38, 0x60, 0xcd, 0x40, 0x55, 0xc4, 0x15, + 0xbb, 0xc2, 0xd1, 0x90, 0x1f, 0x5e, 0x63, 0xde, 0x8b, 0x4e, 0xf0, 0xa0, 0xac, 0xeb, 0x3c, 0x6d, 0x9c, 0x56, 0xc7, + 0xf9, 0x4b, 0xa9, 0x9c, 0x06, 0x17, 0xe0, 0x5a, 0x08, 0xb4, 0x89, 0x3f, 0x8b, 0x7f, 0x4b, 0xfe, 0xff, 0x8b, 0xe5, + 0x5d, 0x59, 0x7f, 0xa4, 0x0b, 0x1c, 0xed, 0xe2, 0xb4, 0xd0, 0xa8, 0x9b, 0xf6, 0x80, 0xd4, 0x32, 0x98, 0xaa, 0x02, + 0x74, 0x10, 0xd2, 0x97, 0x02, 0x80, 0x34, 0xb0, 0xdf, 0x91, 0x62, 0x86, 0x25, 0x2e, 0x58, 0x88, 0x45, 0xf8, 0x3a, + 0x98, 0x83, 0xf9, 0xbc, 0x8b, 0xf2, 0x83, 0xd2, 0x9e, 0x00, 0x69, 0x7c, 0x6d, 0x6e, 0x7b, 0xb1, 0xfb, 0xab, 0x72, + 0x2d, 0xd1, 0x30, 0x80, 0xcc, 0x85, 0x43, 0x88, 0x8a, 0x04, 0x5a, 0x65, 0x73, 0xd3, 0x28, 0x65, 0xae, 0x2a, 0x67, + 0x13, 0x03, 0xc3, 0xe6, 0x9a, 0x8b, 0x50, 0xdb, 0x42, 0x5a, 0x00, 0x93, 0xe5, 0xdb, 0x0f, 0xbf, 0x2d, 0x58, 0x62, + 0x75, 0x3f, 0xba, 0xb8, 0xe4, 0xb8, 0x7f, 0x2d, 0xbc, 0x3b, 0x53, 0x3a, 0xff, 0xc8, 0x5f, 0xfc, 0xa1, 0x91, 0xa1, + 0x77, 0x51, 0xe2, 0xd0, 0x71, 0x6d, 0x71, 0xcf, 0xd8, 0xab, 0xf4, 0x22, 0x88, 0xf6, 0x2f, 0xeb, 0xdf, 0xed, 0x5d, + 0x16, 0x2e, 0x8c, 0xbd, 0x0b, 0xc3, 0x8d, 0x43, 0x9a, 0x0b, 0xd9, 0xe0, 0x07, 0x85, 0xa1, 0xa8, 0x5a, 0x1d, 0xeb, + 0x58, 0x8b, 0xa8, 0xfc, 0x8b, 0xd5, 0x60, 0x78, 0x72, 0x76, 0xb7, 0x08, 0xb5, 0x1b, 0x96, 0x40, 0x68, 0x9f, 0x81, + 0xee, 0xda, 0x8e, 0xae, 0xa1, 0x0d, 0x6d, 0x10, 0xcd, 0x06, 0xfa, 0x2f, 0x17, 0x6f, 0xac, 0xae, 0x7e, 0x06, 0x22, + 0xda, 0x9b, 0x19, 0x5e, 0x7b, 0xe7, 0xfe, 0x3d, 0x4b, 0xae, 0x3d, 0x5d, 0xc3, 0x08, 0x3e, 0x74, 0xe1, 0x61, 0x9a, + 0xe6, 0xe9, 0x7b, 0x04, 0x8a, 0xd0, 0x44, 0xac, 0x37, 0x1d, 0x50, 0x8e, 0xeb, 0x75, 0x35, 0xd7, 0x3b, 0xb4, 0x8f, + 0xba, 0xfa, 0xe9, 0x37, 0x9a, 0x76, 0x32, 0x61, 0xd3, 0xf4, 0x14, 0x9f, 0x68, 0x27, 0x78, 0x47, 0xd0, 0x6f, 0x4d, + 0xb3, 0xc7, 0x61, 0x6a, 0xb9, 0xda, 0x9a, 0x7f, 0x6a, 0xda, 0x34, 0x08, 0xc3, 0x9e, 0xf6, 0x78, 0xea, 0x4d, 0x0f, + 0xa7, 0x2f, 0xfa, 0x3c, 0x39, 0xff, 0xa6, 0x54, 0xdc, 0xa4, 0x7f, 0x3d, 0xa5, 0x5a, 0x9a, 0x25, 0xf1, 0x27, 0xc6, + 0xd5, 0x4e, 0x34, 0xf9, 0x78, 0xac, 0x56, 0xf5, 0xea, 0x3d, 0xb9, 0xdd, 0xd1, 0x78, 0xea, 0x15, 0xc5, 0x71, 0x8c, + 0x07, 0x72, 0x90, 0x27, 0x07, 0x62, 0xe8, 0x27, 0x2a, 0x98, 0x5c, 0xab, 0x09, 0x50, 0xae, 0xce, 0xe7, 0x38, 0x13, + 0xf3, 0x3b, 0x01, 0x3f, 0x8c, 0xd2, 0x5c, 0x17, 0x46, 0xa0, 0x6b, 0x93, 0x81, 0xfe, 0xa3, 0xeb, 0x75, 0x4d, 0xd7, + 0x3d, 0xb2, 0x8f, 0xba, 0x63, 0xc7, 0x3c, 0xb4, 0x0f, 0xad, 0xb6, 0x7d, 0x64, 0x76, 0xad, 0xae, 0xd9, 0xfd, 0x5b, + 0x77, 0x6c, 0x1d, 0xda, 0x87, 0xa6, 0x63, 0x75, 0x21, 0xd1, 0xea, 0x5a, 0xdd, 0x1b, 0xeb, 0xb0, 0x3b, 0x76, 0x30, + 0xd5, 0xb3, 0x3b, 0x1d, 0xcb, 0x75, 0xec, 0x4e, 0xc7, 0xec, 0xd8, 0x47, 0x47, 0x96, 0xdb, 0xb6, 0x8f, 0x8e, 0xce, + 0x3b, 0x5d, 0xbb, 0x0d, 0x79, 0xed, 0xf6, 0xb8, 0x6d, 0xbb, 0xae, 0x05, 0x7f, 0x99, 0x5d, 0xdb, 0xa3, 0x1f, 0xae, + 0x6b, 0xb7, 0x5d, 0xd3, 0x09, 0x3b, 0x9e, 0x7d, 0xf4, 0xc2, 0xc4, 0xbf, 0xb1, 0x98, 0x89, 0x7f, 0x41, 0x33, 0xe6, + 0x0b, 0xdb, 0x3b, 0xa2, 0x5f, 0xd8, 0xe0, 0xcd, 0x61, 0xf7, 0x57, 0xfd, 0x60, 0xe3, 0x1c, 0x5c, 0x9a, 0x43, 0xb7, + 0x63, 0xb7, 0xdb, 0xe6, 0xa1, 0x6b, 0x77, 0xdb, 0x73, 0xeb, 0xd0, 0xb3, 0x8f, 0x8e, 0xc7, 0x96, 0x6b, 0x1f, 0x1f, + 0x9b, 0x8e, 0xd5, 0xb6, 0x3d, 0xd3, 0xb5, 0x0f, 0xdb, 0xf8, 0xa3, 0x6d, 0x7b, 0x37, 0xc7, 0x2f, 0xec, 0xa3, 0xce, + 0xfc, 0xc8, 0x3e, 0xfc, 0x78, 0xd8, 0xb5, 0xbd, 0xf6, 0xbc, 0x7d, 0x64, 0x7b, 0xc7, 0x37, 0x47, 0xf6, 0xe1, 0xdc, + 0xf2, 0x8e, 0xb6, 0xd6, 0x74, 0x3d, 0x1b, 0x60, 0x84, 0xd9, 0x90, 0x61, 0xf2, 0x0c, 0xf8, 0x33, 0xc7, 0xba, 0xff, + 0xc5, 0x66, 0xd2, 0x7a, 0xd5, 0x17, 0x76, 0xf7, 0x78, 0x4c, 0xc5, 0x21, 0xc1, 0x12, 0x25, 0xa0, 0xca, 0x8d, 0x45, + 0xdd, 0x62, 0x73, 0x96, 0x68, 0x48, 0xfc, 0xe1, 0x9d, 0xdd, 0x58, 0xd0, 0x31, 0xf5, 0xfb, 0x3f, 0x6d, 0x47, 0x2e, + 0x39, 0x44, 0xae, 0xfc, 0x86, 0xff, 0x43, 0x41, 0x5f, 0x86, 0xe6, 0xf9, 0x26, 0x41, 0xc5, 0xfb, 0xdd, 0x82, 0x8a, + 0x37, 0xab, 0x7d, 0x04, 0x15, 0xef, 0xbf, 0xba, 0xa0, 0xe2, 0xbc, 0xaa, 0x27, 0xff, 0xbe, 0xea, 0x9b, 0xfe, 0xd7, + 0x75, 0xf5, 0x19, 0x12, 0xf8, 0xad, 0xcb, 0x8b, 0xd5, 0x15, 0x78, 0x57, 0x7a, 0x1f, 0x0f, 0xde, 0xac, 0x4a, 0x4a, + 0x60, 0x31, 0xe0, 0xd8, 0xf7, 0x31, 0xe1, 0xd8, 0xdf, 0x57, 0x03, 0xd0, 0x3c, 0xe1, 0x74, 0x49, 0x30, 0xb1, 0xe6, + 0x7e, 0x38, 0x95, 0x34, 0x0d, 0xa4, 0xf4, 0x31, 0x19, 0xac, 0x12, 0xe0, 0xba, 0x06, 0x71, 0xd8, 0x6a, 0x11, 0xa5, + 0xbd, 0x23, 0x07, 0x2e, 0x52, 0x6f, 0x9a, 0xe4, 0x95, 0xca, 0xb6, 0xf0, 0x47, 0x75, 0xcd, 0xad, 0x26, 0x36, 0xe6, + 0xa3, 0x52, 0x60, 0x73, 0xeb, 0x6e, 0xbd, 0x5d, 0x0d, 0xb4, 0x6d, 0x84, 0xd2, 0x24, 0x90, 0x73, 0x4d, 0xf9, 0x65, + 0xd5, 0xbc, 0x8a, 0x32, 0xe6, 0xe6, 0x91, 0xc2, 0x48, 0xaa, 0xf5, 0xdd, 0xb2, 0x6a, 0xdf, 0xae, 0x69, 0x36, 0x74, + 0x5f, 0xaa, 0xbe, 0x45, 0xaf, 0x50, 0x36, 0x5c, 0x05, 0x55, 0x25, 0xb2, 0x5a, 0x23, 0x40, 0x0a, 0xea, 0xbe, 0x50, + 0x3e, 0x2c, 0x48, 0x4b, 0x47, 0x43, 0x7a, 0xc7, 0x51, 0xf2, 0x4a, 0x6d, 0xaa, 0x0a, 0x8b, 0xcf, 0xd6, 0x48, 0x71, + 0x07, 0xbf, 0x03, 0xe9, 0xc8, 0x29, 0x9e, 0x51, 0xac, 0xc2, 0x79, 0xad, 0xb4, 0x4b, 0x8f, 0x99, 0x7c, 0xee, 0xae, + 0xeb, 0xc4, 0xe3, 0x46, 0x55, 0x65, 0x97, 0x2d, 0x04, 0x15, 0x84, 0xdd, 0x93, 0x62, 0x70, 0x4e, 0xca, 0xdb, 0xa8, + 0xfb, 0xbc, 0xad, 0x31, 0x51, 0xee, 0x31, 0x6c, 0x62, 0x93, 0x7f, 0xa8, 0x7e, 0x01, 0xd6, 0x53, 0x88, 0x82, 0xdd, + 0x43, 0x32, 0x4d, 0xa1, 0x51, 0x3d, 0xd4, 0x62, 0xee, 0x6f, 0x51, 0xb0, 0x51, 0x1b, 0xe6, 0x8d, 0xa0, 0x36, 0xf4, + 0x36, 0x9d, 0x1c, 0x69, 0x3c, 0xb2, 0x2e, 0x89, 0xa8, 0xdd, 0xce, 0xb1, 0xe9, 0x1e, 0x99, 0xf6, 0x71, 0xc7, 0xc8, + 0xc5, 0x81, 0x53, 0x9b, 0x2c, 0x01, 0x04, 0x94, 0xa2, 0xe5, 0x30, 0x83, 0x28, 0xc8, 0x02, 0x3f, 0xcc, 0x81, 0x3e, + 0x2e, 0xbf, 0x2a, 0xfe, 0xb9, 0x4a, 0x33, 0x98, 0xa3, 0x20, 0x7a, 0x51, 0x21, 0xdc, 0x1a, 0xb1, 0xec, 0x96, 0xb1, + 0x68, 0x83, 0xb0, 0xbc, 0xaa, 0x5f, 0xfe, 0xe7, 0x69, 0xdb, 0xe6, 0xa4, 0xc9, 0x32, 0xca, 0x22, 0xbe, 0x3f, 0x84, + 0x32, 0x74, 0x3e, 0x34, 0x7f, 0xda, 0x84, 0x70, 0xff, 0xb9, 0x1b, 0xe1, 0x66, 0x6c, 0x1f, 0x84, 0xfb, 0xcf, 0xaf, + 0x8e, 0x70, 0x7f, 0x52, 0x11, 0x6e, 0xc9, 0x16, 0xa8, 0xe0, 0x3a, 0x7f, 0xc0, 0xef, 0x16, 0x38, 0x75, 0x7e, 0xae, + 0x1f, 0x10, 0x01, 0xaf, 0x2b, 0xc1, 0x76, 0x3f, 0x96, 0xa2, 0x07, 0x21, 0x53, 0x04, 0x9d, 0xd0, 0x52, 0xa4, 0x12, + 0x08, 0x44, 0x2b, 0x43, 0xaa, 0x43, 0x9b, 0x6f, 0xa3, 0x2c, 0xb4, 0xdf, 0xf3, 0x87, 0x1f, 0x08, 0x79, 0xde, 0xc4, + 0xc9, 0xc2, 0x47, 0x07, 0x7c, 0x3a, 0x46, 0x1d, 0x84, 0x0f, 0x07, 0xec, 0xcf, 0xc6, 0x71, 0x34, 0x91, 0x92, 0x0a, + 0x36, 0xb8, 0x24, 0x8a, 0x5b, 0xbf, 0x67, 0x7e, 0xa2, 0x9b, 0x94, 0x0d, 0x8b, 0xfb, 0xac, 0xed, 0x3c, 0xf3, 0x0e, + 0x9f, 0x1d, 0x39, 0xf0, 0xbf, 0xcb, 0xda, 0xb9, 0xc9, 0x0b, 0x2e, 0xe2, 0x08, 0x02, 0x9f, 0x88, 0x92, 0x9b, 0x8a, + 0xdd, 0x32, 0xf6, 0xa9, 0x28, 0x75, 0xdc, 0x5c, 0x68, 0xe2, 0xdf, 0x17, 0x65, 0x1a, 0x4b, 0xcc, 0xe3, 0x95, 0x32, + 0xac, 0x86, 0xd1, 0x04, 0xd1, 0x0a, 0x78, 0x6f, 0x4a, 0x09, 0x35, 0x9b, 0x4f, 0xb7, 0x98, 0x17, 0x6b, 0xe7, 0x57, + 0x45, 0x74, 0x25, 0x11, 0xe5, 0x65, 0x27, 0x04, 0xb9, 0xd8, 0xc2, 0x41, 0xdf, 0xec, 0x18, 0x5f, 0x48, 0x83, 0xd8, + 0x86, 0x62, 0x81, 0x7c, 0x5a, 0xa0, 0x2c, 0x59, 0x45, 0xe3, 0x16, 0xfe, 0xf4, 0x47, 0x69, 0x2b, 0x38, 0x00, 0xef, + 0xac, 0xd8, 0xb1, 0x81, 0xab, 0xe6, 0x9f, 0x3a, 0x45, 0x28, 0x8a, 0x54, 0xac, 0x8a, 0xff, 0x2c, 0x33, 0x13, 0x0a, + 0x60, 0x8b, 0x4b, 0x6b, 0x0d, 0xfc, 0x67, 0xb2, 0xe2, 0xb3, 0xcc, 0x84, 0x20, 0xb2, 0xb0, 0xdc, 0x4f, 0x9f, 0x52, + 0x29, 0x08, 0xeb, 0x48, 0xd3, 0x3a, 0x1b, 0x17, 0xee, 0xdd, 0x34, 0x7f, 0x16, 0x93, 0x87, 0xb7, 0xde, 0xd8, 0x8c, + 0x9f, 0x3f, 0x3f, 0x1d, 0xb8, 0x06, 0x0f, 0x4a, 0x5a, 0x8a, 0xa0, 0x75, 0xbe, 0x9f, 0xf2, 0x81, 0xd1, 0x68, 0x16, + 0xb7, 0x84, 0x37, 0x93, 0x23, 0x54, 0x94, 0x39, 0xf6, 0x82, 0x88, 0x16, 0x24, 0x64, 0xf4, 0x85, 0x12, 0x80, 0x28, + 0x23, 0x5f, 0x5d, 0x6d, 0xdb, 0xb1, 0x1d, 0x5d, 0x56, 0x9c, 0x06, 0xb3, 0xc1, 0x3a, 0xce, 0x7c, 0x88, 0x0d, 0x14, + 0xc6, 0x33, 0xb0, 0xad, 0xc9, 0x82, 0x2c, 0x84, 0x40, 0x33, 0x60, 0x64, 0xb3, 0xa0, 0x77, 0x79, 0xce, 0x35, 0x9e, + 0xfd, 0xe4, 0x13, 0x06, 0x1b, 0x14, 0x66, 0x75, 0xe8, 0x71, 0xe8, 0x47, 0xb8, 0x0c, 0x5b, 0x7a, 0x0b, 0x42, 0x5d, + 0xb2, 0x24, 0xb5, 0x54, 0x0b, 0x82, 0x9e, 0x06, 0x75, 0x20, 0x0c, 0x3d, 0x36, 0x30, 0x4d, 0xfc, 0x05, 0xf8, 0x64, + 0x5f, 0xe7, 0x26, 0xc7, 0xb4, 0x3a, 0x47, 0xb5, 0x9a, 0xfb, 0xe2, 0xc8, 0xd4, 0x3c, 0xd7, 0xd4, 0x1c, 0x40, 0xb7, + 0x7a, 0x6e, 0xae, 0xf3, 0xab, 0xfe, 0x2e, 0x21, 0x28, 0xe1, 0x97, 0xc7, 0x34, 0x0f, 0x12, 0x7f, 0x72, 0xf6, 0x72, + 0x46, 0x0e, 0x24, 0x5b, 0x8a, 0xb7, 0xf4, 0x80, 0x04, 0x21, 0x17, 0xec, 0x2e, 0x33, 0x30, 0x10, 0x0b, 0x2f, 0x12, + 0x18, 0x6b, 0x34, 0xfe, 0x0b, 0x22, 0x2d, 0xf8, 0xfc, 0xb9, 0x15, 0x80, 0x81, 0xc3, 0x40, 0x81, 0x0f, 0x7c, 0x1b, + 0x25, 0x80, 0x05, 0x85, 0xe8, 0x0e, 0x81, 0x05, 0xd6, 0x47, 0xf0, 0x6f, 0x91, 0x2c, 0x7e, 0x70, 0xd1, 0xa9, 0x1d, + 0xfa, 0xd1, 0x0c, 0x50, 0x9a, 0x1f, 0xcd, 0x6a, 0x2a, 0x1a, 0x64, 0xbf, 0x58, 0x49, 0x2d, 0x9a, 0x2a, 0xd4, 0x27, + 0xd2, 0xef, 0xef, 0x2f, 0x28, 0xd0, 0x14, 0x04, 0x35, 0xf7, 0x27, 0x68, 0x6c, 0x57, 0x48, 0x77, 0x9e, 0x0f, 0xbe, + 0x3d, 0x59, 0xb0, 0xcc, 0x27, 0xd6, 0x30, 0x3c, 0x7e, 0x81, 0x1c, 0xd0, 0xc6, 0x22, 0x48, 0x2c, 0x05, 0x93, 0x9f, + 0xb0, 0x9b, 0x60, 0xcc, 0xdf, 0xa5, 0xa6, 0xc6, 0xef, 0x29, 0x0b, 0xb5, 0xc0, 0x06, 0xae, 0x49, 0x4a, 0xc8, 0x63, + 0x1f, 0xdd, 0x4c, 0x0e, 0xa2, 0x58, 0x3f, 0xfd, 0x56, 0xda, 0x6b, 0x6d, 0x5a, 0x04, 0x88, 0xf6, 0x78, 0x99, 0xb0, + 0xf0, 0x5f, 0x83, 0x6f, 0xe1, 0xe2, 0xfe, 0xf6, 0x4a, 0x37, 0xfa, 0x99, 0x3d, 0x4f, 0xd8, 0x74, 0xf0, 0x6d, 0x43, + 0xd4, 0x43, 0x7c, 0xde, 0xd3, 0x58, 0xf4, 0xb6, 0x57, 0x38, 0x07, 0x6a, 0xef, 0xf5, 0xa8, 0x3f, 0xe5, 0xaf, 0x75, + 0x78, 0x01, 0xae, 0x4b, 0x6f, 0x6c, 0xb7, 0x8f, 0xef, 0xe7, 0x51, 0xe8, 0x8f, 0x3f, 0xf5, 0x29, 0xa7, 0xf4, 0x61, + 0xc1, 0x6d, 0x3d, 0xf6, 0x97, 0x3d, 0xbc, 0x5e, 0xd5, 0x44, 0x30, 0xd7, 0xa4, 0x54, 0x49, 0xd9, 0x35, 0xee, 0x65, + 0xdc, 0xca, 0x6b, 0xec, 0x19, 0xbb, 0xba, 0x9d, 0x07, 0x19, 0x13, 0x5d, 0xe1, 0x47, 0x9e, 0x8b, 0x87, 0x3a, 0x3d, + 0x51, 0xf1, 0x61, 0x6d, 0xb7, 0x35, 0xb7, 0xfb, 0xb7, 0xce, 0x8d, 0xeb, 0xcc, 0x3d, 0xd7, 0xee, 0x7e, 0x74, 0xbb, + 0xf3, 0xb6, 0x7d, 0x1c, 0x5a, 0x6d, 0xfb, 0x18, 0xfe, 0x7c, 0x3c, 0xb6, 0xbb, 0x73, 0xcb, 0xb3, 0x0f, 0x3f, 0xba, + 0x5e, 0x68, 0x75, 0xed, 0x63, 0xf8, 0x73, 0x4e, 0xb5, 0xe0, 0x01, 0x44, 0xef, 0x9d, 0x6f, 0x4b, 0x58, 0x40, 0xf9, + 0x2d, 0xe5, 0x34, 0x66, 0xe9, 0x7a, 0x6b, 0x90, 0xf5, 0x00, 0xca, 0xd0, 0x4d, 0xe1, 0x04, 0x32, 0xea, 0xb7, 0x20, + 0x0c, 0x3b, 0x06, 0x10, 0x10, 0x2a, 0x2f, 0xc2, 0x2e, 0x55, 0xb8, 0xd2, 0x6f, 0x3c, 0x46, 0xbc, 0x4e, 0xb3, 0xc3, + 0x75, 0x11, 0x99, 0x8a, 0x84, 0x43, 0xbf, 0x2c, 0xd1, 0x89, 0x91, 0x70, 0x11, 0xaf, 0x60, 0xa5, 0x22, 0x3a, 0x62, + 0xbe, 0x7b, 0xe0, 0x68, 0x99, 0xcb, 0x64, 0x74, 0x9e, 0xaf, 0xda, 0x36, 0x17, 0x18, 0xc9, 0xd6, 0xff, 0x68, 0x3b, + 0x18, 0x94, 0x96, 0xda, 0x11, 0xde, 0x5c, 0x27, 0x41, 0x22, 0x87, 0xa7, 0xa0, 0x68, 0xb7, 0xd9, 0x53, 0xbd, 0x01, + 0x61, 0x4c, 0xde, 0x02, 0x95, 0x7c, 0xe3, 0x87, 0x8a, 0x72, 0x8b, 0x52, 0xf3, 0x91, 0xc4, 0xfc, 0x4f, 0x9f, 0x16, + 0x83, 0xb3, 0x2a, 0xe3, 0x3e, 0x71, 0x3b, 0x70, 0xed, 0x76, 0x58, 0x7b, 0xab, 0x9e, 0xd5, 0x6e, 0x77, 0xc0, 0x85, + 0xbb, 0x50, 0xa1, 0x4b, 0x21, 0xa4, 0xb8, 0x1b, 0x95, 0xbd, 0x6a, 0x32, 0x5c, 0x70, 0xa4, 0x5c, 0x79, 0xea, 0xe8, + 0x46, 0x3f, 0x12, 0x22, 0xc9, 0x68, 0x8b, 0x0b, 0x64, 0xfe, 0x16, 0xd3, 0x01, 0x34, 0x5b, 0xe6, 0xb1, 0xc3, 0x68, + 0xf4, 0x7f, 0x3d, 0x09, 0x34, 0xe0, 0x02, 0x19, 0x6a, 0xe5, 0xb4, 0x96, 0x0c, 0x7a, 0xe4, 0xbd, 0x4a, 0x17, 0x2a, + 0x4b, 0xcf, 0x74, 0x48, 0x82, 0xf8, 0x56, 0x18, 0xd2, 0x4e, 0x2a, 0x90, 0xc9, 0xdb, 0xa2, 0x48, 0x30, 0x03, 0xf0, + 0x01, 0xde, 0x12, 0xc6, 0x64, 0xc6, 0xd3, 0xa7, 0x1b, 0x2f, 0x21, 0x12, 0xd8, 0xab, 0x91, 0x3d, 0x75, 0x15, 0xbf, + 0xe9, 0x2a, 0x8a, 0x91, 0xed, 0x22, 0xd6, 0x10, 0x7a, 0x6f, 0xb4, 0xf7, 0xf0, 0xe7, 0x88, 0xf9, 0x99, 0xcd, 0x25, + 0x4d, 0x2d, 0xe5, 0x72, 0x37, 0x5d, 0xd6, 0x06, 0x8d, 0x37, 0xee, 0xeb, 0x8c, 0xfb, 0x12, 0x7c, 0xb2, 0xfe, 0xb8, + 0xe2, 0x96, 0xde, 0xd0, 0xc6, 0x67, 0xa7, 0x70, 0x4f, 0xf3, 0x2e, 0xf3, 0xc9, 0x87, 0x89, 0x7a, 0xe5, 0xc6, 0x99, + 0x2f, 0xe2, 0xc8, 0x00, 0x5d, 0xde, 0x6f, 0x14, 0xc9, 0x2a, 0xd6, 0xe0, 0xa7, 0xef, 0x2e, 0xbe, 0xd3, 0xf8, 0xfe, + 0x27, 0x09, 0x22, 0x3e, 0x64, 0x28, 0xea, 0xc1, 0x80, 0xa2, 0x1e, 0x68, 0x3c, 0x8c, 0x08, 0xc4, 0x0e, 0xc8, 0x0f, + 0x08, 0x82, 0xc8, 0x80, 0x26, 0xb9, 0xea, 0x62, 0x15, 0x66, 0xc1, 0xd2, 0x4f, 0xb2, 0x03, 0xa8, 0x6a, 0x01, 0x92, + 0xd3, 0x37, 0xd9, 0x88, 0x93, 0x68, 0x56, 0xb8, 0xd8, 0xcb, 0x22, 0x21, 0x9b, 0x9d, 0x06, 0xa1, 0x14, 0xcd, 0x8a, + 0x0e, 0xfc, 0xf1, 0x98, 0x2d, 0xb3, 0x81, 0xee, 0x2f, 0x21, 0xfa, 0x05, 0xfa, 0xb3, 0x3e, 0x88, 0xc7, 0x19, 0xcb, + 0xac, 0x34, 0x4b, 0x98, 0xbf, 0xd0, 0xa5, 0x2b, 0xd7, 0x7a, 0x7b, 0xe9, 0x6a, 0xb4, 0x08, 0x32, 0xe9, 0x0b, 0x91, + 0x26, 0x08, 0x42, 0x52, 0x18, 0xe2, 0xe9, 0x30, 0xe7, 0x20, 0x3c, 0x8f, 0x67, 0x95, 0x1d, 0x55, 0x50, 0x2e, 0x67, + 0xe8, 0x69, 0x97, 0x47, 0x3c, 0x98, 0xa0, 0xcd, 0xd3, 0x35, 0xb7, 0x6b, 0x97, 0x2e, 0x1b, 0xf5, 0xd3, 0x13, 0xfe, + 0xbc, 0xd5, 0xd0, 0x15, 0x83, 0xde, 0x71, 0xc0, 0x97, 0xf0, 0x26, 0x8b, 0xf7, 0x03, 0x5e, 0x18, 0xae, 0x26, 0x6a, + 0x19, 0xfd, 0xbc, 0xd3, 0x58, 0x2e, 0x80, 0x10, 0x2a, 0x09, 0xd1, 0xe7, 0xee, 0xa9, 0x34, 0xb1, 0xc2, 0x51, 0x21, + 0xad, 0xf4, 0xf9, 0xf3, 0xcb, 0xe1, 0x7f, 0xfe, 0x0d, 0xce, 0xe8, 0xe7, 0xae, 0xb0, 0x33, 0xbf, 0x54, 0x4b, 0x71, + 0xea, 0xd3, 0x1c, 0xa2, 0x02, 0x05, 0x9b, 0x08, 0xc7, 0x2b, 0x62, 0x6b, 0xe5, 0xc3, 0x2b, 0xe1, 0x4c, 0x0b, 0x02, + 0x4e, 0x18, 0xc2, 0x1a, 0x7e, 0x08, 0xcb, 0x3b, 0x14, 0x4e, 0x18, 0xb4, 0xdf, 0xee, 0xbe, 0x3f, 0x06, 0x67, 0xcb, + 0xb5, 0x38, 0x10, 0xca, 0x00, 0x71, 0x0f, 0x9d, 0x9e, 0xf8, 0x1a, 0x12, 0x2d, 0x48, 0x7e, 0xa4, 0xbd, 0x03, 0x98, + 0xe6, 0x3c, 0x5e, 0x30, 0x3b, 0x88, 0x0f, 0x6e, 0xd9, 0xc8, 0xf2, 0x97, 0x01, 0xc9, 0xea, 0x91, 0xef, 0xa6, 0x11, + 0xe5, 0x27, 0x45, 0xe0, 0x44, 0x5f, 0xe7, 0x05, 0x28, 0xe3, 0x02, 0x50, 0xf0, 0xd3, 0x3f, 0x2d, 0xfb, 0x67, 0xb4, + 0x45, 0x84, 0x80, 0x32, 0x96, 0x3f, 0x23, 0x37, 0x8b, 0xc2, 0xa3, 0x62, 0xf1, 0x61, 0xc5, 0xd3, 0xa9, 0xea, 0x53, + 0xd1, 0x2e, 0xf7, 0x2f, 0xa1, 0x52, 0xec, 0xd9, 0x78, 0x49, 0x3d, 0xd5, 0xbb, 0x90, 0x3f, 0x21, 0x3a, 0x32, 0x77, + 0xbf, 0x09, 0xe7, 0xb9, 0xe6, 0x9b, 0x51, 0x82, 0xe4, 0x31, 0x15, 0xe2, 0x88, 0xa2, 0xea, 0x09, 0x7c, 0x03, 0x69, + 0xf2, 0x68, 0x30, 0x20, 0x3c, 0x56, 0x45, 0x67, 0x00, 0xa5, 0x86, 0x68, 0x09, 0x30, 0xd9, 0x0c, 0x2a, 0x5a, 0x64, + 0x23, 0x87, 0x95, 0xaa, 0xd3, 0xa9, 0x8f, 0xf1, 0xc0, 0x17, 0xfb, 0xab, 0xb4, 0x03, 0x61, 0x67, 0xf1, 0x85, 0x05, + 0x04, 0x2e, 0xda, 0xa9, 0xe0, 0x71, 0xed, 0xaf, 0x84, 0xb2, 0xad, 0xd0, 0xbf, 0x8f, 0x15, 0xdd, 0x05, 0xee, 0xc6, + 0xe0, 0x1c, 0x53, 0x2f, 0x84, 0xf9, 0x60, 0xed, 0x24, 0x49, 0x8f, 0xf3, 0xf5, 0xd3, 0xa4, 0xba, 0x88, 0xdf, 0x75, + 0x98, 0xd4, 0xb2, 0xe5, 0xc9, 0x20, 0x76, 0xcc, 0x8b, 0x83, 0x56, 0xca, 0xc4, 0x73, 0x9f, 0x9f, 0x1c, 0xc0, 0xfc, + 0xc0, 0xf5, 0x42, 0x89, 0x32, 0x0a, 0x0c, 0xf0, 0xef, 0xe0, 0xa7, 0xa4, 0x7f, 0xf1, 0x76, 0x22, 0x88, 0x3a, 0x7c, + 0x39, 0x4a, 0xe7, 0xaf, 0xa5, 0x22, 0x75, 0x62, 0xc5, 0x69, 0xa6, 0xf2, 0x76, 0x47, 0x68, 0xf8, 0x7d, 0x85, 0xe1, + 0x19, 0xf2, 0x7e, 0xc6, 0x84, 0x65, 0xf3, 0x79, 0xb6, 0xc1, 0xf8, 0x79, 0x53, 0x11, 0x22, 0x58, 0xb7, 0x14, 0x28, + 0xf6, 0xf1, 0xb6, 0x52, 0x05, 0x69, 0x24, 0x8b, 0x2d, 0xfd, 0x96, 0xfe, 0x18, 0x77, 0x7c, 0xad, 0x34, 0xa6, 0x42, + 0xb9, 0xf3, 0x6c, 0x00, 0x45, 0x05, 0xb3, 0xdd, 0x5f, 0x2e, 0xa9, 0xb0, 0xd1, 0x3f, 0x39, 0xa0, 0x77, 0xe7, 0x29, + 0xed, 0xb0, 0xd3, 0x13, 0xd0, 0xdf, 0xa4, 0x45, 0xf7, 0x97, 0x4b, 0xbe, 0xa4, 0xf4, 0x8b, 0x72, 0x0e, 0xe6, 0xd9, + 0x22, 0x3c, 0xfd, 0x3f, 0x1d, 0xdb, 0x6f, 0x83, 0x01, 0x5c, 0x03, 0x00}; } // namespace web_server } // namespace esphome From 3cd2fb08431f170d5c853cfaf87476ae0997e24a Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 09:57:36 +1200 Subject: [PATCH 006/233] [core] Update Entities (#6885) --- CODEOWNERS | 2 + esphome/components/api/api.proto | 44 +++ esphome/components/api/api_connection.cpp | 45 +++ esphome/components/api/api_connection.h | 6 + esphome/components/api/api_pb2.cpp | 256 ++++++++++++++++++ esphome/components/api/api_pb2.h | 55 ++++ esphome/components/api/api_pb2_service.cpp | 42 +++ esphome/components/api/api_pb2_service.h | 15 + esphome/components/api/api_server.cpp | 7 + esphome/components/api/api_server.h | 3 + esphome/components/api/list_entities.cpp | 3 + esphome/components/api/list_entities.h | 3 + esphome/components/api/subscribe_state.cpp | 3 + esphome/components/api/subscribe_state.h | 3 + .../http_request/ota/ota_http_request.cpp | 2 + .../http_request/ota/ota_http_request.h | 1 - .../http_request/update/__init__.py | 44 +++ .../update/http_request_update.cpp | 157 +++++++++++ .../http_request/update/http_request_update.h | 37 +++ esphome/components/mqtt/__init__.py | 1 + esphome/components/mqtt/mqtt_const.h | 2 + esphome/components/mqtt/mqtt_update.cpp | 62 +++++ esphome/components/mqtt/mqtt_update.h | 41 +++ esphome/components/update/__init__.py | 108 ++++++++ esphome/components/update/update_entity.cpp | 12 + esphome/components/update/update_entity.h | 51 ++++ .../components/web_server/list_entities.cpp | 9 + esphome/components/web_server/list_entities.h | 3 + esphome/components/web_server/web_server.cpp | 71 +++++ esphome/components/web_server/web_server.h | 12 +- esphome/const.py | 1 + esphome/core/application.h | 20 ++ esphome/core/component_iterator.cpp | 15 + esphome/core/component_iterator.h | 6 + esphome/core/controller.cpp | 6 + esphome/core/controller.h | 6 + esphome/core/defines.h | 1 + tests/components/http_request/common.yaml | 6 + tests/components/mqtt/common-update.yaml | 13 + tests/components/mqtt/test.esp32-c3-idf.yaml | 1 + tests/components/mqtt/test.esp32-c3.yaml | 4 + tests/components/mqtt/test.esp32-idf.yaml | 1 + tests/components/mqtt/test.esp32.yaml | 4 + tests/components/mqtt/test.esp8266.yaml | 4 + tests/components/update/common.yaml | 1 + tests/components/update/test.esp32-ard.yaml | 1 + tests/components/update/test.esp32-idf.yaml | 1 + tests/components/update/test.esp8266.yaml | 1 + tests/components/update/test.rp2040.yaml | 1 + 49 files changed, 1191 insertions(+), 2 deletions(-) create mode 100644 esphome/components/http_request/update/__init__.py create mode 100644 esphome/components/http_request/update/http_request_update.cpp create mode 100644 esphome/components/http_request/update/http_request_update.h create mode 100644 esphome/components/mqtt/mqtt_update.cpp create mode 100644 esphome/components/mqtt/mqtt_update.h create mode 100644 esphome/components/update/__init__.py create mode 100644 esphome/components/update/update_entity.cpp create mode 100644 esphome/components/update/update_entity.h create mode 100644 tests/components/mqtt/common-update.yaml create mode 100644 tests/components/update/common.yaml create mode 100644 tests/components/update/test.esp32-ard.yaml create mode 100644 tests/components/update/test.esp32-idf.yaml create mode 100644 tests/components/update/test.esp8266.yaml create mode 100644 tests/components/update/test.rp2040.yaml diff --git a/CODEOWNERS b/CODEOWNERS index 90574ca9ba..bbb39c26ad 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -172,6 +172,7 @@ esphome/components/host/time/* @clydebarrow esphome/components/hrxl_maxsonar_wr/* @netmikey esphome/components/hte501/* @Stock-M esphome/components/http_request/ota/* @oarcher +esphome/components/http_request/update/* @jesserockz esphome/components/htu31d/* @betterengineering esphome/components/hydreon_rgxx/* @functionpointer esphome/components/hyt271/* @Philippe12 @@ -410,6 +411,7 @@ esphome/components/uart/button/* @ssieb esphome/components/ufire_ec/* @pvizeli esphome/components/ufire_ise/* @pvizeli esphome/components/ultrasonic/* @OttoWinter +esphome/components/update/* @jesserockz esphome/components/uponor_smatrix/* @kroimon esphome/components/valve/* @esphome/core esphome/components/vbus/* @ssieb diff --git a/esphome/components/api/api.proto b/esphome/components/api/api.proto index 0becec2348..812a1d74ae 100644 --- a/esphome/components/api/api.proto +++ b/esphome/components/api/api.proto @@ -48,6 +48,7 @@ service APIConnection { rpc date_command (DateCommandRequest) returns (void) {} rpc time_command (TimeCommandRequest) returns (void) {} rpc datetime_command (DateTimeCommandRequest) returns (void) {} + rpc update_command (UpdateCommandRequest) returns (void) {} rpc subscribe_bluetooth_le_advertisements(SubscribeBluetoothLEAdvertisementsRequest) returns (void) {} rpc bluetooth_device_request(BluetoothDeviceRequest) returns (void) {} @@ -1837,3 +1838,46 @@ message DateTimeCommandRequest { fixed32 key = 1; fixed32 epoch_seconds = 2; } + +// ==================== UPDATE ==================== +message ListEntitiesUpdateResponse { + option (id) = 116; + option (source) = SOURCE_SERVER; + option (ifdef) = "USE_UPDATE"; + + string object_id = 1; + fixed32 key = 2; + string name = 3; + string unique_id = 4; + + string icon = 5; + bool disabled_by_default = 6; + EntityCategory entity_category = 7; + string device_class = 8; +} +message UpdateStateResponse { + option (id) = 117; + option (source) = SOURCE_SERVER; + option (ifdef) = "USE_UPDATE"; + option (no_delay) = true; + + fixed32 key = 1; + bool missing_state = 2; + bool in_progress = 3; + bool has_progress = 4; + float progress = 5; + string current_version = 6; + string latest_version = 7; + string title = 8; + string release_summary = 9; + string release_url = 10; +} +message UpdateCommandRequest { + option (id) = 118; + option (source) = SOURCE_CLIENT; + option (ifdef) = "USE_UPDATE"; + option (no_delay) = true; + + fixed32 key = 1; + bool install = 2; +} diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp index 253f04aa39..2e73a8336e 100644 --- a/esphome/components/api/api_connection.cpp +++ b/esphome/components/api/api_connection.cpp @@ -1287,6 +1287,51 @@ bool APIConnection::send_event_info(event::Event *event) { } #endif +#ifdef USE_UPDATE +bool APIConnection::send_update_state(update::UpdateEntity *update) { + if (!this->state_subscription_) + return false; + + UpdateStateResponse resp{}; + resp.key = update->get_object_id_hash(); + resp.missing_state = !update->has_state(); + if (update->has_state()) { + resp.in_progress = update->state == update::UpdateState::UPDATE_STATE_INSTALLING; + if (update->update_info.has_progress) { + resp.has_progress = true; + resp.progress = update->update_info.progress; + } + resp.current_version = update->update_info.current_version; + resp.latest_version = update->update_info.latest_version; + resp.title = update->update_info.title; + resp.release_summary = update->update_info.summary; + resp.release_url = update->update_info.release_url; + } + + return this->send_update_state_response(resp); +} +bool APIConnection::send_update_info(update::UpdateEntity *update) { + ListEntitiesUpdateResponse msg; + msg.key = update->get_object_id_hash(); + msg.object_id = update->get_object_id(); + if (update->has_own_name()) + msg.name = update->get_name(); + msg.unique_id = get_default_unique_id("update", update); + msg.icon = update->get_icon(); + msg.disabled_by_default = update->is_disabled_by_default(); + msg.entity_category = static_cast(update->get_entity_category()); + msg.device_class = update->get_device_class(); + return this->send_list_entities_update_response(msg); +} +void APIConnection::update_command(const UpdateCommandRequest &msg) { + update::UpdateEntity *update = App.get_update_by_key(msg.key); + if (update == nullptr) + return; + + update->perform(); +} +#endif + bool APIConnection::send_log_message(int level, const char *tag, const char *line) { if (this->log_subscription_ < level) return false; diff --git a/esphome/components/api/api_connection.h b/esphome/components/api/api_connection.h index 293da17fa4..714e806470 100644 --- a/esphome/components/api/api_connection.h +++ b/esphome/components/api/api_connection.h @@ -164,6 +164,12 @@ class APIConnection : public APIServerConnection { bool send_event_info(event::Event *event); #endif +#ifdef USE_UPDATE + bool send_update_state(update::UpdateEntity *update); + bool send_update_info(update::UpdateEntity *update); + void update_command(const UpdateCommandRequest &msg) override; +#endif + void on_disconnect_response(const DisconnectResponse &value) override; void on_ping_response(const PingResponse &value) override { // we initiated ping diff --git a/esphome/components/api/api_pb2.cpp b/esphome/components/api/api_pb2.cpp index 9db6482c49..e6e905c6d1 100644 --- a/esphome/components/api/api_pb2.cpp +++ b/esphome/components/api/api_pb2.cpp @@ -8376,6 +8376,262 @@ void DateTimeCommandRequest::dump_to(std::string &out) const { out.append("}"); } #endif +bool ListEntitiesUpdateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 6: { + this->disabled_by_default = value.as_bool(); + return true; + } + case 7: { + this->entity_category = value.as_enum(); + return true; + } + default: + return false; + } +} +bool ListEntitiesUpdateResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { + switch (field_id) { + case 1: { + this->object_id = value.as_string(); + return true; + } + case 3: { + this->name = value.as_string(); + return true; + } + case 4: { + this->unique_id = value.as_string(); + return true; + } + case 5: { + this->icon = value.as_string(); + return true; + } + case 8: { + this->device_class = value.as_string(); + return true; + } + default: + return false; + } +} +bool ListEntitiesUpdateResponse::decode_32bit(uint32_t field_id, Proto32Bit value) { + switch (field_id) { + case 2: { + this->key = value.as_fixed32(); + return true; + } + default: + return false; + } +} +void ListEntitiesUpdateResponse::encode(ProtoWriteBuffer buffer) const { + buffer.encode_string(1, this->object_id); + buffer.encode_fixed32(2, this->key); + buffer.encode_string(3, this->name); + buffer.encode_string(4, this->unique_id); + buffer.encode_string(5, this->icon); + buffer.encode_bool(6, this->disabled_by_default); + buffer.encode_enum(7, this->entity_category); + buffer.encode_string(8, this->device_class); +} +#ifdef HAS_PROTO_MESSAGE_DUMP +void ListEntitiesUpdateResponse::dump_to(std::string &out) const { + __attribute__((unused)) char buffer[64]; + out.append("ListEntitiesUpdateResponse {\n"); + out.append(" object_id: "); + out.append("'").append(this->object_id).append("'"); + out.append("\n"); + + out.append(" key: "); + sprintf(buffer, "%" PRIu32, this->key); + out.append(buffer); + out.append("\n"); + + out.append(" name: "); + out.append("'").append(this->name).append("'"); + out.append("\n"); + + out.append(" unique_id: "); + out.append("'").append(this->unique_id).append("'"); + out.append("\n"); + + out.append(" icon: "); + out.append("'").append(this->icon).append("'"); + out.append("\n"); + + out.append(" disabled_by_default: "); + out.append(YESNO(this->disabled_by_default)); + out.append("\n"); + + out.append(" entity_category: "); + out.append(proto_enum_to_string(this->entity_category)); + out.append("\n"); + + out.append(" device_class: "); + out.append("'").append(this->device_class).append("'"); + out.append("\n"); + out.append("}"); +} +#endif +bool UpdateStateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 2: { + this->missing_state = value.as_bool(); + return true; + } + case 3: { + this->in_progress = value.as_bool(); + return true; + } + case 4: { + this->has_progress = value.as_bool(); + return true; + } + default: + return false; + } +} +bool UpdateStateResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) { + switch (field_id) { + case 6: { + this->current_version = value.as_string(); + return true; + } + case 7: { + this->latest_version = value.as_string(); + return true; + } + case 8: { + this->title = value.as_string(); + return true; + } + case 9: { + this->release_summary = value.as_string(); + return true; + } + case 10: { + this->release_url = value.as_string(); + return true; + } + default: + return false; + } +} +bool UpdateStateResponse::decode_32bit(uint32_t field_id, Proto32Bit value) { + switch (field_id) { + case 1: { + this->key = value.as_fixed32(); + return true; + } + case 5: { + this->progress = value.as_float(); + return true; + } + default: + return false; + } +} +void UpdateStateResponse::encode(ProtoWriteBuffer buffer) const { + buffer.encode_fixed32(1, this->key); + buffer.encode_bool(2, this->missing_state); + buffer.encode_bool(3, this->in_progress); + buffer.encode_bool(4, this->has_progress); + buffer.encode_float(5, this->progress); + buffer.encode_string(6, this->current_version); + buffer.encode_string(7, this->latest_version); + buffer.encode_string(8, this->title); + buffer.encode_string(9, this->release_summary); + buffer.encode_string(10, this->release_url); +} +#ifdef HAS_PROTO_MESSAGE_DUMP +void UpdateStateResponse::dump_to(std::string &out) const { + __attribute__((unused)) char buffer[64]; + out.append("UpdateStateResponse {\n"); + out.append(" key: "); + sprintf(buffer, "%" PRIu32, this->key); + out.append(buffer); + out.append("\n"); + + out.append(" missing_state: "); + out.append(YESNO(this->missing_state)); + out.append("\n"); + + out.append(" in_progress: "); + out.append(YESNO(this->in_progress)); + out.append("\n"); + + out.append(" has_progress: "); + out.append(YESNO(this->has_progress)); + out.append("\n"); + + out.append(" progress: "); + sprintf(buffer, "%g", this->progress); + out.append(buffer); + out.append("\n"); + + out.append(" current_version: "); + out.append("'").append(this->current_version).append("'"); + out.append("\n"); + + out.append(" latest_version: "); + out.append("'").append(this->latest_version).append("'"); + out.append("\n"); + + out.append(" title: "); + out.append("'").append(this->title).append("'"); + out.append("\n"); + + out.append(" release_summary: "); + out.append("'").append(this->release_summary).append("'"); + out.append("\n"); + + out.append(" release_url: "); + out.append("'").append(this->release_url).append("'"); + out.append("\n"); + out.append("}"); +} +#endif +bool UpdateCommandRequest::decode_varint(uint32_t field_id, ProtoVarInt value) { + switch (field_id) { + case 2: { + this->install = value.as_bool(); + return true; + } + default: + return false; + } +} +bool UpdateCommandRequest::decode_32bit(uint32_t field_id, Proto32Bit value) { + switch (field_id) { + case 1: { + this->key = value.as_fixed32(); + return true; + } + default: + return false; + } +} +void UpdateCommandRequest::encode(ProtoWriteBuffer buffer) const { + buffer.encode_fixed32(1, this->key); + buffer.encode_bool(2, this->install); +} +#ifdef HAS_PROTO_MESSAGE_DUMP +void UpdateCommandRequest::dump_to(std::string &out) const { + __attribute__((unused)) char buffer[64]; + out.append("UpdateCommandRequest {\n"); + out.append(" key: "); + sprintf(buffer, "%" PRIu32, this->key); + out.append(buffer); + out.append("\n"); + + out.append(" install: "); + out.append(YESNO(this->install)); + out.append("\n"); + out.append("}"); +} +#endif } // namespace api } // namespace esphome diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h index 54cbd20559..ef051eecf1 100644 --- a/esphome/components/api/api_pb2.h +++ b/esphome/components/api/api_pb2.h @@ -2130,6 +2130,61 @@ class DateTimeCommandRequest : public ProtoMessage { protected: bool decode_32bit(uint32_t field_id, Proto32Bit value) override; }; +class ListEntitiesUpdateResponse : public ProtoMessage { + public: + std::string object_id{}; + uint32_t key{0}; + std::string name{}; + std::string unique_id{}; + std::string icon{}; + bool disabled_by_default{false}; + enums::EntityCategory entity_category{}; + std::string device_class{}; + void encode(ProtoWriteBuffer buffer) const override; +#ifdef HAS_PROTO_MESSAGE_DUMP + void dump_to(std::string &out) const override; +#endif + + protected: + bool decode_32bit(uint32_t field_id, Proto32Bit value) override; + bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; +}; +class UpdateStateResponse : public ProtoMessage { + public: + uint32_t key{0}; + bool missing_state{false}; + bool in_progress{false}; + bool has_progress{false}; + float progress{0.0f}; + std::string current_version{}; + std::string latest_version{}; + std::string title{}; + std::string release_summary{}; + std::string release_url{}; + void encode(ProtoWriteBuffer buffer) const override; +#ifdef HAS_PROTO_MESSAGE_DUMP + void dump_to(std::string &out) const override; +#endif + + protected: + bool decode_32bit(uint32_t field_id, Proto32Bit value) override; + bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; +}; +class UpdateCommandRequest : public ProtoMessage { + public: + uint32_t key{0}; + bool install{false}; + void encode(ProtoWriteBuffer buffer) const override; +#ifdef HAS_PROTO_MESSAGE_DUMP + void dump_to(std::string &out) const override; +#endif + + protected: + bool decode_32bit(uint32_t field_id, Proto32Bit value) override; + bool decode_varint(uint32_t field_id, ProtoVarInt value) override; +}; } // namespace api } // namespace esphome diff --git a/esphome/components/api/api_pb2_service.cpp b/esphome/components/api/api_pb2_service.cpp index 7c95bb03ad..269a755e9e 100644 --- a/esphome/components/api/api_pb2_service.cpp +++ b/esphome/components/api/api_pb2_service.cpp @@ -611,6 +611,24 @@ bool APIServerConnectionBase::send_date_time_state_response(const DateTimeStateR #endif #ifdef USE_DATETIME_DATETIME #endif +#ifdef USE_UPDATE +bool APIServerConnectionBase::send_list_entities_update_response(const ListEntitiesUpdateResponse &msg) { +#ifdef HAS_PROTO_MESSAGE_DUMP + ESP_LOGVV(TAG, "send_list_entities_update_response: %s", msg.dump().c_str()); +#endif + return this->send_message_(msg, 116); +} +#endif +#ifdef USE_UPDATE +bool APIServerConnectionBase::send_update_state_response(const UpdateStateResponse &msg) { +#ifdef HAS_PROTO_MESSAGE_DUMP + ESP_LOGVV(TAG, "send_update_state_response: %s", msg.dump().c_str()); +#endif + return this->send_message_(msg, 117); +} +#endif +#ifdef USE_UPDATE +#endif bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) { switch (msg_type) { case 1: { @@ -1106,6 +1124,17 @@ bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, ESP_LOGVV(TAG, "on_voice_assistant_timer_event_response: %s", msg.dump().c_str()); #endif this->on_voice_assistant_timer_event_response(msg); +#endif + break; + } + case 118: { +#ifdef USE_UPDATE + UpdateCommandRequest msg; + msg.decode(msg_data, msg_size); +#ifdef HAS_PROTO_MESSAGE_DUMP + ESP_LOGVV(TAG, "on_update_command_request: %s", msg.dump().c_str()); +#endif + this->on_update_command_request(msg); #endif break; } @@ -1434,6 +1463,19 @@ void APIServerConnection::on_date_time_command_request(const DateTimeCommandRequ this->datetime_command(msg); } #endif +#ifdef USE_UPDATE +void APIServerConnection::on_update_command_request(const UpdateCommandRequest &msg) { + if (!this->is_connection_setup()) { + this->on_no_setup_connection(); + return; + } + if (!this->is_authenticated()) { + this->on_unauthenticated_access(); + return; + } + this->update_command(msg); +} +#endif #ifdef USE_BLUETOOTH_PROXY void APIServerConnection::on_subscribe_bluetooth_le_advertisements_request( const SubscribeBluetoothLEAdvertisementsRequest &msg) { diff --git a/esphome/components/api/api_pb2_service.h b/esphome/components/api/api_pb2_service.h index 2f8a2b3def..83bfc2ed98 100644 --- a/esphome/components/api/api_pb2_service.h +++ b/esphome/components/api/api_pb2_service.h @@ -306,6 +306,15 @@ class APIServerConnectionBase : public ProtoService { #endif #ifdef USE_DATETIME_DATETIME virtual void on_date_time_command_request(const DateTimeCommandRequest &value){}; +#endif +#ifdef USE_UPDATE + bool send_list_entities_update_response(const ListEntitiesUpdateResponse &msg); +#endif +#ifdef USE_UPDATE + bool send_update_state_response(const UpdateStateResponse &msg); +#endif +#ifdef USE_UPDATE + virtual void on_update_command_request(const UpdateCommandRequest &value){}; #endif protected: bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) override; @@ -373,6 +382,9 @@ class APIServerConnection : public APIServerConnectionBase { #ifdef USE_DATETIME_DATETIME virtual void datetime_command(const DateTimeCommandRequest &msg) = 0; #endif +#ifdef USE_UPDATE + virtual void update_command(const UpdateCommandRequest &msg) = 0; +#endif #ifdef USE_BLUETOOTH_PROXY virtual void subscribe_bluetooth_le_advertisements(const SubscribeBluetoothLEAdvertisementsRequest &msg) = 0; #endif @@ -471,6 +483,9 @@ class APIServerConnection : public APIServerConnectionBase { #ifdef USE_DATETIME_DATETIME void on_date_time_command_request(const DateTimeCommandRequest &msg) override; #endif +#ifdef USE_UPDATE + void on_update_command_request(const UpdateCommandRequest &msg) override; +#endif #ifdef USE_BLUETOOTH_PROXY void on_subscribe_bluetooth_le_advertisements_request(const SubscribeBluetoothLEAdvertisementsRequest &msg) override; #endif diff --git a/esphome/components/api/api_server.cpp b/esphome/components/api/api_server.cpp index 0725547771..a61ae89243 100644 --- a/esphome/components/api/api_server.cpp +++ b/esphome/components/api/api_server.cpp @@ -334,6 +334,13 @@ void APIServer::on_event(event::Event *obj, const std::string &event_type) { } #endif +#ifdef USE_UPDATE +void APIServer::on_update(update::UpdateEntity *obj) { + for (auto &c : this->clients_) + c->send_update_state(obj); +} +#endif + float APIServer::get_setup_priority() const { return setup_priority::AFTER_WIFI; } void APIServer::set_port(uint16_t port) { this->port_ = port; } APIServer *global_api_server = nullptr; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) diff --git a/esphome/components/api/api_server.h b/esphome/components/api/api_server.h index 2e1fbdf67c..43bc8a7348 100644 --- a/esphome/components/api/api_server.h +++ b/esphome/components/api/api_server.h @@ -102,6 +102,9 @@ class APIServer : public Component, public Controller { #ifdef USE_EVENT void on_event(event::Event *obj, const std::string &event_type) override; #endif +#ifdef USE_UPDATE + void on_update(update::UpdateEntity *obj) override; +#endif bool is_connected() const; diff --git a/esphome/components/api/list_entities.cpp b/esphome/components/api/list_entities.cpp index a7dbf9a6e7..5fa360d170 100644 --- a/esphome/components/api/list_entities.cpp +++ b/esphome/components/api/list_entities.cpp @@ -98,6 +98,9 @@ bool ListEntitiesIterator::on_alarm_control_panel(alarm_control_panel::AlarmCont #ifdef USE_EVENT bool ListEntitiesIterator::on_event(event::Event *event) { return this->client_->send_event_info(event); } #endif +#ifdef USE_UPDATE +bool ListEntitiesIterator::on_update(update::UpdateEntity *update) { return this->client_->send_update_info(update); } +#endif } // namespace api } // namespace esphome diff --git a/esphome/components/api/list_entities.h b/esphome/components/api/list_entities.h index c1fd8b82c4..a37586de0f 100644 --- a/esphome/components/api/list_entities.h +++ b/esphome/components/api/list_entities.h @@ -75,6 +75,9 @@ class ListEntitiesIterator : public ComponentIterator { #endif #ifdef USE_EVENT bool on_event(event::Event *event) override; +#endif +#ifdef USE_UPDATE + bool on_update(update::UpdateEntity *update) override; #endif bool on_end() override; diff --git a/esphome/components/api/subscribe_state.cpp b/esphome/components/api/subscribe_state.cpp index 005ab0e6da..5861b1f465 100644 --- a/esphome/components/api/subscribe_state.cpp +++ b/esphome/components/api/subscribe_state.cpp @@ -77,6 +77,9 @@ bool InitialStateIterator::on_alarm_control_panel(alarm_control_panel::AlarmCont return this->client_->send_alarm_control_panel_state(a_alarm_control_panel); } #endif +#ifdef USE_UPDATE +bool InitialStateIterator::on_update(update::UpdateEntity *update) { return this->client_->send_update_state(update); } +#endif InitialStateIterator::InitialStateIterator(APIConnection *client) : client_(client) {} } // namespace api diff --git a/esphome/components/api/subscribe_state.h b/esphome/components/api/subscribe_state.h index 8c725e422e..67c4346210 100644 --- a/esphome/components/api/subscribe_state.h +++ b/esphome/components/api/subscribe_state.h @@ -72,6 +72,9 @@ class InitialStateIterator : public ComponentIterator { #endif #ifdef USE_EVENT bool on_event(event::Event *event) override { return true; }; +#endif +#ifdef USE_UPDATE + bool on_update(update::UpdateEntity *update) override; #endif protected: APIConnection *client_; diff --git a/esphome/components/http_request/ota/ota_http_request.cpp b/esphome/components/http_request/ota/ota_http_request.cpp index a41f552baf..dcc783ea47 100644 --- a/esphome/components/http_request/ota/ota_http_request.cpp +++ b/esphome/components/http_request/ota/ota_http_request.cpp @@ -15,6 +15,8 @@ namespace esphome { namespace http_request { +static const char *const TAG = "http_request.ota"; + void OtaHttpRequestComponent::setup() { #ifdef USE_OTA_STATE_CALLBACK ota::register_ota_platform(this); diff --git a/esphome/components/http_request/ota/ota_http_request.h b/esphome/components/http_request/ota/ota_http_request.h index 91c7085517..6a86b4ab43 100644 --- a/esphome/components/http_request/ota/ota_http_request.h +++ b/esphome/components/http_request/ota/ota_http_request.h @@ -14,7 +14,6 @@ namespace esphome { namespace http_request { -static const char *const TAG = "http_request.ota"; static const uint8_t MD5_SIZE = 32; enum OtaHttpRequestError : uint8_t { diff --git a/esphome/components/http_request/update/__init__.py b/esphome/components/http_request/update/__init__.py new file mode 100644 index 0000000000..356afa1432 --- /dev/null +++ b/esphome/components/http_request/update/__init__.py @@ -0,0 +1,44 @@ +import esphome.config_validation as cv +import esphome.codegen as cg + +from esphome.components import update +from esphome.const import ( + CONF_SOURCE, +) + +from .. import http_request_ns, CONF_HTTP_REQUEST_ID, HttpRequestComponent +from ..ota import OtaHttpRequestComponent + + +AUTO_LOAD = ["json"] +CODEOWNERS = ["@jesserockz"] +DEPENDENCIES = ["ota.http_request"] + +HttpRequestUpdate = http_request_ns.class_( + "HttpRequestUpdate", update.UpdateEntity, cg.PollingComponent +) + +CONF_OTA_ID = "ota_id" + +CONFIG_SCHEMA = update.UPDATE_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(HttpRequestUpdate), + cv.GenerateID(CONF_OTA_ID): cv.use_id(OtaHttpRequestComponent), + cv.GenerateID(CONF_HTTP_REQUEST_ID): cv.use_id(HttpRequestComponent), + cv.Required(CONF_SOURCE): cv.url, + } +).extend(cv.polling_component_schema("6h")) + + +async def to_code(config): + var = await update.new_update(config) + ota_parent = await cg.get_variable(config[CONF_OTA_ID]) + cg.add(var.set_ota_parent(ota_parent)) + request_parent = await cg.get_variable(config[CONF_HTTP_REQUEST_ID]) + cg.add(var.set_request_parent(request_parent)) + + cg.add(var.set_source_url(config[CONF_SOURCE])) + + cg.add_define("USE_OTA_STATE_CALLBACK") + + await cg.register_component(var, config) diff --git a/esphome/components/http_request/update/http_request_update.cpp b/esphome/components/http_request/update/http_request_update.cpp new file mode 100644 index 0000000000..98129e59dc --- /dev/null +++ b/esphome/components/http_request/update/http_request_update.cpp @@ -0,0 +1,157 @@ +#include "http_request_update.h" + +#include "esphome/core/application.h" +#include "esphome/core/version.h" + +#include "esphome/components/json/json_util.h" +#include "esphome/components/network/util.h" + +namespace esphome { +namespace http_request { + +static const char *const TAG = "http_request.update"; + +static const size_t MAX_READ_SIZE = 256; + +void HttpRequestUpdate::setup() { + this->ota_parent_->add_on_state_callback([this](ota::OTAState state, float progress, uint8_t err) { + if (state == ota::OTAState::OTA_IN_PROGRESS) { + this->state_ = update::UPDATE_STATE_INSTALLING; + this->update_info_.has_progress = true; + this->update_info_.progress = progress; + this->publish_state(); + } else if (state == ota::OTAState::OTA_ABORT || state == ota::OTAState::OTA_ERROR) { + this->state_ = update::UPDATE_STATE_AVAILABLE; + this->status_set_error("Failed to install firmware"); + this->publish_state(); + } + }); +} + +void HttpRequestUpdate::update() { + auto container = this->request_parent_->get(this->source_url_); + + if (container == nullptr) { + std::string msg = str_sprintf("Failed to fetch manifest from %s", this->source_url_.c_str()); + this->status_set_error(msg.c_str()); + return; + } + + ExternalRAMAllocator allocator(ExternalRAMAllocator::ALLOW_FAILURE); + uint8_t *data = allocator.allocate(container->content_length); + if (data == nullptr) { + std::string msg = str_sprintf("Failed to allocate %d bytes for manifest", container->content_length); + this->status_set_error(msg.c_str()); + container->end(); + return; + } + + size_t read_index = 0; + while (container->get_bytes_read() < container->content_length) { + int read_bytes = container->read(data + read_index, MAX_READ_SIZE); + + App.feed_wdt(); + yield(); + + read_index += read_bytes; + } + + std::string response((char *) data, read_index); + allocator.deallocate(data, container->content_length); + + container->end(); + + bool valid = json::parse_json(response, [this](JsonObject root) -> bool { + if (!root.containsKey("name") || !root.containsKey("version") || !root.containsKey("builds")) { + ESP_LOGE(TAG, "Manifest does not contain required fields"); + return false; + } + this->update_info_.title = root["name"].as(); + this->update_info_.latest_version = root["version"].as(); + + for (auto build : root["builds"].as()) { + if (!build.containsKey("chipFamily")) { + ESP_LOGE(TAG, "Manifest does not contain required fields"); + return false; + } + if (build["chipFamily"] == ESPHOME_VARIANT) { + if (!build.containsKey("ota")) { + ESP_LOGE(TAG, "Manifest does not contain required fields"); + return false; + } + auto ota = build["ota"]; + if (!ota.containsKey("path") || !ota.containsKey("md5")) { + ESP_LOGE(TAG, "Manifest does not contain required fields"); + return false; + } + this->update_info_.firmware_url = ota["path"].as(); + this->update_info_.md5 = ota["md5"].as(); + + if (ota.containsKey("summary")) + this->update_info_.summary = ota["summary"].as(); + if (ota.containsKey("release_url")) + this->update_info_.release_url = ota["release_url"].as(); + + return true; + } + } + return false; + }); + + if (!valid) { + std::string msg = str_sprintf("Failed to parse JSON from %s", this->source_url_.c_str()); + this->status_set_error(msg.c_str()); + return; + } + + // Merge source_url_ and this->update_info_.firmware_url + if (this->update_info_.firmware_url.find("http") == std::string::npos) { + std::string path = this->update_info_.firmware_url; + if (path[0] == '/') { + std::string domain = this->source_url_.substr(0, this->source_url_.find('/', 8)); + this->update_info_.firmware_url = domain + path; + } else { + std::string domain = this->source_url_.substr(0, this->source_url_.rfind('/') + 1); + this->update_info_.firmware_url = domain + path; + } + } + + std::string current_version = this->current_version_; + if (current_version.empty()) { +#ifdef ESPHOME_PROJECT_VERSION + current_version = ESPHOME_PROJECT_VERSION; +#else + current_version = ESPHOME_VERSION; +#endif + } + this->update_info_.current_version = current_version; + + if (this->update_info_.latest_version.empty()) { + this->state_ = update::UPDATE_STATE_NO_UPDATE; + } else if (this->update_info_.latest_version != this->current_version_) { + this->state_ = update::UPDATE_STATE_AVAILABLE; + } + + this->update_info_.has_progress = false; + this->update_info_.progress = 0.0f; + + this->status_clear_error(); + this->publish_state(); +} + +void HttpRequestUpdate::perform() { + if (this->state_ != update::UPDATE_STATE_AVAILABLE) { + return; + } + + this->state_ = update::UPDATE_STATE_INSTALLING; + this->publish_state(); + + this->ota_parent_->set_md5(this->update_info.md5); + this->ota_parent_->set_url(this->update_info.firmware_url); + // Flash in the next loop + this->defer([this]() { this->ota_parent_->flash(); }); +} + +} // namespace http_request +} // namespace esphome diff --git a/esphome/components/http_request/update/http_request_update.h b/esphome/components/http_request/update/http_request_update.h new file mode 100644 index 0000000000..1337822ecc --- /dev/null +++ b/esphome/components/http_request/update/http_request_update.h @@ -0,0 +1,37 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/core/helpers.h" + +#include "esphome/components/http_request/http_request.h" +#include "esphome/components/http_request/ota/ota_http_request.h" +#include "esphome/components/update/update_entity.h" + +namespace esphome { +namespace http_request { + +class HttpRequestUpdate : public update::UpdateEntity, public PollingComponent { + public: + void setup() override; + void update() override; + + void perform() override; + + void set_source_url(const std::string &source_url) { this->source_url_ = source_url; } + + void set_request_parent(HttpRequestComponent *request_parent) { this->request_parent_ = request_parent; } + void set_ota_parent(OtaHttpRequestComponent *ota_parent) { this->ota_parent_ = ota_parent; } + + void set_current_version(const std::string ¤t_version) { this->current_version_ = current_version; } + + float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } + + protected: + HttpRequestComponent *request_parent_; + OtaHttpRequestComponent *ota_parent_; + std::string source_url_; + std::string current_version_{""}; +}; + +} // namespace http_request +} // namespace esphome diff --git a/esphome/components/mqtt/__init__.py b/esphome/components/mqtt/__init__.py index 31cbb2cf97..96a02cb60e 100644 --- a/esphome/components/mqtt/__init__.py +++ b/esphome/components/mqtt/__init__.py @@ -126,6 +126,7 @@ MQTTSelectComponent = mqtt_ns.class_("MQTTSelectComponent", MQTTComponent) MQTTButtonComponent = mqtt_ns.class_("MQTTButtonComponent", MQTTComponent) MQTTLockComponent = mqtt_ns.class_("MQTTLockComponent", MQTTComponent) MQTTEventComponent = mqtt_ns.class_("MQTTEventComponent", MQTTComponent) +MQTTUpdateComponent = mqtt_ns.class_("MQTTUpdateComponent", MQTTComponent) MQTTValveComponent = mqtt_ns.class_("MQTTValveComponent", MQTTComponent) MQTTDiscoveryUniqueIdGenerator = mqtt_ns.enum("MQTTDiscoveryUniqueIdGenerator") diff --git a/esphome/components/mqtt/mqtt_const.h b/esphome/components/mqtt/mqtt_const.h index 66872680bb..0e063c66d2 100644 --- a/esphome/components/mqtt/mqtt_const.h +++ b/esphome/components/mqtt/mqtt_const.h @@ -137,6 +137,7 @@ constexpr const char *const MQTT_PAYLOAD_CLOSE = "pl_cls"; constexpr const char *const MQTT_PAYLOAD_DISARM = "pl_disarm"; constexpr const char *const MQTT_PAYLOAD_HIGH_SPEED = "pl_hi_spd"; constexpr const char *const MQTT_PAYLOAD_HOME = "pl_home"; +constexpr const char *const MQTT_PAYLOAD_INSTALL = "pl_inst"; constexpr const char *const MQTT_PAYLOAD_LOCATE = "pl_loc"; constexpr const char *const MQTT_PAYLOAD_LOCK = "pl_lock"; constexpr const char *const MQTT_PAYLOAD_LOW_SPEED = "pl_lo_spd"; @@ -396,6 +397,7 @@ constexpr const char *const MQTT_PAYLOAD_CLOSE = "payload_close"; constexpr const char *const MQTT_PAYLOAD_DISARM = "payload_disarm"; constexpr const char *const MQTT_PAYLOAD_HIGH_SPEED = "payload_high_speed"; constexpr const char *const MQTT_PAYLOAD_HOME = "payload_home"; +constexpr const char *const MQTT_PAYLOAD_INSTALL = "payload_install"; constexpr const char *const MQTT_PAYLOAD_LOCATE = "payload_locate"; constexpr const char *const MQTT_PAYLOAD_LOCK = "payload_lock"; constexpr const char *const MQTT_PAYLOAD_LOW_SPEED = "payload_low_speed"; diff --git a/esphome/components/mqtt/mqtt_update.cpp b/esphome/components/mqtt/mqtt_update.cpp new file mode 100644 index 0000000000..2ed8faf074 --- /dev/null +++ b/esphome/components/mqtt/mqtt_update.cpp @@ -0,0 +1,62 @@ +#include "mqtt_update.h" +#include "esphome/core/log.h" + +#include "mqtt_const.h" + +#ifdef USE_MQTT +#ifdef USE_UPDATE + +namespace esphome { +namespace mqtt { + +static const char *const TAG = "mqtt.update"; + +using namespace esphome::update; + +MQTTUpdateComponent::MQTTUpdateComponent(UpdateEntity *update) : update_(update) {} + +void MQTTUpdateComponent::setup() { + this->subscribe(this->get_command_topic_(), [this](const std::string &topic, const std::string &payload) { + if (payload == "INSTALL") { + this->update_->perform(); + } else { + ESP_LOGW(TAG, "'%s': Received unknown update payload: %s", this->friendly_name().c_str(), payload.c_str()); + this->status_momentary_warning("state", 5000); + } + }); + + this->update_->add_on_state_callback([this]() { this->defer("send", [this]() { this->publish_state(); }); }); +} + +bool MQTTUpdateComponent::publish_state() { + return this->publish_json(this->get_state_topic_(), [this](JsonObject root) { + root["installed_version"] = this->update_->update_info.current_version; + root["latest_version"] = this->update_->update_info.latest_version; + root["title"] = this->update_->update_info.title; + if (!this->update_->update_info.summary.empty()) + root["release_summary"] = this->update_->update_info.summary; + if (!this->update_->update_info.release_url.empty()) + root["release_url"] = this->update_->update_info.release_url; + }); +} + +void MQTTUpdateComponent::send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) { + root["schema"] = "json"; + root[MQTT_PAYLOAD_INSTALL] = "INSTALL"; +} + +bool MQTTUpdateComponent::send_initial_state() { return this->publish_state(); } + +void MQTTUpdateComponent::dump_config() { + ESP_LOGCONFIG(TAG, "MQTT Update '%s': ", this->update_->get_name().c_str()); + LOG_MQTT_COMPONENT(true, true); +} + +std::string MQTTUpdateComponent::component_type() const { return "update"; } +const EntityBase *MQTTUpdateComponent::get_entity() const { return this->update_; } + +} // namespace mqtt +} // namespace esphome + +#endif // USE_UPDATE +#endif // USE_MQTT diff --git a/esphome/components/mqtt/mqtt_update.h b/esphome/components/mqtt/mqtt_update.h new file mode 100644 index 0000000000..6fe04c4ea7 --- /dev/null +++ b/esphome/components/mqtt/mqtt_update.h @@ -0,0 +1,41 @@ +#pragma once + +#include "esphome/core/defines.h" + +#ifdef USE_MQTT +#ifdef USE_UPDATE + +#include "esphome/components/update/update_entity.h" +#include "mqtt_component.h" + +namespace esphome { +namespace mqtt { + +class MQTTUpdateComponent : public mqtt::MQTTComponent { + public: + explicit MQTTUpdateComponent(update::UpdateEntity *update); + + // ========== INTERNAL METHODS ========== + // (In most use cases you won't need these) + void setup() override; + void dump_config() override; + + void send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) override; + + bool send_initial_state() override; + + bool publish_state(); + + protected: + /// "update" component type. + std::string component_type() const override; + const EntityBase *get_entity() const override; + + update::UpdateEntity *update_; +}; + +} // namespace mqtt +} // namespace esphome + +#endif // USE_UPDATE +#endif // USE_MQTT diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py new file mode 100644 index 0000000000..ae3d5062ab --- /dev/null +++ b/esphome/components/update/__init__.py @@ -0,0 +1,108 @@ +from esphome import automation +from esphome.components import mqtt, web_server +import esphome.config_validation as cv +import esphome.codegen as cg +from esphome.const import ( + CONF_DEVICE_CLASS, + CONF_ID, + CONF_MQTT_ID, + CONF_WEB_SERVER_ID, + DEVICE_CLASS_FIRMWARE, +) +from esphome.core import CORE, coroutine_with_priority +from esphome.cpp_helpers import setup_entity + +CODEOWNERS = ["@jesserockz"] +IS_PLATFORM_COMPONENT = True + +update_ns = cg.esphome_ns.namespace("update") +UpdateEntity = update_ns.class_("UpdateEntity", cg.EntityBase) + +UpdateInfo = update_ns.struct("UpdateInfo") + +PerformAction = update_ns.class_("PerformAction", automation.Action) +IsAvailableCondition = update_ns.class_("IsAvailableCondition", automation.Condition) + +DEVICE_CLASSES = [ + DEVICE_CLASS_FIRMWARE, +] + +CONF_ON_UPDATE_AVAILABLE = "on_update_available" + +UPDATE_SCHEMA = ( + cv.ENTITY_BASE_SCHEMA.extend(web_server.WEBSERVER_SORTING_SCHEMA) + .extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA) + .extend( + { + cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTUpdateComponent), + cv.Optional(CONF_DEVICE_CLASS): cv.one_of(*DEVICE_CLASSES, lower=True), + cv.Optional(CONF_ON_UPDATE_AVAILABLE): automation.validate_automation( + single=True + ), + } + ) +) + + +async def setup_update_core_(var, config): + await setup_entity(var, config) + + if device_class_config := config.get(CONF_DEVICE_CLASS): + cg.add(var.set_device_class(device_class_config)) + + if on_update_available := config.get(CONF_ON_UPDATE_AVAILABLE): + await automation.build_automation( + var.get_update_available_trigger(), + [(UpdateInfo.operator("ref").operator("const"), "x")], + on_update_available, + ) + + if mqtt_id_config := config.get(CONF_MQTT_ID): + mqtt_ = cg.new_Pvariable(mqtt_id_config, var) + await mqtt.register_mqtt_component(mqtt_, config) + + if web_server_id_config := config.get(CONF_WEB_SERVER_ID): + web_server_ = cg.get_variable(web_server_id_config) + web_server.add_entity_to_sorting_list(web_server_, var, config) + + +async def register_update(var, config): + if not CORE.has_id(config[CONF_ID]): + var = cg.Pvariable(config[CONF_ID], var) + cg.add(cg.App.register_update(var)) + await setup_update_core_(var, config) + + +async def new_update(config): + var = cg.new_Pvariable(config[CONF_ID]) + await register_update(var, config) + return var + + +@coroutine_with_priority(100.0) +async def to_code(config): + cg.add_define("USE_UPDATE") + cg.add_global(update_ns.using) + + +UPDATE_AUTOMATION_SCHEMA = cv.Schema( + { + cv.GenerateID(): cv.use_id(UpdateEntity), + } +) + + +@automation.register_action("update.perform", PerformAction, UPDATE_AUTOMATION_SCHEMA) +async def update_perform_action_to_code(config, action_id, template_arg, args): + paren = await cg.get_variable(config[CONF_ID]) + return cg.new_Pvariable(action_id, paren, paren) + + +@automation.register_condition( + "update.is_available", IsAvailableCondition, UPDATE_AUTOMATION_SCHEMA +) +async def update_is_available_condition_to_code( + config, condition_id, template_arg, args +): + paren = await cg.get_variable(config[CONF_ID]) + return cg.new_Pvariable(condition_id, paren, paren) diff --git a/esphome/components/update/update_entity.cpp b/esphome/components/update/update_entity.cpp new file mode 100644 index 0000000000..501cb6635f --- /dev/null +++ b/esphome/components/update/update_entity.cpp @@ -0,0 +1,12 @@ +#include "update_entity.h" + +namespace esphome { +namespace update { + +void UpdateEntity::publish_state() { + this->has_state_ = true; + this->state_callback_.call(); +} + +} // namespace update +} // namespace esphome diff --git a/esphome/components/update/update_entity.h b/esphome/components/update/update_entity.h new file mode 100644 index 0000000000..5984c8e35b --- /dev/null +++ b/esphome/components/update/update_entity.h @@ -0,0 +1,51 @@ +#pragma once + +#include "esphome/core/automation.h" +#include "esphome/core/component.h" +#include "esphome/core/entity_base.h" + +namespace esphome { +namespace update { + +struct UpdateInfo { + std::string latest_version; + std::string current_version; + std::string title; + std::string summary; + std::string release_url; + std::string firmware_url; + std::string md5; + bool has_progress{false}; + float progress; +}; + +enum UpdateState : uint8_t { + UPDATE_STATE_UNKNOWN, + UPDATE_STATE_NO_UPDATE, + UPDATE_STATE_AVAILABLE, + UPDATE_STATE_INSTALLING, +}; + +class UpdateEntity : public EntityBase, public EntityBase_DeviceClass { + public: + bool has_state() const { return this->has_state_; } + + void publish_state(); + + virtual void perform() = 0; + + const UpdateInfo &update_info = update_info_; + const UpdateState &state = state_; + + void add_on_state_callback(std::function &&callback) { this->state_callback_.add(std::move(callback)); } + + protected: + UpdateState state_{UPDATE_STATE_UNKNOWN}; + UpdateInfo update_info_; + bool has_state_{false}; + + CallbackManager state_callback_{}; +}; + +} // namespace update +} // namespace esphome diff --git a/esphome/components/web_server/list_entities.cpp b/esphome/components/web_server/list_entities.cpp index 42af72e872..332f358352 100644 --- a/esphome/components/web_server/list_entities.cpp +++ b/esphome/components/web_server/list_entities.cpp @@ -177,5 +177,14 @@ bool ListEntitiesIterator::on_event(event::Event *event) { } #endif +#ifdef USE_UPDATE +bool ListEntitiesIterator::on_update(update::UpdateEntity *update) { + if (this->web_server_->events_.count() == 0) + return true; + this->web_server_->events_.send(this->web_server_->update_json(update, DETAIL_ALL).c_str(), "state"); + return true; +} +#endif + } // namespace web_server } // namespace esphome diff --git a/esphome/components/web_server/list_entities.h b/esphome/components/web_server/list_entities.h index 47d427d9b5..5ff6ec0412 100644 --- a/esphome/components/web_server/list_entities.h +++ b/esphome/components/web_server/list_entities.h @@ -68,6 +68,9 @@ class ListEntitiesIterator : public ComponentIterator { #ifdef USE_EVENT bool on_event(event::Event *event) override; #endif +#ifdef USE_UPDATE + bool on_update(update::UpdateEntity *update) override; +#endif protected: WebServer *web_server_; diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp index 5bb36f9600..9a1641e86f 100644 --- a/esphome/components/web_server/web_server.cpp +++ b/esphome/components/web_server/web_server.cpp @@ -1501,6 +1501,65 @@ std::string WebServer::event_json(event::Event *obj, const std::string &event_ty } #endif +#ifdef USE_UPDATE +void WebServer::on_update(update::UpdateEntity *obj) { + if (this->events_.count() == 0) + return; + this->events_.send(this->update_json(obj, DETAIL_STATE).c_str(), "state"); +} +void WebServer::handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match) { + for (update::UpdateEntity *obj : App.get_updates()) { + if (obj->get_object_id() != match.id) + continue; + + if (request->method() == HTTP_GET && match.method.empty()) { + std::string data = this->update_json(obj, DETAIL_STATE); + request->send(200, "application/json", data.c_str()); + return; + } + + if (match.method != "install") { + request->send(404); + return; + } + + this->schedule_([obj]() mutable { obj->perform(); }); + request->send(200); + return; + } + request->send(404); +} +std::string WebServer::update_json(update::UpdateEntity *obj, JsonDetail start_config) { + return json::build_json([this, obj, start_config](JsonObject root) { + set_json_id(root, obj, "update-" + obj->get_object_id(), start_config); + root["value"] = obj->update_info.latest_version; + switch (obj->state) { + case update::UPDATE_STATE_NO_UPDATE: + root["state"] = "NO UPDATE"; + break; + case update::UPDATE_STATE_AVAILABLE: + root["state"] = "UPDATE AVAILABLE"; + break; + case update::UPDATE_STATE_INSTALLING: + root["state"] = "INSTALLING"; + break; + default: + root["state"] = "UNKNOWN"; + break; + } + if (start_config == DETAIL_ALL) { + root["current_version"] = obj->update_info.current_version; + root["title"] = obj->update_info.title; + root["summary"] = obj->update_info.summary; + root["release_url"] = obj->update_info.release_url; + if (this->sorting_entitys_.find(obj) != this->sorting_entitys_.end()) { + root["sorting_weight"] = this->sorting_entitys_[obj].weight; + } + } + }); +} +#endif + bool WebServer::canHandle(AsyncWebServerRequest *request) { if (request->url() == "/") return true; @@ -1620,6 +1679,11 @@ bool WebServer::canHandle(AsyncWebServerRequest *request) { return true; #endif +#ifdef USE_UPDATE + if ((request->method() == HTTP_POST || request->method() == HTTP_GET) && match.domain == "update") + return true; +#endif + return false; } void WebServer::handleRequest(AsyncWebServerRequest *request) { @@ -1777,6 +1841,13 @@ void WebServer::handleRequest(AsyncWebServerRequest *request) { return; } #endif + +#ifdef USE_UPDATE + if (match.domain == "update") { + this->handle_update_request(request, match); + return; + } +#endif } bool WebServer::isRequestHandlerTrivial() { return false; } diff --git a/esphome/components/web_server/web_server.h b/esphome/components/web_server/web_server.h index 0fb40e2c33..5b98806af1 100644 --- a/esphome/components/web_server/web_server.h +++ b/esphome/components/web_server/web_server.h @@ -7,8 +7,8 @@ #include "esphome/core/controller.h" #include "esphome/core/entity_base.h" -#include #include +#include #ifdef USE_ESP32 #include #include @@ -319,6 +319,16 @@ class WebServer : public Controller, public Component, public AsyncWebHandler { std::string event_json(event::Event *obj, const std::string &event_type, JsonDetail start_config); #endif +#ifdef USE_UPDATE + void on_update(update::UpdateEntity *obj) override; + + /// Handle a update request under '/update/'. + void handle_update_request(AsyncWebServerRequest *request, const UrlMatch &match); + + /// Dump the update state with its value as a JSON string. + std::string update_json(update::UpdateEntity *obj, JsonDetail start_config); +#endif + /// Override the web handler's canHandle method. bool canHandle(AsyncWebServerRequest *request) override; /// Override the web handler's handleRequest method. diff --git a/esphome/const.py b/esphome/const.py index dcb353ab1c..cbd932e3cc 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1083,6 +1083,7 @@ DEVICE_CLASS_DURATION = "duration" DEVICE_CLASS_EMPTY = "" DEVICE_CLASS_ENERGY = "energy" DEVICE_CLASS_ENERGY_STORAGE = "energy_storage" +DEVICE_CLASS_FIRMWARE = "firmware" DEVICE_CLASS_FREQUENCY = "frequency" DEVICE_CLASS_GARAGE = "garage" DEVICE_CLASS_GARAGE_DOOR = "garage_door" diff --git a/esphome/core/application.h b/esphome/core/application.h index c4c745b687..2697357456 100644 --- a/esphome/core/application.h +++ b/esphome/core/application.h @@ -69,6 +69,9 @@ #ifdef USE_EVENT #include "esphome/components/event/event.h" #endif +#ifdef USE_UPDATE +#include "esphome/components/update/update_entity.h" +#endif namespace esphome { @@ -178,6 +181,10 @@ class Application { void register_event(event::Event *event) { this->events_.push_back(event); } #endif +#ifdef USE_UPDATE + void register_update(update::UpdateEntity *update) { this->updates_.push_back(update); } +#endif + /// Register the component in this Application instance. template C *register_component(C *c) { static_assert(std::is_base_of::value, "Only Component subclasses can be registered"); @@ -421,6 +428,16 @@ class Application { } #endif +#ifdef USE_UPDATE + const std::vector &get_updates() { return this->updates_; } + update::UpdateEntity *get_update_by_key(uint32_t key, bool include_internal = false) { + for (auto *obj : this->updates_) + if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal())) + return obj; + return nullptr; + } +#endif + Scheduler scheduler; protected: @@ -495,6 +512,9 @@ class Application { #ifdef USE_ALARM_CONTROL_PANEL std::vector alarm_control_panels_{}; #endif +#ifdef USE_UPDATE + std::vector updates_{}; +#endif std::string name_; std::string friendly_name_; diff --git a/esphome/core/component_iterator.cpp b/esphome/core/component_iterator.cpp index 9b02bf527b..da593340c1 100644 --- a/esphome/core/component_iterator.cpp +++ b/esphome/core/component_iterator.cpp @@ -351,6 +351,21 @@ void ComponentIterator::advance() { } } break; +#endif +#ifdef USE_UPDATE + case IteratorState::UPDATE: + if (this->at_ >= App.get_updates().size()) { + advance_platform = true; + } else { + auto *update = App.get_updates()[this->at_]; + if (update->is_internal() && !this->include_internal_) { + success = true; + break; + } else { + success = this->on_update(update); + } + } + break; #endif case IteratorState::MAX: if (this->on_end()) { diff --git a/esphome/core/component_iterator.h b/esphome/core/component_iterator.h index 2b847bc088..9e187f6c57 100644 --- a/esphome/core/component_iterator.h +++ b/esphome/core/component_iterator.h @@ -86,6 +86,9 @@ class ComponentIterator { #endif #ifdef USE_EVENT virtual bool on_event(event::Event *event) = 0; +#endif +#ifdef USE_UPDATE + virtual bool on_update(update::UpdateEntity *update) = 0; #endif virtual bool on_end(); @@ -158,6 +161,9 @@ class ComponentIterator { #endif #ifdef USE_EVENT EVENT, +#endif +#ifdef USE_UPDATE + UPDATE, #endif MAX, } state_{IteratorState::NONE}; diff --git a/esphome/core/controller.cpp b/esphome/core/controller.cpp index 0957329500..d6d98a4316 100644 --- a/esphome/core/controller.cpp +++ b/esphome/core/controller.cpp @@ -121,6 +121,12 @@ void Controller::setup_controller(bool include_internal) { obj->add_on_event_callback([this, obj](const std::string &event_type) { this->on_event(obj, event_type); }); } #endif +#ifdef USE_UPDATE + for (auto *obj : App.get_updates()) { + if (include_internal || !obj->is_internal()) + obj->add_on_state_callback([this, obj]() { this->on_update(obj); }); + } +#endif } } // namespace esphome diff --git a/esphome/core/controller.h b/esphome/core/controller.h index e1bf93193a..39e0b2ba26 100644 --- a/esphome/core/controller.h +++ b/esphome/core/controller.h @@ -61,6 +61,9 @@ #ifdef USE_EVENT #include "esphome/components/event/event.h" #endif +#ifdef USE_UPDATE +#include "esphome/components/update/update_entity.h" +#endif namespace esphome { @@ -124,6 +127,9 @@ class Controller { #ifdef USE_EVENT virtual void on_event(event::Event *obj, const std::string &event_type){}; #endif +#ifdef USE_UPDATE + virtual void on_update(update::UpdateEntity *obj){}; +#endif }; } // namespace esphome diff --git a/esphome/core/defines.h b/esphome/core/defines.h index affcd78089..1e6f3517db 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -59,6 +59,7 @@ #define USE_TIME #define USE_TOUCHSCREEN #define USE_UART_DEBUGGER +#define USE_UPDATE #define USE_VALVE #define USE_WIFI #define USE_WIFI_AP diff --git a/tests/components/http_request/common.yaml b/tests/components/http_request/common.yaml index 2b6996c0b9..83b334ca2d 100644 --- a/tests/components/http_request/common.yaml +++ b/tests/components/http_request/common.yaml @@ -73,3 +73,9 @@ button: url: http://my.ha.net:8123/local/esphome/firmware.bin - logger.log: "This message should be not displayed (reboot)" + +update: + - platform: http_request + name: OTA Update + id: ota_update + source: http://my.ha.net:8123/local/esphome/manifest.json diff --git a/tests/components/mqtt/common-update.yaml b/tests/components/mqtt/common-update.yaml new file mode 100644 index 0000000000..25f57cfef2 --- /dev/null +++ b/tests/components/mqtt/common-update.yaml @@ -0,0 +1,13 @@ +substitutions: + verify_ssl: "true" + +http_request: + verify_ssl: ${verify_ssl} + +ota: + - platform: http_request + +update: + - platform: http_request + name: "OTA Update" + source: https://example.com/ota.json diff --git a/tests/components/mqtt/test.esp32-c3-idf.yaml b/tests/components/mqtt/test.esp32-c3-idf.yaml index 25cb37a0b4..d19609b55e 100644 --- a/tests/components/mqtt/test.esp32-c3-idf.yaml +++ b/tests/components/mqtt/test.esp32-c3-idf.yaml @@ -1,2 +1,3 @@ packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/mqtt/test.esp32-c3.yaml b/tests/components/mqtt/test.esp32-c3.yaml index 25cb37a0b4..4c70fb37d9 100644 --- a/tests/components/mqtt/test.esp32-c3.yaml +++ b/tests/components/mqtt/test.esp32-c3.yaml @@ -1,2 +1,6 @@ +substitutions: + verify_ssl: "false" + packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/mqtt/test.esp32-idf.yaml b/tests/components/mqtt/test.esp32-idf.yaml index 25cb37a0b4..d19609b55e 100644 --- a/tests/components/mqtt/test.esp32-idf.yaml +++ b/tests/components/mqtt/test.esp32-idf.yaml @@ -1,2 +1,3 @@ packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/mqtt/test.esp32.yaml b/tests/components/mqtt/test.esp32.yaml index 25cb37a0b4..4c70fb37d9 100644 --- a/tests/components/mqtt/test.esp32.yaml +++ b/tests/components/mqtt/test.esp32.yaml @@ -1,2 +1,6 @@ +substitutions: + verify_ssl: "false" + packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/mqtt/test.esp8266.yaml b/tests/components/mqtt/test.esp8266.yaml index 25cb37a0b4..4c70fb37d9 100644 --- a/tests/components/mqtt/test.esp8266.yaml +++ b/tests/components/mqtt/test.esp8266.yaml @@ -1,2 +1,6 @@ +substitutions: + verify_ssl: "false" + packages: common: !include common.yaml + update: !include common-update.yaml diff --git a/tests/components/update/common.yaml b/tests/components/update/common.yaml new file mode 100644 index 0000000000..91b8669505 --- /dev/null +++ b/tests/components/update/common.yaml @@ -0,0 +1 @@ +update: diff --git a/tests/components/update/test.esp32-ard.yaml b/tests/components/update/test.esp32-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/update/test.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/update/test.esp32-idf.yaml b/tests/components/update/test.esp32-idf.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/update/test.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/update/test.esp8266.yaml b/tests/components/update/test.esp8266.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/update/test.esp8266.yaml @@ -0,0 +1 @@ +<<: !include common.yaml diff --git a/tests/components/update/test.rp2040.yaml b/tests/components/update/test.rp2040.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/update/test.rp2040.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From 1f8449ec0e56d7fe7f0cca999f7d87843403d76b Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Tue, 11 Jun 2024 15:38:26 -0700 Subject: [PATCH 007/233] [Dockerfile] Sync platformio version with requirements.txt (#6888) --- docker/Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 36be700f55..fcb5a5e7ae 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -81,7 +81,8 @@ RUN \ fi; \ pip3 install \ --break-system-packages --no-cache-dir \ - platformio==6.1.13 \ + # Keep platformio version in sync with requirements.txt + platformio==6.1.15 \ # Change some platformio settings && platformio settings set enable_telemetry No \ && platformio settings set check_platformio_interval 1000000 \ From 3a97244b8346bc4e1ca5eebcdccbfbde10f66a32 Mon Sep 17 00:00:00 2001 From: Anton Sergunov Date: Wed, 12 Jun 2024 04:42:20 +0600 Subject: [PATCH 008/233] [Deep sleep] Compilation error with IDF >= 5.* (#6879) --- esphome/components/deep_sleep/deep_sleep_component.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/esphome/components/deep_sleep/deep_sleep_component.h b/esphome/components/deep_sleep/deep_sleep_component.h index be56b529ba..7a640b9ea5 100644 --- a/esphome/components/deep_sleep/deep_sleep_component.h +++ b/esphome/components/deep_sleep/deep_sleep_component.h @@ -34,10 +34,12 @@ enum WakeupPinMode { WAKEUP_PIN_MODE_INVERT_WAKEUP, }; +#if defined(USE_ESP32) && !defined(USE_ESP32_VARIANT_ESP32C3) struct Ext1Wakeup { uint64_t mask; esp_sleep_ext1_wakeup_mode_t wakeup_mode; }; +#endif struct WakeupCauseToRunDuration { // Run duration if woken up by timer or any other reason besides those below. @@ -114,7 +116,11 @@ class DeepSleepComponent : public Component { #ifdef USE_ESP32 InternalGPIOPin *wakeup_pin_; WakeupPinMode wakeup_pin_mode_{WAKEUP_PIN_MODE_IGNORE}; + +#if !defined(USE_ESP32_VARIANT_ESP32C3) optional ext1_wakeup_; +#endif + optional touch_wakeup_; optional wakeup_cause_to_run_duration_; #endif From c723fd1f8077b1d113b1d166c6bd43c35bc648a8 Mon Sep 17 00:00:00 2001 From: Landon Rohatensky Date: Tue, 11 Jun 2024 15:56:27 -0700 Subject: [PATCH 009/233] [animation] Allow loading external url at build time (#6876) --- esphome/components/animation/__init__.py | 53 ++++++++++++++++++++++-- esphome/components/image/__init__.py | 6 +-- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/esphome/components/animation/__init__.py b/esphome/components/animation/__init__.py index a7a955bead..dbfc82c891 100644 --- a/esphome/components/animation/__init__.py +++ b/esphome/components/animation/__init__.py @@ -3,7 +3,13 @@ import logging from esphome import automation, core from esphome.components import font import esphome.components.image as espImage -from esphome.components.image import CONF_USE_TRANSPARENCY +from esphome.components.image import ( + CONF_USE_TRANSPARENCY, + LOCAL_SCHEMA, + WEB_SCHEMA, + SOURCE_WEB, + SOURCE_LOCAL, +) import esphome.config_validation as cv import esphome.codegen as cg from esphome.const import ( @@ -13,6 +19,9 @@ from esphome.const import ( CONF_REPEAT, CONF_RESIZE, CONF_TYPE, + CONF_SOURCE, + CONF_PATH, + CONF_URL, ) from esphome.core import CORE, HexInt @@ -43,6 +52,40 @@ SetFrameAction = animation_ns.class_( "AnimationSetFrameAction", automation.Action, cg.Parented.template(Animation_) ) +TYPED_FILE_SCHEMA = cv.typed_schema( + { + SOURCE_LOCAL: LOCAL_SCHEMA, + SOURCE_WEB: WEB_SCHEMA, + }, + key=CONF_SOURCE, +) + + +def _file_schema(value): + if isinstance(value, str): + return validate_file_shorthand(value) + return TYPED_FILE_SCHEMA(value) + + +FILE_SCHEMA = cv.Schema(_file_schema) + + +def validate_file_shorthand(value): + value = cv.string_strict(value) + if value.startswith("http://") or value.startswith("https://"): + return FILE_SCHEMA( + { + CONF_SOURCE: SOURCE_WEB, + CONF_URL: value, + } + ) + return FILE_SCHEMA( + { + CONF_SOURCE: SOURCE_LOCAL, + CONF_PATH: value, + } + ) + def validate_cross_dependencies(config): """ @@ -67,7 +110,7 @@ ANIMATION_SCHEMA = cv.Schema( cv.All( { cv.Required(CONF_ID): cv.declare_id(Animation_), - cv.Required(CONF_FILE): cv.file_, + cv.Required(CONF_FILE): FILE_SCHEMA, cv.Optional(CONF_RESIZE): cv.dimensions, cv.Optional(CONF_TYPE, default="BINARY"): cv.enum( espImage.IMAGE_TYPE, upper=True @@ -124,7 +167,11 @@ async def animation_action_to_code(config, action_id, template_arg, args): async def to_code(config): from PIL import Image - path = CORE.relative_config_path(config[CONF_FILE]) + conf_file = config[CONF_FILE] + if conf_file[CONF_SOURCE] == SOURCE_LOCAL: + path = CORE.relative_config_path(conf_file[CONF_PATH]) + elif conf_file[CONF_SOURCE] == SOURCE_WEB: + path = espImage.compute_local_image_path(conf_file).as_posix() try: image = Image.open(path) except Exception as e: diff --git a/esphome/components/image/__init__.py b/esphome/components/image/__init__.py index 73dc73aa45..b23ed3445a 100644 --- a/esphome/components/image/__init__.py +++ b/esphome/components/image/__init__.py @@ -68,7 +68,7 @@ def _compute_local_icon_path(value: dict) -> Path: return base_dir / f"{value[CONF_ICON]}.svg" -def _compute_local_image_path(value: dict) -> Path: +def compute_local_image_path(value: dict) -> Path: url = value[CONF_URL] h = hashlib.new("sha256") h.update(url.encode()) @@ -117,7 +117,7 @@ def download_mdi(value): def download_image(value): url = value[CONF_URL] - path = _compute_local_image_path(value) + path = compute_local_image_path(value) download_content(url, path) @@ -295,7 +295,7 @@ async def to_code(config): path = _compute_local_icon_path(conf_file).as_posix() elif conf_file[CONF_SOURCE] == SOURCE_WEB: - path = _compute_local_image_path(conf_file).as_posix() + path = compute_local_image_path(conf_file).as_posix() try: with open(path, "rb") as f: From a64106e48c47098999b7a52a683765cc18224ddd Mon Sep 17 00:00:00 2001 From: Peter Ericson Date: Wed, 12 Jun 2024 01:51:04 +0200 Subject: [PATCH 010/233] [waveshare_epaper] Add support for 13.3in-k (#6443) --- .../components/waveshare_epaper/display.py | 4 + .../waveshare_epaper/waveshare_epaper.cpp | 83 +++++++++++++++++++ .../waveshare_epaper/waveshare_epaper.h | 24 ++++++ 3 files changed, 111 insertions(+) diff --git a/esphome/components/waveshare_epaper/display.py b/esphome/components/waveshare_epaper/display.py index 9ad948e915..4d3965449f 100644 --- a/esphome/components/waveshare_epaper/display.py +++ b/esphome/components/waveshare_epaper/display.py @@ -94,6 +94,9 @@ WaveshareEPaper2P13InV2 = waveshare_epaper_ns.class_( WaveshareEPaper2P13InV3 = waveshare_epaper_ns.class_( "WaveshareEPaper2P13InV3", WaveshareEPaper ) +WaveshareEPaper13P3InK = waveshare_epaper_ns.class_( + "WaveshareEPaper13P3InK", WaveshareEPaper +) GDEW0154M09 = waveshare_epaper_ns.class_("GDEW0154M09", WaveshareEPaper) WaveshareEPaperTypeAModel = waveshare_epaper_ns.enum("WaveshareEPaperTypeAModel") @@ -133,6 +136,7 @@ MODELS = { "2.13in-ttgo-dke": ("c", WaveshareEPaper2P13InDKE), "2.13inv3": ("c", WaveshareEPaper2P13InV3), "1.54in-m5coreink-m09": ("c", GDEW0154M09), + "13.3in-k": ("b", WaveshareEPaper13P3InK), } RESET_PIN_REQUIRED_MODELS = ("2.13inv2", "2.13in-ttgo-b74") diff --git a/esphome/components/waveshare_epaper/waveshare_epaper.cpp b/esphome/components/waveshare_epaper/waveshare_epaper.cpp index 5428f4ec80..24df428e6f 100644 --- a/esphome/components/waveshare_epaper/waveshare_epaper.cpp +++ b/esphome/components/waveshare_epaper/waveshare_epaper.cpp @@ -2963,5 +2963,88 @@ void WaveshareEPaper2P13InDKE::set_full_update_every(uint32_t full_update_every) this->full_update_every_ = full_update_every; } +// ======================================================== +// 13.3in (K version) +// Datasheet/Specification/Reference: +// - https://files.waveshare.com/wiki/13.3inch-e-Paper-HAT-(K)/13.3-inch-e-Paper-(K)-user-manual.pdf +// - https://github.com/waveshareteam/e-Paper/tree/master/Arduino/epd13in3k +// ======================================================== + +// using default wait_until_idle_() function +void WaveshareEPaper13P3InK::initialize() { + this->wait_until_idle_(); + this->command(0x12); // SWRESET + this->wait_until_idle_(); + + this->command(0x0c); // set soft start + this->data(0xae); + this->data(0xc7); + this->data(0xc3); + this->data(0xc0); + this->data(0x80); + + this->command(0x01); // driver output control + this->data((get_height_internal() - 1) % 256); // Y + this->data((get_height_internal() - 1) / 256); // Y + this->data(0x00); + + this->command(0x11); // data entry mode + this->data(0x03); + + // SET WINDOWS + // XRAM_START_AND_END_POSITION + this->command(0x44); + this->data(0 & 0xFF); + this->data((0 >> 8) & 0x03); + this->data((get_width_internal() - 1) & 0xFF); + this->data(((get_width_internal() - 1) >> 8) & 0x03); + // YRAM_START_AND_END_POSITION + this->command(0x45); + this->data(0 & 0xFF); + this->data((0 >> 8) & 0x03); + this->data((get_height_internal() - 1) & 0xFF); + this->data(((get_height_internal() - 1) >> 8) & 0x03); + + this->command(0x3C); // Border setting + this->data(0x01); + + this->command(0x18); // use the internal temperature sensor + this->data(0x80); + + // SET CURSOR + // XRAM_ADDRESS + this->command(0x4E); + this->data(0 & 0xFF); + this->data((0 >> 8) & 0x03); + // YRAM_ADDRESS + this->command(0x4F); + this->data(0 & 0xFF); + this->data((0 >> 8) & 0x03); +} +void HOT WaveshareEPaper13P3InK::display() { + // do single full update + this->command(0x24); + this->start_data_(); + this->write_array(this->buffer_, this->get_buffer_length_()); + this->end_data_(); + + // COMMAND DISPLAY REFRESH + this->command(0x22); + this->data(0xF7); + this->command(0x20); +} + +int WaveshareEPaper13P3InK::get_width_internal() { return 960; } +int WaveshareEPaper13P3InK::get_height_internal() { return 680; } +uint32_t WaveshareEPaper13P3InK::idle_timeout_() { return 10000; } +void WaveshareEPaper13P3InK::dump_config() { + LOG_DISPLAY("", "Waveshare E-Paper", this); + ESP_LOGCONFIG(TAG, " Model: 13.3inK"); + LOG_PIN(" Reset Pin: ", this->reset_pin_); + LOG_PIN(" DC Pin: ", this->dc_pin_); + LOG_PIN(" Busy Pin: ", this->busy_pin_); + LOG_UPDATE_INTERVAL(this); +} + } // namespace waveshare_epaper } // namespace esphome diff --git a/esphome/components/waveshare_epaper/waveshare_epaper.h b/esphome/components/waveshare_epaper/waveshare_epaper.h index 4a5844ae88..7572982a20 100644 --- a/esphome/components/waveshare_epaper/waveshare_epaper.h +++ b/esphome/components/waveshare_epaper/waveshare_epaper.h @@ -163,6 +163,7 @@ enum WaveshareEPaperTypeBModel { WAVESHARE_EPAPER_7_5_IN, WAVESHARE_EPAPER_7_5_INV2, WAVESHARE_EPAPER_7_5_IN_B_V2, + WAVESHARE_EPAPER_13_3_IN_K, }; class WaveshareEPaper2P7In : public WaveshareEPaper { @@ -769,5 +770,28 @@ class WaveshareEPaper2P13InV3 : public WaveshareEPaper { bool is_busy_{false}; void write_lut_(const uint8_t *lut); }; + +class WaveshareEPaper13P3InK : public WaveshareEPaper { + public: + void initialize() override; + + void display() override; + + void dump_config() override; + + void deep_sleep() override { + // COMMAND DEEP SLEEP + this->command(0x10); + this->data(0x01); + } + + protected: + int get_width_internal() override; + + int get_height_internal() override; + + uint32_t idle_timeout_() override; +}; + } // namespace waveshare_epaper } // namespace esphome From 562700bd2c4014d8caf224cdeb45ae3969dcc7a4 Mon Sep 17 00:00:00 2001 From: Daniel D'Abate Date: Wed, 12 Jun 2024 02:04:25 +0200 Subject: [PATCH 011/233] Climate IR LG - Support fan only mode and all "on" commands (#3712) --- .../climate_ir_lg/climate_ir_lg.cpp | 187 ++++++++++-------- .../components/climate_ir_lg/climate_ir_lg.h | 2 +- 2 files changed, 102 insertions(+), 87 deletions(-) diff --git a/esphome/components/climate_ir_lg/climate_ir_lg.cpp b/esphome/components/climate_ir_lg/climate_ir_lg.cpp index d2199c1cbe..c65f24ebc0 100644 --- a/esphome/components/climate_ir_lg/climate_ir_lg.cpp +++ b/esphome/components/climate_ir_lg/climate_ir_lg.cpp @@ -6,18 +6,24 @@ namespace climate_ir_lg { static const char *const TAG = "climate.climate_ir_lg"; -const uint32_t COMMAND_ON = 0x00000; -const uint32_t COMMAND_ON_AI = 0x03000; -const uint32_t COMMAND_COOL = 0x08000; -const uint32_t COMMAND_HEAT = 0x0C000; +// Commands +const uint32_t COMMAND_MASK = 0xFF000; const uint32_t COMMAND_OFF = 0xC0000; const uint32_t COMMAND_SWING = 0x10000; -// On, 25C, Mode: Auto, Fan: Auto, Zone Follow: Off, Sensor Temp: Ignore. -const uint32_t COMMAND_AUTO = 0x0B000; -const uint32_t COMMAND_DRY_FAN = 0x09000; -const uint32_t COMMAND_MASK = 0xFF000; +const uint32_t COMMAND_ON_COOL = 0x00000; +const uint32_t COMMAND_ON_DRY = 0x01000; +const uint32_t COMMAND_ON_FAN_ONLY = 0x02000; +const uint32_t COMMAND_ON_AI = 0x03000; +const uint32_t COMMAND_ON_HEAT = 0x04000; +const uint32_t COMMAND_COOL = 0x08000; +const uint32_t COMMAND_DRY = 0x09000; +const uint32_t COMMAND_FAN_ONLY = 0x0A000; +const uint32_t COMMAND_AI = 0x0B000; +const uint32_t COMMAND_HEAT = 0x0C000; + +// Fan speed const uint32_t FAN_MASK = 0xF0; const uint32_t FAN_AUTO = 0x50; const uint32_t FAN_MIN = 0x00; @@ -35,69 +41,67 @@ void LgIrClimate::transmit_state() { uint32_t remote_state = 0x8800000; // ESP_LOGD(TAG, "climate_lg_ir mode_before_ code: 0x%02X", modeBefore_); + + // Set command if (send_swing_cmd_) { send_swing_cmd_ = false; remote_state |= COMMAND_SWING; } else { - if (mode_before_ == climate::CLIMATE_MODE_OFF && this->mode == climate::CLIMATE_MODE_HEAT_COOL) { - remote_state |= COMMAND_ON_AI; - } else if (mode_before_ == climate::CLIMATE_MODE_OFF && this->mode != climate::CLIMATE_MODE_OFF) { - remote_state |= COMMAND_ON; - this->mode = climate::CLIMATE_MODE_COOL; - } else { - switch (this->mode) { - case climate::CLIMATE_MODE_COOL: - remote_state |= COMMAND_COOL; - break; - case climate::CLIMATE_MODE_HEAT: - remote_state |= COMMAND_HEAT; - break; - case climate::CLIMATE_MODE_HEAT_COOL: - remote_state |= COMMAND_AUTO; - break; - case climate::CLIMATE_MODE_DRY: - remote_state |= COMMAND_DRY_FAN; - break; - case climate::CLIMATE_MODE_OFF: - default: - remote_state |= COMMAND_OFF; - break; - } - } - mode_before_ = this->mode; - - ESP_LOGD(TAG, "climate_lg_ir mode code: 0x%02X", this->mode); - - if (this->mode == climate::CLIMATE_MODE_OFF) { - remote_state |= FAN_AUTO; - } else if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_DRY || - this->mode == climate::CLIMATE_MODE_HEAT) { - switch (this->fan_mode.value()) { - case climate::CLIMATE_FAN_HIGH: - remote_state |= FAN_MAX; - break; - case climate::CLIMATE_FAN_MEDIUM: - remote_state |= FAN_MED; - break; - case climate::CLIMATE_FAN_LOW: - remote_state |= FAN_MIN; - break; - case climate::CLIMATE_FAN_AUTO: - default: - remote_state |= FAN_AUTO; - break; - } - } - - if (this->mode == climate::CLIMATE_MODE_HEAT_COOL) { - this->fan_mode = climate::CLIMATE_FAN_AUTO; - // remote_state |= FAN_MODE_AUTO_DRY; - } - if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT) { - auto temp = (uint8_t) roundf(clamp(this->target_temperature, TEMP_MIN, TEMP_MAX)); - remote_state |= ((temp - 15) << TEMP_SHIFT); + bool climate_is_off = (mode_before_ == climate::CLIMATE_MODE_OFF); + switch (this->mode) { + case climate::CLIMATE_MODE_COOL: + remote_state |= climate_is_off ? COMMAND_ON_COOL : COMMAND_COOL; + break; + case climate::CLIMATE_MODE_DRY: + remote_state |= climate_is_off ? COMMAND_ON_DRY : COMMAND_DRY; + break; + case climate::CLIMATE_MODE_FAN_ONLY: + remote_state |= climate_is_off ? COMMAND_ON_FAN_ONLY : COMMAND_FAN_ONLY; + break; + case climate::CLIMATE_MODE_HEAT_COOL: + remote_state |= climate_is_off ? COMMAND_ON_AI : COMMAND_AI; + break; + case climate::CLIMATE_MODE_HEAT: + remote_state |= climate_is_off ? COMMAND_ON_HEAT : COMMAND_HEAT; + break; + case climate::CLIMATE_MODE_OFF: + default: + remote_state |= COMMAND_OFF; + break; } } + + mode_before_ = this->mode; + + ESP_LOGD(TAG, "climate_lg_ir mode code: 0x%02X", this->mode); + + // Set fan speed + if (this->mode == climate::CLIMATE_MODE_OFF) { + remote_state |= FAN_AUTO; + } else { + switch (this->fan_mode.value()) { + case climate::CLIMATE_FAN_HIGH: + remote_state |= FAN_MAX; + break; + case climate::CLIMATE_FAN_MEDIUM: + remote_state |= FAN_MED; + break; + case climate::CLIMATE_FAN_LOW: + remote_state |= FAN_MIN; + break; + case climate::CLIMATE_FAN_AUTO: + default: + remote_state |= FAN_AUTO; + break; + } + } + + // Set temperature + if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT) { + auto temp = (uint8_t) roundf(clamp(this->target_temperature, TEMP_MIN, TEMP_MAX)); + remote_state |= ((temp - 15) << TEMP_SHIFT); + } + transmit_(remote_state); this->publish_state(); } @@ -125,37 +129,42 @@ bool LgIrClimate::on_receive(remote_base::RemoteReceiveData data) { if ((remote_state & 0xFF00000) != 0x8800000) return false; - if ((remote_state & COMMAND_MASK) == COMMAND_ON) { - this->mode = climate::CLIMATE_MODE_COOL; - } else if ((remote_state & COMMAND_MASK) == COMMAND_ON_AI) { - this->mode = climate::CLIMATE_MODE_HEAT_COOL; - } - + // Get command if ((remote_state & COMMAND_MASK) == COMMAND_OFF) { this->mode = climate::CLIMATE_MODE_OFF; } else if ((remote_state & COMMAND_MASK) == COMMAND_SWING) { this->swing_mode = this->swing_mode == climate::CLIMATE_SWING_OFF ? climate::CLIMATE_SWING_VERTICAL : climate::CLIMATE_SWING_OFF; } else { - if ((remote_state & COMMAND_MASK) == COMMAND_AUTO) { - this->mode = climate::CLIMATE_MODE_HEAT_COOL; - } else if ((remote_state & COMMAND_MASK) == COMMAND_DRY_FAN) { - this->mode = climate::CLIMATE_MODE_DRY; - } else if ((remote_state & COMMAND_MASK) == COMMAND_HEAT) { - this->mode = climate::CLIMATE_MODE_HEAT; - } else { - this->mode = climate::CLIMATE_MODE_COOL; + switch (remote_state & COMMAND_MASK) { + case COMMAND_DRY: + case COMMAND_ON_DRY: + this->mode = climate::CLIMATE_MODE_DRY; + break; + case COMMAND_FAN_ONLY: + case COMMAND_ON_FAN_ONLY: + this->mode = climate::CLIMATE_MODE_FAN_ONLY; + break; + case COMMAND_AI: + case COMMAND_ON_AI: + this->mode = climate::CLIMATE_MODE_HEAT_COOL; + break; + case COMMAND_HEAT: + case COMMAND_ON_HEAT: + this->mode = climate::CLIMATE_MODE_HEAT; + break; + case COMMAND_COOL: + case COMMAND_ON_COOL: + default: + this->mode = climate::CLIMATE_MODE_COOL; + break; } - // Temperature - if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT) - this->target_temperature = ((remote_state & TEMP_MASK) >> TEMP_SHIFT) + 15; - - // Fan Speed + // Get fan speed if (this->mode == climate::CLIMATE_MODE_HEAT_COOL) { this->fan_mode = climate::CLIMATE_FAN_AUTO; - } else if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT || - this->mode == climate::CLIMATE_MODE_DRY) { + } else if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_DRY || + this->mode == climate::CLIMATE_MODE_FAN_ONLY || this->mode == climate::CLIMATE_MODE_HEAT) { if ((remote_state & FAN_MASK) == FAN_AUTO) { this->fan_mode = climate::CLIMATE_FAN_AUTO; } else if ((remote_state & FAN_MASK) == FAN_MIN) { @@ -166,11 +175,17 @@ bool LgIrClimate::on_receive(remote_base::RemoteReceiveData data) { this->fan_mode = climate::CLIMATE_FAN_HIGH; } } + + // Get temperature + if (this->mode == climate::CLIMATE_MODE_COOL || this->mode == climate::CLIMATE_MODE_HEAT) { + this->target_temperature = ((remote_state & TEMP_MASK) >> TEMP_SHIFT) + 15; + } } this->publish_state(); return true; } + void LgIrClimate::transmit_(uint32_t value) { calc_checksum_(value); ESP_LOGD(TAG, "Sending climate_lg_ir code: 0x%02" PRIX32, value); diff --git a/esphome/components/climate_ir_lg/climate_ir_lg.h b/esphome/components/climate_ir_lg/climate_ir_lg.h index 34f50744ef..7ee041b86f 100644 --- a/esphome/components/climate_ir_lg/climate_ir_lg.h +++ b/esphome/components/climate_ir_lg/climate_ir_lg.h @@ -14,7 +14,7 @@ const uint8_t TEMP_MAX = 30; // Celsius class LgIrClimate : public climate_ir::ClimateIR { public: LgIrClimate() - : climate_ir::ClimateIR(TEMP_MIN, TEMP_MAX, 1.0f, true, false, + : climate_ir::ClimateIR(TEMP_MIN, TEMP_MAX, 1.0f, true, true, {climate::CLIMATE_FAN_AUTO, climate::CLIMATE_FAN_LOW, climate::CLIMATE_FAN_MEDIUM, climate::CLIMATE_FAN_HIGH}, {climate::CLIMATE_SWING_OFF, climate::CLIMATE_SWING_VERTICAL}) {} From 7b60543afd02960058e2cff58c70acebf68acc57 Mon Sep 17 00:00:00 2001 From: NMartin354 Date: Tue, 11 Jun 2024 19:38:20 -0500 Subject: [PATCH 012/233] [safe_mode] Allow user-defined interval for successful boot (#6882) Co-authored-by: Keith Burzinski --- esphome/components/safe_mode/__init__.py | 8 +++++++- esphome/components/safe_mode/safe_mode.cpp | 8 ++++++-- esphome/components/safe_mode/safe_mode.h | 13 +++++++------ tests/components/safe_mode/common.yaml | 1 + 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/esphome/components/safe_mode/__init__.py b/esphome/components/safe_mode/__init__.py index 92b285e279..881937890d 100644 --- a/esphome/components/safe_mode/__init__.py +++ b/esphome/components/safe_mode/__init__.py @@ -16,6 +16,7 @@ from esphome import automation CODEOWNERS = ["@paulmonigatti", "@jsuanet", "@kbx81"] +CONF_BOOT_IS_GOOD_AFTER = "boot_is_good_after" CONF_ON_SAFE_MODE = "on_safe_mode" safe_mode_ns = cg.esphome_ns.namespace("safe_mode") @@ -34,6 +35,9 @@ CONFIG_SCHEMA = cv.All( cv.Schema( { cv.GenerateID(): cv.declare_id(SafeModeComponent), + cv.Optional( + CONF_BOOT_IS_GOOD_AFTER, default="1min" + ): cv.positive_time_period_milliseconds, cv.Optional(CONF_DISABLED, default=False): cv.boolean, cv.Optional(CONF_NUM_ATTEMPTS, default="10"): cv.positive_not_null_int, cv.Optional( @@ -63,7 +67,9 @@ async def to_code(config): await automation.build_automation(trigger, [], conf) condition = var.should_enter_safe_mode( - config[CONF_NUM_ATTEMPTS], config[CONF_REBOOT_TIMEOUT] + config[CONF_NUM_ATTEMPTS], + config[CONF_REBOOT_TIMEOUT], + config[CONF_BOOT_IS_GOOD_AFTER], ) cg.add(RawExpression(f"if ({condition}) return")) CORE.data[CONF_SAFE_MODE] = {} diff --git a/esphome/components/safe_mode/safe_mode.cpp b/esphome/components/safe_mode/safe_mode.cpp index 6934dcb9d9..aa1a4b6822 100644 --- a/esphome/components/safe_mode/safe_mode.cpp +++ b/esphome/components/safe_mode/safe_mode.cpp @@ -16,6 +16,8 @@ static const char *const TAG = "safe_mode"; void SafeModeComponent::dump_config() { ESP_LOGCONFIG(TAG, "Safe Mode:"); + ESP_LOGCONFIG(TAG, " Boot considered successful after %" PRIu32 " seconds", + this->safe_mode_boot_is_good_after_ / 1000); // because milliseconds ESP_LOGCONFIG(TAG, " Invoke after %u boot attempts", this->safe_mode_num_attempts_); ESP_LOGCONFIG(TAG, " Remain in safe mode for %" PRIu32 " seconds", this->safe_mode_enable_time_ / 1000); // because milliseconds @@ -34,7 +36,7 @@ void SafeModeComponent::dump_config() { float SafeModeComponent::get_setup_priority() const { return setup_priority::AFTER_WIFI; } void SafeModeComponent::loop() { - if (!this->boot_successful_ && (millis() - this->safe_mode_start_time_) > this->safe_mode_enable_time_) { + 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(); @@ -60,9 +62,11 @@ bool SafeModeComponent::get_safe_mode_pending() { return this->read_rtc_() == SafeModeComponent::ENTER_SAFE_MODE_MAGIC; } -bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time) { +bool SafeModeComponent::should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time, + uint32_t boot_is_good_after) { this->safe_mode_start_time_ = millis(); this->safe_mode_enable_time_ = enable_time; + this->safe_mode_boot_is_good_after_ = boot_is_good_after; this->safe_mode_num_attempts_ = num_attempts; this->rtc_ = global_preferences->make_preference(233825507UL, false); this->safe_mode_rtc_value_ = this->read_rtc_(); diff --git a/esphome/components/safe_mode/safe_mode.h b/esphome/components/safe_mode/safe_mode.h index 0ec3c29529..37e2c3a3d6 100644 --- a/esphome/components/safe_mode/safe_mode.h +++ b/esphome/components/safe_mode/safe_mode.h @@ -11,7 +11,7 @@ namespace safe_mode { /// SafeModeComponent provides a safe way to recover from repeated boot failures class SafeModeComponent : public Component { public: - bool should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time); + bool should_enter_safe_mode(uint8_t num_attempts, uint32_t enable_time, uint32_t boot_is_good_after); /// Set to true if the next startup will enter safe mode void set_safe_mode_pending(const bool &pending); @@ -33,11 +33,12 @@ class SafeModeComponent : public Component { void write_rtc_(uint32_t val); uint32_t read_rtc_(); - bool boot_successful_{false}; ///< set to true after boot is considered successful - uint32_t safe_mode_start_time_; ///< stores when safe mode was enabled - uint32_t safe_mode_enable_time_{60000}; ///< The time safe mode should remain active for - uint32_t safe_mode_rtc_value_; - uint8_t safe_mode_num_attempts_; + bool boot_successful_{false}; ///< set to true after boot is considered successful + uint32_t safe_mode_boot_is_good_after_{60000}; ///< The amount of time after which the boot is considered successful + uint32_t safe_mode_enable_time_{60000}; ///< The time safe mode should remain active for + uint32_t safe_mode_rtc_value_{0}; + uint32_t safe_mode_start_time_{0}; ///< stores when safe mode was enabled + uint8_t safe_mode_num_attempts_{0}; ESPPreferenceObject rtc_; CallbackManager safe_mode_callback_{}; diff --git a/tests/components/safe_mode/common.yaml b/tests/components/safe_mode/common.yaml index ce8bf2f0cf..c24f49e6b6 100644 --- a/tests/components/safe_mode/common.yaml +++ b/tests/components/safe_mode/common.yaml @@ -3,6 +3,7 @@ wifi: password: password1 safe_mode: + boot_is_good_after: 2min num_attempts: 3 reboot_timeout: 2min on_safe_mode: From 13fabf1cd8eae9fe783a9a83b5d4665b66c5b180 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Tue, 11 Jun 2024 18:05:44 -0700 Subject: [PATCH 013/233] change to new 1-wire platform (#6860) Co-authored-by: Samuel Sieb Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- CODEOWNERS | 3 + esphome/components/dallas/__init__.py | 24 +- .../components/dallas/dallas_component.cpp | 287 ------------------ esphome/components/dallas/dallas_component.h | 79 ----- esphome/components/dallas/esp_one_wire.cpp | 252 --------------- esphome/components/dallas/esp_one_wire.h | 68 ----- esphome/components/dallas/sensor.py | 51 +--- esphome/components/dallas_temp/__init__.py | 1 + .../components/dallas_temp/dallas_temp.cpp | 172 +++++++++++ esphome/components/dallas_temp/dallas_temp.h | 32 ++ esphome/components/dallas_temp/sensor.py | 43 +++ esphome/components/gpio/one_wire/__init__.py | 25 ++ .../gpio/one_wire/gpio_one_wire.cpp | 199 ++++++++++++ .../components/gpio/one_wire/gpio_one_wire.h | 41 +++ esphome/components/one_wire/__init__.py | 40 +++ esphome/components/one_wire/one_wire.cpp | 40 +++ esphome/components/one_wire/one_wire.h | 44 +++ esphome/components/one_wire/one_wire_bus.cpp | 88 ++++++ esphome/components/one_wire/one_wire_bus.h | 61 ++++ script/ci-custom.py | 3 +- .../{dallas => dallas_temp}/common.yaml | 10 +- .../test.esp32-c3-idf.yaml | 0 .../test.esp32-c3.yaml | 0 .../test.esp32-idf.yaml | 0 .../{dallas => dallas_temp}/test.esp32.yaml | 0 .../{dallas => dallas_temp}/test.esp8266.yaml | 0 .../{dallas => dallas_temp}/test.rp2040.yaml | 0 tests/test1.yaml | 12 - 28 files changed, 802 insertions(+), 773 deletions(-) delete mode 100644 esphome/components/dallas/dallas_component.cpp delete mode 100644 esphome/components/dallas/dallas_component.h delete mode 100644 esphome/components/dallas/esp_one_wire.cpp delete mode 100644 esphome/components/dallas/esp_one_wire.h create mode 100644 esphome/components/dallas_temp/__init__.py create mode 100644 esphome/components/dallas_temp/dallas_temp.cpp create mode 100644 esphome/components/dallas_temp/dallas_temp.h create mode 100644 esphome/components/dallas_temp/sensor.py create mode 100644 esphome/components/gpio/one_wire/__init__.py create mode 100644 esphome/components/gpio/one_wire/gpio_one_wire.cpp create mode 100644 esphome/components/gpio/one_wire/gpio_one_wire.h create mode 100644 esphome/components/one_wire/__init__.py create mode 100644 esphome/components/one_wire/one_wire.cpp create mode 100644 esphome/components/one_wire/one_wire.h create mode 100644 esphome/components/one_wire/one_wire_bus.cpp create mode 100644 esphome/components/one_wire/one_wire_bus.h rename tests/components/{dallas => dallas_temp}/common.yaml (55%) rename tests/components/{dallas => dallas_temp}/test.esp32-c3-idf.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.esp32-c3.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.esp32-idf.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.esp32.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.esp8266.yaml (100%) rename tests/components/{dallas => dallas_temp}/test.rp2040.yaml (100%) diff --git a/CODEOWNERS b/CODEOWNERS index bbb39c26ad..75ea4fe523 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -94,6 +94,7 @@ esphome/components/current_based/* @djwmarcx esphome/components/dac7678/* @NickB1 esphome/components/daikin_arc/* @MagicBear esphome/components/daikin_brc/* @hagak +esphome/components/dallas_temp/* @ssieb esphome/components/daly_bms/* @s1lvi0 esphome/components/dashboard_import/* @esphome/core esphome/components/datetime/* @jesserockz @rfdarter @@ -144,6 +145,7 @@ esphome/components/gdk101/* @Szewcson esphome/components/globals/* @esphome/core esphome/components/gp8403/* @jesserockz esphome/components/gpio/* @esphome/core +esphome/components/gpio/one_wire/* @ssieb esphome/components/gps/* @coogle esphome/components/graph/* @synco esphome/components/graphical_display_menu/* @MrMDavidson @@ -270,6 +272,7 @@ esphome/components/nextion/text_sensor/* @senexcrenshaw esphome/components/nfc/* @jesserockz @kbx81 esphome/components/noblex/* @AGalfra esphome/components/number/* @esphome/core +esphome/components/one_wire/* @ssieb esphome/components/ota/* @esphome/core esphome/components/output/* @esphome/core esphome/components/pca6416a/* @Mat931 diff --git a/esphome/components/dallas/__init__.py b/esphome/components/dallas/__init__.py index 0f71399a7c..6c2a9d830e 100644 --- a/esphome/components/dallas/__init__.py +++ b/esphome/components/dallas/__init__.py @@ -1,25 +1,7 @@ -import esphome.codegen as cg import esphome.config_validation as cv -from esphome import pins -from esphome.const import CONF_ID, CONF_PIN MULTI_CONF = True -AUTO_LOAD = ["sensor"] -dallas_ns = cg.esphome_ns.namespace("dallas") -DallasComponent = dallas_ns.class_("DallasComponent", cg.PollingComponent) - -CONFIG_SCHEMA = cv.Schema( - { - cv.GenerateID(): cv.declare_id(DallasComponent), - cv.Required(CONF_PIN): pins.internal_gpio_output_pin_schema, - } -).extend(cv.polling_component_schema("60s")) - - -async def to_code(config): - var = cg.new_Pvariable(config[CONF_ID]) - await cg.register_component(var, config) - - pin = await cg.gpio_pin_expression(config[CONF_PIN]) - cg.add(var.set_pin(pin)) +CONFIG_SCHEMA = cv.invalid( + 'The "dallas" component has been replaced by the "one_wire" component.\nhttps://esphome.io/components/one_wire' +) diff --git a/esphome/components/dallas/dallas_component.cpp b/esphome/components/dallas/dallas_component.cpp deleted file mode 100644 index a51bc369a1..0000000000 --- a/esphome/components/dallas/dallas_component.cpp +++ /dev/null @@ -1,287 +0,0 @@ -#include "dallas_component.h" -#include "esphome/core/log.h" - -namespace esphome { -namespace dallas { - -static const char *const TAG = "dallas.sensor"; - -static const uint8_t DALLAS_MODEL_DS18S20 = 0x10; -static const uint8_t DALLAS_MODEL_DS1822 = 0x22; -static const uint8_t DALLAS_MODEL_DS18B20 = 0x28; -static const uint8_t DALLAS_MODEL_DS1825 = 0x3B; -static const uint8_t DALLAS_MODEL_DS28EA00 = 0x42; -static const uint8_t DALLAS_COMMAND_START_CONVERSION = 0x44; -static const uint8_t DALLAS_COMMAND_READ_SCRATCH_PAD = 0xBE; -static const uint8_t DALLAS_COMMAND_WRITE_SCRATCH_PAD = 0x4E; - -uint16_t DallasTemperatureSensor::millis_to_wait_for_conversion() const { - switch (this->resolution_) { - case 9: - return 94; - case 10: - return 188; - case 11: - return 375; - default: - return 750; - } -} - -void DallasComponent::setup() { - ESP_LOGCONFIG(TAG, "Setting up DallasComponent..."); - - pin_->setup(); - - // clear bus with 480µs high, otherwise initial reset in search_vec() fails - pin_->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); - delayMicroseconds(480); - - one_wire_ = new ESPOneWire(pin_); // NOLINT(cppcoreguidelines-owning-memory) - - std::vector raw_sensors; - raw_sensors = this->one_wire_->search_vec(); - - for (auto &address : raw_sensors) { - auto *address8 = reinterpret_cast(&address); - if (crc8(address8, 7) != address8[7]) { - ESP_LOGW(TAG, "Dallas device 0x%s has invalid CRC.", format_hex(address).c_str()); - continue; - } - if (address8[0] != DALLAS_MODEL_DS18S20 && address8[0] != DALLAS_MODEL_DS1822 && - address8[0] != DALLAS_MODEL_DS18B20 && address8[0] != DALLAS_MODEL_DS1825 && - address8[0] != DALLAS_MODEL_DS28EA00) { - ESP_LOGW(TAG, "Unknown device type 0x%02X.", address8[0]); - continue; - } - this->found_sensors_.push_back(address); - } - - for (auto *sensor : this->sensors_) { - if (sensor->get_index().has_value()) { - if (*sensor->get_index() >= this->found_sensors_.size()) { - this->status_set_error("Sensor configured by index but not found"); - continue; - } - sensor->set_address(this->found_sensors_[*sensor->get_index()]); - } - - if (!sensor->setup_sensor()) { - this->status_set_error(); - } - } -} -void DallasComponent::dump_config() { - ESP_LOGCONFIG(TAG, "DallasComponent:"); - LOG_PIN(" Pin: ", this->pin_); - LOG_UPDATE_INTERVAL(this); - - if (this->found_sensors_.empty()) { - ESP_LOGW(TAG, " Found no sensors!"); - } else { - ESP_LOGD(TAG, " Found sensors:"); - for (auto &address : this->found_sensors_) { - ESP_LOGD(TAG, " 0x%s", format_hex(address).c_str()); - } - } - - for (auto *sensor : this->sensors_) { - LOG_SENSOR(" ", "Device", sensor); - if (sensor->get_index().has_value()) { - ESP_LOGCONFIG(TAG, " Index %u", *sensor->get_index()); - if (*sensor->get_index() >= this->found_sensors_.size()) { - ESP_LOGE(TAG, "Couldn't find sensor by index - not connected. Proceeding without it."); - continue; - } - } - ESP_LOGCONFIG(TAG, " Address: %s", sensor->get_address_name().c_str()); - ESP_LOGCONFIG(TAG, " Resolution: %u", sensor->get_resolution()); - } -} - -void DallasComponent::register_sensor(DallasTemperatureSensor *sensor) { this->sensors_.push_back(sensor); } -void DallasComponent::update() { - this->status_clear_warning(); - - bool result; - { - InterruptLock lock; - result = this->one_wire_->reset(); - } - if (!result) { - if (!this->found_sensors_.empty()) { - // Only log error if at the start sensors were found (and thus are disconnected during uptime) - ESP_LOGE(TAG, "Requesting conversion failed"); - this->status_set_warning(); - } - - for (auto *sensor : this->sensors_) { - sensor->publish_state(NAN); - } - return; - } - - { - InterruptLock lock; - this->one_wire_->skip(); - this->one_wire_->write8(DALLAS_COMMAND_START_CONVERSION); - } - - for (auto *sensor : this->sensors_) { - if (sensor->get_address() == 0) { - ESP_LOGV(TAG, "'%s' - Indexed sensor not found at startup, skipping update", sensor->get_name().c_str()); - sensor->publish_state(NAN); - continue; - } - - this->set_timeout(sensor->get_address_name(), sensor->millis_to_wait_for_conversion(), [this, sensor] { - bool res = sensor->read_scratch_pad(); - - if (!res) { - ESP_LOGW(TAG, "'%s' - Resetting bus for read failed!", sensor->get_name().c_str()); - sensor->publish_state(NAN); - this->status_set_warning(); - return; - } - if (!sensor->check_scratch_pad()) { - sensor->publish_state(NAN); - this->status_set_warning(); - return; - } - - float tempc = sensor->get_temp_c(); - ESP_LOGD(TAG, "'%s': Got Temperature=%.1f°C", sensor->get_name().c_str(), tempc); - sensor->publish_state(tempc); - }); - } -} - -void DallasTemperatureSensor::set_address(uint64_t address) { this->address_ = address; } -uint8_t DallasTemperatureSensor::get_resolution() const { return this->resolution_; } -void DallasTemperatureSensor::set_resolution(uint8_t resolution) { this->resolution_ = resolution; } -optional DallasTemperatureSensor::get_index() const { return this->index_; } -void DallasTemperatureSensor::set_index(uint8_t index) { this->index_ = index; } -uint8_t *DallasTemperatureSensor::get_address8() { return reinterpret_cast(&this->address_); } -uint64_t DallasTemperatureSensor::get_address() { return this->address_; } - -const std::string &DallasTemperatureSensor::get_address_name() { - if (this->address_name_.empty()) { - this->address_name_ = std::string("0x") + format_hex(this->address_); - } - - return this->address_name_; -} -bool IRAM_ATTR DallasTemperatureSensor::read_scratch_pad() { - auto *wire = this->parent_->one_wire_; - - { - InterruptLock lock; - - if (!wire->reset()) { - return false; - } - - wire->select(this->address_); - wire->write8(DALLAS_COMMAND_READ_SCRATCH_PAD); - - for (unsigned char &i : this->scratch_pad_) { - i = wire->read8(); - } - } - - return true; -} -bool DallasTemperatureSensor::setup_sensor() { - bool r = this->read_scratch_pad(); - - if (!r) { - ESP_LOGE(TAG, "Reading scratchpad failed: reset"); - return false; - } - if (!this->check_scratch_pad()) - return false; - - if (this->scratch_pad_[4] == this->resolution_) - return false; - - if (this->get_address8()[0] == DALLAS_MODEL_DS18S20) { - // DS18S20 doesn't support resolution. - ESP_LOGW(TAG, "DS18S20 doesn't support setting resolution."); - return false; - } - - switch (this->resolution_) { - case 12: - this->scratch_pad_[4] = 0x7F; - break; - case 11: - this->scratch_pad_[4] = 0x5F; - break; - case 10: - this->scratch_pad_[4] = 0x3F; - break; - case 9: - default: - this->scratch_pad_[4] = 0x1F; - break; - } - - auto *wire = this->parent_->one_wire_; - { - InterruptLock lock; - if (wire->reset()) { - wire->select(this->address_); - wire->write8(DALLAS_COMMAND_WRITE_SCRATCH_PAD); - wire->write8(this->scratch_pad_[2]); // high alarm temp - wire->write8(this->scratch_pad_[3]); // low alarm temp - wire->write8(this->scratch_pad_[4]); // resolution - wire->reset(); - - // write value to EEPROM - wire->select(this->address_); - wire->write8(0x48); - } - } - - delay(20); // allow it to finish operation - wire->reset(); - return true; -} -bool DallasTemperatureSensor::check_scratch_pad() { - bool chksum_validity = (crc8(this->scratch_pad_, 8) == this->scratch_pad_[8]); - bool config_validity = false; - - switch (this->get_address8()[0]) { - case DALLAS_MODEL_DS18B20: - config_validity = ((this->scratch_pad_[4] & 0x9F) == 0x1F); - break; - default: - config_validity = ((this->scratch_pad_[4] & 0x10) == 0x10); - } - -#ifdef ESPHOME_LOG_LEVEL_VERY_VERBOSE - ESP_LOGVV(TAG, "Scratch pad: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X (%02X)", this->scratch_pad_[0], - this->scratch_pad_[1], this->scratch_pad_[2], this->scratch_pad_[3], this->scratch_pad_[4], - this->scratch_pad_[5], this->scratch_pad_[6], this->scratch_pad_[7], this->scratch_pad_[8], - crc8(this->scratch_pad_, 8)); -#endif - if (!chksum_validity) { - ESP_LOGW(TAG, "'%s' - Scratch pad checksum invalid!", this->get_name().c_str()); - } else if (!config_validity) { - ESP_LOGW(TAG, "'%s' - Scratch pad config register invalid!", this->get_name().c_str()); - } - return chksum_validity && config_validity; -} -float DallasTemperatureSensor::get_temp_c() { - int16_t temp = (int16_t(this->scratch_pad_[1]) << 11) | (int16_t(this->scratch_pad_[0]) << 3); - if (this->get_address8()[0] == DALLAS_MODEL_DS18S20) { - int diff = (this->scratch_pad_[7] - this->scratch_pad_[6]) << 7; - temp = ((temp & 0xFFF0) << 3) - 16 + (diff / this->scratch_pad_[7]); - } - - return temp / 128.0f; -} -std::string DallasTemperatureSensor::unique_id() { return "dallas-" + str_lower_case(format_hex(this->address_)); } - -} // namespace dallas -} // namespace esphome diff --git a/esphome/components/dallas/dallas_component.h b/esphome/components/dallas/dallas_component.h deleted file mode 100644 index 10bde7338b..0000000000 --- a/esphome/components/dallas/dallas_component.h +++ /dev/null @@ -1,79 +0,0 @@ -#pragma once - -#include "esphome/core/component.h" -#include "esphome/components/sensor/sensor.h" -#include "esp_one_wire.h" - -#include - -namespace esphome { -namespace dallas { - -class DallasTemperatureSensor; - -class DallasComponent : public PollingComponent { - public: - void set_pin(InternalGPIOPin *pin) { pin_ = pin; } - void register_sensor(DallasTemperatureSensor *sensor); - - void setup() override; - void dump_config() override; - float get_setup_priority() const override { return setup_priority::DATA; } - - void update() override; - - protected: - friend DallasTemperatureSensor; - - InternalGPIOPin *pin_; - ESPOneWire *one_wire_; - std::vector sensors_; - std::vector found_sensors_; -}; - -/// Internal class that helps us create multiple sensors for one Dallas hub. -class DallasTemperatureSensor : public sensor::Sensor { - public: - void set_parent(DallasComponent *parent) { parent_ = parent; } - /// Helper to get a pointer to the address as uint8_t. - uint8_t *get_address8(); - uint64_t get_address(); - /// Helper to create (and cache) the name for this sensor. For example "0xfe0000031f1eaf29". - const std::string &get_address_name(); - - /// Set the 64-bit unsigned address for this sensor. - void set_address(uint64_t address); - /// Get the index of this sensor. (0 if using address.) - optional get_index() const; - /// Set the index of this sensor. If using index, address will be set after setup. - void set_index(uint8_t index); - /// Get the set resolution for this sensor. - uint8_t get_resolution() const; - /// Set the resolution for this sensor. - void set_resolution(uint8_t resolution); - /// Get the number of milliseconds we have to wait for the conversion phase. - uint16_t millis_to_wait_for_conversion() const; - - bool setup_sensor(); - bool read_scratch_pad(); - - bool check_scratch_pad(); - - float get_temp_c(); - - std::string unique_id() override; - - protected: - DallasComponent *parent_; - uint64_t address_; - optional index_; - - uint8_t resolution_; - std::string address_name_; - uint8_t scratch_pad_[9] = { - 0, - }; -}; - -} // namespace dallas -} // namespace esphome diff --git a/esphome/components/dallas/esp_one_wire.cpp b/esphome/components/dallas/esp_one_wire.cpp deleted file mode 100644 index 32ddf07fb6..0000000000 --- a/esphome/components/dallas/esp_one_wire.cpp +++ /dev/null @@ -1,252 +0,0 @@ -#include "esp_one_wire.h" -#include "esphome/core/log.h" -#include "esphome/core/helpers.h" - -namespace esphome { -namespace dallas { - -static const char *const TAG = "dallas.one_wire"; - -const uint8_t ONE_WIRE_ROM_SELECT = 0x55; -const int ONE_WIRE_ROM_SEARCH = 0xF0; - -ESPOneWire::ESPOneWire(InternalGPIOPin *pin) { pin_ = pin->to_isr(); } - -bool HOT IRAM_ATTR ESPOneWire::reset() { - // See reset here: - // https://www.maximintegrated.com/en/design/technical-documents/app-notes/1/126.html - // Wait for communication to clear (delay G) - pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); - uint8_t retries = 125; - do { - if (--retries == 0) - return false; - delayMicroseconds(2); - } while (!pin_.digital_read()); - - // Send 480µs LOW TX reset pulse (drive bus low, delay H) - pin_.pin_mode(gpio::FLAG_OUTPUT); - pin_.digital_write(false); - delayMicroseconds(480); - - // Release the bus, delay I - pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); - delayMicroseconds(70); - - // sample bus, 0=device(s) present, 1=no device present - bool r = !pin_.digital_read(); - // delay J - delayMicroseconds(410); - return r; -} - -void HOT IRAM_ATTR ESPOneWire::write_bit(bool bit) { - // drive bus low - pin_.pin_mode(gpio::FLAG_OUTPUT); - pin_.digital_write(false); - - // from datasheet: - // write 0 low time: t_low0: min=60µs, max=120µs - // write 1 low time: t_low1: min=1µs, max=15µs - // time slot: t_slot: min=60µs, max=120µs - // recovery time: t_rec: min=1µs - // ds18b20 appears to read the bus after roughly 14µs - uint32_t delay0 = bit ? 6 : 60; - uint32_t delay1 = bit ? 54 : 5; - - // delay A/C - delayMicroseconds(delay0); - // release bus - pin_.digital_write(true); - // delay B/D - delayMicroseconds(delay1); -} - -bool HOT IRAM_ATTR ESPOneWire::read_bit() { - // drive bus low - pin_.pin_mode(gpio::FLAG_OUTPUT); - pin_.digital_write(false); - - // note: for reading we'll need very accurate timing, as the - // timing for the digital_read() is tight; according to the datasheet, - // we should read at the end of 16µs starting from the bus low - // typically, the ds18b20 pulls the line high after 11µs for a logical 1 - // and 29µs for a logical 0 - - uint32_t start = micros(); - // datasheet says >1µs - delayMicroseconds(3); - - // release bus, delay E - pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); - - // Unfortunately some frameworks have different characteristics than others - // esp32 arduino appears to pull the bus low only after the digital_write(false), - // whereas on esp-idf it already happens during the pin_mode(OUTPUT) - // manually correct for this with these constants. - -#ifdef USE_ESP32 - uint32_t timing_constant = 12; -#else - uint32_t timing_constant = 14; -#endif - - // measure from start value directly, to get best accurate timing no matter - // how long pin_mode/delayMicroseconds took - while (micros() - start < timing_constant) - ; - - // sample bus to read bit from peer - bool r = pin_.digital_read(); - - // read slot is at least 60µs; get as close to 60µs to spend less time with interrupts locked - uint32_t now = micros(); - if (now - start < 60) - delayMicroseconds(60 - (now - start)); - - return r; -} - -void IRAM_ATTR ESPOneWire::write8(uint8_t val) { - for (uint8_t i = 0; i < 8; i++) { - this->write_bit(bool((1u << i) & val)); - } -} - -void IRAM_ATTR ESPOneWire::write64(uint64_t val) { - for (uint8_t i = 0; i < 64; i++) { - this->write_bit(bool((1ULL << i) & val)); - } -} - -uint8_t IRAM_ATTR ESPOneWire::read8() { - uint8_t ret = 0; - for (uint8_t i = 0; i < 8; i++) { - ret |= (uint8_t(this->read_bit()) << i); - } - return ret; -} -uint64_t IRAM_ATTR ESPOneWire::read64() { - uint64_t ret = 0; - for (uint8_t i = 0; i < 8; i++) { - ret |= (uint64_t(this->read_bit()) << i); - } - return ret; -} -void IRAM_ATTR ESPOneWire::select(uint64_t address) { - this->write8(ONE_WIRE_ROM_SELECT); - this->write64(address); -} -void IRAM_ATTR ESPOneWire::reset_search() { - this->last_discrepancy_ = 0; - this->last_device_flag_ = false; - this->rom_number_ = 0; -} -uint64_t IRAM_ATTR ESPOneWire::search() { - if (this->last_device_flag_) { - return 0u; - } - - { - InterruptLock lock; - if (!this->reset()) { - // Reset failed or no devices present - this->reset_search(); - return 0u; - } - } - - uint8_t id_bit_number = 1; - uint8_t last_zero = 0; - uint8_t rom_byte_number = 0; - bool search_result = false; - uint8_t rom_byte_mask = 1; - - { - InterruptLock lock; - // Initiate search - this->write8(ONE_WIRE_ROM_SEARCH); - do { - // read bit - bool id_bit = this->read_bit(); - // read its complement - bool cmp_id_bit = this->read_bit(); - - if (id_bit && cmp_id_bit) { - // No devices participating in search - break; - } - - bool branch; - - if (id_bit != cmp_id_bit) { - // only chose one branch, the other one doesn't have any devices. - branch = id_bit; - } else { - // there are devices with both 0s and 1s at this bit - if (id_bit_number < this->last_discrepancy_) { - branch = (this->rom_number8_()[rom_byte_number] & rom_byte_mask) > 0; - } else { - branch = id_bit_number == this->last_discrepancy_; - } - - if (!branch) { - last_zero = id_bit_number; - } - } - - if (branch) { - // set bit - this->rom_number8_()[rom_byte_number] |= rom_byte_mask; - } else { - // clear bit - this->rom_number8_()[rom_byte_number] &= ~rom_byte_mask; - } - - // choose/announce branch - this->write_bit(branch); - id_bit_number++; - rom_byte_mask <<= 1; - if (rom_byte_mask == 0u) { - // go to next byte - rom_byte_number++; - rom_byte_mask = 1; - } - } while (rom_byte_number < 8); // loop through all bytes - } - - if (id_bit_number >= 65) { - this->last_discrepancy_ = last_zero; - if (this->last_discrepancy_ == 0) { - // we're at root and have no choices left, so this was the last one. - this->last_device_flag_ = true; - } - search_result = true; - } - - search_result = search_result && (this->rom_number8_()[0] != 0); - if (!search_result) { - this->reset_search(); - return 0u; - } - - return this->rom_number_; -} -std::vector ESPOneWire::search_vec() { - std::vector res; - - this->reset_search(); - uint64_t address; - while ((address = this->search()) != 0u) - res.push_back(address); - - return res; -} -void IRAM_ATTR ESPOneWire::skip() { - this->write8(0xCC); // skip ROM -} - -uint8_t IRAM_ATTR *ESPOneWire::rom_number8_() { return reinterpret_cast(&this->rom_number_); } - -} // namespace dallas -} // namespace esphome diff --git a/esphome/components/dallas/esp_one_wire.h b/esphome/components/dallas/esp_one_wire.h deleted file mode 100644 index 7544a6fe98..0000000000 --- a/esphome/components/dallas/esp_one_wire.h +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include "esphome/core/hal.h" -#include - -namespace esphome { -namespace dallas { - -extern const uint8_t ONE_WIRE_ROM_SELECT; -extern const int ONE_WIRE_ROM_SEARCH; - -class ESPOneWire { - public: - explicit ESPOneWire(InternalGPIOPin *pin); - - /** Reset the bus, should be done before all write operations. - * - * Takes approximately 1ms. - * - * @return Whether the operation was successful. - */ - bool reset(); - - /// Write a single bit to the bus, takes about 70µs. - void write_bit(bool bit); - - /// Read a single bit from the bus, takes about 70µs - bool read_bit(); - - /// Write a word to the bus. LSB first. - void write8(uint8_t val); - - /// Write a 64 bit unsigned integer to the bus. LSB first. - void write64(uint64_t val); - - /// Write a command to the bus that addresses all devices by skipping the ROM. - void skip(); - - /// Read an 8 bit word from the bus. - uint8_t read8(); - - /// Read an 64-bit unsigned integer from the bus. - uint64_t read64(); - - /// Select a specific address on the bus for the following command. - void select(uint64_t address); - - /// Reset the device search. - void reset_search(); - - /// Search for a 1-Wire device on the bus. Returns 0 if all devices have been found. - uint64_t search(); - - /// Helper that wraps search in a std::vector. - std::vector search_vec(); - - protected: - /// Helper to get the internal 64-bit unsigned rom number as a 8-bit integer pointer. - inline uint8_t *rom_number8_(); - - ISRInternalGPIOPin pin_; - uint8_t last_discrepancy_{0}; - bool last_device_flag_{false}; - uint64_t rom_number_{0}; -}; - -} // namespace dallas -} // namespace esphome diff --git a/esphome/components/dallas/sensor.py b/esphome/components/dallas/sensor.py index c6ebda62c8..69f8fc3b9e 100644 --- a/esphome/components/dallas/sensor.py +++ b/esphome/components/dallas/sensor.py @@ -1,50 +1,5 @@ -import esphome.codegen as cg import esphome.config_validation as cv -from esphome.components import sensor -from esphome.const import ( - CONF_ADDRESS, - CONF_DALLAS_ID, - CONF_INDEX, - CONF_RESOLUTION, - DEVICE_CLASS_TEMPERATURE, - STATE_CLASS_MEASUREMENT, - UNIT_CELSIUS, + +CONFIG_SCHEMA = cv.invalid( + 'The "dallas" sensor is now "dallas_temp"\nhttps://esphome.io/components/sensor/dallas_temp' ) -from . import DallasComponent, dallas_ns - -DallasTemperatureSensor = dallas_ns.class_("DallasTemperatureSensor", sensor.Sensor) - -CONFIG_SCHEMA = cv.All( - sensor.sensor_schema( - DallasTemperatureSensor, - unit_of_measurement=UNIT_CELSIUS, - accuracy_decimals=1, - device_class=DEVICE_CLASS_TEMPERATURE, - state_class=STATE_CLASS_MEASUREMENT, - ).extend( - { - cv.GenerateID(CONF_DALLAS_ID): cv.use_id(DallasComponent), - cv.Optional(CONF_ADDRESS): cv.hex_uint64_t, - cv.Optional(CONF_INDEX): cv.positive_int, - cv.Optional(CONF_RESOLUTION, default=12): cv.int_range(min=9, max=12), - } - ), - cv.has_exactly_one_key(CONF_ADDRESS, CONF_INDEX), -) - - -async def to_code(config): - hub = await cg.get_variable(config[CONF_DALLAS_ID]) - var = await sensor.new_sensor(config) - - if CONF_ADDRESS in config: - cg.add(var.set_address(config[CONF_ADDRESS])) - else: - cg.add(var.set_index(config[CONF_INDEX])) - - if CONF_RESOLUTION in config: - cg.add(var.set_resolution(config[CONF_RESOLUTION])) - - cg.add(var.set_parent(hub)) - - cg.add(hub.register_sensor(var)) diff --git a/esphome/components/dallas_temp/__init__.py b/esphome/components/dallas_temp/__init__.py new file mode 100644 index 0000000000..3f73044ca8 --- /dev/null +++ b/esphome/components/dallas_temp/__init__.py @@ -0,0 +1 @@ +CODEOWNERS = ["@ssieb"] diff --git a/esphome/components/dallas_temp/dallas_temp.cpp b/esphome/components/dallas_temp/dallas_temp.cpp new file mode 100644 index 0000000000..fe7c9a95ea --- /dev/null +++ b/esphome/components/dallas_temp/dallas_temp.cpp @@ -0,0 +1,172 @@ +#include "dallas_temp.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace dallas_temp { + +static const char *const TAG = "dallas.temp.sensor"; + +static const uint8_t DALLAS_MODEL_DS18S20 = 0x10; +static const uint8_t DALLAS_COMMAND_START_CONVERSION = 0x44; +static const uint8_t DALLAS_COMMAND_READ_SCRATCH_PAD = 0xBE; +static const uint8_t DALLAS_COMMAND_WRITE_SCRATCH_PAD = 0x4E; +static const uint8_t DALLAS_COMMAND_COPY_SCRATCH_PAD = 0x48; + +uint16_t DallasTemperatureSensor::millis_to_wait_for_conversion_() const { + switch (this->resolution_) { + case 9: + return 94; + case 10: + return 188; + case 11: + return 375; + default: + return 750; + } +} + +void DallasTemperatureSensor::dump_config() { + ESP_LOGCONFIG(TAG, "Dallas Temperature Sensor:"); + if (this->address_ == 0) { + ESP_LOGW(TAG, " Unable to select an address"); + return; + } + LOG_ONE_WIRE_DEVICE(this); + ESP_LOGCONFIG(TAG, " Resolution: %u bits", this->resolution_); + LOG_UPDATE_INTERVAL(this); +} + +void DallasTemperatureSensor::update() { + if (this->address_ == 0) + return; + + this->status_clear_warning(); + + this->send_command_(DALLAS_COMMAND_START_CONVERSION); + + this->set_timeout(this->get_address_name(), this->millis_to_wait_for_conversion_(), [this] { + if (!this->read_scratch_pad_() || !this->check_scratch_pad_()) { + this->publish_state(NAN); + return; + } + + float tempc = this->get_temp_c_(); + ESP_LOGD(TAG, "'%s': Got Temperature=%.1f°C", this->get_name().c_str(), tempc); + this->publish_state(tempc); + }); +} + +void IRAM_ATTR DallasTemperatureSensor::read_scratch_pad_int_() { + for (uint8_t &i : this->scratch_pad_) { + i = this->bus_->read8(); + } +} + +bool DallasTemperatureSensor::read_scratch_pad_() { + bool success; + { + InterruptLock lock; + success = this->send_command_(DALLAS_COMMAND_READ_SCRATCH_PAD); + if (success) + this->read_scratch_pad_int_(); + } + if (!success) { + ESP_LOGW(TAG, "'%s' - reading scratch pad failed bus reset", this->get_name().c_str()); + this->status_set_warning("bus reset failed"); + } + return success; +} + +void DallasTemperatureSensor::setup() { + ESP_LOGCONFIG(TAG, "setting up Dallas temperature sensor..."); + if (!this->check_address_()) + return; + if (!this->read_scratch_pad_()) + return; + if (!this->check_scratch_pad_()) + return; + + if ((this->address_ & 0xff) == DALLAS_MODEL_DS18S20) { + // DS18S20 doesn't support resolution. + ESP_LOGW(TAG, "DS18S20 doesn't support setting resolution."); + return; + } + + uint8_t res; + switch (this->resolution_) { + case 12: + res = 0x7F; + break; + case 11: + res = 0x5F; + break; + case 10: + res = 0x3F; + break; + case 9: + default: + res = 0x1F; + break; + } + + if (this->scratch_pad_[4] == res) + return; + this->scratch_pad_[4] = res; + + { + InterruptLock lock; + if (this->send_command_(DALLAS_COMMAND_WRITE_SCRATCH_PAD)) { + this->bus_->write8(this->scratch_pad_[2]); // high alarm temp + this->bus_->write8(this->scratch_pad_[3]); // low alarm temp + this->bus_->write8(this->scratch_pad_[4]); // resolution + } + + // write value to EEPROM + this->send_command_(DALLAS_COMMAND_COPY_SCRATCH_PAD); + } +} + +bool DallasTemperatureSensor::check_scratch_pad_() { + bool chksum_validity = (crc8(this->scratch_pad_, 8) == this->scratch_pad_[8]); + +#ifdef ESPHOME_LOG_LEVEL_VERY_VERBOSE + ESP_LOGVV(TAG, "Scratch pad: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X (%02X)", this->scratch_pad_[0], + this->scratch_pad_[1], this->scratch_pad_[2], this->scratch_pad_[3], this->scratch_pad_[4], + this->scratch_pad_[5], this->scratch_pad_[6], this->scratch_pad_[7], this->scratch_pad_[8], + crc8(this->scratch_pad_, 8)); +#endif + if (!chksum_validity) { + ESP_LOGW(TAG, "'%s' - Scratch pad checksum invalid!", this->get_name().c_str()); + this->status_set_warning("scratch pad checksum invalid"); + } + return chksum_validity; +} + +float DallasTemperatureSensor::get_temp_c_() { + int16_t temp = (this->scratch_pad_[1] << 8) | this->scratch_pad_[0]; + if ((this->address_ & 0xff) == DALLAS_MODEL_DS18S20) { + if (this->scratch_pad_[7] != 0x10) + ESP_LOGE(TAG, "unexpected COUNT_PER_C value: %u", this->scratch_pad_[7]); + temp = ((temp & 0xfff7) << 3) + (0x10 - this->scratch_pad_[6]) - 4; + } else { + switch (this->resolution_) { + case 9: + temp &= 0xfff8; + break; + case 10: + temp &= 0xfffc; + break; + case 11: + temp &= 0xfffe; + break; + case 12: + default: + break; + } + } + + return temp / 16.0f; +} + +} // namespace dallas_temp +} // namespace esphome diff --git a/esphome/components/dallas_temp/dallas_temp.h b/esphome/components/dallas_temp/dallas_temp.h new file mode 100644 index 0000000000..604c9d0cd7 --- /dev/null +++ b/esphome/components/dallas_temp/dallas_temp.h @@ -0,0 +1,32 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/components/sensor/sensor.h" +#include "esphome/components/one_wire/one_wire.h" + +namespace esphome { +namespace dallas_temp { + +class DallasTemperatureSensor : public PollingComponent, public sensor::Sensor, public one_wire::OneWireDevice { + public: + void setup() override; + void update() override; + void dump_config() override; + + /// Set the resolution for this sensor. + void set_resolution(uint8_t resolution) { this->resolution_ = resolution; } + + protected: + uint8_t resolution_; + uint8_t scratch_pad_[9] = {0}; + + /// Get the number of milliseconds we have to wait for the conversion phase. + uint16_t millis_to_wait_for_conversion_() const; + bool read_scratch_pad_(); + void read_scratch_pad_int_(); + bool check_scratch_pad_(); + float get_temp_c_(); +}; + +} // namespace dallas_temp +} // namespace esphome diff --git a/esphome/components/dallas_temp/sensor.py b/esphome/components/dallas_temp/sensor.py new file mode 100644 index 0000000000..ab14a9afd5 --- /dev/null +++ b/esphome/components/dallas_temp/sensor.py @@ -0,0 +1,43 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import one_wire, sensor +from esphome.const import ( + CONF_RESOLUTION, + DEVICE_CLASS_TEMPERATURE, + STATE_CLASS_MEASUREMENT, + UNIT_CELSIUS, +) + +dallas_temp_ns = cg.esphome_ns.namespace("dallas_temp") + +DallasTemperatureSensor = dallas_temp_ns.class_( + "DallasTemperatureSensor", + cg.PollingComponent, + sensor.Sensor, + one_wire.OneWireDevice, +) + +CONFIG_SCHEMA = ( + sensor.sensor_schema( + DallasTemperatureSensor, + unit_of_measurement=UNIT_CELSIUS, + accuracy_decimals=1, + device_class=DEVICE_CLASS_TEMPERATURE, + state_class=STATE_CLASS_MEASUREMENT, + ) + .extend( + { + cv.Optional(CONF_RESOLUTION, default=12): cv.int_range(min=9, max=12), + } + ) + .extend(one_wire.one_wire_device_schema()) + .extend(cv.polling_component_schema("60s")) +) + + +async def to_code(config): + var = await sensor.new_sensor(config) + await cg.register_component(var, config) + await one_wire.register_one_wire_device(var, config) + + cg.add(var.set_resolution(config[CONF_RESOLUTION])) diff --git a/esphome/components/gpio/one_wire/__init__.py b/esphome/components/gpio/one_wire/__init__.py new file mode 100644 index 0000000000..2166e92083 --- /dev/null +++ b/esphome/components/gpio/one_wire/__init__.py @@ -0,0 +1,25 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome import pins +from esphome.const import CONF_ID, CONF_PIN +from esphome.components.one_wire import OneWireBus +from .. import gpio_ns + +CODEOWNERS = ["@ssieb"] + +GPIOOneWireBus = gpio_ns.class_("GPIOOneWireBus", OneWireBus, cg.Component) + +CONFIG_SCHEMA = cv.Schema( + { + cv.GenerateID(): cv.declare_id(GPIOOneWireBus), + cv.Required(CONF_PIN): pins.internal_gpio_output_pin_schema, + } +).extend(cv.COMPONENT_SCHEMA) + + +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) + + pin = await cg.gpio_pin_expression(config[CONF_PIN]) + cg.add(var.set_pin(pin)) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp new file mode 100644 index 0000000000..f47e8d58e3 --- /dev/null +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -0,0 +1,199 @@ +#include "gpio_one_wire.h" +#include "esphome/core/log.h" +#include "esphome/core/helpers.h" + +namespace esphome { +namespace gpio { + +static const char *const TAG = "gpio.one_wire"; + +void GPIOOneWireBus::setup() { + ESP_LOGCONFIG(TAG, "Setting up 1-wire bus..."); + this->search(); +} + +void GPIOOneWireBus::dump_config() { + ESP_LOGCONFIG(TAG, "GPIO 1-wire bus:"); + LOG_PIN(" Pin: ", this->t_pin_); + this->dump_devices_(TAG); +} + +bool HOT IRAM_ATTR GPIOOneWireBus::reset() { + // See reset here: + // https://www.maximintegrated.com/en/design/technical-documents/app-notes/1/126.html + // Wait for communication to clear (delay G) + pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + uint8_t retries = 125; + do { + if (--retries == 0) + return false; + delayMicroseconds(2); + } while (!pin_.digital_read()); + + bool r; + + // Send 480µs LOW TX reset pulse (drive bus low, delay H) + pin_.pin_mode(gpio::FLAG_OUTPUT); + pin_.digital_write(false); + delayMicroseconds(480); + + // Release the bus, delay I + pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + delayMicroseconds(70); + + // sample bus, 0=device(s) present, 1=no device present + r = !pin_.digital_read(); + // delay J + delayMicroseconds(410); + return r; +} + +void HOT IRAM_ATTR GPIOOneWireBus::write_bit_(bool bit) { + // drive bus low + pin_.pin_mode(gpio::FLAG_OUTPUT); + pin_.digital_write(false); + + // from datasheet: + // write 0 low time: t_low0: min=60µs, max=120µs + // write 1 low time: t_low1: min=1µs, max=15µs + // time slot: t_slot: min=60µs, max=120µs + // recovery time: t_rec: min=1µs + // ds18b20 appears to read the bus after roughly 14µs + uint32_t delay0 = bit ? 6 : 60; + uint32_t delay1 = bit ? 54 : 5; + + // delay A/C + delayMicroseconds(delay0); + // release bus + pin_.digital_write(true); + // delay B/D + delayMicroseconds(delay1); +} + +bool HOT IRAM_ATTR GPIOOneWireBus::read_bit_() { + // drive bus low + pin_.pin_mode(gpio::FLAG_OUTPUT); + pin_.digital_write(false); + + // note: for reading we'll need very accurate timing, as the + // timing for the digital_read() is tight; according to the datasheet, + // we should read at the end of 16µs starting from the bus low + // typically, the ds18b20 pulls the line high after 11µs for a logical 1 + // and 29µs for a logical 0 + + uint32_t start = micros(); + // datasheet says >1µs + delayMicroseconds(2); + + // release bus, delay E + pin_.pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + + // measure from start value directly, to get best accurate timing no matter + // how long pin_mode/delayMicroseconds took + delayMicroseconds(12 - (micros() - start)); + + // sample bus to read bit from peer + bool r = pin_.digital_read(); + + // read slot is at least 60µs; get as close to 60µs to spend less time with interrupts locked + uint32_t now = micros(); + if (now - start < 60) + delayMicroseconds(60 - (now - start)); + + return r; +} + +void IRAM_ATTR GPIOOneWireBus::write8(uint8_t val) { + for (uint8_t i = 0; i < 8; i++) { + this->write_bit_(bool((1u << i) & val)); + } +} + +void IRAM_ATTR GPIOOneWireBus::write64(uint64_t val) { + for (uint8_t i = 0; i < 64; i++) { + this->write_bit_(bool((1ULL << i) & val)); + } +} + +uint8_t IRAM_ATTR GPIOOneWireBus::read8() { + uint8_t ret = 0; + for (uint8_t i = 0; i < 8; i++) { + ret |= (uint8_t(this->read_bit_()) << i); + } + return ret; +} + +uint64_t IRAM_ATTR GPIOOneWireBus::read64() { + uint64_t ret = 0; + for (uint8_t i = 0; i < 8; i++) { + ret |= (uint64_t(this->read_bit_()) << i); + } + return ret; +} + +void GPIOOneWireBus::reset_search() { + this->last_discrepancy_ = 0; + this->last_device_flag_ = false; + this->address_ = 0; +} + +uint64_t IRAM_ATTR GPIOOneWireBus::search_int() { + if (this->last_device_flag_) + return 0u; + + uint8_t last_zero = 0; + uint64_t bit_mask = 1; + uint64_t address = this->address_; + + // Initiate search + for (int bit_number = 1; bit_number <= 64; bit_number++, bit_mask <<= 1) { + // read bit + bool id_bit = this->read_bit_(); + // read its complement + bool cmp_id_bit = this->read_bit_(); + + if (id_bit && cmp_id_bit) { + // No devices participating in search + return 0; + } + + bool branch; + + if (id_bit != cmp_id_bit) { + // only chose one branch, the other one doesn't have any devices. + branch = id_bit; + } else { + // there are devices with both 0s and 1s at this bit + if (bit_number < this->last_discrepancy_) { + branch = (address & bit_mask) > 0; + } else { + branch = bit_number == this->last_discrepancy_; + } + + if (!branch) { + last_zero = bit_number; + } + } + + if (branch) { + address |= bit_mask; + } else { + address &= ~bit_mask; + } + + // choose/announce branch + this->write_bit_(branch); + } + + this->last_discrepancy_ = last_zero; + if (this->last_discrepancy_ == 0) { + // we're at root and have no choices left, so this was the last one. + this->last_device_flag_ = true; + } + + this->address_ = address; + return address; +} + +} // namespace gpio +} // namespace esphome diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.h b/esphome/components/gpio/one_wire/gpio_one_wire.h new file mode 100644 index 0000000000..fe949baec3 --- /dev/null +++ b/esphome/components/gpio/one_wire/gpio_one_wire.h @@ -0,0 +1,41 @@ +#pragma once + +#include "esphome/core/component.h" +#include "esphome/core/hal.h" +#include "esphome/components/one_wire/one_wire.h" + +namespace esphome { +namespace gpio { + +class GPIOOneWireBus : public one_wire::OneWireBus, public Component { + public: + void setup() override; + void dump_config() override; + float get_setup_priority() const override { return setup_priority::BUS; } + + void set_pin(InternalGPIOPin *pin) { + this->t_pin_ = pin; + this->pin_ = pin->to_isr(); + } + + bool reset() override; + void write8(uint8_t val) override; + void write64(uint64_t val) override; + uint8_t read8() override; + uint64_t read64() override; + + protected: + InternalGPIOPin *t_pin_; + ISRInternalGPIOPin pin_; + uint8_t last_discrepancy_{0}; + bool last_device_flag_{false}; + uint64_t address_; + + void reset_search() override; + uint64_t search_int() override; + void write_bit_(bool bit); + bool read_bit_(); +}; + +} // namespace gpio +} // namespace esphome diff --git a/esphome/components/one_wire/__init__.py b/esphome/components/one_wire/__init__.py new file mode 100644 index 0000000000..99a1ccd1eb --- /dev/null +++ b/esphome/components/one_wire/__init__.py @@ -0,0 +1,40 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_ADDRESS + +CODEOWNERS = ["@ssieb"] + +IS_PLATFORM_COMPONENT = True + +CONF_ONE_WIRE_ID = "one_wire_id" + +one_wire_ns = cg.esphome_ns.namespace("one_wire") +OneWireBus = one_wire_ns.class_("OneWireBus") +OneWireDevice = one_wire_ns.class_("OneWireDevice") + + +def one_wire_device_schema(): + """Create a schema for a 1-wire device. + + :return: The 1-wire device schema, `extend` this in your config schema. + """ + schema = cv.Schema( + { + cv.GenerateID(CONF_ONE_WIRE_ID): cv.use_id(OneWireBus), + cv.Optional(CONF_ADDRESS): cv.hex_uint64_t, + } + ) + return schema + + +async def register_one_wire_device(var, config): + """Register an 1-wire device with the given config. + + Sets the 1-wire bus to use and the 1-wire address. + + This is a coroutine, you need to await it with a 'yield' expression! + """ + parent = await cg.get_variable(config[CONF_ONE_WIRE_ID]) + cg.add(var.set_one_wire_bus(parent)) + if (address := config.get(CONF_ADDRESS)) is not None: + cg.add(var.set_address(address)) diff --git a/esphome/components/one_wire/one_wire.cpp b/esphome/components/one_wire/one_wire.cpp new file mode 100644 index 0000000000..131bc4fbfe --- /dev/null +++ b/esphome/components/one_wire/one_wire.cpp @@ -0,0 +1,40 @@ +#include "one_wire.h" + +namespace esphome { +namespace one_wire { + +static const char *const TAG = "one_wire"; + +const std::string &OneWireDevice::get_address_name() { + if (this->address_name_.empty()) + this->address_name_ = std::string("0x") + format_hex(this->address_); + return this->address_name_; +} + +std::string OneWireDevice::unique_id() { return "dallas-" + str_lower_case(format_hex(this->address_)); } + +bool OneWireDevice::send_command_(uint8_t cmd) { + if (!this->bus_->select(this->address_)) + return false; + this->bus_->write8(cmd); + return true; +} + +bool OneWireDevice::check_address_() { + if (this->address_ != 0) + return true; + auto devices = this->bus_->get_devices(); + if (devices.empty()) { + ESP_LOGE(TAG, "No devices, can't auto-select address"); + return false; + } + if (devices.size() > 1) { + ESP_LOGE(TAG, "More than one device, can't auto-select address"); + return false; + } + this->address_ = devices[0]; + return true; +} + +} // namespace one_wire +} // namespace esphome diff --git a/esphome/components/one_wire/one_wire.h b/esphome/components/one_wire/one_wire.h new file mode 100644 index 0000000000..bf10e4f82e --- /dev/null +++ b/esphome/components/one_wire/one_wire.h @@ -0,0 +1,44 @@ +#pragma once + +#include "one_wire_bus.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace one_wire { + +#define LOG_ONE_WIRE_DEVICE(this) \ + ESP_LOGCONFIG(TAG, " Address: %s (%s)", this->get_address_name().c_str(), \ + LOG_STR_ARG(this->bus_->get_model_str(this->address_ & 0xff))); + +class OneWireDevice { + public: + /// @brief store the address of the device + /// @param address of the device + void set_address(uint64_t address) { this->address_ = address; } + + /// @brief store the pointer to the OneWireBus to use + /// @param bus pointer to the OneWireBus object + void set_one_wire_bus(OneWireBus *bus) { this->bus_ = bus; } + + /// Helper to create (and cache) the name for this sensor. For example "0xfe0000031f1eaf29". + const std::string &get_address_name(); + + std::string unique_id(); + + protected: + uint64_t address_{0}; + OneWireBus *bus_{nullptr}; ///< pointer to OneWireBus instance + std::string address_name_; + + /// @brief find an address if necessary + /// should be called from setup + bool check_address_(); + + /// @brief send command on the bus + /// @param cmd command to send + bool send_command_(uint8_t cmd); +}; + +} // namespace one_wire +} // namespace esphome diff --git a/esphome/components/one_wire/one_wire_bus.cpp b/esphome/components/one_wire/one_wire_bus.cpp new file mode 100644 index 0000000000..a8d29428d3 --- /dev/null +++ b/esphome/components/one_wire/one_wire_bus.cpp @@ -0,0 +1,88 @@ +#include "one_wire_bus.h" +#include "esphome/core/helpers.h" + +namespace esphome { +namespace one_wire { + +static const char *const TAG = "one_wire"; + +static const uint8_t DALLAS_MODEL_DS18S20 = 0x10; +static const uint8_t DALLAS_MODEL_DS1822 = 0x22; +static const uint8_t DALLAS_MODEL_DS18B20 = 0x28; +static const uint8_t DALLAS_MODEL_DS1825 = 0x3B; +static const uint8_t DALLAS_MODEL_DS28EA00 = 0x42; + +const uint8_t ONE_WIRE_ROM_SELECT = 0x55; +const uint8_t ONE_WIRE_ROM_SEARCH = 0xF0; + +const std::vector &OneWireBus::get_devices() { return this->devices_; } + +bool IRAM_ATTR OneWireBus::select(uint64_t address) { + if (!this->reset()) + return false; + this->write8(ONE_WIRE_ROM_SELECT); + this->write64(address); + return true; +} + +void OneWireBus::search() { + this->devices_.clear(); + + this->reset_search(); + uint64_t address; + while (true) { + { + InterruptLock lock; + if (!this->reset()) { + // Reset failed or no devices present + return; + } + + this->write8(ONE_WIRE_ROM_SEARCH); + address = this->search_int(); + } + if (address == 0) + break; + auto *address8 = reinterpret_cast(&address); + if (crc8(address8, 7) != address8[7]) { + ESP_LOGW(TAG, "Dallas device 0x%s has invalid CRC.", format_hex(address).c_str()); + } else { + this->devices_.push_back(address); + } + } +} + +void OneWireBus::skip() { + this->write8(0xCC); // skip ROM +} + +const LogString *OneWireBus::get_model_str(uint8_t model) { + switch (model) { + case DALLAS_MODEL_DS18S20: + return LOG_STR("DS18S20"); + case DALLAS_MODEL_DS1822: + return LOG_STR("DS1822"); + case DALLAS_MODEL_DS18B20: + return LOG_STR("DS18B20"); + case DALLAS_MODEL_DS1825: + return LOG_STR("DS1825"); + case DALLAS_MODEL_DS28EA00: + return LOG_STR("DS28EA00"); + default: + return LOG_STR("Unknown"); + } +} + +void OneWireBus::dump_devices_(const char *tag) { + if (this->devices_.empty()) { + ESP_LOGW(tag, " Found no devices!"); + } else { + ESP_LOGCONFIG(tag, " Found devices:"); + for (auto &address : this->devices_) { + ESP_LOGCONFIG(tag, " 0x%s (%s)", format_hex(address).c_str(), LOG_STR_ARG(get_model_str(address & 0xff))); + } + } +} + +} // namespace one_wire +} // namespace esphome diff --git a/esphome/components/one_wire/one_wire_bus.h b/esphome/components/one_wire/one_wire_bus.h new file mode 100644 index 0000000000..6818b17499 --- /dev/null +++ b/esphome/components/one_wire/one_wire_bus.h @@ -0,0 +1,61 @@ +#pragma once + +#include "esphome/core/hal.h" +#include "esphome/core/log.h" +#include + +namespace esphome { +namespace one_wire { + +class OneWireBus { + public: + /** Reset the bus, should be done before all write operations. + * + * Takes approximately 1ms. + * + * @return Whether the operation was successful. + */ + virtual bool reset() = 0; + + /// Write a word to the bus. LSB first. + virtual void write8(uint8_t val) = 0; + + /// Write a 64 bit unsigned integer to the bus. LSB first. + virtual void write64(uint64_t val) = 0; + + /// Write a command to the bus that addresses all devices by skipping the ROM. + void skip(); + + /// Read an 8 bit word from the bus. + virtual uint8_t read8() = 0; + + /// Read an 64-bit unsigned integer from the bus. + virtual uint64_t read64() = 0; + + /// Select a specific address on the bus for the following command. + bool select(uint64_t address); + + /// Return the list of found devices. + const std::vector &get_devices(); + + /// Search for 1-Wire devices on the bus. + void search(); + + /// Get the description string for this model. + const LogString *get_model_str(uint8_t model); + + protected: + std::vector devices_; + + /// log the found devices + void dump_devices_(const char *tag); + + /// Reset the device search. + virtual void reset_search() = 0; + + /// Search for a 1-Wire device on the bus. Returns 0 if all devices have been found. + virtual uint64_t search_int() = 0; +}; + +} // namespace one_wire +} // namespace esphome diff --git a/script/ci-custom.py b/script/ci-custom.py index e2ee81f742..9a97d3e4a8 100755 --- a/script/ci-custom.py +++ b/script/ci-custom.py @@ -630,7 +630,7 @@ def lint_trailing_whitespace(fname, match): "esphome/components/lock/lock.h", "esphome/components/mqtt/mqtt_component.h", "esphome/components/number/number.h", - "esphome/components/text/text.h", + "esphome/components/one_wire/one_wire.h", "esphome/components/output/binary_output.h", "esphome/components/output/float_output.h", "esphome/components/nextion/nextion_base.h", @@ -638,6 +638,7 @@ def lint_trailing_whitespace(fname, match): "esphome/components/sensor/sensor.h", "esphome/components/stepper/stepper.h", "esphome/components/switch/switch.h", + "esphome/components/text/text.h", "esphome/components/text_sensor/text_sensor.h", "esphome/components/valve/valve.h", "esphome/core/component.h", diff --git a/tests/components/dallas/common.yaml b/tests/components/dallas_temp/common.yaml similarity index 55% rename from tests/components/dallas/common.yaml rename to tests/components/dallas_temp/common.yaml index 7975977107..2f846ca278 100644 --- a/tests/components/dallas/common.yaml +++ b/tests/components/dallas_temp/common.yaml @@ -1,11 +1,11 @@ -dallas: - pin: 4 +one_wire: + - platform: gpio + pin: 4 sensor: - - platform: dallas + - platform: dallas_temp address: 0x1C0000031EDD2A28 name: Dallas Temperature resolution: 9 - - platform: dallas - index: 1 + - platform: dallas_temp name: Dallas Temperature diff --git a/tests/components/dallas/test.esp32-c3-idf.yaml b/tests/components/dallas_temp/test.esp32-c3-idf.yaml similarity index 100% rename from tests/components/dallas/test.esp32-c3-idf.yaml rename to tests/components/dallas_temp/test.esp32-c3-idf.yaml diff --git a/tests/components/dallas/test.esp32-c3.yaml b/tests/components/dallas_temp/test.esp32-c3.yaml similarity index 100% rename from tests/components/dallas/test.esp32-c3.yaml rename to tests/components/dallas_temp/test.esp32-c3.yaml diff --git a/tests/components/dallas/test.esp32-idf.yaml b/tests/components/dallas_temp/test.esp32-idf.yaml similarity index 100% rename from tests/components/dallas/test.esp32-idf.yaml rename to tests/components/dallas_temp/test.esp32-idf.yaml diff --git a/tests/components/dallas/test.esp32.yaml b/tests/components/dallas_temp/test.esp32.yaml similarity index 100% rename from tests/components/dallas/test.esp32.yaml rename to tests/components/dallas_temp/test.esp32.yaml diff --git a/tests/components/dallas/test.esp8266.yaml b/tests/components/dallas_temp/test.esp8266.yaml similarity index 100% rename from tests/components/dallas/test.esp8266.yaml rename to tests/components/dallas_temp/test.esp8266.yaml diff --git a/tests/components/dallas/test.rp2040.yaml b/tests/components/dallas_temp/test.rp2040.yaml similarity index 100% rename from tests/components/dallas/test.rp2040.yaml rename to tests/components/dallas_temp/test.rp2040.yaml diff --git a/tests/test1.yaml b/tests/test1.yaml index 2dacfda536..79cb1bba2b 100644 --- a/tests/test1.yaml +++ b/tests/test1.yaml @@ -315,11 +315,6 @@ as5600: slow_filter: 8x fast_filter: lsb6 -dallas: - pin: - allow_other_uses: true - number: GPIO23 - as3935_spi: cs_pin: ignore_strapping_warning: true @@ -714,13 +709,6 @@ sensor: update_interval: 15s iir_filter: 16x i2c_id: i2c_bus - - platform: dallas - address: 0x1C0000031EDD2A28 - name: Living Room Temperature - resolution: 9 - - platform: dallas - index: 1 - name: Living Room Temperature 2 - platform: dht pin: allow_other_uses: true From e2784d077dea978ba449759be6449f8d9fdde47e Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:09:20 +1000 Subject: [PATCH 014/233] [he60r] Don't publish state unless it has changed. [BUGFIX] (#6869) --- esphome/components/he60r/he60r.cpp | 46 ++++++++++++++---------------- esphome/components/he60r/he60r.h | 7 ++--- 2 files changed, 24 insertions(+), 29 deletions(-) diff --git a/esphome/components/he60r/he60r.cpp b/esphome/components/he60r/he60r.cpp index 05f3f528a5..83e895543d 100644 --- a/esphome/components/he60r/he60r.cpp +++ b/esphome/components/he60r/he60r.cpp @@ -56,7 +56,7 @@ void HE60rCover::endstop_reached_(CoverOperation operation) { this->position = new_position; this->current_operation = COVER_OPERATION_IDLE; if (this->last_command_ == operation) { - float dur = (now - this->start_dir_time_) / 1e3f; + float dur = (float) (now - this->start_dir_time_) / 1e3f; ESP_LOGD(TAG, "'%s' - %s endstop reached. Took %.1fs.", this->name_.c_str(), operation == COVER_OPERATION_OPENING ? "Open" : "Close", dur); } @@ -69,7 +69,6 @@ void HE60rCover::set_current_operation_(cover::CoverOperation operation) { this->current_operation = operation; if (operation != COVER_OPERATION_IDLE) this->last_recompute_time_ = millis(); - this->publish_state(); } } @@ -129,7 +128,7 @@ void HE60rCover::update_() { if (this->toggles_needed_ != 0) { if ((this->counter_++ & 0x3) == 0) { this->toggles_needed_--; - ESP_LOGD(TAG, "Writing byte 0x30, still needed=%" PRIu32, this->toggles_needed_); + ESP_LOGD(TAG, "Writing byte 0x30, still needed=%u", this->toggles_needed_); this->write_byte(TOGGLE_BYTE); } else { this->write_byte(QUERY_BYTE); @@ -235,31 +234,28 @@ void HE60rCover::recompute_position_() { return; const uint32_t now = millis(); - float dir; - float action_dur; - - switch (this->current_operation) { - case COVER_OPERATION_OPENING: - dir = 1.0f; - action_dur = this->open_duration_; - break; - case COVER_OPERATION_CLOSING: - dir = -1.0f; - action_dur = this->close_duration_; - break; - default: - return; - } - if (now > this->last_recompute_time_) { - auto diff = now - last_recompute_time_; - auto delta = dir * diff / action_dur; + auto diff = (unsigned) (now - last_recompute_time_); + float delta; + switch (this->current_operation) { + case COVER_OPERATION_OPENING: + delta = (float) diff / (float) this->open_duration_; + break; + case COVER_OPERATION_CLOSING: + delta = -(float) diff / (float) this->close_duration_; + break; + default: + return; + } + // make sure our guesstimate never reaches full open or close. - this->position = clamp(delta + this->position, COVER_CLOSED + 0.01f, COVER_OPEN - 0.01f); - ESP_LOGD(TAG, "Recompute %dms, dir=%f, action_dur=%f, delta=%f, pos=%f", (int) diff, dir, action_dur, delta, - this->position); + auto new_position = clamp(delta + this->position, COVER_CLOSED + 0.01f, COVER_OPEN - 0.01f); + ESP_LOGD(TAG, "Recompute %ums, dir=%u, delta=%f, pos=%f", diff, this->current_operation, delta, new_position); this->last_recompute_time_ = now; - this->publish_state(); + if (this->position != new_position) { + this->position = new_position; + this->publish_state(); + } } } diff --git a/esphome/components/he60r/he60r.h b/esphome/components/he60r/he60r.h index 624b61fc65..e41e2203c1 100644 --- a/esphome/components/he60r/he60r.h +++ b/esphome/components/he60r/he60r.h @@ -25,15 +25,14 @@ class HE60rCover : public cover::Cover, public Component, public uart::UARTDevic void control(const cover::CoverCall &call) override; bool is_at_target_() const; void start_direction_(cover::CoverOperation dir); - void update_operation_(cover::CoverOperation dir); void endstop_reached_(cover::CoverOperation operation); void recompute_position_(); void set_current_operation_(cover::CoverOperation operation); void process_rx_(uint8_t data); - uint32_t open_duration_{0}; - uint32_t close_duration_{0}; - uint32_t toggles_needed_{0}; + unsigned open_duration_{0}; + unsigned close_duration_{0}; + unsigned toggles_needed_{0}; cover::CoverOperation next_direction_{cover::COVER_OPERATION_IDLE}; cover::CoverOperation last_command_{cover::COVER_OPERATION_IDLE}; uint32_t last_recompute_time_{0}; From 699d00e21850c813e3f995c7d4fec0411cd58ef7 Mon Sep 17 00:00:00 2001 From: guillempages Date: Wed, 12 Jun 2024 03:11:00 +0200 Subject: [PATCH 015/233] [image] Make PIL import local (#6864) --- esphome/components/image/__init__.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/esphome/components/image/__init__.py b/esphome/components/image/__init__.py index b23ed3445a..c275136427 100644 --- a/esphome/components/image/__init__.py +++ b/esphome/components/image/__init__.py @@ -9,8 +9,6 @@ import re import requests from magic import Magic -from PIL import Image - from esphome import core from esphome.components import font from esphome import external_files @@ -267,6 +265,9 @@ CONFIG_SCHEMA = cv.All(font.validate_pillow_installed, IMAGE_SCHEMA) def load_svg_image(file: bytes, resize: tuple[int, int]): + # Local import only to allow "validate_pillow_installed" to run *before* importing it + from PIL import Image + # This import is only needed in case of SVG images; adding it # to the top would force configurations not using SVG to also have it # installed for no reason. @@ -286,6 +287,9 @@ def load_svg_image(file: bytes, resize: tuple[int, int]): async def to_code(config): + # Local import only to allow "validate_pillow_installed" to run *before* importing it + from PIL import Image + conf_file = config[CONF_FILE] if conf_file[CONF_SOURCE] == SOURCE_LOCAL: From 7b9fb57bb22a86a15ae4f637b886ef3e415c75f4 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:15:57 +1000 Subject: [PATCH 016/233] [config] Retain path information in validated configuration (#6785) --- esphome/config.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esphome/config.py b/esphome/config.py index 2b231fc402..afb7207edb 100644 --- a/esphome/config.py +++ b/esphome/config.py @@ -23,7 +23,7 @@ from esphome.const import ( CONF_EXTERNAL_COMPONENTS, TARGET_PLATFORMS, ) -from esphome.core import CORE, EsphomeError +from esphome.core import CORE, EsphomeError, DocumentRange from esphome.helpers import indent from esphome.util import safe_print, OrderedDict @@ -184,7 +184,7 @@ class Config(OrderedDict, fv.FinalValidateConfig): def get_deepest_document_range_for_path( self, path: ConfigPath, get_key: bool = False - ) -> ESPHomeDataBase | None: + ) -> DocumentRange | None: data = self doc_range = None for index, path_item in enumerate(path): @@ -1123,4 +1123,4 @@ def read_config(command_line_substitutions): safe_print("") return None - return OrderedDict(res) + return res From 4bf7c9708852758237b8da13c77c5bd568b7cdc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Poczkodi?= Date: Wed, 12 Jun 2024 03:19:18 +0200 Subject: [PATCH 017/233] WebSocket overrides check_origin for reverse proxy configuration (#6845) --- esphome/dashboard/web_server.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/esphome/dashboard/web_server.py b/esphome/dashboard/web_server.py index 9ee2312781..33c83ffb1a 100644 --- a/esphome/dashboard/web_server.py +++ b/esphome/dashboard/web_server.py @@ -17,6 +17,7 @@ import time from collections.abc import Iterable from pathlib import Path from typing import TYPE_CHECKING, Any, Callable, TypeVar +from urllib.parse import urlparse import tornado import tornado.concurrent @@ -166,6 +167,18 @@ class EsphomeCommandWebSocket(tornado.websocket.WebSocketHandler): # use Popen() with a reading thread instead self._use_popen = os.name == "nt" + def check_origin(self, origin): + if "ESPHOME_TRUSTED_DOMAINS" not in os.environ: + return super().check_origin(origin) + trusted_domains = [ + s.strip() for s in os.environ["ESPHOME_TRUSTED_DOMAINS"].split(",") + ] + url = urlparse(origin) + if url.hostname in trusted_domains: + return True + _LOGGER.info("check_origin %s, domain is not trusted", origin) + return False + def open(self, *args: str, **kwargs: str) -> None: """Handle new WebSocket connection.""" # Ensure messages from the subprocess are sent immediately From 7c843437a70f825d71e2198bf17fd8e5d1d48db5 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:26:43 +1000 Subject: [PATCH 018/233] [config] Early termination of validation steps on error (#6837) --- esphome/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/config.py b/esphome/config.py index afb7207edb..925a31fed0 100644 --- a/esphome/config.py +++ b/esphome/config.py @@ -139,7 +139,7 @@ class Config(OrderedDict, fv.FinalValidateConfig): ) def run_validation_steps(self): - while self._validation_tasks: + while self._validation_tasks and not self.errors: task = heapq.heappop(self._validation_tasks) task.step.run(self) From e2c1af199c4b6504350fb0a133ea450a470165b1 Mon Sep 17 00:00:00 2001 From: Tudor Sandu Date: Tue, 11 Jun 2024 18:39:01 -0700 Subject: [PATCH 019/233] Fix media_player.volume_set when media player is not started (#6859) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- .../media_player/i2s_audio_media_player.cpp | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp index 5140a923b4..34ed5b02a0 100644 --- a/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp +++ b/esphome/components/i2s_audio/media_player/i2s_audio_media_player.cpp @@ -37,38 +37,14 @@ void I2SAudioMediaPlayer::control(const media_player::MediaPlayerCall &call) { this->set_volume_(volume); this->unmute_(); } - if (this->i2s_state_ != I2S_STATE_RUNNING) { - return; - } if (call.get_command().has_value()) { switch (call.get_command().value()) { - case media_player::MEDIA_PLAYER_COMMAND_PLAY: - if (!this->audio_->isRunning()) - this->audio_->pauseResume(); - this->state = play_state; - break; - case media_player::MEDIA_PLAYER_COMMAND_PAUSE: - if (this->audio_->isRunning()) - this->audio_->pauseResume(); - this->state = media_player::MEDIA_PLAYER_STATE_PAUSED; - break; - case media_player::MEDIA_PLAYER_COMMAND_STOP: - this->stop(); - break; case media_player::MEDIA_PLAYER_COMMAND_MUTE: this->mute_(); break; case media_player::MEDIA_PLAYER_COMMAND_UNMUTE: this->unmute_(); break; - case media_player::MEDIA_PLAYER_COMMAND_TOGGLE: - this->audio_->pauseResume(); - if (this->audio_->isRunning()) { - this->state = media_player::MEDIA_PLAYER_STATE_PLAYING; - } else { - this->state = media_player::MEDIA_PLAYER_STATE_PAUSED; - } - break; case media_player::MEDIA_PLAYER_COMMAND_VOLUME_UP: { float new_volume = this->volume + 0.1f; if (new_volume > 1.0f) @@ -85,6 +61,36 @@ void I2SAudioMediaPlayer::control(const media_player::MediaPlayerCall &call) { this->unmute_(); break; } + default: + break; + } + if (this->i2s_state_ != I2S_STATE_RUNNING) { + return; + } + switch (call.get_command().value()) { + case media_player::MEDIA_PLAYER_COMMAND_PLAY: + if (!this->audio_->isRunning()) + this->audio_->pauseResume(); + this->state = play_state; + break; + case media_player::MEDIA_PLAYER_COMMAND_PAUSE: + if (this->audio_->isRunning()) + this->audio_->pauseResume(); + this->state = media_player::MEDIA_PLAYER_STATE_PAUSED; + break; + case media_player::MEDIA_PLAYER_COMMAND_STOP: + this->stop(); + break; + case media_player::MEDIA_PLAYER_COMMAND_TOGGLE: + this->audio_->pauseResume(); + if (this->audio_->isRunning()) { + this->state = media_player::MEDIA_PLAYER_STATE_PLAYING; + } else { + this->state = media_player::MEDIA_PLAYER_STATE_PAUSED; + } + break; + default: + break; } } this->publish_state(); From bc408ad08cc8ba8e8ce90f2cabb7b647377e75e9 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:42:01 +1000 Subject: [PATCH 020/233] [display] SDL2 display driver for host platform (#6825) --- .github/workflows/ci.yml | 2 +- CODEOWNERS | 1 + esphome/components/sdl/__init__.py | 1 + esphome/components/sdl/display.py | 72 ++++++++++++++ esphome/components/sdl/sdl_esphome.cpp | 96 +++++++++++++++++++ esphome/components/sdl/sdl_esphome.h | 54 +++++++++++ .../components/sdl/touchscreen/__init__.py | 22 +++++ .../sdl/touchscreen/sdl_touchscreen.h | 26 +++++ tests/components/sdl/common.yaml | 12 +++ tests/components/sdl/test.host.yaml | 1 + 10 files changed, 286 insertions(+), 1 deletion(-) create mode 100644 esphome/components/sdl/__init__.py create mode 100644 esphome/components/sdl/display.py create mode 100644 esphome/components/sdl/sdl_esphome.cpp create mode 100644 esphome/components/sdl/sdl_esphome.h create mode 100644 esphome/components/sdl/touchscreen/__init__.py create mode 100644 esphome/components/sdl/touchscreen/sdl_touchscreen.h create mode 100644 tests/components/sdl/common.yaml create mode 100644 tests/components/sdl/test.host.yaml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2b3c80cb35..5a1887c33c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -455,7 +455,7 @@ jobs: file: ${{ fromJson(needs.list-components.outputs.components) }} steps: - name: Install libsodium - run: sudo apt-get install libsodium-dev + run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub uses: actions/checkout@v4.1.6 diff --git a/CODEOWNERS b/CODEOWNERS index 75ea4fe523..5c14d30371 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -320,6 +320,7 @@ esphome/components/rtttl/* @glmnet esphome/components/safe_mode/* @jsuanet @kbx81 @paulmonigatti esphome/components/scd4x/* @martgras @sjtrny esphome/components/script/* @esphome/core +esphome/components/sdl/* @clydebarrow esphome/components/sdm_meter/* @jesserockz @polyfaces esphome/components/sdp3x/* @Azimath esphome/components/seeed_mr24hpc1/* @limengdu diff --git a/esphome/components/sdl/__init__.py b/esphome/components/sdl/__init__.py new file mode 100644 index 0000000000..c58ce8a01e --- /dev/null +++ b/esphome/components/sdl/__init__.py @@ -0,0 +1 @@ +CODEOWNERS = ["@clydebarrow"] diff --git a/esphome/components/sdl/display.py b/esphome/components/sdl/display.py new file mode 100644 index 0000000000..18dc570f88 --- /dev/null +++ b/esphome/components/sdl/display.py @@ -0,0 +1,72 @@ +import subprocess + +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.components import display +from esphome.const import ( + CONF_ID, + CONF_DIMENSIONS, + CONF_WIDTH, + CONF_HEIGHT, + CONF_LAMBDA, + PLATFORM_HOST, +) + +sdl_ns = cg.esphome_ns.namespace("sdl") +Sdl = sdl_ns.class_("Sdl", display.Display, cg.Component) + + +CONF_SDL_OPTIONS = "sdl_options" +CONF_SDL_ID = "sdl_id" + + +def get_sdl_options(value): + if value != "": + return value + try: + return subprocess.check_output(["sdl2-config", "--cflags", "--libs"]).decode() + except Exception as e: + raise cv.Invalid("Unable to run sdl2-config - have you installed sdl2?") from e + + +CONFIG_SCHEMA = cv.All( + display.FULL_DISPLAY_SCHEMA.extend( + cv.Schema( + { + cv.GenerateID(): cv.declare_id(Sdl), + cv.Optional(CONF_SDL_OPTIONS, default=""): get_sdl_options, + cv.Required(CONF_DIMENSIONS): cv.Any( + cv.dimensions, + cv.Schema( + { + cv.Required(CONF_WIDTH): cv.int_, + cv.Required(CONF_HEIGHT): cv.int_, + } + ), + ), + } + ) + ), + cv.only_on(PLATFORM_HOST), +) + + +async def to_code(config): + for option in config[CONF_SDL_OPTIONS].split(): + cg.add_build_flag(option) + cg.add_build_flag("-DSDL_BYTEORDER=4321") + var = cg.new_Pvariable(config[CONF_ID]) + await display.register_display(var, config) + + dimensions = config[CONF_DIMENSIONS] + if isinstance(dimensions, dict): + cg.add(var.set_dimensions(dimensions[CONF_WIDTH], dimensions[CONF_HEIGHT])) + else: + (width, height) = dimensions + cg.add(var.set_dimensions(width, height)) + + if lamb := config.get(CONF_LAMBDA): + lambda_ = await cg.process_lambda( + lamb, [(display.DisplayRef, "it")], return_type=cg.void + ) + cg.add(var.set_writer(lambda_)) diff --git a/esphome/components/sdl/sdl_esphome.cpp b/esphome/components/sdl/sdl_esphome.cpp new file mode 100644 index 0000000000..5e17ca5650 --- /dev/null +++ b/esphome/components/sdl/sdl_esphome.cpp @@ -0,0 +1,96 @@ +#ifdef USE_HOST +#include "sdl_esphome.h" +#include "esphome/components/display/display_color_utils.h" + +namespace esphome { +namespace sdl { + +void Sdl::setup() { + ESP_LOGD(TAG, "Starting setup"); + SDL_Init(SDL_INIT_VIDEO); + this->window_ = SDL_CreateWindow(App.get_name().c_str(), SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + this->width_, this->height_, 0); + this->renderer_ = SDL_CreateRenderer(this->window_, -1, SDL_RENDERER_SOFTWARE); + this->texture_ = + SDL_CreateTexture(this->renderer_, SDL_PIXELFORMAT_RGB565, SDL_TEXTUREACCESS_STATIC, this->width_, this->height_); + SDL_SetTextureBlendMode(this->texture_, SDL_BLENDMODE_BLEND); + ESP_LOGD(TAG, "Setup Complete"); +} +void Sdl::update() { + this->do_update_(); + if ((this->x_high_ < this->x_low_) || (this->y_high_ < this->y_low_)) + return; + SDL_Rect rect{this->x_low_, this->y_low_, this->x_high_ + 1 - this->x_low_, this->y_high_ + 1 - this->y_low_}; + this->x_low_ = this->width_; + this->y_low_ = this->height_; + this->x_high_ = 0; + this->y_high_ = 0; + SDL_RenderCopy(this->renderer_, this->texture_, &rect, &rect); + SDL_RenderPresent(this->renderer_); +} + +void Sdl::draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorOrder order, + display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) { + SDL_Rect rect{x_start, y_start, w, h}; + if (this->rotation_ != display::DISPLAY_ROTATION_0_DEGREES || bitness != display::COLOR_BITNESS_565 || big_endian) { + display::Display::draw_pixels_at(x_start, y_start, w, h, ptr, order, bitness, big_endian, x_offset, y_offset, + x_pad); + } else { + auto stride = x_offset + w + x_pad; + auto data = ptr + (stride * y_offset + x_offset) * 2; + SDL_UpdateTexture(this->texture_, &rect, data, stride * 2); + } + SDL_RenderCopy(this->renderer_, this->texture_, &rect, &rect); + SDL_RenderPresent(this->renderer_); +} + +void Sdl::draw_pixel_at(int x, int y, Color color) { + SDL_Rect rect{x, y, 1, 1}; + auto data = (display::ColorUtil::color_to_565(color, display::COLOR_ORDER_RGB)); + SDL_UpdateTexture(this->texture_, &rect, &data, 2); + if (x < this->x_low_) + this->x_low_ = x; + if (y < this->y_low_) + this->y_low_ = y; + if (x > this->x_high_) + this->x_high_ = x; + if (y > this->y_high_) + this->y_high_ = y; +} + +void Sdl::loop() { + SDL_Event e; + if (SDL_PollEvent(&e)) { + switch (e.type) { + case SDL_QUIT: + exit(0); + + case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: + if (e.button.button == 1) { + this->mouse_x = e.button.x; + this->mouse_y = e.button.y; + this->mouse_down = e.button.state != 0; + } + break; + + case SDL_MOUSEMOTION: + if (e.motion.state & 1) { + this->mouse_x = e.button.x; + this->mouse_y = e.button.y; + this->mouse_down = true; + } else { + this->mouse_down = false; + } + break; + + default: + ESP_LOGV(TAG, "Event %d", e.type); + break; + } + } +} + +} // namespace sdl +} // namespace esphome +#endif diff --git a/esphome/components/sdl/sdl_esphome.h b/esphome/components/sdl/sdl_esphome.h new file mode 100644 index 0000000000..e4b2d9dd9f --- /dev/null +++ b/esphome/components/sdl/sdl_esphome.h @@ -0,0 +1,54 @@ +#pragma once + +#ifdef USE_HOST +#include "esphome/core/component.h" +#include "esphome/core/log.h" +#include "esphome/core/application.h" +#include "esphome/components/display/display.h" +#define SDL_MAIN_HANDLED +#include "SDL.h" + +namespace esphome { +namespace sdl { + +constexpr static const char *const TAG = "sdl"; + +class Sdl : public display::Display { + public: + display::DisplayType get_display_type() override { return display::DISPLAY_TYPE_COLOR; } + void update() override; + void loop() override; + void setup() override; + void draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, display::ColorOrder order, + display::ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) override; + void draw_pixel_at(int x, int y, Color color) override; + void set_dimensions(uint16_t width, uint16_t height) { + this->width_ = width; + this->height_ = height; + } + int get_width() override { return this->width_; } + int get_height() override { return this->height_; } + float get_setup_priority() const override { return setup_priority::HARDWARE; } + void dump_config() override { LOG_DISPLAY("", "SDL", this); } + + int mouse_x{}; + int mouse_y{}; + bool mouse_down{}; + + protected: + int get_width_internal() override { return this->width_; } + int get_height_internal() override { return this->height_; } + int width_{}; + int height_{}; + SDL_Renderer *renderer_{}; + SDL_Window *window_{}; + SDL_Texture *texture_{}; + uint16_t x_low_{0}; + uint16_t y_low_{0}; + uint16_t x_high_{0}; + uint16_t y_high_{0}; +}; +} // namespace sdl +} // namespace esphome + +#endif diff --git a/esphome/components/sdl/touchscreen/__init__.py b/esphome/components/sdl/touchscreen/__init__.py new file mode 100644 index 0000000000..d6c0ed1c03 --- /dev/null +++ b/esphome/components/sdl/touchscreen/__init__.py @@ -0,0 +1,22 @@ +import esphome.codegen as cg +import esphome.config_validation as cv +from esphome.const import CONF_ID + +from esphome.components import touchscreen +from ..display import Sdl, sdl_ns, CONF_SDL_ID + +SdlTouchscreen = sdl_ns.class_("SdlTouchscreen", touchscreen.Touchscreen) + + +CONFIG_SCHEMA = touchscreen.TOUCHSCREEN_SCHEMA.extend( + { + cv.GenerateID(): cv.declare_id(SdlTouchscreen), + cv.GenerateID(CONF_SDL_ID): cv.use_id(Sdl), + } +) + + +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_parented(var, config[CONF_SDL_ID]) + await touchscreen.register_touchscreen(var, config) diff --git a/esphome/components/sdl/touchscreen/sdl_touchscreen.h b/esphome/components/sdl/touchscreen/sdl_touchscreen.h new file mode 100644 index 0000000000..a1f0fb15e3 --- /dev/null +++ b/esphome/components/sdl/touchscreen/sdl_touchscreen.h @@ -0,0 +1,26 @@ +#pragma once + +#ifdef USE_HOST +#include "../sdl_esphome.h" +#include "esphome/components/touchscreen/touchscreen.h" + +namespace esphome { +namespace sdl { + +class SdlTouchscreen : public touchscreen::Touchscreen, public Parented { + public: + void setup() override { + this->x_raw_max_ = this->display_->get_width(); + this->y_raw_max_ = this->display_->get_height(); + } + + void update_touches() override { + if (this->parent_->mouse_down) { + add_raw_touch_position_(0, this->parent_->mouse_x, this->parent_->mouse_y); + } + } +}; + +} // namespace sdl +} // namespace esphome +#endif diff --git a/tests/components/sdl/common.yaml b/tests/components/sdl/common.yaml new file mode 100644 index 0000000000..0192f054b5 --- /dev/null +++ b/tests/components/sdl/common.yaml @@ -0,0 +1,12 @@ +host: + mac_address: "62:23:45:AF:B3:DD" + +display: + - platform: sdl + id: sdl_display + update_interval: 1s + auto_clear_enabled: false + show_test_card: true + dimensions: + width: 450 + height: 600 diff --git a/tests/components/sdl/test.host.yaml b/tests/components/sdl/test.host.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/sdl/test.host.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From f25c2963037a7d165e11eac1a874c9da2674e7c6 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:47:52 +1000 Subject: [PATCH 021/233] [ili9xxx] Implement st7735 support (#6838) --- esphome/components/ili9xxx/display.py | 2 + esphome/components/ili9xxx/ili9xxx_defines.h | 2 + .../components/ili9xxx/ili9xxx_display.cpp | 18 +++++-- esphome/components/ili9xxx/ili9xxx_display.h | 10 +++- esphome/components/ili9xxx/ili9xxx_init.h | 51 +++++++++++++++++++ 5 files changed, 77 insertions(+), 6 deletions(-) diff --git a/esphome/components/ili9xxx/display.py b/esphome/components/ili9xxx/display.py index f0ac5ba9ef..483f2b886c 100644 --- a/esphome/components/ili9xxx/display.py +++ b/esphome/components/ili9xxx/display.py @@ -69,6 +69,7 @@ MODELS = { "ILI9486": ili9xxx_ns.class_("ILI9XXXILI9486", ILI9XXXDisplay), "ILI9488": ili9xxx_ns.class_("ILI9XXXILI9488", ILI9XXXDisplay), "ILI9488_A": ili9xxx_ns.class_("ILI9XXXILI9488A", ILI9XXXDisplay), + "ST7735": ili9xxx_ns.class_("ILI9XXXST7735", ILI9XXXDisplay), "ST7796": ili9xxx_ns.class_("ILI9XXXST7796", ILI9XXXDisplay), "ST7789V": ili9xxx_ns.class_("ILI9XXXST7789V", ILI9XXXDisplay), "S3BOX": ili9xxx_ns.class_("ILI9XXXS3Box", ILI9XXXDisplay), @@ -134,6 +135,7 @@ def _validate(config): "ILI9341", "ILI9342", "ST7789V", + "ST7735", ]: raise cv.Invalid("Selected model can't run on ESP8266.") diff --git a/esphome/components/ili9xxx/ili9xxx_defines.h b/esphome/components/ili9xxx/ili9xxx_defines.h index 29483ee15e..744013db3d 100644 --- a/esphome/components/ili9xxx/ili9xxx_defines.h +++ b/esphome/components/ili9xxx/ili9xxx_defines.h @@ -70,6 +70,7 @@ static const uint8_t ILI9XXX_PWCTR2 = 0xC1; static const uint8_t ILI9XXX_PWCTR3 = 0xC2; static const uint8_t ILI9XXX_PWCTR4 = 0xC3; static const uint8_t ILI9XXX_PWCTR5 = 0xC4; +static const uint8_t ILI9XXX_PWCTR6 = 0xF6; static const uint8_t ILI9XXX_VMCTR1 = 0xC5; static const uint8_t ILI9XXX_IFCTR = 0xC6; static const uint8_t ILI9XXX_VMCTR2 = 0xC7; @@ -91,6 +92,7 @@ static const uint8_t ILI9XXX_GMCTRN1 = 0xE1; static const uint8_t ILI9XXX_CSCON = 0xF0; static const uint8_t ILI9XXX_ADJCTL3 = 0xF7; +static const uint8_t ILI9XXX_DELAY = 0xFF; // followed by one byte of delay time in ms } // namespace ili9xxx } // namespace esphome diff --git a/esphome/components/ili9xxx/ili9xxx_display.cpp b/esphome/components/ili9xxx/ili9xxx_display.cpp index 463e3dd851..21d46ea825 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.cpp +++ b/esphome/components/ili9xxx/ili9xxx_display.cpp @@ -411,11 +411,19 @@ void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { uint8_t cmd, x, num_args; while ((cmd = *addr++) != 0) { x = *addr++; - num_args = x & 0x7F; - this->send_command(cmd, addr, num_args); - addr += num_args; - if (x & 0x80) - delay(150); // NOLINT + if (cmd == ILI9XXX_DELAY) { + ESP_LOGD(TAG, "Delay %dms", x); + delay(x); + } else { + num_args = x & 0x7F; + ESP_LOGD(TAG, "Command %02X, length %d, bits %02X", cmd, num_args, *addr); + this->send_command(cmd, addr, num_args); + addr += num_args; + if (x & 0x80) { + ESP_LOGD(TAG, "Delay 150ms"); + delay(150); // NOLINT + } + } } } diff --git a/esphome/components/ili9xxx/ili9xxx_display.h b/esphome/components/ili9xxx/ili9xxx_display.h index 4446686e7b..7a320dac7b 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.h +++ b/esphome/components/ili9xxx/ili9xxx_display.h @@ -35,7 +35,6 @@ class ILI9XXXDisplay : public display::DisplayBuffer, while ((cmd = *addr++) != 0) { num_args = *addr++ & 0x7F; bits = *addr; - esph_log_d(TAG, "Command %02X, length %d, bits %02X", cmd, num_args, bits); switch (cmd) { case ILI9XXX_MADCTL: { this->swap_xy_ = (bits & MADCTL_MV) != 0; @@ -51,6 +50,9 @@ class ILI9XXXDisplay : public display::DisplayBuffer, break; } + case ILI9XXX_DELAY: + continue; // no args to skip + default: break; } @@ -269,5 +271,11 @@ class ILI9XXXGC9A01A : public ILI9XXXDisplay { ILI9XXXGC9A01A() : ILI9XXXDisplay(INITCMD_GC9A01A, 240, 240, true) {} }; +//----------- ILI9XXX_24_TFT display -------------- +class ILI9XXXST7735 : public ILI9XXXDisplay { + public: + ILI9XXXST7735() : ILI9XXXDisplay(INITCMD_ST7735, 128, 160, false) {} +}; + } // namespace ili9xxx } // namespace esphome diff --git a/esphome/components/ili9xxx/ili9xxx_init.h b/esphome/components/ili9xxx/ili9xxx_init.h index ea90f83f30..260bde4c80 100644 --- a/esphome/components/ili9xxx/ili9xxx_init.h +++ b/esphome/components/ili9xxx/ili9xxx_init.h @@ -370,6 +370,57 @@ static const uint8_t PROGMEM INITCMD_GC9A01A[] = { 0x00 // End of list }; +static const uint8_t PROGMEM INITCMD_ST7735[] = { + ILI9XXX_SWRESET, 0, // Soft reset, then delay 10ms + ILI9XXX_DELAY, 10, + ILI9XXX_SLPOUT , 0, // Exit Sleep, delay + ILI9XXX_DELAY, 10, + ILI9XXX_PIXFMT , 1, 0x05, + ILI9XXX_FRMCTR1, 3, // 4: Frame rate control, 3 args + delay: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ILI9XXX_FRMCTR2, 3, // 4: Framerate ctrl - idle mode, 3 args: + 0x01, 0x2C, 0x2D, // Rate = fosc/(1x2+40) * (LINE+2C+2D) + ILI9XXX_FRMCTR3, 6, // 5: Framerate - partial mode, 6 args: + 0x01, 0x2C, 0x2D, // Dot inversion mode + 0x01, 0x2C, 0x2D, // Line inversion mode + + ILI9XXX_INVCTR, 1, // 7: Display inversion control, 1 arg: + 0x7, // Line inversion + ILI9XXX_PWCTR1, 3, // 7: Power control, 3 args, no delay: + 0xA2, + 0x02, // -4.6V + 0x84, // AUTO mode + ILI9XXX_PWCTR2, 1, // 8: Power control, 1 arg, no delay: + 0xC5, // VGH25=2.4C VGSEL=-10 VGH=3 * AVDD + ILI9XXX_PWCTR3, 2, // 9: Power control, 2 args, no delay: + 0x0A, // Opamp current small + 0x00, // Boost frequency + ILI9XXX_PWCTR4, 2, // 10: Power control, 2 args, no delay: + 0x8A, // BCLK/2, + 0x2A, // opamp current small & medium low + ILI9XXX_PWCTR5, 2, // 11: Power control, 2 args, no delay: + 0x8A, 0xEE, + + ILI9XXX_VMCTR1, 1, // 11: Power control, 2 args + delay: + 0x0E, + ILI9XXX_GMCTRP1, 16, // 13: Gamma Adjustments (pos. polarity), 16 args + delay: + 0x02, 0x1c, 0x07, 0x12, // (Not entirely necessary, but provides + 0x37, 0x32, 0x29, 0x2d, // accurate colors) + 0x29, 0x25, 0x2B, 0x39, + 0x00, 0x01, 0x03, 0x10, + ILI9XXX_GMCTRN1, 16, // 14: Gamma Adjustments (neg. polarity), 16 args + delay: + 0x03, 0x1d, 0x07, 0x06, // (Not entirely necessary, but provides + 0x2E, 0x2C, 0x29, 0x2D, // accurate colors) + 0x2E, 0x2E, 0x37, 0x3F, + 0x00, 0x00, 0x02, 0x10, + ILI9XXX_MADCTL , 1, 0x00, // Memory Access Control, BGR + ILI9XXX_NORON , 0, + ILI9XXX_DELAY, 10, + ILI9XXX_DISPON , 0, // Display on + ILI9XXX_DELAY, 10, + 00, // endo of list +}; + // clang-format on } // namespace ili9xxx } // namespace esphome From f9f98fa6c6d2d120efd39721133a7b44c5fd4ee3 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:16:43 +1200 Subject: [PATCH 022/233] Bump version to 2024.6.0b1 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index cbd932e3cc..0117e8a238 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0-dev" +__version__ = "2024.6.0b1" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From bd7e8fbf86b086d2b1211173d2b20efc0efafb7e Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 14:16:43 +1200 Subject: [PATCH 023/233] Bump version to 2024.7.0-dev --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index cbd932e3cc..dff14d7cf0 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0-dev" +__version__ = "2024.7.0-dev" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From b401b5eca83b69fc5027deb154cbb2571cfde9c7 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:36:57 +1200 Subject: [PATCH 024/233] [CI] Update device class sync script for update entities (#6895) --- script/sync-device_class.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/script/sync-device_class.py b/script/sync-device_class.py index 12e1bb6a9f..121c89b8f9 100755 --- a/script/sync-device_class.py +++ b/script/sync-device_class.py @@ -10,6 +10,7 @@ from homeassistant.components.event import EventDeviceClass from homeassistant.components.number import NumberDeviceClass from homeassistant.components.sensor import SensorDeviceClass from homeassistant.components.switch import SwitchDeviceClass +from homeassistant.components.update import UpdateDeviceClass from homeassistant.components.valve import ValveDeviceClass # pylint: enable=import-error @@ -27,6 +28,7 @@ DOMAINS = { "number": NumberDeviceClass, "sensor": SensorDeviceClass, "switch": SwitchDeviceClass, + "update": UpdateDeviceClass, "valve": ValveDeviceClass, } From 2044c7e4d4506b840dd2978d2fce5e455d304627 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:58:56 +1200 Subject: [PATCH 025/233] [CI] Fix for sdl (#6892) --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a1887c33c..b49237db26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -454,7 +454,7 @@ jobs: matrix: file: ${{ fromJson(needs.list-components.outputs.components) }} steps: - - name: Install libsodium + - name: Install dependencies run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub @@ -508,8 +508,8 @@ jobs: - name: List components run: echo ${{ matrix.components }} - - name: Install libsodium - run: sudo apt-get install libsodium-dev + - name: Install dependencies + run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub uses: actions/checkout@v4.1.6 From df52bc3493c9834e2fc327e433c0368c58733c51 Mon Sep 17 00:00:00 2001 From: Oliver Hihn <43825356+oliverhihn@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:09:26 +0200 Subject: [PATCH 026/233] Add step_delay option to X9C component (#6890) --- esphome/components/x9c/output.py | 3 +++ esphome/components/x9c/x9c.cpp | 5 +++-- esphome/components/x9c/x9c.h | 2 ++ esphome/const.py | 1 + tests/components/x9c/test.esp32-c3-idf.yaml | 1 + tests/components/x9c/test.esp32-c3.yaml | 1 + tests/components/x9c/test.esp32-idf.yaml | 1 + tests/components/x9c/test.esp32.yaml | 1 + tests/components/x9c/test.esp8266.yaml | 1 + tests/components/x9c/test.rp2040.yaml | 1 + 10 files changed, 15 insertions(+), 2 deletions(-) diff --git a/esphome/components/x9c/output.py b/esphome/components/x9c/output.py index 44e9d729b3..56820efdfa 100644 --- a/esphome/components/x9c/output.py +++ b/esphome/components/x9c/output.py @@ -8,6 +8,7 @@ from esphome.const import ( CONF_INC_PIN, CONF_UD_PIN, CONF_INITIAL_VALUE, + CONF_STEP_DELAY, ) CODEOWNERS = ["@EtienneMD"] @@ -26,6 +27,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_INITIAL_VALUE, default=1.0): cv.float_range( min=0.01, max=1.0 ), + cv.Optional(CONF_STEP_DELAY, default=1): cv.int_range(min=1, max=100), } ) ) @@ -44,3 +46,4 @@ async def to_code(config): cg.add(var.set_ud_pin(ud_pin)) cg.add(var.set_initial_value(config[CONF_INITIAL_VALUE])) + cg.add(var.set_step_delay(config[CONF_STEP_DELAY])) diff --git a/esphome/components/x9c/x9c.cpp b/esphome/components/x9c/x9c.cpp index 32a1375f02..4e7a94266e 100644 --- a/esphome/components/x9c/x9c.cpp +++ b/esphome/components/x9c/x9c.cpp @@ -22,9 +22,9 @@ void X9cOutput::trim_value(int change_amount) { for (int i = 0; i < abs(change_amount); i++) { // Move wiper this->inc_pin_->digital_write(true); - delayMicroseconds(1); + delayMicroseconds(this->step_delay_); this->inc_pin_->digital_write(false); - delayMicroseconds(1); + delayMicroseconds(this->step_delay_); } delayMicroseconds(100); // Let value settle @@ -69,6 +69,7 @@ void X9cOutput::dump_config() { LOG_PIN(" Increment Pin: ", this->inc_pin_); LOG_PIN(" Up/Down Pin: ", this->ud_pin_); ESP_LOGCONFIG(TAG, " Initial Value: %f", this->initial_value_); + ESP_LOGCONFIG(TAG, " Step Delay: %d", this->step_delay_); LOG_FLOAT_OUTPUT(this); } diff --git a/esphome/components/x9c/x9c.h b/esphome/components/x9c/x9c.h index 924460c841..e7cc29a6cc 100644 --- a/esphome/components/x9c/x9c.h +++ b/esphome/components/x9c/x9c.h @@ -13,6 +13,7 @@ class X9cOutput : public output::FloatOutput, public Component { void set_inc_pin(InternalGPIOPin *pin) { inc_pin_ = pin; } void set_ud_pin(InternalGPIOPin *pin) { ud_pin_ = pin; } void set_initial_value(float initial_value) { initial_value_ = initial_value; } + void set_step_delay(int step_delay) { step_delay_ = step_delay; } void setup() override; void dump_config() override; @@ -26,6 +27,7 @@ class X9cOutput : public output::FloatOutput, public Component { InternalGPIOPin *ud_pin_; float initial_value_; float pot_value_; + int step_delay_; }; } // namespace x9c diff --git a/esphome/const.py b/esphome/const.py index dff14d7cf0..9c4e451029 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -784,6 +784,7 @@ CONF_STATIC_IP = "static_ip" CONF_STATUS = "status" CONF_STB_PIN = "stb_pin" CONF_STEP = "step" +CONF_STEP_DELAY = "step_delay" CONF_STEP_MODE = "step_mode" CONF_STEP_PIN = "step_pin" CONF_STOP = "stop" diff --git a/tests/components/x9c/test.esp32-c3-idf.yaml b/tests/components/x9c/test.esp32-c3-idf.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.esp32-c3-idf.yaml +++ b/tests/components/x9c/test.esp32-c3-idf.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32-c3.yaml b/tests/components/x9c/test.esp32-c3.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.esp32-c3.yaml +++ b/tests/components/x9c/test.esp32-c3.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32-idf.yaml b/tests/components/x9c/test.esp32-idf.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp32-idf.yaml +++ b/tests/components/x9c/test.esp32-idf.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32.yaml b/tests/components/x9c/test.esp32.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp32.yaml +++ b/tests/components/x9c/test.esp32.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp8266.yaml b/tests/components/x9c/test.esp8266.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp8266.yaml +++ b/tests/components/x9c/test.esp8266.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.rp2040.yaml b/tests/components/x9c/test.rp2040.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.rp2040.yaml +++ b/tests/components/x9c/test.rp2040.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 From 1a242f94db4923b099496497ba6e98b5f72e745d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:20:46 +1200 Subject: [PATCH 027/233] [host] Execute host program when using run command (#6897) --- esphome/__main__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/esphome/__main__.py b/esphome/__main__.py index f3c4ff3e23..5ff1a28ec7 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -488,6 +488,15 @@ def command_run(args, config): if exit_code != 0: return exit_code _LOGGER.info("Successfully compiled program.") + if CORE.is_host: + from esphome.platformio_api import get_idedata + + idedata = get_idedata(config) + if idedata is None: + return 1 + program_path = idedata.raw["prog_path"] + return run_external_process(program_path) + port = choose_upload_log_host( default=args.device, check_default=None, From 68dbf35b096be83e46e3fc7e82ae3100d2866ac2 Mon Sep 17 00:00:00 2001 From: Oliver Hihn <43825356+oliverhihn@users.noreply.github.com> Date: Wed, 12 Jun 2024 20:14:03 +0200 Subject: [PATCH 028/233] X9C step delay with units (#6898) --- esphome/components/x9c/output.py | 8 +++++++- tests/components/x9c/test.esp32-c3-idf.yaml | 2 +- tests/components/x9c/test.esp32-c3.yaml | 2 +- tests/components/x9c/test.esp32-idf.yaml | 2 +- tests/components/x9c/test.esp32.yaml | 2 +- tests/components/x9c/test.esp8266.yaml | 2 +- tests/components/x9c/test.rp2040.yaml | 2 +- 7 files changed, 13 insertions(+), 7 deletions(-) diff --git a/esphome/components/x9c/output.py b/esphome/components/x9c/output.py index 56820efdfa..4497994982 100644 --- a/esphome/components/x9c/output.py +++ b/esphome/components/x9c/output.py @@ -27,7 +27,13 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_INITIAL_VALUE, default=1.0): cv.float_range( min=0.01, max=1.0 ), - cv.Optional(CONF_STEP_DELAY, default=1): cv.int_range(min=1, max=100), + cv.Optional(CONF_STEP_DELAY, default="1us"): cv.All( + cv.positive_time_period_microseconds, + cv.Range( + min=cv.TimePeriod(microseconds=1), + max=cv.TimePeriod(microseconds=100), + ), + ), } ) ) diff --git a/tests/components/x9c/test.esp32-c3-idf.yaml b/tests/components/x9c/test.esp32-c3-idf.yaml index 1234581329..972c743fcd 100644 --- a/tests/components/x9c/test.esp32-c3-idf.yaml +++ b/tests/components/x9c/test.esp32-c3-idf.yaml @@ -5,4 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.esp32-c3.yaml b/tests/components/x9c/test.esp32-c3.yaml index 1234581329..972c743fcd 100644 --- a/tests/components/x9c/test.esp32-c3.yaml +++ b/tests/components/x9c/test.esp32-c3.yaml @@ -5,4 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.esp32-idf.yaml b/tests/components/x9c/test.esp32-idf.yaml index 5f1468e94b..f587b69b4f 100644 --- a/tests/components/x9c/test.esp32-idf.yaml +++ b/tests/components/x9c/test.esp32-idf.yaml @@ -5,4 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.esp32.yaml b/tests/components/x9c/test.esp32.yaml index 5f1468e94b..f587b69b4f 100644 --- a/tests/components/x9c/test.esp32.yaml +++ b/tests/components/x9c/test.esp32.yaml @@ -5,4 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.esp8266.yaml b/tests/components/x9c/test.esp8266.yaml index 5f1468e94b..f587b69b4f 100644 --- a/tests/components/x9c/test.esp8266.yaml +++ b/tests/components/x9c/test.esp8266.yaml @@ -5,4 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 - step_delay: 50 + step_delay: 50us diff --git a/tests/components/x9c/test.rp2040.yaml b/tests/components/x9c/test.rp2040.yaml index 1234581329..972c743fcd 100644 --- a/tests/components/x9c/test.rp2040.yaml +++ b/tests/components/x9c/test.rp2040.yaml @@ -5,4 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 - step_delay: 50 + step_delay: 50us From 8453d9a70da397baac09a1b3a158b6d88f27e2ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 09:27:15 +1200 Subject: [PATCH 029/233] Bump actions/checkout from 4.1.6 to 4.1.7 (#6900) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-api-proto.yml | 2 +- .github/workflows/ci-docker.yml | 2 +- .github/workflows/ci.yml | 32 +++++++++++------------ .github/workflows/release.yml | 8 +++--- .github/workflows/sync-device-classes.yml | 4 +-- .github/workflows/yaml-lint.yml | 2 +- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/.github/workflows/ci-api-proto.yml b/.github/workflows/ci-api-proto.yml index 1628464061..ee08a0246d 100644 --- a/.github/workflows/ci-api-proto.yml +++ b/.github/workflows/ci-api-proto.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Set up Python uses: actions/setup-python@v5.1.0 with: diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index dd5c051cfb..421a885f74 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -40,7 +40,7 @@ jobs: arch: [amd64, armv7, aarch64] build_type: ["ha-addon", "docker", "lint"] steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Set up Python uses: actions/setup-python@v5.1.0 with: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b49237db26..3c10e5dac7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -34,7 +34,7 @@ jobs: cache-key: ${{ steps.cache-key.outputs.key }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Generate cache-key id: cache-key run: echo key="${{ hashFiles('requirements.txt', 'requirements_optional.txt', 'requirements_test.txt') }}" >> $GITHUB_OUTPUT @@ -66,7 +66,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -87,7 +87,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -108,7 +108,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -129,7 +129,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -150,7 +150,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -199,7 +199,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -229,7 +229,7 @@ jobs: - common steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -254,7 +254,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Find all YAML test files id: set-matrix run: echo "matrix=$(ls tests/test*.yaml | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT @@ -271,7 +271,7 @@ jobs: file: ${{ fromJson(needs.compile-tests-list.outputs.matrix) }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -303,7 +303,7 @@ jobs: file: ${{ fromJson(needs.compile-tests-list.outputs.matrix) }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -358,7 +358,7 @@ jobs: steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -410,7 +410,7 @@ jobs: count: ${{ steps.list-components.outputs.count }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 with: # Fetch enough history so `git merge-base refs/remotes/origin/dev HEAD` works. fetch-depth: 500 @@ -458,7 +458,7 @@ jobs: run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: @@ -484,7 +484,7 @@ jobs: matrix: ${{ steps.split.outputs.components }} steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Split components into 20 groups id: split run: | @@ -512,7 +512,7 @@ jobs: run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Restore Python uses: ./.github/actions/restore-python with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 563d485b6a..9c07335104 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -19,7 +19,7 @@ jobs: tag: ${{ steps.tag.outputs.tag }} branch_build: ${{ steps.tag.outputs.branch_build }} steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Get tag id: tag # yamllint disable rule:line-length @@ -51,7 +51,7 @@ jobs: contents: read id-token: write steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Set up Python uses: actions/setup-python@v5.1.0 with: @@ -83,7 +83,7 @@ jobs: - linux/arm/v7 - linux/arm64 steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Set up Python uses: actions/setup-python@v5.1.0 with: @@ -174,7 +174,7 @@ jobs: - ghcr - dockerhub steps: - - uses: actions/checkout@v4.1.6 + - uses: actions/checkout@v4.1.7 - name: Download digests uses: actions/download-artifact@v4.1.7 diff --git a/.github/workflows/sync-device-classes.yml b/.github/workflows/sync-device-classes.yml index e65e851f3c..45f6b27127 100644 --- a/.github/workflows/sync-device-classes.yml +++ b/.github/workflows/sync-device-classes.yml @@ -13,10 +13,10 @@ jobs: if: github.repository == 'esphome/esphome' steps: - name: Checkout - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Checkout Home Assistant - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 with: repository: home-assistant/core path: lib/home-assistant diff --git a/.github/workflows/yaml-lint.yml b/.github/workflows/yaml-lint.yml index f009643629..1c0b5f58ad 100644 --- a/.github/workflows/yaml-lint.yml +++ b/.github/workflows/yaml-lint.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code from GitHub - uses: actions/checkout@v4.1.6 + uses: actions/checkout@v4.1.7 - name: Run yamllint uses: frenck/action-yamllint@v1.5.0 with: From c4c46c206fd5d8edfab0a2769821db0beaae5908 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:12:36 +1200 Subject: [PATCH 030/233] Bump esphome-dashboard to 20240613.0 (#6901) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 05e46ca31e..a7b08f8a14 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pyserial==3.5 platformio==6.1.15 # When updating platformio, also update Dockerfile esptool==4.7.0 click==8.1.7 -esphome-dashboard==20240429.1 +esphome-dashboard==20240613.0 aioesphomeapi==24.3.0 zeroconf==0.132.2 python-magic==0.4.27 From fdefc825bb473fedc4fb2b8001ba6ce3f4fe2c7f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 19:58:56 +1200 Subject: [PATCH 031/233] [CI] Fix for sdl (#6892) --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5a1887c33c..b49237db26 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -454,7 +454,7 @@ jobs: matrix: file: ${{ fromJson(needs.list-components.outputs.components) }} steps: - - name: Install libsodium + - name: Install dependencies run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub @@ -508,8 +508,8 @@ jobs: - name: List components run: echo ${{ matrix.components }} - - name: Install libsodium - run: sudo apt-get install libsodium-dev + - name: Install dependencies + run: sudo apt-get install libsodium-dev libsdl2-dev - name: Check out code from GitHub uses: actions/checkout@v4.1.6 From be486e0ca65bad647289c3a4cfd4d09a09b02e64 Mon Sep 17 00:00:00 2001 From: Oliver Hihn <43825356+oliverhihn@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:09:26 +0200 Subject: [PATCH 032/233] Add step_delay option to X9C component (#6890) --- esphome/components/x9c/output.py | 3 +++ esphome/components/x9c/x9c.cpp | 5 +++-- esphome/components/x9c/x9c.h | 2 ++ esphome/const.py | 1 + tests/components/x9c/test.esp32-c3-idf.yaml | 1 + tests/components/x9c/test.esp32-c3.yaml | 1 + tests/components/x9c/test.esp32-idf.yaml | 1 + tests/components/x9c/test.esp32.yaml | 1 + tests/components/x9c/test.esp8266.yaml | 1 + tests/components/x9c/test.rp2040.yaml | 1 + 10 files changed, 15 insertions(+), 2 deletions(-) diff --git a/esphome/components/x9c/output.py b/esphome/components/x9c/output.py index 44e9d729b3..56820efdfa 100644 --- a/esphome/components/x9c/output.py +++ b/esphome/components/x9c/output.py @@ -8,6 +8,7 @@ from esphome.const import ( CONF_INC_PIN, CONF_UD_PIN, CONF_INITIAL_VALUE, + CONF_STEP_DELAY, ) CODEOWNERS = ["@EtienneMD"] @@ -26,6 +27,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_INITIAL_VALUE, default=1.0): cv.float_range( min=0.01, max=1.0 ), + cv.Optional(CONF_STEP_DELAY, default=1): cv.int_range(min=1, max=100), } ) ) @@ -44,3 +46,4 @@ async def to_code(config): cg.add(var.set_ud_pin(ud_pin)) cg.add(var.set_initial_value(config[CONF_INITIAL_VALUE])) + cg.add(var.set_step_delay(config[CONF_STEP_DELAY])) diff --git a/esphome/components/x9c/x9c.cpp b/esphome/components/x9c/x9c.cpp index 32a1375f02..4e7a94266e 100644 --- a/esphome/components/x9c/x9c.cpp +++ b/esphome/components/x9c/x9c.cpp @@ -22,9 +22,9 @@ void X9cOutput::trim_value(int change_amount) { for (int i = 0; i < abs(change_amount); i++) { // Move wiper this->inc_pin_->digital_write(true); - delayMicroseconds(1); + delayMicroseconds(this->step_delay_); this->inc_pin_->digital_write(false); - delayMicroseconds(1); + delayMicroseconds(this->step_delay_); } delayMicroseconds(100); // Let value settle @@ -69,6 +69,7 @@ void X9cOutput::dump_config() { LOG_PIN(" Increment Pin: ", this->inc_pin_); LOG_PIN(" Up/Down Pin: ", this->ud_pin_); ESP_LOGCONFIG(TAG, " Initial Value: %f", this->initial_value_); + ESP_LOGCONFIG(TAG, " Step Delay: %d", this->step_delay_); LOG_FLOAT_OUTPUT(this); } diff --git a/esphome/components/x9c/x9c.h b/esphome/components/x9c/x9c.h index 924460c841..e7cc29a6cc 100644 --- a/esphome/components/x9c/x9c.h +++ b/esphome/components/x9c/x9c.h @@ -13,6 +13,7 @@ class X9cOutput : public output::FloatOutput, public Component { void set_inc_pin(InternalGPIOPin *pin) { inc_pin_ = pin; } void set_ud_pin(InternalGPIOPin *pin) { ud_pin_ = pin; } void set_initial_value(float initial_value) { initial_value_ = initial_value; } + void set_step_delay(int step_delay) { step_delay_ = step_delay; } void setup() override; void dump_config() override; @@ -26,6 +27,7 @@ class X9cOutput : public output::FloatOutput, public Component { InternalGPIOPin *ud_pin_; float initial_value_; float pot_value_; + int step_delay_; }; } // namespace x9c diff --git a/esphome/const.py b/esphome/const.py index 0117e8a238..4d0223fa22 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -784,6 +784,7 @@ CONF_STATIC_IP = "static_ip" CONF_STATUS = "status" CONF_STB_PIN = "stb_pin" CONF_STEP = "step" +CONF_STEP_DELAY = "step_delay" CONF_STEP_MODE = "step_mode" CONF_STEP_PIN = "step_pin" CONF_STOP = "stop" diff --git a/tests/components/x9c/test.esp32-c3-idf.yaml b/tests/components/x9c/test.esp32-c3-idf.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.esp32-c3-idf.yaml +++ b/tests/components/x9c/test.esp32-c3-idf.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32-c3.yaml b/tests/components/x9c/test.esp32-c3.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.esp32-c3.yaml +++ b/tests/components/x9c/test.esp32-c3.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32-idf.yaml b/tests/components/x9c/test.esp32-idf.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp32-idf.yaml +++ b/tests/components/x9c/test.esp32-idf.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp32.yaml b/tests/components/x9c/test.esp32.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp32.yaml +++ b/tests/components/x9c/test.esp32.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.esp8266.yaml b/tests/components/x9c/test.esp8266.yaml index 28b18f7a92..5f1468e94b 100644 --- a/tests/components/x9c/test.esp8266.yaml +++ b/tests/components/x9c/test.esp8266.yaml @@ -5,3 +5,4 @@ output: inc_pin: 14 ud_pin: 15 initial_value: 0.5 + step_delay: 50 diff --git a/tests/components/x9c/test.rp2040.yaml b/tests/components/x9c/test.rp2040.yaml index a0480aa68f..1234581329 100644 --- a/tests/components/x9c/test.rp2040.yaml +++ b/tests/components/x9c/test.rp2040.yaml @@ -5,3 +5,4 @@ output: inc_pin: 4 ud_pin: 5 initial_value: 0.5 + step_delay: 50 From 91e72fe121acf4d0994bfd084f05e149ce2de92b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:20:46 +1200 Subject: [PATCH 033/233] [host] Execute host program when using run command (#6897) --- esphome/__main__.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/esphome/__main__.py b/esphome/__main__.py index f3c4ff3e23..5ff1a28ec7 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -488,6 +488,15 @@ def command_run(args, config): if exit_code != 0: return exit_code _LOGGER.info("Successfully compiled program.") + if CORE.is_host: + from esphome.platformio_api import get_idedata + + idedata = get_idedata(config) + if idedata is None: + return 1 + program_path = idedata.raw["prog_path"] + return run_external_process(program_path) + port = choose_upload_log_host( default=args.device, check_default=None, From 73cb3ec852a3bbdca1430578d4bc3cba114eb115 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:12:36 +1200 Subject: [PATCH 034/233] Bump esphome-dashboard to 20240613.0 (#6901) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 05e46ca31e..a7b08f8a14 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pyserial==3.5 platformio==6.1.15 # When updating platformio, also update Dockerfile esptool==4.7.0 click==8.1.7 -esphome-dashboard==20240429.1 +esphome-dashboard==20240613.0 aioesphomeapi==24.3.0 zeroconf==0.132.2 python-magic==0.4.27 From 3db71b98ae4278fa5f54112e7eb885794c258d6b Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 13 Jun 2024 10:31:08 +1200 Subject: [PATCH 035/233] Bump version to 2024.6.0b2 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 4d0223fa22..e2dc5c259a 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b1" +__version__ = "2024.6.0b2" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From b29e1acab81ddc3bfef041c1cdba0048be2b8c86 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Thu, 13 Jun 2024 19:24:36 +1200 Subject: [PATCH 036/233] Synchronise Device Classes from Home Assistant (#6904) --- esphome/components/update/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index ae3d5062ab..ea1cf778b6 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -7,6 +7,7 @@ from esphome.const import ( CONF_ID, CONF_MQTT_ID, CONF_WEB_SERVER_ID, + DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, ) from esphome.core import CORE, coroutine_with_priority @@ -24,6 +25,7 @@ PerformAction = update_ns.class_("PerformAction", automation.Action) IsAvailableCondition = update_ns.class_("IsAvailableCondition", automation.Condition) DEVICE_CLASSES = [ + DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, ] From 761aae6f892edc3d447e4478e4d20c3d124a66a1 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Thu, 13 Jun 2024 05:15:38 -0500 Subject: [PATCH 037/233] [CI] Allow clang-tidy to see IDF components (#6903) * Allow clang-tidy to see IDF components * Remove camera, add tflite-micro --- .github/workflows/ci.yml | 7 +++++++ esphome/idf_component.yml | 9 +++++++++ script/clang-tidy | 6 ++++-- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 esphome/idf_component.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3c10e5dac7..df7a9178e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -387,6 +387,13 @@ jobs: echo "::add-matcher::.github/workflows/matchers/gcc.json" echo "::add-matcher::.github/workflows/matchers/clang-tidy.json" + - name: Run 'pio run --list-targets -e esp32-idf-tidy' + if: matrix.name == 'Run script/clang-tidy for ESP32 IDF' + run: | + . venv/bin/activate + mkdir -p .temp + pio run --list-targets -e esp32-idf-tidy + - name: Run clang-tidy run: | . venv/bin/activate diff --git a/esphome/idf_component.yml b/esphome/idf_component.yml new file mode 100644 index 0000000000..ba1a6312e2 --- /dev/null +++ b/esphome/idf_component.yml @@ -0,0 +1,9 @@ +dependencies: + esp-tflite-micro: + git: https://github.com/espressif/esp-tflite-micro.git + mdns: + git: https://github.com/espressif/esp-protocols.git + version: mdns-v1.2.5 + path: components/mdns + rules: + - if: "idf_version >=5.0" diff --git a/script/clang-tidy b/script/clang-tidy index 84b02306d5..bd919825fd 100755 --- a/script/clang-tidy +++ b/script/clang-tidy @@ -101,8 +101,10 @@ def clang_options(idedata): # add library include directories using -isystem to suppress their errors for directory in sorted(set(idedata["includes"]["build"])): # skip our own directories, we add those later - if not directory.startswith(f"{root_path}/") or directory.startswith( - f"{root_path}/.pio/" + if ( + not directory.startswith(f"{root_path}/") + or directory.startswith(f"{root_path}/.pio/") + or directory.startswith(f"{root_path}/managed_components/") ): cmd.extend(["-isystem", directory]) From 5adadeaa07939f593a761cd2a044db8f8d4385d3 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Thu, 13 Jun 2024 05:42:08 -0500 Subject: [PATCH 038/233] [esp32_camera] Use newer library version (for #6802) (#6809) --- esphome/components/esp32_camera/__init__.py | 9 ++++++--- esphome/idf_component.yml | 3 +++ platformio.ini | 1 - 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/esphome/components/esp32_camera/__init__.py b/esphome/components/esp32_camera/__init__.py index 462900d401..4187429412 100644 --- a/esphome/components/esp32_camera/__init__.py +++ b/esphome/components/esp32_camera/__init__.py @@ -17,7 +17,7 @@ from esphome.const import ( CONF_VSYNC_PIN, ) from esphome.core import CORE -from esphome.components.esp32 import add_idf_sdkconfig_option +from esphome.components.esp32 import add_idf_component from esphome.cpp_helpers import setup_entity DEPENDENCIES = ["esp32"] @@ -290,8 +290,11 @@ async def to_code(config): cg.add_define("USE_ESP32_CAMERA") if CORE.using_esp_idf: - cg.add_library("espressif/esp32-camera", "1.0.0") - add_idf_sdkconfig_option("CONFIG_RTCIO_SUPPORT_RTC_GPIO_DESC", True) + add_idf_component( + name="esp32-camera", + repo="https://github.com/espressif/esp32-camera.git", + ref="v2.0.9", + ) for conf in config.get(CONF_ON_STREAM_START, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) diff --git a/esphome/idf_component.yml b/esphome/idf_component.yml index ba1a6312e2..c031b2192f 100644 --- a/esphome/idf_component.yml +++ b/esphome/idf_component.yml @@ -1,6 +1,9 @@ dependencies: esp-tflite-micro: git: https://github.com/espressif/esp-tflite-micro.git + esp32_camera: + git: https://github.com/espressif/esp32-camera.git + version: v2.0.9 mdns: git: https://github.com/espressif/esp-protocols.git version: mdns-v1.2.5 diff --git a/platformio.ini b/platformio.ini index 6b34b2f05d..ee82dee243 100644 --- a/platformio.ini +++ b/platformio.ini @@ -142,7 +142,6 @@ platform_packages = framework = espidf lib_deps = ${common:idf.lib_deps} - espressif/esp32-camera@1.0.0 ; esp32_camera droscy/esp_wireguard@0.4.1 ; wireguard build_flags = ${common:idf.build_flags} From 2fc43fa9c71e7f1a5785efffee787033366ca188 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Thu, 13 Jun 2024 19:38:35 -0500 Subject: [PATCH 039/233] [micro_wake_word] Pin to esp-tflite-micro v1.3.1 (#6906) --- esphome/components/micro_wake_word/__init__.py | 1 + esphome/idf_component.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/esphome/components/micro_wake_word/__init__.py b/esphome/components/micro_wake_word/__init__.py index def2808e54..35ee3cfedc 100644 --- a/esphome/components/micro_wake_word/__init__.py +++ b/esphome/components/micro_wake_word/__init__.py @@ -312,6 +312,7 @@ async def to_code(config): esp32.add_idf_component( name="esp-tflite-micro", repo="https://github.com/espressif/esp-tflite-micro", + ref="v1.3.1", ) cg.add_build_flag("-DTF_LITE_STATIC_MEMORY") diff --git a/esphome/idf_component.yml b/esphome/idf_component.yml index c031b2192f..5f4701b5a3 100644 --- a/esphome/idf_component.yml +++ b/esphome/idf_component.yml @@ -1,6 +1,7 @@ dependencies: esp-tflite-micro: git: https://github.com/espressif/esp-tflite-micro.git + version: v1.3.1 esp32_camera: git: https://github.com/espressif/esp32-camera.git version: v2.0.9 From 290816be11016699c9413d2c62fb92149f201bb4 Mon Sep 17 00:00:00 2001 From: Anton Viktorov Date: Sun, 16 Jun 2024 09:50:00 +0200 Subject: [PATCH 040/233] VEML7700 Fix GCC build warnings (#6881) --- esphome/components/veml7700/veml7700.cpp | 2 +- esphome/components/veml7700/veml7700.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/esphome/components/veml7700/veml7700.cpp b/esphome/components/veml7700/veml7700.cpp index 68550811a1..a8c1411c68 100644 --- a/esphome/components/veml7700/veml7700.cpp +++ b/esphome/components/veml7700/veml7700.cpp @@ -243,7 +243,7 @@ ErrorCode VEML7700Component::configure_() { } PSMRegister psm{0}; - psm.PSM = PSM::PSM_MODE_1; + psm.PSM = PSMMode::PSM_MODE_1; psm.PSM_EN = false; ESP_LOGV(TAG, "Setting PSM to 0x%04X", psm.raw); err = this->write_register((uint8_t) CommandRegisters::PWR_SAVING, psm.raw_bytes, VEML_REG_SIZE); diff --git a/esphome/components/veml7700/veml7700.h b/esphome/components/veml7700/veml7700.h index fe5e1158e3..17fee6b851 100644 --- a/esphome/components/veml7700/veml7700.h +++ b/esphome/components/veml7700/veml7700.h @@ -24,7 +24,7 @@ enum class CommandRegisters : uint8_t { ALS_INT = 0x06 // R: ALS INT trigger event }; -enum Gain : uint8_t { +enum Gain : uint16_t { X_1 = 0, X_2 = 1, X_1_8 = 2, @@ -32,7 +32,7 @@ enum Gain : uint8_t { }; const uint8_t GAINS_COUNT = 4; -enum IntegrationTime : uint8_t { +enum IntegrationTime : uint16_t { INTEGRATION_TIME_25MS = 0b1100, INTEGRATION_TIME_50MS = 0b1000, INTEGRATION_TIME_100MS = 0b0000, @@ -42,14 +42,14 @@ enum IntegrationTime : uint8_t { }; const uint8_t INTEGRATION_TIMES_COUNT = 6; -enum Persistence : uint8_t { +enum Persistence : uint16_t { PERSISTENCE_1 = 0, PERSISTENCE_2 = 1, PERSISTENCE_4 = 2, PERSISTENCE_8 = 3, }; -enum PSM : uint8_t { +enum PSMMode : uint16_t { PSM_MODE_1 = 0, PSM_MODE_2 = 1, PSM_MODE_3 = 2, @@ -92,7 +92,7 @@ union PSMRegister { uint8_t raw_bytes[2]; struct { bool PSM_EN : 1; - uint8_t PSM : 2; + PSMMode PSM : 2; uint16_t reserved : 13; } __attribute__((packed)); }; From d49f2cbec80355694f046088ac0c35ef6483f77a Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Sun, 16 Jun 2024 03:02:15 -0500 Subject: [PATCH 041/233] IDF 5 fixes for #6802 (#6911) --- esphome/components/ethernet/ethernet_component.cpp | 2 +- esphome/components/voice_assistant/voice_assistant.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/ethernet/ethernet_component.cpp b/esphome/components/ethernet/ethernet_component.cpp index 75bdd29be7..7370cb4b44 100644 --- a/esphome/components/ethernet/ethernet_component.cpp +++ b/esphome/components/ethernet/ethernet_component.cpp @@ -631,7 +631,7 @@ void EthernetComponent::write_phy_register_(esp_eth_mac_t *mac, PHYRegister regi ESPHL_ERROR_CHECK(err, "Writing PHY Register failed"); if (this->type_ == ETHERNET_TYPE_RTL8201 && register_data.page) { - ESP_LOGD(TAG, "Select PHY Register Page 0x%02" PRIX32, 0x0); + ESP_LOGD(TAG, "Select PHY Register Page 0x00"); err = mac->write_phy_reg(mac, this->phy_addr_, eth_phy_psr_reg_addr, 0x0); ESPHL_ERROR_CHECK(err, "Select PHY Register Page 0 failed"); } diff --git a/esphome/components/voice_assistant/voice_assistant.cpp b/esphome/components/voice_assistant/voice_assistant.cpp index 1fa8236cf4..8a8a9e92aa 100644 --- a/esphome/components/voice_assistant/voice_assistant.cpp +++ b/esphome/components/voice_assistant/voice_assistant.cpp @@ -799,7 +799,7 @@ void VoiceAssistant::on_audio(const api::VoiceAssistantAudio &msg) { this->speaker_buffer_index_ += msg.data.length(); this->speaker_buffer_size_ += msg.data.length(); this->speaker_bytes_received_ += msg.data.length(); - ESP_LOGV(TAG, "Received audio: %" PRId32 " bytes from API", msg.data.length()); + ESP_LOGV(TAG, "Received audio: %u bytes from API", msg.data.length()); } else { ESP_LOGE(TAG, "Cannot receive audio, buffer is full"); } From 253303f3a9f27012660e30b7745ddccd5a713715 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:01:07 +1200 Subject: [PATCH 042/233] [ili9xxx] Fix init for GC9A01A (#6913) --- .../components/ili9xxx/ili9xxx_display.cpp | 20 ++++++++++++++++--- esphome/components/ili9xxx/ili9xxx_display.h | 3 ++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/esphome/components/ili9xxx/ili9xxx_display.cpp b/esphome/components/ili9xxx/ili9xxx_display.cpp index 21d46ea825..de03df5d41 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.cpp +++ b/esphome/components/ili9xxx/ili9xxx_display.cpp @@ -34,8 +34,8 @@ void ILI9XXXDisplay::setup() { ESP_LOGD(TAG, "Setting up ILI9xxx"); this->setup_pins_(); - this->init_lcd_(this->init_sequence_); - this->init_lcd_(this->extra_init_sequence_.data()); + this->init_lcd(this->init_sequence_); + this->init_lcd(this->extra_init_sequence_.data()); switch (this->pixel_mode_) { case PIXEL_MODE_16: if (this->is_18bitdisplay_) { @@ -405,7 +405,7 @@ void ILI9XXXDisplay::reset_() { } } -void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { +void ILI9XXXDisplay::init_lcd(const uint8_t *addr) { if (addr == nullptr) return; uint8_t cmd, x, num_args; @@ -427,6 +427,20 @@ void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { } } +void ILI9XXXGC9A01A::init_lcd(const uint8_t *addr) { + if (addr == nullptr) + return; + uint8_t cmd, x, num_args; + while ((cmd = *addr++) != 0) { + x = *addr++; + num_args = x & 0x7F; + this->send_command(cmd, addr, num_args); + addr += num_args; + if (x & 0x80) + delay(150); // NOLINT + } +} + // Tell the display controller where we want to draw pixels. void ILI9XXXDisplay::set_addr_window_(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { x1 += this->offset_x_; diff --git a/esphome/components/ili9xxx/ili9xxx_display.h b/esphome/components/ili9xxx/ili9xxx_display.h index 7a320dac7b..b60047a8c3 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.h +++ b/esphome/components/ili9xxx/ili9xxx_display.h @@ -109,7 +109,7 @@ class ILI9XXXDisplay : public display::DisplayBuffer, virtual void set_madctl(); void display_(); - void init_lcd_(const uint8_t *addr); + virtual void init_lcd(const uint8_t *addr); void set_addr_window_(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2); void reset_(); @@ -269,6 +269,7 @@ class ILI9XXXS3BoxLite : public ILI9XXXDisplay { class ILI9XXXGC9A01A : public ILI9XXXDisplay { public: ILI9XXXGC9A01A() : ILI9XXXDisplay(INITCMD_GC9A01A, 240, 240, true) {} + void init_lcd(const uint8_t *addr) override; }; //----------- ILI9XXX_24_TFT display -------------- From 6b89763ad61f4bd0ab5cb8d6417dd678972b6ed6 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:20:04 +1200 Subject: [PATCH 043/233] [mqtt] Fix datetime copy pasta (#6914) --- esphome/components/mqtt/mqtt_datetime.cpp | 6 +++--- esphome/components/mqtt/mqtt_datetime.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/esphome/components/mqtt/mqtt_datetime.cpp b/esphome/components/mqtt/mqtt_datetime.cpp index 4fa44aafb8..4ae6d0d416 100644 --- a/esphome/components/mqtt/mqtt_datetime.cpp +++ b/esphome/components/mqtt/mqtt_datetime.cpp @@ -6,12 +6,12 @@ #include "mqtt_const.h" #ifdef USE_MQTT -#ifdef USE_DATETIME_TIME +#ifdef USE_DATETIME_DATETIME namespace esphome { namespace mqtt { -static const char *const TAG = "mqtt.datetime.time"; +static const char *const TAG = "mqtt.datetime.datetime"; using namespace esphome::datetime; @@ -80,5 +80,5 @@ bool MQTTDateTimeComponent::publish_state(uint16_t year, uint8_t month, uint8_t } // namespace mqtt } // namespace esphome -#endif // USE_DATETIME_TIME +#endif // USE_DATETIME_DATETIME #endif // USE_MQTT diff --git a/esphome/components/mqtt/mqtt_datetime.h b/esphome/components/mqtt/mqtt_datetime.h index f0d68ad2e1..ba81c06cb3 100644 --- a/esphome/components/mqtt/mqtt_datetime.h +++ b/esphome/components/mqtt/mqtt_datetime.h @@ -3,7 +3,7 @@ #include "esphome/core/defines.h" #ifdef USE_MQTT -#ifdef USE_DATETIME_TIME +#ifdef USE_DATETIME_DATETIME #include "esphome/components/datetime/datetime_entity.h" #include "mqtt_component.h" @@ -17,7 +17,7 @@ class MQTTDateTimeComponent : public mqtt::MQTTComponent { * * @param time The time entity. */ - explicit MQTTDateTimeComponent(datetime::DateTimeEntity *time); + explicit MQTTDateTimeComponent(datetime::DateTimeEntity *datetime); // ========== INTERNAL METHODS ========== // (In most use cases you won't need these) @@ -41,5 +41,5 @@ class MQTTDateTimeComponent : public mqtt::MQTTComponent { } // namespace mqtt } // namespace esphome -#endif // USE_DATETIME_DATE +#endif // USE_DATETIME_DATETIME #endif // USE_MQTT From eb50f0eafd7e920c7405ae476a6878e3c53ee6ba Mon Sep 17 00:00:00 2001 From: esphomebot Date: Thu, 13 Jun 2024 19:24:36 +1200 Subject: [PATCH 044/233] Synchronise Device Classes from Home Assistant (#6904) --- esphome/components/update/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index ae3d5062ab..ea1cf778b6 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -7,6 +7,7 @@ from esphome.const import ( CONF_ID, CONF_MQTT_ID, CONF_WEB_SERVER_ID, + DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, ) from esphome.core import CORE, coroutine_with_priority @@ -24,6 +25,7 @@ PerformAction = update_ns.class_("PerformAction", automation.Action) IsAvailableCondition = update_ns.class_("IsAvailableCondition", automation.Condition) DEVICE_CLASSES = [ + DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, ] From 1e66241b2696c80f222dd853db76bd10acb48ac4 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:01:07 +1200 Subject: [PATCH 045/233] [ili9xxx] Fix init for GC9A01A (#6913) --- .../components/ili9xxx/ili9xxx_display.cpp | 20 ++++++++++++++++--- esphome/components/ili9xxx/ili9xxx_display.h | 3 ++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/esphome/components/ili9xxx/ili9xxx_display.cpp b/esphome/components/ili9xxx/ili9xxx_display.cpp index 21d46ea825..de03df5d41 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.cpp +++ b/esphome/components/ili9xxx/ili9xxx_display.cpp @@ -34,8 +34,8 @@ void ILI9XXXDisplay::setup() { ESP_LOGD(TAG, "Setting up ILI9xxx"); this->setup_pins_(); - this->init_lcd_(this->init_sequence_); - this->init_lcd_(this->extra_init_sequence_.data()); + this->init_lcd(this->init_sequence_); + this->init_lcd(this->extra_init_sequence_.data()); switch (this->pixel_mode_) { case PIXEL_MODE_16: if (this->is_18bitdisplay_) { @@ -405,7 +405,7 @@ void ILI9XXXDisplay::reset_() { } } -void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { +void ILI9XXXDisplay::init_lcd(const uint8_t *addr) { if (addr == nullptr) return; uint8_t cmd, x, num_args; @@ -427,6 +427,20 @@ void ILI9XXXDisplay::init_lcd_(const uint8_t *addr) { } } +void ILI9XXXGC9A01A::init_lcd(const uint8_t *addr) { + if (addr == nullptr) + return; + uint8_t cmd, x, num_args; + while ((cmd = *addr++) != 0) { + x = *addr++; + num_args = x & 0x7F; + this->send_command(cmd, addr, num_args); + addr += num_args; + if (x & 0x80) + delay(150); // NOLINT + } +} + // Tell the display controller where we want to draw pixels. void ILI9XXXDisplay::set_addr_window_(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) { x1 += this->offset_x_; diff --git a/esphome/components/ili9xxx/ili9xxx_display.h b/esphome/components/ili9xxx/ili9xxx_display.h index 7a320dac7b..b60047a8c3 100644 --- a/esphome/components/ili9xxx/ili9xxx_display.h +++ b/esphome/components/ili9xxx/ili9xxx_display.h @@ -109,7 +109,7 @@ class ILI9XXXDisplay : public display::DisplayBuffer, virtual void set_madctl(); void display_(); - void init_lcd_(const uint8_t *addr); + virtual void init_lcd(const uint8_t *addr); void set_addr_window_(uint16_t x, uint16_t y, uint16_t x2, uint16_t y2); void reset_(); @@ -269,6 +269,7 @@ class ILI9XXXS3BoxLite : public ILI9XXXDisplay { class ILI9XXXGC9A01A : public ILI9XXXDisplay { public: ILI9XXXGC9A01A() : ILI9XXXDisplay(INITCMD_GC9A01A, 240, 240, true) {} + void init_lcd(const uint8_t *addr) override; }; //----------- ILI9XXX_24_TFT display -------------- From 65638bf61420b2278b5043fc98f713475be2b749 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:20:04 +1200 Subject: [PATCH 046/233] [mqtt] Fix datetime copy pasta (#6914) --- esphome/components/mqtt/mqtt_datetime.cpp | 6 +++--- esphome/components/mqtt/mqtt_datetime.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/esphome/components/mqtt/mqtt_datetime.cpp b/esphome/components/mqtt/mqtt_datetime.cpp index 4fa44aafb8..4ae6d0d416 100644 --- a/esphome/components/mqtt/mqtt_datetime.cpp +++ b/esphome/components/mqtt/mqtt_datetime.cpp @@ -6,12 +6,12 @@ #include "mqtt_const.h" #ifdef USE_MQTT -#ifdef USE_DATETIME_TIME +#ifdef USE_DATETIME_DATETIME namespace esphome { namespace mqtt { -static const char *const TAG = "mqtt.datetime.time"; +static const char *const TAG = "mqtt.datetime.datetime"; using namespace esphome::datetime; @@ -80,5 +80,5 @@ bool MQTTDateTimeComponent::publish_state(uint16_t year, uint8_t month, uint8_t } // namespace mqtt } // namespace esphome -#endif // USE_DATETIME_TIME +#endif // USE_DATETIME_DATETIME #endif // USE_MQTT diff --git a/esphome/components/mqtt/mqtt_datetime.h b/esphome/components/mqtt/mqtt_datetime.h index f0d68ad2e1..ba81c06cb3 100644 --- a/esphome/components/mqtt/mqtt_datetime.h +++ b/esphome/components/mqtt/mqtt_datetime.h @@ -3,7 +3,7 @@ #include "esphome/core/defines.h" #ifdef USE_MQTT -#ifdef USE_DATETIME_TIME +#ifdef USE_DATETIME_DATETIME #include "esphome/components/datetime/datetime_entity.h" #include "mqtt_component.h" @@ -17,7 +17,7 @@ class MQTTDateTimeComponent : public mqtt::MQTTComponent { * * @param time The time entity. */ - explicit MQTTDateTimeComponent(datetime::DateTimeEntity *time); + explicit MQTTDateTimeComponent(datetime::DateTimeEntity *datetime); // ========== INTERNAL METHODS ========== // (In most use cases you won't need these) @@ -41,5 +41,5 @@ class MQTTDateTimeComponent : public mqtt::MQTTComponent { } // namespace mqtt } // namespace esphome -#endif // USE_DATETIME_DATE +#endif // USE_DATETIME_DATETIME #endif // USE_MQTT From 25a3db1637d82fbc36a45c0e1d68f0bee7748718 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 17 Jun 2024 15:35:53 +1200 Subject: [PATCH 047/233] Bump version to 2024.6.0b3 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index e2dc5c259a..a0fe325282 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b2" +__version__ = "2024.6.0b3" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 51c5d1714cb8ee434b1c64d50280e328a11f4abf Mon Sep 17 00:00:00 2001 From: Giel van Schijndel Date: Mon, 17 Jun 2024 07:48:56 +0200 Subject: [PATCH 048/233] fix(dallas): make recovery time for 1-bit equal to that of 0-bit (#6763) --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index f47e8d58e3..34c2cf3c29 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -60,7 +60,7 @@ void HOT IRAM_ATTR GPIOOneWireBus::write_bit_(bool bit) { // recovery time: t_rec: min=1µs // ds18b20 appears to read the bus after roughly 14µs uint32_t delay0 = bit ? 6 : 60; - uint32_t delay1 = bit ? 54 : 5; + uint32_t delay1 = bit ? 59 : 5; // delay A/C delayMicroseconds(delay0); From 015cd42a2ed8197e189cc851aea0207bb0fd2b6e Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:06:25 -0500 Subject: [PATCH 049/233] [CI-ethernet] Add/fix/organize/clean up ethernet component tests (#6916) --- ...{lan8720.esp32-idf.yaml => common-dp83848.yaml} | 2 +- .../{lan8720.esp32.yaml => common-ip101.yaml} | 2 +- tests/components/ethernet/common-jl1101.yaml | 12 ++++++++++++ tests/components/ethernet/common-ksz8081.yaml | 12 ++++++++++++ tests/components/ethernet/common-ksz8081rna.yaml | 12 ++++++++++++ .../ethernet/{common.yaml => common-lan8720.yaml} | 0 tests/components/ethernet/common-rtl8201.yaml | 12 ++++++++++++ .../{w5500.esp32.yaml => common-w5500.yaml} | 12 ++++++------ .../ethernet/test-dp83848.esp32-idf.yaml | 1 + tests/components/ethernet/test-dp83848.esp32.yaml | 1 + .../components/ethernet/test-ip101.esp32-idf.yaml | 1 + tests/components/ethernet/test-ip101.esp32.yaml | 1 + .../components/ethernet/test-jl1101.esp32-idf.yaml | 1 + tests/components/ethernet/test-jl1101.esp32.yaml | 1 + .../ethernet/test-ksz8081.esp32-idf.yaml | 1 + tests/components/ethernet/test-ksz8081.esp32.yaml | 1 + .../ethernet/test-ksz8081rna.esp32-idf.yaml | 1 + .../components/ethernet/test-ksz8081rna.esp32.yaml | 1 + .../ethernet/test-lan8720.esp32-idf.yaml | 1 + tests/components/ethernet/test-lan8720.esp32.yaml | 1 + .../ethernet/test-rtl8201.esp32-idf.yaml | 1 + tests/components/ethernet/test-rtl8201.esp32.yaml | 1 + .../components/ethernet/test-w5500.esp32-idf.yaml | 1 + tests/components/ethernet/test-w5500.esp32.yaml | 1 + tests/components/ethernet/test.esp32-idf.yaml | 1 - tests/components/ethernet/test.esp32.yaml | 1 - tests/components/ethernet/w5500.esp32-idf.yaml | 14 -------------- 27 files changed, 72 insertions(+), 24 deletions(-) rename tests/components/ethernet/{lan8720.esp32-idf.yaml => common-dp83848.yaml} (92%) rename tests/components/ethernet/{lan8720.esp32.yaml => common-ip101.yaml} (92%) create mode 100644 tests/components/ethernet/common-jl1101.yaml create mode 100644 tests/components/ethernet/common-ksz8081.yaml create mode 100644 tests/components/ethernet/common-ksz8081rna.yaml rename tests/components/ethernet/{common.yaml => common-lan8720.yaml} (100%) create mode 100644 tests/components/ethernet/common-rtl8201.yaml rename tests/components/ethernet/{w5500.esp32.yaml => common-w5500.yaml} (57%) create mode 100644 tests/components/ethernet/test-dp83848.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-dp83848.esp32.yaml create mode 100644 tests/components/ethernet/test-ip101.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-ip101.esp32.yaml create mode 100644 tests/components/ethernet/test-jl1101.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-jl1101.esp32.yaml create mode 100644 tests/components/ethernet/test-ksz8081.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-ksz8081.esp32.yaml create mode 100644 tests/components/ethernet/test-ksz8081rna.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-ksz8081rna.esp32.yaml create mode 100644 tests/components/ethernet/test-lan8720.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-lan8720.esp32.yaml create mode 100644 tests/components/ethernet/test-rtl8201.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-rtl8201.esp32.yaml create mode 100644 tests/components/ethernet/test-w5500.esp32-idf.yaml create mode 100644 tests/components/ethernet/test-w5500.esp32.yaml delete mode 100644 tests/components/ethernet/test.esp32-idf.yaml delete mode 100644 tests/components/ethernet/test.esp32.yaml delete mode 100644 tests/components/ethernet/w5500.esp32-idf.yaml diff --git a/tests/components/ethernet/lan8720.esp32-idf.yaml b/tests/components/ethernet/common-dp83848.yaml similarity index 92% rename from tests/components/ethernet/lan8720.esp32-idf.yaml rename to tests/components/ethernet/common-dp83848.yaml index b9ed9cb036..5b6ed3e8d0 100644 --- a/tests/components/ethernet/lan8720.esp32-idf.yaml +++ b/tests/components/ethernet/common-dp83848.yaml @@ -1,5 +1,5 @@ ethernet: - type: LAN8720 + type: DP83848 mdc_pin: 23 mdio_pin: 25 clk_mode: GPIO0_IN diff --git a/tests/components/ethernet/lan8720.esp32.yaml b/tests/components/ethernet/common-ip101.yaml similarity index 92% rename from tests/components/ethernet/lan8720.esp32.yaml rename to tests/components/ethernet/common-ip101.yaml index b9ed9cb036..5ca369cce1 100644 --- a/tests/components/ethernet/lan8720.esp32.yaml +++ b/tests/components/ethernet/common-ip101.yaml @@ -1,5 +1,5 @@ ethernet: - type: LAN8720 + type: IP101 mdc_pin: 23 mdio_pin: 25 clk_mode: GPIO0_IN diff --git a/tests/components/ethernet/common-jl1101.yaml b/tests/components/ethernet/common-jl1101.yaml new file mode 100644 index 0000000000..639542d807 --- /dev/null +++ b/tests/components/ethernet/common-jl1101.yaml @@ -0,0 +1,12 @@ +ethernet: + type: JL1101 + mdc_pin: 23 + mdio_pin: 25 + clk_mode: GPIO0_IN + phy_addr: 0 + power_pin: 26 + manual_ip: + static_ip: 192.168.178.56 + gateway: 192.168.178.1 + subnet: 255.255.255.0 + domain: .local diff --git a/tests/components/ethernet/common-ksz8081.yaml b/tests/components/ethernet/common-ksz8081.yaml new file mode 100644 index 0000000000..167606a1eb --- /dev/null +++ b/tests/components/ethernet/common-ksz8081.yaml @@ -0,0 +1,12 @@ +ethernet: + type: KSZ8081 + mdc_pin: 23 + mdio_pin: 25 + clk_mode: GPIO0_IN + phy_addr: 0 + power_pin: 26 + manual_ip: + static_ip: 192.168.178.56 + gateway: 192.168.178.1 + subnet: 255.255.255.0 + domain: .local diff --git a/tests/components/ethernet/common-ksz8081rna.yaml b/tests/components/ethernet/common-ksz8081rna.yaml new file mode 100644 index 0000000000..f506906b1b --- /dev/null +++ b/tests/components/ethernet/common-ksz8081rna.yaml @@ -0,0 +1,12 @@ +ethernet: + type: KSZ8081RNA + mdc_pin: 23 + mdio_pin: 25 + clk_mode: GPIO0_IN + phy_addr: 0 + power_pin: 26 + manual_ip: + static_ip: 192.168.178.56 + gateway: 192.168.178.1 + subnet: 255.255.255.0 + domain: .local diff --git a/tests/components/ethernet/common.yaml b/tests/components/ethernet/common-lan8720.yaml similarity index 100% rename from tests/components/ethernet/common.yaml rename to tests/components/ethernet/common-lan8720.yaml diff --git a/tests/components/ethernet/common-rtl8201.yaml b/tests/components/ethernet/common-rtl8201.yaml new file mode 100644 index 0000000000..43842e7c9f --- /dev/null +++ b/tests/components/ethernet/common-rtl8201.yaml @@ -0,0 +1,12 @@ +ethernet: + type: RTL8201 + mdc_pin: 23 + mdio_pin: 25 + clk_mode: GPIO0_IN + phy_addr: 0 + power_pin: 26 + manual_ip: + static_ip: 192.168.178.56 + gateway: 192.168.178.1 + subnet: 255.255.255.0 + domain: .local diff --git a/tests/components/ethernet/w5500.esp32.yaml b/tests/components/ethernet/common-w5500.yaml similarity index 57% rename from tests/components/ethernet/w5500.esp32.yaml rename to tests/components/ethernet/common-w5500.yaml index 6fdccb36e3..76661a75c3 100644 --- a/tests/components/ethernet/w5500.esp32.yaml +++ b/tests/components/ethernet/common-w5500.yaml @@ -1,11 +1,11 @@ ethernet: type: W5500 - clk_pin: GPIO19 - mosi_pin: GPIO21 - miso_pin: GPIO23 - cs_pin: GPIO18 - interrupt_pin: GPIO36 - reset_pin: GPIO22 + clk_pin: 19 + mosi_pin: 21 + miso_pin: 23 + cs_pin: 18 + interrupt_pin: 36 + reset_pin: 22 clock_speed: 10Mhz manual_ip: static_ip: 192.168.178.56 diff --git a/tests/components/ethernet/test-dp83848.esp32-idf.yaml b/tests/components/ethernet/test-dp83848.esp32-idf.yaml new file mode 100644 index 0000000000..906bfba17c --- /dev/null +++ b/tests/components/ethernet/test-dp83848.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-dp83848.yaml diff --git a/tests/components/ethernet/test-dp83848.esp32.yaml b/tests/components/ethernet/test-dp83848.esp32.yaml new file mode 100644 index 0000000000..906bfba17c --- /dev/null +++ b/tests/components/ethernet/test-dp83848.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-dp83848.yaml diff --git a/tests/components/ethernet/test-ip101.esp32-idf.yaml b/tests/components/ethernet/test-ip101.esp32-idf.yaml new file mode 100644 index 0000000000..e52329d7ea --- /dev/null +++ b/tests/components/ethernet/test-ip101.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-ip101.yaml diff --git a/tests/components/ethernet/test-ip101.esp32.yaml b/tests/components/ethernet/test-ip101.esp32.yaml new file mode 100644 index 0000000000..e52329d7ea --- /dev/null +++ b/tests/components/ethernet/test-ip101.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-ip101.yaml diff --git a/tests/components/ethernet/test-jl1101.esp32-idf.yaml b/tests/components/ethernet/test-jl1101.esp32-idf.yaml new file mode 100644 index 0000000000..95d8cd1f21 --- /dev/null +++ b/tests/components/ethernet/test-jl1101.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-jl1101.yaml diff --git a/tests/components/ethernet/test-jl1101.esp32.yaml b/tests/components/ethernet/test-jl1101.esp32.yaml new file mode 100644 index 0000000000..95d8cd1f21 --- /dev/null +++ b/tests/components/ethernet/test-jl1101.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-jl1101.yaml diff --git a/tests/components/ethernet/test-ksz8081.esp32-idf.yaml b/tests/components/ethernet/test-ksz8081.esp32-idf.yaml new file mode 100644 index 0000000000..8f3c750c77 --- /dev/null +++ b/tests/components/ethernet/test-ksz8081.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-ksz8081.yaml diff --git a/tests/components/ethernet/test-ksz8081.esp32.yaml b/tests/components/ethernet/test-ksz8081.esp32.yaml new file mode 100644 index 0000000000..8f3c750c77 --- /dev/null +++ b/tests/components/ethernet/test-ksz8081.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-ksz8081.yaml diff --git a/tests/components/ethernet/test-ksz8081rna.esp32-idf.yaml b/tests/components/ethernet/test-ksz8081rna.esp32-idf.yaml new file mode 100644 index 0000000000..a48e591996 --- /dev/null +++ b/tests/components/ethernet/test-ksz8081rna.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-ksz8081rna.yaml diff --git a/tests/components/ethernet/test-ksz8081rna.esp32.yaml b/tests/components/ethernet/test-ksz8081rna.esp32.yaml new file mode 100644 index 0000000000..a48e591996 --- /dev/null +++ b/tests/components/ethernet/test-ksz8081rna.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-ksz8081rna.yaml diff --git a/tests/components/ethernet/test-lan8720.esp32-idf.yaml b/tests/components/ethernet/test-lan8720.esp32-idf.yaml new file mode 100644 index 0000000000..3df9ac874a --- /dev/null +++ b/tests/components/ethernet/test-lan8720.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-lan8720.yaml diff --git a/tests/components/ethernet/test-lan8720.esp32.yaml b/tests/components/ethernet/test-lan8720.esp32.yaml new file mode 100644 index 0000000000..3df9ac874a --- /dev/null +++ b/tests/components/ethernet/test-lan8720.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-lan8720.yaml diff --git a/tests/components/ethernet/test-rtl8201.esp32-idf.yaml b/tests/components/ethernet/test-rtl8201.esp32-idf.yaml new file mode 100644 index 0000000000..e69f88dc94 --- /dev/null +++ b/tests/components/ethernet/test-rtl8201.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-rtl8201.yaml diff --git a/tests/components/ethernet/test-rtl8201.esp32.yaml b/tests/components/ethernet/test-rtl8201.esp32.yaml new file mode 100644 index 0000000000..e69f88dc94 --- /dev/null +++ b/tests/components/ethernet/test-rtl8201.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-rtl8201.yaml diff --git a/tests/components/ethernet/test-w5500.esp32-idf.yaml b/tests/components/ethernet/test-w5500.esp32-idf.yaml new file mode 100644 index 0000000000..36f1b5365f --- /dev/null +++ b/tests/components/ethernet/test-w5500.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-w5500.yaml diff --git a/tests/components/ethernet/test-w5500.esp32.yaml b/tests/components/ethernet/test-w5500.esp32.yaml new file mode 100644 index 0000000000..36f1b5365f --- /dev/null +++ b/tests/components/ethernet/test-w5500.esp32.yaml @@ -0,0 +1 @@ +<<: !include common-w5500.yaml diff --git a/tests/components/ethernet/test.esp32-idf.yaml b/tests/components/ethernet/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/ethernet/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/ethernet/test.esp32.yaml b/tests/components/ethernet/test.esp32.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/ethernet/test.esp32.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/ethernet/w5500.esp32-idf.yaml b/tests/components/ethernet/w5500.esp32-idf.yaml deleted file mode 100644 index 6fdccb36e3..0000000000 --- a/tests/components/ethernet/w5500.esp32-idf.yaml +++ /dev/null @@ -1,14 +0,0 @@ -ethernet: - type: W5500 - clk_pin: GPIO19 - mosi_pin: GPIO21 - miso_pin: GPIO23 - cs_pin: GPIO18 - interrupt_pin: GPIO36 - reset_pin: GPIO22 - clock_speed: 10Mhz - manual_ip: - static_ip: 192.168.178.56 - gateway: 192.168.178.1 - subnet: 255.255.255.0 - domain: .local From 67d8c7c69164c48debffff6868c2dc9282ffc37b Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:14:19 -0500 Subject: [PATCH 050/233] [CI-a01nyub] Consolidate test files (#6917) --- tests/components/a01nyub/common.yaml | 11 +++++++++++ tests/components/a01nyub/test.esp32-c3-idf.yaml | 16 ++++------------ tests/components/a01nyub/test.esp32-c3.yaml | 16 ++++------------ tests/components/a01nyub/test.esp32-idf.yaml | 16 ++++------------ tests/components/a01nyub/test.esp32.yaml | 16 ++++------------ tests/components/a01nyub/test.esp8266.yaml | 16 ++++------------ tests/components/a01nyub/test.rp2040.yaml | 16 ++++------------ 7 files changed, 35 insertions(+), 72 deletions(-) create mode 100644 tests/components/a01nyub/common.yaml diff --git a/tests/components/a01nyub/common.yaml b/tests/components/a01nyub/common.yaml new file mode 100644 index 0000000000..0717acfff7 --- /dev/null +++ b/tests/components/a01nyub/common.yaml @@ -0,0 +1,11 @@ +uart: + - id: uart_a01nyub + tx_pin: ${tx_pin} + rx_pin: ${rx_pin} + baud_rate: 9600 + +sensor: + - platform: a01nyub + id: a01nyub_sensor + name: a01nyub Distance + uart_id: uart_a01nyub diff --git a/tests/components/a01nyub/test.esp32-c3-idf.yaml b/tests/components/a01nyub/test.esp32-c3-idf.yaml index 3132f77136..b516342f3b 100644 --- a/tests/components/a01nyub/test.esp32-c3-idf.yaml +++ b/tests/components/a01nyub/test.esp32-c3-idf.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 4 - rx_pin: - number: 5 - baud_rate: 9600 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.esp32-c3.yaml b/tests/components/a01nyub/test.esp32-c3.yaml index 3132f77136..b516342f3b 100644 --- a/tests/components/a01nyub/test.esp32-c3.yaml +++ b/tests/components/a01nyub/test.esp32-c3.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 4 - rx_pin: - number: 5 - baud_rate: 9600 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.esp32-idf.yaml b/tests/components/a01nyub/test.esp32-idf.yaml index 79fc9c5fbf..f486544afa 100644 --- a/tests/components/a01nyub/test.esp32-idf.yaml +++ b/tests/components/a01nyub/test.esp32-idf.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 17 - rx_pin: - number: 16 - baud_rate: 9600 +substitutions: + tx_pin: GPIO17 + rx_pin: GPIO16 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.esp32.yaml b/tests/components/a01nyub/test.esp32.yaml index 79fc9c5fbf..f486544afa 100644 --- a/tests/components/a01nyub/test.esp32.yaml +++ b/tests/components/a01nyub/test.esp32.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 17 - rx_pin: - number: 16 - baud_rate: 9600 +substitutions: + tx_pin: GPIO17 + rx_pin: GPIO16 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.esp8266.yaml b/tests/components/a01nyub/test.esp8266.yaml index 3132f77136..b516342f3b 100644 --- a/tests/components/a01nyub/test.esp8266.yaml +++ b/tests/components/a01nyub/test.esp8266.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 4 - rx_pin: - number: 5 - baud_rate: 9600 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml diff --git a/tests/components/a01nyub/test.rp2040.yaml b/tests/components/a01nyub/test.rp2040.yaml index 3132f77136..b516342f3b 100644 --- a/tests/components/a01nyub/test.rp2040.yaml +++ b/tests/components/a01nyub/test.rp2040.yaml @@ -1,13 +1,5 @@ -uart: - - id: uart_a01nyub - tx_pin: - number: 4 - rx_pin: - number: 5 - baud_rate: 9600 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -sensor: - - platform: a01nyub - id: a01nyub_sensor - name: a01nyub Distance - uart_id: uart_a01nyub +<<: !include common.yaml From d604c8ae644ee91c714c1ae887b7fcbf400a759b Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:18:04 -0500 Subject: [PATCH 051/233] [CI-api] Test fix for IDF 5+ (#6918) --- tests/components/api/common.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/components/api/common.yaml b/tests/components/api/common.yaml index 3c56811b95..e0b900f92d 100644 --- a/tests/components/api/common.yaml +++ b/tests/components/api/common.yaml @@ -50,12 +50,12 @@ api: then: - logger.log: # yamllint disable rule:line-length - format: "Bool: %s (%u), Int: %d (%u), Float: %f (%u), String: %s (%u)" + format: "Bool: %s (%u), Int: %ld (%u), Float: %f (%u), String: %s (%u)" # yamllint enable rule:line-length args: - YESNO(bool_arr[0]) - bool_arr.size() - - int_arr[0] + - (long) int_arr[0] - int_arr.size() - float_arr[0] - float_arr.size() From 41f810f8285c7f94d0f629e30828848d13cb734b Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:21:15 -0500 Subject: [PATCH 052/233] [CI-http_request] Test fix for IDF 5+ (#6919) --- tests/components/http_request/common.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/components/http_request/common.yaml b/tests/components/http_request/common.yaml index 83b334ca2d..589b7fb4b4 100644 --- a/tests/components/http_request/common.yaml +++ b/tests/components/http_request/common.yaml @@ -15,10 +15,10 @@ esphome: on_response: then: - logger.log: - format: "Response status: %d, Duration: %u ms" + format: "Response status: %d, Duration: %lu ms" args: - response->status_code - - response->duration_ms + - (long) response->duration_ms - http_request.post: url: https://esphome.io headers: From c30913ccdeebb4627a864132e8cd37c5264e88a5 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:23:24 -0500 Subject: [PATCH 053/233] [CI-wireguard] Test file consolidation (#6920) --- tests/components/wireguard/common.yaml | 59 ++++++++++++++++++ tests/components/wireguard/test.bk72xx.yaml | 60 +----------------- .../wireguard/test.esp32-c3-idf.yaml | 61 +------------------ tests/components/wireguard/test.esp32-c3.yaml | 61 +------------------ .../components/wireguard/test.esp32-idf.yaml | 60 +----------------- tests/components/wireguard/test.esp32.yaml | 60 +----------------- tests/components/wireguard/test.esp8266.yaml | 60 +----------------- 7 files changed, 65 insertions(+), 356 deletions(-) create mode 100644 tests/components/wireguard/common.yaml diff --git a/tests/components/wireguard/common.yaml b/tests/components/wireguard/common.yaml new file mode 100644 index 0000000000..cd7ab1075e --- /dev/null +++ b/tests/components/wireguard/common.yaml @@ -0,0 +1,59 @@ +wifi: + ssid: "MySSID1" + password: "password1" + +time: + - platform: sntp + +wireguard: + address: 172.16.34.100 + netmask: 255.255.255.0 + # NEVER use the following keys for your VPN -- they are now public! + private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= + peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= + peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= + peer_endpoint: wg.server.example + peer_persistent_keepalive: 25s + peer_allowed_ips: + - 172.16.34.0/24 + - 192.168.4.0/24 + +binary_sensor: + - platform: wireguard + status: + name: 'WireGuard Status' + enabled: + name: 'WireGuard Enabled' + +sensor: + - platform: wireguard + latest_handshake: + name: 'WireGuard Latest Handshake' + +text_sensor: + - platform: wireguard + address: + name: 'WireGuard Address' + +button: + - platform: template + name: 'Toggle WireGuard' + entity_category: config + on_press: + - if: + condition: wireguard.enabled + then: + - wireguard.disable: + else: + - wireguard.enable: + + - platform: template + name: 'Log WireGuard status' + entity_category: config + on_press: + - if: + condition: wireguard.peer_online + then: + - logger.log: 'wireguard remote peer is online' + else: + - logger.log: 'wireguard remote peer is offline' diff --git a/tests/components/wireguard/test.bk72xx.yaml b/tests/components/wireguard/test.bk72xx.yaml index 85325139a9..dade44d145 100644 --- a/tests/components/wireguard/test.bk72xx.yaml +++ b/tests/components/wireguard/test.bk72xx.yaml @@ -1,59 +1 @@ -wifi: - ssid: "MySSID1" - password: "password1" - -time: - - platform: sntp - -wireguard: - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' +<<: !include common.yaml diff --git a/tests/components/wireguard/test.esp32-c3-idf.yaml b/tests/components/wireguard/test.esp32-c3-idf.yaml index 37d1727842..dade44d145 100644 --- a/tests/components/wireguard/test.esp32-c3-idf.yaml +++ b/tests/components/wireguard/test.esp32-c3-idf.yaml @@ -1,60 +1 @@ -wifi: - ssid: MySSID - password: password1 - -time: - - platform: sntp - -wireguard: - id: vpn - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' +<<: !include common.yaml diff --git a/tests/components/wireguard/test.esp32-c3.yaml b/tests/components/wireguard/test.esp32-c3.yaml index 37d1727842..dade44d145 100644 --- a/tests/components/wireguard/test.esp32-c3.yaml +++ b/tests/components/wireguard/test.esp32-c3.yaml @@ -1,60 +1 @@ -wifi: - ssid: MySSID - password: password1 - -time: - - platform: sntp - -wireguard: - id: vpn - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' +<<: !include common.yaml diff --git a/tests/components/wireguard/test.esp32-idf.yaml b/tests/components/wireguard/test.esp32-idf.yaml index 9ea7f00bdb..2798f8e566 100644 --- a/tests/components/wireguard/test.esp32-idf.yaml +++ b/tests/components/wireguard/test.esp32-idf.yaml @@ -1,62 +1,4 @@ -wifi: - ssid: "MySSID1" - password: "password1" +<<: !include common.yaml network: enable_ipv6: true - -time: - - platform: sntp - -wireguard: - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' diff --git a/tests/components/wireguard/test.esp32.yaml b/tests/components/wireguard/test.esp32.yaml index 9ea7f00bdb..2798f8e566 100644 --- a/tests/components/wireguard/test.esp32.yaml +++ b/tests/components/wireguard/test.esp32.yaml @@ -1,62 +1,4 @@ -wifi: - ssid: "MySSID1" - password: "password1" +<<: !include common.yaml network: enable_ipv6: true - -time: - - platform: sntp - -wireguard: - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' diff --git a/tests/components/wireguard/test.esp8266.yaml b/tests/components/wireguard/test.esp8266.yaml index 9ea7f00bdb..2798f8e566 100644 --- a/tests/components/wireguard/test.esp8266.yaml +++ b/tests/components/wireguard/test.esp8266.yaml @@ -1,62 +1,4 @@ -wifi: - ssid: "MySSID1" - password: "password1" +<<: !include common.yaml network: enable_ipv6: true - -time: - - platform: sntp - -wireguard: - address: 172.16.34.100 - netmask: 255.255.255.0 - # NEVER use the following keys for your vpn, they are now public! - private_key: wPBMxtNYH3mChicrbpsRpZIasIdPq3yZuthn23FbGG8= - peer_public_key: Hs2JfikvYU03/Kv3YoAs1hrUIPPTEkpsZKSPUljE9yc= - peer_preshared_key: 20fjM5GRnSolGPC5SRj9ljgIUyQfruv0B0bvLl3Yt60= - peer_endpoint: wg.server.example - peer_persistent_keepalive: 25s - peer_allowed_ips: - - 172.16.34.0/24 - - 192.168.4.0/24 - -binary_sensor: - - platform: wireguard - status: - name: 'WireGuard Status' - enabled: - name: 'WireGuard Enabled' - -sensor: - - platform: wireguard - latest_handshake: - name: 'WireGuard Latest Handshake' - -text_sensor: - - platform: wireguard - address: - name: 'WireGuard Address' - -button: - - platform: template - name: 'Toggle WireGuard' - entity_category: config - on_press: - - if: - condition: wireguard.enabled - then: - - wireguard.disable: - else: - - wireguard.enable: - - - platform: template - name: 'Log WireGuard status' - entity_category: config - on_press: - - if: - condition: wireguard.peer_online - then: - - logger.log: 'wireguard remote peer is online' - else: - - logger.log: 'wireguard remote peer is offline' From a59c9b4f771f6d6a65af6caa33b0c0edae6af087 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 02:30:54 -0500 Subject: [PATCH 054/233] [CI-esp32_hall] Remove IDF test (#6921) --- tests/components/esp32_hall/common.yaml | 3 --- tests/components/esp32_hall/test.esp32-idf.yaml | 1 - tests/components/esp32_hall/test.esp32.yaml | 4 +++- 3 files changed, 3 insertions(+), 5 deletions(-) delete mode 100644 tests/components/esp32_hall/common.yaml delete mode 100644 tests/components/esp32_hall/test.esp32-idf.yaml diff --git a/tests/components/esp32_hall/common.yaml b/tests/components/esp32_hall/common.yaml deleted file mode 100644 index f8429f5aa0..0000000000 --- a/tests/components/esp32_hall/common.yaml +++ /dev/null @@ -1,3 +0,0 @@ -sensor: - - platform: esp32_hall - name: ESP32 Hall Sensor diff --git a/tests/components/esp32_hall/test.esp32-idf.yaml b/tests/components/esp32_hall/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/esp32_hall/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/esp32_hall/test.esp32.yaml b/tests/components/esp32_hall/test.esp32.yaml index dade44d145..f8429f5aa0 100644 --- a/tests/components/esp32_hall/test.esp32.yaml +++ b/tests/components/esp32_hall/test.esp32.yaml @@ -1 +1,3 @@ -<<: !include common.yaml +sensor: + - platform: esp32_hall + name: ESP32 Hall Sensor From f6848fe24d58ac7bcb1bc79e210a41a2f09bf571 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 17 Jun 2024 16:32:11 -0500 Subject: [PATCH 055/233] [CI] Introduce testing for IDF 5 (and other arbitrary framework versions) (#6802) * Initial changes to support testing of additional framework versions * Rename Arduino test files --- script/test_build_components | 25 ++++++++++--------- .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...esp32.yaml => test-dp83848.esp32-ard.yaml} | 0 ...1.esp32.yaml => test-ip101.esp32-ard.yaml} | 0 ....esp32.yaml => test-jl1101.esp32-ard.yaml} | 0 ...esp32.yaml => test-ksz8081.esp32-ard.yaml} | 0 ...32.yaml => test-ksz8081rna.esp32-ard.yaml} | 0 ...esp32.yaml => test-lan8720.esp32-ard.yaml} | 0 ...esp32.yaml => test-rtl8201.esp32-ard.yaml} | 0 ...0.esp32.yaml => test-w5500.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...p8266.yaml => test-nossl.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...{test.bk72xx.yaml => test.bk72xx-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-s3.yaml => test.esp32-s3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...t.esp32-s2.yaml => test.esp32-s2-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...test.esp32-c3.yaml => test.esp32-ard.yaml} | 0 ...test.esp32.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 .../{test.esp32.yaml => test.esp32-ard.yaml} | 0 ...t.esp32-c3.yaml => test.esp32-c3-ard.yaml} | 0 ...est.esp8266.yaml => test.esp8266-ard.yaml} | 0 ...{test.rp2040.yaml => test.rp2040-ard.yaml} | 0 ... => build_components_base.bk72xx-ard.yaml} | 0 ...build_components_base.esp32-c3-idf-50.yaml | 19 ++++++++++++++ .../build_components_base.esp32-idf-50.yaml | 19 ++++++++++++++ ...build_components_base.esp32-s2-idf-50.yaml | 20 +++++++++++++++ .../build_components_base.esp32-s2-idf.yaml | 2 +- ...build_components_base.esp32-s3-idf-50.yaml | 20 +++++++++++++++ .../build_components_base.esp32-s3-idf.yaml | 2 +- ...=> build_components_base.esp8266-ard.yaml} | 2 +- ... => build_components_base.rp2040-ard.yaml} | 2 +- 1689 files changed, 95 insertions(+), 16 deletions(-) rename tests/components/a01nyub/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/a01nyub/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/a01nyub/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/a01nyub/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/a02yyuw/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/a02yyuw/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/a02yyuw/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/a02yyuw/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/a4988/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/a4988/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/a4988/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/a4988/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/absolute_humidity/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/absolute_humidity/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/absolute_humidity/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/absolute_humidity/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ac_dimmer/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ac_dimmer/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ac_dimmer/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ac_dimmer/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/adc/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/adc/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/adc/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/adc/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/adc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/adc/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/adc128s102/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/adc128s102/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/adc128s102/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/adc128s102/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/addressable_light/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/addressable_light/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ade7880/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ade7880/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ade7880/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ade7880/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ade7953_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ade7953_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ade7953_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ade7953_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ade7953_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ade7953_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ade7953_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ade7953_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ads1115/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ads1115/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ads1115/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ads1115/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ags10/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ags10/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ags10/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/aht10/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/aht10/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/aht10/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/aht10/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/airthings_wave_mini/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/airthings_wave_mini/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/airthings_wave_plus/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/airthings_wave_plus/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/alarm_control_panel/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/alarm_control_panel/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/alarm_control_panel/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/alarm_control_panel/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/alpha3/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/alpha3/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/am2315c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/am2315c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/am2315c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/am2315c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/am2320/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/am2320/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/am2320/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/am2320/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/am43/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/am43/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/analog_threshold/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/analog_threshold/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/analog_threshold/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/analog_threshold/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/animation/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/animation/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/animation/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/animation/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/anova/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/anova/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/apds9960/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/apds9960/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/apds9960/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/apds9960/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/api/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/api/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/api/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/api/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/as3935_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/as3935_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/as3935_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/as3935_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/as3935_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/as3935_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/as3935_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/as3935_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/as5600/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/as5600/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/as5600/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/as5600/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/as7341/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/as7341/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/as7341/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/as7341/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/at581x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/at581x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/at581x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/at581x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/atc_mithermometer/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/atc_mithermometer/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/atm90e26/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/atm90e26/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/atm90e26/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/atm90e26/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/atm90e32/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/atm90e32/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/atm90e32/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/atm90e32/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/b_parasite/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/b_parasite/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ballu/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ballu/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bang_bang/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bang_bang/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bang_bang/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bang_bang/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bedjet/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bedjet/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/beken_spi_led_strip/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/bh1750/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bh1750/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bh1750/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bh1750/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/binary_sensor_map/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/binary_sensor_map/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/binary_sensor_map/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/binary_sensor_map/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bl0939/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bl0939/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bl0939/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bl0939/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bl0940/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bl0940/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bl0940/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bl0940/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bl0942/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bl0942/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bl0942/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bl0942/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ble_client/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ble_client/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ble_presence/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ble_presence/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ble_rssi/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ble_rssi/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ble_scanner/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ble_scanner/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bme280_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bme280_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bme280_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bme280_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bme280_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bme280_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bme280_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bme280_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bme680/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bme680/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bme680/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bme680/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bme680_bsec/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bme680_bsec/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmi160/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmi160/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmi160/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmi160/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp085/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp085/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp085/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp085/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp280/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp280/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp280/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp280/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp3xx_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp3xx_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp3xx_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp3xx_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp3xx_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp3xx_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp3xx_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp3xx_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bmp581/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bmp581/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bmp581/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bmp581/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bp1658cj/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bp1658cj/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bp1658cj/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bp1658cj/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/bp5758d/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/bp5758d/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/bp5758d/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/bp5758d/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/button/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/button/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/button/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/button/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/canbus/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/canbus/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cap1188/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cap1188/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cap1188/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cap1188/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/captive_portal/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/captive_portal/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/captive_portal/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ccs811/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ccs811/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ccs811/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ccs811/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cd74hc4067/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cd74hc4067/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cd74hc4067/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cd74hc4067/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/climate_ir_lg/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/climate_ir_lg/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/climate_ir_lg/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/color/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/color/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/color/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/color/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/color_temperature/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/color_temperature/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/color_temperature/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/color_temperature/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/combination/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/combination/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/combination/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/combination/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/coolix/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/coolix/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/coolix/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/copy/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/copy/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/copy/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/copy/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cs5460a/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cs5460a/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cs5460a/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cs5460a/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cse7761/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cse7761/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cse7761/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cse7761/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cse7766/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cse7766/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cse7766/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cse7766/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cst226/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cst816/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ct_clamp/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ct_clamp/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ct_clamp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ct_clamp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/current_based/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/current_based/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/current_based/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/current_based/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/cwww/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/cwww/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/cwww/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/cwww/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dac7678/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dac7678/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dac7678/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dac7678/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/daikin/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/daikin/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/daikin_arc/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/daikin_arc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/daikin_brc/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/daikin_brc/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/daikin_brc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dallas_temp/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dallas_temp/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dallas_temp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dallas_temp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/daly_bms/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/daly_bms/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/daly_bms/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/daly_bms/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/debug/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/debug/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/debug/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/debug/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/deep_sleep/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/deep_sleep/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/deep_sleep/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/delonghi/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/delonghi/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/delonghi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dfplayer/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dfplayer/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dfplayer/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dfplayer/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dfrobot_sen0395/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dfrobot_sen0395/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dfrobot_sen0395/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dfrobot_sen0395/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dht/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dht/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dht/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dht/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dht12/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dht12/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dht12/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dht12/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/display/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dps310/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dps310/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dps310/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dps310/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ds1307/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ds1307/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ds1307/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ds1307/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/dsmr/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/dsmr/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/dsmr/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/dsmr/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/duty_cycle/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/duty_cycle/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/duty_cycle/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/duty_cycle/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/duty_time/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/duty_time/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/duty_time/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/duty_time/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/e131/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/e131/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/e131/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/e131/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ee895/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ee895/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ee895/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ee895/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ektf2232/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ektf2232/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ektf2232/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ektf2232/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/emc2101/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/emc2101/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/emc2101/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/emc2101/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/emmeti/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/emmeti/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/endstop/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/endstop/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/endstop/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/endstop/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ens160_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ens160_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ens160_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ens160_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ens160_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ens160_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ens160_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ens160_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ens210/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ens210/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ens210/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ens210/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/esp32_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_ble_beacon/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble_beacon/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_ble_client/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble_client/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_ble_server/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble_server/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_ble_tracker/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_ble_tracker/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_camera/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_camera_web_server/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_can/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_can/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_dac/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_hall/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_improv/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_improv/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_rmt_led_strip/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp32_rmt_led_strip/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/esp32_touch/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/esp8266_pwm/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ethernet/{test-dp83848.esp32.yaml => test-dp83848.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-ip101.esp32.yaml => test-ip101.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-jl1101.esp32.yaml => test-jl1101.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-ksz8081.esp32.yaml => test-ksz8081.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-ksz8081rna.esp32.yaml => test-ksz8081rna.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-lan8720.esp32.yaml => test-lan8720.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-rtl8201.esp32.yaml => test-rtl8201.esp32-ard.yaml} (100%) rename tests/components/ethernet/{test-w5500.esp32.yaml => test-w5500.esp32-ard.yaml} (100%) rename tests/components/ethernet_info/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/event/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/event/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/event/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/event/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/exposure_notifications/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/exposure_notifications/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/external_components/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/external_components/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/external_components/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/external_components/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ezo/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ezo/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ezo/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ezo/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ezo_pmp/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ezo_pmp/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ezo_pmp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ezo_pmp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/factory_reset/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/factory_reset/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/factory_reset/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/factory_reset/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/fastled_clockless/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/fastled_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/feedback/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/feedback/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/feedback/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/feedback/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/fingerprint_grow/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/fingerprint_grow/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/fingerprint_grow/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/fingerprint_grow/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/font/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/font/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/font/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/font/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/fs3000/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/fs3000/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/fs3000/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/fs3000/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ft5x06/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ft5x06/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ft5x06/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ft5x06/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ft63x6/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ft63x6/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ft63x6/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ft63x6/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/fujitsu_general/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/fujitsu_general/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/fujitsu_general/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gcja5/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gcja5/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gcja5/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gcja5/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gdk101/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gdk101/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gdk101/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/globals/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/globals/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/globals/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/globals/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gp8403/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gp8403/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gp8403/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gp8403/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gpio/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gpio/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gpio/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gpio/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gps/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gps/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gps/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gps/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/graph/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/graph/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/graph/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/graph/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/graphical_display_menu/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/graphical_display_menu/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/graphical_display_menu/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/graphical_display_menu/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gree/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gree/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gree/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/grove_tb6612fng/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/grove_tb6612fng/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/grove_tb6612fng/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/grove_tb6612fng/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/growatt_solar/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/growatt_solar/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/growatt_solar/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/growatt_solar/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/gt911/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/gt911/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/gt911/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/gt911/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/haier/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/haier/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/haier/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/haier/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/havells_solar/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/havells_solar/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/havells_solar/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/havells_solar/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hbridge/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hbridge/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hbridge/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hbridge/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hdc1080/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hdc1080/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hdc1080/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hdc1080/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/he60r/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/he60r/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/he60r/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/he60r/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/heatpumpir/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/heatpumpir/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hitachi_ac344/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hitachi_ac344/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hitachi_ac344/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hitachi_ac424/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hitachi_ac424/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hitachi_ac424/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hlw8012/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hlw8012/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hlw8012/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hlw8012/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hm3301/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hm3301/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hm3301/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hm3301/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hmc5883l/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hmc5883l/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hmc5883l/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hmc5883l/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/homeassistant/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/homeassistant/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/homeassistant/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/homeassistant/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/homeassistant/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/honeywell_hih_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/honeywell_hih_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/honeywell_hih_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/honeywell_hih_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/honeywellabp/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/honeywellabp/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/honeywellabp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/honeywellabp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/honeywellabp2_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/honeywellabp2_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/honeywellabp2_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/honeywellabp2_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hrxl_maxsonar_wr/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hrxl_maxsonar_wr/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hrxl_maxsonar_wr/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hrxl_maxsonar_wr/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hte501/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hte501/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hte501/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hte501/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/http_request/{test-nossl.esp8266.yaml => test-nossl.esp8266-ard.yaml} (100%) rename tests/components/http_request/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/http_request/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/http_request/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/http_request/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/htu21d/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/htu21d/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/htu21d/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/htu21d/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/htu31d/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/htu31d/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hx711/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hx711/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hx711/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hx711/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hydreon_rgxx/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hydreon_rgxx/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hydreon_rgxx/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hydreon_rgxx/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/hyt271/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/hyt271/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/hyt271/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/hyt271/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/i2s_audio/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/i2s_audio/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/iaqcore/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/iaqcore/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/iaqcore/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/iaqcore/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ili9xxx/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ili9xxx/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ili9xxx/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ili9xxx/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/image/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/image/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/image/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/image/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/improv_serial/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/improv_serial/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/improv_serial/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/improv_serial/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina219/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina219/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina219/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina219/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina226/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina226/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina226/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina226/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina260/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina260/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina260/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina260/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina2xx_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina2xx_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina2xx_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina2xx_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina2xx_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina2xx_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina2xx_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina2xx_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ina3221/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ina3221/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ina3221/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ina3221/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/inkbird_ibsth1_mini/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/inkbird_ibsth1_mini/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/inkplate6/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/integration/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/integration/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/integration/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/integration/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/integration/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/integration/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/internal_temperature/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/internal_temperature/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/internal_temperature/{test.esp32-s2.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/internal_temperature/{test.esp32.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/internal_temperature/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/internal_temperature/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/interval/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/interval/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/interval/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/interval/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/jsn_sr04t/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/jsn_sr04t/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/jsn_sr04t/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/jsn_sr04t/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/kamstrup_kmp/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/kamstrup_kmp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/key_collector/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/key_collector/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/key_collector/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/key_collector/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/kmeteriso/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/kmeteriso/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/kmeteriso/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/kmeteriso/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/kuntze/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/kuntze/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/kuntze/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/kuntze/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lcd_gpio/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lcd_gpio/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lcd_gpio/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lcd_gpio/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lcd_menu/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lcd_menu/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lcd_menu/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lcd_menu/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lcd_pcf8574/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lcd_pcf8574/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lcd_pcf8574/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lcd_pcf8574/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ld2410/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ld2410/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ld2410/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ld2410/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ld2420/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ld2420/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ld2420/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ld2420/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ledc/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ledc/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/light/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/light/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/light/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/light/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lightwaverf/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lilygo_t5_47/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lilygo_t5_47/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lilygo_t5_47/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lilygo_t5_47/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/lock/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/lock/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/lock/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/lock/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/logger/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/logger/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/logger/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/logger/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ltr390/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ltr390/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ltr390/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ltr390/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ltr_als_ps/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ltr_als_ps/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ltr_als_ps/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ltr_als_ps/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/matrix_keypad/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/matrix_keypad/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/matrix_keypad/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/matrix_keypad/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max31855/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max31855/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max31855/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max31855/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max31856/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max31856/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max31856/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max31856/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max31865/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max31865/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max31865/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max31865/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max44009/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max44009/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max44009/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max44009/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max6675/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max6675/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max6675/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max6675/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max6956/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max6956/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max6956/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max6956/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max7219/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max7219/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max7219/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max7219/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max7219digit/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max7219digit/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max7219digit/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max7219digit/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/max9611/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/max9611/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/max9611/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/max9611/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23008/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23008/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23008/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23008/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23016/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23016/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23016/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23016/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23017/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23017/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23017/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23017/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23s08/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23s08/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23s08/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23s08/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp23s17/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp23s17/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp23s17/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp23s17/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp2515/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp2515/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp2515/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp2515/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp3008/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp3008/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp3008/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp3008/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp3204/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp3204/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp3204/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp3204/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp4725/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp4725/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp4725/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp4725/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp4728/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp4728/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp4728/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp4728/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp47a1/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp47a1/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp47a1/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp47a1/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp9600/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp9600/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp9600/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp9600/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mcp9808/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mcp9808/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mcp9808/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mcp9808/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mdns/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mdns/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mdns/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mdns/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/media_player/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mhz19/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mhz19/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mhz19/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mhz19/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/micronova/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/micronova/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/micronova/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/micronova/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/microphone/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/microphone/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mics_4514/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mics_4514/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mics_4514/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mics_4514/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/midea/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/midea/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/midea/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/midea_ir/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/midea_ir/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/midea_ir/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mitsubishi/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mitsubishi/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mitsubishi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mlx90393/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mlx90393/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mlx90393/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mlx90393/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mlx90614/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mlx90614/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mlx90614/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mlx90614/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mmc5603/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mmc5603/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mmc5603/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mmc5603/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mmc5983/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mmc5983/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mmc5983/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mmc5983/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/modbus/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/modbus/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/modbus/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/modbus/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/modbus_controller/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/modbus_controller/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/modbus_controller/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/modbus_controller/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/monochromatic/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/monochromatic/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/monochromatic/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/monochromatic/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mopeka_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mopeka_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mopeka_pro_check/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mopeka_pro_check/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mopeka_std_check/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mopeka_std_check/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpl3115a2/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mpl3115a2/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpl3115a2/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mpl3115a2/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mpr121/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mpr121/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpr121/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mpr121/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mpu6050/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mpu6050/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpu6050/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mpu6050/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mpu6886/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mpu6886/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mpu6886/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mpu6886/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/mqtt/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/mqtt/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mqtt/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mqtt/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/mqtt_subscribe/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/mqtt_subscribe/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/mqtt_subscribe/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ms5611/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ms5611/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ms5611/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ms5611/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/my9231/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/my9231/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/my9231/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/my9231/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/neopixelbus/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/neopixelbus/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/neopixelbus/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/network/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/network/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/network/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/network/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/nextion/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/nextion/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/nextion/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/nextion/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/noblex/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/noblex/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/noblex/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ntc/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ntc/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ntc/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/ntc/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/ntc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ntc/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ota/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ota/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ota/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ota/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/output/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/output/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/output/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/output/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/partition/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/partition/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pca6416a/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pca6416a/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pca6416a/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pca6416a/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pca9554/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pca9554/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pca9554/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pca9554/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pca9685/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pca9685/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pca9685/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pca9685/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pcd8544/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pcd8544/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pcd8544/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pcd8544/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pcf85063/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pcf85063/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pcf85063/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pcf85063/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pcf8563/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pcf8563/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pcf8563/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pcf8563/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pcf8574/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pcf8574/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pcf8574/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pcf8574/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pid/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pid/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pid/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pid/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pipsolar/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pipsolar/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pipsolar/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pipsolar/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pm1006/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pm1006/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pm1006/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pm1006/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pmsa003i/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pmsa003i/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pmsa003i/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pmsa003i/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pmsx003/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pmsx003/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pmsx003/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pmsx003/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pmwcs3/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pmwcs3/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pmwcs3/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pmwcs3/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn532_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn532_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn532_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn532_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn532_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn532_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn532_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn532_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn7150_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn7150_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn7150_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn7150_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn7160_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn7160_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn7160_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn7160_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pn7160_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pn7160_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pn7160_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pn7160_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/power_supply/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/power_supply/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/power_supply/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/power_supply/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/prometheus/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/prometheus/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/prometheus/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/psram/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/psram/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pulse_counter/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pulse_counter/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pulse_counter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pulse_counter/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pulse_meter/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pulse_meter/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pulse_meter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pulse_meter/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pulse_width/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pulse_width/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pulse_width/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pulse_width/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pvvx_mithermometer/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pvvx_mithermometer/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pylontech/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pylontech/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pylontech/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pylontech/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pzem004t/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pzem004t/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pzem004t/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pzem004t/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pzemac/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pzemac/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pzemac/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pzemac/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/pzemdc/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/pzemdc/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/pzemdc/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/pzemdc/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/qmc5883l/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/qmc5883l/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/qmc5883l/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/qmc5883l/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/qmp6988/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/qmp6988/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/qmp6988/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/qmp6988/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/qr_code/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/qr_code/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/qr_code/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/qr_code/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/qwiic_pir/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/qwiic_pir/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/qwiic_pir/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/qwiic_pir/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/radon_eye_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/radon_eye_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/radon_eye_rd200/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/radon_eye_rd200/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rc522_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rc522_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rc522_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rc522_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rc522_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rc522_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rc522_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rc522_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rdm6300/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rdm6300/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rdm6300/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rdm6300/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/remote_receiver/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/remote_receiver/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/remote_receiver/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/remote_transmitter/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/remote_transmitter/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/remote_transmitter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/resistance/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/resistance/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/resistance/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/resistance/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/resistance/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/resistance/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/restart/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/restart/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/restart/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/restart/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rf_bridge/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rf_bridge/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rf_bridge/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rf_bridge/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rgb/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rgb/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rgb/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rgb/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rgbct/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rgbct/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rgbct/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rgbct/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rgbw/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rgbw/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rgbw/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rgbw/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rgbww/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rgbww/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rgbww/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rgbww/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rotary_encoder/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rotary_encoder/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rotary_encoder/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rotary_encoder/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rp2040_pio_led_strip/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rp2040_pwm/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/rtttl/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/rtttl/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/rtttl/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/rtttl/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ruuvi_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ruuvi_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ruuvitag/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ruuvitag/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/safe_mode/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/safe_mode/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/safe_mode/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/safe_mode/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/scd30/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/scd30/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/scd30/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/scd30/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/scd4x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/scd4x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/scd4x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/scd4x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/script/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/script/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/script/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/script/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/script/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sdm_meter/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sdm_meter/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sdm_meter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sdm_meter/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sdp3x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sdp3x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sdp3x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sdp3x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sds011/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sds011/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sds011/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sds011/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/seeed_mr24hpc1/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/selec_meter/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/selec_meter/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/selec_meter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/selec_meter/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sen0321/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sen0321/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sen0321/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sen0321/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sen21231/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sen21231/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sen21231/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sen21231/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sen5x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sen5x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sen5x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sen5x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/senseair/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/senseair/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/senseair/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/senseair/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/servo/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/servo/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/servo/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/servo/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sfa30/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sfa30/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sfa30/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sfa30/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sgp30/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sgp30/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sgp30/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sgp30/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sgp4x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sgp4x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sgp4x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sgp4x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/shelly_dimmer/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sht3xd/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sht3xd/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sht3xd/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sht3xd/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sht4x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sht4x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sht4x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sht4x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/shtcx/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/shtcx/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/shtcx/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/shtcx/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/shutdown/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/shutdown/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/shutdown/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/shutdown/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sigma_delta_output/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sigma_delta_output/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sigma_delta_output/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sigma_delta_output/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sim800l/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sim800l/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sim800l/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sim800l/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/slow_pwm/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/slow_pwm/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/slow_pwm/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/slow_pwm/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm16716/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm16716/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm16716/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm16716/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm2135/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm2135/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm2135/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm2135/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm2235/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm2235/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm2235/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm2235/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm2335/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm2335/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm2335/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm2335/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sm300d2/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sm300d2/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sm300d2/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sm300d2/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sml/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sml/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sml/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sml/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/smt100/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/smt100/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/smt100/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/smt100/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sn74hc165/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sn74hc165/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sn74hc165/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sn74hc165/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sn74hc595/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sn74hc595/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sn74hc595/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sn74hc595/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sntp/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/sntp/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sntp/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sntp/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sntp/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sonoff_d1/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sonoff_d1/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/speaker/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/speaker/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/speed/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/speed/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/speed/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/speed/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/spi_device/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/spi_device/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/spi_device/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/spi_device/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/spi_led_strip/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/spi_led_strip/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/spi_led_strip/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/spi_led_strip/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sprinkler/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sprinkler/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sprinkler/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sprinkler/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sps30/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sps30/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sps30/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sps30/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1306_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1306_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1306_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1306_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1306_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1306_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1306_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1306_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1322_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1322_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1322_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1322_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1325_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1325_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1325_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1325_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1327_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1327_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1327_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1327_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1327_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1327_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1327_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1327_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1331_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1331_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1331_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1331_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ssd1351_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ssd1351_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ssd1351_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ssd1351_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7567_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7567_i2c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7567_i2c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7567_i2c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7567_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7567_spi/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7567_spi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7567_spi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7735/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7735/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7735/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7735/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7789v/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7789v/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7789v/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7789v/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/st7920/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/st7920/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/st7920/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/st7920/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/status/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/status/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/status/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/status/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/status_led/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/status_led/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/status_led/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/status_led/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/stepper/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/stepper/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/stepper/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/stepper/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sts3x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sts3x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sts3x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sts3x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sun/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sun/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sun/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sun/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sun_gtil2/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sun_gtil2/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sun_gtil2/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sun_gtil2/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/sx1509/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/sx1509/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/sx1509/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/sx1509/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/t6615/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/t6615/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/t6615/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/t6615/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tca9548a/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tca9548a/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tca9548a/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tca9548a/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tcl112/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tcl112/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tcl112/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tcs34725/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tcs34725/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tcs34725/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tcs34725/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tee501/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tee501/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tee501/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tee501/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/teleinfo/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/teleinfo/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/teleinfo/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/teleinfo/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/template/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/template/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/template/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/template/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/template/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/thermostat/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/thermostat/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/thermostat/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/thermostat/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/time/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/time/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/time/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/time/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/time_based/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/time_based/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/time_based/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/time_based/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tlc59208f/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tlc59208f/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tlc59208f/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tlc59208f/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tlc5947/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tlc5947/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tlc5947/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tlc5947/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tlc5971/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tlc5971/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tlc5971/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/tlc5971/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tlc5971/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tm1621/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tm1621/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tm1621/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tm1621/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tm1637/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tm1637/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tm1637/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tm1637/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tm1638/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tm1638/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tm1638/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tm1638/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tm1651/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tm1651/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tm1651/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tm1651/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tmp102/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tmp102/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tmp102/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tmp102/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tmp1075/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tmp1075/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tmp1075/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tmp1075/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tmp117/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tmp117/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tmp117/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tmp117/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tof10120/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tof10120/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tof10120/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tof10120/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/toshiba/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/toshiba/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/toshiba/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/total_daily_energy/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/total_daily_energy/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/total_daily_energy/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/total_daily_energy/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tsl2561/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tsl2561/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tsl2561/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tsl2561/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tsl2591/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tsl2591/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tsl2591/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tsl2591/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tt21100/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tt21100/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tt21100/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/tt21100/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tt21100/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ttp229_bsf/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ttp229_bsf/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ttp229_bsf/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ttp229_bsf/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ttp229_lsf/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ttp229_lsf/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ttp229_lsf/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ttp229_lsf/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tuya/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tuya/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tuya/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tuya/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/tx20/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/tx20/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/tx20/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/tx20/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/uart/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/uart/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/uart/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/uart/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ufire_ec/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ufire_ec/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ufire_ec/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ufire_ec/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ufire_ise/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ufire_ise/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ufire_ise/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ufire_ise/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/uln2003/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/uln2003/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/uln2003/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/uln2003/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/ultrasonic/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/ultrasonic/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/ultrasonic/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/ultrasonic/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/update/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/update/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/uponor_smatrix/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/uponor_smatrix/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/uponor_smatrix/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/uponor_smatrix/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/uptime/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/uptime/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/uptime/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/uptime/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/vbus/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/vbus/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/vbus/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/vbus/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/veml3235/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/veml3235/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/veml3235/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/veml3235/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/veml7700/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/veml7700/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/veml7700/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/veml7700/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/version/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/version/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/version/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/version/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/vl53l0x/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/vl53l0x/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/vl53l0x/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/vl53l0x/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/voice_assistant/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/voice_assistant/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wake_on_lan/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wake_on_lan/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wake_on_lan/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wake_on_lan/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/waveshare_epaper/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/waveshare_epaper/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/waveshare_epaper/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/waveshare_epaper/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/web_server/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/web_server/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/web_server/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/whirlpool/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/whirlpool/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/whirlpool/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/whynter/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/whynter/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/whynter/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wiegand/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wiegand/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wiegand/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wiegand/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wifi/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wifi/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wifi/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wifi/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wifi_info/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wifi_info/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wifi_info/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wifi_info/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wifi_signal/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wifi_signal/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wifi_signal/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wifi_signal/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wireguard/{test.bk72xx.yaml => test.bk72xx-ard.yaml} (100%) rename tests/components/wireguard/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wireguard/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wireguard/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wk2132_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2132_i2c/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2132_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2132_spi/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2168_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2168_i2c/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2168_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2168_spi/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2204_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2204_i2c/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2204_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2204_spi/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2212_i2c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2212_i2c/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wk2212_spi/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wk2212_spi/{test.esp32-s3.yaml => test.esp32-s3-ard.yaml} (100%) rename tests/components/wl_134/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wl_134/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wl_134/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/wl_134/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/wled/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/wled/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/wled/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/x9c/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/x9c/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/x9c/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/x9c/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/xgzp68xx/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xgzp68xx/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xgzp68xx/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/xgzp68xx/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/xiaomi_ble/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_ble/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_cgd1/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_cgd1/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_cgdk2/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_cgdk2/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_cgg1/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_cgg1/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_cgpr1/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_cgpr1/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_gcls002/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_gcls002/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_hhccjcy01/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_hhccjcy01/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_hhccpot002/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_hhccpot002/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_jqjcy01ym/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_jqjcy01ym/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_lywsd02/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_lywsd02/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_lywsd03mmc/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_lywsd03mmc/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_lywsdcgq/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_lywsdcgq/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_mhoc303/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_mhoc303/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_mhoc401/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_mhoc401/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_miscale copy/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_miscale copy/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_miscale/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_miscale/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_mjyd02yla/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_mjyd02yla/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_mue4094rt/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_mue4094rt/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_rtcgq02lm/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_rtcgq02lm/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xiaomi_wx08zm/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xiaomi_wx08zm/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xl9535/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xl9535/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xl9535/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/xl9535/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/xpt2046/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/xpt2046/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/xpt2046/{test.esp32-s2.yaml => test.esp32-s2-ard.yaml} (100%) rename tests/components/xpt2046/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/xpt2046/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/yashima/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/yashima/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/yashima/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/zhlt01/{test.esp32-c3.yaml => test.esp32-ard.yaml} (100%) rename tests/components/zhlt01/{test.esp32.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/zhlt01/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/zio_ultrasonic/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/zio_ultrasonic/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/zio_ultrasonic/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/zio_ultrasonic/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/components/zyaura/{test.esp32.yaml => test.esp32-ard.yaml} (100%) rename tests/components/zyaura/{test.esp32-c3.yaml => test.esp32-c3-ard.yaml} (100%) rename tests/components/zyaura/{test.esp8266.yaml => test.esp8266-ard.yaml} (100%) rename tests/components/zyaura/{test.rp2040.yaml => test.rp2040-ard.yaml} (100%) rename tests/test_build_components/{build_components_base.bk72xx.yaml => build_components_base.bk72xx-ard.yaml} (100%) create mode 100644 tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml create mode 100644 tests/test_build_components/build_components_base.esp32-idf-50.yaml create mode 100644 tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml create mode 100644 tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml rename tests/test_build_components/{build_components_base.esp8266.yaml => build_components_base.esp8266-ard.yaml} (87%) rename tests/test_build_components/{build_components_base.rp2040.yaml => build_components_base.rp2040-ard.yaml} (92%) diff --git a/script/test_build_components b/script/test_build_components index f82dd5c3b6..9bbb694dcc 100755 --- a/script/test_build_components +++ b/script/test_build_components @@ -24,8 +24,8 @@ fi start_esphome() { # create dynamic yaml file in `build` folder. - # `./tests/test_build_components/build/[target_component].[test_name].[target_platform].yaml` - component_test_file="./tests/test_build_components/build/$target_component.$test_name.$target_platform.yaml" + # `./tests/test_build_components/build/[target_component].[test_name].[target_platform_with_version].yaml` + component_test_file="./tests/test_build_components/build/$target_component.$test_name.$target_platform_with_version.yaml" cp $target_platform_file $component_test_file if [[ "$OSTYPE" == "darwin"* ]]; then @@ -36,7 +36,7 @@ start_esphome() { fi # Start esphome process - echo "> [$target_component] [$test_name] [$target_platform]" + echo "> [$target_component] [$test_name] [$target_platform_with_version]" set -x # TODO: Validate escape of Command line substitution value python -m esphome -s component_name $target_component -s component_dir ../../components/$target_component -s test_name $test_name -s target_platform $target_platform $esphome_command $component_test_file @@ -76,16 +76,17 @@ for f in ./tests/components/$target_component/*.*.yaml; do # 2. `./tests/test_build_components/build_components_base.[target_platform]-ard.yaml` target_platform_file="./tests/test_build_components/build_components_base.$target_platform.yaml" if ! [ -f "$target_platform_file" ]; then - # Try find arduino test framework as platform. - target_platform_ard="$target_platform-ard" - target_platform_file="./tests/test_build_components/build_components_base.$target_platform_ard.yaml" - if ! [ -f "$target_platform_file" ]; then - echo "No base test file [./tests/test_build_components/build_components_base.$target_platform.yaml, ./tests/build_components_base.$target_platform_ard.yaml] for component test [$f] found." - exit 1 - fi - target_platform=$target_platform_ard + echo "No base test file [./tests/test_build_components/build_components_base.$target_platform.yaml] for component test [$f] found." + exit 1 fi - start_esphome + for target_platform_file in ./tests/test_build_components/build_components_base.$target_platform*.yaml; do + # trim off "./tests/test_build_components/build_components_base." prefix + target_platform_with_version=${target_platform_file:52} + # ...now remove suffix starting with "." leaving just the test target hardware and software platform (possibly with version) + # For example: "esp32-s3-idf-50" + target_platform_with_version=${target_platform_with_version%.*} + start_esphome + done fi done diff --git a/tests/components/a01nyub/test.esp32.yaml b/tests/components/a01nyub/test.esp32-ard.yaml similarity index 100% rename from tests/components/a01nyub/test.esp32.yaml rename to tests/components/a01nyub/test.esp32-ard.yaml diff --git a/tests/components/a01nyub/test.esp32-c3.yaml b/tests/components/a01nyub/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/a01nyub/test.esp32-c3.yaml rename to tests/components/a01nyub/test.esp32-c3-ard.yaml diff --git a/tests/components/a01nyub/test.esp8266.yaml b/tests/components/a01nyub/test.esp8266-ard.yaml similarity index 100% rename from tests/components/a01nyub/test.esp8266.yaml rename to tests/components/a01nyub/test.esp8266-ard.yaml diff --git a/tests/components/a01nyub/test.rp2040.yaml b/tests/components/a01nyub/test.rp2040-ard.yaml similarity index 100% rename from tests/components/a01nyub/test.rp2040.yaml rename to tests/components/a01nyub/test.rp2040-ard.yaml diff --git a/tests/components/a02yyuw/test.esp32.yaml b/tests/components/a02yyuw/test.esp32-ard.yaml similarity index 100% rename from tests/components/a02yyuw/test.esp32.yaml rename to tests/components/a02yyuw/test.esp32-ard.yaml diff --git a/tests/components/a02yyuw/test.esp32-c3.yaml b/tests/components/a02yyuw/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/a02yyuw/test.esp32-c3.yaml rename to tests/components/a02yyuw/test.esp32-c3-ard.yaml diff --git a/tests/components/a02yyuw/test.esp8266.yaml b/tests/components/a02yyuw/test.esp8266-ard.yaml similarity index 100% rename from tests/components/a02yyuw/test.esp8266.yaml rename to tests/components/a02yyuw/test.esp8266-ard.yaml diff --git a/tests/components/a02yyuw/test.rp2040.yaml b/tests/components/a02yyuw/test.rp2040-ard.yaml similarity index 100% rename from tests/components/a02yyuw/test.rp2040.yaml rename to tests/components/a02yyuw/test.rp2040-ard.yaml diff --git a/tests/components/a4988/test.esp32.yaml b/tests/components/a4988/test.esp32-ard.yaml similarity index 100% rename from tests/components/a4988/test.esp32.yaml rename to tests/components/a4988/test.esp32-ard.yaml diff --git a/tests/components/a4988/test.esp32-c3.yaml b/tests/components/a4988/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/a4988/test.esp32-c3.yaml rename to tests/components/a4988/test.esp32-c3-ard.yaml diff --git a/tests/components/a4988/test.esp8266.yaml b/tests/components/a4988/test.esp8266-ard.yaml similarity index 100% rename from tests/components/a4988/test.esp8266.yaml rename to tests/components/a4988/test.esp8266-ard.yaml diff --git a/tests/components/a4988/test.rp2040.yaml b/tests/components/a4988/test.rp2040-ard.yaml similarity index 100% rename from tests/components/a4988/test.rp2040.yaml rename to tests/components/a4988/test.rp2040-ard.yaml diff --git a/tests/components/absolute_humidity/test.esp32-c3.yaml b/tests/components/absolute_humidity/test.esp32-ard.yaml similarity index 100% rename from tests/components/absolute_humidity/test.esp32-c3.yaml rename to tests/components/absolute_humidity/test.esp32-ard.yaml diff --git a/tests/components/absolute_humidity/test.esp32.yaml b/tests/components/absolute_humidity/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/absolute_humidity/test.esp32.yaml rename to tests/components/absolute_humidity/test.esp32-c3-ard.yaml diff --git a/tests/components/absolute_humidity/test.esp8266.yaml b/tests/components/absolute_humidity/test.esp8266-ard.yaml similarity index 100% rename from tests/components/absolute_humidity/test.esp8266.yaml rename to tests/components/absolute_humidity/test.esp8266-ard.yaml diff --git a/tests/components/absolute_humidity/test.rp2040.yaml b/tests/components/absolute_humidity/test.rp2040-ard.yaml similarity index 100% rename from tests/components/absolute_humidity/test.rp2040.yaml rename to tests/components/absolute_humidity/test.rp2040-ard.yaml diff --git a/tests/components/ac_dimmer/test.esp32.yaml b/tests/components/ac_dimmer/test.esp32-ard.yaml similarity index 100% rename from tests/components/ac_dimmer/test.esp32.yaml rename to tests/components/ac_dimmer/test.esp32-ard.yaml diff --git a/tests/components/ac_dimmer/test.esp32-c3.yaml b/tests/components/ac_dimmer/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ac_dimmer/test.esp32-c3.yaml rename to tests/components/ac_dimmer/test.esp32-c3-ard.yaml diff --git a/tests/components/ac_dimmer/test.esp8266.yaml b/tests/components/ac_dimmer/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ac_dimmer/test.esp8266.yaml rename to tests/components/ac_dimmer/test.esp8266-ard.yaml diff --git a/tests/components/ac_dimmer/test.rp2040.yaml b/tests/components/ac_dimmer/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ac_dimmer/test.rp2040.yaml rename to tests/components/ac_dimmer/test.rp2040-ard.yaml diff --git a/tests/components/adc/test.esp32.yaml b/tests/components/adc/test.esp32-ard.yaml similarity index 100% rename from tests/components/adc/test.esp32.yaml rename to tests/components/adc/test.esp32-ard.yaml diff --git a/tests/components/adc/test.esp32-c3.yaml b/tests/components/adc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/adc/test.esp32-c3.yaml rename to tests/components/adc/test.esp32-c3-ard.yaml diff --git a/tests/components/adc/test.esp32-s2.yaml b/tests/components/adc/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/adc/test.esp32-s2.yaml rename to tests/components/adc/test.esp32-s2-ard.yaml diff --git a/tests/components/adc/test.esp32-s3.yaml b/tests/components/adc/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/adc/test.esp32-s3.yaml rename to tests/components/adc/test.esp32-s3-ard.yaml diff --git a/tests/components/adc/test.esp8266.yaml b/tests/components/adc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/adc/test.esp8266.yaml rename to tests/components/adc/test.esp8266-ard.yaml diff --git a/tests/components/adc/test.rp2040.yaml b/tests/components/adc/test.rp2040-ard.yaml similarity index 100% rename from tests/components/adc/test.rp2040.yaml rename to tests/components/adc/test.rp2040-ard.yaml diff --git a/tests/components/adc128s102/test.esp32.yaml b/tests/components/adc128s102/test.esp32-ard.yaml similarity index 100% rename from tests/components/adc128s102/test.esp32.yaml rename to tests/components/adc128s102/test.esp32-ard.yaml diff --git a/tests/components/adc128s102/test.esp32-c3.yaml b/tests/components/adc128s102/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/adc128s102/test.esp32-c3.yaml rename to tests/components/adc128s102/test.esp32-c3-ard.yaml diff --git a/tests/components/adc128s102/test.esp8266.yaml b/tests/components/adc128s102/test.esp8266-ard.yaml similarity index 100% rename from tests/components/adc128s102/test.esp8266.yaml rename to tests/components/adc128s102/test.esp8266-ard.yaml diff --git a/tests/components/adc128s102/test.rp2040.yaml b/tests/components/adc128s102/test.rp2040-ard.yaml similarity index 100% rename from tests/components/adc128s102/test.rp2040.yaml rename to tests/components/adc128s102/test.rp2040-ard.yaml diff --git a/tests/components/addressable_light/test.esp32.yaml b/tests/components/addressable_light/test.esp32-ard.yaml similarity index 100% rename from tests/components/addressable_light/test.esp32.yaml rename to tests/components/addressable_light/test.esp32-ard.yaml diff --git a/tests/components/addressable_light/test.esp32-c3.yaml b/tests/components/addressable_light/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/addressable_light/test.esp32-c3.yaml rename to tests/components/addressable_light/test.esp32-c3-ard.yaml diff --git a/tests/components/ade7880/test.esp32.yaml b/tests/components/ade7880/test.esp32-ard.yaml similarity index 100% rename from tests/components/ade7880/test.esp32.yaml rename to tests/components/ade7880/test.esp32-ard.yaml diff --git a/tests/components/ade7880/test.esp32-c3.yaml b/tests/components/ade7880/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ade7880/test.esp32-c3.yaml rename to tests/components/ade7880/test.esp32-c3-ard.yaml diff --git a/tests/components/ade7880/test.esp8266.yaml b/tests/components/ade7880/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ade7880/test.esp8266.yaml rename to tests/components/ade7880/test.esp8266-ard.yaml diff --git a/tests/components/ade7880/test.rp2040.yaml b/tests/components/ade7880/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ade7880/test.rp2040.yaml rename to tests/components/ade7880/test.rp2040-ard.yaml diff --git a/tests/components/ade7953_i2c/test.esp32.yaml b/tests/components/ade7953_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ade7953_i2c/test.esp32.yaml rename to tests/components/ade7953_i2c/test.esp32-ard.yaml diff --git a/tests/components/ade7953_i2c/test.esp32-c3.yaml b/tests/components/ade7953_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ade7953_i2c/test.esp32-c3.yaml rename to tests/components/ade7953_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ade7953_i2c/test.esp8266.yaml b/tests/components/ade7953_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ade7953_i2c/test.esp8266.yaml rename to tests/components/ade7953_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ade7953_i2c/test.rp2040.yaml b/tests/components/ade7953_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ade7953_i2c/test.rp2040.yaml rename to tests/components/ade7953_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ade7953_spi/test.esp32.yaml b/tests/components/ade7953_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ade7953_spi/test.esp32.yaml rename to tests/components/ade7953_spi/test.esp32-ard.yaml diff --git a/tests/components/ade7953_spi/test.esp32-c3.yaml b/tests/components/ade7953_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ade7953_spi/test.esp32-c3.yaml rename to tests/components/ade7953_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ade7953_spi/test.esp8266.yaml b/tests/components/ade7953_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ade7953_spi/test.esp8266.yaml rename to tests/components/ade7953_spi/test.esp8266-ard.yaml diff --git a/tests/components/ade7953_spi/test.rp2040.yaml b/tests/components/ade7953_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ade7953_spi/test.rp2040.yaml rename to tests/components/ade7953_spi/test.rp2040-ard.yaml diff --git a/tests/components/ads1115/test.esp32.yaml b/tests/components/ads1115/test.esp32-ard.yaml similarity index 100% rename from tests/components/ads1115/test.esp32.yaml rename to tests/components/ads1115/test.esp32-ard.yaml diff --git a/tests/components/ads1115/test.esp32-c3.yaml b/tests/components/ads1115/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ads1115/test.esp32-c3.yaml rename to tests/components/ads1115/test.esp32-c3-ard.yaml diff --git a/tests/components/ads1115/test.esp8266.yaml b/tests/components/ads1115/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ads1115/test.esp8266.yaml rename to tests/components/ads1115/test.esp8266-ard.yaml diff --git a/tests/components/ads1115/test.rp2040.yaml b/tests/components/ads1115/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ads1115/test.rp2040.yaml rename to tests/components/ads1115/test.rp2040-ard.yaml diff --git a/tests/components/ags10/test.esp32.yaml b/tests/components/ags10/test.esp32-ard.yaml similarity index 100% rename from tests/components/ags10/test.esp32.yaml rename to tests/components/ags10/test.esp32-ard.yaml diff --git a/tests/components/ags10/test.esp32-c3.yaml b/tests/components/ags10/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ags10/test.esp32-c3.yaml rename to tests/components/ags10/test.esp32-c3-ard.yaml diff --git a/tests/components/ags10/test.esp8266.yaml b/tests/components/ags10/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ags10/test.esp8266.yaml rename to tests/components/ags10/test.esp8266-ard.yaml diff --git a/tests/components/aht10/test.esp32.yaml b/tests/components/aht10/test.esp32-ard.yaml similarity index 100% rename from tests/components/aht10/test.esp32.yaml rename to tests/components/aht10/test.esp32-ard.yaml diff --git a/tests/components/aht10/test.esp32-c3.yaml b/tests/components/aht10/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/aht10/test.esp32-c3.yaml rename to tests/components/aht10/test.esp32-c3-ard.yaml diff --git a/tests/components/aht10/test.esp8266.yaml b/tests/components/aht10/test.esp8266-ard.yaml similarity index 100% rename from tests/components/aht10/test.esp8266.yaml rename to tests/components/aht10/test.esp8266-ard.yaml diff --git a/tests/components/aht10/test.rp2040.yaml b/tests/components/aht10/test.rp2040-ard.yaml similarity index 100% rename from tests/components/aht10/test.rp2040.yaml rename to tests/components/aht10/test.rp2040-ard.yaml diff --git a/tests/components/airthings_wave_mini/test.esp32-c3.yaml b/tests/components/airthings_wave_mini/test.esp32-ard.yaml similarity index 100% rename from tests/components/airthings_wave_mini/test.esp32-c3.yaml rename to tests/components/airthings_wave_mini/test.esp32-ard.yaml diff --git a/tests/components/airthings_wave_mini/test.esp32.yaml b/tests/components/airthings_wave_mini/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/airthings_wave_mini/test.esp32.yaml rename to tests/components/airthings_wave_mini/test.esp32-c3-ard.yaml diff --git a/tests/components/airthings_wave_plus/test.esp32-c3.yaml b/tests/components/airthings_wave_plus/test.esp32-ard.yaml similarity index 100% rename from tests/components/airthings_wave_plus/test.esp32-c3.yaml rename to tests/components/airthings_wave_plus/test.esp32-ard.yaml diff --git a/tests/components/airthings_wave_plus/test.esp32.yaml b/tests/components/airthings_wave_plus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/airthings_wave_plus/test.esp32.yaml rename to tests/components/airthings_wave_plus/test.esp32-c3-ard.yaml diff --git a/tests/components/alarm_control_panel/test.esp32-c3.yaml b/tests/components/alarm_control_panel/test.esp32-ard.yaml similarity index 100% rename from tests/components/alarm_control_panel/test.esp32-c3.yaml rename to tests/components/alarm_control_panel/test.esp32-ard.yaml diff --git a/tests/components/alarm_control_panel/test.esp32.yaml b/tests/components/alarm_control_panel/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/alarm_control_panel/test.esp32.yaml rename to tests/components/alarm_control_panel/test.esp32-c3-ard.yaml diff --git a/tests/components/alarm_control_panel/test.esp8266.yaml b/tests/components/alarm_control_panel/test.esp8266-ard.yaml similarity index 100% rename from tests/components/alarm_control_panel/test.esp8266.yaml rename to tests/components/alarm_control_panel/test.esp8266-ard.yaml diff --git a/tests/components/alarm_control_panel/test.rp2040.yaml b/tests/components/alarm_control_panel/test.rp2040-ard.yaml similarity index 100% rename from tests/components/alarm_control_panel/test.rp2040.yaml rename to tests/components/alarm_control_panel/test.rp2040-ard.yaml diff --git a/tests/components/alpha3/test.esp32-c3.yaml b/tests/components/alpha3/test.esp32-ard.yaml similarity index 100% rename from tests/components/alpha3/test.esp32-c3.yaml rename to tests/components/alpha3/test.esp32-ard.yaml diff --git a/tests/components/alpha3/test.esp32.yaml b/tests/components/alpha3/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/alpha3/test.esp32.yaml rename to tests/components/alpha3/test.esp32-c3-ard.yaml diff --git a/tests/components/am2315c/test.esp32.yaml b/tests/components/am2315c/test.esp32-ard.yaml similarity index 100% rename from tests/components/am2315c/test.esp32.yaml rename to tests/components/am2315c/test.esp32-ard.yaml diff --git a/tests/components/am2315c/test.esp32-c3.yaml b/tests/components/am2315c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/am2315c/test.esp32-c3.yaml rename to tests/components/am2315c/test.esp32-c3-ard.yaml diff --git a/tests/components/am2315c/test.esp8266.yaml b/tests/components/am2315c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/am2315c/test.esp8266.yaml rename to tests/components/am2315c/test.esp8266-ard.yaml diff --git a/tests/components/am2315c/test.rp2040.yaml b/tests/components/am2315c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/am2315c/test.rp2040.yaml rename to tests/components/am2315c/test.rp2040-ard.yaml diff --git a/tests/components/am2320/test.esp32.yaml b/tests/components/am2320/test.esp32-ard.yaml similarity index 100% rename from tests/components/am2320/test.esp32.yaml rename to tests/components/am2320/test.esp32-ard.yaml diff --git a/tests/components/am2320/test.esp32-c3.yaml b/tests/components/am2320/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/am2320/test.esp32-c3.yaml rename to tests/components/am2320/test.esp32-c3-ard.yaml diff --git a/tests/components/am2320/test.esp8266.yaml b/tests/components/am2320/test.esp8266-ard.yaml similarity index 100% rename from tests/components/am2320/test.esp8266.yaml rename to tests/components/am2320/test.esp8266-ard.yaml diff --git a/tests/components/am2320/test.rp2040.yaml b/tests/components/am2320/test.rp2040-ard.yaml similarity index 100% rename from tests/components/am2320/test.rp2040.yaml rename to tests/components/am2320/test.rp2040-ard.yaml diff --git a/tests/components/am43/test.esp32-c3.yaml b/tests/components/am43/test.esp32-ard.yaml similarity index 100% rename from tests/components/am43/test.esp32-c3.yaml rename to tests/components/am43/test.esp32-ard.yaml diff --git a/tests/components/am43/test.esp32.yaml b/tests/components/am43/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/am43/test.esp32.yaml rename to tests/components/am43/test.esp32-c3-ard.yaml diff --git a/tests/components/analog_threshold/test.esp32-c3.yaml b/tests/components/analog_threshold/test.esp32-ard.yaml similarity index 100% rename from tests/components/analog_threshold/test.esp32-c3.yaml rename to tests/components/analog_threshold/test.esp32-ard.yaml diff --git a/tests/components/analog_threshold/test.esp32.yaml b/tests/components/analog_threshold/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/analog_threshold/test.esp32.yaml rename to tests/components/analog_threshold/test.esp32-c3-ard.yaml diff --git a/tests/components/analog_threshold/test.esp8266.yaml b/tests/components/analog_threshold/test.esp8266-ard.yaml similarity index 100% rename from tests/components/analog_threshold/test.esp8266.yaml rename to tests/components/analog_threshold/test.esp8266-ard.yaml diff --git a/tests/components/analog_threshold/test.rp2040.yaml b/tests/components/analog_threshold/test.rp2040-ard.yaml similarity index 100% rename from tests/components/analog_threshold/test.rp2040.yaml rename to tests/components/analog_threshold/test.rp2040-ard.yaml diff --git a/tests/components/animation/test.esp32.yaml b/tests/components/animation/test.esp32-ard.yaml similarity index 100% rename from tests/components/animation/test.esp32.yaml rename to tests/components/animation/test.esp32-ard.yaml diff --git a/tests/components/animation/test.esp32-c3.yaml b/tests/components/animation/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/animation/test.esp32-c3.yaml rename to tests/components/animation/test.esp32-c3-ard.yaml diff --git a/tests/components/animation/test.esp8266.yaml b/tests/components/animation/test.esp8266-ard.yaml similarity index 100% rename from tests/components/animation/test.esp8266.yaml rename to tests/components/animation/test.esp8266-ard.yaml diff --git a/tests/components/animation/test.rp2040.yaml b/tests/components/animation/test.rp2040-ard.yaml similarity index 100% rename from tests/components/animation/test.rp2040.yaml rename to tests/components/animation/test.rp2040-ard.yaml diff --git a/tests/components/anova/test.esp32-c3.yaml b/tests/components/anova/test.esp32-ard.yaml similarity index 100% rename from tests/components/anova/test.esp32-c3.yaml rename to tests/components/anova/test.esp32-ard.yaml diff --git a/tests/components/anova/test.esp32.yaml b/tests/components/anova/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/anova/test.esp32.yaml rename to tests/components/anova/test.esp32-c3-ard.yaml diff --git a/tests/components/apds9960/test.esp32.yaml b/tests/components/apds9960/test.esp32-ard.yaml similarity index 100% rename from tests/components/apds9960/test.esp32.yaml rename to tests/components/apds9960/test.esp32-ard.yaml diff --git a/tests/components/apds9960/test.esp32-c3.yaml b/tests/components/apds9960/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/apds9960/test.esp32-c3.yaml rename to tests/components/apds9960/test.esp32-c3-ard.yaml diff --git a/tests/components/apds9960/test.esp8266.yaml b/tests/components/apds9960/test.esp8266-ard.yaml similarity index 100% rename from tests/components/apds9960/test.esp8266.yaml rename to tests/components/apds9960/test.esp8266-ard.yaml diff --git a/tests/components/apds9960/test.rp2040.yaml b/tests/components/apds9960/test.rp2040-ard.yaml similarity index 100% rename from tests/components/apds9960/test.rp2040.yaml rename to tests/components/apds9960/test.rp2040-ard.yaml diff --git a/tests/components/api/test.esp32-c3.yaml b/tests/components/api/test.esp32-ard.yaml similarity index 100% rename from tests/components/api/test.esp32-c3.yaml rename to tests/components/api/test.esp32-ard.yaml diff --git a/tests/components/api/test.esp32.yaml b/tests/components/api/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/api/test.esp32.yaml rename to tests/components/api/test.esp32-c3-ard.yaml diff --git a/tests/components/api/test.esp8266.yaml b/tests/components/api/test.esp8266-ard.yaml similarity index 100% rename from tests/components/api/test.esp8266.yaml rename to tests/components/api/test.esp8266-ard.yaml diff --git a/tests/components/api/test.rp2040.yaml b/tests/components/api/test.rp2040-ard.yaml similarity index 100% rename from tests/components/api/test.rp2040.yaml rename to tests/components/api/test.rp2040-ard.yaml diff --git a/tests/components/as3935_i2c/test.esp32.yaml b/tests/components/as3935_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/as3935_i2c/test.esp32.yaml rename to tests/components/as3935_i2c/test.esp32-ard.yaml diff --git a/tests/components/as3935_i2c/test.esp32-c3.yaml b/tests/components/as3935_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/as3935_i2c/test.esp32-c3.yaml rename to tests/components/as3935_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/as3935_i2c/test.esp8266.yaml b/tests/components/as3935_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/as3935_i2c/test.esp8266.yaml rename to tests/components/as3935_i2c/test.esp8266-ard.yaml diff --git a/tests/components/as3935_i2c/test.rp2040.yaml b/tests/components/as3935_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/as3935_i2c/test.rp2040.yaml rename to tests/components/as3935_i2c/test.rp2040-ard.yaml diff --git a/tests/components/as3935_spi/test.esp32.yaml b/tests/components/as3935_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/as3935_spi/test.esp32.yaml rename to tests/components/as3935_spi/test.esp32-ard.yaml diff --git a/tests/components/as3935_spi/test.esp32-c3.yaml b/tests/components/as3935_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/as3935_spi/test.esp32-c3.yaml rename to tests/components/as3935_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/as3935_spi/test.esp8266.yaml b/tests/components/as3935_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/as3935_spi/test.esp8266.yaml rename to tests/components/as3935_spi/test.esp8266-ard.yaml diff --git a/tests/components/as3935_spi/test.rp2040.yaml b/tests/components/as3935_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/as3935_spi/test.rp2040.yaml rename to tests/components/as3935_spi/test.rp2040-ard.yaml diff --git a/tests/components/as5600/test.esp32.yaml b/tests/components/as5600/test.esp32-ard.yaml similarity index 100% rename from tests/components/as5600/test.esp32.yaml rename to tests/components/as5600/test.esp32-ard.yaml diff --git a/tests/components/as5600/test.esp32-c3.yaml b/tests/components/as5600/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/as5600/test.esp32-c3.yaml rename to tests/components/as5600/test.esp32-c3-ard.yaml diff --git a/tests/components/as5600/test.esp8266.yaml b/tests/components/as5600/test.esp8266-ard.yaml similarity index 100% rename from tests/components/as5600/test.esp8266.yaml rename to tests/components/as5600/test.esp8266-ard.yaml diff --git a/tests/components/as5600/test.rp2040.yaml b/tests/components/as5600/test.rp2040-ard.yaml similarity index 100% rename from tests/components/as5600/test.rp2040.yaml rename to tests/components/as5600/test.rp2040-ard.yaml diff --git a/tests/components/as7341/test.esp32.yaml b/tests/components/as7341/test.esp32-ard.yaml similarity index 100% rename from tests/components/as7341/test.esp32.yaml rename to tests/components/as7341/test.esp32-ard.yaml diff --git a/tests/components/as7341/test.esp32-c3.yaml b/tests/components/as7341/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/as7341/test.esp32-c3.yaml rename to tests/components/as7341/test.esp32-c3-ard.yaml diff --git a/tests/components/as7341/test.esp8266.yaml b/tests/components/as7341/test.esp8266-ard.yaml similarity index 100% rename from tests/components/as7341/test.esp8266.yaml rename to tests/components/as7341/test.esp8266-ard.yaml diff --git a/tests/components/as7341/test.rp2040.yaml b/tests/components/as7341/test.rp2040-ard.yaml similarity index 100% rename from tests/components/as7341/test.rp2040.yaml rename to tests/components/as7341/test.rp2040-ard.yaml diff --git a/tests/components/at581x/test.esp32.yaml b/tests/components/at581x/test.esp32-ard.yaml similarity index 100% rename from tests/components/at581x/test.esp32.yaml rename to tests/components/at581x/test.esp32-ard.yaml diff --git a/tests/components/at581x/test.esp32-c3.yaml b/tests/components/at581x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/at581x/test.esp32-c3.yaml rename to tests/components/at581x/test.esp32-c3-ard.yaml diff --git a/tests/components/at581x/test.esp8266.yaml b/tests/components/at581x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/at581x/test.esp8266.yaml rename to tests/components/at581x/test.esp8266-ard.yaml diff --git a/tests/components/at581x/test.rp2040.yaml b/tests/components/at581x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/at581x/test.rp2040.yaml rename to tests/components/at581x/test.rp2040-ard.yaml diff --git a/tests/components/atc_mithermometer/test.esp32-c3.yaml b/tests/components/atc_mithermometer/test.esp32-ard.yaml similarity index 100% rename from tests/components/atc_mithermometer/test.esp32-c3.yaml rename to tests/components/atc_mithermometer/test.esp32-ard.yaml diff --git a/tests/components/atc_mithermometer/test.esp32.yaml b/tests/components/atc_mithermometer/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/atc_mithermometer/test.esp32.yaml rename to tests/components/atc_mithermometer/test.esp32-c3-ard.yaml diff --git a/tests/components/atm90e26/test.esp32.yaml b/tests/components/atm90e26/test.esp32-ard.yaml similarity index 100% rename from tests/components/atm90e26/test.esp32.yaml rename to tests/components/atm90e26/test.esp32-ard.yaml diff --git a/tests/components/atm90e26/test.esp32-c3.yaml b/tests/components/atm90e26/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/atm90e26/test.esp32-c3.yaml rename to tests/components/atm90e26/test.esp32-c3-ard.yaml diff --git a/tests/components/atm90e26/test.esp8266.yaml b/tests/components/atm90e26/test.esp8266-ard.yaml similarity index 100% rename from tests/components/atm90e26/test.esp8266.yaml rename to tests/components/atm90e26/test.esp8266-ard.yaml diff --git a/tests/components/atm90e26/test.rp2040.yaml b/tests/components/atm90e26/test.rp2040-ard.yaml similarity index 100% rename from tests/components/atm90e26/test.rp2040.yaml rename to tests/components/atm90e26/test.rp2040-ard.yaml diff --git a/tests/components/atm90e32/test.esp32.yaml b/tests/components/atm90e32/test.esp32-ard.yaml similarity index 100% rename from tests/components/atm90e32/test.esp32.yaml rename to tests/components/atm90e32/test.esp32-ard.yaml diff --git a/tests/components/atm90e32/test.esp32-c3.yaml b/tests/components/atm90e32/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/atm90e32/test.esp32-c3.yaml rename to tests/components/atm90e32/test.esp32-c3-ard.yaml diff --git a/tests/components/atm90e32/test.esp8266.yaml b/tests/components/atm90e32/test.esp8266-ard.yaml similarity index 100% rename from tests/components/atm90e32/test.esp8266.yaml rename to tests/components/atm90e32/test.esp8266-ard.yaml diff --git a/tests/components/atm90e32/test.rp2040.yaml b/tests/components/atm90e32/test.rp2040-ard.yaml similarity index 100% rename from tests/components/atm90e32/test.rp2040.yaml rename to tests/components/atm90e32/test.rp2040-ard.yaml diff --git a/tests/components/b_parasite/test.esp32-c3.yaml b/tests/components/b_parasite/test.esp32-ard.yaml similarity index 100% rename from tests/components/b_parasite/test.esp32-c3.yaml rename to tests/components/b_parasite/test.esp32-ard.yaml diff --git a/tests/components/b_parasite/test.esp32.yaml b/tests/components/b_parasite/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/b_parasite/test.esp32.yaml rename to tests/components/b_parasite/test.esp32-c3-ard.yaml diff --git a/tests/components/ballu/test.esp32.yaml b/tests/components/ballu/test.esp32-ard.yaml similarity index 100% rename from tests/components/ballu/test.esp32.yaml rename to tests/components/ballu/test.esp32-ard.yaml diff --git a/tests/components/ballu/test.esp8266.yaml b/tests/components/ballu/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ballu/test.esp8266.yaml rename to tests/components/ballu/test.esp8266-ard.yaml diff --git a/tests/components/bang_bang/test.esp32-c3.yaml b/tests/components/bang_bang/test.esp32-ard.yaml similarity index 100% rename from tests/components/bang_bang/test.esp32-c3.yaml rename to tests/components/bang_bang/test.esp32-ard.yaml diff --git a/tests/components/bang_bang/test.esp32.yaml b/tests/components/bang_bang/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bang_bang/test.esp32.yaml rename to tests/components/bang_bang/test.esp32-c3-ard.yaml diff --git a/tests/components/bang_bang/test.esp8266.yaml b/tests/components/bang_bang/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bang_bang/test.esp8266.yaml rename to tests/components/bang_bang/test.esp8266-ard.yaml diff --git a/tests/components/bang_bang/test.rp2040.yaml b/tests/components/bang_bang/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bang_bang/test.rp2040.yaml rename to tests/components/bang_bang/test.rp2040-ard.yaml diff --git a/tests/components/bedjet/test.esp32-c3.yaml b/tests/components/bedjet/test.esp32-ard.yaml similarity index 100% rename from tests/components/bedjet/test.esp32-c3.yaml rename to tests/components/bedjet/test.esp32-ard.yaml diff --git a/tests/components/bedjet/test.esp32.yaml b/tests/components/bedjet/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bedjet/test.esp32.yaml rename to tests/components/bedjet/test.esp32-c3-ard.yaml diff --git a/tests/components/beken_spi_led_strip/test.bk72xx.yaml b/tests/components/beken_spi_led_strip/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/beken_spi_led_strip/test.bk72xx.yaml rename to tests/components/beken_spi_led_strip/test.bk72xx-ard.yaml diff --git a/tests/components/bh1750/test.esp32.yaml b/tests/components/bh1750/test.esp32-ard.yaml similarity index 100% rename from tests/components/bh1750/test.esp32.yaml rename to tests/components/bh1750/test.esp32-ard.yaml diff --git a/tests/components/bh1750/test.esp32-c3.yaml b/tests/components/bh1750/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bh1750/test.esp32-c3.yaml rename to tests/components/bh1750/test.esp32-c3-ard.yaml diff --git a/tests/components/bh1750/test.esp8266.yaml b/tests/components/bh1750/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bh1750/test.esp8266.yaml rename to tests/components/bh1750/test.esp8266-ard.yaml diff --git a/tests/components/bh1750/test.rp2040.yaml b/tests/components/bh1750/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bh1750/test.rp2040.yaml rename to tests/components/bh1750/test.rp2040-ard.yaml diff --git a/tests/components/binary_sensor_map/test.esp32-c3.yaml b/tests/components/binary_sensor_map/test.esp32-ard.yaml similarity index 100% rename from tests/components/binary_sensor_map/test.esp32-c3.yaml rename to tests/components/binary_sensor_map/test.esp32-ard.yaml diff --git a/tests/components/binary_sensor_map/test.esp32.yaml b/tests/components/binary_sensor_map/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/binary_sensor_map/test.esp32.yaml rename to tests/components/binary_sensor_map/test.esp32-c3-ard.yaml diff --git a/tests/components/binary_sensor_map/test.esp8266.yaml b/tests/components/binary_sensor_map/test.esp8266-ard.yaml similarity index 100% rename from tests/components/binary_sensor_map/test.esp8266.yaml rename to tests/components/binary_sensor_map/test.esp8266-ard.yaml diff --git a/tests/components/binary_sensor_map/test.rp2040.yaml b/tests/components/binary_sensor_map/test.rp2040-ard.yaml similarity index 100% rename from tests/components/binary_sensor_map/test.rp2040.yaml rename to tests/components/binary_sensor_map/test.rp2040-ard.yaml diff --git a/tests/components/bl0939/test.esp32.yaml b/tests/components/bl0939/test.esp32-ard.yaml similarity index 100% rename from tests/components/bl0939/test.esp32.yaml rename to tests/components/bl0939/test.esp32-ard.yaml diff --git a/tests/components/bl0939/test.esp32-c3.yaml b/tests/components/bl0939/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bl0939/test.esp32-c3.yaml rename to tests/components/bl0939/test.esp32-c3-ard.yaml diff --git a/tests/components/bl0939/test.esp8266.yaml b/tests/components/bl0939/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bl0939/test.esp8266.yaml rename to tests/components/bl0939/test.esp8266-ard.yaml diff --git a/tests/components/bl0939/test.rp2040.yaml b/tests/components/bl0939/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bl0939/test.rp2040.yaml rename to tests/components/bl0939/test.rp2040-ard.yaml diff --git a/tests/components/bl0940/test.esp32.yaml b/tests/components/bl0940/test.esp32-ard.yaml similarity index 100% rename from tests/components/bl0940/test.esp32.yaml rename to tests/components/bl0940/test.esp32-ard.yaml diff --git a/tests/components/bl0940/test.esp32-c3.yaml b/tests/components/bl0940/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bl0940/test.esp32-c3.yaml rename to tests/components/bl0940/test.esp32-c3-ard.yaml diff --git a/tests/components/bl0940/test.esp8266.yaml b/tests/components/bl0940/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bl0940/test.esp8266.yaml rename to tests/components/bl0940/test.esp8266-ard.yaml diff --git a/tests/components/bl0940/test.rp2040.yaml b/tests/components/bl0940/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bl0940/test.rp2040.yaml rename to tests/components/bl0940/test.rp2040-ard.yaml diff --git a/tests/components/bl0942/test.esp32.yaml b/tests/components/bl0942/test.esp32-ard.yaml similarity index 100% rename from tests/components/bl0942/test.esp32.yaml rename to tests/components/bl0942/test.esp32-ard.yaml diff --git a/tests/components/bl0942/test.esp32-c3.yaml b/tests/components/bl0942/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bl0942/test.esp32-c3.yaml rename to tests/components/bl0942/test.esp32-c3-ard.yaml diff --git a/tests/components/bl0942/test.esp8266.yaml b/tests/components/bl0942/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bl0942/test.esp8266.yaml rename to tests/components/bl0942/test.esp8266-ard.yaml diff --git a/tests/components/bl0942/test.rp2040.yaml b/tests/components/bl0942/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bl0942/test.rp2040.yaml rename to tests/components/bl0942/test.rp2040-ard.yaml diff --git a/tests/components/ble_client/test.esp32-c3.yaml b/tests/components/ble_client/test.esp32-ard.yaml similarity index 100% rename from tests/components/ble_client/test.esp32-c3.yaml rename to tests/components/ble_client/test.esp32-ard.yaml diff --git a/tests/components/ble_client/test.esp32.yaml b/tests/components/ble_client/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ble_client/test.esp32.yaml rename to tests/components/ble_client/test.esp32-c3-ard.yaml diff --git a/tests/components/ble_presence/test.esp32-c3.yaml b/tests/components/ble_presence/test.esp32-ard.yaml similarity index 100% rename from tests/components/ble_presence/test.esp32-c3.yaml rename to tests/components/ble_presence/test.esp32-ard.yaml diff --git a/tests/components/ble_presence/test.esp32.yaml b/tests/components/ble_presence/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ble_presence/test.esp32.yaml rename to tests/components/ble_presence/test.esp32-c3-ard.yaml diff --git a/tests/components/ble_rssi/test.esp32-c3.yaml b/tests/components/ble_rssi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ble_rssi/test.esp32-c3.yaml rename to tests/components/ble_rssi/test.esp32-ard.yaml diff --git a/tests/components/ble_rssi/test.esp32.yaml b/tests/components/ble_rssi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ble_rssi/test.esp32.yaml rename to tests/components/ble_rssi/test.esp32-c3-ard.yaml diff --git a/tests/components/ble_scanner/test.esp32-c3.yaml b/tests/components/ble_scanner/test.esp32-ard.yaml similarity index 100% rename from tests/components/ble_scanner/test.esp32-c3.yaml rename to tests/components/ble_scanner/test.esp32-ard.yaml diff --git a/tests/components/ble_scanner/test.esp32.yaml b/tests/components/ble_scanner/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ble_scanner/test.esp32.yaml rename to tests/components/ble_scanner/test.esp32-c3-ard.yaml diff --git a/tests/components/bme280_i2c/test.esp32.yaml b/tests/components/bme280_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/bme280_i2c/test.esp32.yaml rename to tests/components/bme280_i2c/test.esp32-ard.yaml diff --git a/tests/components/bme280_i2c/test.esp32-c3.yaml b/tests/components/bme280_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bme280_i2c/test.esp32-c3.yaml rename to tests/components/bme280_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/bme280_i2c/test.esp8266.yaml b/tests/components/bme280_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bme280_i2c/test.esp8266.yaml rename to tests/components/bme280_i2c/test.esp8266-ard.yaml diff --git a/tests/components/bme280_i2c/test.rp2040.yaml b/tests/components/bme280_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bme280_i2c/test.rp2040.yaml rename to tests/components/bme280_i2c/test.rp2040-ard.yaml diff --git a/tests/components/bme280_spi/test.esp32.yaml b/tests/components/bme280_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/bme280_spi/test.esp32.yaml rename to tests/components/bme280_spi/test.esp32-ard.yaml diff --git a/tests/components/bme280_spi/test.esp32-c3.yaml b/tests/components/bme280_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bme280_spi/test.esp32-c3.yaml rename to tests/components/bme280_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/bme280_spi/test.esp8266.yaml b/tests/components/bme280_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bme280_spi/test.esp8266.yaml rename to tests/components/bme280_spi/test.esp8266-ard.yaml diff --git a/tests/components/bme280_spi/test.rp2040.yaml b/tests/components/bme280_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bme280_spi/test.rp2040.yaml rename to tests/components/bme280_spi/test.rp2040-ard.yaml diff --git a/tests/components/bme680/test.esp32.yaml b/tests/components/bme680/test.esp32-ard.yaml similarity index 100% rename from tests/components/bme680/test.esp32.yaml rename to tests/components/bme680/test.esp32-ard.yaml diff --git a/tests/components/bme680/test.esp32-c3.yaml b/tests/components/bme680/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bme680/test.esp32-c3.yaml rename to tests/components/bme680/test.esp32-c3-ard.yaml diff --git a/tests/components/bme680/test.esp8266.yaml b/tests/components/bme680/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bme680/test.esp8266.yaml rename to tests/components/bme680/test.esp8266-ard.yaml diff --git a/tests/components/bme680/test.rp2040.yaml b/tests/components/bme680/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bme680/test.rp2040.yaml rename to tests/components/bme680/test.rp2040-ard.yaml diff --git a/tests/components/bme680_bsec/test.esp32.yaml b/tests/components/bme680_bsec/test.esp32-ard.yaml similarity index 100% rename from tests/components/bme680_bsec/test.esp32.yaml rename to tests/components/bme680_bsec/test.esp32-ard.yaml diff --git a/tests/components/bme680_bsec/test.esp8266.yaml b/tests/components/bme680_bsec/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bme680_bsec/test.esp8266.yaml rename to tests/components/bme680_bsec/test.esp8266-ard.yaml diff --git a/tests/components/bmi160/test.esp32.yaml b/tests/components/bmi160/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmi160/test.esp32.yaml rename to tests/components/bmi160/test.esp32-ard.yaml diff --git a/tests/components/bmi160/test.esp32-c3.yaml b/tests/components/bmi160/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmi160/test.esp32-c3.yaml rename to tests/components/bmi160/test.esp32-c3-ard.yaml diff --git a/tests/components/bmi160/test.esp8266.yaml b/tests/components/bmi160/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmi160/test.esp8266.yaml rename to tests/components/bmi160/test.esp8266-ard.yaml diff --git a/tests/components/bmi160/test.rp2040.yaml b/tests/components/bmi160/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmi160/test.rp2040.yaml rename to tests/components/bmi160/test.rp2040-ard.yaml diff --git a/tests/components/bmp085/test.esp32.yaml b/tests/components/bmp085/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp085/test.esp32.yaml rename to tests/components/bmp085/test.esp32-ard.yaml diff --git a/tests/components/bmp085/test.esp32-c3.yaml b/tests/components/bmp085/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp085/test.esp32-c3.yaml rename to tests/components/bmp085/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp085/test.esp8266.yaml b/tests/components/bmp085/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp085/test.esp8266.yaml rename to tests/components/bmp085/test.esp8266-ard.yaml diff --git a/tests/components/bmp085/test.rp2040.yaml b/tests/components/bmp085/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp085/test.rp2040.yaml rename to tests/components/bmp085/test.rp2040-ard.yaml diff --git a/tests/components/bmp280/test.esp32.yaml b/tests/components/bmp280/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp280/test.esp32.yaml rename to tests/components/bmp280/test.esp32-ard.yaml diff --git a/tests/components/bmp280/test.esp32-c3.yaml b/tests/components/bmp280/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp280/test.esp32-c3.yaml rename to tests/components/bmp280/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp280/test.esp8266.yaml b/tests/components/bmp280/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp280/test.esp8266.yaml rename to tests/components/bmp280/test.esp8266-ard.yaml diff --git a/tests/components/bmp280/test.rp2040.yaml b/tests/components/bmp280/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp280/test.rp2040.yaml rename to tests/components/bmp280/test.rp2040-ard.yaml diff --git a/tests/components/bmp3xx_i2c/test.esp32.yaml b/tests/components/bmp3xx_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp3xx_i2c/test.esp32.yaml rename to tests/components/bmp3xx_i2c/test.esp32-ard.yaml diff --git a/tests/components/bmp3xx_i2c/test.esp32-c3.yaml b/tests/components/bmp3xx_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp3xx_i2c/test.esp32-c3.yaml rename to tests/components/bmp3xx_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp3xx_i2c/test.esp8266.yaml b/tests/components/bmp3xx_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp3xx_i2c/test.esp8266.yaml rename to tests/components/bmp3xx_i2c/test.esp8266-ard.yaml diff --git a/tests/components/bmp3xx_i2c/test.rp2040.yaml b/tests/components/bmp3xx_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp3xx_i2c/test.rp2040.yaml rename to tests/components/bmp3xx_i2c/test.rp2040-ard.yaml diff --git a/tests/components/bmp3xx_spi/test.esp32.yaml b/tests/components/bmp3xx_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp3xx_spi/test.esp32.yaml rename to tests/components/bmp3xx_spi/test.esp32-ard.yaml diff --git a/tests/components/bmp3xx_spi/test.esp32-c3.yaml b/tests/components/bmp3xx_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp3xx_spi/test.esp32-c3.yaml rename to tests/components/bmp3xx_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp3xx_spi/test.esp8266.yaml b/tests/components/bmp3xx_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp3xx_spi/test.esp8266.yaml rename to tests/components/bmp3xx_spi/test.esp8266-ard.yaml diff --git a/tests/components/bmp3xx_spi/test.rp2040.yaml b/tests/components/bmp3xx_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp3xx_spi/test.rp2040.yaml rename to tests/components/bmp3xx_spi/test.rp2040-ard.yaml diff --git a/tests/components/bmp581/test.esp32.yaml b/tests/components/bmp581/test.esp32-ard.yaml similarity index 100% rename from tests/components/bmp581/test.esp32.yaml rename to tests/components/bmp581/test.esp32-ard.yaml diff --git a/tests/components/bmp581/test.esp32-c3.yaml b/tests/components/bmp581/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bmp581/test.esp32-c3.yaml rename to tests/components/bmp581/test.esp32-c3-ard.yaml diff --git a/tests/components/bmp581/test.esp8266.yaml b/tests/components/bmp581/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bmp581/test.esp8266.yaml rename to tests/components/bmp581/test.esp8266-ard.yaml diff --git a/tests/components/bmp581/test.rp2040.yaml b/tests/components/bmp581/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bmp581/test.rp2040.yaml rename to tests/components/bmp581/test.rp2040-ard.yaml diff --git a/tests/components/bp1658cj/test.esp32.yaml b/tests/components/bp1658cj/test.esp32-ard.yaml similarity index 100% rename from tests/components/bp1658cj/test.esp32.yaml rename to tests/components/bp1658cj/test.esp32-ard.yaml diff --git a/tests/components/bp1658cj/test.esp32-c3.yaml b/tests/components/bp1658cj/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bp1658cj/test.esp32-c3.yaml rename to tests/components/bp1658cj/test.esp32-c3-ard.yaml diff --git a/tests/components/bp1658cj/test.esp8266.yaml b/tests/components/bp1658cj/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bp1658cj/test.esp8266.yaml rename to tests/components/bp1658cj/test.esp8266-ard.yaml diff --git a/tests/components/bp1658cj/test.rp2040.yaml b/tests/components/bp1658cj/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bp1658cj/test.rp2040.yaml rename to tests/components/bp1658cj/test.rp2040-ard.yaml diff --git a/tests/components/bp5758d/test.esp32.yaml b/tests/components/bp5758d/test.esp32-ard.yaml similarity index 100% rename from tests/components/bp5758d/test.esp32.yaml rename to tests/components/bp5758d/test.esp32-ard.yaml diff --git a/tests/components/bp5758d/test.esp32-c3.yaml b/tests/components/bp5758d/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/bp5758d/test.esp32-c3.yaml rename to tests/components/bp5758d/test.esp32-c3-ard.yaml diff --git a/tests/components/bp5758d/test.esp8266.yaml b/tests/components/bp5758d/test.esp8266-ard.yaml similarity index 100% rename from tests/components/bp5758d/test.esp8266.yaml rename to tests/components/bp5758d/test.esp8266-ard.yaml diff --git a/tests/components/bp5758d/test.rp2040.yaml b/tests/components/bp5758d/test.rp2040-ard.yaml similarity index 100% rename from tests/components/bp5758d/test.rp2040.yaml rename to tests/components/bp5758d/test.rp2040-ard.yaml diff --git a/tests/components/button/test.esp32-c3.yaml b/tests/components/button/test.esp32-ard.yaml similarity index 100% rename from tests/components/button/test.esp32-c3.yaml rename to tests/components/button/test.esp32-ard.yaml diff --git a/tests/components/button/test.esp32.yaml b/tests/components/button/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/button/test.esp32.yaml rename to tests/components/button/test.esp32-c3-ard.yaml diff --git a/tests/components/button/test.esp8266.yaml b/tests/components/button/test.esp8266-ard.yaml similarity index 100% rename from tests/components/button/test.esp8266.yaml rename to tests/components/button/test.esp8266-ard.yaml diff --git a/tests/components/button/test.rp2040.yaml b/tests/components/button/test.rp2040-ard.yaml similarity index 100% rename from tests/components/button/test.rp2040.yaml rename to tests/components/button/test.rp2040-ard.yaml diff --git a/tests/components/canbus/test.esp32-c3.yaml b/tests/components/canbus/test.esp32-ard.yaml similarity index 100% rename from tests/components/canbus/test.esp32-c3.yaml rename to tests/components/canbus/test.esp32-ard.yaml diff --git a/tests/components/canbus/test.esp32.yaml b/tests/components/canbus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/canbus/test.esp32.yaml rename to tests/components/canbus/test.esp32-c3-ard.yaml diff --git a/tests/components/cap1188/test.esp32.yaml b/tests/components/cap1188/test.esp32-ard.yaml similarity index 100% rename from tests/components/cap1188/test.esp32.yaml rename to tests/components/cap1188/test.esp32-ard.yaml diff --git a/tests/components/cap1188/test.esp32-c3.yaml b/tests/components/cap1188/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cap1188/test.esp32-c3.yaml rename to tests/components/cap1188/test.esp32-c3-ard.yaml diff --git a/tests/components/cap1188/test.esp8266.yaml b/tests/components/cap1188/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cap1188/test.esp8266.yaml rename to tests/components/cap1188/test.esp8266-ard.yaml diff --git a/tests/components/cap1188/test.rp2040.yaml b/tests/components/cap1188/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cap1188/test.rp2040.yaml rename to tests/components/cap1188/test.rp2040-ard.yaml diff --git a/tests/components/captive_portal/test.esp32-c3.yaml b/tests/components/captive_portal/test.esp32-ard.yaml similarity index 100% rename from tests/components/captive_portal/test.esp32-c3.yaml rename to tests/components/captive_portal/test.esp32-ard.yaml diff --git a/tests/components/captive_portal/test.esp32.yaml b/tests/components/captive_portal/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/captive_portal/test.esp32.yaml rename to tests/components/captive_portal/test.esp32-c3-ard.yaml diff --git a/tests/components/captive_portal/test.esp8266.yaml b/tests/components/captive_portal/test.esp8266-ard.yaml similarity index 100% rename from tests/components/captive_portal/test.esp8266.yaml rename to tests/components/captive_portal/test.esp8266-ard.yaml diff --git a/tests/components/ccs811/test.esp32.yaml b/tests/components/ccs811/test.esp32-ard.yaml similarity index 100% rename from tests/components/ccs811/test.esp32.yaml rename to tests/components/ccs811/test.esp32-ard.yaml diff --git a/tests/components/ccs811/test.esp32-c3.yaml b/tests/components/ccs811/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ccs811/test.esp32-c3.yaml rename to tests/components/ccs811/test.esp32-c3-ard.yaml diff --git a/tests/components/ccs811/test.esp8266.yaml b/tests/components/ccs811/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ccs811/test.esp8266.yaml rename to tests/components/ccs811/test.esp8266-ard.yaml diff --git a/tests/components/ccs811/test.rp2040.yaml b/tests/components/ccs811/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ccs811/test.rp2040.yaml rename to tests/components/ccs811/test.rp2040-ard.yaml diff --git a/tests/components/cd74hc4067/test.esp32.yaml b/tests/components/cd74hc4067/test.esp32-ard.yaml similarity index 100% rename from tests/components/cd74hc4067/test.esp32.yaml rename to tests/components/cd74hc4067/test.esp32-ard.yaml diff --git a/tests/components/cd74hc4067/test.esp32-c3.yaml b/tests/components/cd74hc4067/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cd74hc4067/test.esp32-c3.yaml rename to tests/components/cd74hc4067/test.esp32-c3-ard.yaml diff --git a/tests/components/cd74hc4067/test.esp8266.yaml b/tests/components/cd74hc4067/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cd74hc4067/test.esp8266.yaml rename to tests/components/cd74hc4067/test.esp8266-ard.yaml diff --git a/tests/components/cd74hc4067/test.rp2040.yaml b/tests/components/cd74hc4067/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cd74hc4067/test.rp2040.yaml rename to tests/components/cd74hc4067/test.rp2040-ard.yaml diff --git a/tests/components/climate_ir_lg/test.esp32-c3.yaml b/tests/components/climate_ir_lg/test.esp32-ard.yaml similarity index 100% rename from tests/components/climate_ir_lg/test.esp32-c3.yaml rename to tests/components/climate_ir_lg/test.esp32-ard.yaml diff --git a/tests/components/climate_ir_lg/test.esp32.yaml b/tests/components/climate_ir_lg/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/climate_ir_lg/test.esp32.yaml rename to tests/components/climate_ir_lg/test.esp32-c3-ard.yaml diff --git a/tests/components/climate_ir_lg/test.esp8266.yaml b/tests/components/climate_ir_lg/test.esp8266-ard.yaml similarity index 100% rename from tests/components/climate_ir_lg/test.esp8266.yaml rename to tests/components/climate_ir_lg/test.esp8266-ard.yaml diff --git a/tests/components/color/test.esp32-c3.yaml b/tests/components/color/test.esp32-ard.yaml similarity index 100% rename from tests/components/color/test.esp32-c3.yaml rename to tests/components/color/test.esp32-ard.yaml diff --git a/tests/components/color/test.esp32.yaml b/tests/components/color/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/color/test.esp32.yaml rename to tests/components/color/test.esp32-c3-ard.yaml diff --git a/tests/components/color/test.esp8266.yaml b/tests/components/color/test.esp8266-ard.yaml similarity index 100% rename from tests/components/color/test.esp8266.yaml rename to tests/components/color/test.esp8266-ard.yaml diff --git a/tests/components/color/test.rp2040.yaml b/tests/components/color/test.rp2040-ard.yaml similarity index 100% rename from tests/components/color/test.rp2040.yaml rename to tests/components/color/test.rp2040-ard.yaml diff --git a/tests/components/color_temperature/test.esp32.yaml b/tests/components/color_temperature/test.esp32-ard.yaml similarity index 100% rename from tests/components/color_temperature/test.esp32.yaml rename to tests/components/color_temperature/test.esp32-ard.yaml diff --git a/tests/components/color_temperature/test.esp32-c3.yaml b/tests/components/color_temperature/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/color_temperature/test.esp32-c3.yaml rename to tests/components/color_temperature/test.esp32-c3-ard.yaml diff --git a/tests/components/color_temperature/test.esp8266.yaml b/tests/components/color_temperature/test.esp8266-ard.yaml similarity index 100% rename from tests/components/color_temperature/test.esp8266.yaml rename to tests/components/color_temperature/test.esp8266-ard.yaml diff --git a/tests/components/color_temperature/test.rp2040.yaml b/tests/components/color_temperature/test.rp2040-ard.yaml similarity index 100% rename from tests/components/color_temperature/test.rp2040.yaml rename to tests/components/color_temperature/test.rp2040-ard.yaml diff --git a/tests/components/combination/test.esp32-c3.yaml b/tests/components/combination/test.esp32-ard.yaml similarity index 100% rename from tests/components/combination/test.esp32-c3.yaml rename to tests/components/combination/test.esp32-ard.yaml diff --git a/tests/components/combination/test.esp32.yaml b/tests/components/combination/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/combination/test.esp32.yaml rename to tests/components/combination/test.esp32-c3-ard.yaml diff --git a/tests/components/combination/test.esp8266.yaml b/tests/components/combination/test.esp8266-ard.yaml similarity index 100% rename from tests/components/combination/test.esp8266.yaml rename to tests/components/combination/test.esp8266-ard.yaml diff --git a/tests/components/combination/test.rp2040.yaml b/tests/components/combination/test.rp2040-ard.yaml similarity index 100% rename from tests/components/combination/test.rp2040.yaml rename to tests/components/combination/test.rp2040-ard.yaml diff --git a/tests/components/coolix/test.esp32-c3.yaml b/tests/components/coolix/test.esp32-ard.yaml similarity index 100% rename from tests/components/coolix/test.esp32-c3.yaml rename to tests/components/coolix/test.esp32-ard.yaml diff --git a/tests/components/coolix/test.esp32.yaml b/tests/components/coolix/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/coolix/test.esp32.yaml rename to tests/components/coolix/test.esp32-c3-ard.yaml diff --git a/tests/components/coolix/test.esp8266.yaml b/tests/components/coolix/test.esp8266-ard.yaml similarity index 100% rename from tests/components/coolix/test.esp8266.yaml rename to tests/components/coolix/test.esp8266-ard.yaml diff --git a/tests/components/copy/test.esp32.yaml b/tests/components/copy/test.esp32-ard.yaml similarity index 100% rename from tests/components/copy/test.esp32.yaml rename to tests/components/copy/test.esp32-ard.yaml diff --git a/tests/components/copy/test.esp32-c3.yaml b/tests/components/copy/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/copy/test.esp32-c3.yaml rename to tests/components/copy/test.esp32-c3-ard.yaml diff --git a/tests/components/copy/test.esp8266.yaml b/tests/components/copy/test.esp8266-ard.yaml similarity index 100% rename from tests/components/copy/test.esp8266.yaml rename to tests/components/copy/test.esp8266-ard.yaml diff --git a/tests/components/copy/test.rp2040.yaml b/tests/components/copy/test.rp2040-ard.yaml similarity index 100% rename from tests/components/copy/test.rp2040.yaml rename to tests/components/copy/test.rp2040-ard.yaml diff --git a/tests/components/cs5460a/test.esp32.yaml b/tests/components/cs5460a/test.esp32-ard.yaml similarity index 100% rename from tests/components/cs5460a/test.esp32.yaml rename to tests/components/cs5460a/test.esp32-ard.yaml diff --git a/tests/components/cs5460a/test.esp32-c3.yaml b/tests/components/cs5460a/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cs5460a/test.esp32-c3.yaml rename to tests/components/cs5460a/test.esp32-c3-ard.yaml diff --git a/tests/components/cs5460a/test.esp8266.yaml b/tests/components/cs5460a/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cs5460a/test.esp8266.yaml rename to tests/components/cs5460a/test.esp8266-ard.yaml diff --git a/tests/components/cs5460a/test.rp2040.yaml b/tests/components/cs5460a/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cs5460a/test.rp2040.yaml rename to tests/components/cs5460a/test.rp2040-ard.yaml diff --git a/tests/components/cse7761/test.esp32.yaml b/tests/components/cse7761/test.esp32-ard.yaml similarity index 100% rename from tests/components/cse7761/test.esp32.yaml rename to tests/components/cse7761/test.esp32-ard.yaml diff --git a/tests/components/cse7761/test.esp32-c3.yaml b/tests/components/cse7761/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cse7761/test.esp32-c3.yaml rename to tests/components/cse7761/test.esp32-c3-ard.yaml diff --git a/tests/components/cse7761/test.esp8266.yaml b/tests/components/cse7761/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cse7761/test.esp8266.yaml rename to tests/components/cse7761/test.esp8266-ard.yaml diff --git a/tests/components/cse7761/test.rp2040.yaml b/tests/components/cse7761/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cse7761/test.rp2040.yaml rename to tests/components/cse7761/test.rp2040-ard.yaml diff --git a/tests/components/cse7766/test.esp32.yaml b/tests/components/cse7766/test.esp32-ard.yaml similarity index 100% rename from tests/components/cse7766/test.esp32.yaml rename to tests/components/cse7766/test.esp32-ard.yaml diff --git a/tests/components/cse7766/test.esp32-c3.yaml b/tests/components/cse7766/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cse7766/test.esp32-c3.yaml rename to tests/components/cse7766/test.esp32-c3-ard.yaml diff --git a/tests/components/cse7766/test.esp8266.yaml b/tests/components/cse7766/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cse7766/test.esp8266.yaml rename to tests/components/cse7766/test.esp8266-ard.yaml diff --git a/tests/components/cse7766/test.rp2040.yaml b/tests/components/cse7766/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cse7766/test.rp2040.yaml rename to tests/components/cse7766/test.rp2040-ard.yaml diff --git a/tests/components/cst226/test.esp32-c3.yaml b/tests/components/cst226/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cst226/test.esp32-c3.yaml rename to tests/components/cst226/test.esp32-c3-ard.yaml diff --git a/tests/components/cst816/test.esp32.yaml b/tests/components/cst816/test.esp32-ard.yaml similarity index 100% rename from tests/components/cst816/test.esp32.yaml rename to tests/components/cst816/test.esp32-ard.yaml diff --git a/tests/components/ct_clamp/test.esp32.yaml b/tests/components/ct_clamp/test.esp32-ard.yaml similarity index 100% rename from tests/components/ct_clamp/test.esp32.yaml rename to tests/components/ct_clamp/test.esp32-ard.yaml diff --git a/tests/components/ct_clamp/test.esp32-c3.yaml b/tests/components/ct_clamp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ct_clamp/test.esp32-c3.yaml rename to tests/components/ct_clamp/test.esp32-c3-ard.yaml diff --git a/tests/components/ct_clamp/test.esp8266.yaml b/tests/components/ct_clamp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ct_clamp/test.esp8266.yaml rename to tests/components/ct_clamp/test.esp8266-ard.yaml diff --git a/tests/components/ct_clamp/test.rp2040.yaml b/tests/components/ct_clamp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ct_clamp/test.rp2040.yaml rename to tests/components/ct_clamp/test.rp2040-ard.yaml diff --git a/tests/components/current_based/test.esp32.yaml b/tests/components/current_based/test.esp32-ard.yaml similarity index 100% rename from tests/components/current_based/test.esp32.yaml rename to tests/components/current_based/test.esp32-ard.yaml diff --git a/tests/components/current_based/test.esp32-c3.yaml b/tests/components/current_based/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/current_based/test.esp32-c3.yaml rename to tests/components/current_based/test.esp32-c3-ard.yaml diff --git a/tests/components/current_based/test.esp8266.yaml b/tests/components/current_based/test.esp8266-ard.yaml similarity index 100% rename from tests/components/current_based/test.esp8266.yaml rename to tests/components/current_based/test.esp8266-ard.yaml diff --git a/tests/components/current_based/test.rp2040.yaml b/tests/components/current_based/test.rp2040-ard.yaml similarity index 100% rename from tests/components/current_based/test.rp2040.yaml rename to tests/components/current_based/test.rp2040-ard.yaml diff --git a/tests/components/cwww/test.esp32.yaml b/tests/components/cwww/test.esp32-ard.yaml similarity index 100% rename from tests/components/cwww/test.esp32.yaml rename to tests/components/cwww/test.esp32-ard.yaml diff --git a/tests/components/cwww/test.esp32-c3.yaml b/tests/components/cwww/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/cwww/test.esp32-c3.yaml rename to tests/components/cwww/test.esp32-c3-ard.yaml diff --git a/tests/components/cwww/test.esp8266.yaml b/tests/components/cwww/test.esp8266-ard.yaml similarity index 100% rename from tests/components/cwww/test.esp8266.yaml rename to tests/components/cwww/test.esp8266-ard.yaml diff --git a/tests/components/cwww/test.rp2040.yaml b/tests/components/cwww/test.rp2040-ard.yaml similarity index 100% rename from tests/components/cwww/test.rp2040.yaml rename to tests/components/cwww/test.rp2040-ard.yaml diff --git a/tests/components/dac7678/test.esp32.yaml b/tests/components/dac7678/test.esp32-ard.yaml similarity index 100% rename from tests/components/dac7678/test.esp32.yaml rename to tests/components/dac7678/test.esp32-ard.yaml diff --git a/tests/components/dac7678/test.esp32-c3.yaml b/tests/components/dac7678/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dac7678/test.esp32-c3.yaml rename to tests/components/dac7678/test.esp32-c3-ard.yaml diff --git a/tests/components/dac7678/test.esp8266.yaml b/tests/components/dac7678/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dac7678/test.esp8266.yaml rename to tests/components/dac7678/test.esp8266-ard.yaml diff --git a/tests/components/dac7678/test.rp2040.yaml b/tests/components/dac7678/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dac7678/test.rp2040.yaml rename to tests/components/dac7678/test.rp2040-ard.yaml diff --git a/tests/components/daikin/test.esp32.yaml b/tests/components/daikin/test.esp32-ard.yaml similarity index 100% rename from tests/components/daikin/test.esp32.yaml rename to tests/components/daikin/test.esp32-ard.yaml diff --git a/tests/components/daikin/test.esp8266.yaml b/tests/components/daikin/test.esp8266-ard.yaml similarity index 100% rename from tests/components/daikin/test.esp8266.yaml rename to tests/components/daikin/test.esp8266-ard.yaml diff --git a/tests/components/daikin_arc/test.esp32.yaml b/tests/components/daikin_arc/test.esp32-ard.yaml similarity index 100% rename from tests/components/daikin_arc/test.esp32.yaml rename to tests/components/daikin_arc/test.esp32-ard.yaml diff --git a/tests/components/daikin_arc/test.esp8266.yaml b/tests/components/daikin_arc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/daikin_arc/test.esp8266.yaml rename to tests/components/daikin_arc/test.esp8266-ard.yaml diff --git a/tests/components/daikin_brc/test.esp32-c3.yaml b/tests/components/daikin_brc/test.esp32-ard.yaml similarity index 100% rename from tests/components/daikin_brc/test.esp32-c3.yaml rename to tests/components/daikin_brc/test.esp32-ard.yaml diff --git a/tests/components/daikin_brc/test.esp32.yaml b/tests/components/daikin_brc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/daikin_brc/test.esp32.yaml rename to tests/components/daikin_brc/test.esp32-c3-ard.yaml diff --git a/tests/components/daikin_brc/test.esp8266.yaml b/tests/components/daikin_brc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/daikin_brc/test.esp8266.yaml rename to tests/components/daikin_brc/test.esp8266-ard.yaml diff --git a/tests/components/dallas_temp/test.esp32-c3.yaml b/tests/components/dallas_temp/test.esp32-ard.yaml similarity index 100% rename from tests/components/dallas_temp/test.esp32-c3.yaml rename to tests/components/dallas_temp/test.esp32-ard.yaml diff --git a/tests/components/dallas_temp/test.esp32.yaml b/tests/components/dallas_temp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dallas_temp/test.esp32.yaml rename to tests/components/dallas_temp/test.esp32-c3-ard.yaml diff --git a/tests/components/dallas_temp/test.esp8266.yaml b/tests/components/dallas_temp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dallas_temp/test.esp8266.yaml rename to tests/components/dallas_temp/test.esp8266-ard.yaml diff --git a/tests/components/dallas_temp/test.rp2040.yaml b/tests/components/dallas_temp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dallas_temp/test.rp2040.yaml rename to tests/components/dallas_temp/test.rp2040-ard.yaml diff --git a/tests/components/daly_bms/test.esp32.yaml b/tests/components/daly_bms/test.esp32-ard.yaml similarity index 100% rename from tests/components/daly_bms/test.esp32.yaml rename to tests/components/daly_bms/test.esp32-ard.yaml diff --git a/tests/components/daly_bms/test.esp32-c3.yaml b/tests/components/daly_bms/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/daly_bms/test.esp32-c3.yaml rename to tests/components/daly_bms/test.esp32-c3-ard.yaml diff --git a/tests/components/daly_bms/test.esp8266.yaml b/tests/components/daly_bms/test.esp8266-ard.yaml similarity index 100% rename from tests/components/daly_bms/test.esp8266.yaml rename to tests/components/daly_bms/test.esp8266-ard.yaml diff --git a/tests/components/daly_bms/test.rp2040.yaml b/tests/components/daly_bms/test.rp2040-ard.yaml similarity index 100% rename from tests/components/daly_bms/test.rp2040.yaml rename to tests/components/daly_bms/test.rp2040-ard.yaml diff --git a/tests/components/debug/test.esp32-c3.yaml b/tests/components/debug/test.esp32-ard.yaml similarity index 100% rename from tests/components/debug/test.esp32-c3.yaml rename to tests/components/debug/test.esp32-ard.yaml diff --git a/tests/components/debug/test.esp32.yaml b/tests/components/debug/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/debug/test.esp32.yaml rename to tests/components/debug/test.esp32-c3-ard.yaml diff --git a/tests/components/debug/test.esp8266.yaml b/tests/components/debug/test.esp8266-ard.yaml similarity index 100% rename from tests/components/debug/test.esp8266.yaml rename to tests/components/debug/test.esp8266-ard.yaml diff --git a/tests/components/debug/test.rp2040.yaml b/tests/components/debug/test.rp2040-ard.yaml similarity index 100% rename from tests/components/debug/test.rp2040.yaml rename to tests/components/debug/test.rp2040-ard.yaml diff --git a/tests/components/deep_sleep/test.esp32-c3.yaml b/tests/components/deep_sleep/test.esp32-ard.yaml similarity index 100% rename from tests/components/deep_sleep/test.esp32-c3.yaml rename to tests/components/deep_sleep/test.esp32-ard.yaml diff --git a/tests/components/deep_sleep/test.esp32.yaml b/tests/components/deep_sleep/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/deep_sleep/test.esp32.yaml rename to tests/components/deep_sleep/test.esp32-c3-ard.yaml diff --git a/tests/components/deep_sleep/test.esp8266.yaml b/tests/components/deep_sleep/test.esp8266-ard.yaml similarity index 100% rename from tests/components/deep_sleep/test.esp8266.yaml rename to tests/components/deep_sleep/test.esp8266-ard.yaml diff --git a/tests/components/delonghi/test.esp32-c3.yaml b/tests/components/delonghi/test.esp32-ard.yaml similarity index 100% rename from tests/components/delonghi/test.esp32-c3.yaml rename to tests/components/delonghi/test.esp32-ard.yaml diff --git a/tests/components/delonghi/test.esp32.yaml b/tests/components/delonghi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/delonghi/test.esp32.yaml rename to tests/components/delonghi/test.esp32-c3-ard.yaml diff --git a/tests/components/delonghi/test.esp8266.yaml b/tests/components/delonghi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/delonghi/test.esp8266.yaml rename to tests/components/delonghi/test.esp8266-ard.yaml diff --git a/tests/components/dfplayer/test.esp32.yaml b/tests/components/dfplayer/test.esp32-ard.yaml similarity index 100% rename from tests/components/dfplayer/test.esp32.yaml rename to tests/components/dfplayer/test.esp32-ard.yaml diff --git a/tests/components/dfplayer/test.esp32-c3.yaml b/tests/components/dfplayer/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dfplayer/test.esp32-c3.yaml rename to tests/components/dfplayer/test.esp32-c3-ard.yaml diff --git a/tests/components/dfplayer/test.esp8266.yaml b/tests/components/dfplayer/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dfplayer/test.esp8266.yaml rename to tests/components/dfplayer/test.esp8266-ard.yaml diff --git a/tests/components/dfplayer/test.rp2040.yaml b/tests/components/dfplayer/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dfplayer/test.rp2040.yaml rename to tests/components/dfplayer/test.rp2040-ard.yaml diff --git a/tests/components/dfrobot_sen0395/test.esp32.yaml b/tests/components/dfrobot_sen0395/test.esp32-ard.yaml similarity index 100% rename from tests/components/dfrobot_sen0395/test.esp32.yaml rename to tests/components/dfrobot_sen0395/test.esp32-ard.yaml diff --git a/tests/components/dfrobot_sen0395/test.esp32-c3.yaml b/tests/components/dfrobot_sen0395/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dfrobot_sen0395/test.esp32-c3.yaml rename to tests/components/dfrobot_sen0395/test.esp32-c3-ard.yaml diff --git a/tests/components/dfrobot_sen0395/test.esp8266.yaml b/tests/components/dfrobot_sen0395/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dfrobot_sen0395/test.esp8266.yaml rename to tests/components/dfrobot_sen0395/test.esp8266-ard.yaml diff --git a/tests/components/dfrobot_sen0395/test.rp2040.yaml b/tests/components/dfrobot_sen0395/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dfrobot_sen0395/test.rp2040.yaml rename to tests/components/dfrobot_sen0395/test.rp2040-ard.yaml diff --git a/tests/components/dht/test.esp32-c3.yaml b/tests/components/dht/test.esp32-ard.yaml similarity index 100% rename from tests/components/dht/test.esp32-c3.yaml rename to tests/components/dht/test.esp32-ard.yaml diff --git a/tests/components/dht/test.esp32.yaml b/tests/components/dht/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dht/test.esp32.yaml rename to tests/components/dht/test.esp32-c3-ard.yaml diff --git a/tests/components/dht/test.esp8266.yaml b/tests/components/dht/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dht/test.esp8266.yaml rename to tests/components/dht/test.esp8266-ard.yaml diff --git a/tests/components/dht/test.rp2040.yaml b/tests/components/dht/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dht/test.rp2040.yaml rename to tests/components/dht/test.rp2040-ard.yaml diff --git a/tests/components/dht12/test.esp32.yaml b/tests/components/dht12/test.esp32-ard.yaml similarity index 100% rename from tests/components/dht12/test.esp32.yaml rename to tests/components/dht12/test.esp32-ard.yaml diff --git a/tests/components/dht12/test.esp32-c3.yaml b/tests/components/dht12/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dht12/test.esp32-c3.yaml rename to tests/components/dht12/test.esp32-c3-ard.yaml diff --git a/tests/components/dht12/test.esp8266.yaml b/tests/components/dht12/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dht12/test.esp8266.yaml rename to tests/components/dht12/test.esp8266-ard.yaml diff --git a/tests/components/dht12/test.rp2040.yaml b/tests/components/dht12/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dht12/test.rp2040.yaml rename to tests/components/dht12/test.rp2040-ard.yaml diff --git a/tests/components/display/test.esp32.yaml b/tests/components/display/test.esp32-ard.yaml similarity index 100% rename from tests/components/display/test.esp32.yaml rename to tests/components/display/test.esp32-ard.yaml diff --git a/tests/components/dps310/test.esp32.yaml b/tests/components/dps310/test.esp32-ard.yaml similarity index 100% rename from tests/components/dps310/test.esp32.yaml rename to tests/components/dps310/test.esp32-ard.yaml diff --git a/tests/components/dps310/test.esp32-c3.yaml b/tests/components/dps310/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dps310/test.esp32-c3.yaml rename to tests/components/dps310/test.esp32-c3-ard.yaml diff --git a/tests/components/dps310/test.esp8266.yaml b/tests/components/dps310/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dps310/test.esp8266.yaml rename to tests/components/dps310/test.esp8266-ard.yaml diff --git a/tests/components/dps310/test.rp2040.yaml b/tests/components/dps310/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dps310/test.rp2040.yaml rename to tests/components/dps310/test.rp2040-ard.yaml diff --git a/tests/components/ds1307/test.esp32.yaml b/tests/components/ds1307/test.esp32-ard.yaml similarity index 100% rename from tests/components/ds1307/test.esp32.yaml rename to tests/components/ds1307/test.esp32-ard.yaml diff --git a/tests/components/ds1307/test.esp32-c3.yaml b/tests/components/ds1307/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ds1307/test.esp32-c3.yaml rename to tests/components/ds1307/test.esp32-c3-ard.yaml diff --git a/tests/components/ds1307/test.esp8266.yaml b/tests/components/ds1307/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ds1307/test.esp8266.yaml rename to tests/components/ds1307/test.esp8266-ard.yaml diff --git a/tests/components/ds1307/test.rp2040.yaml b/tests/components/ds1307/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ds1307/test.rp2040.yaml rename to tests/components/ds1307/test.rp2040-ard.yaml diff --git a/tests/components/dsmr/test.esp32.yaml b/tests/components/dsmr/test.esp32-ard.yaml similarity index 100% rename from tests/components/dsmr/test.esp32.yaml rename to tests/components/dsmr/test.esp32-ard.yaml diff --git a/tests/components/dsmr/test.esp32-c3.yaml b/tests/components/dsmr/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/dsmr/test.esp32-c3.yaml rename to tests/components/dsmr/test.esp32-c3-ard.yaml diff --git a/tests/components/dsmr/test.esp8266.yaml b/tests/components/dsmr/test.esp8266-ard.yaml similarity index 100% rename from tests/components/dsmr/test.esp8266.yaml rename to tests/components/dsmr/test.esp8266-ard.yaml diff --git a/tests/components/dsmr/test.rp2040.yaml b/tests/components/dsmr/test.rp2040-ard.yaml similarity index 100% rename from tests/components/dsmr/test.rp2040.yaml rename to tests/components/dsmr/test.rp2040-ard.yaml diff --git a/tests/components/duty_cycle/test.esp32-c3.yaml b/tests/components/duty_cycle/test.esp32-ard.yaml similarity index 100% rename from tests/components/duty_cycle/test.esp32-c3.yaml rename to tests/components/duty_cycle/test.esp32-ard.yaml diff --git a/tests/components/duty_cycle/test.esp32.yaml b/tests/components/duty_cycle/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/duty_cycle/test.esp32.yaml rename to tests/components/duty_cycle/test.esp32-c3-ard.yaml diff --git a/tests/components/duty_cycle/test.esp8266.yaml b/tests/components/duty_cycle/test.esp8266-ard.yaml similarity index 100% rename from tests/components/duty_cycle/test.esp8266.yaml rename to tests/components/duty_cycle/test.esp8266-ard.yaml diff --git a/tests/components/duty_cycle/test.rp2040.yaml b/tests/components/duty_cycle/test.rp2040-ard.yaml similarity index 100% rename from tests/components/duty_cycle/test.rp2040.yaml rename to tests/components/duty_cycle/test.rp2040-ard.yaml diff --git a/tests/components/duty_time/test.esp32-c3.yaml b/tests/components/duty_time/test.esp32-ard.yaml similarity index 100% rename from tests/components/duty_time/test.esp32-c3.yaml rename to tests/components/duty_time/test.esp32-ard.yaml diff --git a/tests/components/duty_time/test.esp32.yaml b/tests/components/duty_time/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/duty_time/test.esp32.yaml rename to tests/components/duty_time/test.esp32-c3-ard.yaml diff --git a/tests/components/duty_time/test.esp8266.yaml b/tests/components/duty_time/test.esp8266-ard.yaml similarity index 100% rename from tests/components/duty_time/test.esp8266.yaml rename to tests/components/duty_time/test.esp8266-ard.yaml diff --git a/tests/components/duty_time/test.rp2040.yaml b/tests/components/duty_time/test.rp2040-ard.yaml similarity index 100% rename from tests/components/duty_time/test.rp2040.yaml rename to tests/components/duty_time/test.rp2040-ard.yaml diff --git a/tests/components/e131/test.esp32-c3.yaml b/tests/components/e131/test.esp32-ard.yaml similarity index 100% rename from tests/components/e131/test.esp32-c3.yaml rename to tests/components/e131/test.esp32-ard.yaml diff --git a/tests/components/e131/test.esp32.yaml b/tests/components/e131/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/e131/test.esp32.yaml rename to tests/components/e131/test.esp32-c3-ard.yaml diff --git a/tests/components/e131/test.esp8266.yaml b/tests/components/e131/test.esp8266-ard.yaml similarity index 100% rename from tests/components/e131/test.esp8266.yaml rename to tests/components/e131/test.esp8266-ard.yaml diff --git a/tests/components/e131/test.rp2040.yaml b/tests/components/e131/test.rp2040-ard.yaml similarity index 100% rename from tests/components/e131/test.rp2040.yaml rename to tests/components/e131/test.rp2040-ard.yaml diff --git a/tests/components/ee895/test.esp32.yaml b/tests/components/ee895/test.esp32-ard.yaml similarity index 100% rename from tests/components/ee895/test.esp32.yaml rename to tests/components/ee895/test.esp32-ard.yaml diff --git a/tests/components/ee895/test.esp32-c3.yaml b/tests/components/ee895/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ee895/test.esp32-c3.yaml rename to tests/components/ee895/test.esp32-c3-ard.yaml diff --git a/tests/components/ee895/test.esp8266.yaml b/tests/components/ee895/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ee895/test.esp8266.yaml rename to tests/components/ee895/test.esp8266-ard.yaml diff --git a/tests/components/ee895/test.rp2040.yaml b/tests/components/ee895/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ee895/test.rp2040.yaml rename to tests/components/ee895/test.rp2040-ard.yaml diff --git a/tests/components/ektf2232/test.esp32.yaml b/tests/components/ektf2232/test.esp32-ard.yaml similarity index 100% rename from tests/components/ektf2232/test.esp32.yaml rename to tests/components/ektf2232/test.esp32-ard.yaml diff --git a/tests/components/ektf2232/test.esp32-c3.yaml b/tests/components/ektf2232/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ektf2232/test.esp32-c3.yaml rename to tests/components/ektf2232/test.esp32-c3-ard.yaml diff --git a/tests/components/ektf2232/test.esp8266.yaml b/tests/components/ektf2232/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ektf2232/test.esp8266.yaml rename to tests/components/ektf2232/test.esp8266-ard.yaml diff --git a/tests/components/ektf2232/test.rp2040.yaml b/tests/components/ektf2232/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ektf2232/test.rp2040.yaml rename to tests/components/ektf2232/test.rp2040-ard.yaml diff --git a/tests/components/emc2101/test.esp32.yaml b/tests/components/emc2101/test.esp32-ard.yaml similarity index 100% rename from tests/components/emc2101/test.esp32.yaml rename to tests/components/emc2101/test.esp32-ard.yaml diff --git a/tests/components/emc2101/test.esp32-c3.yaml b/tests/components/emc2101/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/emc2101/test.esp32-c3.yaml rename to tests/components/emc2101/test.esp32-c3-ard.yaml diff --git a/tests/components/emc2101/test.esp8266.yaml b/tests/components/emc2101/test.esp8266-ard.yaml similarity index 100% rename from tests/components/emc2101/test.esp8266.yaml rename to tests/components/emc2101/test.esp8266-ard.yaml diff --git a/tests/components/emc2101/test.rp2040.yaml b/tests/components/emc2101/test.rp2040-ard.yaml similarity index 100% rename from tests/components/emc2101/test.rp2040.yaml rename to tests/components/emc2101/test.rp2040-ard.yaml diff --git a/tests/components/emmeti/test.esp32.yaml b/tests/components/emmeti/test.esp32-ard.yaml similarity index 100% rename from tests/components/emmeti/test.esp32.yaml rename to tests/components/emmeti/test.esp32-ard.yaml diff --git a/tests/components/emmeti/test.esp8266.yaml b/tests/components/emmeti/test.esp8266-ard.yaml similarity index 100% rename from tests/components/emmeti/test.esp8266.yaml rename to tests/components/emmeti/test.esp8266-ard.yaml diff --git a/tests/components/endstop/test.esp32-c3.yaml b/tests/components/endstop/test.esp32-ard.yaml similarity index 100% rename from tests/components/endstop/test.esp32-c3.yaml rename to tests/components/endstop/test.esp32-ard.yaml diff --git a/tests/components/endstop/test.esp32.yaml b/tests/components/endstop/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/endstop/test.esp32.yaml rename to tests/components/endstop/test.esp32-c3-ard.yaml diff --git a/tests/components/endstop/test.esp8266.yaml b/tests/components/endstop/test.esp8266-ard.yaml similarity index 100% rename from tests/components/endstop/test.esp8266.yaml rename to tests/components/endstop/test.esp8266-ard.yaml diff --git a/tests/components/endstop/test.rp2040.yaml b/tests/components/endstop/test.rp2040-ard.yaml similarity index 100% rename from tests/components/endstop/test.rp2040.yaml rename to tests/components/endstop/test.rp2040-ard.yaml diff --git a/tests/components/ens160_i2c/test.esp32.yaml b/tests/components/ens160_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ens160_i2c/test.esp32.yaml rename to tests/components/ens160_i2c/test.esp32-ard.yaml diff --git a/tests/components/ens160_i2c/test.esp32-c3.yaml b/tests/components/ens160_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ens160_i2c/test.esp32-c3.yaml rename to tests/components/ens160_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ens160_i2c/test.esp8266.yaml b/tests/components/ens160_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ens160_i2c/test.esp8266.yaml rename to tests/components/ens160_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ens160_i2c/test.rp2040.yaml b/tests/components/ens160_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ens160_i2c/test.rp2040.yaml rename to tests/components/ens160_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ens160_spi/test.esp32.yaml b/tests/components/ens160_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ens160_spi/test.esp32.yaml rename to tests/components/ens160_spi/test.esp32-ard.yaml diff --git a/tests/components/ens160_spi/test.esp32-c3.yaml b/tests/components/ens160_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ens160_spi/test.esp32-c3.yaml rename to tests/components/ens160_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ens160_spi/test.esp8266.yaml b/tests/components/ens160_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ens160_spi/test.esp8266.yaml rename to tests/components/ens160_spi/test.esp8266-ard.yaml diff --git a/tests/components/ens160_spi/test.rp2040.yaml b/tests/components/ens160_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ens160_spi/test.rp2040.yaml rename to tests/components/ens160_spi/test.rp2040-ard.yaml diff --git a/tests/components/ens210/test.esp32.yaml b/tests/components/ens210/test.esp32-ard.yaml similarity index 100% rename from tests/components/ens210/test.esp32.yaml rename to tests/components/ens210/test.esp32-ard.yaml diff --git a/tests/components/ens210/test.esp32-c3.yaml b/tests/components/ens210/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ens210/test.esp32-c3.yaml rename to tests/components/ens210/test.esp32-c3-ard.yaml diff --git a/tests/components/ens210/test.esp8266.yaml b/tests/components/ens210/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ens210/test.esp8266.yaml rename to tests/components/ens210/test.esp8266-ard.yaml diff --git a/tests/components/ens210/test.rp2040.yaml b/tests/components/ens210/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ens210/test.rp2040.yaml rename to tests/components/ens210/test.rp2040-ard.yaml diff --git a/tests/components/esp32_ble/test.esp32-c3.yaml b/tests/components/esp32_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble/test.esp32-c3.yaml rename to tests/components/esp32_ble/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble/test.esp32.yaml b/tests/components/esp32_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble/test.esp32.yaml rename to tests/components/esp32_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_ble_beacon/test.esp32-c3.yaml b/tests/components/esp32_ble_beacon/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble_beacon/test.esp32-c3.yaml rename to tests/components/esp32_ble_beacon/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble_beacon/test.esp32.yaml b/tests/components/esp32_ble_beacon/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble_beacon/test.esp32.yaml rename to tests/components/esp32_ble_beacon/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_ble_client/test.esp32-c3.yaml b/tests/components/esp32_ble_client/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble_client/test.esp32-c3.yaml rename to tests/components/esp32_ble_client/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble_client/test.esp32.yaml b/tests/components/esp32_ble_client/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble_client/test.esp32.yaml rename to tests/components/esp32_ble_client/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_ble_server/test.esp32-c3.yaml b/tests/components/esp32_ble_server/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble_server/test.esp32-c3.yaml rename to tests/components/esp32_ble_server/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble_server/test.esp32.yaml b/tests/components/esp32_ble_server/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble_server/test.esp32.yaml rename to tests/components/esp32_ble_server/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_ble_tracker/test.esp32-c3.yaml b/tests/components/esp32_ble_tracker/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_ble_tracker/test.esp32-c3.yaml rename to tests/components/esp32_ble_tracker/test.esp32-ard.yaml diff --git a/tests/components/esp32_ble_tracker/test.esp32.yaml b/tests/components/esp32_ble_tracker/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_ble_tracker/test.esp32.yaml rename to tests/components/esp32_ble_tracker/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_camera/test.esp32.yaml b/tests/components/esp32_camera/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_camera/test.esp32.yaml rename to tests/components/esp32_camera/test.esp32-ard.yaml diff --git a/tests/components/esp32_camera_web_server/test.esp32.yaml b/tests/components/esp32_camera_web_server/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_camera_web_server/test.esp32.yaml rename to tests/components/esp32_camera_web_server/test.esp32-ard.yaml diff --git a/tests/components/esp32_can/test.esp32.yaml b/tests/components/esp32_can/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_can/test.esp32.yaml rename to tests/components/esp32_can/test.esp32-ard.yaml diff --git a/tests/components/esp32_can/test.esp32-c3.yaml b/tests/components/esp32_can/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_can/test.esp32-c3.yaml rename to tests/components/esp32_can/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_dac/test.esp32.yaml b/tests/components/esp32_dac/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_dac/test.esp32.yaml rename to tests/components/esp32_dac/test.esp32-ard.yaml diff --git a/tests/components/esp32_hall/test.esp32.yaml b/tests/components/esp32_hall/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_hall/test.esp32.yaml rename to tests/components/esp32_hall/test.esp32-ard.yaml diff --git a/tests/components/esp32_improv/test.esp32-c3.yaml b/tests/components/esp32_improv/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_improv/test.esp32-c3.yaml rename to tests/components/esp32_improv/test.esp32-ard.yaml diff --git a/tests/components/esp32_improv/test.esp32.yaml b/tests/components/esp32_improv/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_improv/test.esp32.yaml rename to tests/components/esp32_improv/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_rmt_led_strip/test.esp32.yaml b/tests/components/esp32_rmt_led_strip/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_rmt_led_strip/test.esp32.yaml rename to tests/components/esp32_rmt_led_strip/test.esp32-ard.yaml diff --git a/tests/components/esp32_rmt_led_strip/test.esp32-c3.yaml b/tests/components/esp32_rmt_led_strip/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/esp32_rmt_led_strip/test.esp32-c3.yaml rename to tests/components/esp32_rmt_led_strip/test.esp32-c3-ard.yaml diff --git a/tests/components/esp32_touch/test.esp32.yaml b/tests/components/esp32_touch/test.esp32-ard.yaml similarity index 100% rename from tests/components/esp32_touch/test.esp32.yaml rename to tests/components/esp32_touch/test.esp32-ard.yaml diff --git a/tests/components/esp8266_pwm/test.esp8266.yaml b/tests/components/esp8266_pwm/test.esp8266-ard.yaml similarity index 100% rename from tests/components/esp8266_pwm/test.esp8266.yaml rename to tests/components/esp8266_pwm/test.esp8266-ard.yaml diff --git a/tests/components/ethernet/test-dp83848.esp32.yaml b/tests/components/ethernet/test-dp83848.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-dp83848.esp32.yaml rename to tests/components/ethernet/test-dp83848.esp32-ard.yaml diff --git a/tests/components/ethernet/test-ip101.esp32.yaml b/tests/components/ethernet/test-ip101.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-ip101.esp32.yaml rename to tests/components/ethernet/test-ip101.esp32-ard.yaml diff --git a/tests/components/ethernet/test-jl1101.esp32.yaml b/tests/components/ethernet/test-jl1101.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-jl1101.esp32.yaml rename to tests/components/ethernet/test-jl1101.esp32-ard.yaml diff --git a/tests/components/ethernet/test-ksz8081.esp32.yaml b/tests/components/ethernet/test-ksz8081.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-ksz8081.esp32.yaml rename to tests/components/ethernet/test-ksz8081.esp32-ard.yaml diff --git a/tests/components/ethernet/test-ksz8081rna.esp32.yaml b/tests/components/ethernet/test-ksz8081rna.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-ksz8081rna.esp32.yaml rename to tests/components/ethernet/test-ksz8081rna.esp32-ard.yaml diff --git a/tests/components/ethernet/test-lan8720.esp32.yaml b/tests/components/ethernet/test-lan8720.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-lan8720.esp32.yaml rename to tests/components/ethernet/test-lan8720.esp32-ard.yaml diff --git a/tests/components/ethernet/test-rtl8201.esp32.yaml b/tests/components/ethernet/test-rtl8201.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-rtl8201.esp32.yaml rename to tests/components/ethernet/test-rtl8201.esp32-ard.yaml diff --git a/tests/components/ethernet/test-w5500.esp32.yaml b/tests/components/ethernet/test-w5500.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet/test-w5500.esp32.yaml rename to tests/components/ethernet/test-w5500.esp32-ard.yaml diff --git a/tests/components/ethernet_info/test.esp32.yaml b/tests/components/ethernet_info/test.esp32-ard.yaml similarity index 100% rename from tests/components/ethernet_info/test.esp32.yaml rename to tests/components/ethernet_info/test.esp32-ard.yaml diff --git a/tests/components/event/test.esp32-c3.yaml b/tests/components/event/test.esp32-ard.yaml similarity index 100% rename from tests/components/event/test.esp32-c3.yaml rename to tests/components/event/test.esp32-ard.yaml diff --git a/tests/components/event/test.esp32.yaml b/tests/components/event/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/event/test.esp32.yaml rename to tests/components/event/test.esp32-c3-ard.yaml diff --git a/tests/components/event/test.esp8266.yaml b/tests/components/event/test.esp8266-ard.yaml similarity index 100% rename from tests/components/event/test.esp8266.yaml rename to tests/components/event/test.esp8266-ard.yaml diff --git a/tests/components/event/test.rp2040.yaml b/tests/components/event/test.rp2040-ard.yaml similarity index 100% rename from tests/components/event/test.rp2040.yaml rename to tests/components/event/test.rp2040-ard.yaml diff --git a/tests/components/exposure_notifications/test.esp32-c3.yaml b/tests/components/exposure_notifications/test.esp32-ard.yaml similarity index 100% rename from tests/components/exposure_notifications/test.esp32-c3.yaml rename to tests/components/exposure_notifications/test.esp32-ard.yaml diff --git a/tests/components/exposure_notifications/test.esp32.yaml b/tests/components/exposure_notifications/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/exposure_notifications/test.esp32.yaml rename to tests/components/exposure_notifications/test.esp32-c3-ard.yaml diff --git a/tests/components/external_components/test.esp32-c3.yaml b/tests/components/external_components/test.esp32-ard.yaml similarity index 100% rename from tests/components/external_components/test.esp32-c3.yaml rename to tests/components/external_components/test.esp32-ard.yaml diff --git a/tests/components/external_components/test.esp32.yaml b/tests/components/external_components/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/external_components/test.esp32.yaml rename to tests/components/external_components/test.esp32-c3-ard.yaml diff --git a/tests/components/external_components/test.esp8266.yaml b/tests/components/external_components/test.esp8266-ard.yaml similarity index 100% rename from tests/components/external_components/test.esp8266.yaml rename to tests/components/external_components/test.esp8266-ard.yaml diff --git a/tests/components/external_components/test.rp2040.yaml b/tests/components/external_components/test.rp2040-ard.yaml similarity index 100% rename from tests/components/external_components/test.rp2040.yaml rename to tests/components/external_components/test.rp2040-ard.yaml diff --git a/tests/components/ezo/test.esp32.yaml b/tests/components/ezo/test.esp32-ard.yaml similarity index 100% rename from tests/components/ezo/test.esp32.yaml rename to tests/components/ezo/test.esp32-ard.yaml diff --git a/tests/components/ezo/test.esp32-c3.yaml b/tests/components/ezo/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ezo/test.esp32-c3.yaml rename to tests/components/ezo/test.esp32-c3-ard.yaml diff --git a/tests/components/ezo/test.esp8266.yaml b/tests/components/ezo/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ezo/test.esp8266.yaml rename to tests/components/ezo/test.esp8266-ard.yaml diff --git a/tests/components/ezo/test.rp2040.yaml b/tests/components/ezo/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ezo/test.rp2040.yaml rename to tests/components/ezo/test.rp2040-ard.yaml diff --git a/tests/components/ezo_pmp/test.esp32.yaml b/tests/components/ezo_pmp/test.esp32-ard.yaml similarity index 100% rename from tests/components/ezo_pmp/test.esp32.yaml rename to tests/components/ezo_pmp/test.esp32-ard.yaml diff --git a/tests/components/ezo_pmp/test.esp32-c3.yaml b/tests/components/ezo_pmp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ezo_pmp/test.esp32-c3.yaml rename to tests/components/ezo_pmp/test.esp32-c3-ard.yaml diff --git a/tests/components/ezo_pmp/test.esp8266.yaml b/tests/components/ezo_pmp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ezo_pmp/test.esp8266.yaml rename to tests/components/ezo_pmp/test.esp8266-ard.yaml diff --git a/tests/components/ezo_pmp/test.rp2040.yaml b/tests/components/ezo_pmp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ezo_pmp/test.rp2040.yaml rename to tests/components/ezo_pmp/test.rp2040-ard.yaml diff --git a/tests/components/factory_reset/test.esp32-c3.yaml b/tests/components/factory_reset/test.esp32-ard.yaml similarity index 100% rename from tests/components/factory_reset/test.esp32-c3.yaml rename to tests/components/factory_reset/test.esp32-ard.yaml diff --git a/tests/components/factory_reset/test.esp32.yaml b/tests/components/factory_reset/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/factory_reset/test.esp32.yaml rename to tests/components/factory_reset/test.esp32-c3-ard.yaml diff --git a/tests/components/factory_reset/test.esp8266.yaml b/tests/components/factory_reset/test.esp8266-ard.yaml similarity index 100% rename from tests/components/factory_reset/test.esp8266.yaml rename to tests/components/factory_reset/test.esp8266-ard.yaml diff --git a/tests/components/factory_reset/test.rp2040.yaml b/tests/components/factory_reset/test.rp2040-ard.yaml similarity index 100% rename from tests/components/factory_reset/test.rp2040.yaml rename to tests/components/factory_reset/test.rp2040-ard.yaml diff --git a/tests/components/fastled_clockless/test.esp32.yaml b/tests/components/fastled_clockless/test.esp32-ard.yaml similarity index 100% rename from tests/components/fastled_clockless/test.esp32.yaml rename to tests/components/fastled_clockless/test.esp32-ard.yaml diff --git a/tests/components/fastled_spi/test.esp32.yaml b/tests/components/fastled_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/fastled_spi/test.esp32.yaml rename to tests/components/fastled_spi/test.esp32-ard.yaml diff --git a/tests/components/feedback/test.esp32-c3.yaml b/tests/components/feedback/test.esp32-ard.yaml similarity index 100% rename from tests/components/feedback/test.esp32-c3.yaml rename to tests/components/feedback/test.esp32-ard.yaml diff --git a/tests/components/feedback/test.esp32.yaml b/tests/components/feedback/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/feedback/test.esp32.yaml rename to tests/components/feedback/test.esp32-c3-ard.yaml diff --git a/tests/components/feedback/test.esp8266.yaml b/tests/components/feedback/test.esp8266-ard.yaml similarity index 100% rename from tests/components/feedback/test.esp8266.yaml rename to tests/components/feedback/test.esp8266-ard.yaml diff --git a/tests/components/feedback/test.rp2040.yaml b/tests/components/feedback/test.rp2040-ard.yaml similarity index 100% rename from tests/components/feedback/test.rp2040.yaml rename to tests/components/feedback/test.rp2040-ard.yaml diff --git a/tests/components/fingerprint_grow/test.esp32.yaml b/tests/components/fingerprint_grow/test.esp32-ard.yaml similarity index 100% rename from tests/components/fingerprint_grow/test.esp32.yaml rename to tests/components/fingerprint_grow/test.esp32-ard.yaml diff --git a/tests/components/fingerprint_grow/test.esp32-c3.yaml b/tests/components/fingerprint_grow/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/fingerprint_grow/test.esp32-c3.yaml rename to tests/components/fingerprint_grow/test.esp32-c3-ard.yaml diff --git a/tests/components/fingerprint_grow/test.esp8266.yaml b/tests/components/fingerprint_grow/test.esp8266-ard.yaml similarity index 100% rename from tests/components/fingerprint_grow/test.esp8266.yaml rename to tests/components/fingerprint_grow/test.esp8266-ard.yaml diff --git a/tests/components/fingerprint_grow/test.rp2040.yaml b/tests/components/fingerprint_grow/test.rp2040-ard.yaml similarity index 100% rename from tests/components/fingerprint_grow/test.rp2040.yaml rename to tests/components/fingerprint_grow/test.rp2040-ard.yaml diff --git a/tests/components/font/test.esp32.yaml b/tests/components/font/test.esp32-ard.yaml similarity index 100% rename from tests/components/font/test.esp32.yaml rename to tests/components/font/test.esp32-ard.yaml diff --git a/tests/components/font/test.esp32-c3.yaml b/tests/components/font/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/font/test.esp32-c3.yaml rename to tests/components/font/test.esp32-c3-ard.yaml diff --git a/tests/components/font/test.esp8266.yaml b/tests/components/font/test.esp8266-ard.yaml similarity index 100% rename from tests/components/font/test.esp8266.yaml rename to tests/components/font/test.esp8266-ard.yaml diff --git a/tests/components/font/test.rp2040.yaml b/tests/components/font/test.rp2040-ard.yaml similarity index 100% rename from tests/components/font/test.rp2040.yaml rename to tests/components/font/test.rp2040-ard.yaml diff --git a/tests/components/fs3000/test.esp32.yaml b/tests/components/fs3000/test.esp32-ard.yaml similarity index 100% rename from tests/components/fs3000/test.esp32.yaml rename to tests/components/fs3000/test.esp32-ard.yaml diff --git a/tests/components/fs3000/test.esp32-c3.yaml b/tests/components/fs3000/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/fs3000/test.esp32-c3.yaml rename to tests/components/fs3000/test.esp32-c3-ard.yaml diff --git a/tests/components/fs3000/test.esp8266.yaml b/tests/components/fs3000/test.esp8266-ard.yaml similarity index 100% rename from tests/components/fs3000/test.esp8266.yaml rename to tests/components/fs3000/test.esp8266-ard.yaml diff --git a/tests/components/fs3000/test.rp2040.yaml b/tests/components/fs3000/test.rp2040-ard.yaml similarity index 100% rename from tests/components/fs3000/test.rp2040.yaml rename to tests/components/fs3000/test.rp2040-ard.yaml diff --git a/tests/components/ft5x06/test.esp32.yaml b/tests/components/ft5x06/test.esp32-ard.yaml similarity index 100% rename from tests/components/ft5x06/test.esp32.yaml rename to tests/components/ft5x06/test.esp32-ard.yaml diff --git a/tests/components/ft5x06/test.esp32-c3.yaml b/tests/components/ft5x06/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ft5x06/test.esp32-c3.yaml rename to tests/components/ft5x06/test.esp32-c3-ard.yaml diff --git a/tests/components/ft5x06/test.esp8266.yaml b/tests/components/ft5x06/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ft5x06/test.esp8266.yaml rename to tests/components/ft5x06/test.esp8266-ard.yaml diff --git a/tests/components/ft5x06/test.rp2040.yaml b/tests/components/ft5x06/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ft5x06/test.rp2040.yaml rename to tests/components/ft5x06/test.rp2040-ard.yaml diff --git a/tests/components/ft63x6/test.esp32.yaml b/tests/components/ft63x6/test.esp32-ard.yaml similarity index 100% rename from tests/components/ft63x6/test.esp32.yaml rename to tests/components/ft63x6/test.esp32-ard.yaml diff --git a/tests/components/ft63x6/test.esp32-c3.yaml b/tests/components/ft63x6/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ft63x6/test.esp32-c3.yaml rename to tests/components/ft63x6/test.esp32-c3-ard.yaml diff --git a/tests/components/ft63x6/test.esp8266.yaml b/tests/components/ft63x6/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ft63x6/test.esp8266.yaml rename to tests/components/ft63x6/test.esp8266-ard.yaml diff --git a/tests/components/ft63x6/test.rp2040.yaml b/tests/components/ft63x6/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ft63x6/test.rp2040.yaml rename to tests/components/ft63x6/test.rp2040-ard.yaml diff --git a/tests/components/fujitsu_general/test.esp32-c3.yaml b/tests/components/fujitsu_general/test.esp32-ard.yaml similarity index 100% rename from tests/components/fujitsu_general/test.esp32-c3.yaml rename to tests/components/fujitsu_general/test.esp32-ard.yaml diff --git a/tests/components/fujitsu_general/test.esp32.yaml b/tests/components/fujitsu_general/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/fujitsu_general/test.esp32.yaml rename to tests/components/fujitsu_general/test.esp32-c3-ard.yaml diff --git a/tests/components/fujitsu_general/test.esp8266.yaml b/tests/components/fujitsu_general/test.esp8266-ard.yaml similarity index 100% rename from tests/components/fujitsu_general/test.esp8266.yaml rename to tests/components/fujitsu_general/test.esp8266-ard.yaml diff --git a/tests/components/gcja5/test.esp32.yaml b/tests/components/gcja5/test.esp32-ard.yaml similarity index 100% rename from tests/components/gcja5/test.esp32.yaml rename to tests/components/gcja5/test.esp32-ard.yaml diff --git a/tests/components/gcja5/test.esp32-c3.yaml b/tests/components/gcja5/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gcja5/test.esp32-c3.yaml rename to tests/components/gcja5/test.esp32-c3-ard.yaml diff --git a/tests/components/gcja5/test.esp8266.yaml b/tests/components/gcja5/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gcja5/test.esp8266.yaml rename to tests/components/gcja5/test.esp8266-ard.yaml diff --git a/tests/components/gcja5/test.rp2040.yaml b/tests/components/gcja5/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gcja5/test.rp2040.yaml rename to tests/components/gcja5/test.rp2040-ard.yaml diff --git a/tests/components/gdk101/test.esp32.yaml b/tests/components/gdk101/test.esp32-ard.yaml similarity index 100% rename from tests/components/gdk101/test.esp32.yaml rename to tests/components/gdk101/test.esp32-ard.yaml diff --git a/tests/components/gdk101/test.esp8266.yaml b/tests/components/gdk101/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gdk101/test.esp8266.yaml rename to tests/components/gdk101/test.esp8266-ard.yaml diff --git a/tests/components/gdk101/test.rp2040.yaml b/tests/components/gdk101/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gdk101/test.rp2040.yaml rename to tests/components/gdk101/test.rp2040-ard.yaml diff --git a/tests/components/globals/test.esp32-c3.yaml b/tests/components/globals/test.esp32-ard.yaml similarity index 100% rename from tests/components/globals/test.esp32-c3.yaml rename to tests/components/globals/test.esp32-ard.yaml diff --git a/tests/components/globals/test.esp32.yaml b/tests/components/globals/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/globals/test.esp32.yaml rename to tests/components/globals/test.esp32-c3-ard.yaml diff --git a/tests/components/globals/test.esp8266.yaml b/tests/components/globals/test.esp8266-ard.yaml similarity index 100% rename from tests/components/globals/test.esp8266.yaml rename to tests/components/globals/test.esp8266-ard.yaml diff --git a/tests/components/globals/test.rp2040.yaml b/tests/components/globals/test.rp2040-ard.yaml similarity index 100% rename from tests/components/globals/test.rp2040.yaml rename to tests/components/globals/test.rp2040-ard.yaml diff --git a/tests/components/gp8403/test.esp32.yaml b/tests/components/gp8403/test.esp32-ard.yaml similarity index 100% rename from tests/components/gp8403/test.esp32.yaml rename to tests/components/gp8403/test.esp32-ard.yaml diff --git a/tests/components/gp8403/test.esp32-c3.yaml b/tests/components/gp8403/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gp8403/test.esp32-c3.yaml rename to tests/components/gp8403/test.esp32-c3-ard.yaml diff --git a/tests/components/gp8403/test.esp8266.yaml b/tests/components/gp8403/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gp8403/test.esp8266.yaml rename to tests/components/gp8403/test.esp8266-ard.yaml diff --git a/tests/components/gp8403/test.rp2040.yaml b/tests/components/gp8403/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gp8403/test.rp2040.yaml rename to tests/components/gp8403/test.rp2040-ard.yaml diff --git a/tests/components/gpio/test.esp32.yaml b/tests/components/gpio/test.esp32-ard.yaml similarity index 100% rename from tests/components/gpio/test.esp32.yaml rename to tests/components/gpio/test.esp32-ard.yaml diff --git a/tests/components/gpio/test.esp32-c3.yaml b/tests/components/gpio/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gpio/test.esp32-c3.yaml rename to tests/components/gpio/test.esp32-c3-ard.yaml diff --git a/tests/components/gpio/test.esp8266.yaml b/tests/components/gpio/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gpio/test.esp8266.yaml rename to tests/components/gpio/test.esp8266-ard.yaml diff --git a/tests/components/gpio/test.rp2040.yaml b/tests/components/gpio/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gpio/test.rp2040.yaml rename to tests/components/gpio/test.rp2040-ard.yaml diff --git a/tests/components/gps/test.esp32.yaml b/tests/components/gps/test.esp32-ard.yaml similarity index 100% rename from tests/components/gps/test.esp32.yaml rename to tests/components/gps/test.esp32-ard.yaml diff --git a/tests/components/gps/test.esp32-c3.yaml b/tests/components/gps/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gps/test.esp32-c3.yaml rename to tests/components/gps/test.esp32-c3-ard.yaml diff --git a/tests/components/gps/test.esp8266.yaml b/tests/components/gps/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gps/test.esp8266.yaml rename to tests/components/gps/test.esp8266-ard.yaml diff --git a/tests/components/gps/test.rp2040.yaml b/tests/components/gps/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gps/test.rp2040.yaml rename to tests/components/gps/test.rp2040-ard.yaml diff --git a/tests/components/graph/test.esp32.yaml b/tests/components/graph/test.esp32-ard.yaml similarity index 100% rename from tests/components/graph/test.esp32.yaml rename to tests/components/graph/test.esp32-ard.yaml diff --git a/tests/components/graph/test.esp32-c3.yaml b/tests/components/graph/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/graph/test.esp32-c3.yaml rename to tests/components/graph/test.esp32-c3-ard.yaml diff --git a/tests/components/graph/test.esp8266.yaml b/tests/components/graph/test.esp8266-ard.yaml similarity index 100% rename from tests/components/graph/test.esp8266.yaml rename to tests/components/graph/test.esp8266-ard.yaml diff --git a/tests/components/graph/test.rp2040.yaml b/tests/components/graph/test.rp2040-ard.yaml similarity index 100% rename from tests/components/graph/test.rp2040.yaml rename to tests/components/graph/test.rp2040-ard.yaml diff --git a/tests/components/graphical_display_menu/test.esp32.yaml b/tests/components/graphical_display_menu/test.esp32-ard.yaml similarity index 100% rename from tests/components/graphical_display_menu/test.esp32.yaml rename to tests/components/graphical_display_menu/test.esp32-ard.yaml diff --git a/tests/components/graphical_display_menu/test.esp32-c3.yaml b/tests/components/graphical_display_menu/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/graphical_display_menu/test.esp32-c3.yaml rename to tests/components/graphical_display_menu/test.esp32-c3-ard.yaml diff --git a/tests/components/graphical_display_menu/test.esp8266.yaml b/tests/components/graphical_display_menu/test.esp8266-ard.yaml similarity index 100% rename from tests/components/graphical_display_menu/test.esp8266.yaml rename to tests/components/graphical_display_menu/test.esp8266-ard.yaml diff --git a/tests/components/graphical_display_menu/test.rp2040.yaml b/tests/components/graphical_display_menu/test.rp2040-ard.yaml similarity index 100% rename from tests/components/graphical_display_menu/test.rp2040.yaml rename to tests/components/graphical_display_menu/test.rp2040-ard.yaml diff --git a/tests/components/gree/test.esp32-c3.yaml b/tests/components/gree/test.esp32-ard.yaml similarity index 100% rename from tests/components/gree/test.esp32-c3.yaml rename to tests/components/gree/test.esp32-ard.yaml diff --git a/tests/components/gree/test.esp32.yaml b/tests/components/gree/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gree/test.esp32.yaml rename to tests/components/gree/test.esp32-c3-ard.yaml diff --git a/tests/components/gree/test.esp8266.yaml b/tests/components/gree/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gree/test.esp8266.yaml rename to tests/components/gree/test.esp8266-ard.yaml diff --git a/tests/components/grove_tb6612fng/test.esp32.yaml b/tests/components/grove_tb6612fng/test.esp32-ard.yaml similarity index 100% rename from tests/components/grove_tb6612fng/test.esp32.yaml rename to tests/components/grove_tb6612fng/test.esp32-ard.yaml diff --git a/tests/components/grove_tb6612fng/test.esp32-c3.yaml b/tests/components/grove_tb6612fng/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/grove_tb6612fng/test.esp32-c3.yaml rename to tests/components/grove_tb6612fng/test.esp32-c3-ard.yaml diff --git a/tests/components/grove_tb6612fng/test.esp8266.yaml b/tests/components/grove_tb6612fng/test.esp8266-ard.yaml similarity index 100% rename from tests/components/grove_tb6612fng/test.esp8266.yaml rename to tests/components/grove_tb6612fng/test.esp8266-ard.yaml diff --git a/tests/components/grove_tb6612fng/test.rp2040.yaml b/tests/components/grove_tb6612fng/test.rp2040-ard.yaml similarity index 100% rename from tests/components/grove_tb6612fng/test.rp2040.yaml rename to tests/components/grove_tb6612fng/test.rp2040-ard.yaml diff --git a/tests/components/growatt_solar/test.esp32.yaml b/tests/components/growatt_solar/test.esp32-ard.yaml similarity index 100% rename from tests/components/growatt_solar/test.esp32.yaml rename to tests/components/growatt_solar/test.esp32-ard.yaml diff --git a/tests/components/growatt_solar/test.esp32-c3.yaml b/tests/components/growatt_solar/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/growatt_solar/test.esp32-c3.yaml rename to tests/components/growatt_solar/test.esp32-c3-ard.yaml diff --git a/tests/components/growatt_solar/test.esp8266.yaml b/tests/components/growatt_solar/test.esp8266-ard.yaml similarity index 100% rename from tests/components/growatt_solar/test.esp8266.yaml rename to tests/components/growatt_solar/test.esp8266-ard.yaml diff --git a/tests/components/growatt_solar/test.rp2040.yaml b/tests/components/growatt_solar/test.rp2040-ard.yaml similarity index 100% rename from tests/components/growatt_solar/test.rp2040.yaml rename to tests/components/growatt_solar/test.rp2040-ard.yaml diff --git a/tests/components/gt911/test.esp32.yaml b/tests/components/gt911/test.esp32-ard.yaml similarity index 100% rename from tests/components/gt911/test.esp32.yaml rename to tests/components/gt911/test.esp32-ard.yaml diff --git a/tests/components/gt911/test.esp32-c3.yaml b/tests/components/gt911/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/gt911/test.esp32-c3.yaml rename to tests/components/gt911/test.esp32-c3-ard.yaml diff --git a/tests/components/gt911/test.esp8266.yaml b/tests/components/gt911/test.esp8266-ard.yaml similarity index 100% rename from tests/components/gt911/test.esp8266.yaml rename to tests/components/gt911/test.esp8266-ard.yaml diff --git a/tests/components/gt911/test.rp2040.yaml b/tests/components/gt911/test.rp2040-ard.yaml similarity index 100% rename from tests/components/gt911/test.rp2040.yaml rename to tests/components/gt911/test.rp2040-ard.yaml diff --git a/tests/components/haier/test.esp32.yaml b/tests/components/haier/test.esp32-ard.yaml similarity index 100% rename from tests/components/haier/test.esp32.yaml rename to tests/components/haier/test.esp32-ard.yaml diff --git a/tests/components/haier/test.esp32-c3.yaml b/tests/components/haier/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/haier/test.esp32-c3.yaml rename to tests/components/haier/test.esp32-c3-ard.yaml diff --git a/tests/components/haier/test.esp8266.yaml b/tests/components/haier/test.esp8266-ard.yaml similarity index 100% rename from tests/components/haier/test.esp8266.yaml rename to tests/components/haier/test.esp8266-ard.yaml diff --git a/tests/components/haier/test.rp2040.yaml b/tests/components/haier/test.rp2040-ard.yaml similarity index 100% rename from tests/components/haier/test.rp2040.yaml rename to tests/components/haier/test.rp2040-ard.yaml diff --git a/tests/components/havells_solar/test.esp32.yaml b/tests/components/havells_solar/test.esp32-ard.yaml similarity index 100% rename from tests/components/havells_solar/test.esp32.yaml rename to tests/components/havells_solar/test.esp32-ard.yaml diff --git a/tests/components/havells_solar/test.esp32-c3.yaml b/tests/components/havells_solar/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/havells_solar/test.esp32-c3.yaml rename to tests/components/havells_solar/test.esp32-c3-ard.yaml diff --git a/tests/components/havells_solar/test.esp8266.yaml b/tests/components/havells_solar/test.esp8266-ard.yaml similarity index 100% rename from tests/components/havells_solar/test.esp8266.yaml rename to tests/components/havells_solar/test.esp8266-ard.yaml diff --git a/tests/components/havells_solar/test.rp2040.yaml b/tests/components/havells_solar/test.rp2040-ard.yaml similarity index 100% rename from tests/components/havells_solar/test.rp2040.yaml rename to tests/components/havells_solar/test.rp2040-ard.yaml diff --git a/tests/components/hbridge/test.esp32.yaml b/tests/components/hbridge/test.esp32-ard.yaml similarity index 100% rename from tests/components/hbridge/test.esp32.yaml rename to tests/components/hbridge/test.esp32-ard.yaml diff --git a/tests/components/hbridge/test.esp32-c3.yaml b/tests/components/hbridge/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hbridge/test.esp32-c3.yaml rename to tests/components/hbridge/test.esp32-c3-ard.yaml diff --git a/tests/components/hbridge/test.esp8266.yaml b/tests/components/hbridge/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hbridge/test.esp8266.yaml rename to tests/components/hbridge/test.esp8266-ard.yaml diff --git a/tests/components/hbridge/test.rp2040.yaml b/tests/components/hbridge/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hbridge/test.rp2040.yaml rename to tests/components/hbridge/test.rp2040-ard.yaml diff --git a/tests/components/hdc1080/test.esp32.yaml b/tests/components/hdc1080/test.esp32-ard.yaml similarity index 100% rename from tests/components/hdc1080/test.esp32.yaml rename to tests/components/hdc1080/test.esp32-ard.yaml diff --git a/tests/components/hdc1080/test.esp32-c3.yaml b/tests/components/hdc1080/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hdc1080/test.esp32-c3.yaml rename to tests/components/hdc1080/test.esp32-c3-ard.yaml diff --git a/tests/components/hdc1080/test.esp8266.yaml b/tests/components/hdc1080/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hdc1080/test.esp8266.yaml rename to tests/components/hdc1080/test.esp8266-ard.yaml diff --git a/tests/components/hdc1080/test.rp2040.yaml b/tests/components/hdc1080/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hdc1080/test.rp2040.yaml rename to tests/components/hdc1080/test.rp2040-ard.yaml diff --git a/tests/components/he60r/test.esp32.yaml b/tests/components/he60r/test.esp32-ard.yaml similarity index 100% rename from tests/components/he60r/test.esp32.yaml rename to tests/components/he60r/test.esp32-ard.yaml diff --git a/tests/components/he60r/test.esp32-c3.yaml b/tests/components/he60r/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/he60r/test.esp32-c3.yaml rename to tests/components/he60r/test.esp32-c3-ard.yaml diff --git a/tests/components/he60r/test.esp8266.yaml b/tests/components/he60r/test.esp8266-ard.yaml similarity index 100% rename from tests/components/he60r/test.esp8266.yaml rename to tests/components/he60r/test.esp8266-ard.yaml diff --git a/tests/components/he60r/test.rp2040.yaml b/tests/components/he60r/test.rp2040-ard.yaml similarity index 100% rename from tests/components/he60r/test.rp2040.yaml rename to tests/components/he60r/test.rp2040-ard.yaml diff --git a/tests/components/heatpumpir/test.esp32.yaml b/tests/components/heatpumpir/test.esp32-ard.yaml similarity index 100% rename from tests/components/heatpumpir/test.esp32.yaml rename to tests/components/heatpumpir/test.esp32-ard.yaml diff --git a/tests/components/heatpumpir/test.esp8266.yaml b/tests/components/heatpumpir/test.esp8266-ard.yaml similarity index 100% rename from tests/components/heatpumpir/test.esp8266.yaml rename to tests/components/heatpumpir/test.esp8266-ard.yaml diff --git a/tests/components/hitachi_ac344/test.esp32-c3.yaml b/tests/components/hitachi_ac344/test.esp32-ard.yaml similarity index 100% rename from tests/components/hitachi_ac344/test.esp32-c3.yaml rename to tests/components/hitachi_ac344/test.esp32-ard.yaml diff --git a/tests/components/hitachi_ac344/test.esp32.yaml b/tests/components/hitachi_ac344/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hitachi_ac344/test.esp32.yaml rename to tests/components/hitachi_ac344/test.esp32-c3-ard.yaml diff --git a/tests/components/hitachi_ac344/test.esp8266.yaml b/tests/components/hitachi_ac344/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hitachi_ac344/test.esp8266.yaml rename to tests/components/hitachi_ac344/test.esp8266-ard.yaml diff --git a/tests/components/hitachi_ac424/test.esp32-c3.yaml b/tests/components/hitachi_ac424/test.esp32-ard.yaml similarity index 100% rename from tests/components/hitachi_ac424/test.esp32-c3.yaml rename to tests/components/hitachi_ac424/test.esp32-ard.yaml diff --git a/tests/components/hitachi_ac424/test.esp32.yaml b/tests/components/hitachi_ac424/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hitachi_ac424/test.esp32.yaml rename to tests/components/hitachi_ac424/test.esp32-c3-ard.yaml diff --git a/tests/components/hitachi_ac424/test.esp8266.yaml b/tests/components/hitachi_ac424/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hitachi_ac424/test.esp8266.yaml rename to tests/components/hitachi_ac424/test.esp8266-ard.yaml diff --git a/tests/components/hlw8012/test.esp32.yaml b/tests/components/hlw8012/test.esp32-ard.yaml similarity index 100% rename from tests/components/hlw8012/test.esp32.yaml rename to tests/components/hlw8012/test.esp32-ard.yaml diff --git a/tests/components/hlw8012/test.esp32-c3.yaml b/tests/components/hlw8012/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hlw8012/test.esp32-c3.yaml rename to tests/components/hlw8012/test.esp32-c3-ard.yaml diff --git a/tests/components/hlw8012/test.esp8266.yaml b/tests/components/hlw8012/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hlw8012/test.esp8266.yaml rename to tests/components/hlw8012/test.esp8266-ard.yaml diff --git a/tests/components/hlw8012/test.rp2040.yaml b/tests/components/hlw8012/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hlw8012/test.rp2040.yaml rename to tests/components/hlw8012/test.rp2040-ard.yaml diff --git a/tests/components/hm3301/test.esp32.yaml b/tests/components/hm3301/test.esp32-ard.yaml similarity index 100% rename from tests/components/hm3301/test.esp32.yaml rename to tests/components/hm3301/test.esp32-ard.yaml diff --git a/tests/components/hm3301/test.esp32-c3.yaml b/tests/components/hm3301/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hm3301/test.esp32-c3.yaml rename to tests/components/hm3301/test.esp32-c3-ard.yaml diff --git a/tests/components/hm3301/test.esp8266.yaml b/tests/components/hm3301/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hm3301/test.esp8266.yaml rename to tests/components/hm3301/test.esp8266-ard.yaml diff --git a/tests/components/hm3301/test.rp2040.yaml b/tests/components/hm3301/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hm3301/test.rp2040.yaml rename to tests/components/hm3301/test.rp2040-ard.yaml diff --git a/tests/components/hmc5883l/test.esp32.yaml b/tests/components/hmc5883l/test.esp32-ard.yaml similarity index 100% rename from tests/components/hmc5883l/test.esp32.yaml rename to tests/components/hmc5883l/test.esp32-ard.yaml diff --git a/tests/components/hmc5883l/test.esp32-c3.yaml b/tests/components/hmc5883l/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hmc5883l/test.esp32-c3.yaml rename to tests/components/hmc5883l/test.esp32-c3-ard.yaml diff --git a/tests/components/hmc5883l/test.esp8266.yaml b/tests/components/hmc5883l/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hmc5883l/test.esp8266.yaml rename to tests/components/hmc5883l/test.esp8266-ard.yaml diff --git a/tests/components/hmc5883l/test.rp2040.yaml b/tests/components/hmc5883l/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hmc5883l/test.rp2040.yaml rename to tests/components/hmc5883l/test.rp2040-ard.yaml diff --git a/tests/components/homeassistant/test.bk72xx.yaml b/tests/components/homeassistant/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.bk72xx.yaml rename to tests/components/homeassistant/test.bk72xx-ard.yaml diff --git a/tests/components/homeassistant/test.esp32-c3.yaml b/tests/components/homeassistant/test.esp32-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.esp32-c3.yaml rename to tests/components/homeassistant/test.esp32-ard.yaml diff --git a/tests/components/homeassistant/test.esp32.yaml b/tests/components/homeassistant/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.esp32.yaml rename to tests/components/homeassistant/test.esp32-c3-ard.yaml diff --git a/tests/components/homeassistant/test.esp8266.yaml b/tests/components/homeassistant/test.esp8266-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.esp8266.yaml rename to tests/components/homeassistant/test.esp8266-ard.yaml diff --git a/tests/components/homeassistant/test.rp2040.yaml b/tests/components/homeassistant/test.rp2040-ard.yaml similarity index 100% rename from tests/components/homeassistant/test.rp2040.yaml rename to tests/components/homeassistant/test.rp2040-ard.yaml diff --git a/tests/components/honeywell_hih_i2c/test.esp32.yaml b/tests/components/honeywell_hih_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/honeywell_hih_i2c/test.esp32.yaml rename to tests/components/honeywell_hih_i2c/test.esp32-ard.yaml diff --git a/tests/components/honeywell_hih_i2c/test.esp32-c3.yaml b/tests/components/honeywell_hih_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/honeywell_hih_i2c/test.esp32-c3.yaml rename to tests/components/honeywell_hih_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/honeywell_hih_i2c/test.esp8266.yaml b/tests/components/honeywell_hih_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/honeywell_hih_i2c/test.esp8266.yaml rename to tests/components/honeywell_hih_i2c/test.esp8266-ard.yaml diff --git a/tests/components/honeywell_hih_i2c/test.rp2040.yaml b/tests/components/honeywell_hih_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/honeywell_hih_i2c/test.rp2040.yaml rename to tests/components/honeywell_hih_i2c/test.rp2040-ard.yaml diff --git a/tests/components/honeywellabp/test.esp32.yaml b/tests/components/honeywellabp/test.esp32-ard.yaml similarity index 100% rename from tests/components/honeywellabp/test.esp32.yaml rename to tests/components/honeywellabp/test.esp32-ard.yaml diff --git a/tests/components/honeywellabp/test.esp32-c3.yaml b/tests/components/honeywellabp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/honeywellabp/test.esp32-c3.yaml rename to tests/components/honeywellabp/test.esp32-c3-ard.yaml diff --git a/tests/components/honeywellabp/test.esp8266.yaml b/tests/components/honeywellabp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/honeywellabp/test.esp8266.yaml rename to tests/components/honeywellabp/test.esp8266-ard.yaml diff --git a/tests/components/honeywellabp/test.rp2040.yaml b/tests/components/honeywellabp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/honeywellabp/test.rp2040.yaml rename to tests/components/honeywellabp/test.rp2040-ard.yaml diff --git a/tests/components/honeywellabp2_i2c/test.esp32.yaml b/tests/components/honeywellabp2_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/honeywellabp2_i2c/test.esp32.yaml rename to tests/components/honeywellabp2_i2c/test.esp32-ard.yaml diff --git a/tests/components/honeywellabp2_i2c/test.esp32-c3.yaml b/tests/components/honeywellabp2_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/honeywellabp2_i2c/test.esp32-c3.yaml rename to tests/components/honeywellabp2_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/honeywellabp2_i2c/test.esp8266.yaml b/tests/components/honeywellabp2_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/honeywellabp2_i2c/test.esp8266.yaml rename to tests/components/honeywellabp2_i2c/test.esp8266-ard.yaml diff --git a/tests/components/honeywellabp2_i2c/test.rp2040.yaml b/tests/components/honeywellabp2_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/honeywellabp2_i2c/test.rp2040.yaml rename to tests/components/honeywellabp2_i2c/test.rp2040-ard.yaml diff --git a/tests/components/hrxl_maxsonar_wr/test.esp32.yaml b/tests/components/hrxl_maxsonar_wr/test.esp32-ard.yaml similarity index 100% rename from tests/components/hrxl_maxsonar_wr/test.esp32.yaml rename to tests/components/hrxl_maxsonar_wr/test.esp32-ard.yaml diff --git a/tests/components/hrxl_maxsonar_wr/test.esp32-c3.yaml b/tests/components/hrxl_maxsonar_wr/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hrxl_maxsonar_wr/test.esp32-c3.yaml rename to tests/components/hrxl_maxsonar_wr/test.esp32-c3-ard.yaml diff --git a/tests/components/hrxl_maxsonar_wr/test.esp8266.yaml b/tests/components/hrxl_maxsonar_wr/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hrxl_maxsonar_wr/test.esp8266.yaml rename to tests/components/hrxl_maxsonar_wr/test.esp8266-ard.yaml diff --git a/tests/components/hrxl_maxsonar_wr/test.rp2040.yaml b/tests/components/hrxl_maxsonar_wr/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hrxl_maxsonar_wr/test.rp2040.yaml rename to tests/components/hrxl_maxsonar_wr/test.rp2040-ard.yaml diff --git a/tests/components/hte501/test.esp32.yaml b/tests/components/hte501/test.esp32-ard.yaml similarity index 100% rename from tests/components/hte501/test.esp32.yaml rename to tests/components/hte501/test.esp32-ard.yaml diff --git a/tests/components/hte501/test.esp32-c3.yaml b/tests/components/hte501/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hte501/test.esp32-c3.yaml rename to tests/components/hte501/test.esp32-c3-ard.yaml diff --git a/tests/components/hte501/test.esp8266.yaml b/tests/components/hte501/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hte501/test.esp8266.yaml rename to tests/components/hte501/test.esp8266-ard.yaml diff --git a/tests/components/hte501/test.rp2040.yaml b/tests/components/hte501/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hte501/test.rp2040.yaml rename to tests/components/hte501/test.rp2040-ard.yaml diff --git a/tests/components/http_request/test-nossl.esp8266.yaml b/tests/components/http_request/test-nossl.esp8266-ard.yaml similarity index 100% rename from tests/components/http_request/test-nossl.esp8266.yaml rename to tests/components/http_request/test-nossl.esp8266-ard.yaml diff --git a/tests/components/http_request/test.esp32-c3.yaml b/tests/components/http_request/test.esp32-ard.yaml similarity index 100% rename from tests/components/http_request/test.esp32-c3.yaml rename to tests/components/http_request/test.esp32-ard.yaml diff --git a/tests/components/http_request/test.esp32.yaml b/tests/components/http_request/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/http_request/test.esp32.yaml rename to tests/components/http_request/test.esp32-c3-ard.yaml diff --git a/tests/components/http_request/test.esp8266.yaml b/tests/components/http_request/test.esp8266-ard.yaml similarity index 100% rename from tests/components/http_request/test.esp8266.yaml rename to tests/components/http_request/test.esp8266-ard.yaml diff --git a/tests/components/http_request/test.rp2040.yaml b/tests/components/http_request/test.rp2040-ard.yaml similarity index 100% rename from tests/components/http_request/test.rp2040.yaml rename to tests/components/http_request/test.rp2040-ard.yaml diff --git a/tests/components/htu21d/test.esp32.yaml b/tests/components/htu21d/test.esp32-ard.yaml similarity index 100% rename from tests/components/htu21d/test.esp32.yaml rename to tests/components/htu21d/test.esp32-ard.yaml diff --git a/tests/components/htu21d/test.esp32-c3.yaml b/tests/components/htu21d/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/htu21d/test.esp32-c3.yaml rename to tests/components/htu21d/test.esp32-c3-ard.yaml diff --git a/tests/components/htu21d/test.esp8266.yaml b/tests/components/htu21d/test.esp8266-ard.yaml similarity index 100% rename from tests/components/htu21d/test.esp8266.yaml rename to tests/components/htu21d/test.esp8266-ard.yaml diff --git a/tests/components/htu21d/test.rp2040.yaml b/tests/components/htu21d/test.rp2040-ard.yaml similarity index 100% rename from tests/components/htu21d/test.rp2040.yaml rename to tests/components/htu21d/test.rp2040-ard.yaml diff --git a/tests/components/htu31d/test.esp32.yaml b/tests/components/htu31d/test.esp32-ard.yaml similarity index 100% rename from tests/components/htu31d/test.esp32.yaml rename to tests/components/htu31d/test.esp32-ard.yaml diff --git a/tests/components/htu31d/test.esp8266.yaml b/tests/components/htu31d/test.esp8266-ard.yaml similarity index 100% rename from tests/components/htu31d/test.esp8266.yaml rename to tests/components/htu31d/test.esp8266-ard.yaml diff --git a/tests/components/hx711/test.esp32.yaml b/tests/components/hx711/test.esp32-ard.yaml similarity index 100% rename from tests/components/hx711/test.esp32.yaml rename to tests/components/hx711/test.esp32-ard.yaml diff --git a/tests/components/hx711/test.esp32-c3.yaml b/tests/components/hx711/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hx711/test.esp32-c3.yaml rename to tests/components/hx711/test.esp32-c3-ard.yaml diff --git a/tests/components/hx711/test.esp8266.yaml b/tests/components/hx711/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hx711/test.esp8266.yaml rename to tests/components/hx711/test.esp8266-ard.yaml diff --git a/tests/components/hx711/test.rp2040.yaml b/tests/components/hx711/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hx711/test.rp2040.yaml rename to tests/components/hx711/test.rp2040-ard.yaml diff --git a/tests/components/hydreon_rgxx/test.esp32.yaml b/tests/components/hydreon_rgxx/test.esp32-ard.yaml similarity index 100% rename from tests/components/hydreon_rgxx/test.esp32.yaml rename to tests/components/hydreon_rgxx/test.esp32-ard.yaml diff --git a/tests/components/hydreon_rgxx/test.esp32-c3.yaml b/tests/components/hydreon_rgxx/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hydreon_rgxx/test.esp32-c3.yaml rename to tests/components/hydreon_rgxx/test.esp32-c3-ard.yaml diff --git a/tests/components/hydreon_rgxx/test.esp8266.yaml b/tests/components/hydreon_rgxx/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hydreon_rgxx/test.esp8266.yaml rename to tests/components/hydreon_rgxx/test.esp8266-ard.yaml diff --git a/tests/components/hydreon_rgxx/test.rp2040.yaml b/tests/components/hydreon_rgxx/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hydreon_rgxx/test.rp2040.yaml rename to tests/components/hydreon_rgxx/test.rp2040-ard.yaml diff --git a/tests/components/hyt271/test.esp32.yaml b/tests/components/hyt271/test.esp32-ard.yaml similarity index 100% rename from tests/components/hyt271/test.esp32.yaml rename to tests/components/hyt271/test.esp32-ard.yaml diff --git a/tests/components/hyt271/test.esp32-c3.yaml b/tests/components/hyt271/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/hyt271/test.esp32-c3.yaml rename to tests/components/hyt271/test.esp32-c3-ard.yaml diff --git a/tests/components/hyt271/test.esp8266.yaml b/tests/components/hyt271/test.esp8266-ard.yaml similarity index 100% rename from tests/components/hyt271/test.esp8266.yaml rename to tests/components/hyt271/test.esp8266-ard.yaml diff --git a/tests/components/hyt271/test.rp2040.yaml b/tests/components/hyt271/test.rp2040-ard.yaml similarity index 100% rename from tests/components/hyt271/test.rp2040.yaml rename to tests/components/hyt271/test.rp2040-ard.yaml diff --git a/tests/components/i2c/test.esp32.yaml b/tests/components/i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/i2c/test.esp32.yaml rename to tests/components/i2c/test.esp32-ard.yaml diff --git a/tests/components/i2c/test.esp32-c3.yaml b/tests/components/i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/i2c/test.esp32-c3.yaml rename to tests/components/i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/i2c/test.esp8266.yaml b/tests/components/i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/i2c/test.esp8266.yaml rename to tests/components/i2c/test.esp8266-ard.yaml diff --git a/tests/components/i2c/test.rp2040.yaml b/tests/components/i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/i2c/test.rp2040.yaml rename to tests/components/i2c/test.rp2040-ard.yaml diff --git a/tests/components/i2s_audio/test.esp32.yaml b/tests/components/i2s_audio/test.esp32-ard.yaml similarity index 100% rename from tests/components/i2s_audio/test.esp32.yaml rename to tests/components/i2s_audio/test.esp32-ard.yaml diff --git a/tests/components/i2s_audio/test.esp32-c3.yaml b/tests/components/i2s_audio/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/i2s_audio/test.esp32-c3.yaml rename to tests/components/i2s_audio/test.esp32-c3-ard.yaml diff --git a/tests/components/iaqcore/test.esp32.yaml b/tests/components/iaqcore/test.esp32-ard.yaml similarity index 100% rename from tests/components/iaqcore/test.esp32.yaml rename to tests/components/iaqcore/test.esp32-ard.yaml diff --git a/tests/components/iaqcore/test.esp32-c3.yaml b/tests/components/iaqcore/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/iaqcore/test.esp32-c3.yaml rename to tests/components/iaqcore/test.esp32-c3-ard.yaml diff --git a/tests/components/iaqcore/test.esp8266.yaml b/tests/components/iaqcore/test.esp8266-ard.yaml similarity index 100% rename from tests/components/iaqcore/test.esp8266.yaml rename to tests/components/iaqcore/test.esp8266-ard.yaml diff --git a/tests/components/iaqcore/test.rp2040.yaml b/tests/components/iaqcore/test.rp2040-ard.yaml similarity index 100% rename from tests/components/iaqcore/test.rp2040.yaml rename to tests/components/iaqcore/test.rp2040-ard.yaml diff --git a/tests/components/ili9xxx/test.esp32.yaml b/tests/components/ili9xxx/test.esp32-ard.yaml similarity index 100% rename from tests/components/ili9xxx/test.esp32.yaml rename to tests/components/ili9xxx/test.esp32-ard.yaml diff --git a/tests/components/ili9xxx/test.esp32-c3.yaml b/tests/components/ili9xxx/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ili9xxx/test.esp32-c3.yaml rename to tests/components/ili9xxx/test.esp32-c3-ard.yaml diff --git a/tests/components/ili9xxx/test.esp8266.yaml b/tests/components/ili9xxx/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ili9xxx/test.esp8266.yaml rename to tests/components/ili9xxx/test.esp8266-ard.yaml diff --git a/tests/components/ili9xxx/test.rp2040.yaml b/tests/components/ili9xxx/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ili9xxx/test.rp2040.yaml rename to tests/components/ili9xxx/test.rp2040-ard.yaml diff --git a/tests/components/image/test.esp32.yaml b/tests/components/image/test.esp32-ard.yaml similarity index 100% rename from tests/components/image/test.esp32.yaml rename to tests/components/image/test.esp32-ard.yaml diff --git a/tests/components/image/test.esp32-c3.yaml b/tests/components/image/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/image/test.esp32-c3.yaml rename to tests/components/image/test.esp32-c3-ard.yaml diff --git a/tests/components/image/test.esp8266.yaml b/tests/components/image/test.esp8266-ard.yaml similarity index 100% rename from tests/components/image/test.esp8266.yaml rename to tests/components/image/test.esp8266-ard.yaml diff --git a/tests/components/image/test.rp2040.yaml b/tests/components/image/test.rp2040-ard.yaml similarity index 100% rename from tests/components/image/test.rp2040.yaml rename to tests/components/image/test.rp2040-ard.yaml diff --git a/tests/components/improv_serial/test.esp32-c3.yaml b/tests/components/improv_serial/test.esp32-ard.yaml similarity index 100% rename from tests/components/improv_serial/test.esp32-c3.yaml rename to tests/components/improv_serial/test.esp32-ard.yaml diff --git a/tests/components/improv_serial/test.esp32.yaml b/tests/components/improv_serial/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/improv_serial/test.esp32.yaml rename to tests/components/improv_serial/test.esp32-c3-ard.yaml diff --git a/tests/components/improv_serial/test.esp8266.yaml b/tests/components/improv_serial/test.esp8266-ard.yaml similarity index 100% rename from tests/components/improv_serial/test.esp8266.yaml rename to tests/components/improv_serial/test.esp8266-ard.yaml diff --git a/tests/components/improv_serial/test.rp2040.yaml b/tests/components/improv_serial/test.rp2040-ard.yaml similarity index 100% rename from tests/components/improv_serial/test.rp2040.yaml rename to tests/components/improv_serial/test.rp2040-ard.yaml diff --git a/tests/components/ina219/test.esp32.yaml b/tests/components/ina219/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina219/test.esp32.yaml rename to tests/components/ina219/test.esp32-ard.yaml diff --git a/tests/components/ina219/test.esp32-c3.yaml b/tests/components/ina219/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina219/test.esp32-c3.yaml rename to tests/components/ina219/test.esp32-c3-ard.yaml diff --git a/tests/components/ina219/test.esp8266.yaml b/tests/components/ina219/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina219/test.esp8266.yaml rename to tests/components/ina219/test.esp8266-ard.yaml diff --git a/tests/components/ina219/test.rp2040.yaml b/tests/components/ina219/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina219/test.rp2040.yaml rename to tests/components/ina219/test.rp2040-ard.yaml diff --git a/tests/components/ina226/test.esp32.yaml b/tests/components/ina226/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina226/test.esp32.yaml rename to tests/components/ina226/test.esp32-ard.yaml diff --git a/tests/components/ina226/test.esp32-c3.yaml b/tests/components/ina226/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina226/test.esp32-c3.yaml rename to tests/components/ina226/test.esp32-c3-ard.yaml diff --git a/tests/components/ina226/test.esp8266.yaml b/tests/components/ina226/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina226/test.esp8266.yaml rename to tests/components/ina226/test.esp8266-ard.yaml diff --git a/tests/components/ina226/test.rp2040.yaml b/tests/components/ina226/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina226/test.rp2040.yaml rename to tests/components/ina226/test.rp2040-ard.yaml diff --git a/tests/components/ina260/test.esp32.yaml b/tests/components/ina260/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina260/test.esp32.yaml rename to tests/components/ina260/test.esp32-ard.yaml diff --git a/tests/components/ina260/test.esp32-c3.yaml b/tests/components/ina260/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina260/test.esp32-c3.yaml rename to tests/components/ina260/test.esp32-c3-ard.yaml diff --git a/tests/components/ina260/test.esp8266.yaml b/tests/components/ina260/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina260/test.esp8266.yaml rename to tests/components/ina260/test.esp8266-ard.yaml diff --git a/tests/components/ina260/test.rp2040.yaml b/tests/components/ina260/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina260/test.rp2040.yaml rename to tests/components/ina260/test.rp2040-ard.yaml diff --git a/tests/components/ina2xx_i2c/test.esp32.yaml b/tests/components/ina2xx_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina2xx_i2c/test.esp32.yaml rename to tests/components/ina2xx_i2c/test.esp32-ard.yaml diff --git a/tests/components/ina2xx_i2c/test.esp32-c3.yaml b/tests/components/ina2xx_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina2xx_i2c/test.esp32-c3.yaml rename to tests/components/ina2xx_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ina2xx_i2c/test.esp8266.yaml b/tests/components/ina2xx_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina2xx_i2c/test.esp8266.yaml rename to tests/components/ina2xx_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ina2xx_i2c/test.rp2040.yaml b/tests/components/ina2xx_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina2xx_i2c/test.rp2040.yaml rename to tests/components/ina2xx_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ina2xx_spi/test.esp32.yaml b/tests/components/ina2xx_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina2xx_spi/test.esp32.yaml rename to tests/components/ina2xx_spi/test.esp32-ard.yaml diff --git a/tests/components/ina2xx_spi/test.esp32-c3.yaml b/tests/components/ina2xx_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina2xx_spi/test.esp32-c3.yaml rename to tests/components/ina2xx_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ina2xx_spi/test.esp8266.yaml b/tests/components/ina2xx_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina2xx_spi/test.esp8266.yaml rename to tests/components/ina2xx_spi/test.esp8266-ard.yaml diff --git a/tests/components/ina2xx_spi/test.rp2040.yaml b/tests/components/ina2xx_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina2xx_spi/test.rp2040.yaml rename to tests/components/ina2xx_spi/test.rp2040-ard.yaml diff --git a/tests/components/ina3221/test.esp32.yaml b/tests/components/ina3221/test.esp32-ard.yaml similarity index 100% rename from tests/components/ina3221/test.esp32.yaml rename to tests/components/ina3221/test.esp32-ard.yaml diff --git a/tests/components/ina3221/test.esp32-c3.yaml b/tests/components/ina3221/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ina3221/test.esp32-c3.yaml rename to tests/components/ina3221/test.esp32-c3-ard.yaml diff --git a/tests/components/ina3221/test.esp8266.yaml b/tests/components/ina3221/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ina3221/test.esp8266.yaml rename to tests/components/ina3221/test.esp8266-ard.yaml diff --git a/tests/components/ina3221/test.rp2040.yaml b/tests/components/ina3221/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ina3221/test.rp2040.yaml rename to tests/components/ina3221/test.rp2040-ard.yaml diff --git a/tests/components/inkbird_ibsth1_mini/test.esp32-c3.yaml b/tests/components/inkbird_ibsth1_mini/test.esp32-ard.yaml similarity index 100% rename from tests/components/inkbird_ibsth1_mini/test.esp32-c3.yaml rename to tests/components/inkbird_ibsth1_mini/test.esp32-ard.yaml diff --git a/tests/components/inkbird_ibsth1_mini/test.esp32.yaml b/tests/components/inkbird_ibsth1_mini/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/inkbird_ibsth1_mini/test.esp32.yaml rename to tests/components/inkbird_ibsth1_mini/test.esp32-c3-ard.yaml diff --git a/tests/components/inkplate6/test.esp32.yaml b/tests/components/inkplate6/test.esp32-ard.yaml similarity index 100% rename from tests/components/inkplate6/test.esp32.yaml rename to tests/components/inkplate6/test.esp32-ard.yaml diff --git a/tests/components/integration/test.esp32.yaml b/tests/components/integration/test.esp32-ard.yaml similarity index 100% rename from tests/components/integration/test.esp32.yaml rename to tests/components/integration/test.esp32-ard.yaml diff --git a/tests/components/integration/test.esp32-c3.yaml b/tests/components/integration/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/integration/test.esp32-c3.yaml rename to tests/components/integration/test.esp32-c3-ard.yaml diff --git a/tests/components/integration/test.esp32-s2.yaml b/tests/components/integration/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/integration/test.esp32-s2.yaml rename to tests/components/integration/test.esp32-s2-ard.yaml diff --git a/tests/components/integration/test.esp32-s3.yaml b/tests/components/integration/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/integration/test.esp32-s3.yaml rename to tests/components/integration/test.esp32-s3-ard.yaml diff --git a/tests/components/integration/test.esp8266.yaml b/tests/components/integration/test.esp8266-ard.yaml similarity index 100% rename from tests/components/integration/test.esp8266.yaml rename to tests/components/integration/test.esp8266-ard.yaml diff --git a/tests/components/integration/test.rp2040.yaml b/tests/components/integration/test.rp2040-ard.yaml similarity index 100% rename from tests/components/integration/test.rp2040.yaml rename to tests/components/integration/test.rp2040-ard.yaml diff --git a/tests/components/internal_temperature/test.bk72xx.yaml b/tests/components/internal_temperature/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.bk72xx.yaml rename to tests/components/internal_temperature/test.bk72xx-ard.yaml diff --git a/tests/components/internal_temperature/test.esp32-c3.yaml b/tests/components/internal_temperature/test.esp32-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.esp32-c3.yaml rename to tests/components/internal_temperature/test.esp32-ard.yaml diff --git a/tests/components/internal_temperature/test.esp32-s2.yaml b/tests/components/internal_temperature/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.esp32-s2.yaml rename to tests/components/internal_temperature/test.esp32-c3-ard.yaml diff --git a/tests/components/internal_temperature/test.esp32.yaml b/tests/components/internal_temperature/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.esp32.yaml rename to tests/components/internal_temperature/test.esp32-s2-ard.yaml diff --git a/tests/components/internal_temperature/test.esp32-s3.yaml b/tests/components/internal_temperature/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.esp32-s3.yaml rename to tests/components/internal_temperature/test.esp32-s3-ard.yaml diff --git a/tests/components/internal_temperature/test.rp2040.yaml b/tests/components/internal_temperature/test.rp2040-ard.yaml similarity index 100% rename from tests/components/internal_temperature/test.rp2040.yaml rename to tests/components/internal_temperature/test.rp2040-ard.yaml diff --git a/tests/components/interval/test.esp32-c3.yaml b/tests/components/interval/test.esp32-ard.yaml similarity index 100% rename from tests/components/interval/test.esp32-c3.yaml rename to tests/components/interval/test.esp32-ard.yaml diff --git a/tests/components/interval/test.esp32.yaml b/tests/components/interval/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/interval/test.esp32.yaml rename to tests/components/interval/test.esp32-c3-ard.yaml diff --git a/tests/components/interval/test.esp8266.yaml b/tests/components/interval/test.esp8266-ard.yaml similarity index 100% rename from tests/components/interval/test.esp8266.yaml rename to tests/components/interval/test.esp8266-ard.yaml diff --git a/tests/components/interval/test.rp2040.yaml b/tests/components/interval/test.rp2040-ard.yaml similarity index 100% rename from tests/components/interval/test.rp2040.yaml rename to tests/components/interval/test.rp2040-ard.yaml diff --git a/tests/components/jsn_sr04t/test.esp32.yaml b/tests/components/jsn_sr04t/test.esp32-ard.yaml similarity index 100% rename from tests/components/jsn_sr04t/test.esp32.yaml rename to tests/components/jsn_sr04t/test.esp32-ard.yaml diff --git a/tests/components/jsn_sr04t/test.esp32-c3.yaml b/tests/components/jsn_sr04t/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/jsn_sr04t/test.esp32-c3.yaml rename to tests/components/jsn_sr04t/test.esp32-c3-ard.yaml diff --git a/tests/components/jsn_sr04t/test.esp8266.yaml b/tests/components/jsn_sr04t/test.esp8266-ard.yaml similarity index 100% rename from tests/components/jsn_sr04t/test.esp8266.yaml rename to tests/components/jsn_sr04t/test.esp8266-ard.yaml diff --git a/tests/components/jsn_sr04t/test.rp2040.yaml b/tests/components/jsn_sr04t/test.rp2040-ard.yaml similarity index 100% rename from tests/components/jsn_sr04t/test.rp2040.yaml rename to tests/components/jsn_sr04t/test.rp2040-ard.yaml diff --git a/tests/components/kamstrup_kmp/test.esp32.yaml b/tests/components/kamstrup_kmp/test.esp32-ard.yaml similarity index 100% rename from tests/components/kamstrup_kmp/test.esp32.yaml rename to tests/components/kamstrup_kmp/test.esp32-ard.yaml diff --git a/tests/components/kamstrup_kmp/test.esp8266.yaml b/tests/components/kamstrup_kmp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/kamstrup_kmp/test.esp8266.yaml rename to tests/components/kamstrup_kmp/test.esp8266-ard.yaml diff --git a/tests/components/key_collector/test.esp32.yaml b/tests/components/key_collector/test.esp32-ard.yaml similarity index 100% rename from tests/components/key_collector/test.esp32.yaml rename to tests/components/key_collector/test.esp32-ard.yaml diff --git a/tests/components/key_collector/test.esp32-c3.yaml b/tests/components/key_collector/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/key_collector/test.esp32-c3.yaml rename to tests/components/key_collector/test.esp32-c3-ard.yaml diff --git a/tests/components/key_collector/test.esp8266.yaml b/tests/components/key_collector/test.esp8266-ard.yaml similarity index 100% rename from tests/components/key_collector/test.esp8266.yaml rename to tests/components/key_collector/test.esp8266-ard.yaml diff --git a/tests/components/key_collector/test.rp2040.yaml b/tests/components/key_collector/test.rp2040-ard.yaml similarity index 100% rename from tests/components/key_collector/test.rp2040.yaml rename to tests/components/key_collector/test.rp2040-ard.yaml diff --git a/tests/components/kmeteriso/test.esp32.yaml b/tests/components/kmeteriso/test.esp32-ard.yaml similarity index 100% rename from tests/components/kmeteriso/test.esp32.yaml rename to tests/components/kmeteriso/test.esp32-ard.yaml diff --git a/tests/components/kmeteriso/test.esp32-c3.yaml b/tests/components/kmeteriso/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/kmeteriso/test.esp32-c3.yaml rename to tests/components/kmeteriso/test.esp32-c3-ard.yaml diff --git a/tests/components/kmeteriso/test.esp8266.yaml b/tests/components/kmeteriso/test.esp8266-ard.yaml similarity index 100% rename from tests/components/kmeteriso/test.esp8266.yaml rename to tests/components/kmeteriso/test.esp8266-ard.yaml diff --git a/tests/components/kmeteriso/test.rp2040.yaml b/tests/components/kmeteriso/test.rp2040-ard.yaml similarity index 100% rename from tests/components/kmeteriso/test.rp2040.yaml rename to tests/components/kmeteriso/test.rp2040-ard.yaml diff --git a/tests/components/kuntze/test.esp32.yaml b/tests/components/kuntze/test.esp32-ard.yaml similarity index 100% rename from tests/components/kuntze/test.esp32.yaml rename to tests/components/kuntze/test.esp32-ard.yaml diff --git a/tests/components/kuntze/test.esp32-c3.yaml b/tests/components/kuntze/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/kuntze/test.esp32-c3.yaml rename to tests/components/kuntze/test.esp32-c3-ard.yaml diff --git a/tests/components/kuntze/test.esp8266.yaml b/tests/components/kuntze/test.esp8266-ard.yaml similarity index 100% rename from tests/components/kuntze/test.esp8266.yaml rename to tests/components/kuntze/test.esp8266-ard.yaml diff --git a/tests/components/kuntze/test.rp2040.yaml b/tests/components/kuntze/test.rp2040-ard.yaml similarity index 100% rename from tests/components/kuntze/test.rp2040.yaml rename to tests/components/kuntze/test.rp2040-ard.yaml diff --git a/tests/components/lcd_gpio/test.esp32.yaml b/tests/components/lcd_gpio/test.esp32-ard.yaml similarity index 100% rename from tests/components/lcd_gpio/test.esp32.yaml rename to tests/components/lcd_gpio/test.esp32-ard.yaml diff --git a/tests/components/lcd_gpio/test.esp32-c3.yaml b/tests/components/lcd_gpio/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lcd_gpio/test.esp32-c3.yaml rename to tests/components/lcd_gpio/test.esp32-c3-ard.yaml diff --git a/tests/components/lcd_gpio/test.esp8266.yaml b/tests/components/lcd_gpio/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lcd_gpio/test.esp8266.yaml rename to tests/components/lcd_gpio/test.esp8266-ard.yaml diff --git a/tests/components/lcd_gpio/test.rp2040.yaml b/tests/components/lcd_gpio/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lcd_gpio/test.rp2040.yaml rename to tests/components/lcd_gpio/test.rp2040-ard.yaml diff --git a/tests/components/lcd_menu/test.esp32.yaml b/tests/components/lcd_menu/test.esp32-ard.yaml similarity index 100% rename from tests/components/lcd_menu/test.esp32.yaml rename to tests/components/lcd_menu/test.esp32-ard.yaml diff --git a/tests/components/lcd_menu/test.esp32-c3.yaml b/tests/components/lcd_menu/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lcd_menu/test.esp32-c3.yaml rename to tests/components/lcd_menu/test.esp32-c3-ard.yaml diff --git a/tests/components/lcd_menu/test.esp8266.yaml b/tests/components/lcd_menu/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lcd_menu/test.esp8266.yaml rename to tests/components/lcd_menu/test.esp8266-ard.yaml diff --git a/tests/components/lcd_menu/test.rp2040.yaml b/tests/components/lcd_menu/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lcd_menu/test.rp2040.yaml rename to tests/components/lcd_menu/test.rp2040-ard.yaml diff --git a/tests/components/lcd_pcf8574/test.esp32.yaml b/tests/components/lcd_pcf8574/test.esp32-ard.yaml similarity index 100% rename from tests/components/lcd_pcf8574/test.esp32.yaml rename to tests/components/lcd_pcf8574/test.esp32-ard.yaml diff --git a/tests/components/lcd_pcf8574/test.esp32-c3.yaml b/tests/components/lcd_pcf8574/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lcd_pcf8574/test.esp32-c3.yaml rename to tests/components/lcd_pcf8574/test.esp32-c3-ard.yaml diff --git a/tests/components/lcd_pcf8574/test.esp8266.yaml b/tests/components/lcd_pcf8574/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lcd_pcf8574/test.esp8266.yaml rename to tests/components/lcd_pcf8574/test.esp8266-ard.yaml diff --git a/tests/components/lcd_pcf8574/test.rp2040.yaml b/tests/components/lcd_pcf8574/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lcd_pcf8574/test.rp2040.yaml rename to tests/components/lcd_pcf8574/test.rp2040-ard.yaml diff --git a/tests/components/ld2410/test.esp32.yaml b/tests/components/ld2410/test.esp32-ard.yaml similarity index 100% rename from tests/components/ld2410/test.esp32.yaml rename to tests/components/ld2410/test.esp32-ard.yaml diff --git a/tests/components/ld2410/test.esp32-c3.yaml b/tests/components/ld2410/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ld2410/test.esp32-c3.yaml rename to tests/components/ld2410/test.esp32-c3-ard.yaml diff --git a/tests/components/ld2410/test.esp8266.yaml b/tests/components/ld2410/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ld2410/test.esp8266.yaml rename to tests/components/ld2410/test.esp8266-ard.yaml diff --git a/tests/components/ld2410/test.rp2040.yaml b/tests/components/ld2410/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ld2410/test.rp2040.yaml rename to tests/components/ld2410/test.rp2040-ard.yaml diff --git a/tests/components/ld2420/test.esp32.yaml b/tests/components/ld2420/test.esp32-ard.yaml similarity index 100% rename from tests/components/ld2420/test.esp32.yaml rename to tests/components/ld2420/test.esp32-ard.yaml diff --git a/tests/components/ld2420/test.esp32-c3.yaml b/tests/components/ld2420/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ld2420/test.esp32-c3.yaml rename to tests/components/ld2420/test.esp32-c3-ard.yaml diff --git a/tests/components/ld2420/test.esp8266.yaml b/tests/components/ld2420/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ld2420/test.esp8266.yaml rename to tests/components/ld2420/test.esp8266-ard.yaml diff --git a/tests/components/ld2420/test.rp2040.yaml b/tests/components/ld2420/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ld2420/test.rp2040.yaml rename to tests/components/ld2420/test.rp2040-ard.yaml diff --git a/tests/components/ledc/test.esp32-c3.yaml b/tests/components/ledc/test.esp32-ard.yaml similarity index 100% rename from tests/components/ledc/test.esp32-c3.yaml rename to tests/components/ledc/test.esp32-ard.yaml diff --git a/tests/components/ledc/test.esp32.yaml b/tests/components/ledc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ledc/test.esp32.yaml rename to tests/components/ledc/test.esp32-c3-ard.yaml diff --git a/tests/components/light/test.esp32.yaml b/tests/components/light/test.esp32-ard.yaml similarity index 100% rename from tests/components/light/test.esp32.yaml rename to tests/components/light/test.esp32-ard.yaml diff --git a/tests/components/light/test.esp32-c3.yaml b/tests/components/light/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/light/test.esp32-c3.yaml rename to tests/components/light/test.esp32-c3-ard.yaml diff --git a/tests/components/light/test.esp8266.yaml b/tests/components/light/test.esp8266-ard.yaml similarity index 100% rename from tests/components/light/test.esp8266.yaml rename to tests/components/light/test.esp8266-ard.yaml diff --git a/tests/components/light/test.rp2040.yaml b/tests/components/light/test.rp2040-ard.yaml similarity index 100% rename from tests/components/light/test.rp2040.yaml rename to tests/components/light/test.rp2040-ard.yaml diff --git a/tests/components/lightwaverf/test.esp8266.yaml b/tests/components/lightwaverf/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lightwaverf/test.esp8266.yaml rename to tests/components/lightwaverf/test.esp8266-ard.yaml diff --git a/tests/components/lilygo_t5_47/test.esp32.yaml b/tests/components/lilygo_t5_47/test.esp32-ard.yaml similarity index 100% rename from tests/components/lilygo_t5_47/test.esp32.yaml rename to tests/components/lilygo_t5_47/test.esp32-ard.yaml diff --git a/tests/components/lilygo_t5_47/test.esp32-c3.yaml b/tests/components/lilygo_t5_47/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lilygo_t5_47/test.esp32-c3.yaml rename to tests/components/lilygo_t5_47/test.esp32-c3-ard.yaml diff --git a/tests/components/lilygo_t5_47/test.esp8266.yaml b/tests/components/lilygo_t5_47/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lilygo_t5_47/test.esp8266.yaml rename to tests/components/lilygo_t5_47/test.esp8266-ard.yaml diff --git a/tests/components/lilygo_t5_47/test.rp2040.yaml b/tests/components/lilygo_t5_47/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lilygo_t5_47/test.rp2040.yaml rename to tests/components/lilygo_t5_47/test.rp2040-ard.yaml diff --git a/tests/components/lock/test.esp32-c3.yaml b/tests/components/lock/test.esp32-ard.yaml similarity index 100% rename from tests/components/lock/test.esp32-c3.yaml rename to tests/components/lock/test.esp32-ard.yaml diff --git a/tests/components/lock/test.esp32.yaml b/tests/components/lock/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/lock/test.esp32.yaml rename to tests/components/lock/test.esp32-c3-ard.yaml diff --git a/tests/components/lock/test.esp8266.yaml b/tests/components/lock/test.esp8266-ard.yaml similarity index 100% rename from tests/components/lock/test.esp8266.yaml rename to tests/components/lock/test.esp8266-ard.yaml diff --git a/tests/components/lock/test.rp2040.yaml b/tests/components/lock/test.rp2040-ard.yaml similarity index 100% rename from tests/components/lock/test.rp2040.yaml rename to tests/components/lock/test.rp2040-ard.yaml diff --git a/tests/components/logger/test.esp32-c3.yaml b/tests/components/logger/test.esp32-ard.yaml similarity index 100% rename from tests/components/logger/test.esp32-c3.yaml rename to tests/components/logger/test.esp32-ard.yaml diff --git a/tests/components/logger/test.esp32.yaml b/tests/components/logger/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/logger/test.esp32.yaml rename to tests/components/logger/test.esp32-c3-ard.yaml diff --git a/tests/components/logger/test.esp8266.yaml b/tests/components/logger/test.esp8266-ard.yaml similarity index 100% rename from tests/components/logger/test.esp8266.yaml rename to tests/components/logger/test.esp8266-ard.yaml diff --git a/tests/components/logger/test.rp2040.yaml b/tests/components/logger/test.rp2040-ard.yaml similarity index 100% rename from tests/components/logger/test.rp2040.yaml rename to tests/components/logger/test.rp2040-ard.yaml diff --git a/tests/components/ltr390/test.esp32.yaml b/tests/components/ltr390/test.esp32-ard.yaml similarity index 100% rename from tests/components/ltr390/test.esp32.yaml rename to tests/components/ltr390/test.esp32-ard.yaml diff --git a/tests/components/ltr390/test.esp32-c3.yaml b/tests/components/ltr390/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ltr390/test.esp32-c3.yaml rename to tests/components/ltr390/test.esp32-c3-ard.yaml diff --git a/tests/components/ltr390/test.esp8266.yaml b/tests/components/ltr390/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ltr390/test.esp8266.yaml rename to tests/components/ltr390/test.esp8266-ard.yaml diff --git a/tests/components/ltr390/test.rp2040.yaml b/tests/components/ltr390/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ltr390/test.rp2040.yaml rename to tests/components/ltr390/test.rp2040-ard.yaml diff --git a/tests/components/ltr_als_ps/test.esp32.yaml b/tests/components/ltr_als_ps/test.esp32-ard.yaml similarity index 100% rename from tests/components/ltr_als_ps/test.esp32.yaml rename to tests/components/ltr_als_ps/test.esp32-ard.yaml diff --git a/tests/components/ltr_als_ps/test.esp32-c3.yaml b/tests/components/ltr_als_ps/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ltr_als_ps/test.esp32-c3.yaml rename to tests/components/ltr_als_ps/test.esp32-c3-ard.yaml diff --git a/tests/components/ltr_als_ps/test.esp8266.yaml b/tests/components/ltr_als_ps/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ltr_als_ps/test.esp8266.yaml rename to tests/components/ltr_als_ps/test.esp8266-ard.yaml diff --git a/tests/components/ltr_als_ps/test.rp2040.yaml b/tests/components/ltr_als_ps/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ltr_als_ps/test.rp2040.yaml rename to tests/components/ltr_als_ps/test.rp2040-ard.yaml diff --git a/tests/components/matrix_keypad/test.esp32.yaml b/tests/components/matrix_keypad/test.esp32-ard.yaml similarity index 100% rename from tests/components/matrix_keypad/test.esp32.yaml rename to tests/components/matrix_keypad/test.esp32-ard.yaml diff --git a/tests/components/matrix_keypad/test.esp32-c3.yaml b/tests/components/matrix_keypad/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/matrix_keypad/test.esp32-c3.yaml rename to tests/components/matrix_keypad/test.esp32-c3-ard.yaml diff --git a/tests/components/matrix_keypad/test.esp8266.yaml b/tests/components/matrix_keypad/test.esp8266-ard.yaml similarity index 100% rename from tests/components/matrix_keypad/test.esp8266.yaml rename to tests/components/matrix_keypad/test.esp8266-ard.yaml diff --git a/tests/components/matrix_keypad/test.rp2040.yaml b/tests/components/matrix_keypad/test.rp2040-ard.yaml similarity index 100% rename from tests/components/matrix_keypad/test.rp2040.yaml rename to tests/components/matrix_keypad/test.rp2040-ard.yaml diff --git a/tests/components/max31855/test.esp32.yaml b/tests/components/max31855/test.esp32-ard.yaml similarity index 100% rename from tests/components/max31855/test.esp32.yaml rename to tests/components/max31855/test.esp32-ard.yaml diff --git a/tests/components/max31855/test.esp32-c3.yaml b/tests/components/max31855/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max31855/test.esp32-c3.yaml rename to tests/components/max31855/test.esp32-c3-ard.yaml diff --git a/tests/components/max31855/test.esp8266.yaml b/tests/components/max31855/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max31855/test.esp8266.yaml rename to tests/components/max31855/test.esp8266-ard.yaml diff --git a/tests/components/max31855/test.rp2040.yaml b/tests/components/max31855/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max31855/test.rp2040.yaml rename to tests/components/max31855/test.rp2040-ard.yaml diff --git a/tests/components/max31856/test.esp32.yaml b/tests/components/max31856/test.esp32-ard.yaml similarity index 100% rename from tests/components/max31856/test.esp32.yaml rename to tests/components/max31856/test.esp32-ard.yaml diff --git a/tests/components/max31856/test.esp32-c3.yaml b/tests/components/max31856/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max31856/test.esp32-c3.yaml rename to tests/components/max31856/test.esp32-c3-ard.yaml diff --git a/tests/components/max31856/test.esp8266.yaml b/tests/components/max31856/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max31856/test.esp8266.yaml rename to tests/components/max31856/test.esp8266-ard.yaml diff --git a/tests/components/max31856/test.rp2040.yaml b/tests/components/max31856/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max31856/test.rp2040.yaml rename to tests/components/max31856/test.rp2040-ard.yaml diff --git a/tests/components/max31865/test.esp32.yaml b/tests/components/max31865/test.esp32-ard.yaml similarity index 100% rename from tests/components/max31865/test.esp32.yaml rename to tests/components/max31865/test.esp32-ard.yaml diff --git a/tests/components/max31865/test.esp32-c3.yaml b/tests/components/max31865/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max31865/test.esp32-c3.yaml rename to tests/components/max31865/test.esp32-c3-ard.yaml diff --git a/tests/components/max31865/test.esp8266.yaml b/tests/components/max31865/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max31865/test.esp8266.yaml rename to tests/components/max31865/test.esp8266-ard.yaml diff --git a/tests/components/max31865/test.rp2040.yaml b/tests/components/max31865/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max31865/test.rp2040.yaml rename to tests/components/max31865/test.rp2040-ard.yaml diff --git a/tests/components/max44009/test.esp32.yaml b/tests/components/max44009/test.esp32-ard.yaml similarity index 100% rename from tests/components/max44009/test.esp32.yaml rename to tests/components/max44009/test.esp32-ard.yaml diff --git a/tests/components/max44009/test.esp32-c3.yaml b/tests/components/max44009/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max44009/test.esp32-c3.yaml rename to tests/components/max44009/test.esp32-c3-ard.yaml diff --git a/tests/components/max44009/test.esp8266.yaml b/tests/components/max44009/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max44009/test.esp8266.yaml rename to tests/components/max44009/test.esp8266-ard.yaml diff --git a/tests/components/max44009/test.rp2040.yaml b/tests/components/max44009/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max44009/test.rp2040.yaml rename to tests/components/max44009/test.rp2040-ard.yaml diff --git a/tests/components/max6675/test.esp32.yaml b/tests/components/max6675/test.esp32-ard.yaml similarity index 100% rename from tests/components/max6675/test.esp32.yaml rename to tests/components/max6675/test.esp32-ard.yaml diff --git a/tests/components/max6675/test.esp32-c3.yaml b/tests/components/max6675/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max6675/test.esp32-c3.yaml rename to tests/components/max6675/test.esp32-c3-ard.yaml diff --git a/tests/components/max6675/test.esp8266.yaml b/tests/components/max6675/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max6675/test.esp8266.yaml rename to tests/components/max6675/test.esp8266-ard.yaml diff --git a/tests/components/max6675/test.rp2040.yaml b/tests/components/max6675/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max6675/test.rp2040.yaml rename to tests/components/max6675/test.rp2040-ard.yaml diff --git a/tests/components/max6956/test.esp32.yaml b/tests/components/max6956/test.esp32-ard.yaml similarity index 100% rename from tests/components/max6956/test.esp32.yaml rename to tests/components/max6956/test.esp32-ard.yaml diff --git a/tests/components/max6956/test.esp32-c3.yaml b/tests/components/max6956/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max6956/test.esp32-c3.yaml rename to tests/components/max6956/test.esp32-c3-ard.yaml diff --git a/tests/components/max6956/test.esp8266.yaml b/tests/components/max6956/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max6956/test.esp8266.yaml rename to tests/components/max6956/test.esp8266-ard.yaml diff --git a/tests/components/max6956/test.rp2040.yaml b/tests/components/max6956/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max6956/test.rp2040.yaml rename to tests/components/max6956/test.rp2040-ard.yaml diff --git a/tests/components/max7219/test.esp32.yaml b/tests/components/max7219/test.esp32-ard.yaml similarity index 100% rename from tests/components/max7219/test.esp32.yaml rename to tests/components/max7219/test.esp32-ard.yaml diff --git a/tests/components/max7219/test.esp32-c3.yaml b/tests/components/max7219/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max7219/test.esp32-c3.yaml rename to tests/components/max7219/test.esp32-c3-ard.yaml diff --git a/tests/components/max7219/test.esp8266.yaml b/tests/components/max7219/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max7219/test.esp8266.yaml rename to tests/components/max7219/test.esp8266-ard.yaml diff --git a/tests/components/max7219/test.rp2040.yaml b/tests/components/max7219/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max7219/test.rp2040.yaml rename to tests/components/max7219/test.rp2040-ard.yaml diff --git a/tests/components/max7219digit/test.esp32.yaml b/tests/components/max7219digit/test.esp32-ard.yaml similarity index 100% rename from tests/components/max7219digit/test.esp32.yaml rename to tests/components/max7219digit/test.esp32-ard.yaml diff --git a/tests/components/max7219digit/test.esp32-c3.yaml b/tests/components/max7219digit/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max7219digit/test.esp32-c3.yaml rename to tests/components/max7219digit/test.esp32-c3-ard.yaml diff --git a/tests/components/max7219digit/test.esp8266.yaml b/tests/components/max7219digit/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max7219digit/test.esp8266.yaml rename to tests/components/max7219digit/test.esp8266-ard.yaml diff --git a/tests/components/max7219digit/test.rp2040.yaml b/tests/components/max7219digit/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max7219digit/test.rp2040.yaml rename to tests/components/max7219digit/test.rp2040-ard.yaml diff --git a/tests/components/max9611/test.esp32.yaml b/tests/components/max9611/test.esp32-ard.yaml similarity index 100% rename from tests/components/max9611/test.esp32.yaml rename to tests/components/max9611/test.esp32-ard.yaml diff --git a/tests/components/max9611/test.esp32-c3.yaml b/tests/components/max9611/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/max9611/test.esp32-c3.yaml rename to tests/components/max9611/test.esp32-c3-ard.yaml diff --git a/tests/components/max9611/test.esp8266.yaml b/tests/components/max9611/test.esp8266-ard.yaml similarity index 100% rename from tests/components/max9611/test.esp8266.yaml rename to tests/components/max9611/test.esp8266-ard.yaml diff --git a/tests/components/max9611/test.rp2040.yaml b/tests/components/max9611/test.rp2040-ard.yaml similarity index 100% rename from tests/components/max9611/test.rp2040.yaml rename to tests/components/max9611/test.rp2040-ard.yaml diff --git a/tests/components/mcp23008/test.esp32.yaml b/tests/components/mcp23008/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23008/test.esp32.yaml rename to tests/components/mcp23008/test.esp32-ard.yaml diff --git a/tests/components/mcp23008/test.esp32-c3.yaml b/tests/components/mcp23008/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23008/test.esp32-c3.yaml rename to tests/components/mcp23008/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23008/test.esp8266.yaml b/tests/components/mcp23008/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23008/test.esp8266.yaml rename to tests/components/mcp23008/test.esp8266-ard.yaml diff --git a/tests/components/mcp23008/test.rp2040.yaml b/tests/components/mcp23008/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23008/test.rp2040.yaml rename to tests/components/mcp23008/test.rp2040-ard.yaml diff --git a/tests/components/mcp23016/test.esp32.yaml b/tests/components/mcp23016/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23016/test.esp32.yaml rename to tests/components/mcp23016/test.esp32-ard.yaml diff --git a/tests/components/mcp23016/test.esp32-c3.yaml b/tests/components/mcp23016/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23016/test.esp32-c3.yaml rename to tests/components/mcp23016/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23016/test.esp8266.yaml b/tests/components/mcp23016/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23016/test.esp8266.yaml rename to tests/components/mcp23016/test.esp8266-ard.yaml diff --git a/tests/components/mcp23016/test.rp2040.yaml b/tests/components/mcp23016/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23016/test.rp2040.yaml rename to tests/components/mcp23016/test.rp2040-ard.yaml diff --git a/tests/components/mcp23017/test.esp32.yaml b/tests/components/mcp23017/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23017/test.esp32.yaml rename to tests/components/mcp23017/test.esp32-ard.yaml diff --git a/tests/components/mcp23017/test.esp32-c3.yaml b/tests/components/mcp23017/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23017/test.esp32-c3.yaml rename to tests/components/mcp23017/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23017/test.esp8266.yaml b/tests/components/mcp23017/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23017/test.esp8266.yaml rename to tests/components/mcp23017/test.esp8266-ard.yaml diff --git a/tests/components/mcp23017/test.rp2040.yaml b/tests/components/mcp23017/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23017/test.rp2040.yaml rename to tests/components/mcp23017/test.rp2040-ard.yaml diff --git a/tests/components/mcp23s08/test.esp32.yaml b/tests/components/mcp23s08/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23s08/test.esp32.yaml rename to tests/components/mcp23s08/test.esp32-ard.yaml diff --git a/tests/components/mcp23s08/test.esp32-c3.yaml b/tests/components/mcp23s08/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23s08/test.esp32-c3.yaml rename to tests/components/mcp23s08/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23s08/test.esp8266.yaml b/tests/components/mcp23s08/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23s08/test.esp8266.yaml rename to tests/components/mcp23s08/test.esp8266-ard.yaml diff --git a/tests/components/mcp23s08/test.rp2040.yaml b/tests/components/mcp23s08/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23s08/test.rp2040.yaml rename to tests/components/mcp23s08/test.rp2040-ard.yaml diff --git a/tests/components/mcp23s17/test.esp32.yaml b/tests/components/mcp23s17/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp23s17/test.esp32.yaml rename to tests/components/mcp23s17/test.esp32-ard.yaml diff --git a/tests/components/mcp23s17/test.esp32-c3.yaml b/tests/components/mcp23s17/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp23s17/test.esp32-c3.yaml rename to tests/components/mcp23s17/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp23s17/test.esp8266.yaml b/tests/components/mcp23s17/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp23s17/test.esp8266.yaml rename to tests/components/mcp23s17/test.esp8266-ard.yaml diff --git a/tests/components/mcp23s17/test.rp2040.yaml b/tests/components/mcp23s17/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp23s17/test.rp2040.yaml rename to tests/components/mcp23s17/test.rp2040-ard.yaml diff --git a/tests/components/mcp2515/test.esp32.yaml b/tests/components/mcp2515/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp2515/test.esp32.yaml rename to tests/components/mcp2515/test.esp32-ard.yaml diff --git a/tests/components/mcp2515/test.esp32-c3.yaml b/tests/components/mcp2515/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp2515/test.esp32-c3.yaml rename to tests/components/mcp2515/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp2515/test.esp8266.yaml b/tests/components/mcp2515/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp2515/test.esp8266.yaml rename to tests/components/mcp2515/test.esp8266-ard.yaml diff --git a/tests/components/mcp2515/test.rp2040.yaml b/tests/components/mcp2515/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp2515/test.rp2040.yaml rename to tests/components/mcp2515/test.rp2040-ard.yaml diff --git a/tests/components/mcp3008/test.esp32.yaml b/tests/components/mcp3008/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp3008/test.esp32.yaml rename to tests/components/mcp3008/test.esp32-ard.yaml diff --git a/tests/components/mcp3008/test.esp32-c3.yaml b/tests/components/mcp3008/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp3008/test.esp32-c3.yaml rename to tests/components/mcp3008/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp3008/test.esp8266.yaml b/tests/components/mcp3008/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp3008/test.esp8266.yaml rename to tests/components/mcp3008/test.esp8266-ard.yaml diff --git a/tests/components/mcp3008/test.rp2040.yaml b/tests/components/mcp3008/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp3008/test.rp2040.yaml rename to tests/components/mcp3008/test.rp2040-ard.yaml diff --git a/tests/components/mcp3204/test.esp32.yaml b/tests/components/mcp3204/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp3204/test.esp32.yaml rename to tests/components/mcp3204/test.esp32-ard.yaml diff --git a/tests/components/mcp3204/test.esp32-c3.yaml b/tests/components/mcp3204/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp3204/test.esp32-c3.yaml rename to tests/components/mcp3204/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp3204/test.esp8266.yaml b/tests/components/mcp3204/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp3204/test.esp8266.yaml rename to tests/components/mcp3204/test.esp8266-ard.yaml diff --git a/tests/components/mcp3204/test.rp2040.yaml b/tests/components/mcp3204/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp3204/test.rp2040.yaml rename to tests/components/mcp3204/test.rp2040-ard.yaml diff --git a/tests/components/mcp4725/test.esp32.yaml b/tests/components/mcp4725/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp4725/test.esp32.yaml rename to tests/components/mcp4725/test.esp32-ard.yaml diff --git a/tests/components/mcp4725/test.esp32-c3.yaml b/tests/components/mcp4725/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp4725/test.esp32-c3.yaml rename to tests/components/mcp4725/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp4725/test.esp8266.yaml b/tests/components/mcp4725/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp4725/test.esp8266.yaml rename to tests/components/mcp4725/test.esp8266-ard.yaml diff --git a/tests/components/mcp4725/test.rp2040.yaml b/tests/components/mcp4725/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp4725/test.rp2040.yaml rename to tests/components/mcp4725/test.rp2040-ard.yaml diff --git a/tests/components/mcp4728/test.esp32.yaml b/tests/components/mcp4728/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp4728/test.esp32.yaml rename to tests/components/mcp4728/test.esp32-ard.yaml diff --git a/tests/components/mcp4728/test.esp32-c3.yaml b/tests/components/mcp4728/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp4728/test.esp32-c3.yaml rename to tests/components/mcp4728/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp4728/test.esp8266.yaml b/tests/components/mcp4728/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp4728/test.esp8266.yaml rename to tests/components/mcp4728/test.esp8266-ard.yaml diff --git a/tests/components/mcp4728/test.rp2040.yaml b/tests/components/mcp4728/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp4728/test.rp2040.yaml rename to tests/components/mcp4728/test.rp2040-ard.yaml diff --git a/tests/components/mcp47a1/test.esp32.yaml b/tests/components/mcp47a1/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp47a1/test.esp32.yaml rename to tests/components/mcp47a1/test.esp32-ard.yaml diff --git a/tests/components/mcp47a1/test.esp32-c3.yaml b/tests/components/mcp47a1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp47a1/test.esp32-c3.yaml rename to tests/components/mcp47a1/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp47a1/test.esp8266.yaml b/tests/components/mcp47a1/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp47a1/test.esp8266.yaml rename to tests/components/mcp47a1/test.esp8266-ard.yaml diff --git a/tests/components/mcp47a1/test.rp2040.yaml b/tests/components/mcp47a1/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp47a1/test.rp2040.yaml rename to tests/components/mcp47a1/test.rp2040-ard.yaml diff --git a/tests/components/mcp9600/test.esp32.yaml b/tests/components/mcp9600/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp9600/test.esp32.yaml rename to tests/components/mcp9600/test.esp32-ard.yaml diff --git a/tests/components/mcp9600/test.esp32-c3.yaml b/tests/components/mcp9600/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp9600/test.esp32-c3.yaml rename to tests/components/mcp9600/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp9600/test.esp8266.yaml b/tests/components/mcp9600/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp9600/test.esp8266.yaml rename to tests/components/mcp9600/test.esp8266-ard.yaml diff --git a/tests/components/mcp9600/test.rp2040.yaml b/tests/components/mcp9600/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp9600/test.rp2040.yaml rename to tests/components/mcp9600/test.rp2040-ard.yaml diff --git a/tests/components/mcp9808/test.esp32.yaml b/tests/components/mcp9808/test.esp32-ard.yaml similarity index 100% rename from tests/components/mcp9808/test.esp32.yaml rename to tests/components/mcp9808/test.esp32-ard.yaml diff --git a/tests/components/mcp9808/test.esp32-c3.yaml b/tests/components/mcp9808/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mcp9808/test.esp32-c3.yaml rename to tests/components/mcp9808/test.esp32-c3-ard.yaml diff --git a/tests/components/mcp9808/test.esp8266.yaml b/tests/components/mcp9808/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mcp9808/test.esp8266.yaml rename to tests/components/mcp9808/test.esp8266-ard.yaml diff --git a/tests/components/mcp9808/test.rp2040.yaml b/tests/components/mcp9808/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mcp9808/test.rp2040.yaml rename to tests/components/mcp9808/test.rp2040-ard.yaml diff --git a/tests/components/mdns/test.esp32-c3.yaml b/tests/components/mdns/test.esp32-ard.yaml similarity index 100% rename from tests/components/mdns/test.esp32-c3.yaml rename to tests/components/mdns/test.esp32-ard.yaml diff --git a/tests/components/mdns/test.esp32.yaml b/tests/components/mdns/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mdns/test.esp32.yaml rename to tests/components/mdns/test.esp32-c3-ard.yaml diff --git a/tests/components/mdns/test.esp8266.yaml b/tests/components/mdns/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mdns/test.esp8266.yaml rename to tests/components/mdns/test.esp8266-ard.yaml diff --git a/tests/components/mdns/test.rp2040.yaml b/tests/components/mdns/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mdns/test.rp2040.yaml rename to tests/components/mdns/test.rp2040-ard.yaml diff --git a/tests/components/media_player/test.esp32.yaml b/tests/components/media_player/test.esp32-ard.yaml similarity index 100% rename from tests/components/media_player/test.esp32.yaml rename to tests/components/media_player/test.esp32-ard.yaml diff --git a/tests/components/mhz19/test.esp32.yaml b/tests/components/mhz19/test.esp32-ard.yaml similarity index 100% rename from tests/components/mhz19/test.esp32.yaml rename to tests/components/mhz19/test.esp32-ard.yaml diff --git a/tests/components/mhz19/test.esp32-c3.yaml b/tests/components/mhz19/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mhz19/test.esp32-c3.yaml rename to tests/components/mhz19/test.esp32-c3-ard.yaml diff --git a/tests/components/mhz19/test.esp8266.yaml b/tests/components/mhz19/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mhz19/test.esp8266.yaml rename to tests/components/mhz19/test.esp8266-ard.yaml diff --git a/tests/components/mhz19/test.rp2040.yaml b/tests/components/mhz19/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mhz19/test.rp2040.yaml rename to tests/components/mhz19/test.rp2040-ard.yaml diff --git a/tests/components/micronova/test.esp32.yaml b/tests/components/micronova/test.esp32-ard.yaml similarity index 100% rename from tests/components/micronova/test.esp32.yaml rename to tests/components/micronova/test.esp32-ard.yaml diff --git a/tests/components/micronova/test.esp32-c3.yaml b/tests/components/micronova/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/micronova/test.esp32-c3.yaml rename to tests/components/micronova/test.esp32-c3-ard.yaml diff --git a/tests/components/micronova/test.esp8266.yaml b/tests/components/micronova/test.esp8266-ard.yaml similarity index 100% rename from tests/components/micronova/test.esp8266.yaml rename to tests/components/micronova/test.esp8266-ard.yaml diff --git a/tests/components/micronova/test.rp2040.yaml b/tests/components/micronova/test.rp2040-ard.yaml similarity index 100% rename from tests/components/micronova/test.rp2040.yaml rename to tests/components/micronova/test.rp2040-ard.yaml diff --git a/tests/components/microphone/test.esp32.yaml b/tests/components/microphone/test.esp32-ard.yaml similarity index 100% rename from tests/components/microphone/test.esp32.yaml rename to tests/components/microphone/test.esp32-ard.yaml diff --git a/tests/components/microphone/test.esp32-c3.yaml b/tests/components/microphone/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/microphone/test.esp32-c3.yaml rename to tests/components/microphone/test.esp32-c3-ard.yaml diff --git a/tests/components/mics_4514/test.esp32.yaml b/tests/components/mics_4514/test.esp32-ard.yaml similarity index 100% rename from tests/components/mics_4514/test.esp32.yaml rename to tests/components/mics_4514/test.esp32-ard.yaml diff --git a/tests/components/mics_4514/test.esp32-c3.yaml b/tests/components/mics_4514/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mics_4514/test.esp32-c3.yaml rename to tests/components/mics_4514/test.esp32-c3-ard.yaml diff --git a/tests/components/mics_4514/test.esp8266.yaml b/tests/components/mics_4514/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mics_4514/test.esp8266.yaml rename to tests/components/mics_4514/test.esp8266-ard.yaml diff --git a/tests/components/mics_4514/test.rp2040.yaml b/tests/components/mics_4514/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mics_4514/test.rp2040.yaml rename to tests/components/mics_4514/test.rp2040-ard.yaml diff --git a/tests/components/midea/test.esp32.yaml b/tests/components/midea/test.esp32-ard.yaml similarity index 100% rename from tests/components/midea/test.esp32.yaml rename to tests/components/midea/test.esp32-ard.yaml diff --git a/tests/components/midea/test.esp32-c3.yaml b/tests/components/midea/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/midea/test.esp32-c3.yaml rename to tests/components/midea/test.esp32-c3-ard.yaml diff --git a/tests/components/midea/test.esp8266.yaml b/tests/components/midea/test.esp8266-ard.yaml similarity index 100% rename from tests/components/midea/test.esp8266.yaml rename to tests/components/midea/test.esp8266-ard.yaml diff --git a/tests/components/midea_ir/test.esp32-c3.yaml b/tests/components/midea_ir/test.esp32-ard.yaml similarity index 100% rename from tests/components/midea_ir/test.esp32-c3.yaml rename to tests/components/midea_ir/test.esp32-ard.yaml diff --git a/tests/components/midea_ir/test.esp32.yaml b/tests/components/midea_ir/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/midea_ir/test.esp32.yaml rename to tests/components/midea_ir/test.esp32-c3-ard.yaml diff --git a/tests/components/midea_ir/test.esp8266.yaml b/tests/components/midea_ir/test.esp8266-ard.yaml similarity index 100% rename from tests/components/midea_ir/test.esp8266.yaml rename to tests/components/midea_ir/test.esp8266-ard.yaml diff --git a/tests/components/mitsubishi/test.esp32-c3.yaml b/tests/components/mitsubishi/test.esp32-ard.yaml similarity index 100% rename from tests/components/mitsubishi/test.esp32-c3.yaml rename to tests/components/mitsubishi/test.esp32-ard.yaml diff --git a/tests/components/mitsubishi/test.esp32.yaml b/tests/components/mitsubishi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mitsubishi/test.esp32.yaml rename to tests/components/mitsubishi/test.esp32-c3-ard.yaml diff --git a/tests/components/mitsubishi/test.esp8266.yaml b/tests/components/mitsubishi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mitsubishi/test.esp8266.yaml rename to tests/components/mitsubishi/test.esp8266-ard.yaml diff --git a/tests/components/mlx90393/test.esp32.yaml b/tests/components/mlx90393/test.esp32-ard.yaml similarity index 100% rename from tests/components/mlx90393/test.esp32.yaml rename to tests/components/mlx90393/test.esp32-ard.yaml diff --git a/tests/components/mlx90393/test.esp32-c3.yaml b/tests/components/mlx90393/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mlx90393/test.esp32-c3.yaml rename to tests/components/mlx90393/test.esp32-c3-ard.yaml diff --git a/tests/components/mlx90393/test.esp8266.yaml b/tests/components/mlx90393/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mlx90393/test.esp8266.yaml rename to tests/components/mlx90393/test.esp8266-ard.yaml diff --git a/tests/components/mlx90393/test.rp2040.yaml b/tests/components/mlx90393/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mlx90393/test.rp2040.yaml rename to tests/components/mlx90393/test.rp2040-ard.yaml diff --git a/tests/components/mlx90614/test.esp32.yaml b/tests/components/mlx90614/test.esp32-ard.yaml similarity index 100% rename from tests/components/mlx90614/test.esp32.yaml rename to tests/components/mlx90614/test.esp32-ard.yaml diff --git a/tests/components/mlx90614/test.esp32-c3.yaml b/tests/components/mlx90614/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mlx90614/test.esp32-c3.yaml rename to tests/components/mlx90614/test.esp32-c3-ard.yaml diff --git a/tests/components/mlx90614/test.esp8266.yaml b/tests/components/mlx90614/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mlx90614/test.esp8266.yaml rename to tests/components/mlx90614/test.esp8266-ard.yaml diff --git a/tests/components/mlx90614/test.rp2040.yaml b/tests/components/mlx90614/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mlx90614/test.rp2040.yaml rename to tests/components/mlx90614/test.rp2040-ard.yaml diff --git a/tests/components/mmc5603/test.esp32.yaml b/tests/components/mmc5603/test.esp32-ard.yaml similarity index 100% rename from tests/components/mmc5603/test.esp32.yaml rename to tests/components/mmc5603/test.esp32-ard.yaml diff --git a/tests/components/mmc5603/test.esp32-c3.yaml b/tests/components/mmc5603/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mmc5603/test.esp32-c3.yaml rename to tests/components/mmc5603/test.esp32-c3-ard.yaml diff --git a/tests/components/mmc5603/test.esp8266.yaml b/tests/components/mmc5603/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mmc5603/test.esp8266.yaml rename to tests/components/mmc5603/test.esp8266-ard.yaml diff --git a/tests/components/mmc5603/test.rp2040.yaml b/tests/components/mmc5603/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mmc5603/test.rp2040.yaml rename to tests/components/mmc5603/test.rp2040-ard.yaml diff --git a/tests/components/mmc5983/test.esp32.yaml b/tests/components/mmc5983/test.esp32-ard.yaml similarity index 100% rename from tests/components/mmc5983/test.esp32.yaml rename to tests/components/mmc5983/test.esp32-ard.yaml diff --git a/tests/components/mmc5983/test.esp32-c3.yaml b/tests/components/mmc5983/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mmc5983/test.esp32-c3.yaml rename to tests/components/mmc5983/test.esp32-c3-ard.yaml diff --git a/tests/components/mmc5983/test.esp8266.yaml b/tests/components/mmc5983/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mmc5983/test.esp8266.yaml rename to tests/components/mmc5983/test.esp8266-ard.yaml diff --git a/tests/components/mmc5983/test.rp2040.yaml b/tests/components/mmc5983/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mmc5983/test.rp2040.yaml rename to tests/components/mmc5983/test.rp2040-ard.yaml diff --git a/tests/components/modbus/test.esp32.yaml b/tests/components/modbus/test.esp32-ard.yaml similarity index 100% rename from tests/components/modbus/test.esp32.yaml rename to tests/components/modbus/test.esp32-ard.yaml diff --git a/tests/components/modbus/test.esp32-c3.yaml b/tests/components/modbus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/modbus/test.esp32-c3.yaml rename to tests/components/modbus/test.esp32-c3-ard.yaml diff --git a/tests/components/modbus/test.esp8266.yaml b/tests/components/modbus/test.esp8266-ard.yaml similarity index 100% rename from tests/components/modbus/test.esp8266.yaml rename to tests/components/modbus/test.esp8266-ard.yaml diff --git a/tests/components/modbus/test.rp2040.yaml b/tests/components/modbus/test.rp2040-ard.yaml similarity index 100% rename from tests/components/modbus/test.rp2040.yaml rename to tests/components/modbus/test.rp2040-ard.yaml diff --git a/tests/components/modbus_controller/test.esp32.yaml b/tests/components/modbus_controller/test.esp32-ard.yaml similarity index 100% rename from tests/components/modbus_controller/test.esp32.yaml rename to tests/components/modbus_controller/test.esp32-ard.yaml diff --git a/tests/components/modbus_controller/test.esp32-c3.yaml b/tests/components/modbus_controller/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/modbus_controller/test.esp32-c3.yaml rename to tests/components/modbus_controller/test.esp32-c3-ard.yaml diff --git a/tests/components/modbus_controller/test.esp8266.yaml b/tests/components/modbus_controller/test.esp8266-ard.yaml similarity index 100% rename from tests/components/modbus_controller/test.esp8266.yaml rename to tests/components/modbus_controller/test.esp8266-ard.yaml diff --git a/tests/components/modbus_controller/test.rp2040.yaml b/tests/components/modbus_controller/test.rp2040-ard.yaml similarity index 100% rename from tests/components/modbus_controller/test.rp2040.yaml rename to tests/components/modbus_controller/test.rp2040-ard.yaml diff --git a/tests/components/monochromatic/test.esp32-c3.yaml b/tests/components/monochromatic/test.esp32-ard.yaml similarity index 100% rename from tests/components/monochromatic/test.esp32-c3.yaml rename to tests/components/monochromatic/test.esp32-ard.yaml diff --git a/tests/components/monochromatic/test.esp32.yaml b/tests/components/monochromatic/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/monochromatic/test.esp32.yaml rename to tests/components/monochromatic/test.esp32-c3-ard.yaml diff --git a/tests/components/monochromatic/test.esp8266.yaml b/tests/components/monochromatic/test.esp8266-ard.yaml similarity index 100% rename from tests/components/monochromatic/test.esp8266.yaml rename to tests/components/monochromatic/test.esp8266-ard.yaml diff --git a/tests/components/monochromatic/test.rp2040.yaml b/tests/components/monochromatic/test.rp2040-ard.yaml similarity index 100% rename from tests/components/monochromatic/test.rp2040.yaml rename to tests/components/monochromatic/test.rp2040-ard.yaml diff --git a/tests/components/mopeka_ble/test.esp32-c3.yaml b/tests/components/mopeka_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/mopeka_ble/test.esp32-c3.yaml rename to tests/components/mopeka_ble/test.esp32-ard.yaml diff --git a/tests/components/mopeka_ble/test.esp32.yaml b/tests/components/mopeka_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mopeka_ble/test.esp32.yaml rename to tests/components/mopeka_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/mopeka_pro_check/test.esp32-c3.yaml b/tests/components/mopeka_pro_check/test.esp32-ard.yaml similarity index 100% rename from tests/components/mopeka_pro_check/test.esp32-c3.yaml rename to tests/components/mopeka_pro_check/test.esp32-ard.yaml diff --git a/tests/components/mopeka_pro_check/test.esp32.yaml b/tests/components/mopeka_pro_check/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mopeka_pro_check/test.esp32.yaml rename to tests/components/mopeka_pro_check/test.esp32-c3-ard.yaml diff --git a/tests/components/mopeka_std_check/test.esp32-c3.yaml b/tests/components/mopeka_std_check/test.esp32-ard.yaml similarity index 100% rename from tests/components/mopeka_std_check/test.esp32-c3.yaml rename to tests/components/mopeka_std_check/test.esp32-ard.yaml diff --git a/tests/components/mopeka_std_check/test.esp32.yaml b/tests/components/mopeka_std_check/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mopeka_std_check/test.esp32.yaml rename to tests/components/mopeka_std_check/test.esp32-c3-ard.yaml diff --git a/tests/components/mpl3115a2/test.esp32.yaml b/tests/components/mpl3115a2/test.esp32-ard.yaml similarity index 100% rename from tests/components/mpl3115a2/test.esp32.yaml rename to tests/components/mpl3115a2/test.esp32-ard.yaml diff --git a/tests/components/mpl3115a2/test.esp32-c3.yaml b/tests/components/mpl3115a2/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mpl3115a2/test.esp32-c3.yaml rename to tests/components/mpl3115a2/test.esp32-c3-ard.yaml diff --git a/tests/components/mpl3115a2/test.esp8266.yaml b/tests/components/mpl3115a2/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mpl3115a2/test.esp8266.yaml rename to tests/components/mpl3115a2/test.esp8266-ard.yaml diff --git a/tests/components/mpl3115a2/test.rp2040.yaml b/tests/components/mpl3115a2/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mpl3115a2/test.rp2040.yaml rename to tests/components/mpl3115a2/test.rp2040-ard.yaml diff --git a/tests/components/mpr121/test.esp32.yaml b/tests/components/mpr121/test.esp32-ard.yaml similarity index 100% rename from tests/components/mpr121/test.esp32.yaml rename to tests/components/mpr121/test.esp32-ard.yaml diff --git a/tests/components/mpr121/test.esp32-c3.yaml b/tests/components/mpr121/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mpr121/test.esp32-c3.yaml rename to tests/components/mpr121/test.esp32-c3-ard.yaml diff --git a/tests/components/mpr121/test.esp8266.yaml b/tests/components/mpr121/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mpr121/test.esp8266.yaml rename to tests/components/mpr121/test.esp8266-ard.yaml diff --git a/tests/components/mpr121/test.rp2040.yaml b/tests/components/mpr121/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mpr121/test.rp2040.yaml rename to tests/components/mpr121/test.rp2040-ard.yaml diff --git a/tests/components/mpu6050/test.esp32.yaml b/tests/components/mpu6050/test.esp32-ard.yaml similarity index 100% rename from tests/components/mpu6050/test.esp32.yaml rename to tests/components/mpu6050/test.esp32-ard.yaml diff --git a/tests/components/mpu6050/test.esp32-c3.yaml b/tests/components/mpu6050/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mpu6050/test.esp32-c3.yaml rename to tests/components/mpu6050/test.esp32-c3-ard.yaml diff --git a/tests/components/mpu6050/test.esp8266.yaml b/tests/components/mpu6050/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mpu6050/test.esp8266.yaml rename to tests/components/mpu6050/test.esp8266-ard.yaml diff --git a/tests/components/mpu6050/test.rp2040.yaml b/tests/components/mpu6050/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mpu6050/test.rp2040.yaml rename to tests/components/mpu6050/test.rp2040-ard.yaml diff --git a/tests/components/mpu6886/test.esp32.yaml b/tests/components/mpu6886/test.esp32-ard.yaml similarity index 100% rename from tests/components/mpu6886/test.esp32.yaml rename to tests/components/mpu6886/test.esp32-ard.yaml diff --git a/tests/components/mpu6886/test.esp32-c3.yaml b/tests/components/mpu6886/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mpu6886/test.esp32-c3.yaml rename to tests/components/mpu6886/test.esp32-c3-ard.yaml diff --git a/tests/components/mpu6886/test.esp8266.yaml b/tests/components/mpu6886/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mpu6886/test.esp8266.yaml rename to tests/components/mpu6886/test.esp8266-ard.yaml diff --git a/tests/components/mpu6886/test.rp2040.yaml b/tests/components/mpu6886/test.rp2040-ard.yaml similarity index 100% rename from tests/components/mpu6886/test.rp2040.yaml rename to tests/components/mpu6886/test.rp2040-ard.yaml diff --git a/tests/components/mqtt/test.bk72xx.yaml b/tests/components/mqtt/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/mqtt/test.bk72xx.yaml rename to tests/components/mqtt/test.bk72xx-ard.yaml diff --git a/tests/components/mqtt/test.esp32-c3.yaml b/tests/components/mqtt/test.esp32-ard.yaml similarity index 100% rename from tests/components/mqtt/test.esp32-c3.yaml rename to tests/components/mqtt/test.esp32-ard.yaml diff --git a/tests/components/mqtt/test.esp32.yaml b/tests/components/mqtt/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mqtt/test.esp32.yaml rename to tests/components/mqtt/test.esp32-c3-ard.yaml diff --git a/tests/components/mqtt/test.esp8266.yaml b/tests/components/mqtt/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mqtt/test.esp8266.yaml rename to tests/components/mqtt/test.esp8266-ard.yaml diff --git a/tests/components/mqtt_subscribe/test.esp32-c3.yaml b/tests/components/mqtt_subscribe/test.esp32-ard.yaml similarity index 100% rename from tests/components/mqtt_subscribe/test.esp32-c3.yaml rename to tests/components/mqtt_subscribe/test.esp32-ard.yaml diff --git a/tests/components/mqtt_subscribe/test.esp32.yaml b/tests/components/mqtt_subscribe/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/mqtt_subscribe/test.esp32.yaml rename to tests/components/mqtt_subscribe/test.esp32-c3-ard.yaml diff --git a/tests/components/mqtt_subscribe/test.esp8266.yaml b/tests/components/mqtt_subscribe/test.esp8266-ard.yaml similarity index 100% rename from tests/components/mqtt_subscribe/test.esp8266.yaml rename to tests/components/mqtt_subscribe/test.esp8266-ard.yaml diff --git a/tests/components/ms5611/test.esp32.yaml b/tests/components/ms5611/test.esp32-ard.yaml similarity index 100% rename from tests/components/ms5611/test.esp32.yaml rename to tests/components/ms5611/test.esp32-ard.yaml diff --git a/tests/components/ms5611/test.esp32-c3.yaml b/tests/components/ms5611/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ms5611/test.esp32-c3.yaml rename to tests/components/ms5611/test.esp32-c3-ard.yaml diff --git a/tests/components/ms5611/test.esp8266.yaml b/tests/components/ms5611/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ms5611/test.esp8266.yaml rename to tests/components/ms5611/test.esp8266-ard.yaml diff --git a/tests/components/ms5611/test.rp2040.yaml b/tests/components/ms5611/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ms5611/test.rp2040.yaml rename to tests/components/ms5611/test.rp2040-ard.yaml diff --git a/tests/components/my9231/test.esp32-c3.yaml b/tests/components/my9231/test.esp32-ard.yaml similarity index 100% rename from tests/components/my9231/test.esp32-c3.yaml rename to tests/components/my9231/test.esp32-ard.yaml diff --git a/tests/components/my9231/test.esp32.yaml b/tests/components/my9231/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/my9231/test.esp32.yaml rename to tests/components/my9231/test.esp32-c3-ard.yaml diff --git a/tests/components/my9231/test.esp8266.yaml b/tests/components/my9231/test.esp8266-ard.yaml similarity index 100% rename from tests/components/my9231/test.esp8266.yaml rename to tests/components/my9231/test.esp8266-ard.yaml diff --git a/tests/components/my9231/test.rp2040.yaml b/tests/components/my9231/test.rp2040-ard.yaml similarity index 100% rename from tests/components/my9231/test.rp2040.yaml rename to tests/components/my9231/test.rp2040-ard.yaml diff --git a/tests/components/neopixelbus/test.esp32.yaml b/tests/components/neopixelbus/test.esp32-ard.yaml similarity index 100% rename from tests/components/neopixelbus/test.esp32.yaml rename to tests/components/neopixelbus/test.esp32-ard.yaml diff --git a/tests/components/neopixelbus/test.esp32-c3.yaml b/tests/components/neopixelbus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/neopixelbus/test.esp32-c3.yaml rename to tests/components/neopixelbus/test.esp32-c3-ard.yaml diff --git a/tests/components/neopixelbus/test.esp8266.yaml b/tests/components/neopixelbus/test.esp8266-ard.yaml similarity index 100% rename from tests/components/neopixelbus/test.esp8266.yaml rename to tests/components/neopixelbus/test.esp8266-ard.yaml diff --git a/tests/components/network/test.esp32-c3.yaml b/tests/components/network/test.esp32-ard.yaml similarity index 100% rename from tests/components/network/test.esp32-c3.yaml rename to tests/components/network/test.esp32-ard.yaml diff --git a/tests/components/network/test.esp32.yaml b/tests/components/network/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/network/test.esp32.yaml rename to tests/components/network/test.esp32-c3-ard.yaml diff --git a/tests/components/network/test.esp8266.yaml b/tests/components/network/test.esp8266-ard.yaml similarity index 100% rename from tests/components/network/test.esp8266.yaml rename to tests/components/network/test.esp8266-ard.yaml diff --git a/tests/components/network/test.rp2040.yaml b/tests/components/network/test.rp2040-ard.yaml similarity index 100% rename from tests/components/network/test.rp2040.yaml rename to tests/components/network/test.rp2040-ard.yaml diff --git a/tests/components/nextion/test.esp32.yaml b/tests/components/nextion/test.esp32-ard.yaml similarity index 100% rename from tests/components/nextion/test.esp32.yaml rename to tests/components/nextion/test.esp32-ard.yaml diff --git a/tests/components/nextion/test.esp32-c3.yaml b/tests/components/nextion/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/nextion/test.esp32-c3.yaml rename to tests/components/nextion/test.esp32-c3-ard.yaml diff --git a/tests/components/nextion/test.esp8266.yaml b/tests/components/nextion/test.esp8266-ard.yaml similarity index 100% rename from tests/components/nextion/test.esp8266.yaml rename to tests/components/nextion/test.esp8266-ard.yaml diff --git a/tests/components/nextion/test.rp2040.yaml b/tests/components/nextion/test.rp2040-ard.yaml similarity index 100% rename from tests/components/nextion/test.rp2040.yaml rename to tests/components/nextion/test.rp2040-ard.yaml diff --git a/tests/components/noblex/test.esp32-c3.yaml b/tests/components/noblex/test.esp32-ard.yaml similarity index 100% rename from tests/components/noblex/test.esp32-c3.yaml rename to tests/components/noblex/test.esp32-ard.yaml diff --git a/tests/components/noblex/test.esp32.yaml b/tests/components/noblex/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/noblex/test.esp32.yaml rename to tests/components/noblex/test.esp32-c3-ard.yaml diff --git a/tests/components/noblex/test.esp8266.yaml b/tests/components/noblex/test.esp8266-ard.yaml similarity index 100% rename from tests/components/noblex/test.esp8266.yaml rename to tests/components/noblex/test.esp8266-ard.yaml diff --git a/tests/components/ntc/test.esp32.yaml b/tests/components/ntc/test.esp32-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp32.yaml rename to tests/components/ntc/test.esp32-ard.yaml diff --git a/tests/components/ntc/test.esp32-c3.yaml b/tests/components/ntc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp32-c3.yaml rename to tests/components/ntc/test.esp32-c3-ard.yaml diff --git a/tests/components/ntc/test.esp32-s2.yaml b/tests/components/ntc/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp32-s2.yaml rename to tests/components/ntc/test.esp32-s2-ard.yaml diff --git a/tests/components/ntc/test.esp32-s3.yaml b/tests/components/ntc/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp32-s3.yaml rename to tests/components/ntc/test.esp32-s3-ard.yaml diff --git a/tests/components/ntc/test.esp8266.yaml b/tests/components/ntc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ntc/test.esp8266.yaml rename to tests/components/ntc/test.esp8266-ard.yaml diff --git a/tests/components/ntc/test.rp2040.yaml b/tests/components/ntc/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ntc/test.rp2040.yaml rename to tests/components/ntc/test.rp2040-ard.yaml diff --git a/tests/components/ota/test.esp32-c3.yaml b/tests/components/ota/test.esp32-ard.yaml similarity index 100% rename from tests/components/ota/test.esp32-c3.yaml rename to tests/components/ota/test.esp32-ard.yaml diff --git a/tests/components/ota/test.esp32.yaml b/tests/components/ota/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ota/test.esp32.yaml rename to tests/components/ota/test.esp32-c3-ard.yaml diff --git a/tests/components/ota/test.esp8266.yaml b/tests/components/ota/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ota/test.esp8266.yaml rename to tests/components/ota/test.esp8266-ard.yaml diff --git a/tests/components/ota/test.rp2040.yaml b/tests/components/ota/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ota/test.rp2040.yaml rename to tests/components/ota/test.rp2040-ard.yaml diff --git a/tests/components/output/test.esp32.yaml b/tests/components/output/test.esp32-ard.yaml similarity index 100% rename from tests/components/output/test.esp32.yaml rename to tests/components/output/test.esp32-ard.yaml diff --git a/tests/components/output/test.esp32-c3.yaml b/tests/components/output/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/output/test.esp32-c3.yaml rename to tests/components/output/test.esp32-c3-ard.yaml diff --git a/tests/components/output/test.esp8266.yaml b/tests/components/output/test.esp8266-ard.yaml similarity index 100% rename from tests/components/output/test.esp8266.yaml rename to tests/components/output/test.esp8266-ard.yaml diff --git a/tests/components/output/test.rp2040.yaml b/tests/components/output/test.rp2040-ard.yaml similarity index 100% rename from tests/components/output/test.rp2040.yaml rename to tests/components/output/test.rp2040-ard.yaml diff --git a/tests/components/partition/test.esp32.yaml b/tests/components/partition/test.esp32-ard.yaml similarity index 100% rename from tests/components/partition/test.esp32.yaml rename to tests/components/partition/test.esp32-ard.yaml diff --git a/tests/components/partition/test.esp32-c3.yaml b/tests/components/partition/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/partition/test.esp32-c3.yaml rename to tests/components/partition/test.esp32-c3-ard.yaml diff --git a/tests/components/pca6416a/test.esp32.yaml b/tests/components/pca6416a/test.esp32-ard.yaml similarity index 100% rename from tests/components/pca6416a/test.esp32.yaml rename to tests/components/pca6416a/test.esp32-ard.yaml diff --git a/tests/components/pca6416a/test.esp32-c3.yaml b/tests/components/pca6416a/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pca6416a/test.esp32-c3.yaml rename to tests/components/pca6416a/test.esp32-c3-ard.yaml diff --git a/tests/components/pca6416a/test.esp8266.yaml b/tests/components/pca6416a/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pca6416a/test.esp8266.yaml rename to tests/components/pca6416a/test.esp8266-ard.yaml diff --git a/tests/components/pca6416a/test.rp2040.yaml b/tests/components/pca6416a/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pca6416a/test.rp2040.yaml rename to tests/components/pca6416a/test.rp2040-ard.yaml diff --git a/tests/components/pca9554/test.esp32.yaml b/tests/components/pca9554/test.esp32-ard.yaml similarity index 100% rename from tests/components/pca9554/test.esp32.yaml rename to tests/components/pca9554/test.esp32-ard.yaml diff --git a/tests/components/pca9554/test.esp32-c3.yaml b/tests/components/pca9554/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pca9554/test.esp32-c3.yaml rename to tests/components/pca9554/test.esp32-c3-ard.yaml diff --git a/tests/components/pca9554/test.esp8266.yaml b/tests/components/pca9554/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pca9554/test.esp8266.yaml rename to tests/components/pca9554/test.esp8266-ard.yaml diff --git a/tests/components/pca9554/test.rp2040.yaml b/tests/components/pca9554/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pca9554/test.rp2040.yaml rename to tests/components/pca9554/test.rp2040-ard.yaml diff --git a/tests/components/pca9685/test.esp32.yaml b/tests/components/pca9685/test.esp32-ard.yaml similarity index 100% rename from tests/components/pca9685/test.esp32.yaml rename to tests/components/pca9685/test.esp32-ard.yaml diff --git a/tests/components/pca9685/test.esp32-c3.yaml b/tests/components/pca9685/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pca9685/test.esp32-c3.yaml rename to tests/components/pca9685/test.esp32-c3-ard.yaml diff --git a/tests/components/pca9685/test.esp8266.yaml b/tests/components/pca9685/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pca9685/test.esp8266.yaml rename to tests/components/pca9685/test.esp8266-ard.yaml diff --git a/tests/components/pca9685/test.rp2040.yaml b/tests/components/pca9685/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pca9685/test.rp2040.yaml rename to tests/components/pca9685/test.rp2040-ard.yaml diff --git a/tests/components/pcd8544/test.esp32.yaml b/tests/components/pcd8544/test.esp32-ard.yaml similarity index 100% rename from tests/components/pcd8544/test.esp32.yaml rename to tests/components/pcd8544/test.esp32-ard.yaml diff --git a/tests/components/pcd8544/test.esp32-c3.yaml b/tests/components/pcd8544/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pcd8544/test.esp32-c3.yaml rename to tests/components/pcd8544/test.esp32-c3-ard.yaml diff --git a/tests/components/pcd8544/test.esp8266.yaml b/tests/components/pcd8544/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pcd8544/test.esp8266.yaml rename to tests/components/pcd8544/test.esp8266-ard.yaml diff --git a/tests/components/pcd8544/test.rp2040.yaml b/tests/components/pcd8544/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pcd8544/test.rp2040.yaml rename to tests/components/pcd8544/test.rp2040-ard.yaml diff --git a/tests/components/pcf85063/test.esp32.yaml b/tests/components/pcf85063/test.esp32-ard.yaml similarity index 100% rename from tests/components/pcf85063/test.esp32.yaml rename to tests/components/pcf85063/test.esp32-ard.yaml diff --git a/tests/components/pcf85063/test.esp32-c3.yaml b/tests/components/pcf85063/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pcf85063/test.esp32-c3.yaml rename to tests/components/pcf85063/test.esp32-c3-ard.yaml diff --git a/tests/components/pcf85063/test.esp8266.yaml b/tests/components/pcf85063/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pcf85063/test.esp8266.yaml rename to tests/components/pcf85063/test.esp8266-ard.yaml diff --git a/tests/components/pcf85063/test.rp2040.yaml b/tests/components/pcf85063/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pcf85063/test.rp2040.yaml rename to tests/components/pcf85063/test.rp2040-ard.yaml diff --git a/tests/components/pcf8563/test.esp32.yaml b/tests/components/pcf8563/test.esp32-ard.yaml similarity index 100% rename from tests/components/pcf8563/test.esp32.yaml rename to tests/components/pcf8563/test.esp32-ard.yaml diff --git a/tests/components/pcf8563/test.esp32-c3.yaml b/tests/components/pcf8563/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pcf8563/test.esp32-c3.yaml rename to tests/components/pcf8563/test.esp32-c3-ard.yaml diff --git a/tests/components/pcf8563/test.esp8266.yaml b/tests/components/pcf8563/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pcf8563/test.esp8266.yaml rename to tests/components/pcf8563/test.esp8266-ard.yaml diff --git a/tests/components/pcf8563/test.rp2040.yaml b/tests/components/pcf8563/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pcf8563/test.rp2040.yaml rename to tests/components/pcf8563/test.rp2040-ard.yaml diff --git a/tests/components/pcf8574/test.esp32.yaml b/tests/components/pcf8574/test.esp32-ard.yaml similarity index 100% rename from tests/components/pcf8574/test.esp32.yaml rename to tests/components/pcf8574/test.esp32-ard.yaml diff --git a/tests/components/pcf8574/test.esp32-c3.yaml b/tests/components/pcf8574/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pcf8574/test.esp32-c3.yaml rename to tests/components/pcf8574/test.esp32-c3-ard.yaml diff --git a/tests/components/pcf8574/test.esp8266.yaml b/tests/components/pcf8574/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pcf8574/test.esp8266.yaml rename to tests/components/pcf8574/test.esp8266-ard.yaml diff --git a/tests/components/pcf8574/test.rp2040.yaml b/tests/components/pcf8574/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pcf8574/test.rp2040.yaml rename to tests/components/pcf8574/test.rp2040-ard.yaml diff --git a/tests/components/pid/test.esp32-c3.yaml b/tests/components/pid/test.esp32-ard.yaml similarity index 100% rename from tests/components/pid/test.esp32-c3.yaml rename to tests/components/pid/test.esp32-ard.yaml diff --git a/tests/components/pid/test.esp32.yaml b/tests/components/pid/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pid/test.esp32.yaml rename to tests/components/pid/test.esp32-c3-ard.yaml diff --git a/tests/components/pid/test.esp8266.yaml b/tests/components/pid/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pid/test.esp8266.yaml rename to tests/components/pid/test.esp8266-ard.yaml diff --git a/tests/components/pid/test.rp2040.yaml b/tests/components/pid/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pid/test.rp2040.yaml rename to tests/components/pid/test.rp2040-ard.yaml diff --git a/tests/components/pipsolar/test.esp32.yaml b/tests/components/pipsolar/test.esp32-ard.yaml similarity index 100% rename from tests/components/pipsolar/test.esp32.yaml rename to tests/components/pipsolar/test.esp32-ard.yaml diff --git a/tests/components/pipsolar/test.esp32-c3.yaml b/tests/components/pipsolar/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pipsolar/test.esp32-c3.yaml rename to tests/components/pipsolar/test.esp32-c3-ard.yaml diff --git a/tests/components/pipsolar/test.esp8266.yaml b/tests/components/pipsolar/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pipsolar/test.esp8266.yaml rename to tests/components/pipsolar/test.esp8266-ard.yaml diff --git a/tests/components/pipsolar/test.rp2040.yaml b/tests/components/pipsolar/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pipsolar/test.rp2040.yaml rename to tests/components/pipsolar/test.rp2040-ard.yaml diff --git a/tests/components/pm1006/test.esp32.yaml b/tests/components/pm1006/test.esp32-ard.yaml similarity index 100% rename from tests/components/pm1006/test.esp32.yaml rename to tests/components/pm1006/test.esp32-ard.yaml diff --git a/tests/components/pm1006/test.esp32-c3.yaml b/tests/components/pm1006/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pm1006/test.esp32-c3.yaml rename to tests/components/pm1006/test.esp32-c3-ard.yaml diff --git a/tests/components/pm1006/test.esp8266.yaml b/tests/components/pm1006/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pm1006/test.esp8266.yaml rename to tests/components/pm1006/test.esp8266-ard.yaml diff --git a/tests/components/pm1006/test.rp2040.yaml b/tests/components/pm1006/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pm1006/test.rp2040.yaml rename to tests/components/pm1006/test.rp2040-ard.yaml diff --git a/tests/components/pmsa003i/test.esp32.yaml b/tests/components/pmsa003i/test.esp32-ard.yaml similarity index 100% rename from tests/components/pmsa003i/test.esp32.yaml rename to tests/components/pmsa003i/test.esp32-ard.yaml diff --git a/tests/components/pmsa003i/test.esp32-c3.yaml b/tests/components/pmsa003i/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pmsa003i/test.esp32-c3.yaml rename to tests/components/pmsa003i/test.esp32-c3-ard.yaml diff --git a/tests/components/pmsa003i/test.esp8266.yaml b/tests/components/pmsa003i/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pmsa003i/test.esp8266.yaml rename to tests/components/pmsa003i/test.esp8266-ard.yaml diff --git a/tests/components/pmsa003i/test.rp2040.yaml b/tests/components/pmsa003i/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pmsa003i/test.rp2040.yaml rename to tests/components/pmsa003i/test.rp2040-ard.yaml diff --git a/tests/components/pmsx003/test.esp32.yaml b/tests/components/pmsx003/test.esp32-ard.yaml similarity index 100% rename from tests/components/pmsx003/test.esp32.yaml rename to tests/components/pmsx003/test.esp32-ard.yaml diff --git a/tests/components/pmsx003/test.esp32-c3.yaml b/tests/components/pmsx003/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pmsx003/test.esp32-c3.yaml rename to tests/components/pmsx003/test.esp32-c3-ard.yaml diff --git a/tests/components/pmsx003/test.esp8266.yaml b/tests/components/pmsx003/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pmsx003/test.esp8266.yaml rename to tests/components/pmsx003/test.esp8266-ard.yaml diff --git a/tests/components/pmsx003/test.rp2040.yaml b/tests/components/pmsx003/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pmsx003/test.rp2040.yaml rename to tests/components/pmsx003/test.rp2040-ard.yaml diff --git a/tests/components/pmwcs3/test.esp32.yaml b/tests/components/pmwcs3/test.esp32-ard.yaml similarity index 100% rename from tests/components/pmwcs3/test.esp32.yaml rename to tests/components/pmwcs3/test.esp32-ard.yaml diff --git a/tests/components/pmwcs3/test.esp32-c3.yaml b/tests/components/pmwcs3/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pmwcs3/test.esp32-c3.yaml rename to tests/components/pmwcs3/test.esp32-c3-ard.yaml diff --git a/tests/components/pmwcs3/test.esp8266.yaml b/tests/components/pmwcs3/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pmwcs3/test.esp8266.yaml rename to tests/components/pmwcs3/test.esp8266-ard.yaml diff --git a/tests/components/pmwcs3/test.rp2040.yaml b/tests/components/pmwcs3/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pmwcs3/test.rp2040.yaml rename to tests/components/pmwcs3/test.rp2040-ard.yaml diff --git a/tests/components/pn532_i2c/test.esp32.yaml b/tests/components/pn532_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn532_i2c/test.esp32.yaml rename to tests/components/pn532_i2c/test.esp32-ard.yaml diff --git a/tests/components/pn532_i2c/test.esp32-c3.yaml b/tests/components/pn532_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn532_i2c/test.esp32-c3.yaml rename to tests/components/pn532_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/pn532_i2c/test.esp8266.yaml b/tests/components/pn532_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn532_i2c/test.esp8266.yaml rename to tests/components/pn532_i2c/test.esp8266-ard.yaml diff --git a/tests/components/pn532_i2c/test.rp2040.yaml b/tests/components/pn532_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn532_i2c/test.rp2040.yaml rename to tests/components/pn532_i2c/test.rp2040-ard.yaml diff --git a/tests/components/pn532_spi/test.esp32.yaml b/tests/components/pn532_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn532_spi/test.esp32.yaml rename to tests/components/pn532_spi/test.esp32-ard.yaml diff --git a/tests/components/pn532_spi/test.esp32-c3.yaml b/tests/components/pn532_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn532_spi/test.esp32-c3.yaml rename to tests/components/pn532_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/pn532_spi/test.esp8266.yaml b/tests/components/pn532_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn532_spi/test.esp8266.yaml rename to tests/components/pn532_spi/test.esp8266-ard.yaml diff --git a/tests/components/pn532_spi/test.rp2040.yaml b/tests/components/pn532_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn532_spi/test.rp2040.yaml rename to tests/components/pn532_spi/test.rp2040-ard.yaml diff --git a/tests/components/pn7150_i2c/test.esp32.yaml b/tests/components/pn7150_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn7150_i2c/test.esp32.yaml rename to tests/components/pn7150_i2c/test.esp32-ard.yaml diff --git a/tests/components/pn7150_i2c/test.esp32-c3.yaml b/tests/components/pn7150_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn7150_i2c/test.esp32-c3.yaml rename to tests/components/pn7150_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/pn7150_i2c/test.esp8266.yaml b/tests/components/pn7150_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn7150_i2c/test.esp8266.yaml rename to tests/components/pn7150_i2c/test.esp8266-ard.yaml diff --git a/tests/components/pn7150_i2c/test.rp2040.yaml b/tests/components/pn7150_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn7150_i2c/test.rp2040.yaml rename to tests/components/pn7150_i2c/test.rp2040-ard.yaml diff --git a/tests/components/pn7160_i2c/test.esp32.yaml b/tests/components/pn7160_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn7160_i2c/test.esp32.yaml rename to tests/components/pn7160_i2c/test.esp32-ard.yaml diff --git a/tests/components/pn7160_i2c/test.esp32-c3.yaml b/tests/components/pn7160_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn7160_i2c/test.esp32-c3.yaml rename to tests/components/pn7160_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/pn7160_i2c/test.esp8266.yaml b/tests/components/pn7160_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn7160_i2c/test.esp8266.yaml rename to tests/components/pn7160_i2c/test.esp8266-ard.yaml diff --git a/tests/components/pn7160_i2c/test.rp2040.yaml b/tests/components/pn7160_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn7160_i2c/test.rp2040.yaml rename to tests/components/pn7160_i2c/test.rp2040-ard.yaml diff --git a/tests/components/pn7160_spi/test.esp32.yaml b/tests/components/pn7160_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/pn7160_spi/test.esp32.yaml rename to tests/components/pn7160_spi/test.esp32-ard.yaml diff --git a/tests/components/pn7160_spi/test.esp32-c3.yaml b/tests/components/pn7160_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pn7160_spi/test.esp32-c3.yaml rename to tests/components/pn7160_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/pn7160_spi/test.esp8266.yaml b/tests/components/pn7160_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pn7160_spi/test.esp8266.yaml rename to tests/components/pn7160_spi/test.esp8266-ard.yaml diff --git a/tests/components/pn7160_spi/test.rp2040.yaml b/tests/components/pn7160_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pn7160_spi/test.rp2040.yaml rename to tests/components/pn7160_spi/test.rp2040-ard.yaml diff --git a/tests/components/power_supply/test.esp32-c3.yaml b/tests/components/power_supply/test.esp32-ard.yaml similarity index 100% rename from tests/components/power_supply/test.esp32-c3.yaml rename to tests/components/power_supply/test.esp32-ard.yaml diff --git a/tests/components/power_supply/test.esp32.yaml b/tests/components/power_supply/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/power_supply/test.esp32.yaml rename to tests/components/power_supply/test.esp32-c3-ard.yaml diff --git a/tests/components/power_supply/test.esp8266.yaml b/tests/components/power_supply/test.esp8266-ard.yaml similarity index 100% rename from tests/components/power_supply/test.esp8266.yaml rename to tests/components/power_supply/test.esp8266-ard.yaml diff --git a/tests/components/power_supply/test.rp2040.yaml b/tests/components/power_supply/test.rp2040-ard.yaml similarity index 100% rename from tests/components/power_supply/test.rp2040.yaml rename to tests/components/power_supply/test.rp2040-ard.yaml diff --git a/tests/components/prometheus/test.esp32-c3.yaml b/tests/components/prometheus/test.esp32-ard.yaml similarity index 100% rename from tests/components/prometheus/test.esp32-c3.yaml rename to tests/components/prometheus/test.esp32-ard.yaml diff --git a/tests/components/prometheus/test.esp32.yaml b/tests/components/prometheus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/prometheus/test.esp32.yaml rename to tests/components/prometheus/test.esp32-c3-ard.yaml diff --git a/tests/components/prometheus/test.esp8266.yaml b/tests/components/prometheus/test.esp8266-ard.yaml similarity index 100% rename from tests/components/prometheus/test.esp8266.yaml rename to tests/components/prometheus/test.esp8266-ard.yaml diff --git a/tests/components/psram/test.esp32-c3.yaml b/tests/components/psram/test.esp32-ard.yaml similarity index 100% rename from tests/components/psram/test.esp32-c3.yaml rename to tests/components/psram/test.esp32-ard.yaml diff --git a/tests/components/psram/test.esp32.yaml b/tests/components/psram/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/psram/test.esp32.yaml rename to tests/components/psram/test.esp32-c3-ard.yaml diff --git a/tests/components/pulse_counter/test.esp32-c3.yaml b/tests/components/pulse_counter/test.esp32-ard.yaml similarity index 100% rename from tests/components/pulse_counter/test.esp32-c3.yaml rename to tests/components/pulse_counter/test.esp32-ard.yaml diff --git a/tests/components/pulse_counter/test.esp32.yaml b/tests/components/pulse_counter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pulse_counter/test.esp32.yaml rename to tests/components/pulse_counter/test.esp32-c3-ard.yaml diff --git a/tests/components/pulse_counter/test.esp8266.yaml b/tests/components/pulse_counter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pulse_counter/test.esp8266.yaml rename to tests/components/pulse_counter/test.esp8266-ard.yaml diff --git a/tests/components/pulse_counter/test.rp2040.yaml b/tests/components/pulse_counter/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pulse_counter/test.rp2040.yaml rename to tests/components/pulse_counter/test.rp2040-ard.yaml diff --git a/tests/components/pulse_meter/test.esp32-c3.yaml b/tests/components/pulse_meter/test.esp32-ard.yaml similarity index 100% rename from tests/components/pulse_meter/test.esp32-c3.yaml rename to tests/components/pulse_meter/test.esp32-ard.yaml diff --git a/tests/components/pulse_meter/test.esp32.yaml b/tests/components/pulse_meter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pulse_meter/test.esp32.yaml rename to tests/components/pulse_meter/test.esp32-c3-ard.yaml diff --git a/tests/components/pulse_meter/test.esp8266.yaml b/tests/components/pulse_meter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pulse_meter/test.esp8266.yaml rename to tests/components/pulse_meter/test.esp8266-ard.yaml diff --git a/tests/components/pulse_meter/test.rp2040.yaml b/tests/components/pulse_meter/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pulse_meter/test.rp2040.yaml rename to tests/components/pulse_meter/test.rp2040-ard.yaml diff --git a/tests/components/pulse_width/test.esp32-c3.yaml b/tests/components/pulse_width/test.esp32-ard.yaml similarity index 100% rename from tests/components/pulse_width/test.esp32-c3.yaml rename to tests/components/pulse_width/test.esp32-ard.yaml diff --git a/tests/components/pulse_width/test.esp32.yaml b/tests/components/pulse_width/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pulse_width/test.esp32.yaml rename to tests/components/pulse_width/test.esp32-c3-ard.yaml diff --git a/tests/components/pulse_width/test.esp8266.yaml b/tests/components/pulse_width/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pulse_width/test.esp8266.yaml rename to tests/components/pulse_width/test.esp8266-ard.yaml diff --git a/tests/components/pulse_width/test.rp2040.yaml b/tests/components/pulse_width/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pulse_width/test.rp2040.yaml rename to tests/components/pulse_width/test.rp2040-ard.yaml diff --git a/tests/components/pvvx_mithermometer/test.esp32-c3.yaml b/tests/components/pvvx_mithermometer/test.esp32-ard.yaml similarity index 100% rename from tests/components/pvvx_mithermometer/test.esp32-c3.yaml rename to tests/components/pvvx_mithermometer/test.esp32-ard.yaml diff --git a/tests/components/pvvx_mithermometer/test.esp32.yaml b/tests/components/pvvx_mithermometer/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pvvx_mithermometer/test.esp32.yaml rename to tests/components/pvvx_mithermometer/test.esp32-c3-ard.yaml diff --git a/tests/components/pylontech/test.esp32.yaml b/tests/components/pylontech/test.esp32-ard.yaml similarity index 100% rename from tests/components/pylontech/test.esp32.yaml rename to tests/components/pylontech/test.esp32-ard.yaml diff --git a/tests/components/pylontech/test.esp32-c3.yaml b/tests/components/pylontech/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pylontech/test.esp32-c3.yaml rename to tests/components/pylontech/test.esp32-c3-ard.yaml diff --git a/tests/components/pylontech/test.esp8266.yaml b/tests/components/pylontech/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pylontech/test.esp8266.yaml rename to tests/components/pylontech/test.esp8266-ard.yaml diff --git a/tests/components/pylontech/test.rp2040.yaml b/tests/components/pylontech/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pylontech/test.rp2040.yaml rename to tests/components/pylontech/test.rp2040-ard.yaml diff --git a/tests/components/pzem004t/test.esp32.yaml b/tests/components/pzem004t/test.esp32-ard.yaml similarity index 100% rename from tests/components/pzem004t/test.esp32.yaml rename to tests/components/pzem004t/test.esp32-ard.yaml diff --git a/tests/components/pzem004t/test.esp32-c3.yaml b/tests/components/pzem004t/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pzem004t/test.esp32-c3.yaml rename to tests/components/pzem004t/test.esp32-c3-ard.yaml diff --git a/tests/components/pzem004t/test.esp8266.yaml b/tests/components/pzem004t/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pzem004t/test.esp8266.yaml rename to tests/components/pzem004t/test.esp8266-ard.yaml diff --git a/tests/components/pzem004t/test.rp2040.yaml b/tests/components/pzem004t/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pzem004t/test.rp2040.yaml rename to tests/components/pzem004t/test.rp2040-ard.yaml diff --git a/tests/components/pzemac/test.esp32.yaml b/tests/components/pzemac/test.esp32-ard.yaml similarity index 100% rename from tests/components/pzemac/test.esp32.yaml rename to tests/components/pzemac/test.esp32-ard.yaml diff --git a/tests/components/pzemac/test.esp32-c3.yaml b/tests/components/pzemac/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pzemac/test.esp32-c3.yaml rename to tests/components/pzemac/test.esp32-c3-ard.yaml diff --git a/tests/components/pzemac/test.esp8266.yaml b/tests/components/pzemac/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pzemac/test.esp8266.yaml rename to tests/components/pzemac/test.esp8266-ard.yaml diff --git a/tests/components/pzemac/test.rp2040.yaml b/tests/components/pzemac/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pzemac/test.rp2040.yaml rename to tests/components/pzemac/test.rp2040-ard.yaml diff --git a/tests/components/pzemdc/test.esp32.yaml b/tests/components/pzemdc/test.esp32-ard.yaml similarity index 100% rename from tests/components/pzemdc/test.esp32.yaml rename to tests/components/pzemdc/test.esp32-ard.yaml diff --git a/tests/components/pzemdc/test.esp32-c3.yaml b/tests/components/pzemdc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/pzemdc/test.esp32-c3.yaml rename to tests/components/pzemdc/test.esp32-c3-ard.yaml diff --git a/tests/components/pzemdc/test.esp8266.yaml b/tests/components/pzemdc/test.esp8266-ard.yaml similarity index 100% rename from tests/components/pzemdc/test.esp8266.yaml rename to tests/components/pzemdc/test.esp8266-ard.yaml diff --git a/tests/components/pzemdc/test.rp2040.yaml b/tests/components/pzemdc/test.rp2040-ard.yaml similarity index 100% rename from tests/components/pzemdc/test.rp2040.yaml rename to tests/components/pzemdc/test.rp2040-ard.yaml diff --git a/tests/components/qmc5883l/test.esp32.yaml b/tests/components/qmc5883l/test.esp32-ard.yaml similarity index 100% rename from tests/components/qmc5883l/test.esp32.yaml rename to tests/components/qmc5883l/test.esp32-ard.yaml diff --git a/tests/components/qmc5883l/test.esp32-c3.yaml b/tests/components/qmc5883l/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/qmc5883l/test.esp32-c3.yaml rename to tests/components/qmc5883l/test.esp32-c3-ard.yaml diff --git a/tests/components/qmc5883l/test.esp8266.yaml b/tests/components/qmc5883l/test.esp8266-ard.yaml similarity index 100% rename from tests/components/qmc5883l/test.esp8266.yaml rename to tests/components/qmc5883l/test.esp8266-ard.yaml diff --git a/tests/components/qmc5883l/test.rp2040.yaml b/tests/components/qmc5883l/test.rp2040-ard.yaml similarity index 100% rename from tests/components/qmc5883l/test.rp2040.yaml rename to tests/components/qmc5883l/test.rp2040-ard.yaml diff --git a/tests/components/qmp6988/test.esp32.yaml b/tests/components/qmp6988/test.esp32-ard.yaml similarity index 100% rename from tests/components/qmp6988/test.esp32.yaml rename to tests/components/qmp6988/test.esp32-ard.yaml diff --git a/tests/components/qmp6988/test.esp32-c3.yaml b/tests/components/qmp6988/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/qmp6988/test.esp32-c3.yaml rename to tests/components/qmp6988/test.esp32-c3-ard.yaml diff --git a/tests/components/qmp6988/test.esp8266.yaml b/tests/components/qmp6988/test.esp8266-ard.yaml similarity index 100% rename from tests/components/qmp6988/test.esp8266.yaml rename to tests/components/qmp6988/test.esp8266-ard.yaml diff --git a/tests/components/qmp6988/test.rp2040.yaml b/tests/components/qmp6988/test.rp2040-ard.yaml similarity index 100% rename from tests/components/qmp6988/test.rp2040.yaml rename to tests/components/qmp6988/test.rp2040-ard.yaml diff --git a/tests/components/qr_code/test.esp32.yaml b/tests/components/qr_code/test.esp32-ard.yaml similarity index 100% rename from tests/components/qr_code/test.esp32.yaml rename to tests/components/qr_code/test.esp32-ard.yaml diff --git a/tests/components/qr_code/test.esp32-c3.yaml b/tests/components/qr_code/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/qr_code/test.esp32-c3.yaml rename to tests/components/qr_code/test.esp32-c3-ard.yaml diff --git a/tests/components/qr_code/test.esp8266.yaml b/tests/components/qr_code/test.esp8266-ard.yaml similarity index 100% rename from tests/components/qr_code/test.esp8266.yaml rename to tests/components/qr_code/test.esp8266-ard.yaml diff --git a/tests/components/qr_code/test.rp2040.yaml b/tests/components/qr_code/test.rp2040-ard.yaml similarity index 100% rename from tests/components/qr_code/test.rp2040.yaml rename to tests/components/qr_code/test.rp2040-ard.yaml diff --git a/tests/components/qwiic_pir/test.esp32.yaml b/tests/components/qwiic_pir/test.esp32-ard.yaml similarity index 100% rename from tests/components/qwiic_pir/test.esp32.yaml rename to tests/components/qwiic_pir/test.esp32-ard.yaml diff --git a/tests/components/qwiic_pir/test.esp32-c3.yaml b/tests/components/qwiic_pir/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/qwiic_pir/test.esp32-c3.yaml rename to tests/components/qwiic_pir/test.esp32-c3-ard.yaml diff --git a/tests/components/qwiic_pir/test.esp8266.yaml b/tests/components/qwiic_pir/test.esp8266-ard.yaml similarity index 100% rename from tests/components/qwiic_pir/test.esp8266.yaml rename to tests/components/qwiic_pir/test.esp8266-ard.yaml diff --git a/tests/components/qwiic_pir/test.rp2040.yaml b/tests/components/qwiic_pir/test.rp2040-ard.yaml similarity index 100% rename from tests/components/qwiic_pir/test.rp2040.yaml rename to tests/components/qwiic_pir/test.rp2040-ard.yaml diff --git a/tests/components/radon_eye_ble/test.esp32-c3.yaml b/tests/components/radon_eye_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/radon_eye_ble/test.esp32-c3.yaml rename to tests/components/radon_eye_ble/test.esp32-ard.yaml diff --git a/tests/components/radon_eye_ble/test.esp32.yaml b/tests/components/radon_eye_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/radon_eye_ble/test.esp32.yaml rename to tests/components/radon_eye_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/radon_eye_rd200/test.esp32-c3.yaml b/tests/components/radon_eye_rd200/test.esp32-ard.yaml similarity index 100% rename from tests/components/radon_eye_rd200/test.esp32-c3.yaml rename to tests/components/radon_eye_rd200/test.esp32-ard.yaml diff --git a/tests/components/radon_eye_rd200/test.esp32.yaml b/tests/components/radon_eye_rd200/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/radon_eye_rd200/test.esp32.yaml rename to tests/components/radon_eye_rd200/test.esp32-c3-ard.yaml diff --git a/tests/components/rc522_i2c/test.esp32.yaml b/tests/components/rc522_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/rc522_i2c/test.esp32.yaml rename to tests/components/rc522_i2c/test.esp32-ard.yaml diff --git a/tests/components/rc522_i2c/test.esp32-c3.yaml b/tests/components/rc522_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rc522_i2c/test.esp32-c3.yaml rename to tests/components/rc522_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/rc522_i2c/test.esp8266.yaml b/tests/components/rc522_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rc522_i2c/test.esp8266.yaml rename to tests/components/rc522_i2c/test.esp8266-ard.yaml diff --git a/tests/components/rc522_i2c/test.rp2040.yaml b/tests/components/rc522_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rc522_i2c/test.rp2040.yaml rename to tests/components/rc522_i2c/test.rp2040-ard.yaml diff --git a/tests/components/rc522_spi/test.esp32.yaml b/tests/components/rc522_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/rc522_spi/test.esp32.yaml rename to tests/components/rc522_spi/test.esp32-ard.yaml diff --git a/tests/components/rc522_spi/test.esp32-c3.yaml b/tests/components/rc522_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rc522_spi/test.esp32-c3.yaml rename to tests/components/rc522_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/rc522_spi/test.esp8266.yaml b/tests/components/rc522_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rc522_spi/test.esp8266.yaml rename to tests/components/rc522_spi/test.esp8266-ard.yaml diff --git a/tests/components/rc522_spi/test.rp2040.yaml b/tests/components/rc522_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rc522_spi/test.rp2040.yaml rename to tests/components/rc522_spi/test.rp2040-ard.yaml diff --git a/tests/components/rdm6300/test.esp32.yaml b/tests/components/rdm6300/test.esp32-ard.yaml similarity index 100% rename from tests/components/rdm6300/test.esp32.yaml rename to tests/components/rdm6300/test.esp32-ard.yaml diff --git a/tests/components/rdm6300/test.esp32-c3.yaml b/tests/components/rdm6300/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rdm6300/test.esp32-c3.yaml rename to tests/components/rdm6300/test.esp32-c3-ard.yaml diff --git a/tests/components/rdm6300/test.esp8266.yaml b/tests/components/rdm6300/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rdm6300/test.esp8266.yaml rename to tests/components/rdm6300/test.esp8266-ard.yaml diff --git a/tests/components/rdm6300/test.rp2040.yaml b/tests/components/rdm6300/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rdm6300/test.rp2040.yaml rename to tests/components/rdm6300/test.rp2040-ard.yaml diff --git a/tests/components/remote_receiver/test.esp32-c3.yaml b/tests/components/remote_receiver/test.esp32-ard.yaml similarity index 100% rename from tests/components/remote_receiver/test.esp32-c3.yaml rename to tests/components/remote_receiver/test.esp32-ard.yaml diff --git a/tests/components/remote_receiver/test.esp32.yaml b/tests/components/remote_receiver/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/remote_receiver/test.esp32.yaml rename to tests/components/remote_receiver/test.esp32-c3-ard.yaml diff --git a/tests/components/remote_receiver/test.esp8266.yaml b/tests/components/remote_receiver/test.esp8266-ard.yaml similarity index 100% rename from tests/components/remote_receiver/test.esp8266.yaml rename to tests/components/remote_receiver/test.esp8266-ard.yaml diff --git a/tests/components/remote_transmitter/test.esp32.yaml b/tests/components/remote_transmitter/test.esp32-ard.yaml similarity index 100% rename from tests/components/remote_transmitter/test.esp32.yaml rename to tests/components/remote_transmitter/test.esp32-ard.yaml diff --git a/tests/components/remote_transmitter/test.esp32-c3.yaml b/tests/components/remote_transmitter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/remote_transmitter/test.esp32-c3.yaml rename to tests/components/remote_transmitter/test.esp32-c3-ard.yaml diff --git a/tests/components/remote_transmitter/test.esp8266.yaml b/tests/components/remote_transmitter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/remote_transmitter/test.esp8266.yaml rename to tests/components/remote_transmitter/test.esp8266-ard.yaml diff --git a/tests/components/resistance/test.esp32.yaml b/tests/components/resistance/test.esp32-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp32.yaml rename to tests/components/resistance/test.esp32-ard.yaml diff --git a/tests/components/resistance/test.esp32-c3.yaml b/tests/components/resistance/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp32-c3.yaml rename to tests/components/resistance/test.esp32-c3-ard.yaml diff --git a/tests/components/resistance/test.esp32-s2.yaml b/tests/components/resistance/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp32-s2.yaml rename to tests/components/resistance/test.esp32-s2-ard.yaml diff --git a/tests/components/resistance/test.esp32-s3.yaml b/tests/components/resistance/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp32-s3.yaml rename to tests/components/resistance/test.esp32-s3-ard.yaml diff --git a/tests/components/resistance/test.esp8266.yaml b/tests/components/resistance/test.esp8266-ard.yaml similarity index 100% rename from tests/components/resistance/test.esp8266.yaml rename to tests/components/resistance/test.esp8266-ard.yaml diff --git a/tests/components/resistance/test.rp2040.yaml b/tests/components/resistance/test.rp2040-ard.yaml similarity index 100% rename from tests/components/resistance/test.rp2040.yaml rename to tests/components/resistance/test.rp2040-ard.yaml diff --git a/tests/components/restart/test.esp32-c3.yaml b/tests/components/restart/test.esp32-ard.yaml similarity index 100% rename from tests/components/restart/test.esp32-c3.yaml rename to tests/components/restart/test.esp32-ard.yaml diff --git a/tests/components/restart/test.esp32.yaml b/tests/components/restart/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/restart/test.esp32.yaml rename to tests/components/restart/test.esp32-c3-ard.yaml diff --git a/tests/components/restart/test.esp8266.yaml b/tests/components/restart/test.esp8266-ard.yaml similarity index 100% rename from tests/components/restart/test.esp8266.yaml rename to tests/components/restart/test.esp8266-ard.yaml diff --git a/tests/components/restart/test.rp2040.yaml b/tests/components/restart/test.rp2040-ard.yaml similarity index 100% rename from tests/components/restart/test.rp2040.yaml rename to tests/components/restart/test.rp2040-ard.yaml diff --git a/tests/components/rf_bridge/test.esp32.yaml b/tests/components/rf_bridge/test.esp32-ard.yaml similarity index 100% rename from tests/components/rf_bridge/test.esp32.yaml rename to tests/components/rf_bridge/test.esp32-ard.yaml diff --git a/tests/components/rf_bridge/test.esp32-c3.yaml b/tests/components/rf_bridge/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rf_bridge/test.esp32-c3.yaml rename to tests/components/rf_bridge/test.esp32-c3-ard.yaml diff --git a/tests/components/rf_bridge/test.esp8266.yaml b/tests/components/rf_bridge/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rf_bridge/test.esp8266.yaml rename to tests/components/rf_bridge/test.esp8266-ard.yaml diff --git a/tests/components/rf_bridge/test.rp2040.yaml b/tests/components/rf_bridge/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rf_bridge/test.rp2040.yaml rename to tests/components/rf_bridge/test.rp2040-ard.yaml diff --git a/tests/components/rgb/test.esp32.yaml b/tests/components/rgb/test.esp32-ard.yaml similarity index 100% rename from tests/components/rgb/test.esp32.yaml rename to tests/components/rgb/test.esp32-ard.yaml diff --git a/tests/components/rgb/test.esp32-c3.yaml b/tests/components/rgb/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rgb/test.esp32-c3.yaml rename to tests/components/rgb/test.esp32-c3-ard.yaml diff --git a/tests/components/rgb/test.esp8266.yaml b/tests/components/rgb/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rgb/test.esp8266.yaml rename to tests/components/rgb/test.esp8266-ard.yaml diff --git a/tests/components/rgb/test.rp2040.yaml b/tests/components/rgb/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rgb/test.rp2040.yaml rename to tests/components/rgb/test.rp2040-ard.yaml diff --git a/tests/components/rgbct/test.esp32.yaml b/tests/components/rgbct/test.esp32-ard.yaml similarity index 100% rename from tests/components/rgbct/test.esp32.yaml rename to tests/components/rgbct/test.esp32-ard.yaml diff --git a/tests/components/rgbct/test.esp32-c3.yaml b/tests/components/rgbct/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rgbct/test.esp32-c3.yaml rename to tests/components/rgbct/test.esp32-c3-ard.yaml diff --git a/tests/components/rgbct/test.esp8266.yaml b/tests/components/rgbct/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rgbct/test.esp8266.yaml rename to tests/components/rgbct/test.esp8266-ard.yaml diff --git a/tests/components/rgbct/test.rp2040.yaml b/tests/components/rgbct/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rgbct/test.rp2040.yaml rename to tests/components/rgbct/test.rp2040-ard.yaml diff --git a/tests/components/rgbw/test.esp32.yaml b/tests/components/rgbw/test.esp32-ard.yaml similarity index 100% rename from tests/components/rgbw/test.esp32.yaml rename to tests/components/rgbw/test.esp32-ard.yaml diff --git a/tests/components/rgbw/test.esp32-c3.yaml b/tests/components/rgbw/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rgbw/test.esp32-c3.yaml rename to tests/components/rgbw/test.esp32-c3-ard.yaml diff --git a/tests/components/rgbw/test.esp8266.yaml b/tests/components/rgbw/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rgbw/test.esp8266.yaml rename to tests/components/rgbw/test.esp8266-ard.yaml diff --git a/tests/components/rgbw/test.rp2040.yaml b/tests/components/rgbw/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rgbw/test.rp2040.yaml rename to tests/components/rgbw/test.rp2040-ard.yaml diff --git a/tests/components/rgbww/test.esp32.yaml b/tests/components/rgbww/test.esp32-ard.yaml similarity index 100% rename from tests/components/rgbww/test.esp32.yaml rename to tests/components/rgbww/test.esp32-ard.yaml diff --git a/tests/components/rgbww/test.esp32-c3.yaml b/tests/components/rgbww/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rgbww/test.esp32-c3.yaml rename to tests/components/rgbww/test.esp32-c3-ard.yaml diff --git a/tests/components/rgbww/test.esp8266.yaml b/tests/components/rgbww/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rgbww/test.esp8266.yaml rename to tests/components/rgbww/test.esp8266-ard.yaml diff --git a/tests/components/rgbww/test.rp2040.yaml b/tests/components/rgbww/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rgbww/test.rp2040.yaml rename to tests/components/rgbww/test.rp2040-ard.yaml diff --git a/tests/components/rotary_encoder/test.esp32.yaml b/tests/components/rotary_encoder/test.esp32-ard.yaml similarity index 100% rename from tests/components/rotary_encoder/test.esp32.yaml rename to tests/components/rotary_encoder/test.esp32-ard.yaml diff --git a/tests/components/rotary_encoder/test.esp32-c3.yaml b/tests/components/rotary_encoder/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rotary_encoder/test.esp32-c3.yaml rename to tests/components/rotary_encoder/test.esp32-c3-ard.yaml diff --git a/tests/components/rotary_encoder/test.esp8266.yaml b/tests/components/rotary_encoder/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rotary_encoder/test.esp8266.yaml rename to tests/components/rotary_encoder/test.esp8266-ard.yaml diff --git a/tests/components/rotary_encoder/test.rp2040.yaml b/tests/components/rotary_encoder/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rotary_encoder/test.rp2040.yaml rename to tests/components/rotary_encoder/test.rp2040-ard.yaml diff --git a/tests/components/rp2040_pio_led_strip/test.rp2040.yaml b/tests/components/rp2040_pio_led_strip/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rp2040_pio_led_strip/test.rp2040.yaml rename to tests/components/rp2040_pio_led_strip/test.rp2040-ard.yaml diff --git a/tests/components/rp2040_pwm/test.rp2040.yaml b/tests/components/rp2040_pwm/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rp2040_pwm/test.rp2040.yaml rename to tests/components/rp2040_pwm/test.rp2040-ard.yaml diff --git a/tests/components/rtttl/test.esp32.yaml b/tests/components/rtttl/test.esp32-ard.yaml similarity index 100% rename from tests/components/rtttl/test.esp32.yaml rename to tests/components/rtttl/test.esp32-ard.yaml diff --git a/tests/components/rtttl/test.esp32-c3.yaml b/tests/components/rtttl/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/rtttl/test.esp32-c3.yaml rename to tests/components/rtttl/test.esp32-c3-ard.yaml diff --git a/tests/components/rtttl/test.esp8266.yaml b/tests/components/rtttl/test.esp8266-ard.yaml similarity index 100% rename from tests/components/rtttl/test.esp8266.yaml rename to tests/components/rtttl/test.esp8266-ard.yaml diff --git a/tests/components/rtttl/test.rp2040.yaml b/tests/components/rtttl/test.rp2040-ard.yaml similarity index 100% rename from tests/components/rtttl/test.rp2040.yaml rename to tests/components/rtttl/test.rp2040-ard.yaml diff --git a/tests/components/ruuvi_ble/test.esp32-c3.yaml b/tests/components/ruuvi_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/ruuvi_ble/test.esp32-c3.yaml rename to tests/components/ruuvi_ble/test.esp32-ard.yaml diff --git a/tests/components/ruuvi_ble/test.esp32.yaml b/tests/components/ruuvi_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ruuvi_ble/test.esp32.yaml rename to tests/components/ruuvi_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/ruuvitag/test.esp32-c3.yaml b/tests/components/ruuvitag/test.esp32-ard.yaml similarity index 100% rename from tests/components/ruuvitag/test.esp32-c3.yaml rename to tests/components/ruuvitag/test.esp32-ard.yaml diff --git a/tests/components/ruuvitag/test.esp32.yaml b/tests/components/ruuvitag/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ruuvitag/test.esp32.yaml rename to tests/components/ruuvitag/test.esp32-c3-ard.yaml diff --git a/tests/components/safe_mode/test.esp32-c3.yaml b/tests/components/safe_mode/test.esp32-ard.yaml similarity index 100% rename from tests/components/safe_mode/test.esp32-c3.yaml rename to tests/components/safe_mode/test.esp32-ard.yaml diff --git a/tests/components/safe_mode/test.esp32.yaml b/tests/components/safe_mode/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/safe_mode/test.esp32.yaml rename to tests/components/safe_mode/test.esp32-c3-ard.yaml diff --git a/tests/components/safe_mode/test.esp8266.yaml b/tests/components/safe_mode/test.esp8266-ard.yaml similarity index 100% rename from tests/components/safe_mode/test.esp8266.yaml rename to tests/components/safe_mode/test.esp8266-ard.yaml diff --git a/tests/components/safe_mode/test.rp2040.yaml b/tests/components/safe_mode/test.rp2040-ard.yaml similarity index 100% rename from tests/components/safe_mode/test.rp2040.yaml rename to tests/components/safe_mode/test.rp2040-ard.yaml diff --git a/tests/components/scd30/test.esp32.yaml b/tests/components/scd30/test.esp32-ard.yaml similarity index 100% rename from tests/components/scd30/test.esp32.yaml rename to tests/components/scd30/test.esp32-ard.yaml diff --git a/tests/components/scd30/test.esp32-c3.yaml b/tests/components/scd30/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/scd30/test.esp32-c3.yaml rename to tests/components/scd30/test.esp32-c3-ard.yaml diff --git a/tests/components/scd30/test.esp8266.yaml b/tests/components/scd30/test.esp8266-ard.yaml similarity index 100% rename from tests/components/scd30/test.esp8266.yaml rename to tests/components/scd30/test.esp8266-ard.yaml diff --git a/tests/components/scd30/test.rp2040.yaml b/tests/components/scd30/test.rp2040-ard.yaml similarity index 100% rename from tests/components/scd30/test.rp2040.yaml rename to tests/components/scd30/test.rp2040-ard.yaml diff --git a/tests/components/scd4x/test.esp32.yaml b/tests/components/scd4x/test.esp32-ard.yaml similarity index 100% rename from tests/components/scd4x/test.esp32.yaml rename to tests/components/scd4x/test.esp32-ard.yaml diff --git a/tests/components/scd4x/test.esp32-c3.yaml b/tests/components/scd4x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/scd4x/test.esp32-c3.yaml rename to tests/components/scd4x/test.esp32-c3-ard.yaml diff --git a/tests/components/scd4x/test.esp8266.yaml b/tests/components/scd4x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/scd4x/test.esp8266.yaml rename to tests/components/scd4x/test.esp8266-ard.yaml diff --git a/tests/components/scd4x/test.rp2040.yaml b/tests/components/scd4x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/scd4x/test.rp2040.yaml rename to tests/components/scd4x/test.rp2040-ard.yaml diff --git a/tests/components/script/test.bk72xx.yaml b/tests/components/script/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/script/test.bk72xx.yaml rename to tests/components/script/test.bk72xx-ard.yaml diff --git a/tests/components/script/test.esp32-c3.yaml b/tests/components/script/test.esp32-ard.yaml similarity index 100% rename from tests/components/script/test.esp32-c3.yaml rename to tests/components/script/test.esp32-ard.yaml diff --git a/tests/components/script/test.esp32.yaml b/tests/components/script/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/script/test.esp32.yaml rename to tests/components/script/test.esp32-c3-ard.yaml diff --git a/tests/components/script/test.esp8266.yaml b/tests/components/script/test.esp8266-ard.yaml similarity index 100% rename from tests/components/script/test.esp8266.yaml rename to tests/components/script/test.esp8266-ard.yaml diff --git a/tests/components/script/test.rp2040.yaml b/tests/components/script/test.rp2040-ard.yaml similarity index 100% rename from tests/components/script/test.rp2040.yaml rename to tests/components/script/test.rp2040-ard.yaml diff --git a/tests/components/sdm_meter/test.esp32.yaml b/tests/components/sdm_meter/test.esp32-ard.yaml similarity index 100% rename from tests/components/sdm_meter/test.esp32.yaml rename to tests/components/sdm_meter/test.esp32-ard.yaml diff --git a/tests/components/sdm_meter/test.esp32-c3.yaml b/tests/components/sdm_meter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sdm_meter/test.esp32-c3.yaml rename to tests/components/sdm_meter/test.esp32-c3-ard.yaml diff --git a/tests/components/sdm_meter/test.esp8266.yaml b/tests/components/sdm_meter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sdm_meter/test.esp8266.yaml rename to tests/components/sdm_meter/test.esp8266-ard.yaml diff --git a/tests/components/sdm_meter/test.rp2040.yaml b/tests/components/sdm_meter/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sdm_meter/test.rp2040.yaml rename to tests/components/sdm_meter/test.rp2040-ard.yaml diff --git a/tests/components/sdp3x/test.esp32.yaml b/tests/components/sdp3x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sdp3x/test.esp32.yaml rename to tests/components/sdp3x/test.esp32-ard.yaml diff --git a/tests/components/sdp3x/test.esp32-c3.yaml b/tests/components/sdp3x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sdp3x/test.esp32-c3.yaml rename to tests/components/sdp3x/test.esp32-c3-ard.yaml diff --git a/tests/components/sdp3x/test.esp8266.yaml b/tests/components/sdp3x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sdp3x/test.esp8266.yaml rename to tests/components/sdp3x/test.esp8266-ard.yaml diff --git a/tests/components/sdp3x/test.rp2040.yaml b/tests/components/sdp3x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sdp3x/test.rp2040.yaml rename to tests/components/sdp3x/test.rp2040-ard.yaml diff --git a/tests/components/sds011/test.esp32.yaml b/tests/components/sds011/test.esp32-ard.yaml similarity index 100% rename from tests/components/sds011/test.esp32.yaml rename to tests/components/sds011/test.esp32-ard.yaml diff --git a/tests/components/sds011/test.esp32-c3.yaml b/tests/components/sds011/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sds011/test.esp32-c3.yaml rename to tests/components/sds011/test.esp32-c3-ard.yaml diff --git a/tests/components/sds011/test.esp8266.yaml b/tests/components/sds011/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sds011/test.esp8266.yaml rename to tests/components/sds011/test.esp8266-ard.yaml diff --git a/tests/components/sds011/test.rp2040.yaml b/tests/components/sds011/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sds011/test.rp2040.yaml rename to tests/components/sds011/test.rp2040-ard.yaml diff --git a/tests/components/seeed_mr24hpc1/test.esp32-c3.yaml b/tests/components/seeed_mr24hpc1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/seeed_mr24hpc1/test.esp32-c3.yaml rename to tests/components/seeed_mr24hpc1/test.esp32-c3-ard.yaml diff --git a/tests/components/selec_meter/test.esp32.yaml b/tests/components/selec_meter/test.esp32-ard.yaml similarity index 100% rename from tests/components/selec_meter/test.esp32.yaml rename to tests/components/selec_meter/test.esp32-ard.yaml diff --git a/tests/components/selec_meter/test.esp32-c3.yaml b/tests/components/selec_meter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/selec_meter/test.esp32-c3.yaml rename to tests/components/selec_meter/test.esp32-c3-ard.yaml diff --git a/tests/components/selec_meter/test.esp8266.yaml b/tests/components/selec_meter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/selec_meter/test.esp8266.yaml rename to tests/components/selec_meter/test.esp8266-ard.yaml diff --git a/tests/components/selec_meter/test.rp2040.yaml b/tests/components/selec_meter/test.rp2040-ard.yaml similarity index 100% rename from tests/components/selec_meter/test.rp2040.yaml rename to tests/components/selec_meter/test.rp2040-ard.yaml diff --git a/tests/components/sen0321/test.esp32.yaml b/tests/components/sen0321/test.esp32-ard.yaml similarity index 100% rename from tests/components/sen0321/test.esp32.yaml rename to tests/components/sen0321/test.esp32-ard.yaml diff --git a/tests/components/sen0321/test.esp32-c3.yaml b/tests/components/sen0321/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sen0321/test.esp32-c3.yaml rename to tests/components/sen0321/test.esp32-c3-ard.yaml diff --git a/tests/components/sen0321/test.esp8266.yaml b/tests/components/sen0321/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sen0321/test.esp8266.yaml rename to tests/components/sen0321/test.esp8266-ard.yaml diff --git a/tests/components/sen0321/test.rp2040.yaml b/tests/components/sen0321/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sen0321/test.rp2040.yaml rename to tests/components/sen0321/test.rp2040-ard.yaml diff --git a/tests/components/sen21231/test.esp32.yaml b/tests/components/sen21231/test.esp32-ard.yaml similarity index 100% rename from tests/components/sen21231/test.esp32.yaml rename to tests/components/sen21231/test.esp32-ard.yaml diff --git a/tests/components/sen21231/test.esp32-c3.yaml b/tests/components/sen21231/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sen21231/test.esp32-c3.yaml rename to tests/components/sen21231/test.esp32-c3-ard.yaml diff --git a/tests/components/sen21231/test.esp8266.yaml b/tests/components/sen21231/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sen21231/test.esp8266.yaml rename to tests/components/sen21231/test.esp8266-ard.yaml diff --git a/tests/components/sen21231/test.rp2040.yaml b/tests/components/sen21231/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sen21231/test.rp2040.yaml rename to tests/components/sen21231/test.rp2040-ard.yaml diff --git a/tests/components/sen5x/test.esp32.yaml b/tests/components/sen5x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sen5x/test.esp32.yaml rename to tests/components/sen5x/test.esp32-ard.yaml diff --git a/tests/components/sen5x/test.esp32-c3.yaml b/tests/components/sen5x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sen5x/test.esp32-c3.yaml rename to tests/components/sen5x/test.esp32-c3-ard.yaml diff --git a/tests/components/sen5x/test.esp8266.yaml b/tests/components/sen5x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sen5x/test.esp8266.yaml rename to tests/components/sen5x/test.esp8266-ard.yaml diff --git a/tests/components/sen5x/test.rp2040.yaml b/tests/components/sen5x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sen5x/test.rp2040.yaml rename to tests/components/sen5x/test.rp2040-ard.yaml diff --git a/tests/components/senseair/test.esp32.yaml b/tests/components/senseair/test.esp32-ard.yaml similarity index 100% rename from tests/components/senseair/test.esp32.yaml rename to tests/components/senseair/test.esp32-ard.yaml diff --git a/tests/components/senseair/test.esp32-c3.yaml b/tests/components/senseair/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/senseair/test.esp32-c3.yaml rename to tests/components/senseair/test.esp32-c3-ard.yaml diff --git a/tests/components/senseair/test.esp8266.yaml b/tests/components/senseair/test.esp8266-ard.yaml similarity index 100% rename from tests/components/senseair/test.esp8266.yaml rename to tests/components/senseair/test.esp8266-ard.yaml diff --git a/tests/components/senseair/test.rp2040.yaml b/tests/components/senseair/test.rp2040-ard.yaml similarity index 100% rename from tests/components/senseair/test.rp2040.yaml rename to tests/components/senseair/test.rp2040-ard.yaml diff --git a/tests/components/servo/test.esp32.yaml b/tests/components/servo/test.esp32-ard.yaml similarity index 100% rename from tests/components/servo/test.esp32.yaml rename to tests/components/servo/test.esp32-ard.yaml diff --git a/tests/components/servo/test.esp32-c3.yaml b/tests/components/servo/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/servo/test.esp32-c3.yaml rename to tests/components/servo/test.esp32-c3-ard.yaml diff --git a/tests/components/servo/test.esp8266.yaml b/tests/components/servo/test.esp8266-ard.yaml similarity index 100% rename from tests/components/servo/test.esp8266.yaml rename to tests/components/servo/test.esp8266-ard.yaml diff --git a/tests/components/servo/test.rp2040.yaml b/tests/components/servo/test.rp2040-ard.yaml similarity index 100% rename from tests/components/servo/test.rp2040.yaml rename to tests/components/servo/test.rp2040-ard.yaml diff --git a/tests/components/sfa30/test.esp32.yaml b/tests/components/sfa30/test.esp32-ard.yaml similarity index 100% rename from tests/components/sfa30/test.esp32.yaml rename to tests/components/sfa30/test.esp32-ard.yaml diff --git a/tests/components/sfa30/test.esp32-c3.yaml b/tests/components/sfa30/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sfa30/test.esp32-c3.yaml rename to tests/components/sfa30/test.esp32-c3-ard.yaml diff --git a/tests/components/sfa30/test.esp8266.yaml b/tests/components/sfa30/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sfa30/test.esp8266.yaml rename to tests/components/sfa30/test.esp8266-ard.yaml diff --git a/tests/components/sfa30/test.rp2040.yaml b/tests/components/sfa30/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sfa30/test.rp2040.yaml rename to tests/components/sfa30/test.rp2040-ard.yaml diff --git a/tests/components/sgp30/test.esp32.yaml b/tests/components/sgp30/test.esp32-ard.yaml similarity index 100% rename from tests/components/sgp30/test.esp32.yaml rename to tests/components/sgp30/test.esp32-ard.yaml diff --git a/tests/components/sgp30/test.esp32-c3.yaml b/tests/components/sgp30/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sgp30/test.esp32-c3.yaml rename to tests/components/sgp30/test.esp32-c3-ard.yaml diff --git a/tests/components/sgp30/test.esp8266.yaml b/tests/components/sgp30/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sgp30/test.esp8266.yaml rename to tests/components/sgp30/test.esp8266-ard.yaml diff --git a/tests/components/sgp30/test.rp2040.yaml b/tests/components/sgp30/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sgp30/test.rp2040.yaml rename to tests/components/sgp30/test.rp2040-ard.yaml diff --git a/tests/components/sgp4x/test.esp32.yaml b/tests/components/sgp4x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sgp4x/test.esp32.yaml rename to tests/components/sgp4x/test.esp32-ard.yaml diff --git a/tests/components/sgp4x/test.esp32-c3.yaml b/tests/components/sgp4x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sgp4x/test.esp32-c3.yaml rename to tests/components/sgp4x/test.esp32-c3-ard.yaml diff --git a/tests/components/sgp4x/test.esp8266.yaml b/tests/components/sgp4x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sgp4x/test.esp8266.yaml rename to tests/components/sgp4x/test.esp8266-ard.yaml diff --git a/tests/components/sgp4x/test.rp2040.yaml b/tests/components/sgp4x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sgp4x/test.rp2040.yaml rename to tests/components/sgp4x/test.rp2040-ard.yaml diff --git a/tests/components/shelly_dimmer/test.esp8266.yaml b/tests/components/shelly_dimmer/test.esp8266-ard.yaml similarity index 100% rename from tests/components/shelly_dimmer/test.esp8266.yaml rename to tests/components/shelly_dimmer/test.esp8266-ard.yaml diff --git a/tests/components/sht3xd/test.esp32.yaml b/tests/components/sht3xd/test.esp32-ard.yaml similarity index 100% rename from tests/components/sht3xd/test.esp32.yaml rename to tests/components/sht3xd/test.esp32-ard.yaml diff --git a/tests/components/sht3xd/test.esp32-c3.yaml b/tests/components/sht3xd/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sht3xd/test.esp32-c3.yaml rename to tests/components/sht3xd/test.esp32-c3-ard.yaml diff --git a/tests/components/sht3xd/test.esp8266.yaml b/tests/components/sht3xd/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sht3xd/test.esp8266.yaml rename to tests/components/sht3xd/test.esp8266-ard.yaml diff --git a/tests/components/sht3xd/test.rp2040.yaml b/tests/components/sht3xd/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sht3xd/test.rp2040.yaml rename to tests/components/sht3xd/test.rp2040-ard.yaml diff --git a/tests/components/sht4x/test.esp32.yaml b/tests/components/sht4x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sht4x/test.esp32.yaml rename to tests/components/sht4x/test.esp32-ard.yaml diff --git a/tests/components/sht4x/test.esp32-c3.yaml b/tests/components/sht4x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sht4x/test.esp32-c3.yaml rename to tests/components/sht4x/test.esp32-c3-ard.yaml diff --git a/tests/components/sht4x/test.esp8266.yaml b/tests/components/sht4x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sht4x/test.esp8266.yaml rename to tests/components/sht4x/test.esp8266-ard.yaml diff --git a/tests/components/sht4x/test.rp2040.yaml b/tests/components/sht4x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sht4x/test.rp2040.yaml rename to tests/components/sht4x/test.rp2040-ard.yaml diff --git a/tests/components/shtcx/test.esp32.yaml b/tests/components/shtcx/test.esp32-ard.yaml similarity index 100% rename from tests/components/shtcx/test.esp32.yaml rename to tests/components/shtcx/test.esp32-ard.yaml diff --git a/tests/components/shtcx/test.esp32-c3.yaml b/tests/components/shtcx/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/shtcx/test.esp32-c3.yaml rename to tests/components/shtcx/test.esp32-c3-ard.yaml diff --git a/tests/components/shtcx/test.esp8266.yaml b/tests/components/shtcx/test.esp8266-ard.yaml similarity index 100% rename from tests/components/shtcx/test.esp8266.yaml rename to tests/components/shtcx/test.esp8266-ard.yaml diff --git a/tests/components/shtcx/test.rp2040.yaml b/tests/components/shtcx/test.rp2040-ard.yaml similarity index 100% rename from tests/components/shtcx/test.rp2040.yaml rename to tests/components/shtcx/test.rp2040-ard.yaml diff --git a/tests/components/shutdown/test.esp32-c3.yaml b/tests/components/shutdown/test.esp32-ard.yaml similarity index 100% rename from tests/components/shutdown/test.esp32-c3.yaml rename to tests/components/shutdown/test.esp32-ard.yaml diff --git a/tests/components/shutdown/test.esp32.yaml b/tests/components/shutdown/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/shutdown/test.esp32.yaml rename to tests/components/shutdown/test.esp32-c3-ard.yaml diff --git a/tests/components/shutdown/test.esp8266.yaml b/tests/components/shutdown/test.esp8266-ard.yaml similarity index 100% rename from tests/components/shutdown/test.esp8266.yaml rename to tests/components/shutdown/test.esp8266-ard.yaml diff --git a/tests/components/shutdown/test.rp2040.yaml b/tests/components/shutdown/test.rp2040-ard.yaml similarity index 100% rename from tests/components/shutdown/test.rp2040.yaml rename to tests/components/shutdown/test.rp2040-ard.yaml diff --git a/tests/components/sigma_delta_output/test.esp32-c3.yaml b/tests/components/sigma_delta_output/test.esp32-ard.yaml similarity index 100% rename from tests/components/sigma_delta_output/test.esp32-c3.yaml rename to tests/components/sigma_delta_output/test.esp32-ard.yaml diff --git a/tests/components/sigma_delta_output/test.esp32.yaml b/tests/components/sigma_delta_output/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sigma_delta_output/test.esp32.yaml rename to tests/components/sigma_delta_output/test.esp32-c3-ard.yaml diff --git a/tests/components/sigma_delta_output/test.esp8266.yaml b/tests/components/sigma_delta_output/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sigma_delta_output/test.esp8266.yaml rename to tests/components/sigma_delta_output/test.esp8266-ard.yaml diff --git a/tests/components/sigma_delta_output/test.rp2040.yaml b/tests/components/sigma_delta_output/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sigma_delta_output/test.rp2040.yaml rename to tests/components/sigma_delta_output/test.rp2040-ard.yaml diff --git a/tests/components/sim800l/test.esp32.yaml b/tests/components/sim800l/test.esp32-ard.yaml similarity index 100% rename from tests/components/sim800l/test.esp32.yaml rename to tests/components/sim800l/test.esp32-ard.yaml diff --git a/tests/components/sim800l/test.esp32-c3.yaml b/tests/components/sim800l/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sim800l/test.esp32-c3.yaml rename to tests/components/sim800l/test.esp32-c3-ard.yaml diff --git a/tests/components/sim800l/test.esp8266.yaml b/tests/components/sim800l/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sim800l/test.esp8266.yaml rename to tests/components/sim800l/test.esp8266-ard.yaml diff --git a/tests/components/sim800l/test.rp2040.yaml b/tests/components/sim800l/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sim800l/test.rp2040.yaml rename to tests/components/sim800l/test.rp2040-ard.yaml diff --git a/tests/components/slow_pwm/test.esp32-c3.yaml b/tests/components/slow_pwm/test.esp32-ard.yaml similarity index 100% rename from tests/components/slow_pwm/test.esp32-c3.yaml rename to tests/components/slow_pwm/test.esp32-ard.yaml diff --git a/tests/components/slow_pwm/test.esp32.yaml b/tests/components/slow_pwm/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/slow_pwm/test.esp32.yaml rename to tests/components/slow_pwm/test.esp32-c3-ard.yaml diff --git a/tests/components/slow_pwm/test.esp8266.yaml b/tests/components/slow_pwm/test.esp8266-ard.yaml similarity index 100% rename from tests/components/slow_pwm/test.esp8266.yaml rename to tests/components/slow_pwm/test.esp8266-ard.yaml diff --git a/tests/components/slow_pwm/test.rp2040.yaml b/tests/components/slow_pwm/test.rp2040-ard.yaml similarity index 100% rename from tests/components/slow_pwm/test.rp2040.yaml rename to tests/components/slow_pwm/test.rp2040-ard.yaml diff --git a/tests/components/sm16716/test.esp32-c3.yaml b/tests/components/sm16716/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm16716/test.esp32-c3.yaml rename to tests/components/sm16716/test.esp32-ard.yaml diff --git a/tests/components/sm16716/test.esp32.yaml b/tests/components/sm16716/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm16716/test.esp32.yaml rename to tests/components/sm16716/test.esp32-c3-ard.yaml diff --git a/tests/components/sm16716/test.esp8266.yaml b/tests/components/sm16716/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm16716/test.esp8266.yaml rename to tests/components/sm16716/test.esp8266-ard.yaml diff --git a/tests/components/sm16716/test.rp2040.yaml b/tests/components/sm16716/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm16716/test.rp2040.yaml rename to tests/components/sm16716/test.rp2040-ard.yaml diff --git a/tests/components/sm2135/test.esp32-c3.yaml b/tests/components/sm2135/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm2135/test.esp32-c3.yaml rename to tests/components/sm2135/test.esp32-ard.yaml diff --git a/tests/components/sm2135/test.esp32.yaml b/tests/components/sm2135/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm2135/test.esp32.yaml rename to tests/components/sm2135/test.esp32-c3-ard.yaml diff --git a/tests/components/sm2135/test.esp8266.yaml b/tests/components/sm2135/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm2135/test.esp8266.yaml rename to tests/components/sm2135/test.esp8266-ard.yaml diff --git a/tests/components/sm2135/test.rp2040.yaml b/tests/components/sm2135/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm2135/test.rp2040.yaml rename to tests/components/sm2135/test.rp2040-ard.yaml diff --git a/tests/components/sm2235/test.esp32-c3.yaml b/tests/components/sm2235/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm2235/test.esp32-c3.yaml rename to tests/components/sm2235/test.esp32-ard.yaml diff --git a/tests/components/sm2235/test.esp32.yaml b/tests/components/sm2235/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm2235/test.esp32.yaml rename to tests/components/sm2235/test.esp32-c3-ard.yaml diff --git a/tests/components/sm2235/test.esp8266.yaml b/tests/components/sm2235/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm2235/test.esp8266.yaml rename to tests/components/sm2235/test.esp8266-ard.yaml diff --git a/tests/components/sm2235/test.rp2040.yaml b/tests/components/sm2235/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm2235/test.rp2040.yaml rename to tests/components/sm2235/test.rp2040-ard.yaml diff --git a/tests/components/sm2335/test.esp32-c3.yaml b/tests/components/sm2335/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm2335/test.esp32-c3.yaml rename to tests/components/sm2335/test.esp32-ard.yaml diff --git a/tests/components/sm2335/test.esp32.yaml b/tests/components/sm2335/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm2335/test.esp32.yaml rename to tests/components/sm2335/test.esp32-c3-ard.yaml diff --git a/tests/components/sm2335/test.esp8266.yaml b/tests/components/sm2335/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm2335/test.esp8266.yaml rename to tests/components/sm2335/test.esp8266-ard.yaml diff --git a/tests/components/sm2335/test.rp2040.yaml b/tests/components/sm2335/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm2335/test.rp2040.yaml rename to tests/components/sm2335/test.rp2040-ard.yaml diff --git a/tests/components/sm300d2/test.esp32.yaml b/tests/components/sm300d2/test.esp32-ard.yaml similarity index 100% rename from tests/components/sm300d2/test.esp32.yaml rename to tests/components/sm300d2/test.esp32-ard.yaml diff --git a/tests/components/sm300d2/test.esp32-c3.yaml b/tests/components/sm300d2/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sm300d2/test.esp32-c3.yaml rename to tests/components/sm300d2/test.esp32-c3-ard.yaml diff --git a/tests/components/sm300d2/test.esp8266.yaml b/tests/components/sm300d2/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sm300d2/test.esp8266.yaml rename to tests/components/sm300d2/test.esp8266-ard.yaml diff --git a/tests/components/sm300d2/test.rp2040.yaml b/tests/components/sm300d2/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sm300d2/test.rp2040.yaml rename to tests/components/sm300d2/test.rp2040-ard.yaml diff --git a/tests/components/sml/test.esp32.yaml b/tests/components/sml/test.esp32-ard.yaml similarity index 100% rename from tests/components/sml/test.esp32.yaml rename to tests/components/sml/test.esp32-ard.yaml diff --git a/tests/components/sml/test.esp32-c3.yaml b/tests/components/sml/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sml/test.esp32-c3.yaml rename to tests/components/sml/test.esp32-c3-ard.yaml diff --git a/tests/components/sml/test.esp8266.yaml b/tests/components/sml/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sml/test.esp8266.yaml rename to tests/components/sml/test.esp8266-ard.yaml diff --git a/tests/components/sml/test.rp2040.yaml b/tests/components/sml/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sml/test.rp2040.yaml rename to tests/components/sml/test.rp2040-ard.yaml diff --git a/tests/components/smt100/test.esp32.yaml b/tests/components/smt100/test.esp32-ard.yaml similarity index 100% rename from tests/components/smt100/test.esp32.yaml rename to tests/components/smt100/test.esp32-ard.yaml diff --git a/tests/components/smt100/test.esp32-c3.yaml b/tests/components/smt100/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/smt100/test.esp32-c3.yaml rename to tests/components/smt100/test.esp32-c3-ard.yaml diff --git a/tests/components/smt100/test.esp8266.yaml b/tests/components/smt100/test.esp8266-ard.yaml similarity index 100% rename from tests/components/smt100/test.esp8266.yaml rename to tests/components/smt100/test.esp8266-ard.yaml diff --git a/tests/components/smt100/test.rp2040.yaml b/tests/components/smt100/test.rp2040-ard.yaml similarity index 100% rename from tests/components/smt100/test.rp2040.yaml rename to tests/components/smt100/test.rp2040-ard.yaml diff --git a/tests/components/sn74hc165/test.esp32.yaml b/tests/components/sn74hc165/test.esp32-ard.yaml similarity index 100% rename from tests/components/sn74hc165/test.esp32.yaml rename to tests/components/sn74hc165/test.esp32-ard.yaml diff --git a/tests/components/sn74hc165/test.esp32-c3.yaml b/tests/components/sn74hc165/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sn74hc165/test.esp32-c3.yaml rename to tests/components/sn74hc165/test.esp32-c3-ard.yaml diff --git a/tests/components/sn74hc165/test.esp8266.yaml b/tests/components/sn74hc165/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sn74hc165/test.esp8266.yaml rename to tests/components/sn74hc165/test.esp8266-ard.yaml diff --git a/tests/components/sn74hc165/test.rp2040.yaml b/tests/components/sn74hc165/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sn74hc165/test.rp2040.yaml rename to tests/components/sn74hc165/test.rp2040-ard.yaml diff --git a/tests/components/sn74hc595/test.esp32.yaml b/tests/components/sn74hc595/test.esp32-ard.yaml similarity index 100% rename from tests/components/sn74hc595/test.esp32.yaml rename to tests/components/sn74hc595/test.esp32-ard.yaml diff --git a/tests/components/sn74hc595/test.esp32-c3.yaml b/tests/components/sn74hc595/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sn74hc595/test.esp32-c3.yaml rename to tests/components/sn74hc595/test.esp32-c3-ard.yaml diff --git a/tests/components/sn74hc595/test.esp8266.yaml b/tests/components/sn74hc595/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sn74hc595/test.esp8266.yaml rename to tests/components/sn74hc595/test.esp8266-ard.yaml diff --git a/tests/components/sn74hc595/test.rp2040.yaml b/tests/components/sn74hc595/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sn74hc595/test.rp2040.yaml rename to tests/components/sn74hc595/test.rp2040-ard.yaml diff --git a/tests/components/sntp/test.bk72xx.yaml b/tests/components/sntp/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/sntp/test.bk72xx.yaml rename to tests/components/sntp/test.bk72xx-ard.yaml diff --git a/tests/components/sntp/test.esp32-c3.yaml b/tests/components/sntp/test.esp32-ard.yaml similarity index 100% rename from tests/components/sntp/test.esp32-c3.yaml rename to tests/components/sntp/test.esp32-ard.yaml diff --git a/tests/components/sntp/test.esp32.yaml b/tests/components/sntp/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sntp/test.esp32.yaml rename to tests/components/sntp/test.esp32-c3-ard.yaml diff --git a/tests/components/sntp/test.esp8266.yaml b/tests/components/sntp/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sntp/test.esp8266.yaml rename to tests/components/sntp/test.esp8266-ard.yaml diff --git a/tests/components/sntp/test.rp2040.yaml b/tests/components/sntp/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sntp/test.rp2040.yaml rename to tests/components/sntp/test.rp2040-ard.yaml diff --git a/tests/components/sonoff_d1/test.esp32.yaml b/tests/components/sonoff_d1/test.esp32-ard.yaml similarity index 100% rename from tests/components/sonoff_d1/test.esp32.yaml rename to tests/components/sonoff_d1/test.esp32-ard.yaml diff --git a/tests/components/sonoff_d1/test.esp8266.yaml b/tests/components/sonoff_d1/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sonoff_d1/test.esp8266.yaml rename to tests/components/sonoff_d1/test.esp8266-ard.yaml diff --git a/tests/components/speaker/test.esp32.yaml b/tests/components/speaker/test.esp32-ard.yaml similarity index 100% rename from tests/components/speaker/test.esp32.yaml rename to tests/components/speaker/test.esp32-ard.yaml diff --git a/tests/components/speaker/test.esp32-c3.yaml b/tests/components/speaker/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/speaker/test.esp32-c3.yaml rename to tests/components/speaker/test.esp32-c3-ard.yaml diff --git a/tests/components/speed/test.esp32.yaml b/tests/components/speed/test.esp32-ard.yaml similarity index 100% rename from tests/components/speed/test.esp32.yaml rename to tests/components/speed/test.esp32-ard.yaml diff --git a/tests/components/speed/test.esp32-c3.yaml b/tests/components/speed/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/speed/test.esp32-c3.yaml rename to tests/components/speed/test.esp32-c3-ard.yaml diff --git a/tests/components/speed/test.esp8266.yaml b/tests/components/speed/test.esp8266-ard.yaml similarity index 100% rename from tests/components/speed/test.esp8266.yaml rename to tests/components/speed/test.esp8266-ard.yaml diff --git a/tests/components/speed/test.rp2040.yaml b/tests/components/speed/test.rp2040-ard.yaml similarity index 100% rename from tests/components/speed/test.rp2040.yaml rename to tests/components/speed/test.rp2040-ard.yaml diff --git a/tests/components/spi/test.esp32.yaml b/tests/components/spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/spi/test.esp32.yaml rename to tests/components/spi/test.esp32-ard.yaml diff --git a/tests/components/spi/test.esp32-c3.yaml b/tests/components/spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/spi/test.esp32-c3.yaml rename to tests/components/spi/test.esp32-c3-ard.yaml diff --git a/tests/components/spi/test.esp8266.yaml b/tests/components/spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/spi/test.esp8266.yaml rename to tests/components/spi/test.esp8266-ard.yaml diff --git a/tests/components/spi/test.rp2040.yaml b/tests/components/spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/spi/test.rp2040.yaml rename to tests/components/spi/test.rp2040-ard.yaml diff --git a/tests/components/spi_device/test.esp32.yaml b/tests/components/spi_device/test.esp32-ard.yaml similarity index 100% rename from tests/components/spi_device/test.esp32.yaml rename to tests/components/spi_device/test.esp32-ard.yaml diff --git a/tests/components/spi_device/test.esp32-c3.yaml b/tests/components/spi_device/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/spi_device/test.esp32-c3.yaml rename to tests/components/spi_device/test.esp32-c3-ard.yaml diff --git a/tests/components/spi_device/test.esp8266.yaml b/tests/components/spi_device/test.esp8266-ard.yaml similarity index 100% rename from tests/components/spi_device/test.esp8266.yaml rename to tests/components/spi_device/test.esp8266-ard.yaml diff --git a/tests/components/spi_device/test.rp2040.yaml b/tests/components/spi_device/test.rp2040-ard.yaml similarity index 100% rename from tests/components/spi_device/test.rp2040.yaml rename to tests/components/spi_device/test.rp2040-ard.yaml diff --git a/tests/components/spi_led_strip/test.esp32.yaml b/tests/components/spi_led_strip/test.esp32-ard.yaml similarity index 100% rename from tests/components/spi_led_strip/test.esp32.yaml rename to tests/components/spi_led_strip/test.esp32-ard.yaml diff --git a/tests/components/spi_led_strip/test.esp32-c3.yaml b/tests/components/spi_led_strip/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/spi_led_strip/test.esp32-c3.yaml rename to tests/components/spi_led_strip/test.esp32-c3-ard.yaml diff --git a/tests/components/spi_led_strip/test.esp8266.yaml b/tests/components/spi_led_strip/test.esp8266-ard.yaml similarity index 100% rename from tests/components/spi_led_strip/test.esp8266.yaml rename to tests/components/spi_led_strip/test.esp8266-ard.yaml diff --git a/tests/components/spi_led_strip/test.rp2040.yaml b/tests/components/spi_led_strip/test.rp2040-ard.yaml similarity index 100% rename from tests/components/spi_led_strip/test.rp2040.yaml rename to tests/components/spi_led_strip/test.rp2040-ard.yaml diff --git a/tests/components/sprinkler/test.esp32-c3.yaml b/tests/components/sprinkler/test.esp32-ard.yaml similarity index 100% rename from tests/components/sprinkler/test.esp32-c3.yaml rename to tests/components/sprinkler/test.esp32-ard.yaml diff --git a/tests/components/sprinkler/test.esp32.yaml b/tests/components/sprinkler/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sprinkler/test.esp32.yaml rename to tests/components/sprinkler/test.esp32-c3-ard.yaml diff --git a/tests/components/sprinkler/test.esp8266.yaml b/tests/components/sprinkler/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sprinkler/test.esp8266.yaml rename to tests/components/sprinkler/test.esp8266-ard.yaml diff --git a/tests/components/sprinkler/test.rp2040.yaml b/tests/components/sprinkler/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sprinkler/test.rp2040.yaml rename to tests/components/sprinkler/test.rp2040-ard.yaml diff --git a/tests/components/sps30/test.esp32.yaml b/tests/components/sps30/test.esp32-ard.yaml similarity index 100% rename from tests/components/sps30/test.esp32.yaml rename to tests/components/sps30/test.esp32-ard.yaml diff --git a/tests/components/sps30/test.esp32-c3.yaml b/tests/components/sps30/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sps30/test.esp32-c3.yaml rename to tests/components/sps30/test.esp32-c3-ard.yaml diff --git a/tests/components/sps30/test.esp8266.yaml b/tests/components/sps30/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sps30/test.esp8266.yaml rename to tests/components/sps30/test.esp8266-ard.yaml diff --git a/tests/components/sps30/test.rp2040.yaml b/tests/components/sps30/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sps30/test.rp2040.yaml rename to tests/components/sps30/test.rp2040-ard.yaml diff --git a/tests/components/ssd1306_i2c/test.esp32.yaml b/tests/components/ssd1306_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1306_i2c/test.esp32.yaml rename to tests/components/ssd1306_i2c/test.esp32-ard.yaml diff --git a/tests/components/ssd1306_i2c/test.esp32-c3.yaml b/tests/components/ssd1306_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1306_i2c/test.esp32-c3.yaml rename to tests/components/ssd1306_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1306_i2c/test.esp8266.yaml b/tests/components/ssd1306_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1306_i2c/test.esp8266.yaml rename to tests/components/ssd1306_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ssd1306_i2c/test.rp2040.yaml b/tests/components/ssd1306_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1306_i2c/test.rp2040.yaml rename to tests/components/ssd1306_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ssd1306_spi/test.esp32.yaml b/tests/components/ssd1306_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1306_spi/test.esp32.yaml rename to tests/components/ssd1306_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1306_spi/test.esp32-c3.yaml b/tests/components/ssd1306_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1306_spi/test.esp32-c3.yaml rename to tests/components/ssd1306_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1306_spi/test.esp8266.yaml b/tests/components/ssd1306_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1306_spi/test.esp8266.yaml rename to tests/components/ssd1306_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1306_spi/test.rp2040.yaml b/tests/components/ssd1306_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1306_spi/test.rp2040.yaml rename to tests/components/ssd1306_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1322_spi/test.esp32.yaml b/tests/components/ssd1322_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1322_spi/test.esp32.yaml rename to tests/components/ssd1322_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1322_spi/test.esp32-c3.yaml b/tests/components/ssd1322_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1322_spi/test.esp32-c3.yaml rename to tests/components/ssd1322_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1322_spi/test.esp8266.yaml b/tests/components/ssd1322_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1322_spi/test.esp8266.yaml rename to tests/components/ssd1322_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1322_spi/test.rp2040.yaml b/tests/components/ssd1322_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1322_spi/test.rp2040.yaml rename to tests/components/ssd1322_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1325_spi/test.esp32.yaml b/tests/components/ssd1325_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1325_spi/test.esp32.yaml rename to tests/components/ssd1325_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1325_spi/test.esp32-c3.yaml b/tests/components/ssd1325_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1325_spi/test.esp32-c3.yaml rename to tests/components/ssd1325_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1325_spi/test.esp8266.yaml b/tests/components/ssd1325_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1325_spi/test.esp8266.yaml rename to tests/components/ssd1325_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1325_spi/test.rp2040.yaml b/tests/components/ssd1325_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1325_spi/test.rp2040.yaml rename to tests/components/ssd1325_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1327_i2c/test.esp32.yaml b/tests/components/ssd1327_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1327_i2c/test.esp32.yaml rename to tests/components/ssd1327_i2c/test.esp32-ard.yaml diff --git a/tests/components/ssd1327_i2c/test.esp32-c3.yaml b/tests/components/ssd1327_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1327_i2c/test.esp32-c3.yaml rename to tests/components/ssd1327_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1327_i2c/test.esp8266.yaml b/tests/components/ssd1327_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1327_i2c/test.esp8266.yaml rename to tests/components/ssd1327_i2c/test.esp8266-ard.yaml diff --git a/tests/components/ssd1327_i2c/test.rp2040.yaml b/tests/components/ssd1327_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1327_i2c/test.rp2040.yaml rename to tests/components/ssd1327_i2c/test.rp2040-ard.yaml diff --git a/tests/components/ssd1327_spi/test.esp32.yaml b/tests/components/ssd1327_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1327_spi/test.esp32.yaml rename to tests/components/ssd1327_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1327_spi/test.esp32-c3.yaml b/tests/components/ssd1327_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1327_spi/test.esp32-c3.yaml rename to tests/components/ssd1327_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1327_spi/test.esp8266.yaml b/tests/components/ssd1327_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1327_spi/test.esp8266.yaml rename to tests/components/ssd1327_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1327_spi/test.rp2040.yaml b/tests/components/ssd1327_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1327_spi/test.rp2040.yaml rename to tests/components/ssd1327_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1331_spi/test.esp32.yaml b/tests/components/ssd1331_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1331_spi/test.esp32.yaml rename to tests/components/ssd1331_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1331_spi/test.esp32-c3.yaml b/tests/components/ssd1331_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1331_spi/test.esp32-c3.yaml rename to tests/components/ssd1331_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1331_spi/test.esp8266.yaml b/tests/components/ssd1331_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1331_spi/test.esp8266.yaml rename to tests/components/ssd1331_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1331_spi/test.rp2040.yaml b/tests/components/ssd1331_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1331_spi/test.rp2040.yaml rename to tests/components/ssd1331_spi/test.rp2040-ard.yaml diff --git a/tests/components/ssd1351_spi/test.esp32.yaml b/tests/components/ssd1351_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/ssd1351_spi/test.esp32.yaml rename to tests/components/ssd1351_spi/test.esp32-ard.yaml diff --git a/tests/components/ssd1351_spi/test.esp32-c3.yaml b/tests/components/ssd1351_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ssd1351_spi/test.esp32-c3.yaml rename to tests/components/ssd1351_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/ssd1351_spi/test.esp8266.yaml b/tests/components/ssd1351_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ssd1351_spi/test.esp8266.yaml rename to tests/components/ssd1351_spi/test.esp8266-ard.yaml diff --git a/tests/components/ssd1351_spi/test.rp2040.yaml b/tests/components/ssd1351_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ssd1351_spi/test.rp2040.yaml rename to tests/components/ssd1351_spi/test.rp2040-ard.yaml diff --git a/tests/components/st7567_i2c/test.esp32.yaml b/tests/components/st7567_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7567_i2c/test.esp32.yaml rename to tests/components/st7567_i2c/test.esp32-ard.yaml diff --git a/tests/components/st7567_i2c/test.esp32-c3.yaml b/tests/components/st7567_i2c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7567_i2c/test.esp32-c3.yaml rename to tests/components/st7567_i2c/test.esp32-c3-ard.yaml diff --git a/tests/components/st7567_i2c/test.esp8266.yaml b/tests/components/st7567_i2c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7567_i2c/test.esp8266.yaml rename to tests/components/st7567_i2c/test.esp8266-ard.yaml diff --git a/tests/components/st7567_i2c/test.rp2040.yaml b/tests/components/st7567_i2c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7567_i2c/test.rp2040.yaml rename to tests/components/st7567_i2c/test.rp2040-ard.yaml diff --git a/tests/components/st7567_spi/test.esp32.yaml b/tests/components/st7567_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7567_spi/test.esp32.yaml rename to tests/components/st7567_spi/test.esp32-ard.yaml diff --git a/tests/components/st7567_spi/test.esp32-c3.yaml b/tests/components/st7567_spi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7567_spi/test.esp32-c3.yaml rename to tests/components/st7567_spi/test.esp32-c3-ard.yaml diff --git a/tests/components/st7567_spi/test.esp8266.yaml b/tests/components/st7567_spi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7567_spi/test.esp8266.yaml rename to tests/components/st7567_spi/test.esp8266-ard.yaml diff --git a/tests/components/st7567_spi/test.rp2040.yaml b/tests/components/st7567_spi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7567_spi/test.rp2040.yaml rename to tests/components/st7567_spi/test.rp2040-ard.yaml diff --git a/tests/components/st7735/test.esp32.yaml b/tests/components/st7735/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7735/test.esp32.yaml rename to tests/components/st7735/test.esp32-ard.yaml diff --git a/tests/components/st7735/test.esp32-c3.yaml b/tests/components/st7735/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7735/test.esp32-c3.yaml rename to tests/components/st7735/test.esp32-c3-ard.yaml diff --git a/tests/components/st7735/test.esp8266.yaml b/tests/components/st7735/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7735/test.esp8266.yaml rename to tests/components/st7735/test.esp8266-ard.yaml diff --git a/tests/components/st7735/test.rp2040.yaml b/tests/components/st7735/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7735/test.rp2040.yaml rename to tests/components/st7735/test.rp2040-ard.yaml diff --git a/tests/components/st7789v/test.esp32.yaml b/tests/components/st7789v/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7789v/test.esp32.yaml rename to tests/components/st7789v/test.esp32-ard.yaml diff --git a/tests/components/st7789v/test.esp32-c3.yaml b/tests/components/st7789v/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7789v/test.esp32-c3.yaml rename to tests/components/st7789v/test.esp32-c3-ard.yaml diff --git a/tests/components/st7789v/test.esp8266.yaml b/tests/components/st7789v/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7789v/test.esp8266.yaml rename to tests/components/st7789v/test.esp8266-ard.yaml diff --git a/tests/components/st7789v/test.rp2040.yaml b/tests/components/st7789v/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7789v/test.rp2040.yaml rename to tests/components/st7789v/test.rp2040-ard.yaml diff --git a/tests/components/st7920/test.esp32.yaml b/tests/components/st7920/test.esp32-ard.yaml similarity index 100% rename from tests/components/st7920/test.esp32.yaml rename to tests/components/st7920/test.esp32-ard.yaml diff --git a/tests/components/st7920/test.esp32-c3.yaml b/tests/components/st7920/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/st7920/test.esp32-c3.yaml rename to tests/components/st7920/test.esp32-c3-ard.yaml diff --git a/tests/components/st7920/test.esp8266.yaml b/tests/components/st7920/test.esp8266-ard.yaml similarity index 100% rename from tests/components/st7920/test.esp8266.yaml rename to tests/components/st7920/test.esp8266-ard.yaml diff --git a/tests/components/st7920/test.rp2040.yaml b/tests/components/st7920/test.rp2040-ard.yaml similarity index 100% rename from tests/components/st7920/test.rp2040.yaml rename to tests/components/st7920/test.rp2040-ard.yaml diff --git a/tests/components/status/test.esp32-c3.yaml b/tests/components/status/test.esp32-ard.yaml similarity index 100% rename from tests/components/status/test.esp32-c3.yaml rename to tests/components/status/test.esp32-ard.yaml diff --git a/tests/components/status/test.esp32.yaml b/tests/components/status/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/status/test.esp32.yaml rename to tests/components/status/test.esp32-c3-ard.yaml diff --git a/tests/components/status/test.esp8266.yaml b/tests/components/status/test.esp8266-ard.yaml similarity index 100% rename from tests/components/status/test.esp8266.yaml rename to tests/components/status/test.esp8266-ard.yaml diff --git a/tests/components/status/test.rp2040.yaml b/tests/components/status/test.rp2040-ard.yaml similarity index 100% rename from tests/components/status/test.rp2040.yaml rename to tests/components/status/test.rp2040-ard.yaml diff --git a/tests/components/status_led/test.esp32-c3.yaml b/tests/components/status_led/test.esp32-ard.yaml similarity index 100% rename from tests/components/status_led/test.esp32-c3.yaml rename to tests/components/status_led/test.esp32-ard.yaml diff --git a/tests/components/status_led/test.esp32.yaml b/tests/components/status_led/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/status_led/test.esp32.yaml rename to tests/components/status_led/test.esp32-c3-ard.yaml diff --git a/tests/components/status_led/test.esp8266.yaml b/tests/components/status_led/test.esp8266-ard.yaml similarity index 100% rename from tests/components/status_led/test.esp8266.yaml rename to tests/components/status_led/test.esp8266-ard.yaml diff --git a/tests/components/status_led/test.rp2040.yaml b/tests/components/status_led/test.rp2040-ard.yaml similarity index 100% rename from tests/components/status_led/test.rp2040.yaml rename to tests/components/status_led/test.rp2040-ard.yaml diff --git a/tests/components/stepper/test.esp32-c3.yaml b/tests/components/stepper/test.esp32-ard.yaml similarity index 100% rename from tests/components/stepper/test.esp32-c3.yaml rename to tests/components/stepper/test.esp32-ard.yaml diff --git a/tests/components/stepper/test.esp32.yaml b/tests/components/stepper/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/stepper/test.esp32.yaml rename to tests/components/stepper/test.esp32-c3-ard.yaml diff --git a/tests/components/stepper/test.esp8266.yaml b/tests/components/stepper/test.esp8266-ard.yaml similarity index 100% rename from tests/components/stepper/test.esp8266.yaml rename to tests/components/stepper/test.esp8266-ard.yaml diff --git a/tests/components/stepper/test.rp2040.yaml b/tests/components/stepper/test.rp2040-ard.yaml similarity index 100% rename from tests/components/stepper/test.rp2040.yaml rename to tests/components/stepper/test.rp2040-ard.yaml diff --git a/tests/components/sts3x/test.esp32.yaml b/tests/components/sts3x/test.esp32-ard.yaml similarity index 100% rename from tests/components/sts3x/test.esp32.yaml rename to tests/components/sts3x/test.esp32-ard.yaml diff --git a/tests/components/sts3x/test.esp32-c3.yaml b/tests/components/sts3x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sts3x/test.esp32-c3.yaml rename to tests/components/sts3x/test.esp32-c3-ard.yaml diff --git a/tests/components/sts3x/test.esp8266.yaml b/tests/components/sts3x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sts3x/test.esp8266.yaml rename to tests/components/sts3x/test.esp8266-ard.yaml diff --git a/tests/components/sts3x/test.rp2040.yaml b/tests/components/sts3x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sts3x/test.rp2040.yaml rename to tests/components/sts3x/test.rp2040-ard.yaml diff --git a/tests/components/sun/test.esp32-c3.yaml b/tests/components/sun/test.esp32-ard.yaml similarity index 100% rename from tests/components/sun/test.esp32-c3.yaml rename to tests/components/sun/test.esp32-ard.yaml diff --git a/tests/components/sun/test.esp32.yaml b/tests/components/sun/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sun/test.esp32.yaml rename to tests/components/sun/test.esp32-c3-ard.yaml diff --git a/tests/components/sun/test.esp8266.yaml b/tests/components/sun/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sun/test.esp8266.yaml rename to tests/components/sun/test.esp8266-ard.yaml diff --git a/tests/components/sun/test.rp2040.yaml b/tests/components/sun/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sun/test.rp2040.yaml rename to tests/components/sun/test.rp2040-ard.yaml diff --git a/tests/components/sun_gtil2/test.esp32.yaml b/tests/components/sun_gtil2/test.esp32-ard.yaml similarity index 100% rename from tests/components/sun_gtil2/test.esp32.yaml rename to tests/components/sun_gtil2/test.esp32-ard.yaml diff --git a/tests/components/sun_gtil2/test.esp32-c3.yaml b/tests/components/sun_gtil2/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sun_gtil2/test.esp32-c3.yaml rename to tests/components/sun_gtil2/test.esp32-c3-ard.yaml diff --git a/tests/components/sun_gtil2/test.esp8266.yaml b/tests/components/sun_gtil2/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sun_gtil2/test.esp8266.yaml rename to tests/components/sun_gtil2/test.esp8266-ard.yaml diff --git a/tests/components/sun_gtil2/test.rp2040.yaml b/tests/components/sun_gtil2/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sun_gtil2/test.rp2040.yaml rename to tests/components/sun_gtil2/test.rp2040-ard.yaml diff --git a/tests/components/sx1509/test.esp32.yaml b/tests/components/sx1509/test.esp32-ard.yaml similarity index 100% rename from tests/components/sx1509/test.esp32.yaml rename to tests/components/sx1509/test.esp32-ard.yaml diff --git a/tests/components/sx1509/test.esp32-c3.yaml b/tests/components/sx1509/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/sx1509/test.esp32-c3.yaml rename to tests/components/sx1509/test.esp32-c3-ard.yaml diff --git a/tests/components/sx1509/test.esp8266.yaml b/tests/components/sx1509/test.esp8266-ard.yaml similarity index 100% rename from tests/components/sx1509/test.esp8266.yaml rename to tests/components/sx1509/test.esp8266-ard.yaml diff --git a/tests/components/sx1509/test.rp2040.yaml b/tests/components/sx1509/test.rp2040-ard.yaml similarity index 100% rename from tests/components/sx1509/test.rp2040.yaml rename to tests/components/sx1509/test.rp2040-ard.yaml diff --git a/tests/components/t6615/test.esp32.yaml b/tests/components/t6615/test.esp32-ard.yaml similarity index 100% rename from tests/components/t6615/test.esp32.yaml rename to tests/components/t6615/test.esp32-ard.yaml diff --git a/tests/components/t6615/test.esp32-c3.yaml b/tests/components/t6615/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/t6615/test.esp32-c3.yaml rename to tests/components/t6615/test.esp32-c3-ard.yaml diff --git a/tests/components/t6615/test.esp8266.yaml b/tests/components/t6615/test.esp8266-ard.yaml similarity index 100% rename from tests/components/t6615/test.esp8266.yaml rename to tests/components/t6615/test.esp8266-ard.yaml diff --git a/tests/components/t6615/test.rp2040.yaml b/tests/components/t6615/test.rp2040-ard.yaml similarity index 100% rename from tests/components/t6615/test.rp2040.yaml rename to tests/components/t6615/test.rp2040-ard.yaml diff --git a/tests/components/tca9548a/test.esp32.yaml b/tests/components/tca9548a/test.esp32-ard.yaml similarity index 100% rename from tests/components/tca9548a/test.esp32.yaml rename to tests/components/tca9548a/test.esp32-ard.yaml diff --git a/tests/components/tca9548a/test.esp32-c3.yaml b/tests/components/tca9548a/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tca9548a/test.esp32-c3.yaml rename to tests/components/tca9548a/test.esp32-c3-ard.yaml diff --git a/tests/components/tca9548a/test.esp8266.yaml b/tests/components/tca9548a/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tca9548a/test.esp8266.yaml rename to tests/components/tca9548a/test.esp8266-ard.yaml diff --git a/tests/components/tca9548a/test.rp2040.yaml b/tests/components/tca9548a/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tca9548a/test.rp2040.yaml rename to tests/components/tca9548a/test.rp2040-ard.yaml diff --git a/tests/components/tcl112/test.esp32-c3.yaml b/tests/components/tcl112/test.esp32-ard.yaml similarity index 100% rename from tests/components/tcl112/test.esp32-c3.yaml rename to tests/components/tcl112/test.esp32-ard.yaml diff --git a/tests/components/tcl112/test.esp32.yaml b/tests/components/tcl112/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tcl112/test.esp32.yaml rename to tests/components/tcl112/test.esp32-c3-ard.yaml diff --git a/tests/components/tcl112/test.esp8266.yaml b/tests/components/tcl112/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tcl112/test.esp8266.yaml rename to tests/components/tcl112/test.esp8266-ard.yaml diff --git a/tests/components/tcs34725/test.esp32.yaml b/tests/components/tcs34725/test.esp32-ard.yaml similarity index 100% rename from tests/components/tcs34725/test.esp32.yaml rename to tests/components/tcs34725/test.esp32-ard.yaml diff --git a/tests/components/tcs34725/test.esp32-c3.yaml b/tests/components/tcs34725/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tcs34725/test.esp32-c3.yaml rename to tests/components/tcs34725/test.esp32-c3-ard.yaml diff --git a/tests/components/tcs34725/test.esp8266.yaml b/tests/components/tcs34725/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tcs34725/test.esp8266.yaml rename to tests/components/tcs34725/test.esp8266-ard.yaml diff --git a/tests/components/tcs34725/test.rp2040.yaml b/tests/components/tcs34725/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tcs34725/test.rp2040.yaml rename to tests/components/tcs34725/test.rp2040-ard.yaml diff --git a/tests/components/tee501/test.esp32.yaml b/tests/components/tee501/test.esp32-ard.yaml similarity index 100% rename from tests/components/tee501/test.esp32.yaml rename to tests/components/tee501/test.esp32-ard.yaml diff --git a/tests/components/tee501/test.esp32-c3.yaml b/tests/components/tee501/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tee501/test.esp32-c3.yaml rename to tests/components/tee501/test.esp32-c3-ard.yaml diff --git a/tests/components/tee501/test.esp8266.yaml b/tests/components/tee501/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tee501/test.esp8266.yaml rename to tests/components/tee501/test.esp8266-ard.yaml diff --git a/tests/components/tee501/test.rp2040.yaml b/tests/components/tee501/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tee501/test.rp2040.yaml rename to tests/components/tee501/test.rp2040-ard.yaml diff --git a/tests/components/teleinfo/test.esp32.yaml b/tests/components/teleinfo/test.esp32-ard.yaml similarity index 100% rename from tests/components/teleinfo/test.esp32.yaml rename to tests/components/teleinfo/test.esp32-ard.yaml diff --git a/tests/components/teleinfo/test.esp32-c3.yaml b/tests/components/teleinfo/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/teleinfo/test.esp32-c3.yaml rename to tests/components/teleinfo/test.esp32-c3-ard.yaml diff --git a/tests/components/teleinfo/test.esp8266.yaml b/tests/components/teleinfo/test.esp8266-ard.yaml similarity index 100% rename from tests/components/teleinfo/test.esp8266.yaml rename to tests/components/teleinfo/test.esp8266-ard.yaml diff --git a/tests/components/teleinfo/test.rp2040.yaml b/tests/components/teleinfo/test.rp2040-ard.yaml similarity index 100% rename from tests/components/teleinfo/test.rp2040.yaml rename to tests/components/teleinfo/test.rp2040-ard.yaml diff --git a/tests/components/template/test.bk72xx.yaml b/tests/components/template/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/template/test.bk72xx.yaml rename to tests/components/template/test.bk72xx-ard.yaml diff --git a/tests/components/template/test.esp32-c3.yaml b/tests/components/template/test.esp32-ard.yaml similarity index 100% rename from tests/components/template/test.esp32-c3.yaml rename to tests/components/template/test.esp32-ard.yaml diff --git a/tests/components/template/test.esp32.yaml b/tests/components/template/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/template/test.esp32.yaml rename to tests/components/template/test.esp32-c3-ard.yaml diff --git a/tests/components/template/test.esp8266.yaml b/tests/components/template/test.esp8266-ard.yaml similarity index 100% rename from tests/components/template/test.esp8266.yaml rename to tests/components/template/test.esp8266-ard.yaml diff --git a/tests/components/template/test.rp2040.yaml b/tests/components/template/test.rp2040-ard.yaml similarity index 100% rename from tests/components/template/test.rp2040.yaml rename to tests/components/template/test.rp2040-ard.yaml diff --git a/tests/components/thermostat/test.esp32-c3.yaml b/tests/components/thermostat/test.esp32-ard.yaml similarity index 100% rename from tests/components/thermostat/test.esp32-c3.yaml rename to tests/components/thermostat/test.esp32-ard.yaml diff --git a/tests/components/thermostat/test.esp32.yaml b/tests/components/thermostat/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/thermostat/test.esp32.yaml rename to tests/components/thermostat/test.esp32-c3-ard.yaml diff --git a/tests/components/thermostat/test.esp8266.yaml b/tests/components/thermostat/test.esp8266-ard.yaml similarity index 100% rename from tests/components/thermostat/test.esp8266.yaml rename to tests/components/thermostat/test.esp8266-ard.yaml diff --git a/tests/components/thermostat/test.rp2040.yaml b/tests/components/thermostat/test.rp2040-ard.yaml similarity index 100% rename from tests/components/thermostat/test.rp2040.yaml rename to tests/components/thermostat/test.rp2040-ard.yaml diff --git a/tests/components/time/test.esp32-c3.yaml b/tests/components/time/test.esp32-ard.yaml similarity index 100% rename from tests/components/time/test.esp32-c3.yaml rename to tests/components/time/test.esp32-ard.yaml diff --git a/tests/components/time/test.esp32.yaml b/tests/components/time/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/time/test.esp32.yaml rename to tests/components/time/test.esp32-c3-ard.yaml diff --git a/tests/components/time/test.esp8266.yaml b/tests/components/time/test.esp8266-ard.yaml similarity index 100% rename from tests/components/time/test.esp8266.yaml rename to tests/components/time/test.esp8266-ard.yaml diff --git a/tests/components/time/test.rp2040.yaml b/tests/components/time/test.rp2040-ard.yaml similarity index 100% rename from tests/components/time/test.rp2040.yaml rename to tests/components/time/test.rp2040-ard.yaml diff --git a/tests/components/time_based/test.esp32-c3.yaml b/tests/components/time_based/test.esp32-ard.yaml similarity index 100% rename from tests/components/time_based/test.esp32-c3.yaml rename to tests/components/time_based/test.esp32-ard.yaml diff --git a/tests/components/time_based/test.esp32.yaml b/tests/components/time_based/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/time_based/test.esp32.yaml rename to tests/components/time_based/test.esp32-c3-ard.yaml diff --git a/tests/components/time_based/test.esp8266.yaml b/tests/components/time_based/test.esp8266-ard.yaml similarity index 100% rename from tests/components/time_based/test.esp8266.yaml rename to tests/components/time_based/test.esp8266-ard.yaml diff --git a/tests/components/time_based/test.rp2040.yaml b/tests/components/time_based/test.rp2040-ard.yaml similarity index 100% rename from tests/components/time_based/test.rp2040.yaml rename to tests/components/time_based/test.rp2040-ard.yaml diff --git a/tests/components/tlc59208f/test.esp32.yaml b/tests/components/tlc59208f/test.esp32-ard.yaml similarity index 100% rename from tests/components/tlc59208f/test.esp32.yaml rename to tests/components/tlc59208f/test.esp32-ard.yaml diff --git a/tests/components/tlc59208f/test.esp32-c3.yaml b/tests/components/tlc59208f/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tlc59208f/test.esp32-c3.yaml rename to tests/components/tlc59208f/test.esp32-c3-ard.yaml diff --git a/tests/components/tlc59208f/test.esp8266.yaml b/tests/components/tlc59208f/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tlc59208f/test.esp8266.yaml rename to tests/components/tlc59208f/test.esp8266-ard.yaml diff --git a/tests/components/tlc59208f/test.rp2040.yaml b/tests/components/tlc59208f/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tlc59208f/test.rp2040.yaml rename to tests/components/tlc59208f/test.rp2040-ard.yaml diff --git a/tests/components/tlc5947/test.esp32.yaml b/tests/components/tlc5947/test.esp32-ard.yaml similarity index 100% rename from tests/components/tlc5947/test.esp32.yaml rename to tests/components/tlc5947/test.esp32-ard.yaml diff --git a/tests/components/tlc5947/test.esp32-c3.yaml b/tests/components/tlc5947/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tlc5947/test.esp32-c3.yaml rename to tests/components/tlc5947/test.esp32-c3-ard.yaml diff --git a/tests/components/tlc5947/test.esp8266.yaml b/tests/components/tlc5947/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tlc5947/test.esp8266.yaml rename to tests/components/tlc5947/test.esp8266-ard.yaml diff --git a/tests/components/tlc5947/test.rp2040.yaml b/tests/components/tlc5947/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tlc5947/test.rp2040.yaml rename to tests/components/tlc5947/test.rp2040-ard.yaml diff --git a/tests/components/tlc5971/test.esp32.yaml b/tests/components/tlc5971/test.esp32-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.esp32.yaml rename to tests/components/tlc5971/test.esp32-ard.yaml diff --git a/tests/components/tlc5971/test.esp32-c3.yaml b/tests/components/tlc5971/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.esp32-c3.yaml rename to tests/components/tlc5971/test.esp32-c3-ard.yaml diff --git a/tests/components/tlc5971/test.esp32-s2.yaml b/tests/components/tlc5971/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.esp32-s2.yaml rename to tests/components/tlc5971/test.esp32-s2-ard.yaml diff --git a/tests/components/tlc5971/test.esp8266.yaml b/tests/components/tlc5971/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.esp8266.yaml rename to tests/components/tlc5971/test.esp8266-ard.yaml diff --git a/tests/components/tlc5971/test.rp2040.yaml b/tests/components/tlc5971/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tlc5971/test.rp2040.yaml rename to tests/components/tlc5971/test.rp2040-ard.yaml diff --git a/tests/components/tm1621/test.esp32.yaml b/tests/components/tm1621/test.esp32-ard.yaml similarity index 100% rename from tests/components/tm1621/test.esp32.yaml rename to tests/components/tm1621/test.esp32-ard.yaml diff --git a/tests/components/tm1621/test.esp32-c3.yaml b/tests/components/tm1621/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tm1621/test.esp32-c3.yaml rename to tests/components/tm1621/test.esp32-c3-ard.yaml diff --git a/tests/components/tm1621/test.esp8266.yaml b/tests/components/tm1621/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tm1621/test.esp8266.yaml rename to tests/components/tm1621/test.esp8266-ard.yaml diff --git a/tests/components/tm1621/test.rp2040.yaml b/tests/components/tm1621/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tm1621/test.rp2040.yaml rename to tests/components/tm1621/test.rp2040-ard.yaml diff --git a/tests/components/tm1637/test.esp32.yaml b/tests/components/tm1637/test.esp32-ard.yaml similarity index 100% rename from tests/components/tm1637/test.esp32.yaml rename to tests/components/tm1637/test.esp32-ard.yaml diff --git a/tests/components/tm1637/test.esp32-c3.yaml b/tests/components/tm1637/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tm1637/test.esp32-c3.yaml rename to tests/components/tm1637/test.esp32-c3-ard.yaml diff --git a/tests/components/tm1637/test.esp8266.yaml b/tests/components/tm1637/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tm1637/test.esp8266.yaml rename to tests/components/tm1637/test.esp8266-ard.yaml diff --git a/tests/components/tm1637/test.rp2040.yaml b/tests/components/tm1637/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tm1637/test.rp2040.yaml rename to tests/components/tm1637/test.rp2040-ard.yaml diff --git a/tests/components/tm1638/test.esp32-c3.yaml b/tests/components/tm1638/test.esp32-ard.yaml similarity index 100% rename from tests/components/tm1638/test.esp32-c3.yaml rename to tests/components/tm1638/test.esp32-ard.yaml diff --git a/tests/components/tm1638/test.esp32.yaml b/tests/components/tm1638/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tm1638/test.esp32.yaml rename to tests/components/tm1638/test.esp32-c3-ard.yaml diff --git a/tests/components/tm1638/test.esp8266.yaml b/tests/components/tm1638/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tm1638/test.esp8266.yaml rename to tests/components/tm1638/test.esp8266-ard.yaml diff --git a/tests/components/tm1638/test.rp2040.yaml b/tests/components/tm1638/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tm1638/test.rp2040.yaml rename to tests/components/tm1638/test.rp2040-ard.yaml diff --git a/tests/components/tm1651/test.esp32-c3.yaml b/tests/components/tm1651/test.esp32-ard.yaml similarity index 100% rename from tests/components/tm1651/test.esp32-c3.yaml rename to tests/components/tm1651/test.esp32-ard.yaml diff --git a/tests/components/tm1651/test.esp32.yaml b/tests/components/tm1651/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tm1651/test.esp32.yaml rename to tests/components/tm1651/test.esp32-c3-ard.yaml diff --git a/tests/components/tm1651/test.esp8266.yaml b/tests/components/tm1651/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tm1651/test.esp8266.yaml rename to tests/components/tm1651/test.esp8266-ard.yaml diff --git a/tests/components/tm1651/test.rp2040.yaml b/tests/components/tm1651/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tm1651/test.rp2040.yaml rename to tests/components/tm1651/test.rp2040-ard.yaml diff --git a/tests/components/tmp102/test.esp32.yaml b/tests/components/tmp102/test.esp32-ard.yaml similarity index 100% rename from tests/components/tmp102/test.esp32.yaml rename to tests/components/tmp102/test.esp32-ard.yaml diff --git a/tests/components/tmp102/test.esp32-c3.yaml b/tests/components/tmp102/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tmp102/test.esp32-c3.yaml rename to tests/components/tmp102/test.esp32-c3-ard.yaml diff --git a/tests/components/tmp102/test.esp8266.yaml b/tests/components/tmp102/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tmp102/test.esp8266.yaml rename to tests/components/tmp102/test.esp8266-ard.yaml diff --git a/tests/components/tmp102/test.rp2040.yaml b/tests/components/tmp102/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tmp102/test.rp2040.yaml rename to tests/components/tmp102/test.rp2040-ard.yaml diff --git a/tests/components/tmp1075/test.esp32.yaml b/tests/components/tmp1075/test.esp32-ard.yaml similarity index 100% rename from tests/components/tmp1075/test.esp32.yaml rename to tests/components/tmp1075/test.esp32-ard.yaml diff --git a/tests/components/tmp1075/test.esp32-c3.yaml b/tests/components/tmp1075/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tmp1075/test.esp32-c3.yaml rename to tests/components/tmp1075/test.esp32-c3-ard.yaml diff --git a/tests/components/tmp1075/test.esp8266.yaml b/tests/components/tmp1075/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tmp1075/test.esp8266.yaml rename to tests/components/tmp1075/test.esp8266-ard.yaml diff --git a/tests/components/tmp1075/test.rp2040.yaml b/tests/components/tmp1075/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tmp1075/test.rp2040.yaml rename to tests/components/tmp1075/test.rp2040-ard.yaml diff --git a/tests/components/tmp117/test.esp32.yaml b/tests/components/tmp117/test.esp32-ard.yaml similarity index 100% rename from tests/components/tmp117/test.esp32.yaml rename to tests/components/tmp117/test.esp32-ard.yaml diff --git a/tests/components/tmp117/test.esp32-c3.yaml b/tests/components/tmp117/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tmp117/test.esp32-c3.yaml rename to tests/components/tmp117/test.esp32-c3-ard.yaml diff --git a/tests/components/tmp117/test.esp8266.yaml b/tests/components/tmp117/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tmp117/test.esp8266.yaml rename to tests/components/tmp117/test.esp8266-ard.yaml diff --git a/tests/components/tmp117/test.rp2040.yaml b/tests/components/tmp117/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tmp117/test.rp2040.yaml rename to tests/components/tmp117/test.rp2040-ard.yaml diff --git a/tests/components/tof10120/test.esp32.yaml b/tests/components/tof10120/test.esp32-ard.yaml similarity index 100% rename from tests/components/tof10120/test.esp32.yaml rename to tests/components/tof10120/test.esp32-ard.yaml diff --git a/tests/components/tof10120/test.esp32-c3.yaml b/tests/components/tof10120/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tof10120/test.esp32-c3.yaml rename to tests/components/tof10120/test.esp32-c3-ard.yaml diff --git a/tests/components/tof10120/test.esp8266.yaml b/tests/components/tof10120/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tof10120/test.esp8266.yaml rename to tests/components/tof10120/test.esp8266-ard.yaml diff --git a/tests/components/tof10120/test.rp2040.yaml b/tests/components/tof10120/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tof10120/test.rp2040.yaml rename to tests/components/tof10120/test.rp2040-ard.yaml diff --git a/tests/components/toshiba/test.esp32-c3.yaml b/tests/components/toshiba/test.esp32-ard.yaml similarity index 100% rename from tests/components/toshiba/test.esp32-c3.yaml rename to tests/components/toshiba/test.esp32-ard.yaml diff --git a/tests/components/toshiba/test.esp32.yaml b/tests/components/toshiba/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/toshiba/test.esp32.yaml rename to tests/components/toshiba/test.esp32-c3-ard.yaml diff --git a/tests/components/toshiba/test.esp8266.yaml b/tests/components/toshiba/test.esp8266-ard.yaml similarity index 100% rename from tests/components/toshiba/test.esp8266.yaml rename to tests/components/toshiba/test.esp8266-ard.yaml diff --git a/tests/components/total_daily_energy/test.esp32.yaml b/tests/components/total_daily_energy/test.esp32-ard.yaml similarity index 100% rename from tests/components/total_daily_energy/test.esp32.yaml rename to tests/components/total_daily_energy/test.esp32-ard.yaml diff --git a/tests/components/total_daily_energy/test.esp32-c3.yaml b/tests/components/total_daily_energy/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/total_daily_energy/test.esp32-c3.yaml rename to tests/components/total_daily_energy/test.esp32-c3-ard.yaml diff --git a/tests/components/total_daily_energy/test.esp8266.yaml b/tests/components/total_daily_energy/test.esp8266-ard.yaml similarity index 100% rename from tests/components/total_daily_energy/test.esp8266.yaml rename to tests/components/total_daily_energy/test.esp8266-ard.yaml diff --git a/tests/components/total_daily_energy/test.rp2040.yaml b/tests/components/total_daily_energy/test.rp2040-ard.yaml similarity index 100% rename from tests/components/total_daily_energy/test.rp2040.yaml rename to tests/components/total_daily_energy/test.rp2040-ard.yaml diff --git a/tests/components/tsl2561/test.esp32.yaml b/tests/components/tsl2561/test.esp32-ard.yaml similarity index 100% rename from tests/components/tsl2561/test.esp32.yaml rename to tests/components/tsl2561/test.esp32-ard.yaml diff --git a/tests/components/tsl2561/test.esp32-c3.yaml b/tests/components/tsl2561/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tsl2561/test.esp32-c3.yaml rename to tests/components/tsl2561/test.esp32-c3-ard.yaml diff --git a/tests/components/tsl2561/test.esp8266.yaml b/tests/components/tsl2561/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tsl2561/test.esp8266.yaml rename to tests/components/tsl2561/test.esp8266-ard.yaml diff --git a/tests/components/tsl2561/test.rp2040.yaml b/tests/components/tsl2561/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tsl2561/test.rp2040.yaml rename to tests/components/tsl2561/test.rp2040-ard.yaml diff --git a/tests/components/tsl2591/test.esp32.yaml b/tests/components/tsl2591/test.esp32-ard.yaml similarity index 100% rename from tests/components/tsl2591/test.esp32.yaml rename to tests/components/tsl2591/test.esp32-ard.yaml diff --git a/tests/components/tsl2591/test.esp32-c3.yaml b/tests/components/tsl2591/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tsl2591/test.esp32-c3.yaml rename to tests/components/tsl2591/test.esp32-c3-ard.yaml diff --git a/tests/components/tsl2591/test.esp8266.yaml b/tests/components/tsl2591/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tsl2591/test.esp8266.yaml rename to tests/components/tsl2591/test.esp8266-ard.yaml diff --git a/tests/components/tsl2591/test.rp2040.yaml b/tests/components/tsl2591/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tsl2591/test.rp2040.yaml rename to tests/components/tsl2591/test.rp2040-ard.yaml diff --git a/tests/components/tt21100/test.esp32.yaml b/tests/components/tt21100/test.esp32-ard.yaml similarity index 100% rename from tests/components/tt21100/test.esp32.yaml rename to tests/components/tt21100/test.esp32-ard.yaml diff --git a/tests/components/tt21100/test.esp32-c3.yaml b/tests/components/tt21100/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tt21100/test.esp32-c3.yaml rename to tests/components/tt21100/test.esp32-c3-ard.yaml diff --git a/tests/components/tt21100/test.esp32-s2.yaml b/tests/components/tt21100/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/tt21100/test.esp32-s2.yaml rename to tests/components/tt21100/test.esp32-s2-ard.yaml diff --git a/tests/components/tt21100/test.esp8266.yaml b/tests/components/tt21100/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tt21100/test.esp8266.yaml rename to tests/components/tt21100/test.esp8266-ard.yaml diff --git a/tests/components/tt21100/test.rp2040.yaml b/tests/components/tt21100/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tt21100/test.rp2040.yaml rename to tests/components/tt21100/test.rp2040-ard.yaml diff --git a/tests/components/ttp229_bsf/test.esp32.yaml b/tests/components/ttp229_bsf/test.esp32-ard.yaml similarity index 100% rename from tests/components/ttp229_bsf/test.esp32.yaml rename to tests/components/ttp229_bsf/test.esp32-ard.yaml diff --git a/tests/components/ttp229_bsf/test.esp32-c3.yaml b/tests/components/ttp229_bsf/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ttp229_bsf/test.esp32-c3.yaml rename to tests/components/ttp229_bsf/test.esp32-c3-ard.yaml diff --git a/tests/components/ttp229_bsf/test.esp8266.yaml b/tests/components/ttp229_bsf/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ttp229_bsf/test.esp8266.yaml rename to tests/components/ttp229_bsf/test.esp8266-ard.yaml diff --git a/tests/components/ttp229_bsf/test.rp2040.yaml b/tests/components/ttp229_bsf/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ttp229_bsf/test.rp2040.yaml rename to tests/components/ttp229_bsf/test.rp2040-ard.yaml diff --git a/tests/components/ttp229_lsf/test.esp32.yaml b/tests/components/ttp229_lsf/test.esp32-ard.yaml similarity index 100% rename from tests/components/ttp229_lsf/test.esp32.yaml rename to tests/components/ttp229_lsf/test.esp32-ard.yaml diff --git a/tests/components/ttp229_lsf/test.esp32-c3.yaml b/tests/components/ttp229_lsf/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ttp229_lsf/test.esp32-c3.yaml rename to tests/components/ttp229_lsf/test.esp32-c3-ard.yaml diff --git a/tests/components/ttp229_lsf/test.esp8266.yaml b/tests/components/ttp229_lsf/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ttp229_lsf/test.esp8266.yaml rename to tests/components/ttp229_lsf/test.esp8266-ard.yaml diff --git a/tests/components/ttp229_lsf/test.rp2040.yaml b/tests/components/ttp229_lsf/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ttp229_lsf/test.rp2040.yaml rename to tests/components/ttp229_lsf/test.rp2040-ard.yaml diff --git a/tests/components/tuya/test.esp32.yaml b/tests/components/tuya/test.esp32-ard.yaml similarity index 100% rename from tests/components/tuya/test.esp32.yaml rename to tests/components/tuya/test.esp32-ard.yaml diff --git a/tests/components/tuya/test.esp32-c3.yaml b/tests/components/tuya/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tuya/test.esp32-c3.yaml rename to tests/components/tuya/test.esp32-c3-ard.yaml diff --git a/tests/components/tuya/test.esp8266.yaml b/tests/components/tuya/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tuya/test.esp8266.yaml rename to tests/components/tuya/test.esp8266-ard.yaml diff --git a/tests/components/tuya/test.rp2040.yaml b/tests/components/tuya/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tuya/test.rp2040.yaml rename to tests/components/tuya/test.rp2040-ard.yaml diff --git a/tests/components/tx20/test.esp32-c3.yaml b/tests/components/tx20/test.esp32-ard.yaml similarity index 100% rename from tests/components/tx20/test.esp32-c3.yaml rename to tests/components/tx20/test.esp32-ard.yaml diff --git a/tests/components/tx20/test.esp32.yaml b/tests/components/tx20/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/tx20/test.esp32.yaml rename to tests/components/tx20/test.esp32-c3-ard.yaml diff --git a/tests/components/tx20/test.esp8266.yaml b/tests/components/tx20/test.esp8266-ard.yaml similarity index 100% rename from tests/components/tx20/test.esp8266.yaml rename to tests/components/tx20/test.esp8266-ard.yaml diff --git a/tests/components/tx20/test.rp2040.yaml b/tests/components/tx20/test.rp2040-ard.yaml similarity index 100% rename from tests/components/tx20/test.rp2040.yaml rename to tests/components/tx20/test.rp2040-ard.yaml diff --git a/tests/components/uart/test.esp32.yaml b/tests/components/uart/test.esp32-ard.yaml similarity index 100% rename from tests/components/uart/test.esp32.yaml rename to tests/components/uart/test.esp32-ard.yaml diff --git a/tests/components/uart/test.esp32-c3.yaml b/tests/components/uart/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/uart/test.esp32-c3.yaml rename to tests/components/uart/test.esp32-c3-ard.yaml diff --git a/tests/components/uart/test.esp8266.yaml b/tests/components/uart/test.esp8266-ard.yaml similarity index 100% rename from tests/components/uart/test.esp8266.yaml rename to tests/components/uart/test.esp8266-ard.yaml diff --git a/tests/components/uart/test.rp2040.yaml b/tests/components/uart/test.rp2040-ard.yaml similarity index 100% rename from tests/components/uart/test.rp2040.yaml rename to tests/components/uart/test.rp2040-ard.yaml diff --git a/tests/components/ufire_ec/test.esp32.yaml b/tests/components/ufire_ec/test.esp32-ard.yaml similarity index 100% rename from tests/components/ufire_ec/test.esp32.yaml rename to tests/components/ufire_ec/test.esp32-ard.yaml diff --git a/tests/components/ufire_ec/test.esp32-c3.yaml b/tests/components/ufire_ec/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ufire_ec/test.esp32-c3.yaml rename to tests/components/ufire_ec/test.esp32-c3-ard.yaml diff --git a/tests/components/ufire_ec/test.esp8266.yaml b/tests/components/ufire_ec/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ufire_ec/test.esp8266.yaml rename to tests/components/ufire_ec/test.esp8266-ard.yaml diff --git a/tests/components/ufire_ec/test.rp2040.yaml b/tests/components/ufire_ec/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ufire_ec/test.rp2040.yaml rename to tests/components/ufire_ec/test.rp2040-ard.yaml diff --git a/tests/components/ufire_ise/test.esp32.yaml b/tests/components/ufire_ise/test.esp32-ard.yaml similarity index 100% rename from tests/components/ufire_ise/test.esp32.yaml rename to tests/components/ufire_ise/test.esp32-ard.yaml diff --git a/tests/components/ufire_ise/test.esp32-c3.yaml b/tests/components/ufire_ise/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ufire_ise/test.esp32-c3.yaml rename to tests/components/ufire_ise/test.esp32-c3-ard.yaml diff --git a/tests/components/ufire_ise/test.esp8266.yaml b/tests/components/ufire_ise/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ufire_ise/test.esp8266.yaml rename to tests/components/ufire_ise/test.esp8266-ard.yaml diff --git a/tests/components/ufire_ise/test.rp2040.yaml b/tests/components/ufire_ise/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ufire_ise/test.rp2040.yaml rename to tests/components/ufire_ise/test.rp2040-ard.yaml diff --git a/tests/components/uln2003/test.esp32.yaml b/tests/components/uln2003/test.esp32-ard.yaml similarity index 100% rename from tests/components/uln2003/test.esp32.yaml rename to tests/components/uln2003/test.esp32-ard.yaml diff --git a/tests/components/uln2003/test.esp32-c3.yaml b/tests/components/uln2003/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/uln2003/test.esp32-c3.yaml rename to tests/components/uln2003/test.esp32-c3-ard.yaml diff --git a/tests/components/uln2003/test.esp8266.yaml b/tests/components/uln2003/test.esp8266-ard.yaml similarity index 100% rename from tests/components/uln2003/test.esp8266.yaml rename to tests/components/uln2003/test.esp8266-ard.yaml diff --git a/tests/components/uln2003/test.rp2040.yaml b/tests/components/uln2003/test.rp2040-ard.yaml similarity index 100% rename from tests/components/uln2003/test.rp2040.yaml rename to tests/components/uln2003/test.rp2040-ard.yaml diff --git a/tests/components/ultrasonic/test.esp32-c3.yaml b/tests/components/ultrasonic/test.esp32-ard.yaml similarity index 100% rename from tests/components/ultrasonic/test.esp32-c3.yaml rename to tests/components/ultrasonic/test.esp32-ard.yaml diff --git a/tests/components/ultrasonic/test.esp32.yaml b/tests/components/ultrasonic/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/ultrasonic/test.esp32.yaml rename to tests/components/ultrasonic/test.esp32-c3-ard.yaml diff --git a/tests/components/ultrasonic/test.esp8266.yaml b/tests/components/ultrasonic/test.esp8266-ard.yaml similarity index 100% rename from tests/components/ultrasonic/test.esp8266.yaml rename to tests/components/ultrasonic/test.esp8266-ard.yaml diff --git a/tests/components/ultrasonic/test.rp2040.yaml b/tests/components/ultrasonic/test.rp2040-ard.yaml similarity index 100% rename from tests/components/ultrasonic/test.rp2040.yaml rename to tests/components/ultrasonic/test.rp2040-ard.yaml diff --git a/tests/components/update/test.esp8266.yaml b/tests/components/update/test.esp8266-ard.yaml similarity index 100% rename from tests/components/update/test.esp8266.yaml rename to tests/components/update/test.esp8266-ard.yaml diff --git a/tests/components/update/test.rp2040.yaml b/tests/components/update/test.rp2040-ard.yaml similarity index 100% rename from tests/components/update/test.rp2040.yaml rename to tests/components/update/test.rp2040-ard.yaml diff --git a/tests/components/uponor_smatrix/test.esp32.yaml b/tests/components/uponor_smatrix/test.esp32-ard.yaml similarity index 100% rename from tests/components/uponor_smatrix/test.esp32.yaml rename to tests/components/uponor_smatrix/test.esp32-ard.yaml diff --git a/tests/components/uponor_smatrix/test.esp32-c3.yaml b/tests/components/uponor_smatrix/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/uponor_smatrix/test.esp32-c3.yaml rename to tests/components/uponor_smatrix/test.esp32-c3-ard.yaml diff --git a/tests/components/uponor_smatrix/test.esp8266.yaml b/tests/components/uponor_smatrix/test.esp8266-ard.yaml similarity index 100% rename from tests/components/uponor_smatrix/test.esp8266.yaml rename to tests/components/uponor_smatrix/test.esp8266-ard.yaml diff --git a/tests/components/uponor_smatrix/test.rp2040.yaml b/tests/components/uponor_smatrix/test.rp2040-ard.yaml similarity index 100% rename from tests/components/uponor_smatrix/test.rp2040.yaml rename to tests/components/uponor_smatrix/test.rp2040-ard.yaml diff --git a/tests/components/uptime/test.esp32-c3.yaml b/tests/components/uptime/test.esp32-ard.yaml similarity index 100% rename from tests/components/uptime/test.esp32-c3.yaml rename to tests/components/uptime/test.esp32-ard.yaml diff --git a/tests/components/uptime/test.esp32.yaml b/tests/components/uptime/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/uptime/test.esp32.yaml rename to tests/components/uptime/test.esp32-c3-ard.yaml diff --git a/tests/components/uptime/test.esp8266.yaml b/tests/components/uptime/test.esp8266-ard.yaml similarity index 100% rename from tests/components/uptime/test.esp8266.yaml rename to tests/components/uptime/test.esp8266-ard.yaml diff --git a/tests/components/uptime/test.rp2040.yaml b/tests/components/uptime/test.rp2040-ard.yaml similarity index 100% rename from tests/components/uptime/test.rp2040.yaml rename to tests/components/uptime/test.rp2040-ard.yaml diff --git a/tests/components/vbus/test.esp32.yaml b/tests/components/vbus/test.esp32-ard.yaml similarity index 100% rename from tests/components/vbus/test.esp32.yaml rename to tests/components/vbus/test.esp32-ard.yaml diff --git a/tests/components/vbus/test.esp32-c3.yaml b/tests/components/vbus/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/vbus/test.esp32-c3.yaml rename to tests/components/vbus/test.esp32-c3-ard.yaml diff --git a/tests/components/vbus/test.esp8266.yaml b/tests/components/vbus/test.esp8266-ard.yaml similarity index 100% rename from tests/components/vbus/test.esp8266.yaml rename to tests/components/vbus/test.esp8266-ard.yaml diff --git a/tests/components/vbus/test.rp2040.yaml b/tests/components/vbus/test.rp2040-ard.yaml similarity index 100% rename from tests/components/vbus/test.rp2040.yaml rename to tests/components/vbus/test.rp2040-ard.yaml diff --git a/tests/components/veml3235/test.esp32.yaml b/tests/components/veml3235/test.esp32-ard.yaml similarity index 100% rename from tests/components/veml3235/test.esp32.yaml rename to tests/components/veml3235/test.esp32-ard.yaml diff --git a/tests/components/veml3235/test.esp32-c3.yaml b/tests/components/veml3235/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/veml3235/test.esp32-c3.yaml rename to tests/components/veml3235/test.esp32-c3-ard.yaml diff --git a/tests/components/veml3235/test.esp8266.yaml b/tests/components/veml3235/test.esp8266-ard.yaml similarity index 100% rename from tests/components/veml3235/test.esp8266.yaml rename to tests/components/veml3235/test.esp8266-ard.yaml diff --git a/tests/components/veml3235/test.rp2040.yaml b/tests/components/veml3235/test.rp2040-ard.yaml similarity index 100% rename from tests/components/veml3235/test.rp2040.yaml rename to tests/components/veml3235/test.rp2040-ard.yaml diff --git a/tests/components/veml7700/test.esp32.yaml b/tests/components/veml7700/test.esp32-ard.yaml similarity index 100% rename from tests/components/veml7700/test.esp32.yaml rename to tests/components/veml7700/test.esp32-ard.yaml diff --git a/tests/components/veml7700/test.esp32-c3.yaml b/tests/components/veml7700/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/veml7700/test.esp32-c3.yaml rename to tests/components/veml7700/test.esp32-c3-ard.yaml diff --git a/tests/components/veml7700/test.esp8266.yaml b/tests/components/veml7700/test.esp8266-ard.yaml similarity index 100% rename from tests/components/veml7700/test.esp8266.yaml rename to tests/components/veml7700/test.esp8266-ard.yaml diff --git a/tests/components/veml7700/test.rp2040.yaml b/tests/components/veml7700/test.rp2040-ard.yaml similarity index 100% rename from tests/components/veml7700/test.rp2040.yaml rename to tests/components/veml7700/test.rp2040-ard.yaml diff --git a/tests/components/version/test.esp32-c3.yaml b/tests/components/version/test.esp32-ard.yaml similarity index 100% rename from tests/components/version/test.esp32-c3.yaml rename to tests/components/version/test.esp32-ard.yaml diff --git a/tests/components/version/test.esp32.yaml b/tests/components/version/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/version/test.esp32.yaml rename to tests/components/version/test.esp32-c3-ard.yaml diff --git a/tests/components/version/test.esp8266.yaml b/tests/components/version/test.esp8266-ard.yaml similarity index 100% rename from tests/components/version/test.esp8266.yaml rename to tests/components/version/test.esp8266-ard.yaml diff --git a/tests/components/version/test.rp2040.yaml b/tests/components/version/test.rp2040-ard.yaml similarity index 100% rename from tests/components/version/test.rp2040.yaml rename to tests/components/version/test.rp2040-ard.yaml diff --git a/tests/components/vl53l0x/test.esp32.yaml b/tests/components/vl53l0x/test.esp32-ard.yaml similarity index 100% rename from tests/components/vl53l0x/test.esp32.yaml rename to tests/components/vl53l0x/test.esp32-ard.yaml diff --git a/tests/components/vl53l0x/test.esp32-c3.yaml b/tests/components/vl53l0x/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/vl53l0x/test.esp32-c3.yaml rename to tests/components/vl53l0x/test.esp32-c3-ard.yaml diff --git a/tests/components/vl53l0x/test.esp8266.yaml b/tests/components/vl53l0x/test.esp8266-ard.yaml similarity index 100% rename from tests/components/vl53l0x/test.esp8266.yaml rename to tests/components/vl53l0x/test.esp8266-ard.yaml diff --git a/tests/components/vl53l0x/test.rp2040.yaml b/tests/components/vl53l0x/test.rp2040-ard.yaml similarity index 100% rename from tests/components/vl53l0x/test.rp2040.yaml rename to tests/components/vl53l0x/test.rp2040-ard.yaml diff --git a/tests/components/voice_assistant/test.esp32.yaml b/tests/components/voice_assistant/test.esp32-ard.yaml similarity index 100% rename from tests/components/voice_assistant/test.esp32.yaml rename to tests/components/voice_assistant/test.esp32-ard.yaml diff --git a/tests/components/voice_assistant/test.esp32-c3.yaml b/tests/components/voice_assistant/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/voice_assistant/test.esp32-c3.yaml rename to tests/components/voice_assistant/test.esp32-c3-ard.yaml diff --git a/tests/components/wake_on_lan/test.esp32-c3.yaml b/tests/components/wake_on_lan/test.esp32-ard.yaml similarity index 100% rename from tests/components/wake_on_lan/test.esp32-c3.yaml rename to tests/components/wake_on_lan/test.esp32-ard.yaml diff --git a/tests/components/wake_on_lan/test.esp32.yaml b/tests/components/wake_on_lan/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wake_on_lan/test.esp32.yaml rename to tests/components/wake_on_lan/test.esp32-c3-ard.yaml diff --git a/tests/components/wake_on_lan/test.esp8266.yaml b/tests/components/wake_on_lan/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wake_on_lan/test.esp8266.yaml rename to tests/components/wake_on_lan/test.esp8266-ard.yaml diff --git a/tests/components/wake_on_lan/test.rp2040.yaml b/tests/components/wake_on_lan/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wake_on_lan/test.rp2040.yaml rename to tests/components/wake_on_lan/test.rp2040-ard.yaml diff --git a/tests/components/waveshare_epaper/test.esp32.yaml b/tests/components/waveshare_epaper/test.esp32-ard.yaml similarity index 100% rename from tests/components/waveshare_epaper/test.esp32.yaml rename to tests/components/waveshare_epaper/test.esp32-ard.yaml diff --git a/tests/components/waveshare_epaper/test.esp32-c3.yaml b/tests/components/waveshare_epaper/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/waveshare_epaper/test.esp32-c3.yaml rename to tests/components/waveshare_epaper/test.esp32-c3-ard.yaml diff --git a/tests/components/waveshare_epaper/test.esp8266.yaml b/tests/components/waveshare_epaper/test.esp8266-ard.yaml similarity index 100% rename from tests/components/waveshare_epaper/test.esp8266.yaml rename to tests/components/waveshare_epaper/test.esp8266-ard.yaml diff --git a/tests/components/waveshare_epaper/test.rp2040.yaml b/tests/components/waveshare_epaper/test.rp2040-ard.yaml similarity index 100% rename from tests/components/waveshare_epaper/test.rp2040.yaml rename to tests/components/waveshare_epaper/test.rp2040-ard.yaml diff --git a/tests/components/web_server/test.esp32-c3.yaml b/tests/components/web_server/test.esp32-ard.yaml similarity index 100% rename from tests/components/web_server/test.esp32-c3.yaml rename to tests/components/web_server/test.esp32-ard.yaml diff --git a/tests/components/web_server/test.esp32.yaml b/tests/components/web_server/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/web_server/test.esp32.yaml rename to tests/components/web_server/test.esp32-c3-ard.yaml diff --git a/tests/components/web_server/test.esp8266.yaml b/tests/components/web_server/test.esp8266-ard.yaml similarity index 100% rename from tests/components/web_server/test.esp8266.yaml rename to tests/components/web_server/test.esp8266-ard.yaml diff --git a/tests/components/whirlpool/test.esp32-c3.yaml b/tests/components/whirlpool/test.esp32-ard.yaml similarity index 100% rename from tests/components/whirlpool/test.esp32-c3.yaml rename to tests/components/whirlpool/test.esp32-ard.yaml diff --git a/tests/components/whirlpool/test.esp32.yaml b/tests/components/whirlpool/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/whirlpool/test.esp32.yaml rename to tests/components/whirlpool/test.esp32-c3-ard.yaml diff --git a/tests/components/whirlpool/test.esp8266.yaml b/tests/components/whirlpool/test.esp8266-ard.yaml similarity index 100% rename from tests/components/whirlpool/test.esp8266.yaml rename to tests/components/whirlpool/test.esp8266-ard.yaml diff --git a/tests/components/whynter/test.esp32-c3.yaml b/tests/components/whynter/test.esp32-ard.yaml similarity index 100% rename from tests/components/whynter/test.esp32-c3.yaml rename to tests/components/whynter/test.esp32-ard.yaml diff --git a/tests/components/whynter/test.esp32.yaml b/tests/components/whynter/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/whynter/test.esp32.yaml rename to tests/components/whynter/test.esp32-c3-ard.yaml diff --git a/tests/components/whynter/test.esp8266.yaml b/tests/components/whynter/test.esp8266-ard.yaml similarity index 100% rename from tests/components/whynter/test.esp8266.yaml rename to tests/components/whynter/test.esp8266-ard.yaml diff --git a/tests/components/wiegand/test.esp32-c3.yaml b/tests/components/wiegand/test.esp32-ard.yaml similarity index 100% rename from tests/components/wiegand/test.esp32-c3.yaml rename to tests/components/wiegand/test.esp32-ard.yaml diff --git a/tests/components/wiegand/test.esp32.yaml b/tests/components/wiegand/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wiegand/test.esp32.yaml rename to tests/components/wiegand/test.esp32-c3-ard.yaml diff --git a/tests/components/wiegand/test.esp8266.yaml b/tests/components/wiegand/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wiegand/test.esp8266.yaml rename to tests/components/wiegand/test.esp8266-ard.yaml diff --git a/tests/components/wiegand/test.rp2040.yaml b/tests/components/wiegand/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wiegand/test.rp2040.yaml rename to tests/components/wiegand/test.rp2040-ard.yaml diff --git a/tests/components/wifi/test.esp32-c3.yaml b/tests/components/wifi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wifi/test.esp32-c3.yaml rename to tests/components/wifi/test.esp32-ard.yaml diff --git a/tests/components/wifi/test.esp32.yaml b/tests/components/wifi/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wifi/test.esp32.yaml rename to tests/components/wifi/test.esp32-c3-ard.yaml diff --git a/tests/components/wifi/test.esp8266.yaml b/tests/components/wifi/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wifi/test.esp8266.yaml rename to tests/components/wifi/test.esp8266-ard.yaml diff --git a/tests/components/wifi/test.rp2040.yaml b/tests/components/wifi/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wifi/test.rp2040.yaml rename to tests/components/wifi/test.rp2040-ard.yaml diff --git a/tests/components/wifi_info/test.esp32-c3.yaml b/tests/components/wifi_info/test.esp32-ard.yaml similarity index 100% rename from tests/components/wifi_info/test.esp32-c3.yaml rename to tests/components/wifi_info/test.esp32-ard.yaml diff --git a/tests/components/wifi_info/test.esp32.yaml b/tests/components/wifi_info/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wifi_info/test.esp32.yaml rename to tests/components/wifi_info/test.esp32-c3-ard.yaml diff --git a/tests/components/wifi_info/test.esp8266.yaml b/tests/components/wifi_info/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wifi_info/test.esp8266.yaml rename to tests/components/wifi_info/test.esp8266-ard.yaml diff --git a/tests/components/wifi_info/test.rp2040.yaml b/tests/components/wifi_info/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wifi_info/test.rp2040.yaml rename to tests/components/wifi_info/test.rp2040-ard.yaml diff --git a/tests/components/wifi_signal/test.esp32-c3.yaml b/tests/components/wifi_signal/test.esp32-ard.yaml similarity index 100% rename from tests/components/wifi_signal/test.esp32-c3.yaml rename to tests/components/wifi_signal/test.esp32-ard.yaml diff --git a/tests/components/wifi_signal/test.esp32.yaml b/tests/components/wifi_signal/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wifi_signal/test.esp32.yaml rename to tests/components/wifi_signal/test.esp32-c3-ard.yaml diff --git a/tests/components/wifi_signal/test.esp8266.yaml b/tests/components/wifi_signal/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wifi_signal/test.esp8266.yaml rename to tests/components/wifi_signal/test.esp8266-ard.yaml diff --git a/tests/components/wifi_signal/test.rp2040.yaml b/tests/components/wifi_signal/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wifi_signal/test.rp2040.yaml rename to tests/components/wifi_signal/test.rp2040-ard.yaml diff --git a/tests/components/wireguard/test.bk72xx.yaml b/tests/components/wireguard/test.bk72xx-ard.yaml similarity index 100% rename from tests/components/wireguard/test.bk72xx.yaml rename to tests/components/wireguard/test.bk72xx-ard.yaml diff --git a/tests/components/wireguard/test.esp32.yaml b/tests/components/wireguard/test.esp32-ard.yaml similarity index 100% rename from tests/components/wireguard/test.esp32.yaml rename to tests/components/wireguard/test.esp32-ard.yaml diff --git a/tests/components/wireguard/test.esp32-c3.yaml b/tests/components/wireguard/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wireguard/test.esp32-c3.yaml rename to tests/components/wireguard/test.esp32-c3-ard.yaml diff --git a/tests/components/wireguard/test.esp8266.yaml b/tests/components/wireguard/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wireguard/test.esp8266.yaml rename to tests/components/wireguard/test.esp8266-ard.yaml diff --git a/tests/components/wk2132_i2c/test.esp32.yaml b/tests/components/wk2132_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2132_i2c/test.esp32.yaml rename to tests/components/wk2132_i2c/test.esp32-ard.yaml diff --git a/tests/components/wk2132_i2c/test.esp32-s3.yaml b/tests/components/wk2132_i2c/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2132_i2c/test.esp32-s3.yaml rename to tests/components/wk2132_i2c/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2132_spi/test.esp32.yaml b/tests/components/wk2132_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2132_spi/test.esp32.yaml rename to tests/components/wk2132_spi/test.esp32-ard.yaml diff --git a/tests/components/wk2132_spi/test.esp32-s3.yaml b/tests/components/wk2132_spi/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2132_spi/test.esp32-s3.yaml rename to tests/components/wk2132_spi/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2168_i2c/test.esp32.yaml b/tests/components/wk2168_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2168_i2c/test.esp32.yaml rename to tests/components/wk2168_i2c/test.esp32-ard.yaml diff --git a/tests/components/wk2168_i2c/test.esp32-s3.yaml b/tests/components/wk2168_i2c/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2168_i2c/test.esp32-s3.yaml rename to tests/components/wk2168_i2c/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2168_spi/test.esp32.yaml b/tests/components/wk2168_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2168_spi/test.esp32.yaml rename to tests/components/wk2168_spi/test.esp32-ard.yaml diff --git a/tests/components/wk2168_spi/test.esp32-s3.yaml b/tests/components/wk2168_spi/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2168_spi/test.esp32-s3.yaml rename to tests/components/wk2168_spi/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2204_i2c/test.esp32.yaml b/tests/components/wk2204_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2204_i2c/test.esp32.yaml rename to tests/components/wk2204_i2c/test.esp32-ard.yaml diff --git a/tests/components/wk2204_i2c/test.esp32-s3.yaml b/tests/components/wk2204_i2c/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2204_i2c/test.esp32-s3.yaml rename to tests/components/wk2204_i2c/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2204_spi/test.esp32.yaml b/tests/components/wk2204_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2204_spi/test.esp32.yaml rename to tests/components/wk2204_spi/test.esp32-ard.yaml diff --git a/tests/components/wk2204_spi/test.esp32-s3.yaml b/tests/components/wk2204_spi/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2204_spi/test.esp32-s3.yaml rename to tests/components/wk2204_spi/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2212_i2c/test.esp32.yaml b/tests/components/wk2212_i2c/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2212_i2c/test.esp32.yaml rename to tests/components/wk2212_i2c/test.esp32-ard.yaml diff --git a/tests/components/wk2212_i2c/test.esp32-s3.yaml b/tests/components/wk2212_i2c/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2212_i2c/test.esp32-s3.yaml rename to tests/components/wk2212_i2c/test.esp32-s3-ard.yaml diff --git a/tests/components/wk2212_spi/test.esp32.yaml b/tests/components/wk2212_spi/test.esp32-ard.yaml similarity index 100% rename from tests/components/wk2212_spi/test.esp32.yaml rename to tests/components/wk2212_spi/test.esp32-ard.yaml diff --git a/tests/components/wk2212_spi/test.esp32-s3.yaml b/tests/components/wk2212_spi/test.esp32-s3-ard.yaml similarity index 100% rename from tests/components/wk2212_spi/test.esp32-s3.yaml rename to tests/components/wk2212_spi/test.esp32-s3-ard.yaml diff --git a/tests/components/wl_134/test.esp32.yaml b/tests/components/wl_134/test.esp32-ard.yaml similarity index 100% rename from tests/components/wl_134/test.esp32.yaml rename to tests/components/wl_134/test.esp32-ard.yaml diff --git a/tests/components/wl_134/test.esp32-c3.yaml b/tests/components/wl_134/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wl_134/test.esp32-c3.yaml rename to tests/components/wl_134/test.esp32-c3-ard.yaml diff --git a/tests/components/wl_134/test.esp8266.yaml b/tests/components/wl_134/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wl_134/test.esp8266.yaml rename to tests/components/wl_134/test.esp8266-ard.yaml diff --git a/tests/components/wl_134/test.rp2040.yaml b/tests/components/wl_134/test.rp2040-ard.yaml similarity index 100% rename from tests/components/wl_134/test.rp2040.yaml rename to tests/components/wl_134/test.rp2040-ard.yaml diff --git a/tests/components/wled/test.esp32-c3.yaml b/tests/components/wled/test.esp32-ard.yaml similarity index 100% rename from tests/components/wled/test.esp32-c3.yaml rename to tests/components/wled/test.esp32-ard.yaml diff --git a/tests/components/wled/test.esp32.yaml b/tests/components/wled/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/wled/test.esp32.yaml rename to tests/components/wled/test.esp32-c3-ard.yaml diff --git a/tests/components/wled/test.esp8266.yaml b/tests/components/wled/test.esp8266-ard.yaml similarity index 100% rename from tests/components/wled/test.esp8266.yaml rename to tests/components/wled/test.esp8266-ard.yaml diff --git a/tests/components/x9c/test.esp32.yaml b/tests/components/x9c/test.esp32-ard.yaml similarity index 100% rename from tests/components/x9c/test.esp32.yaml rename to tests/components/x9c/test.esp32-ard.yaml diff --git a/tests/components/x9c/test.esp32-c3.yaml b/tests/components/x9c/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/x9c/test.esp32-c3.yaml rename to tests/components/x9c/test.esp32-c3-ard.yaml diff --git a/tests/components/x9c/test.esp8266.yaml b/tests/components/x9c/test.esp8266-ard.yaml similarity index 100% rename from tests/components/x9c/test.esp8266.yaml rename to tests/components/x9c/test.esp8266-ard.yaml diff --git a/tests/components/x9c/test.rp2040.yaml b/tests/components/x9c/test.rp2040-ard.yaml similarity index 100% rename from tests/components/x9c/test.rp2040.yaml rename to tests/components/x9c/test.rp2040-ard.yaml diff --git a/tests/components/xgzp68xx/test.esp32.yaml b/tests/components/xgzp68xx/test.esp32-ard.yaml similarity index 100% rename from tests/components/xgzp68xx/test.esp32.yaml rename to tests/components/xgzp68xx/test.esp32-ard.yaml diff --git a/tests/components/xgzp68xx/test.esp32-c3.yaml b/tests/components/xgzp68xx/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xgzp68xx/test.esp32-c3.yaml rename to tests/components/xgzp68xx/test.esp32-c3-ard.yaml diff --git a/tests/components/xgzp68xx/test.esp8266.yaml b/tests/components/xgzp68xx/test.esp8266-ard.yaml similarity index 100% rename from tests/components/xgzp68xx/test.esp8266.yaml rename to tests/components/xgzp68xx/test.esp8266-ard.yaml diff --git a/tests/components/xgzp68xx/test.rp2040.yaml b/tests/components/xgzp68xx/test.rp2040-ard.yaml similarity index 100% rename from tests/components/xgzp68xx/test.rp2040.yaml rename to tests/components/xgzp68xx/test.rp2040-ard.yaml diff --git a/tests/components/xiaomi_ble/test.esp32-c3.yaml b/tests/components/xiaomi_ble/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_ble/test.esp32-c3.yaml rename to tests/components/xiaomi_ble/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_ble/test.esp32.yaml b/tests/components/xiaomi_ble/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_ble/test.esp32.yaml rename to tests/components/xiaomi_ble/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_cgd1/test.esp32-c3.yaml b/tests/components/xiaomi_cgd1/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgd1/test.esp32-c3.yaml rename to tests/components/xiaomi_cgd1/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_cgd1/test.esp32.yaml b/tests/components/xiaomi_cgd1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgd1/test.esp32.yaml rename to tests/components/xiaomi_cgd1/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_cgdk2/test.esp32-c3.yaml b/tests/components/xiaomi_cgdk2/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgdk2/test.esp32-c3.yaml rename to tests/components/xiaomi_cgdk2/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_cgdk2/test.esp32.yaml b/tests/components/xiaomi_cgdk2/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgdk2/test.esp32.yaml rename to tests/components/xiaomi_cgdk2/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_cgg1/test.esp32-c3.yaml b/tests/components/xiaomi_cgg1/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgg1/test.esp32-c3.yaml rename to tests/components/xiaomi_cgg1/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_cgg1/test.esp32.yaml b/tests/components/xiaomi_cgg1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgg1/test.esp32.yaml rename to tests/components/xiaomi_cgg1/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_cgpr1/test.esp32-c3.yaml b/tests/components/xiaomi_cgpr1/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgpr1/test.esp32-c3.yaml rename to tests/components/xiaomi_cgpr1/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_cgpr1/test.esp32.yaml b/tests/components/xiaomi_cgpr1/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_cgpr1/test.esp32.yaml rename to tests/components/xiaomi_cgpr1/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_gcls002/test.esp32-c3.yaml b/tests/components/xiaomi_gcls002/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_gcls002/test.esp32-c3.yaml rename to tests/components/xiaomi_gcls002/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_gcls002/test.esp32.yaml b/tests/components/xiaomi_gcls002/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_gcls002/test.esp32.yaml rename to tests/components/xiaomi_gcls002/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_hhccjcy01/test.esp32-c3.yaml b/tests/components/xiaomi_hhccjcy01/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_hhccjcy01/test.esp32-c3.yaml rename to tests/components/xiaomi_hhccjcy01/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_hhccjcy01/test.esp32.yaml b/tests/components/xiaomi_hhccjcy01/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_hhccjcy01/test.esp32.yaml rename to tests/components/xiaomi_hhccjcy01/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_hhccpot002/test.esp32-c3.yaml b/tests/components/xiaomi_hhccpot002/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_hhccpot002/test.esp32-c3.yaml rename to tests/components/xiaomi_hhccpot002/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_hhccpot002/test.esp32.yaml b/tests/components/xiaomi_hhccpot002/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_hhccpot002/test.esp32.yaml rename to tests/components/xiaomi_hhccpot002/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_jqjcy01ym/test.esp32-c3.yaml b/tests/components/xiaomi_jqjcy01ym/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_jqjcy01ym/test.esp32-c3.yaml rename to tests/components/xiaomi_jqjcy01ym/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_jqjcy01ym/test.esp32.yaml b/tests/components/xiaomi_jqjcy01ym/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_jqjcy01ym/test.esp32.yaml rename to tests/components/xiaomi_jqjcy01ym/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_lywsd02/test.esp32-c3.yaml b/tests/components/xiaomi_lywsd02/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsd02/test.esp32-c3.yaml rename to tests/components/xiaomi_lywsd02/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_lywsd02/test.esp32.yaml b/tests/components/xiaomi_lywsd02/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsd02/test.esp32.yaml rename to tests/components/xiaomi_lywsd02/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_lywsd03mmc/test.esp32-c3.yaml b/tests/components/xiaomi_lywsd03mmc/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsd03mmc/test.esp32-c3.yaml rename to tests/components/xiaomi_lywsd03mmc/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_lywsd03mmc/test.esp32.yaml b/tests/components/xiaomi_lywsd03mmc/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsd03mmc/test.esp32.yaml rename to tests/components/xiaomi_lywsd03mmc/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_lywsdcgq/test.esp32-c3.yaml b/tests/components/xiaomi_lywsdcgq/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsdcgq/test.esp32-c3.yaml rename to tests/components/xiaomi_lywsdcgq/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_lywsdcgq/test.esp32.yaml b/tests/components/xiaomi_lywsdcgq/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_lywsdcgq/test.esp32.yaml rename to tests/components/xiaomi_lywsdcgq/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_mhoc303/test.esp32-c3.yaml b/tests/components/xiaomi_mhoc303/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_mhoc303/test.esp32-c3.yaml rename to tests/components/xiaomi_mhoc303/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_mhoc303/test.esp32.yaml b/tests/components/xiaomi_mhoc303/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_mhoc303/test.esp32.yaml rename to tests/components/xiaomi_mhoc303/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_mhoc401/test.esp32-c3.yaml b/tests/components/xiaomi_mhoc401/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_mhoc401/test.esp32-c3.yaml rename to tests/components/xiaomi_mhoc401/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_mhoc401/test.esp32.yaml b/tests/components/xiaomi_mhoc401/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_mhoc401/test.esp32.yaml rename to tests/components/xiaomi_mhoc401/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_miscale copy/test.esp32-c3.yaml b/tests/components/xiaomi_miscale copy/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_miscale copy/test.esp32-c3.yaml rename to tests/components/xiaomi_miscale copy/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_miscale copy/test.esp32.yaml b/tests/components/xiaomi_miscale copy/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_miscale copy/test.esp32.yaml rename to tests/components/xiaomi_miscale copy/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_miscale/test.esp32-c3.yaml b/tests/components/xiaomi_miscale/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_miscale/test.esp32-c3.yaml rename to tests/components/xiaomi_miscale/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_miscale/test.esp32.yaml b/tests/components/xiaomi_miscale/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_miscale/test.esp32.yaml rename to tests/components/xiaomi_miscale/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_mjyd02yla/test.esp32-c3.yaml b/tests/components/xiaomi_mjyd02yla/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_mjyd02yla/test.esp32-c3.yaml rename to tests/components/xiaomi_mjyd02yla/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_mjyd02yla/test.esp32.yaml b/tests/components/xiaomi_mjyd02yla/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_mjyd02yla/test.esp32.yaml rename to tests/components/xiaomi_mjyd02yla/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_mue4094rt/test.esp32-c3.yaml b/tests/components/xiaomi_mue4094rt/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_mue4094rt/test.esp32-c3.yaml rename to tests/components/xiaomi_mue4094rt/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_mue4094rt/test.esp32.yaml b/tests/components/xiaomi_mue4094rt/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_mue4094rt/test.esp32.yaml rename to tests/components/xiaomi_mue4094rt/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_rtcgq02lm/test.esp32-c3.yaml b/tests/components/xiaomi_rtcgq02lm/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_rtcgq02lm/test.esp32-c3.yaml rename to tests/components/xiaomi_rtcgq02lm/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_rtcgq02lm/test.esp32.yaml b/tests/components/xiaomi_rtcgq02lm/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_rtcgq02lm/test.esp32.yaml rename to tests/components/xiaomi_rtcgq02lm/test.esp32-c3-ard.yaml diff --git a/tests/components/xiaomi_wx08zm/test.esp32-c3.yaml b/tests/components/xiaomi_wx08zm/test.esp32-ard.yaml similarity index 100% rename from tests/components/xiaomi_wx08zm/test.esp32-c3.yaml rename to tests/components/xiaomi_wx08zm/test.esp32-ard.yaml diff --git a/tests/components/xiaomi_wx08zm/test.esp32.yaml b/tests/components/xiaomi_wx08zm/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xiaomi_wx08zm/test.esp32.yaml rename to tests/components/xiaomi_wx08zm/test.esp32-c3-ard.yaml diff --git a/tests/components/xl9535/test.esp32.yaml b/tests/components/xl9535/test.esp32-ard.yaml similarity index 100% rename from tests/components/xl9535/test.esp32.yaml rename to tests/components/xl9535/test.esp32-ard.yaml diff --git a/tests/components/xl9535/test.esp32-c3.yaml b/tests/components/xl9535/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xl9535/test.esp32-c3.yaml rename to tests/components/xl9535/test.esp32-c3-ard.yaml diff --git a/tests/components/xl9535/test.esp8266.yaml b/tests/components/xl9535/test.esp8266-ard.yaml similarity index 100% rename from tests/components/xl9535/test.esp8266.yaml rename to tests/components/xl9535/test.esp8266-ard.yaml diff --git a/tests/components/xl9535/test.rp2040.yaml b/tests/components/xl9535/test.rp2040-ard.yaml similarity index 100% rename from tests/components/xl9535/test.rp2040.yaml rename to tests/components/xl9535/test.rp2040-ard.yaml diff --git a/tests/components/xpt2046/test.esp32.yaml b/tests/components/xpt2046/test.esp32-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.esp32.yaml rename to tests/components/xpt2046/test.esp32-ard.yaml diff --git a/tests/components/xpt2046/test.esp32-c3.yaml b/tests/components/xpt2046/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.esp32-c3.yaml rename to tests/components/xpt2046/test.esp32-c3-ard.yaml diff --git a/tests/components/xpt2046/test.esp32-s2.yaml b/tests/components/xpt2046/test.esp32-s2-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.esp32-s2.yaml rename to tests/components/xpt2046/test.esp32-s2-ard.yaml diff --git a/tests/components/xpt2046/test.esp8266.yaml b/tests/components/xpt2046/test.esp8266-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.esp8266.yaml rename to tests/components/xpt2046/test.esp8266-ard.yaml diff --git a/tests/components/xpt2046/test.rp2040.yaml b/tests/components/xpt2046/test.rp2040-ard.yaml similarity index 100% rename from tests/components/xpt2046/test.rp2040.yaml rename to tests/components/xpt2046/test.rp2040-ard.yaml diff --git a/tests/components/yashima/test.esp32-c3.yaml b/tests/components/yashima/test.esp32-ard.yaml similarity index 100% rename from tests/components/yashima/test.esp32-c3.yaml rename to tests/components/yashima/test.esp32-ard.yaml diff --git a/tests/components/yashima/test.esp32.yaml b/tests/components/yashima/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/yashima/test.esp32.yaml rename to tests/components/yashima/test.esp32-c3-ard.yaml diff --git a/tests/components/yashima/test.esp8266.yaml b/tests/components/yashima/test.esp8266-ard.yaml similarity index 100% rename from tests/components/yashima/test.esp8266.yaml rename to tests/components/yashima/test.esp8266-ard.yaml diff --git a/tests/components/zhlt01/test.esp32-c3.yaml b/tests/components/zhlt01/test.esp32-ard.yaml similarity index 100% rename from tests/components/zhlt01/test.esp32-c3.yaml rename to tests/components/zhlt01/test.esp32-ard.yaml diff --git a/tests/components/zhlt01/test.esp32.yaml b/tests/components/zhlt01/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/zhlt01/test.esp32.yaml rename to tests/components/zhlt01/test.esp32-c3-ard.yaml diff --git a/tests/components/zhlt01/test.esp8266.yaml b/tests/components/zhlt01/test.esp8266-ard.yaml similarity index 100% rename from tests/components/zhlt01/test.esp8266.yaml rename to tests/components/zhlt01/test.esp8266-ard.yaml diff --git a/tests/components/zio_ultrasonic/test.esp32.yaml b/tests/components/zio_ultrasonic/test.esp32-ard.yaml similarity index 100% rename from tests/components/zio_ultrasonic/test.esp32.yaml rename to tests/components/zio_ultrasonic/test.esp32-ard.yaml diff --git a/tests/components/zio_ultrasonic/test.esp32-c3.yaml b/tests/components/zio_ultrasonic/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/zio_ultrasonic/test.esp32-c3.yaml rename to tests/components/zio_ultrasonic/test.esp32-c3-ard.yaml diff --git a/tests/components/zio_ultrasonic/test.esp8266.yaml b/tests/components/zio_ultrasonic/test.esp8266-ard.yaml similarity index 100% rename from tests/components/zio_ultrasonic/test.esp8266.yaml rename to tests/components/zio_ultrasonic/test.esp8266-ard.yaml diff --git a/tests/components/zio_ultrasonic/test.rp2040.yaml b/tests/components/zio_ultrasonic/test.rp2040-ard.yaml similarity index 100% rename from tests/components/zio_ultrasonic/test.rp2040.yaml rename to tests/components/zio_ultrasonic/test.rp2040-ard.yaml diff --git a/tests/components/zyaura/test.esp32.yaml b/tests/components/zyaura/test.esp32-ard.yaml similarity index 100% rename from tests/components/zyaura/test.esp32.yaml rename to tests/components/zyaura/test.esp32-ard.yaml diff --git a/tests/components/zyaura/test.esp32-c3.yaml b/tests/components/zyaura/test.esp32-c3-ard.yaml similarity index 100% rename from tests/components/zyaura/test.esp32-c3.yaml rename to tests/components/zyaura/test.esp32-c3-ard.yaml diff --git a/tests/components/zyaura/test.esp8266.yaml b/tests/components/zyaura/test.esp8266-ard.yaml similarity index 100% rename from tests/components/zyaura/test.esp8266.yaml rename to tests/components/zyaura/test.esp8266-ard.yaml diff --git a/tests/components/zyaura/test.rp2040.yaml b/tests/components/zyaura/test.rp2040-ard.yaml similarity index 100% rename from tests/components/zyaura/test.rp2040.yaml rename to tests/components/zyaura/test.rp2040-ard.yaml diff --git a/tests/test_build_components/build_components_base.bk72xx.yaml b/tests/test_build_components/build_components_base.bk72xx-ard.yaml similarity index 100% rename from tests/test_build_components/build_components_base.bk72xx.yaml rename to tests/test_build_components/build_components_base.bk72xx-ard.yaml diff --git a/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml new file mode 100644 index 0000000000..08d4d8679c --- /dev/null +++ b/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml @@ -0,0 +1,19 @@ +esphome: + name: componenttestesp32c3idf50 + friendly_name: $component_name + +esp32: + board: lolin_c3_mini + framework: + type: esp-idf + version: 5.0.2 + platform_version: 6.3.2 + +logger: + level: VERY_VERBOSE + +packages: + component_under_test: !include + file: $component_test_file + vars: + component_test_file: $component_test_file diff --git a/tests/test_build_components/build_components_base.esp32-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-idf-50.yaml new file mode 100644 index 0000000000..c9f2c1e943 --- /dev/null +++ b/tests/test_build_components/build_components_base.esp32-idf-50.yaml @@ -0,0 +1,19 @@ +esphome: + name: componenttestesp32idf50 + friendly_name: $component_name + +esp32: + board: nodemcu-32s + framework: + type: esp-idf + version: 5.0.2 + platform_version: 6.3.2 + +logger: + level: VERY_VERBOSE + +packages: + component_under_test: !include + file: $component_test_file + vars: + component_test_file: $component_test_file diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml new file mode 100644 index 0000000000..351f5fb019 --- /dev/null +++ b/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml @@ -0,0 +1,20 @@ +esphome: + name: componenttestesp32s2idf50 + friendly_name: $component_name + +esp32: + board: esp32-s2-saola-1 + variant: ESP32S2 + framework: + type: esp-idf + version: 5.0.2 + platform_version: 6.3.2 + +logger: + level: VERY_VERBOSE + +packages: + component_under_test: !include + file: $component_test_file + vars: + component_test_file: $component_test_file diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf.yaml index 62f0f4f7bc..484906e8df 100644 --- a/tests/test_build_components/build_components_base.esp32-s2-idf.yaml +++ b/tests/test_build_components/build_components_base.esp32-s2-idf.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s2ard + name: componenttestesp32s2idf friendly_name: $component_name esp32: diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml new file mode 100644 index 0000000000..c05378903f --- /dev/null +++ b/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml @@ -0,0 +1,20 @@ +esphome: + name: componenttestesp32s3idf50 + friendly_name: $component_name + +esp32: + board: esp32s3box + variant: ESP32S3 + framework: + type: esp-idf + version: 5.0.2 + platform_version: 6.3.2 + +logger: + level: VERY_VERBOSE + +packages: + component_under_test: !include + file: $component_test_file + vars: + component_test_file: $component_test_file diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf.yaml index b1d08fcdf8..ee209000e9 100644 --- a/tests/test_build_components/build_components_base.esp32-s3-idf.yaml +++ b/tests/test_build_components/build_components_base.esp32-s3-idf.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s3ard + name: componenttestesp32s3idf friendly_name: $component_name esp32: diff --git a/tests/test_build_components/build_components_base.esp8266.yaml b/tests/test_build_components/build_components_base.esp8266-ard.yaml similarity index 87% rename from tests/test_build_components/build_components_base.esp8266.yaml rename to tests/test_build_components/build_components_base.esp8266-ard.yaml index ecf9acd2ba..e4d6607c86 100644 --- a/tests/test_build_components/build_components_base.esp8266.yaml +++ b/tests/test_build_components/build_components_base.esp8266-ard.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp8266 + name: componenttestesp8266ard friendly_name: $component_name esp8266: diff --git a/tests/test_build_components/build_components_base.rp2040.yaml b/tests/test_build_components/build_components_base.rp2040-ard.yaml similarity index 92% rename from tests/test_build_components/build_components_base.rp2040.yaml rename to tests/test_build_components/build_components_base.rp2040-ard.yaml index 335642374b..6c6a27e0a7 100644 --- a/tests/test_build_components/build_components_base.rp2040.yaml +++ b/tests/test_build_components/build_components_base.rp2040-ard.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestrp2040 + name: componenttestrp2040ard friendly_name: $component_name rp2040: From a78b2d0128bd3a3c54fdb092d8180497cd03a8a8 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:07:43 +1200 Subject: [PATCH 056/233] [wifi] Fix some access point bugs related to esp-idf 4.4.7 (#6928) * Set dhcp server range to only 10 IPs * Change log level to errors to make it clearer * We want to stop the dhcp server, not client --- .../wifi/wifi_component_esp32_arduino.cpp | 12 ++++++------ .../components/wifi/wifi_component_esp8266.cpp | 14 +++++++------- .../components/wifi/wifi_component_esp_idf.cpp | 16 ++++++++-------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/esphome/components/wifi/wifi_component_esp32_arduino.cpp b/esphome/components/wifi/wifi_component_esp32_arduino.cpp index ef7a624cd5..fc954a2333 100644 --- a/esphome/components/wifi/wifi_component_esp32_arduino.cpp +++ b/esphome/components/wifi/wifi_component_esp32_arduino.cpp @@ -694,15 +694,15 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { info.netmask = network::IPAddress(255, 255, 255, 0); } - err = esp_netif_dhcpc_stop(s_ap_netif); + err = esp_netif_dhcps_stop(s_ap_netif); if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { - ESP_LOGV(TAG, "esp_netif_dhcpc_stop failed: %s", esp_err_to_name(err)); + ESP_LOGE(TAG, "esp_netif_dhcps_stop failed: %s", esp_err_to_name(err)); return false; } err = esp_netif_set_ip_info(s_ap_netif, &info); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_set_ip_info failed! %d", err); + ESP_LOGE(TAG, "esp_netif_set_ip_info failed! %d", err); return false; } @@ -712,20 +712,20 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); err = esp_netif_dhcps_option(s_ap_netif, ESP_NETIF_OP_SET, ESP_NETIF_REQUESTED_IP_ADDRESS, &lease, sizeof(lease)); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_option failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_option failed! %d", err); return false; } err = esp_netif_dhcps_start(s_ap_netif); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_start failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_start failed! %d", err); return false; } diff --git a/esphome/components/wifi/wifi_component_esp8266.cpp b/esphome/components/wifi/wifi_component_esp8266.cpp index 838250972b..997457e2d2 100644 --- a/esphome/components/wifi/wifi_component_esp8266.cpp +++ b/esphome/components/wifi/wifi_component_esp8266.cpp @@ -716,12 +716,12 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { if (wifi_softap_dhcps_status() == DHCP_STARTED) { if (!wifi_softap_dhcps_stop()) { - ESP_LOGV(TAG, "Stopping DHCP server failed!"); + ESP_LOGW(TAG, "Stopping DHCP server failed!"); } } if (!wifi_set_ip_info(SOFTAP_IF, &info)) { - ESP_LOGV(TAG, "Setting SoftAP info failed!"); + ESP_LOGE(TAG, "Setting SoftAP info failed!"); return false; } @@ -735,17 +735,17 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); if (!wifi_softap_set_dhcps_lease(&lease)) { - ESP_LOGV(TAG, "Setting SoftAP DHCP lease failed!"); + ESP_LOGE(TAG, "Setting SoftAP DHCP lease failed!"); return false; } // lease time 1440 minutes (=24 hours) if (!wifi_softap_set_dhcps_lease_time(1440)) { - ESP_LOGV(TAG, "Setting SoftAP DHCP lease time failed!"); + ESP_LOGE(TAG, "Setting SoftAP DHCP lease time failed!"); return false; } @@ -755,13 +755,13 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { uint8_t mode = 1; // bit0, 1 enables router information from ESP8266 SoftAP DHCP server. if (!wifi_softap_set_dhcps_offer_option(OFFER_ROUTER, &mode)) { - ESP_LOGV(TAG, "wifi_softap_set_dhcps_offer_option failed!"); + ESP_LOGE(TAG, "wifi_softap_set_dhcps_offer_option failed!"); return false; } #endif if (!wifi_softap_dhcps_start()) { - ESP_LOGV(TAG, "Starting SoftAP DHCPS failed!"); + ESP_LOGE(TAG, "Starting SoftAP DHCPS failed!"); return false; } diff --git a/esphome/components/wifi/wifi_component_esp_idf.cpp b/esphome/components/wifi/wifi_component_esp_idf.cpp index bc575e6a2d..c21486fee4 100644 --- a/esphome/components/wifi/wifi_component_esp_idf.cpp +++ b/esphome/components/wifi/wifi_component_esp_idf.cpp @@ -823,15 +823,15 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { info.netmask = network::IPAddress(255, 255, 255, 0); } - err = esp_netif_dhcpc_stop(s_ap_netif); + err = esp_netif_dhcps_stop(s_ap_netif); if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { - ESP_LOGV(TAG, "esp_netif_dhcpc_stop failed: %s", esp_err_to_name(err)); + ESP_LOGE(TAG, "esp_netif_dhcps_stop failed: %s", esp_err_to_name(err)); return false; } err = esp_netif_set_ip_info(s_ap_netif, &info); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_set_ip_info failed! %d", err); + ESP_LOGE(TAG, "esp_netif_set_ip_info failed! %d", err); return false; } @@ -841,20 +841,20 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); err = esp_netif_dhcps_option(s_ap_netif, ESP_NETIF_OP_SET, ESP_NETIF_REQUESTED_IP_ADDRESS, &lease, sizeof(lease)); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_option failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_option failed! %d", err); return false; } err = esp_netif_dhcps_start(s_ap_netif); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_start failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_start failed! %d", err); return false; } @@ -887,12 +887,12 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { esp_err_t err = esp_wifi_set_config(WIFI_IF_AP, &conf); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_set_config failed! %d", err); + ESP_LOGE(TAG, "esp_wifi_set_config failed! %d", err); return false; } if (!this->wifi_ap_ip_config_(ap.get_manual_ip())) { - ESP_LOGV(TAG, "wifi_ap_ip_config_ failed!"); + ESP_LOGE(TAG, "wifi_ap_ip_config_ failed!"); return false; } From 4c313bc1982c2eabc3ccfe54b84008323c8fc5ad Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:12:55 +1200 Subject: [PATCH 057/233] Rename legacy/modern to ota/factory (#6922) * Rename legacy/modern to ota/factory * Add modern/legacy in brackets --- esphome/components/esp32/__init__.py | 14 +++++------ esphome/components/esp32/post_build.py.script | 13 ++++++++++- .../components/esp8266/post_build.py.script | 10 +++++++- esphome/components/rp2040/__init__.py | 18 +++++++++++++-- .../components/rp2040/post_build.py.script | 23 +++++++++++++++++++ 5 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 esphome/components/rp2040/post_build.py.script diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 8f46567266..1effea708f 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -96,16 +96,16 @@ def get_board(core_obj=None): def get_download_types(storage_json): return [ { - "title": "Modern format", + "title": "Factory format (Previously Modern)", "description": "For use with ESPHome Web and other tools.", - "file": "firmware-factory.bin", - "download": f"{storage_json.name}-factory.bin", + "file": "firmware.factory.bin", + "download": f"{storage_json.name}.factory.bin", }, { - "title": "Legacy format", - "description": "For use with ESPHome Flasher.", - "file": "firmware.bin", - "download": f"{storage_json.name}.bin", + "title": "OTA format (Previously Legacy)", + "description": "For OTA updating a device.", + "file": "firmware.ota.bin", + "download": f"{storage_json.name}.ota.bin", }, ] diff --git a/esphome/components/esp32/post_build.py.script b/esphome/components/esp32/post_build.py.script index c941bdb386..c181cf30b1 100644 --- a/esphome/components/esp32/post_build.py.script +++ b/esphome/components/esp32/post_build.py.script @@ -17,17 +17,19 @@ from SCons.Script import ARGUMENTS # Copy over the default sdkconfig. from os import path + if path.exists("./sdkconfig.defaults"): os.makedirs(".temp", exist_ok=True) shutil.copy("./sdkconfig.defaults", "./.temp/sdkconfig-esp32-idf") + def esp32_create_combined_bin(source, target, env): verbose = bool(int(ARGUMENTS.get("PIOVERBOSE", "0"))) if verbose: print("Generating combined binary for serial flashing") app_offset = 0x10000 - new_file_name = env.subst("$BUILD_DIR/${PROGNAME}-factory.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") sections = env.subst(env.get("FLASH_EXTRA_IMAGES")) firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") chip = env.get("BOARD_MCU") @@ -62,5 +64,14 @@ def esp32_create_combined_bin(source, target, env): else: subprocess.run(["esptool.py", *cmd]) + +def esp32_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") + + shutil.copyfile(firmware_name, new_file_name) + + # pylint: disable=E0602 env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_copy_ota_bin) # noqa diff --git a/esphome/components/esp8266/post_build.py.script b/esphome/components/esp8266/post_build.py.script index 4dab1cbd27..0a854d7599 100644 --- a/esphome/components/esp8266/post_build.py.script +++ b/esphome/components/esp8266/post_build.py.script @@ -6,10 +6,18 @@ Import("env") # noqa def esp8266_copy_factory_bin(source, target, env): firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") - new_file_name = env.subst("$BUILD_DIR/${PROGNAME}-factory.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") + + shutil.copyfile(firmware_name, new_file_name) + + +def esp8266_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") shutil.copyfile(firmware_name, new_file_name) # pylint: disable=E0602 env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp8266_copy_factory_bin) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp8266_copy_ota_bin) # noqa diff --git a/esphome/components/rp2040/__init__.py b/esphome/components/rp2040/__init__.py index ace455add7..f5c3b8bda2 100644 --- a/esphome/components/rp2040/__init__.py +++ b/esphome/components/rp2040/__init__.py @@ -47,10 +47,16 @@ def set_core_data(config): def get_download_types(storage_json): return [ { - "title": "UF2 format", + "title": "UF2 factory format", "description": "For copying to RP2040 over USB.", "file": "firmware.uf2", - "download": f"{storage_json.name}.uf2", + "download": f"{storage_json.name}.factory.uf2", + }, + { + "title": "OTA format", + "description": "For OTA updating a device.", + "file": "firmware.ota.bin", + "download": f"{storage_json.name}.ota.bin", }, ] @@ -160,6 +166,8 @@ async def to_code(config): cg.add_define("ESPHOME_BOARD", config[CONF_BOARD]) cg.add_define("ESPHOME_VARIANT", "RP2040") + cg.add_platformio_option("extra_scripts", ["post:post_build.py"]) + conf = config[CONF_FRAMEWORK] cg.add_platformio_option("framework", "arduino") cg.add_build_flag("-DUSE_ARDUINO") @@ -225,4 +233,10 @@ def generate_pio_files() -> bool: # Called by writer.py def copy_files() -> bool: + dir = os.path.dirname(__file__) + post_build_file = os.path.join(dir, "post_build.py.script") + copy_file_if_changed( + post_build_file, + CORE.relative_build_path("post_build.py"), + ) return generate_pio_files() diff --git a/esphome/components/rp2040/post_build.py.script b/esphome/components/rp2040/post_build.py.script new file mode 100644 index 0000000000..7dcd7e52a6 --- /dev/null +++ b/esphome/components/rp2040/post_build.py.script @@ -0,0 +1,23 @@ +import shutil + +# pylint: disable=E0602 +Import("env") # noqa + + +def rp2040_copy_factory_uf2(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.uf2") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.uf2") + + shutil.copyfile(firmware_name, new_file_name) + + +def rp2040_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") + + shutil.copyfile(firmware_name, new_file_name) + + +# pylint: disable=E0602 +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", rp2040_copy_factory_uf2) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", rp2040_copy_ota_bin) # noqa From 7d642147c154ad4c825f23c726ac73bcf4210f8a Mon Sep 17 00:00:00 2001 From: Faidon Liambotis Date: Tue, 18 Jun 2024 05:22:50 +0300 Subject: [PATCH 058/233] uart: allow setting the UART id in final_validate_device_schema (#6923) --- esphome/components/uart/__init__.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/esphome/components/uart/__init__.py b/esphome/components/uart/__init__.py index 088227afe5..b036288078 100644 --- a/esphome/components/uart/__init__.py +++ b/esphome/components/uart/__init__.py @@ -258,6 +258,7 @@ KEY_UART_DEVICES = "uart_devices" def final_validate_device_schema( name: str, *, + uart_bus: str = CONF_UART_ID, baud_rate: Optional[int] = None, require_tx: bool = False, require_rx: bool = False, @@ -268,7 +269,7 @@ def final_validate_device_schema( def validate_baud_rate(value): if value != baud_rate: raise cv.Invalid( - f"Component {name} requires baud rate {baud_rate} for the uart bus" + f"Component {name} requires baud rate {baud_rate} for the uart referenced by {uart_bus}" ) return value @@ -287,21 +288,21 @@ def final_validate_device_schema( def validate_data_bits(value): if value != data_bits: raise cv.Invalid( - f"Component {name} requires {data_bits} data bits for the uart bus" + f"Component {name} requires {data_bits} data bits for the uart referenced by {uart_bus}" ) return value def validate_parity(value): if value != parity: raise cv.Invalid( - f"Component {name} requires parity {parity} for the uart bus" + f"Component {name} requires parity {parity} for the uart referenced by {uart_bus}" ) return value def validate_stop_bits(value): if value != stop_bits: raise cv.Invalid( - f"Component {name} requires {stop_bits} stop bits for the uart bus" + f"Component {name} requires {stop_bits} stop bits for the uart referenced by {uart_bus}" ) return value @@ -316,14 +317,14 @@ def final_validate_device_schema( hub_schema[ cv.Required( CONF_TX_PIN, - msg=f"Component {name} requires this uart bus to declare a tx_pin", + msg=f"Component {name} requires uart referenced by {uart_bus} to declare a tx_pin", ) ] = validate_pin(CONF_TX_PIN, device) if require_rx and uart_id_type_str in NATIVE_UART_CLASSES: hub_schema[ cv.Required( CONF_RX_PIN, - msg=f"Component {name} requires this uart bus to declare a rx_pin", + msg=f"Component {name} requires uart referenced by {uart_bus} to declare a rx_pin", ) ] = validate_pin(CONF_RX_PIN, device) if baud_rate is not None: @@ -337,7 +338,7 @@ def final_validate_device_schema( return cv.Schema(hub_schema, extra=cv.ALLOW_EXTRA)(hub_config) return cv.Schema( - {cv.Required(CONF_UART_ID): fv.id_declaration_match_schema(validate_hub)}, + {cv.Required(uart_bus): fv.id_declaration_match_schema(validate_hub)}, extra=cv.ALLOW_EXTRA, ) From 5dec62bf1e464baca86d9e8cda94ca4ada2e0913 Mon Sep 17 00:00:00 2001 From: Giel van Schijndel Date: Mon, 17 Jun 2024 07:48:56 +0200 Subject: [PATCH 059/233] fix(dallas): make recovery time for 1-bit equal to that of 0-bit (#6763) --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index f47e8d58e3..34c2cf3c29 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -60,7 +60,7 @@ void HOT IRAM_ATTR GPIOOneWireBus::write_bit_(bool bit) { // recovery time: t_rec: min=1µs // ds18b20 appears to read the bus after roughly 14µs uint32_t delay0 = bit ? 6 : 60; - uint32_t delay1 = bit ? 54 : 5; + uint32_t delay1 = bit ? 59 : 5; // delay A/C delayMicroseconds(delay0); From d27e7b3b70310a7970ee44213bb3680a554bd5b1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:07:43 +1200 Subject: [PATCH 060/233] [wifi] Fix some access point bugs related to esp-idf 4.4.7 (#6928) * Set dhcp server range to only 10 IPs * Change log level to errors to make it clearer * We want to stop the dhcp server, not client --- .../wifi/wifi_component_esp32_arduino.cpp | 12 ++++++------ .../components/wifi/wifi_component_esp8266.cpp | 14 +++++++------- .../components/wifi/wifi_component_esp_idf.cpp | 16 ++++++++-------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/esphome/components/wifi/wifi_component_esp32_arduino.cpp b/esphome/components/wifi/wifi_component_esp32_arduino.cpp index ef7a624cd5..fc954a2333 100644 --- a/esphome/components/wifi/wifi_component_esp32_arduino.cpp +++ b/esphome/components/wifi/wifi_component_esp32_arduino.cpp @@ -694,15 +694,15 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { info.netmask = network::IPAddress(255, 255, 255, 0); } - err = esp_netif_dhcpc_stop(s_ap_netif); + err = esp_netif_dhcps_stop(s_ap_netif); if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { - ESP_LOGV(TAG, "esp_netif_dhcpc_stop failed: %s", esp_err_to_name(err)); + ESP_LOGE(TAG, "esp_netif_dhcps_stop failed: %s", esp_err_to_name(err)); return false; } err = esp_netif_set_ip_info(s_ap_netif, &info); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_set_ip_info failed! %d", err); + ESP_LOGE(TAG, "esp_netif_set_ip_info failed! %d", err); return false; } @@ -712,20 +712,20 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); err = esp_netif_dhcps_option(s_ap_netif, ESP_NETIF_OP_SET, ESP_NETIF_REQUESTED_IP_ADDRESS, &lease, sizeof(lease)); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_option failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_option failed! %d", err); return false; } err = esp_netif_dhcps_start(s_ap_netif); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_start failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_start failed! %d", err); return false; } diff --git a/esphome/components/wifi/wifi_component_esp8266.cpp b/esphome/components/wifi/wifi_component_esp8266.cpp index 838250972b..997457e2d2 100644 --- a/esphome/components/wifi/wifi_component_esp8266.cpp +++ b/esphome/components/wifi/wifi_component_esp8266.cpp @@ -716,12 +716,12 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { if (wifi_softap_dhcps_status() == DHCP_STARTED) { if (!wifi_softap_dhcps_stop()) { - ESP_LOGV(TAG, "Stopping DHCP server failed!"); + ESP_LOGW(TAG, "Stopping DHCP server failed!"); } } if (!wifi_set_ip_info(SOFTAP_IF, &info)) { - ESP_LOGV(TAG, "Setting SoftAP info failed!"); + ESP_LOGE(TAG, "Setting SoftAP info failed!"); return false; } @@ -735,17 +735,17 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); if (!wifi_softap_set_dhcps_lease(&lease)) { - ESP_LOGV(TAG, "Setting SoftAP DHCP lease failed!"); + ESP_LOGE(TAG, "Setting SoftAP DHCP lease failed!"); return false; } // lease time 1440 minutes (=24 hours) if (!wifi_softap_set_dhcps_lease_time(1440)) { - ESP_LOGV(TAG, "Setting SoftAP DHCP lease time failed!"); + ESP_LOGE(TAG, "Setting SoftAP DHCP lease time failed!"); return false; } @@ -755,13 +755,13 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { uint8_t mode = 1; // bit0, 1 enables router information from ESP8266 SoftAP DHCP server. if (!wifi_softap_set_dhcps_offer_option(OFFER_ROUTER, &mode)) { - ESP_LOGV(TAG, "wifi_softap_set_dhcps_offer_option failed!"); + ESP_LOGE(TAG, "wifi_softap_set_dhcps_offer_option failed!"); return false; } #endif if (!wifi_softap_dhcps_start()) { - ESP_LOGV(TAG, "Starting SoftAP DHCPS failed!"); + ESP_LOGE(TAG, "Starting SoftAP DHCPS failed!"); return false; } diff --git a/esphome/components/wifi/wifi_component_esp_idf.cpp b/esphome/components/wifi/wifi_component_esp_idf.cpp index bc575e6a2d..c21486fee4 100644 --- a/esphome/components/wifi/wifi_component_esp_idf.cpp +++ b/esphome/components/wifi/wifi_component_esp_idf.cpp @@ -823,15 +823,15 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { info.netmask = network::IPAddress(255, 255, 255, 0); } - err = esp_netif_dhcpc_stop(s_ap_netif); + err = esp_netif_dhcps_stop(s_ap_netif); if (err != ESP_OK && err != ESP_ERR_ESP_NETIF_DHCP_ALREADY_STOPPED) { - ESP_LOGV(TAG, "esp_netif_dhcpc_stop failed: %s", esp_err_to_name(err)); + ESP_LOGE(TAG, "esp_netif_dhcps_stop failed: %s", esp_err_to_name(err)); return false; } err = esp_netif_set_ip_info(s_ap_netif, &info); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_set_ip_info failed! %d", err); + ESP_LOGE(TAG, "esp_netif_set_ip_info failed! %d", err); return false; } @@ -841,20 +841,20 @@ bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { start_address += 99; lease.start_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease start: %s", start_address.str().c_str()); - start_address += 100; + start_address += 10; lease.end_ip = start_address; ESP_LOGV(TAG, "DHCP server IP lease end: %s", start_address.str().c_str()); err = esp_netif_dhcps_option(s_ap_netif, ESP_NETIF_OP_SET, ESP_NETIF_REQUESTED_IP_ADDRESS, &lease, sizeof(lease)); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_option failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_option failed! %d", err); return false; } err = esp_netif_dhcps_start(s_ap_netif); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_netif_dhcps_start failed! %d", err); + ESP_LOGE(TAG, "esp_netif_dhcps_start failed! %d", err); return false; } @@ -887,12 +887,12 @@ bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { esp_err_t err = esp_wifi_set_config(WIFI_IF_AP, &conf); if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_set_config failed! %d", err); + ESP_LOGE(TAG, "esp_wifi_set_config failed! %d", err); return false; } if (!this->wifi_ap_ip_config_(ap.get_manual_ip())) { - ESP_LOGV(TAG, "wifi_ap_ip_config_ failed!"); + ESP_LOGE(TAG, "wifi_ap_ip_config_ failed!"); return false; } From 43b5c2deb747114eae8367f7fbfba34296c24146 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:12:55 +1200 Subject: [PATCH 061/233] Rename legacy/modern to ota/factory (#6922) * Rename legacy/modern to ota/factory * Add modern/legacy in brackets --- esphome/components/esp32/__init__.py | 14 +++++------ esphome/components/esp32/post_build.py.script | 13 ++++++++++- .../components/esp8266/post_build.py.script | 10 +++++++- esphome/components/rp2040/__init__.py | 18 +++++++++++++-- .../components/rp2040/post_build.py.script | 23 +++++++++++++++++++ 5 files changed, 67 insertions(+), 11 deletions(-) create mode 100644 esphome/components/rp2040/post_build.py.script diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py index 8f46567266..1effea708f 100644 --- a/esphome/components/esp32/__init__.py +++ b/esphome/components/esp32/__init__.py @@ -96,16 +96,16 @@ def get_board(core_obj=None): def get_download_types(storage_json): return [ { - "title": "Modern format", + "title": "Factory format (Previously Modern)", "description": "For use with ESPHome Web and other tools.", - "file": "firmware-factory.bin", - "download": f"{storage_json.name}-factory.bin", + "file": "firmware.factory.bin", + "download": f"{storage_json.name}.factory.bin", }, { - "title": "Legacy format", - "description": "For use with ESPHome Flasher.", - "file": "firmware.bin", - "download": f"{storage_json.name}.bin", + "title": "OTA format (Previously Legacy)", + "description": "For OTA updating a device.", + "file": "firmware.ota.bin", + "download": f"{storage_json.name}.ota.bin", }, ] diff --git a/esphome/components/esp32/post_build.py.script b/esphome/components/esp32/post_build.py.script index c941bdb386..c181cf30b1 100644 --- a/esphome/components/esp32/post_build.py.script +++ b/esphome/components/esp32/post_build.py.script @@ -17,17 +17,19 @@ from SCons.Script import ARGUMENTS # Copy over the default sdkconfig. from os import path + if path.exists("./sdkconfig.defaults"): os.makedirs(".temp", exist_ok=True) shutil.copy("./sdkconfig.defaults", "./.temp/sdkconfig-esp32-idf") + def esp32_create_combined_bin(source, target, env): verbose = bool(int(ARGUMENTS.get("PIOVERBOSE", "0"))) if verbose: print("Generating combined binary for serial flashing") app_offset = 0x10000 - new_file_name = env.subst("$BUILD_DIR/${PROGNAME}-factory.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") sections = env.subst(env.get("FLASH_EXTRA_IMAGES")) firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") chip = env.get("BOARD_MCU") @@ -62,5 +64,14 @@ def esp32_create_combined_bin(source, target, env): else: subprocess.run(["esptool.py", *cmd]) + +def esp32_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") + + shutil.copyfile(firmware_name, new_file_name) + + # pylint: disable=E0602 env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_copy_ota_bin) # noqa diff --git a/esphome/components/esp8266/post_build.py.script b/esphome/components/esp8266/post_build.py.script index 4dab1cbd27..0a854d7599 100644 --- a/esphome/components/esp8266/post_build.py.script +++ b/esphome/components/esp8266/post_build.py.script @@ -6,10 +6,18 @@ Import("env") # noqa def esp8266_copy_factory_bin(source, target, env): firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") - new_file_name = env.subst("$BUILD_DIR/${PROGNAME}-factory.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") + + shutil.copyfile(firmware_name, new_file_name) + + +def esp8266_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") shutil.copyfile(firmware_name, new_file_name) # pylint: disable=E0602 env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp8266_copy_factory_bin) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp8266_copy_ota_bin) # noqa diff --git a/esphome/components/rp2040/__init__.py b/esphome/components/rp2040/__init__.py index ace455add7..f5c3b8bda2 100644 --- a/esphome/components/rp2040/__init__.py +++ b/esphome/components/rp2040/__init__.py @@ -47,10 +47,16 @@ def set_core_data(config): def get_download_types(storage_json): return [ { - "title": "UF2 format", + "title": "UF2 factory format", "description": "For copying to RP2040 over USB.", "file": "firmware.uf2", - "download": f"{storage_json.name}.uf2", + "download": f"{storage_json.name}.factory.uf2", + }, + { + "title": "OTA format", + "description": "For OTA updating a device.", + "file": "firmware.ota.bin", + "download": f"{storage_json.name}.ota.bin", }, ] @@ -160,6 +166,8 @@ async def to_code(config): cg.add_define("ESPHOME_BOARD", config[CONF_BOARD]) cg.add_define("ESPHOME_VARIANT", "RP2040") + cg.add_platformio_option("extra_scripts", ["post:post_build.py"]) + conf = config[CONF_FRAMEWORK] cg.add_platformio_option("framework", "arduino") cg.add_build_flag("-DUSE_ARDUINO") @@ -225,4 +233,10 @@ def generate_pio_files() -> bool: # Called by writer.py def copy_files() -> bool: + dir = os.path.dirname(__file__) + post_build_file = os.path.join(dir, "post_build.py.script") + copy_file_if_changed( + post_build_file, + CORE.relative_build_path("post_build.py"), + ) return generate_pio_files() diff --git a/esphome/components/rp2040/post_build.py.script b/esphome/components/rp2040/post_build.py.script new file mode 100644 index 0000000000..7dcd7e52a6 --- /dev/null +++ b/esphome/components/rp2040/post_build.py.script @@ -0,0 +1,23 @@ +import shutil + +# pylint: disable=E0602 +Import("env") # noqa + + +def rp2040_copy_factory_uf2(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.uf2") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.uf2") + + shutil.copyfile(firmware_name, new_file_name) + + +def rp2040_copy_ota_bin(source, target, env): + firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.ota.bin") + + shutil.copyfile(firmware_name, new_file_name) + + +# pylint: disable=E0602 +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", rp2040_copy_factory_uf2) # noqa +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", rp2040_copy_ota_bin) # noqa From ff07637dfdfb5364076966fba12dc1de949e8748 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 18 Jun 2024 14:26:24 +1200 Subject: [PATCH 062/233] Bump version to 2024.6.0b4 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index a0fe325282..eea437bcdc 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b3" +__version__ = "2024.6.0b4" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 65a79acfb972876bfd54d777393bd553cdfde8e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:44:20 +1200 Subject: [PATCH 063/233] Bump pypa/gh-action-pypi-publish from 1.8.14 to 1.9.0 (#6926) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9c07335104..a1942e8cac 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,7 +65,7 @@ jobs: pip3 install build python3 -m build - name: Publish - uses: pypa/gh-action-pypi-publish@v1.8.14 + uses: pypa/gh-action-pypi-publish@v1.9.0 deploy-docker: name: Build ESPHome ${{ matrix.platform }} From c18056bdda129136f05b52388e738ceec8242e62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 19:16:10 +1200 Subject: [PATCH 064/233] Bump docker/build-push-action from 5.4.0 to 6.0.0 in /.github/actions/build-image (#6927) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index d792ab5f4c..c685e80bec 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . file: ./docker/Dockerfile From 65b05af0143a11a5d0e290f7025a275808cbd143 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 07:38:31 +1200 Subject: [PATCH 065/233] Bump peter-evans/create-pull-request from 6.0.5 to 6.1.0 (#6935) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/sync-device-classes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync-device-classes.yml b/.github/workflows/sync-device-classes.yml index 45f6b27127..89a3627c64 100644 --- a/.github/workflows/sync-device-classes.yml +++ b/.github/workflows/sync-device-classes.yml @@ -36,7 +36,7 @@ jobs: python ./script/sync-device_class.py - name: Commit changes - uses: peter-evans/create-pull-request@v6.0.5 + uses: peter-evans/create-pull-request@v6.1.0 with: commit-message: "Synchronise Device Classes from Home Assistant" committer: esphomebot From ed6462fa00b2162d541a433076c01d67fb3c8e84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 07:38:50 +1200 Subject: [PATCH 066/233] Bump docker/build-push-action from 6.0.0 to 6.0.1 in /.github/actions/build-image (#6934) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index c685e80bec..53cd836573 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.0.1 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.0.1 with: context: . file: ./docker/Dockerfile From 896cdab22dfde5fbd64f3d0506d0d0d3990ef28b Mon Sep 17 00:00:00 2001 From: Manuel Kasper Date: Tue, 18 Jun 2024 21:53:01 +0200 Subject: [PATCH 067/233] Fix garbled graphics on LILYGO T4-S3 display (#6910) --- esphome/components/qspi_amoled/display.py | 20 +++++++++++++++---- .../components/qspi_amoled/qspi_amoled.cpp | 13 ++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/esphome/components/qspi_amoled/display.py b/esphome/components/qspi_amoled/display.py index 84bf9553cb..77d1e3d095 100644 --- a/esphome/components/qspi_amoled/display.py +++ b/esphome/components/qspi_amoled/display.py @@ -42,6 +42,14 @@ COLOR_ORDERS = { } DATA_PIN_SCHEMA = pins.internal_gpio_output_pin_schema + +def validate_dimension(value): + value = cv.positive_int(value) + if value % 2 != 0: + raise cv.Invalid("Width/height/offset must be divisible by 2") + return value + + CONFIG_SCHEMA = cv.All( display.FULL_DISPLAY_SCHEMA.extend( cv.Schema( @@ -52,10 +60,14 @@ CONFIG_SCHEMA = cv.All( cv.dimensions, cv.Schema( { - cv.Required(CONF_WIDTH): cv.int_, - cv.Required(CONF_HEIGHT): cv.int_, - cv.Optional(CONF_OFFSET_HEIGHT, default=0): cv.int_, - cv.Optional(CONF_OFFSET_WIDTH, default=0): cv.int_, + cv.Required(CONF_WIDTH): validate_dimension, + cv.Required(CONF_HEIGHT): validate_dimension, + cv.Optional( + CONF_OFFSET_HEIGHT, default=0 + ): validate_dimension, + cv.Optional( + CONF_OFFSET_WIDTH, default=0 + ): validate_dimension, } ), ), diff --git a/esphome/components/qspi_amoled/qspi_amoled.cpp b/esphome/components/qspi_amoled/qspi_amoled.cpp index 697989e861..36e9b03252 100644 --- a/esphome/components/qspi_amoled/qspi_amoled.cpp +++ b/esphome/components/qspi_amoled/qspi_amoled.cpp @@ -26,6 +26,19 @@ void QspiAmoLed::setup() { void QspiAmoLed::update() { this->do_update_(); + // Start addresses and widths/heights must be divisible by 2 (CASET/RASET restriction in datasheet) + if (this->x_low_ % 2 == 1) { + this->x_low_--; + } + if (this->x_high_ % 2 == 0) { + this->x_high_++; + } + if (this->y_low_ % 2 == 1) { + this->y_low_--; + } + if (this->y_high_ % 2 == 0) { + this->y_high_++; + } int w = this->x_high_ - this->x_low_ + 1; int h = this->y_high_ - this->y_low_ + 1; this->draw_pixels_at(this->x_low_, this->y_low_, w, h, this->buffer_, this->color_mode_, display::COLOR_BITNESS_565, From 310f850ee4a7dd7ed5084bd307122c0cbb2d4991 Mon Sep 17 00:00:00 2001 From: peter--s Date: Wed, 19 Jun 2024 03:28:03 +0200 Subject: [PATCH 068/233] Update cover.h for open() and close() compiler warnings (#6936) --- esphome/components/cover/cover.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/cover/cover.h b/esphome/components/cover/cover.h index 89598a9636..8b6f5b8a72 100644 --- a/esphome/components/cover/cover.h +++ b/esphome/components/cover/cover.h @@ -129,13 +129,13 @@ class Cover : public EntityBase, public EntityBase_DeviceClass { * * This is a legacy method and may be removed later, please use `.make_call()` instead. */ - ESPDEPRECATED("open() is deprecated, use make_call().set_command_open() instead.", "2021.9") + ESPDEPRECATED("open() is deprecated, use make_call().set_command_open().perform() instead.", "2021.9") void open(); /** Close the cover. * * This is a legacy method and may be removed later, please use `.make_call()` instead. */ - ESPDEPRECATED("close() is deprecated, use make_call().set_command_close() instead.", "2021.9") + ESPDEPRECATED("close() is deprecated, use make_call().set_command_close().perform() instead.", "2021.9") void close(); /** Stop the cover. * From 8567877f07d2900a067c6b0fc57e5b0e07685f1d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:09:16 +1200 Subject: [PATCH 069/233] [network] Default ipv6 to false to always set the flags (#6937) * [network] Default ipv6 to false to always set the flags * Separate tests for ipv6 disabled and enabled * Forgot other platforms wouldnt have the variable in config --- esphome/components/network/__init__.py | 26 +++++++++++-------- tests/components/network/common.yaml | 5 +++- .../network/test-ipv6.esp32-ard.yaml | 4 +++ .../network/test-ipv6.esp32-c3-ard.yaml | 4 +++ .../network/test-ipv6.esp32-c3-idf.yaml | 4 +++ .../network/test-ipv6.esp32-idf.yaml | 4 +++ .../network/test-ipv6.esp8266-ard.yaml | 4 +++ .../network/test-ipv6.rp2040-ard.yaml | 4 +++ tests/components/network/test.host.yaml | 1 + 9 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 tests/components/network/test-ipv6.esp32-ard.yaml create mode 100644 tests/components/network/test-ipv6.esp32-c3-ard.yaml create mode 100644 tests/components/network/test-ipv6.esp32-c3-idf.yaml create mode 100644 tests/components/network/test-ipv6.esp32-idf.yaml create mode 100644 tests/components/network/test-ipv6.esp8266-ard.yaml create mode 100644 tests/components/network/test-ipv6.rp2040-ard.yaml create mode 100644 tests/components/network/test.host.yaml diff --git a/esphome/components/network/__init__.py b/esphome/components/network/__init__.py index 36144ff0a4..9ef75e0fb9 100644 --- a/esphome/components/network/__init__.py +++ b/esphome/components/network/__init__.py @@ -19,7 +19,12 @@ IPAddress = network_ns.class_("IPAddress") CONFIG_SCHEMA = cv.Schema( { - cv.SplitDefault(CONF_ENABLE_IPV6): cv.All( + cv.SplitDefault( + CONF_ENABLE_IPV6, + esp8266=False, + esp32=False, + rp2040=False, + ): cv.All( cv.boolean, cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_RP2040]) ), cv.Optional(CONF_MIN_IPV6_ADDR_COUNT, default=0): cv.positive_int, @@ -28,18 +33,17 @@ CONFIG_SCHEMA = cv.Schema( async def to_code(config): - if CONF_ENABLE_IPV6 in config: - cg.add_define("USE_NETWORK_IPV6", config[CONF_ENABLE_IPV6]) - cg.add_define( - "USE_NETWORK_MIN_IPV6_ADDR_COUNT", config[CONF_MIN_IPV6_ADDR_COUNT] - ) - if CORE.using_esp_idf: - add_idf_sdkconfig_option("CONFIG_LWIP_IPV6", config[CONF_ENABLE_IPV6]) - add_idf_sdkconfig_option( - "CONFIG_LWIP_IPV6_AUTOCONFIG", config[CONF_ENABLE_IPV6] + if (enable_ipv6 := config.get(CONF_ENABLE_IPV6, None)) is not None: + cg.add_define("USE_NETWORK_IPV6", enable_ipv6) + if enable_ipv6: + cg.add_define( + "USE_NETWORK_MIN_IPV6_ADDR_COUNT", config[CONF_MIN_IPV6_ADDR_COUNT] ) + if CORE.using_esp_idf: + add_idf_sdkconfig_option("CONFIG_LWIP_IPV6", enable_ipv6) + add_idf_sdkconfig_option("CONFIG_LWIP_IPV6_AUTOCONFIG", enable_ipv6) else: - if config[CONF_ENABLE_IPV6]: + if enable_ipv6: cg.add_build_flag("-DCONFIG_LWIP_IPV6") cg.add_build_flag("-DCONFIG_LWIP_IPV6_AUTOCONFIG") if CORE.is_rp2040: diff --git a/tests/components/network/common.yaml b/tests/components/network/common.yaml index 147afd1e81..dca00cbeb6 100644 --- a/tests/components/network/common.yaml +++ b/tests/components/network/common.yaml @@ -1,6 +1,9 @@ +substitutions: + network_enable_ipv6: "false" + wifi: ssid: MySSID password: password1 network: - enable_ipv6: true + enable_ipv6: ${network_enable_ipv6} diff --git a/tests/components/network/test-ipv6.esp32-ard.yaml b/tests/components/network/test-ipv6.esp32-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-c3-ard.yaml b/tests/components/network/test-ipv6.esp32-c3-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-c3-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-c3-idf.yaml b/tests/components/network/test-ipv6.esp32-c3-idf.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-c3-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-idf.yaml b/tests/components/network/test-ipv6.esp32-idf.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp8266-ard.yaml b/tests/components/network/test-ipv6.esp8266-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp8266-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.rp2040-ard.yaml b/tests/components/network/test-ipv6.rp2040-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.rp2040-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test.host.yaml b/tests/components/network/test.host.yaml new file mode 100644 index 0000000000..61889b0361 --- /dev/null +++ b/tests/components/network/test.host.yaml @@ -0,0 +1 @@ +network: From fd7a212562089d1e2ce55b4f698cd20343de8094 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 16:44:20 +1200 Subject: [PATCH 070/233] Bump pypa/gh-action-pypi-publish from 1.8.14 to 1.9.0 (#6926) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 563d485b6a..62031e925a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,7 +65,7 @@ jobs: pip3 install build python3 -m build - name: Publish - uses: pypa/gh-action-pypi-publish@v1.8.14 + uses: pypa/gh-action-pypi-publish@v1.9.0 deploy-docker: name: Build ESPHome ${{ matrix.platform }} From acf69bb56f53b636932e224fc466ef8cab65ef0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 19:16:10 +1200 Subject: [PATCH 071/233] Bump docker/build-push-action from 5.4.0 to 6.0.0 in /.github/actions/build-image (#6927) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index d792ab5f4c..c685e80bec 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v5.4.0 + uses: docker/build-push-action@v6.0.0 with: context: . file: ./docker/Dockerfile From c17090c1e556aebeb0186f0042824f9611266896 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 07:38:50 +1200 Subject: [PATCH 072/233] Bump docker/build-push-action from 6.0.0 to 6.0.1 in /.github/actions/build-image (#6934) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index c685e80bec..53cd836573 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.0.1 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.0.0 + uses: docker/build-push-action@v6.0.1 with: context: . file: ./docker/Dockerfile From 6682451ee0c53a30d577d67574f827ec82952b17 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:09:16 +1200 Subject: [PATCH 073/233] [network] Default ipv6 to false to always set the flags (#6937) * [network] Default ipv6 to false to always set the flags * Separate tests for ipv6 disabled and enabled * Forgot other platforms wouldnt have the variable in config --- esphome/components/network/__init__.py | 26 +++++++++++-------- tests/components/network/common.yaml | 5 +++- .../network/test-ipv6.esp32-ard.yaml | 4 +++ .../network/test-ipv6.esp32-c3-ard.yaml | 4 +++ .../network/test-ipv6.esp32-c3-idf.yaml | 4 +++ .../network/test-ipv6.esp32-idf.yaml | 4 +++ .../network/test-ipv6.esp8266-ard.yaml | 4 +++ .../network/test-ipv6.rp2040-ard.yaml | 4 +++ tests/components/network/test.host.yaml | 1 + 9 files changed, 44 insertions(+), 12 deletions(-) create mode 100644 tests/components/network/test-ipv6.esp32-ard.yaml create mode 100644 tests/components/network/test-ipv6.esp32-c3-ard.yaml create mode 100644 tests/components/network/test-ipv6.esp32-c3-idf.yaml create mode 100644 tests/components/network/test-ipv6.esp32-idf.yaml create mode 100644 tests/components/network/test-ipv6.esp8266-ard.yaml create mode 100644 tests/components/network/test-ipv6.rp2040-ard.yaml create mode 100644 tests/components/network/test.host.yaml diff --git a/esphome/components/network/__init__.py b/esphome/components/network/__init__.py index 36144ff0a4..9ef75e0fb9 100644 --- a/esphome/components/network/__init__.py +++ b/esphome/components/network/__init__.py @@ -19,7 +19,12 @@ IPAddress = network_ns.class_("IPAddress") CONFIG_SCHEMA = cv.Schema( { - cv.SplitDefault(CONF_ENABLE_IPV6): cv.All( + cv.SplitDefault( + CONF_ENABLE_IPV6, + esp8266=False, + esp32=False, + rp2040=False, + ): cv.All( cv.boolean, cv.only_on([PLATFORM_ESP32, PLATFORM_ESP8266, PLATFORM_RP2040]) ), cv.Optional(CONF_MIN_IPV6_ADDR_COUNT, default=0): cv.positive_int, @@ -28,18 +33,17 @@ CONFIG_SCHEMA = cv.Schema( async def to_code(config): - if CONF_ENABLE_IPV6 in config: - cg.add_define("USE_NETWORK_IPV6", config[CONF_ENABLE_IPV6]) - cg.add_define( - "USE_NETWORK_MIN_IPV6_ADDR_COUNT", config[CONF_MIN_IPV6_ADDR_COUNT] - ) - if CORE.using_esp_idf: - add_idf_sdkconfig_option("CONFIG_LWIP_IPV6", config[CONF_ENABLE_IPV6]) - add_idf_sdkconfig_option( - "CONFIG_LWIP_IPV6_AUTOCONFIG", config[CONF_ENABLE_IPV6] + if (enable_ipv6 := config.get(CONF_ENABLE_IPV6, None)) is not None: + cg.add_define("USE_NETWORK_IPV6", enable_ipv6) + if enable_ipv6: + cg.add_define( + "USE_NETWORK_MIN_IPV6_ADDR_COUNT", config[CONF_MIN_IPV6_ADDR_COUNT] ) + if CORE.using_esp_idf: + add_idf_sdkconfig_option("CONFIG_LWIP_IPV6", enable_ipv6) + add_idf_sdkconfig_option("CONFIG_LWIP_IPV6_AUTOCONFIG", enable_ipv6) else: - if config[CONF_ENABLE_IPV6]: + if enable_ipv6: cg.add_build_flag("-DCONFIG_LWIP_IPV6") cg.add_build_flag("-DCONFIG_LWIP_IPV6_AUTOCONFIG") if CORE.is_rp2040: diff --git a/tests/components/network/common.yaml b/tests/components/network/common.yaml index 147afd1e81..dca00cbeb6 100644 --- a/tests/components/network/common.yaml +++ b/tests/components/network/common.yaml @@ -1,6 +1,9 @@ +substitutions: + network_enable_ipv6: "false" + wifi: ssid: MySSID password: password1 network: - enable_ipv6: true + enable_ipv6: ${network_enable_ipv6} diff --git a/tests/components/network/test-ipv6.esp32-ard.yaml b/tests/components/network/test-ipv6.esp32-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-c3-ard.yaml b/tests/components/network/test-ipv6.esp32-c3-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-c3-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-c3-idf.yaml b/tests/components/network/test-ipv6.esp32-c3-idf.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-c3-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp32-idf.yaml b/tests/components/network/test-ipv6.esp32-idf.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp32-idf.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.esp8266-ard.yaml b/tests/components/network/test-ipv6.esp8266-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.esp8266-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test-ipv6.rp2040-ard.yaml b/tests/components/network/test-ipv6.rp2040-ard.yaml new file mode 100644 index 0000000000..da1324b17e --- /dev/null +++ b/tests/components/network/test-ipv6.rp2040-ard.yaml @@ -0,0 +1,4 @@ +substitutions: + network_enable_ipv6: "true" + +<<: !include common.yaml diff --git a/tests/components/network/test.host.yaml b/tests/components/network/test.host.yaml new file mode 100644 index 0000000000..61889b0361 --- /dev/null +++ b/tests/components/network/test.host.yaml @@ -0,0 +1 @@ +network: From 8bac82f80497b7e25639abc94102c125082e59cf Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:37:43 +1200 Subject: [PATCH 074/233] Bump version to 2024.6.0b5 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index eea437bcdc..3aba12b9dd 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b4" +__version__ = "2024.6.0b5" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From ff803aa108214331d292fc90574ac06e84b82409 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 16:37:33 +1200 Subject: [PATCH 075/233] Rename test files --- .../{test-ipv6.esp8266-ard.yaml => test-ipv6.esp8266.yaml} | 0 .../network/{test-ipv6.rp2040-ard.yaml => test-ipv6.rp2040.yaml} | 0 tests/components/network/{test.esp32.yaml => test.esp32-ard.yaml} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename tests/components/network/{test-ipv6.esp8266-ard.yaml => test-ipv6.esp8266.yaml} (100%) rename tests/components/network/{test-ipv6.rp2040-ard.yaml => test-ipv6.rp2040.yaml} (100%) rename tests/components/network/{test.esp32.yaml => test.esp32-ard.yaml} (100%) diff --git a/tests/components/network/test-ipv6.esp8266-ard.yaml b/tests/components/network/test-ipv6.esp8266.yaml similarity index 100% rename from tests/components/network/test-ipv6.esp8266-ard.yaml rename to tests/components/network/test-ipv6.esp8266.yaml diff --git a/tests/components/network/test-ipv6.rp2040-ard.yaml b/tests/components/network/test-ipv6.rp2040.yaml similarity index 100% rename from tests/components/network/test-ipv6.rp2040-ard.yaml rename to tests/components/network/test-ipv6.rp2040.yaml diff --git a/tests/components/network/test.esp32.yaml b/tests/components/network/test.esp32-ard.yaml similarity index 100% rename from tests/components/network/test.esp32.yaml rename to tests/components/network/test.esp32-ard.yaml From a6d1aa91de821726d114c46c30a0c9cb36c147ff Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 19 Jun 2024 21:52:47 +1200 Subject: [PATCH 076/233] Bump version to 2024.6.0 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 3aba12b9dd..0f5caa7f9d 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0b5" +__version__ = "2024.6.0" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 80e5e1995653a3b51193b456d9861ec7f7f81c24 Mon Sep 17 00:00:00 2001 From: Cossid <83468485+Cossid@users.noreply.github.com> Date: Wed, 19 Jun 2024 19:59:37 -0500 Subject: [PATCH 077/233] debug_libretiny - Fix typo (#6942) --- esphome/components/debug/debug_libretiny.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/debug/debug_libretiny.cpp b/esphome/components/debug/debug_libretiny.cpp index c3418cf96c..b5e2a5b310 100644 --- a/esphome/components/debug/debug_libretiny.cpp +++ b/esphome/components/debug/debug_libretiny.cpp @@ -12,7 +12,7 @@ std::string DebugComponent::get_reset_reason_() { return lt_get_reboot_reason_na uint32_t DebugComponent::get_free_heap_() { return lt_heap_get_free(); } void DebugComponent::get_device_info_(std::string &device_info) { - str::string reset_reason = get_reset_reason_(); + std::string reset_reason = get_reset_reason_(); ESP_LOGD(TAG, "LibreTiny Version: %s", lt_get_version()); ESP_LOGD(TAG, "Chip: %s (%04x) @ %u MHz", lt_cpu_get_model_name(), lt_cpu_get_model(), lt_cpu_get_freq_mhz()); ESP_LOGD(TAG, "Chip ID: 0x%06X", lt_cpu_get_mac_id()); From 775e03cfd95d6532292e7665f82b5301924795b9 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:12:38 +1200 Subject: [PATCH 078/233] Bump esphome-dashboard to 20240620.0 (#6944) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a7b08f8a14..0cbe5e7265 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pyserial==3.5 platformio==6.1.15 # When updating platformio, also update Dockerfile esptool==4.7.0 click==8.1.7 -esphome-dashboard==20240613.0 +esphome-dashboard==20240620.0 aioesphomeapi==24.3.0 zeroconf==0.132.2 python-magic==0.4.27 From 96f1a146a66e5266d4417e7afb0db2781e243048 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 19 Jun 2024 21:32:29 -0500 Subject: [PATCH 079/233] [CI] Add debug component test for LibreTiny (#6945) --- tests/components/debug/test.bk72xx-ard.yaml | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/components/debug/test.bk72xx-ard.yaml diff --git a/tests/components/debug/test.bk72xx-ard.yaml b/tests/components/debug/test.bk72xx-ard.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/debug/test.bk72xx-ard.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From ad8cf698973ea821ec1a8e4ec7ad74caa691b6cb Mon Sep 17 00:00:00 2001 From: Cossid <83468485+Cossid@users.noreply.github.com> Date: Wed, 19 Jun 2024 19:59:37 -0500 Subject: [PATCH 080/233] debug_libretiny - Fix typo (#6942) --- esphome/components/debug/debug_libretiny.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/debug/debug_libretiny.cpp b/esphome/components/debug/debug_libretiny.cpp index c3418cf96c..b5e2a5b310 100644 --- a/esphome/components/debug/debug_libretiny.cpp +++ b/esphome/components/debug/debug_libretiny.cpp @@ -12,7 +12,7 @@ std::string DebugComponent::get_reset_reason_() { return lt_get_reboot_reason_na uint32_t DebugComponent::get_free_heap_() { return lt_heap_get_free(); } void DebugComponent::get_device_info_(std::string &device_info) { - str::string reset_reason = get_reset_reason_(); + std::string reset_reason = get_reset_reason_(); ESP_LOGD(TAG, "LibreTiny Version: %s", lt_get_version()); ESP_LOGD(TAG, "Chip: %s (%04x) @ %u MHz", lt_cpu_get_model_name(), lt_cpu_get_model(), lt_cpu_get_freq_mhz()); ESP_LOGD(TAG, "Chip ID: 0x%06X", lt_cpu_get_mac_id()); From c868dae44a141ca3e0cbbf76a5c92b6bba7f5bbe Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Jun 2024 14:12:38 +1200 Subject: [PATCH 081/233] Bump esphome-dashboard to 20240620.0 (#6944) --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index a7b08f8a14..0cbe5e7265 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ pyserial==3.5 platformio==6.1.15 # When updating platformio, also update Dockerfile esptool==4.7.0 click==8.1.7 -esphome-dashboard==20240613.0 +esphome-dashboard==20240620.0 aioesphomeapi==24.3.0 zeroconf==0.132.2 python-magic==0.4.27 From a7a9eb6f71677e8b1ec29cfcea86569452d16d57 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 20 Jun 2024 15:59:27 +1200 Subject: [PATCH 082/233] Bump version to 2024.6.1 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 0f5caa7f9d..3b3bdd1a17 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.0" +__version__ = "2024.6.1" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 6f074d369205ad91523bfc7eedaba34093dce423 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 12:49:26 +1200 Subject: [PATCH 083/233] [dooya] Flip bit timings (#6947) --- esphome/components/remote_base/dooya_protocol.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/esphome/components/remote_base/dooya_protocol.cpp b/esphome/components/remote_base/dooya_protocol.cpp index d979bca8c5..04c5fef8f3 100644 --- a/esphome/components/remote_base/dooya_protocol.cpp +++ b/esphome/components/remote_base/dooya_protocol.cpp @@ -8,10 +8,10 @@ static const char *const TAG = "remote.dooya"; static const uint32_t HEADER_HIGH_US = 5000; static const uint32_t HEADER_LOW_US = 1500; -static const uint32_t BIT_ZERO_HIGH_US = 750; -static const uint32_t BIT_ZERO_LOW_US = 350; -static const uint32_t BIT_ONE_HIGH_US = 350; -static const uint32_t BIT_ONE_LOW_US = 750; +static const uint32_t BIT_ZERO_HIGH_US = 350; +static const uint32_t BIT_ZERO_LOW_US = 750; +static const uint32_t BIT_ONE_HIGH_US = 750; +static const uint32_t BIT_ONE_LOW_US = 350; void DooyaProtocol::encode(RemoteTransmitData *dst, const DooyaData &data) { dst->set_carrier_frequency(0); From 8045b889d39c7675ba69afa0d38e7fd7b952d93c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:09:00 +1200 Subject: [PATCH 084/233] [core] Fix package merging with lists of primitives (#6952) --- esphome/config_helpers.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/esphome/config_helpers.py b/esphome/config_helpers.py index b5e0b26143..54242bc259 100644 --- a/esphome/config_helpers.py +++ b/esphome/config_helpers.py @@ -58,17 +58,21 @@ def merge_config(full_old, full_new): ids = { v_id: i for i, v in enumerate(res) - if (v_id := v.get(CONF_ID)) and isinstance(v_id, str) + if isinstance(v, dict) + and (v_id := v.get(CONF_ID)) + and isinstance(v_id, str) } extend_ids = { v_id.value: i for i, v in enumerate(res) - if (v_id := v.get(CONF_ID)) and isinstance(v_id, Extend) + if isinstance(v, dict) + and (v_id := v.get(CONF_ID)) + and isinstance(v_id, Extend) } ids_to_delete = [] for v in new: - if new_id := v.get(CONF_ID): + if isinstance(v, dict) and (new_id := v.get(CONF_ID)): if isinstance(new_id, Extend): new_id = new_id.value if new_id in ids: From e7556271e72f85e09d1381bee68e43bde8843387 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:59:52 +1200 Subject: [PATCH 085/233] [update] Set entity_category to config & Publish state to logs (#6954) --- esphome/components/update/__init__.py | 5 ++++ esphome/components/update/update_entity.cpp | 26 +++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index ea1cf778b6..20a9373a06 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -4,11 +4,13 @@ import esphome.config_validation as cv import esphome.codegen as cg from esphome.const import ( CONF_DEVICE_CLASS, + CONF_ENTITY_CATEGORY, CONF_ID, CONF_MQTT_ID, CONF_WEB_SERVER_ID, DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, + ENTITY_CATEGORY_CONFIG, ) from esphome.core import CORE, coroutine_with_priority from esphome.cpp_helpers import setup_entity @@ -41,6 +43,9 @@ UPDATE_SCHEMA = ( cv.Optional(CONF_ON_UPDATE_AVAILABLE): automation.validate_automation( single=True ), + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG + ): cv.entity_category, } ) ) diff --git a/esphome/components/update/update_entity.cpp b/esphome/components/update/update_entity.cpp index 501cb6635f..ed9a0480d8 100644 --- a/esphome/components/update/update_entity.cpp +++ b/esphome/components/update/update_entity.cpp @@ -1,9 +1,35 @@ #include "update_entity.h" +#include "esphome/core/log.h" + namespace esphome { namespace update { +static const char *const TAG = "update"; + void UpdateEntity::publish_state() { + ESP_LOGD(TAG, "'%s' - Publishing:", this->name_.c_str()); + ESP_LOGD(TAG, " Current Version: %s", this->update_info_.current_version.c_str()); + + if (!this->update_info_.md5.empty()) { + ESP_LOGD(TAG, " Latest Version: %s", this->update_info_.latest_version.c_str()); + } + if (!this->update_info_.firmware_url.empty()) { + ESP_LOGD(TAG, " Firmware URL: %s", this->update_info_.firmware_url.c_str()); + } + + ESP_LOGD(TAG, " Title: %s", this->update_info_.title.c_str()); + if (!this->update_info_.summary.empty()) { + ESP_LOGD(TAG, " Summary: %s", this->update_info_.summary.c_str()); + } + if (!this->update_info_.release_url.empty()) { + ESP_LOGD(TAG, " Release URL: %s", this->update_info_.release_url.c_str()); + } + + if (this->update_info_.has_progress) { + ESP_LOGD(TAG, " Progress: %.0f%%", this->update_info_.progress); + } + this->has_state_ = true; this->state_callback_.call(); } From 6c11f0bd5152b32579b3f86802365f2e308e9ca4 Mon Sep 17 00:00:00 2001 From: Manuel Kasper Date: Fri, 21 Jun 2024 16:46:06 +0200 Subject: [PATCH 086/233] [qspi_amoled] Fix display remaining blank after update() before setup completion (#6958) --- esphome/components/qspi_amoled/qspi_amoled.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/esphome/components/qspi_amoled/qspi_amoled.cpp b/esphome/components/qspi_amoled/qspi_amoled.cpp index 36e9b03252..b1f651025a 100644 --- a/esphome/components/qspi_amoled/qspi_amoled.cpp +++ b/esphome/components/qspi_amoled/qspi_amoled.cpp @@ -25,6 +25,9 @@ void QspiAmoLed::setup() { } void QspiAmoLed::update() { + if (!this->setup_complete_) { + return; + } this->do_update_(); // Start addresses and widths/heights must be divisible by 2 (CASET/RASET restriction in datasheet) if (this->x_low_ % 2 == 1) { From 67bd5db6d6eb6c23e44b430200fefa9a371e2491 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Fri, 21 Jun 2024 17:18:43 -0400 Subject: [PATCH 087/233] Fix infinite loop in http_request for ESP-IDF. (#6963) --- esphome/components/http_request/http_request_idf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp index 138e0438f4..d6fac7a133 100644 --- a/esphome/components/http_request/http_request_idf.cpp +++ b/esphome/components/http_request/http_request_idf.cpp @@ -90,7 +90,7 @@ std::shared_ptr HttpRequestIDF::start(std::string url, std::strin int write_left = body_len; int write_index = 0; const char *buf = body.c_str(); - while (body_len > 0) { + while (write_left > 0) { int written = esp_http_client_write(client, buf + write_index, write_left); if (written < 0) { err = ESP_FAIL; From 0a9703bff998a5196e15a3aefa35257b7d651c98 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Fri, 21 Jun 2024 17:28:11 -0400 Subject: [PATCH 088/233] ESP-IDF 4.x expects seconds for esp_task_wdt_init(), not milliseconds. (#6964) --- esphome/components/http_request/watchdog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/http_request/watchdog.cpp b/esphome/components/http_request/watchdog.cpp index e609feb4dd..a8519c59ed 100644 --- a/esphome/components/http_request/watchdog.cpp +++ b/esphome/components/http_request/watchdog.cpp @@ -46,7 +46,7 @@ void WatchdogManager::set_timeout_(uint32_t timeout_ms) { }; esp_task_wdt_reconfigure(&wdt_config); #else - esp_task_wdt_init(timeout_ms, true); + esp_task_wdt_init(timeout_ms / 1000, true); #endif // ESP_IDF_VERSION_MAJOR #endif // USE_ESP32 From 9c5507ab4680ce4df996910807100cc72f911e1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Jun 2024 12:50:21 +0200 Subject: [PATCH 089/233] Bump docker/build-push-action from 6.0.1 to 6.1.0 in /.github/actions/build-image (#6962) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index 53cd836573..27d2ffc533 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.0.1 + uses: docker/build-push-action@v6.1.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.0.1 + uses: docker/build-push-action@v6.1.0 with: context: . file: ./docker/Dockerfile From 2aacf14e960d005aee29e7a259f47b90ae1d3970 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Sat, 22 Jun 2024 04:57:27 -0700 Subject: [PATCH 090/233] Onewire (#6967) * retry scan * setup pin and log retries * fix retries * remove retries --------- Co-authored-by: Samuel Sieb --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index 34c2cf3c29..b4e69e975a 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -9,6 +9,10 @@ static const char *const TAG = "gpio.one_wire"; void GPIOOneWireBus::setup() { ESP_LOGCONFIG(TAG, "Setting up 1-wire bus..."); + this->t_pin_->setup(); + // clear bus with 480µs high, otherwise initial reset in search might fail + this->t_pin_->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + delayMicroseconds(480); this->search(); } From 18690d51f51c0d8a145c8ca71a234a496a06b3d9 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Sun, 23 Jun 2024 01:27:47 +1200 Subject: [PATCH 091/233] Synchronise Device Classes from Home Assistant (#6966) --- esphome/components/number/__init__.py | 2 ++ esphome/components/sensor/__init__.py | 2 ++ esphome/const.py | 1 + 3 files changed, 5 insertions(+) diff --git a/esphome/components/number/__init__.py b/esphome/components/number/__init__.py index 303535c138..d9c16fd7a9 100644 --- a/esphome/components/number/__init__.py +++ b/esphome/components/number/__init__.py @@ -26,6 +26,7 @@ from esphome.const import ( DEVICE_CLASS_BATTERY, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_CARBON_MONOXIDE, + DEVICE_CLASS_CONDUCTIVITY, DEVICE_CLASS_CURRENT, DEVICE_CLASS_DATA_RATE, DEVICE_CLASS_DATA_SIZE, @@ -82,6 +83,7 @@ DEVICE_CLASSES = [ DEVICE_CLASS_BATTERY, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_CARBON_MONOXIDE, + DEVICE_CLASS_CONDUCTIVITY, DEVICE_CLASS_CURRENT, DEVICE_CLASS_DATA_RATE, DEVICE_CLASS_DATA_SIZE, diff --git a/esphome/components/sensor/__init__.py b/esphome/components/sensor/__init__.py index 6077f5dc1f..262e69d75b 100644 --- a/esphome/components/sensor/__init__.py +++ b/esphome/components/sensor/__init__.py @@ -43,6 +43,7 @@ from esphome.const import ( DEVICE_CLASS_BATTERY, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_CARBON_MONOXIDE, + DEVICE_CLASS_CONDUCTIVITY, DEVICE_CLASS_CURRENT, DEVICE_CLASS_DATA_RATE, DEVICE_CLASS_DATA_SIZE, @@ -103,6 +104,7 @@ DEVICE_CLASSES = [ DEVICE_CLASS_BATTERY, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_CARBON_MONOXIDE, + DEVICE_CLASS_CONDUCTIVITY, DEVICE_CLASS_CURRENT, DEVICE_CLASS_DATA_RATE, DEVICE_CLASS_DATA_SIZE, diff --git a/esphome/const.py b/esphome/const.py index 9c4e451029..a13a0af8eb 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1070,6 +1070,7 @@ DEVICE_CLASS_BUTTON = "button" DEVICE_CLASS_CARBON_DIOXIDE = "carbon_dioxide" DEVICE_CLASS_CARBON_MONOXIDE = "carbon_monoxide" DEVICE_CLASS_COLD = "cold" +DEVICE_CLASS_CONDUCTIVITY = "conductivity" DEVICE_CLASS_CONNECTIVITY = "connectivity" DEVICE_CLASS_CURRENT = "current" DEVICE_CLASS_CURTAIN = "curtain" From 1e05bcaa614040617ef94340a54ca3f22871c4ac Mon Sep 17 00:00:00 2001 From: Manuel Kasper Date: Sat, 22 Jun 2024 17:10:22 +0200 Subject: [PATCH 092/233] [qspi_amoled] Fix clear/fill with rotation (#6960) --- esphome/components/qspi_amoled/qspi_amoled.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/esphome/components/qspi_amoled/qspi_amoled.h b/esphome/components/qspi_amoled/qspi_amoled.h index 28d243f548..c766b4e685 100644 --- a/esphome/components/qspi_amoled/qspi_amoled.h +++ b/esphome/components/qspi_amoled/qspi_amoled.h @@ -65,13 +65,10 @@ class QspiAmoLed : public display::DisplayBuffer, void set_reset_pin(GPIOPin *reset_pin) { this->reset_pin_ = reset_pin; } void set_enable_pin(GPIOPin *enable_pin) { this->enable_pin_ = enable_pin; } - void set_width(uint16_t width) { this->width_ = width; } void set_dimensions(uint16_t width, uint16_t height) { this->width_ = width; this->height_ = height; } - int get_width() override { return this->width_; } - int get_height() override { return this->height_; } void set_invert_colors(bool invert_colors) { this->invert_colors_ = invert_colors; this->reset_params_(); From 17204baac0168b6a6dd2f6ad87968cd83717f7de Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Sun, 23 Jun 2024 15:22:08 -0700 Subject: [PATCH 093/233] allow template parameters (#6972) --- esphome/components/script/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/script/__init__.py b/esphome/components/script/__init__.py index 483357f85b..16b1d4c54e 100644 --- a/esphome/components/script/__init__.py +++ b/esphome/components/script/__init__.py @@ -88,7 +88,7 @@ def validate_parameter_name(value): raise cv.Invalid(f"Script's parameter name cannot be {CONF_ID}") -ALLOWED_PARAM_TYPE_CHARSET = set("abcdefghijklmnopqrstuvwxyz0123456789_:*&[]") +ALLOWED_PARAM_TYPE_CHARSET = set("abcdefghijklmnopqrstuvwxyz0123456789_:*&[]<>") def validate_parameter_type(value): From 0f49b58e0a727284c055246188a4ce9fee687eae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Poczkodi?= Date: Mon, 24 Jun 2024 06:32:20 +0200 Subject: [PATCH 094/233] [http_request] memory leak fix (#6973) --- esphome/components/http_request/http_request.h | 1 + 1 file changed, 1 insertion(+) diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index df6bc7dea7..6281adddb6 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -149,6 +149,7 @@ template class HttpRequestSendAction : public Action { } response_body.reserve(read_index); response_body.assign((char *) buf, read_index); + allocator.deallocate(buf, max_length); } } From 7ee1406f64a04807bf1737cbd407f978744004ab Mon Sep 17 00:00:00 2001 From: Brian Kaufman Date: Sun, 23 Jun 2024 21:54:30 -0700 Subject: [PATCH 095/233] Await cg.get_variable in Update component (#6974) --- esphome/components/update/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index 20a9373a06..45bf082fa4 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -69,7 +69,7 @@ async def setup_update_core_(var, config): await mqtt.register_mqtt_component(mqtt_, config) if web_server_id_config := config.get(CONF_WEB_SERVER_ID): - web_server_ = cg.get_variable(web_server_id_config) + web_server_ = await cg.get_variable(web_server_id_config) web_server.add_entity_to_sorting_list(web_server_, var, config) From f7af51b92c9d3fee019f2ff5abda5880cf18061e Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Mon, 24 Jun 2024 10:22:07 +0400 Subject: [PATCH 096/233] [haier] climate ID auto generation (#6949) --- esphome/components/haier/binary_sensor/__init__.py | 8 ++++---- esphome/components/haier/button/__init__.py | 2 +- esphome/components/haier/climate.py | 11 +++-------- esphome/components/haier/sensor/__init__.py | 10 +++++----- esphome/components/haier/text_sensor/__init__.py | 8 ++++---- tests/components/haier/test.esp32-c3-ard.yaml | 4 ---- tests/components/haier/test.esp32-c3-idf.yaml | 4 ---- tests/components/haier/test.esp32-idf.yaml | 4 ---- tests/components/haier/test.esp8266-ard.yaml | 4 ---- tests/components/haier/test.rp2040-ard.yaml | 4 ---- 10 files changed, 17 insertions(+), 42 deletions(-) diff --git a/esphome/components/haier/binary_sensor/__init__.py b/esphome/components/haier/binary_sensor/__init__.py index 8e9d5ec578..3a4935b22d 100644 --- a/esphome/components/haier/binary_sensor/__init__.py +++ b/esphome/components/haier/binary_sensor/__init__.py @@ -56,7 +56,7 @@ SENSOR_TYPES = { CONFIG_SCHEMA = cv.Schema( { - cv.Required(CONF_HAIER_ID): cv.use_id(HonClimate), + cv.GenerateID(CONF_HAIER_ID): cv.use_id(HonClimate), } ).extend({cv.Optional(type): schema for type, schema in SENSOR_TYPES.items()}) @@ -64,8 +64,8 @@ CONFIG_SCHEMA = cv.Schema( async def to_code(config): paren = await cg.get_variable(config[CONF_HAIER_ID]) - for type, _ in SENSOR_TYPES.items(): - if conf := config.get(type): + for type_ in SENSOR_TYPES: + if conf := config.get(type_): sens = await binary_sensor.new_binary_sensor(conf) - binary_sensor_type = getattr(BinarySensorTypeEnum, type.upper()) + binary_sensor_type = getattr(BinarySensorTypeEnum, type_.upper()) cg.add(paren.set_sub_binary_sensor(binary_sensor_type, sens)) diff --git a/esphome/components/haier/button/__init__.py b/esphome/components/haier/button/__init__.py index efe6180aaf..745ad95fb6 100644 --- a/esphome/components/haier/button/__init__.py +++ b/esphome/components/haier/button/__init__.py @@ -21,7 +21,7 @@ ICON_SPRAY_BOTTLE = "mdi:spray-bottle" CONFIG_SCHEMA = cv.Schema( { - cv.Required(CONF_HAIER_ID): cv.use_id(HonClimate), + cv.GenerateID(CONF_HAIER_ID): cv.use_id(HonClimate), cv.Optional(CONF_SELF_CLEANING): button.button_schema( SelfCleaningButton, icon=ICON_SPRAY_BOTTLE, diff --git a/esphome/components/haier/climate.py b/esphome/components/haier/climate.py index 1562708a4f..3dcb35708c 100644 --- a/esphome/components/haier/climate.py +++ b/esphome/components/haier/climate.py @@ -183,7 +183,6 @@ BASE_CONFIG_SCHEMA = ( cv.Optional( CONF_SUPPORTED_SWING_MODES, default=[ - "OFF", "VERTICAL", "HORIZONTAL", "BOTH", @@ -211,7 +210,7 @@ CONFIG_SCHEMA = cv.All( ): cv.boolean, cv.Optional( CONF_SUPPORTED_PRESETS, - default=list(["BOOST", "COMFORT"]), # No AWAY by default + default=["BOOST", "COMFORT"], # No AWAY by default ): cv.ensure_list( cv.enum(SUPPORTED_CLIMATE_PRESETS_SMARTAIR2_OPTIONS, upper=True) ), @@ -231,7 +230,7 @@ CONFIG_SCHEMA = cv.All( ): cv.int_range(min=PROTOCOL_CONTROL_PACKET_SIZE, max=50), cv.Optional( CONF_SUPPORTED_PRESETS, - default=list(["BOOST", "ECO", "SLEEP"]), # No AWAY by default + default=["BOOST", "ECO", "SLEEP"], # No AWAY by default ): cv.ensure_list( cv.enum(SUPPORTED_CLIMATE_PRESETS_HON_OPTIONS, upper=True) ), @@ -427,11 +426,7 @@ def _final_validate(config): "No logger component found, logging for Haier protocol is disabled" ) cg.add_build_flag("-DHAIER_LOG_LEVEL=0") - if ( - (CONF_WIFI_SIGNAL in config) - and (config[CONF_WIFI_SIGNAL]) - and CONF_WIFI not in full_config - ): + if config.get(CONF_WIFI_SIGNAL) and CONF_WIFI not in full_config: raise cv.Invalid( f"No WiFi configured, if you want to use haier climate without WiFi add {CONF_WIFI_SIGNAL}: false to climate configuration" ) diff --git a/esphome/components/haier/sensor/__init__.py b/esphome/components/haier/sensor/__init__.py index b2717631e0..23c1d6f008 100644 --- a/esphome/components/haier/sensor/__init__.py +++ b/esphome/components/haier/sensor/__init__.py @@ -137,16 +137,16 @@ SENSOR_TYPES = { CONFIG_SCHEMA = cv.Schema( { - cv.Required(CONF_HAIER_ID): cv.use_id(HonClimate), + cv.GenerateID(CONF_HAIER_ID): cv.use_id(HonClimate), } -).extend({cv.Optional(type): schema for type, schema in SENSOR_TYPES.items()}) +).extend({cv.Optional(type_): schema for type_, schema in SENSOR_TYPES.items()}) async def to_code(config): paren = await cg.get_variable(config[CONF_HAIER_ID]) - for type, _ in SENSOR_TYPES.items(): - if conf := config.get(type): + for type_ in SENSOR_TYPES: + if conf := config.get(type_): sens = await sensor.new_sensor(conf) - sensor_type = getattr(SensorTypeEnum, type.upper()) + sensor_type = getattr(SensorTypeEnum, type_.upper()) cg.add(paren.set_sub_sensor(sensor_type, sens)) diff --git a/esphome/components/haier/text_sensor/__init__.py b/esphome/components/haier/text_sensor/__init__.py index 528b70d83e..d28c5a8c0e 100644 --- a/esphome/components/haier/text_sensor/__init__.py +++ b/esphome/components/haier/text_sensor/__init__.py @@ -39,7 +39,7 @@ TEXT_SENSOR_TYPES = { CONFIG_SCHEMA = cv.Schema( { - cv.Required(CONF_HAIER_ID): cv.use_id(HonClimate), + cv.GenerateID(CONF_HAIER_ID): cv.use_id(HonClimate), } ).extend({cv.Optional(type): schema for type, schema in TEXT_SENSOR_TYPES.items()}) @@ -47,8 +47,8 @@ CONFIG_SCHEMA = cv.Schema( async def to_code(config): paren = await cg.get_variable(config[CONF_HAIER_ID]) - for type, _ in TEXT_SENSOR_TYPES.items(): - if conf := config.get(type): + for type_ in TEXT_SENSOR_TYPES: + if conf := config.get(type_): sens = await text_sensor.new_text_sensor(conf) - text_sensor_type = getattr(TextSensorTypeEnum, type.upper()) + text_sensor_type = getattr(TextSensorTypeEnum, type_.upper()) cg.add(paren.set_sub_text_sensor(text_sensor_type, sens)) diff --git a/tests/components/haier/test.esp32-c3-ard.yaml b/tests/components/haier/test.esp32-c3-ard.yaml index fed573bd1d..0053220669 100644 --- a/tests/components/haier/test.esp32-c3-ard.yaml +++ b/tests/components/haier/test.esp32-c3-ard.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: diff --git a/tests/components/haier/test.esp32-c3-idf.yaml b/tests/components/haier/test.esp32-c3-idf.yaml index fed573bd1d..0053220669 100644 --- a/tests/components/haier/test.esp32-c3-idf.yaml +++ b/tests/components/haier/test.esp32-c3-idf.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: diff --git a/tests/components/haier/test.esp32-idf.yaml b/tests/components/haier/test.esp32-idf.yaml index efff532d25..54e384f3ce 100644 --- a/tests/components/haier/test.esp32-idf.yaml +++ b/tests/components/haier/test.esp32-idf.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: diff --git a/tests/components/haier/test.esp8266-ard.yaml b/tests/components/haier/test.esp8266-ard.yaml index fed573bd1d..0053220669 100644 --- a/tests/components/haier/test.esp8266-ard.yaml +++ b/tests/components/haier/test.esp8266-ard.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: diff --git a/tests/components/haier/test.rp2040-ard.yaml b/tests/components/haier/test.rp2040-ard.yaml index fed573bd1d..0053220669 100644 --- a/tests/components/haier/test.rp2040-ard.yaml +++ b/tests/components/haier/test.rp2040-ard.yaml @@ -54,7 +54,6 @@ climate: sensor: - platform: haier - haier_id: haier_ac outdoor_temperature: name: Haier outdoor temperature humidity: @@ -80,7 +79,6 @@ sensor: binary_sensor: - platform: haier - haier_id: haier_ac compressor_status: name: Haier Outdoor Compressor Status defrost_status: @@ -96,7 +94,6 @@ binary_sensor: button: - platform: haier - haier_id: haier_ac self_cleaning: name: Haier start self cleaning steri_cleaning: @@ -104,7 +101,6 @@ button: text_sensor: - platform: haier - haier_id: haier_ac appliance_name: name: Haier appliance name cleaning_status: From b1868123db2107a84ad093a6776e4f096829ba1a Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Mon, 24 Jun 2024 04:21:28 -0700 Subject: [PATCH 097/233] fix potential hang (#6976) Co-authored-by: Samuel Sieb --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index b4e69e975a..36eaf2160a 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -94,13 +94,15 @@ bool HOT IRAM_ATTR GPIOOneWireBus::read_bit_() { // measure from start value directly, to get best accurate timing no matter // how long pin_mode/delayMicroseconds took - delayMicroseconds(12 - (micros() - start)); + uint32_t now = micros(); + if (now - start < 12) + delayMicroseconds(12 - (now - start)); // sample bus to read bit from peer bool r = pin_.digital_read(); // read slot is at least 60µs; get as close to 60µs to spend less time with interrupts locked - uint32_t now = micros(); + now = micros(); if (now - start < 60) delayMicroseconds(60 - (now - start)); From 78450da6f33366735aeb8da0521c2791160ac12d Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Tue, 25 Jun 2024 00:04:58 +0400 Subject: [PATCH 098/233] [midea] fix fan speed compatibility with some models (#6978) --- esphome/components/midea/climate.py | 2 +- platformio.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/midea/climate.py b/esphome/components/midea/climate.py index 83540a061a..e5612796a3 100644 --- a/esphome/components/midea/climate.py +++ b/esphome/components/midea/climate.py @@ -293,4 +293,4 @@ async def to_code(config): if CONF_HUMIDITY_SETPOINT in config: sens = await sensor.new_sensor(config[CONF_HUMIDITY_SETPOINT]) cg.add(var.set_humidity_setpoint_sensor(sens)) - cg.add_library("dudanov/MideaUART", "1.1.8") + cg.add_library("dudanov/MideaUART", "1.1.9") diff --git a/platformio.ini b/platformio.ini index ee82dee243..e106114ff6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -64,7 +64,7 @@ lib_deps = freekode/TM1651@1.0.1 ; tm1651 glmnet/Dsmr@0.7 ; dsmr rweather/Crypto@0.4.0 ; dsmr - dudanov/MideaUART@1.1.8 ; midea + dudanov/MideaUART@1.1.9 ; midea tonia/HeatpumpIR@1.0.23 ; heatpumpir build_flags = ${common.build_flags} From a21dab334c48da775189085d7206fe88ecdaa3a5 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 13:09:00 +1200 Subject: [PATCH 099/233] [core] Fix package merging with lists of primitives (#6952) --- esphome/config_helpers.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/esphome/config_helpers.py b/esphome/config_helpers.py index b5e0b26143..54242bc259 100644 --- a/esphome/config_helpers.py +++ b/esphome/config_helpers.py @@ -58,17 +58,21 @@ def merge_config(full_old, full_new): ids = { v_id: i for i, v in enumerate(res) - if (v_id := v.get(CONF_ID)) and isinstance(v_id, str) + if isinstance(v, dict) + and (v_id := v.get(CONF_ID)) + and isinstance(v_id, str) } extend_ids = { v_id.value: i for i, v in enumerate(res) - if (v_id := v.get(CONF_ID)) and isinstance(v_id, Extend) + if isinstance(v, dict) + and (v_id := v.get(CONF_ID)) + and isinstance(v_id, Extend) } ids_to_delete = [] for v in new: - if new_id := v.get(CONF_ID): + if isinstance(v, dict) and (new_id := v.get(CONF_ID)): if isinstance(new_id, Extend): new_id = new_id.value if new_id in ids: From 7dbc20b776c56c6cce910e25fe6f12871e9d9b47 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 21 Jun 2024 14:59:52 +1200 Subject: [PATCH 100/233] [update] Set entity_category to config & Publish state to logs (#6954) --- esphome/components/update/__init__.py | 5 ++++ esphome/components/update/update_entity.cpp | 26 +++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index ea1cf778b6..20a9373a06 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -4,11 +4,13 @@ import esphome.config_validation as cv import esphome.codegen as cg from esphome.const import ( CONF_DEVICE_CLASS, + CONF_ENTITY_CATEGORY, CONF_ID, CONF_MQTT_ID, CONF_WEB_SERVER_ID, DEVICE_CLASS_EMPTY, DEVICE_CLASS_FIRMWARE, + ENTITY_CATEGORY_CONFIG, ) from esphome.core import CORE, coroutine_with_priority from esphome.cpp_helpers import setup_entity @@ -41,6 +43,9 @@ UPDATE_SCHEMA = ( cv.Optional(CONF_ON_UPDATE_AVAILABLE): automation.validate_automation( single=True ), + cv.Optional( + CONF_ENTITY_CATEGORY, default=ENTITY_CATEGORY_CONFIG + ): cv.entity_category, } ) ) diff --git a/esphome/components/update/update_entity.cpp b/esphome/components/update/update_entity.cpp index 501cb6635f..ed9a0480d8 100644 --- a/esphome/components/update/update_entity.cpp +++ b/esphome/components/update/update_entity.cpp @@ -1,9 +1,35 @@ #include "update_entity.h" +#include "esphome/core/log.h" + namespace esphome { namespace update { +static const char *const TAG = "update"; + void UpdateEntity::publish_state() { + ESP_LOGD(TAG, "'%s' - Publishing:", this->name_.c_str()); + ESP_LOGD(TAG, " Current Version: %s", this->update_info_.current_version.c_str()); + + if (!this->update_info_.md5.empty()) { + ESP_LOGD(TAG, " Latest Version: %s", this->update_info_.latest_version.c_str()); + } + if (!this->update_info_.firmware_url.empty()) { + ESP_LOGD(TAG, " Firmware URL: %s", this->update_info_.firmware_url.c_str()); + } + + ESP_LOGD(TAG, " Title: %s", this->update_info_.title.c_str()); + if (!this->update_info_.summary.empty()) { + ESP_LOGD(TAG, " Summary: %s", this->update_info_.summary.c_str()); + } + if (!this->update_info_.release_url.empty()) { + ESP_LOGD(TAG, " Release URL: %s", this->update_info_.release_url.c_str()); + } + + if (this->update_info_.has_progress) { + ESP_LOGD(TAG, " Progress: %.0f%%", this->update_info_.progress); + } + this->has_state_ = true; this->state_callback_.call(); } From ae2962259ec004777ecfb96cd409bba85b56e0d4 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Fri, 21 Jun 2024 17:18:43 -0400 Subject: [PATCH 101/233] Fix infinite loop in http_request for ESP-IDF. (#6963) --- esphome/components/http_request/http_request_idf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/http_request/http_request_idf.cpp b/esphome/components/http_request/http_request_idf.cpp index 138e0438f4..d6fac7a133 100644 --- a/esphome/components/http_request/http_request_idf.cpp +++ b/esphome/components/http_request/http_request_idf.cpp @@ -90,7 +90,7 @@ std::shared_ptr HttpRequestIDF::start(std::string url, std::strin int write_left = body_len; int write_index = 0; const char *buf = body.c_str(); - while (body_len > 0) { + while (write_left > 0) { int written = esp_http_client_write(client, buf + write_index, write_left); if (written < 0) { err = ESP_FAIL; From 96d63de292eba3fa4c6c820faf1b482e0fff205e Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Fri, 21 Jun 2024 17:28:11 -0400 Subject: [PATCH 102/233] ESP-IDF 4.x expects seconds for esp_task_wdt_init(), not milliseconds. (#6964) --- esphome/components/http_request/watchdog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/http_request/watchdog.cpp b/esphome/components/http_request/watchdog.cpp index e609feb4dd..a8519c59ed 100644 --- a/esphome/components/http_request/watchdog.cpp +++ b/esphome/components/http_request/watchdog.cpp @@ -46,7 +46,7 @@ void WatchdogManager::set_timeout_(uint32_t timeout_ms) { }; esp_task_wdt_reconfigure(&wdt_config); #else - esp_task_wdt_init(timeout_ms, true); + esp_task_wdt_init(timeout_ms / 1000, true); #endif // ESP_IDF_VERSION_MAJOR #endif // USE_ESP32 From 0d3cf5cb7809e13de16c5edb75c0437705efa4ce Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Sat, 22 Jun 2024 04:57:27 -0700 Subject: [PATCH 103/233] Onewire (#6967) * retry scan * setup pin and log retries * fix retries * remove retries --------- Co-authored-by: Samuel Sieb --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index 34c2cf3c29..b4e69e975a 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -9,6 +9,10 @@ static const char *const TAG = "gpio.one_wire"; void GPIOOneWireBus::setup() { ESP_LOGCONFIG(TAG, "Setting up 1-wire bus..."); + this->t_pin_->setup(); + // clear bus with 480µs high, otherwise initial reset in search might fail + this->t_pin_->pin_mode(gpio::FLAG_INPUT | gpio::FLAG_PULLUP); + delayMicroseconds(480); this->search(); } From e39961f7f1c329ae70422ded669b548c43226d0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Poczkodi?= Date: Mon, 24 Jun 2024 06:32:20 +0200 Subject: [PATCH 104/233] [http_request] memory leak fix (#6973) --- esphome/components/http_request/http_request.h | 1 + 1 file changed, 1 insertion(+) diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index df6bc7dea7..6281adddb6 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -149,6 +149,7 @@ template class HttpRequestSendAction : public Action { } response_body.reserve(read_index); response_body.assign((char *) buf, read_index); + allocator.deallocate(buf, max_length); } } From 5bd5b777a6ff949f539b9e58ed537b223e40020e Mon Sep 17 00:00:00 2001 From: Brian Kaufman Date: Sun, 23 Jun 2024 21:54:30 -0700 Subject: [PATCH 105/233] Await cg.get_variable in Update component (#6974) --- esphome/components/update/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/update/__init__.py b/esphome/components/update/__init__.py index 20a9373a06..45bf082fa4 100644 --- a/esphome/components/update/__init__.py +++ b/esphome/components/update/__init__.py @@ -69,7 +69,7 @@ async def setup_update_core_(var, config): await mqtt.register_mqtt_component(mqtt_, config) if web_server_id_config := config.get(CONF_WEB_SERVER_ID): - web_server_ = cg.get_variable(web_server_id_config) + web_server_ = await cg.get_variable(web_server_id_config) web_server.add_entity_to_sorting_list(web_server_, var, config) From c5aae8ee254f3e16ed204912457637ba62743818 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Mon, 24 Jun 2024 04:21:28 -0700 Subject: [PATCH 106/233] fix potential hang (#6976) Co-authored-by: Samuel Sieb --- esphome/components/gpio/one_wire/gpio_one_wire.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/gpio/one_wire/gpio_one_wire.cpp b/esphome/components/gpio/one_wire/gpio_one_wire.cpp index b4e69e975a..36eaf2160a 100644 --- a/esphome/components/gpio/one_wire/gpio_one_wire.cpp +++ b/esphome/components/gpio/one_wire/gpio_one_wire.cpp @@ -94,13 +94,15 @@ bool HOT IRAM_ATTR GPIOOneWireBus::read_bit_() { // measure from start value directly, to get best accurate timing no matter // how long pin_mode/delayMicroseconds took - delayMicroseconds(12 - (micros() - start)); + uint32_t now = micros(); + if (now - start < 12) + delayMicroseconds(12 - (now - start)); // sample bus to read bit from peer bool r = pin_.digital_read(); // read slot is at least 60µs; get as close to 60µs to spend less time with interrupts locked - uint32_t now = micros(); + now = micros(); if (now - start < 60) delayMicroseconds(60 - (now - start)); From a6e1ef2dd144dff244800fa00624285c8bd6e70e Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Tue, 25 Jun 2024 00:04:58 +0400 Subject: [PATCH 107/233] [midea] fix fan speed compatibility with some models (#6978) --- esphome/components/midea/climate.py | 2 +- platformio.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/midea/climate.py b/esphome/components/midea/climate.py index 83540a061a..e5612796a3 100644 --- a/esphome/components/midea/climate.py +++ b/esphome/components/midea/climate.py @@ -293,4 +293,4 @@ async def to_code(config): if CONF_HUMIDITY_SETPOINT in config: sens = await sensor.new_sensor(config[CONF_HUMIDITY_SETPOINT]) cg.add(var.set_humidity_setpoint_sensor(sens)) - cg.add_library("dudanov/MideaUART", "1.1.8") + cg.add_library("dudanov/MideaUART", "1.1.9") diff --git a/platformio.ini b/platformio.ini index 6b34b2f05d..14e9ea9fc6 100644 --- a/platformio.ini +++ b/platformio.ini @@ -64,7 +64,7 @@ lib_deps = freekode/TM1651@1.0.1 ; tm1651 glmnet/Dsmr@0.7 ; dsmr rweather/Crypto@0.4.0 ; dsmr - dudanov/MideaUART@1.1.8 ; midea + dudanov/MideaUART@1.1.9 ; midea tonia/HeatpumpIR@1.0.23 ; heatpumpir build_flags = ${common.build_flags} From 09a947beaa45b45f71dbfb3aac06de2b138abebf Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 08:57:38 +1200 Subject: [PATCH 108/233] Bump version to 2024.6.2 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 3b3bdd1a17..cde917ca98 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.1" +__version__ = "2024.6.2" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 11b8e2e1af4af190f407cdd0922f778899e19412 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:43:30 +1200 Subject: [PATCH 109/233] [core] Add script to extract actions, conditions, and pin_providers (#6929) --- script/extract_automations.py | 25 +++++++++++++++++++++++ script/list-components.py | 38 ++++++++++++++++++----------------- 2 files changed, 45 insertions(+), 18 deletions(-) create mode 100755 script/extract_automations.py diff --git a/script/extract_automations.py b/script/extract_automations.py new file mode 100755 index 0000000000..943eb7110a --- /dev/null +++ b/script/extract_automations.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +import json + +from helpers import git_ls_files + +from esphome.automation import ACTION_REGISTRY, CONDITION_REGISTRY +from esphome.pins import PIN_SCHEMA_REGISTRY + +list_components = __import__("list-components") + + +if __name__ == "__main__": + files = git_ls_files() + files = filter(list_components.filter_component_files, files) + + components = list_components.get_components(files, True) + + dump = { + "actions": sorted(list(ACTION_REGISTRY.keys())), + "conditions": sorted(list(CONDITION_REGISTRY.keys())), + "pin_providers": sorted(list(PIN_SCHEMA_REGISTRY.keys())), + } + + print(json.dumps(dump, indent=2)) diff --git a/script/list-components.py b/script/list-components.py index 5b5fa5811f..4eccdbf96c 100755 --- a/script/list-components.py +++ b/script/list-components.py @@ -50,6 +50,7 @@ def create_components_graph(): {KEY_TARGET_FRAMEWORK: "arduino", KEY_TARGET_PLATFORM: None}, {KEY_TARGET_FRAMEWORK: "esp-idf", KEY_TARGET_PLATFORM: None}, {KEY_TARGET_FRAMEWORK: None, KEY_TARGET_PLATFORM: PLATFORM_ESP32}, + {KEY_TARGET_FRAMEWORK: None, KEY_TARGET_PLATFORM: PLATFORM_ESP8266}, ] CORE.data[KEY_CORE] = TARGET_CONFIGURATIONS[0] @@ -119,6 +120,23 @@ def find_children_of_component(components_graph, component_name, depth=0): return list(set(children)) +def get_components(files: list[str], get_dependencies: bool = False): + components = extract_component_names_array_from_files_array(files) + + if get_dependencies: + components_graph = create_components_graph() + + all_components = components.copy() + for c in components: + all_components.extend(find_children_of_component(components_graph, c)) + # Remove duplicate values + all_changed_components = list(set(all_components)) + + return sorted(all_changed_components) + + return sorted(components) + + def main(): parser = argparse.ArgumentParser() parser.add_argument( @@ -142,24 +160,8 @@ def main(): changed = changed_files() files = [f for f in files if f in changed] - components = extract_component_names_array_from_files_array(files) - - if args.changed: - components_graph = create_components_graph() - - all_changed_components = components.copy() - for c in components: - all_changed_components.extend( - find_children_of_component(components_graph, c) - ) - # Remove duplicate values - all_changed_components = list(set(all_changed_components)) - - for c in sorted(all_changed_components): - print(c) - else: - for c in sorted(components): - print(c) + for c in get_components(files, args.changed): + print(c) if __name__ == "__main__": From 8a25bedaf9323c6e1f62a9324b46344d9292ed24 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 17:42:55 +1200 Subject: [PATCH 110/233] [external_files] Move common ``download_content`` function to ``external_files.py`` (#6982) --- esphome/components/font/__init__.py | 30 ++------------------------- esphome/components/image/__init__.py | 31 ++-------------------------- esphome/external_files.py | 26 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 57 deletions(-) diff --git a/esphome/components/font/__init__.py b/esphome/components/font/__init__.py index b3a5beb199..7e4674ffda 100644 --- a/esphome/components/font/__init__.py +++ b/esphome/components/font/__init__.py @@ -17,7 +17,6 @@ from esphome.helpers import ( cpp_string_escape, ) from esphome.const import ( - __version__, CONF_FAMILY, CONF_FILE, CONF_GLYPHS, @@ -185,31 +184,6 @@ def get_font_path(value, type) -> Path: return None -def download_content(url: str, path: Path) -> None: - if not external_files.has_remote_file_changed(url, path): - _LOGGER.debug("Remote file has not changed %s", url) - return - - _LOGGER.debug( - "Remote file has changed, downloading from %s to %s", - url, - path, - ) - - try: - req = requests.get( - url, - timeout=external_files.NETWORK_TIMEOUT, - headers={"User-agent": f"ESPHome/{__version__} (https://esphome.io)"}, - ) - req.raise_for_status() - except requests.exceptions.RequestException as e: - raise cv.Invalid(f"Could not download from {url}: {e}") - - path.parent.mkdir(parents=True, exist_ok=True) - path.write_bytes(req.content) - - def download_gfont(value): name = ( f"{value[CONF_FAMILY]}:ital,wght@{int(value[CONF_ITALIC])},{value[CONF_WEIGHT]}" @@ -236,7 +210,7 @@ def download_gfont(value): ttf_url = match.group(1) _LOGGER.debug("download_gfont: ttf_url=%s", ttf_url) - download_content(ttf_url, path) + external_files.download_content(ttf_url, path) return value @@ -244,7 +218,7 @@ def download_web_font(value): url = value[CONF_URL] path = get_font_path(value, TYPE_WEB) - download_content(url, path) + external_files.download_content(url, path) _LOGGER.debug("download_web_font: path=%s", path) return value diff --git a/esphome/components/image/__init__.py b/esphome/components/image/__init__.py index c275136427..e5a205f1e0 100644 --- a/esphome/components/image/__init__.py +++ b/esphome/components/image/__init__.py @@ -6,7 +6,6 @@ import hashlib import io from pathlib import Path import re -import requests from magic import Magic from esphome import core @@ -15,7 +14,6 @@ from esphome import external_files import esphome.config_validation as cv import esphome.codegen as cg from esphome.const import ( - __version__, CONF_DITHER, CONF_FILE, CONF_ICON, @@ -75,31 +73,6 @@ def compute_local_image_path(value: dict) -> Path: return base_dir / key -def download_content(url: str, path: Path) -> None: - if not external_files.has_remote_file_changed(url, path): - _LOGGER.debug("Remote file has not changed %s", url) - return - - _LOGGER.debug( - "Remote file has changed, downloading from %s to %s", - url, - path, - ) - - try: - req = requests.get( - url, - timeout=IMAGE_DOWNLOAD_TIMEOUT, - headers={"User-agent": f"ESPHome/{__version__} (https://esphome.io)"}, - ) - req.raise_for_status() - except requests.exceptions.RequestException as e: - raise cv.Invalid(f"Could not download from {url}: {e}") - - path.parent.mkdir(parents=True, exist_ok=True) - path.write_bytes(req.content) - - def download_mdi(value): validate_cairosvg_installed(value) @@ -108,7 +81,7 @@ def download_mdi(value): url = f"https://raw.githubusercontent.com/Templarian/MaterialDesign/master/svg/{mdi_id}.svg" - download_content(url, path) + external_files.download_content(url, path, IMAGE_DOWNLOAD_TIMEOUT) return value @@ -117,7 +90,7 @@ def download_image(value): url = value[CONF_URL] path = compute_local_image_path(value) - download_content(url, path) + external_files.download_content(url, path, IMAGE_DOWNLOAD_TIMEOUT) return value diff --git a/esphome/external_files.py b/esphome/external_files.py index a1422d02b1..f8eb1dcabe 100644 --- a/esphome/external_files.py +++ b/esphome/external_files.py @@ -7,6 +7,7 @@ from datetime import datetime import requests import esphome.config_validation as cv from esphome.core import CORE, TimePeriodSeconds +from esphome.const import __version__ _LOGGER = logging.getLogger(__name__) CODEOWNERS = ["@landonr"] @@ -75,3 +76,28 @@ def compute_local_file_dir(domain: str) -> Path: base_directory.mkdir(parents=True, exist_ok=True) return base_directory + + +def download_content(url: str, path: Path, timeout=NETWORK_TIMEOUT) -> None: + if not has_remote_file_changed(url, path): + _LOGGER.debug("Remote file has not changed %s", url) + return + + _LOGGER.debug( + "Remote file has changed, downloading from %s to %s", + url, + path, + ) + + try: + req = requests.get( + url, + timeout=timeout, + headers={"User-agent": f"ESPHome/{__version__} (https://esphome.io)"}, + ) + req.raise_for_status() + except requests.exceptions.RequestException as e: + raise cv.Invalid(f"Could not download from {url}: {e}") + + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(req.content) From c9a0daf4b6435533bf14594c0b579f829719aa15 Mon Sep 17 00:00:00 2001 From: Markus <974709+Links2004@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:05:37 +0200 Subject: [PATCH 111/233] Do not build mDNS when mDNS is disabled via yaml (#6979) --- esphome/components/mdns/__init__.py | 6 +++--- esphome/components/mdns/mdns_component.cpp | 4 +++- esphome/components/mdns/mdns_component.h | 4 +++- esphome/components/mdns/mdns_esp32.cpp | 3 ++- esphome/components/mdns/mdns_esp8266.cpp | 3 ++- esphome/components/mdns/mdns_host.cpp | 3 ++- esphome/components/mdns/mdns_libretiny.cpp | 3 ++- esphome/components/mdns/mdns_rp2040.cpp | 3 ++- 8 files changed, 19 insertions(+), 10 deletions(-) diff --git a/esphome/components/mdns/__init__.py b/esphome/components/mdns/__init__.py index 82cf087fdc..fb90986314 100644 --- a/esphome/components/mdns/__init__.py +++ b/esphome/components/mdns/__init__.py @@ -74,6 +74,9 @@ def mdns_service( @coroutine_with_priority(55.0) async def to_code(config): + if config[CONF_DISABLED] is True: + return + if CORE.using_arduino: if CORE.is_esp32: cg.add_library("ESPmDNS", None) @@ -92,9 +95,6 @@ async def to_code(config): path="components/mdns", ) - if config[CONF_DISABLED]: - return - cg.add_define("USE_MDNS") var = cg.new_Pvariable(config[CONF_ID]) diff --git a/esphome/components/mdns/mdns_component.cpp b/esphome/components/mdns/mdns_component.cpp index e2e562670b..2fc09330cd 100644 --- a/esphome/components/mdns/mdns_component.cpp +++ b/esphome/components/mdns/mdns_component.cpp @@ -1,5 +1,6 @@ -#include "mdns_component.h" #include "esphome/core/defines.h" +#ifdef USE_MDNS +#include "mdns_component.h" #include "esphome/core/version.h" #include "esphome/core/application.h" #include "esphome/core/log.h" @@ -125,3 +126,4 @@ void MDNSComponent::dump_config() { } // namespace mdns } // namespace esphome +#endif diff --git a/esphome/components/mdns/mdns_component.h b/esphome/components/mdns/mdns_component.h index b2cb10db62..dfb5b72292 100644 --- a/esphome/components/mdns/mdns_component.h +++ b/esphome/components/mdns/mdns_component.h @@ -1,5 +1,6 @@ #pragma once - +#include "esphome/core/defines.h" +#ifdef USE_MDNS #include #include #include "esphome/core/component.h" @@ -46,3 +47,4 @@ class MDNSComponent : public Component { } // namespace mdns } // namespace esphome +#endif diff --git a/esphome/components/mdns/mdns_esp32.cpp b/esphome/components/mdns/mdns_esp32.cpp index 6081c96637..8006eb27f1 100644 --- a/esphome/components/mdns/mdns_esp32.cpp +++ b/esphome/components/mdns/mdns_esp32.cpp @@ -1,4 +1,5 @@ -#ifdef USE_ESP32 +#include "esphome/core/defines.h" +#if defined(USE_ESP32) && defined(USE_MDNS) #include #include diff --git a/esphome/components/mdns/mdns_esp8266.cpp b/esphome/components/mdns/mdns_esp8266.cpp index 5ff1b86341..7b6e7ec448 100644 --- a/esphome/components/mdns/mdns_esp8266.cpp +++ b/esphome/components/mdns/mdns_esp8266.cpp @@ -1,4 +1,5 @@ -#if defined(USE_ESP8266) && defined(USE_ARDUINO) +#include "esphome/core/defines.h" +#if defined(USE_ESP8266) && defined(USE_ARDUINO) && defined(USE_MDNS) #include #include "esphome/components/network/ip_address.h" diff --git a/esphome/components/mdns/mdns_host.cpp b/esphome/components/mdns/mdns_host.cpp index 3f89146f02..78767ed136 100644 --- a/esphome/components/mdns/mdns_host.cpp +++ b/esphome/components/mdns/mdns_host.cpp @@ -1,4 +1,5 @@ -#ifdef USE_HOST +#include "esphome/core/defines.h" +#if defined(USE_HOST) && defined(USE_MDNS) #include "esphome/components/network/ip_address.h" #include "esphome/components/network/util.h" diff --git a/esphome/components/mdns/mdns_libretiny.cpp b/esphome/components/mdns/mdns_libretiny.cpp index ccb79c88b9..c9a9a289dd 100644 --- a/esphome/components/mdns/mdns_libretiny.cpp +++ b/esphome/components/mdns/mdns_libretiny.cpp @@ -1,4 +1,5 @@ -#ifdef USE_LIBRETINY +#include "esphome/core/defines.h" +#if defined(USE_LIBRETINY) && defined(USE_MDNS) #include "esphome/components/network/ip_address.h" #include "esphome/components/network/util.h" diff --git a/esphome/components/mdns/mdns_rp2040.cpp b/esphome/components/mdns/mdns_rp2040.cpp index 56afd6f5e1..89e668ee59 100644 --- a/esphome/components/mdns/mdns_rp2040.cpp +++ b/esphome/components/mdns/mdns_rp2040.cpp @@ -1,4 +1,5 @@ -#ifdef USE_RP2040 +#include "esphome/core/defines.h" +#if defined(USE_RP2040) && defined(USE_MDNS) #include "esphome/components/network/ip_address.h" #include "esphome/components/network/util.h" From 481cf7384ae081e2cabe568cba31a6a6dde68754 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 21:07:19 +1200 Subject: [PATCH 112/233] [safe_mode] Set safe mode core data in disabled cases (#6983) --- esphome/components/safe_mode/__init__.py | 25 ++++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/esphome/components/safe_mode/__init__.py b/esphome/components/safe_mode/__init__.py index 881937890d..185c0e70b1 100644 --- a/esphome/components/safe_mode/__init__.py +++ b/esphome/components/safe_mode/__init__.py @@ -56,21 +56,20 @@ CONFIG_SCHEMA = cv.All( @coroutine_with_priority(50.0) async def to_code(config): - if config[CONF_DISABLED]: - return + if not config[CONF_DISABLED]: + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) - var = cg.new_Pvariable(config[CONF_ID]) - await cg.register_component(var, config) + for conf in config.get(CONF_ON_SAFE_MODE, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [], conf) - for conf in config.get(CONF_ON_SAFE_MODE, []): - trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) - await automation.build_automation(trigger, [], conf) + condition = var.should_enter_safe_mode( + config[CONF_NUM_ATTEMPTS], + config[CONF_REBOOT_TIMEOUT], + config[CONF_BOOT_IS_GOOD_AFTER], + ) + cg.add(RawExpression(f"if ({condition}) return")) - condition = var.should_enter_safe_mode( - config[CONF_NUM_ATTEMPTS], - config[CONF_REBOOT_TIMEOUT], - config[CONF_BOOT_IS_GOOD_AFTER], - ) - cg.add(RawExpression(f"if ({condition}) return")) CORE.data[CONF_SAFE_MODE] = {} CORE.data[CONF_SAFE_MODE][KEY_PAST_SAFE_MODE] = True From fb9844463b53d3aee6fd5e67bd5f71a7568c6a98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Tue, 25 Jun 2024 11:08:57 +0200 Subject: [PATCH 113/233] Bump HeatpumpIR and IRremoteESP8266 (#6948) --- esphome/components/heatpumpir/climate.py | 10 ++++++++-- esphome/components/heatpumpir/heatpumpir.cpp | 6 ++++++ esphome/components/heatpumpir/heatpumpir.h | 6 ++++++ platformio.ini | 6 +++--- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/esphome/components/heatpumpir/climate.py b/esphome/components/heatpumpir/climate.py index 8af4ca590f..b86d405b7e 100644 --- a/esphome/components/heatpumpir/climate.py +++ b/esphome/components/heatpumpir/climate.py @@ -34,6 +34,7 @@ PROTOCOLS = { "greeyan": Protocol.PROTOCOL_GREEYAN, "greeyac": Protocol.PROTOCOL_GREEYAC, "greeyt": Protocol.PROTOCOL_GREEYT, + "greeyap": Protocol.PROTOCOL_GREEYAP, "hisense_aud": Protocol.PROTOCOL_HISENSE_AUD, "hitachi": Protocol.PROTOCOL_HITACHI, "hyundai": Protocol.PROTOCOL_HYUNDAI, @@ -61,6 +62,11 @@ PROTOCOLS = { "toshiba_daiseikai": Protocol.PROTOCOL_TOSHIBA_DAISEIKAI, "toshiba": Protocol.PROTOCOL_TOSHIBA, "zhlt01": Protocol.PROTOCOL_ZHLT01, + "nibe": Protocol.PROTOCOL_NIBE, + "carrier_qlima_1": Protocol.PROTOCOL_QLIMA_1, + "carrier_qlima_2": Protocol.PROTOCOL_QLIMA_2, + "samsung_aqv12msan": Protocol.PROTOCOL_SAMSUNG_AQV12MSAN, + "zhjg01": Protocol.PROTOCOL_ZHJG01, } CONF_HORIZONTAL_DEFAULT = "horizontal_default" @@ -116,7 +122,7 @@ def to_code(config): cg.add(var.set_max_temperature(config[CONF_MAX_TEMPERATURE])) cg.add(var.set_min_temperature(config[CONF_MIN_TEMPERATURE])) - cg.add_library("tonia/HeatpumpIR", "1.0.23") + cg.add_library("tonia/HeatpumpIR", "1.0.26") if CORE.is_esp8266 or CORE.is_esp32: - cg.add_library("crankyoldgit/IRremoteESP8266", "2.8.4") + cg.add_library("crankyoldgit/IRremoteESP8266", "2.8.6") diff --git a/esphome/components/heatpumpir/heatpumpir.cpp b/esphome/components/heatpumpir/heatpumpir.cpp index 5e7237b63c..22a5779c8d 100644 --- a/esphome/components/heatpumpir/heatpumpir.cpp +++ b/esphome/components/heatpumpir/heatpumpir.cpp @@ -28,6 +28,7 @@ const std::map> PROTOCOL_CONSTRUCTOR_MAP {PROTOCOL_GREEYAN, []() { return new GreeYANHeatpumpIR(); }}, // NOLINT {PROTOCOL_GREEYAC, []() { return new GreeYACHeatpumpIR(); }}, // NOLINT {PROTOCOL_GREEYT, []() { return new GreeYTHeatpumpIR(); }}, // NOLINT + {PROTOCOL_GREEYAP, []() { return new GreeYAPHeatpumpIR(); }}, // NOLINT {PROTOCOL_HISENSE_AUD, []() { return new HisenseHeatpumpIR(); }}, // NOLINT {PROTOCOL_HITACHI, []() { return new HitachiHeatpumpIR(); }}, // NOLINT {PROTOCOL_HYUNDAI, []() { return new HyundaiHeatpumpIR(); }}, // NOLINT @@ -55,6 +56,11 @@ const std::map> PROTOCOL_CONSTRUCTOR_MAP {PROTOCOL_TOSHIBA_DAISEIKAI, []() { return new ToshibaDaiseikaiHeatpumpIR(); }}, // NOLINT {PROTOCOL_TOSHIBA, []() { return new ToshibaHeatpumpIR(); }}, // NOLINT {PROTOCOL_ZHLT01, []() { return new ZHLT01HeatpumpIR(); }}, // NOLINT + {PROTOCOL_NIBE, []() { return new NibeHeatpumpIR(); }}, // NOLINT + {PROTOCOL_QLIMA_1, []() { return new Qlima1HeatpumpIR(); }}, // NOLINT + {PROTOCOL_QLIMA_2, []() { return new Qlima2HeatpumpIR(); }}, // NOLINT + {PROTOCOL_SAMSUNG_AQV12MSAN, []() { return new SamsungAQV12MSANHeatpumpIR(); }}, // NOLINT + {PROTOCOL_ZHJG01, []() { return new ZHJG01HeatpumpIR(); }}, // NOLINT }; void HeatpumpIRClimate::setup() { diff --git a/esphome/components/heatpumpir/heatpumpir.h b/esphome/components/heatpumpir/heatpumpir.h index e8b03b4c26..0e6ea2218f 100644 --- a/esphome/components/heatpumpir/heatpumpir.h +++ b/esphome/components/heatpumpir/heatpumpir.h @@ -28,6 +28,7 @@ enum Protocol { PROTOCOL_GREEYAN, PROTOCOL_GREEYAC, PROTOCOL_GREEYT, + PROTOCOL_GREEYAP, PROTOCOL_HISENSE_AUD, PROTOCOL_HITACHI, PROTOCOL_HYUNDAI, @@ -55,6 +56,11 @@ enum Protocol { PROTOCOL_TOSHIBA_DAISEIKAI, PROTOCOL_TOSHIBA, PROTOCOL_ZHLT01, + PROTOCOL_NIBE, + PROTOCOL_QLIMA_1, + PROTOCOL_QLIMA_2, + PROTOCOL_SAMSUNG_AQV12MSAN, + PROTOCOL_ZHJG01, }; // Simple enum to represent horizontal directios diff --git a/platformio.ini b/platformio.ini index e106114ff6..e2e66bf672 100644 --- a/platformio.ini +++ b/platformio.ini @@ -65,7 +65,7 @@ lib_deps = glmnet/Dsmr@0.7 ; dsmr rweather/Crypto@0.4.0 ; dsmr dudanov/MideaUART@1.1.9 ; midea - tonia/HeatpumpIR@1.0.23 ; heatpumpir + tonia/HeatpumpIR@1.0.26 ; heatpumpir build_flags = ${common.build_flags} -DUSE_ARDUINO @@ -93,7 +93,7 @@ lib_deps = ESP8266HTTPClient ; http_request (Arduino built-in) ESP8266mDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) - crankyoldgit/IRremoteESP8266@~2.8.4 ; heatpumpir + crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.1 ; wireguard build_flags = ${common:arduino.build_flags} @@ -123,7 +123,7 @@ lib_deps = ESPmDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) esphome/ESP32-audioI2S@2.0.7 ; i2s_audio - crankyoldgit/IRremoteESP8266@~2.8.4 ; heatpumpir + crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.1 ; wireguard build_flags = ${common:arduino.build_flags} From d8a5c1ea0c440ff488a2b6c1cd84f8440ab81e51 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Tue, 25 Jun 2024 15:57:15 -0500 Subject: [PATCH 114/233] [ota-esphome] Validate for multiple esphome ota instances (#6984) --- esphome/components/esphome/ota/__init__.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/esphome/components/esphome/ota/__init__.py b/esphome/components/esphome/ota/__init__.py index c5903974c2..88e729f230 100644 --- a/esphome/components/esphome/ota/__init__.py +++ b/esphome/components/esphome/ota/__init__.py @@ -1,10 +1,14 @@ import esphome.codegen as cg import esphome.config_validation as cv +import esphome.final_validate as fv from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent from esphome.const import ( + CONF_ESPHOME, CONF_ID, CONF_NUM_ATTEMPTS, + CONF_OTA, CONF_PASSWORD, + CONF_PLATFORM, CONF_PORT, CONF_REBOOT_TIMEOUT, CONF_SAFE_MODE, @@ -21,6 +25,19 @@ esphome = cg.esphome_ns.namespace("esphome") ESPHomeOTAComponent = esphome.class_("ESPHomeOTAComponent", OTAComponent) +def ota_esphome_final_validate(config): + fconf = fv.full_config.get()[CONF_OTA] + used_ports = [] + for ota_conf in fconf: + if ota_conf.get(CONF_PLATFORM) == CONF_ESPHOME: + if (plat_port := ota_conf.get(CONF_PORT)) not in used_ports: + used_ports.append(plat_port) + else: + raise cv.Invalid( + f"Only one instance of the {CONF_ESPHOME} {CONF_OTA} {CONF_PLATFORM} is allowed per port. Note that this error may result from OTA specified in packages" + ) + + CONFIG_SCHEMA = ( cv.Schema( { @@ -50,6 +67,8 @@ CONFIG_SCHEMA = ( .extend(cv.COMPONENT_SCHEMA) ) +FINAL_VALIDATE_SCHEMA = ota_esphome_final_validate + @coroutine_with_priority(52.0) async def to_code(config): From 0179358f9cbb212d30627999a2f7233ff18e12ea Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Tue, 25 Jun 2024 19:50:54 -0400 Subject: [PATCH 115/233] Improve 'body' handling in http_request on_response triggers (#6968) --- esphome/codegen.py | 1 + esphome/components/http_request/__init__.py | 2 +- .../components/http_request/http_request.h | 19 ++++++++++++++----- esphome/cpp_types.py | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/esphome/codegen.py b/esphome/codegen.py index b552490129..6b000b53a1 100644 --- a/esphome/codegen.py +++ b/esphome/codegen.py @@ -60,6 +60,7 @@ from esphome.cpp_types import ( # noqa std_ns, std_shared_ptr, std_string, + std_string_ref, std_vector, uint8, uint16, diff --git a/esphome/components/http_request/__init__.py b/esphome/components/http_request/__init__.py index 37487ec9a7..ade7024bed 100644 --- a/esphome/components/http_request/__init__.py +++ b/esphome/components/http_request/__init__.py @@ -257,7 +257,7 @@ async def http_request_action_to_code(config, action_id, template_arg, args): trigger, [ (cg.std_shared_ptr.template(HttpContainer), "response"), - (cg.std_string, "body"), + (cg.std_string_ref, "body"), ], conf, ) diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index 6281adddb6..82b7392648 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -43,10 +43,10 @@ class HttpContainer : public Parented { bool secure_{false}; }; -class HttpRequestResponseTrigger : public Trigger, std::string> { +class HttpRequestResponseTrigger : public Trigger, std::string &> { public: - void process(std::shared_ptr container, std::string response_body) { - this->trigger(std::move(container), std::move(response_body)); + void process(std::shared_ptr container, std::string &response_body) { + this->trigger(std::move(container), response_body); } }; @@ -153,8 +153,17 @@ template class HttpRequestSendAction : public Action { } } - for (auto *trigger : this->response_triggers_) { - trigger->process(container, response_body); + if (this->response_triggers_.size() == 1) { + // if there is only one trigger, no need to copy the response body + this->response_triggers_[0]->process(container, response_body); + } else { + for (auto *trigger : this->response_triggers_) { + // with multiple triggers, pass a copy of the response body to each + // one so that modifications made in one trigger are not visible to + // the others + auto response_body_copy = std::string(response_body); + trigger->process(container, response_body_copy); + } } container->end(); } diff --git a/esphome/cpp_types.py b/esphome/cpp_types.py index bd79d3b2f9..dab993f87f 100644 --- a/esphome/cpp_types.py +++ b/esphome/cpp_types.py @@ -10,6 +10,7 @@ int_ = global_ns.namespace("int") std_ns = global_ns.namespace("std") std_shared_ptr = std_ns.class_("shared_ptr") std_string = std_ns.class_("string") +std_string_ref = std_ns.namespace("string &") std_vector = std_ns.class_("vector") uint8 = global_ns.namespace("uint8_t") uint16 = global_ns.namespace("uint16_t") From bc26de2d68283d0d743a1e5a08921abfa6c00820 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Tue, 25 Jun 2024 16:54:02 -0700 Subject: [PATCH 116/233] [ds1307] Initialize uninitialized struct members (#6985) --- esphome/components/ds1307/ds1307.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/esphome/components/ds1307/ds1307.cpp b/esphome/components/ds1307/ds1307.cpp index 472ccc7a9a..9df8a1d373 100644 --- a/esphome/components/ds1307/ds1307.cpp +++ b/esphome/components/ds1307/ds1307.cpp @@ -37,14 +37,18 @@ void DS1307Component::read_time() { ESP_LOGW(TAG, "RTC halted, not syncing to system clock."); return; } - ESPTime rtc_time{.second = uint8_t(ds1307_.reg.second + 10 * ds1307_.reg.second_10), - .minute = uint8_t(ds1307_.reg.minute + 10u * ds1307_.reg.minute_10), - .hour = uint8_t(ds1307_.reg.hour + 10u * ds1307_.reg.hour_10), - .day_of_week = uint8_t(ds1307_.reg.weekday), - .day_of_month = uint8_t(ds1307_.reg.day + 10u * ds1307_.reg.day_10), - .day_of_year = 1, // ignored by recalc_timestamp_utc(false) - .month = uint8_t(ds1307_.reg.month + 10u * ds1307_.reg.month_10), - .year = uint16_t(ds1307_.reg.year + 10u * ds1307_.reg.year_10 + 2000)}; + ESPTime rtc_time{ + .second = uint8_t(ds1307_.reg.second + 10 * ds1307_.reg.second_10), + .minute = uint8_t(ds1307_.reg.minute + 10u * ds1307_.reg.minute_10), + .hour = uint8_t(ds1307_.reg.hour + 10u * ds1307_.reg.hour_10), + .day_of_week = uint8_t(ds1307_.reg.weekday), + .day_of_month = uint8_t(ds1307_.reg.day + 10u * ds1307_.reg.day_10), + .day_of_year = 1, // ignored by recalc_timestamp_utc(false) + .month = uint8_t(ds1307_.reg.month + 10u * ds1307_.reg.month_10), + .year = uint16_t(ds1307_.reg.year + 10u * ds1307_.reg.year_10 + 2000), + .is_dst = false, // not used + .timestamp = 0 // overwritten by recalc_timestamp_utc(false) + }; rtc_time.recalc_timestamp_utc(false); if (!rtc_time.is_valid()) { ESP_LOGE(TAG, "Invalid RTC time, not syncing to system clock."); From cc4f1c667ed15f1962c6bacaa7b30c0a7f329b43 Mon Sep 17 00:00:00 2001 From: Petapton <14984292+Petapton@users.noreply.github.com> Date: Wed, 26 Jun 2024 02:08:16 +0200 Subject: [PATCH 117/233] Fix float encoding in modbus server (#6986) --- esphome/components/modbus_controller/modbus_controller.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/components/modbus_controller/modbus_controller.cpp b/esphome/components/modbus_controller/modbus_controller.cpp index 9f73988b03..29d3137603 100644 --- a/esphome/components/modbus_controller/modbus_controller.cpp +++ b/esphome/components/modbus_controller/modbus_controller.cpp @@ -116,7 +116,8 @@ void ModbusController::on_modbus_read_registers(uint8_t function_code, uint16_t ESP_LOGD(TAG, "Matched register. Address: 0x%02X. Value type: %zu. Register count: %u. Value: %0.1f.", server_register->address, static_cast(server_register->value_type), server_register->register_count, value); - number_to_payload(sixteen_bit_response, value, server_register->value_type); + std::vector payload = float_to_payload(value, server_register->value_type); + sixteen_bit_response.insert(sixteen_bit_response.end(), payload.cbegin(), payload.cend()); current_address += server_register->register_count; found = true; break; From 91766afb64e804db97cc03f8ba6174e13968f742 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Wed, 26 Jun 2024 00:27:07 -0700 Subject: [PATCH 118/233] [dallas_temp] fix ds18s20 temp calc (#6988) --- .../components/dallas_temp/dallas_temp.cpp | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/esphome/components/dallas_temp/dallas_temp.cpp b/esphome/components/dallas_temp/dallas_temp.cpp index fe7c9a95ea..ae567d6a76 100644 --- a/esphome/components/dallas_temp/dallas_temp.cpp +++ b/esphome/components/dallas_temp/dallas_temp.cpp @@ -145,24 +145,21 @@ bool DallasTemperatureSensor::check_scratch_pad_() { float DallasTemperatureSensor::get_temp_c_() { int16_t temp = (this->scratch_pad_[1] << 8) | this->scratch_pad_[0]; if ((this->address_ & 0xff) == DALLAS_MODEL_DS18S20) { - if (this->scratch_pad_[7] != 0x10) - ESP_LOGE(TAG, "unexpected COUNT_PER_C value: %u", this->scratch_pad_[7]); - temp = ((temp & 0xfff7) << 3) + (0x10 - this->scratch_pad_[6]) - 4; - } else { - switch (this->resolution_) { - case 9: - temp &= 0xfff8; - break; - case 10: - temp &= 0xfffc; - break; - case 11: - temp &= 0xfffe; - break; - case 12: - default: - break; - } + return (temp >> 1) + (this->scratch_pad_[7] - this->scratch_pad_[6]) / float(this->scratch_pad_[7]) - 0.25; + } + switch (this->resolution_) { + case 9: + temp &= 0xfff8; + break; + case 10: + temp &= 0xfffc; + break; + case 11: + temp &= 0xfffe; + break; + case 12: + default: + break; } return temp / 16.0f; From 01bcf5fb97643d73a96fbf7119ea48a768f85b73 Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Wed, 26 Jun 2024 14:38:11 +0400 Subject: [PATCH 119/233] [modbus-text-sensor] fix potential buffer overflow (#6993) --- .../modbus_controller/text_sensor/modbus_textsensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp index 359c6e2f50..da5c0fba37 100644 --- a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +++ b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp @@ -15,7 +15,7 @@ void ModbusTextSensor::parse_and_publish(const std::vector &data) { std::ostringstream output; uint8_t items_left = this->response_bytes; uint8_t index = this->offset; - char buffer[4]; + char buffer[5]; while ((items_left > 0) && index < data.size()) { uint8_t b = data[index]; switch (this->encode_) { From 7be071a0e91771019fce9be8704e6dffc1d6e0af Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 25 Jun 2024 21:07:19 +1200 Subject: [PATCH 120/233] [safe_mode] Set safe mode core data in disabled cases (#6983) --- esphome/components/safe_mode/__init__.py | 25 ++++++++++++------------ 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/esphome/components/safe_mode/__init__.py b/esphome/components/safe_mode/__init__.py index 881937890d..185c0e70b1 100644 --- a/esphome/components/safe_mode/__init__.py +++ b/esphome/components/safe_mode/__init__.py @@ -56,21 +56,20 @@ CONFIG_SCHEMA = cv.All( @coroutine_with_priority(50.0) async def to_code(config): - if config[CONF_DISABLED]: - return + if not config[CONF_DISABLED]: + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) - var = cg.new_Pvariable(config[CONF_ID]) - await cg.register_component(var, config) + for conf in config.get(CONF_ON_SAFE_MODE, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation(trigger, [], conf) - for conf in config.get(CONF_ON_SAFE_MODE, []): - trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) - await automation.build_automation(trigger, [], conf) + condition = var.should_enter_safe_mode( + config[CONF_NUM_ATTEMPTS], + config[CONF_REBOOT_TIMEOUT], + config[CONF_BOOT_IS_GOOD_AFTER], + ) + cg.add(RawExpression(f"if ({condition}) return")) - condition = var.should_enter_safe_mode( - config[CONF_NUM_ATTEMPTS], - config[CONF_REBOOT_TIMEOUT], - config[CONF_BOOT_IS_GOOD_AFTER], - ) - cg.add(RawExpression(f"if ({condition}) return")) CORE.data[CONF_SAFE_MODE] = {} CORE.data[CONF_SAFE_MODE][KEY_PAST_SAFE_MODE] = True From d8a6d8594a246fd038c6051f157c7ce2eaf8b0eb Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Tue, 25 Jun 2024 15:57:15 -0500 Subject: [PATCH 121/233] [ota-esphome] Validate for multiple esphome ota instances (#6984) --- esphome/components/esphome/ota/__init__.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/esphome/components/esphome/ota/__init__.py b/esphome/components/esphome/ota/__init__.py index c5903974c2..88e729f230 100644 --- a/esphome/components/esphome/ota/__init__.py +++ b/esphome/components/esphome/ota/__init__.py @@ -1,10 +1,14 @@ import esphome.codegen as cg import esphome.config_validation as cv +import esphome.final_validate as fv from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent from esphome.const import ( + CONF_ESPHOME, CONF_ID, CONF_NUM_ATTEMPTS, + CONF_OTA, CONF_PASSWORD, + CONF_PLATFORM, CONF_PORT, CONF_REBOOT_TIMEOUT, CONF_SAFE_MODE, @@ -21,6 +25,19 @@ esphome = cg.esphome_ns.namespace("esphome") ESPHomeOTAComponent = esphome.class_("ESPHomeOTAComponent", OTAComponent) +def ota_esphome_final_validate(config): + fconf = fv.full_config.get()[CONF_OTA] + used_ports = [] + for ota_conf in fconf: + if ota_conf.get(CONF_PLATFORM) == CONF_ESPHOME: + if (plat_port := ota_conf.get(CONF_PORT)) not in used_ports: + used_ports.append(plat_port) + else: + raise cv.Invalid( + f"Only one instance of the {CONF_ESPHOME} {CONF_OTA} {CONF_PLATFORM} is allowed per port. Note that this error may result from OTA specified in packages" + ) + + CONFIG_SCHEMA = ( cv.Schema( { @@ -50,6 +67,8 @@ CONFIG_SCHEMA = ( .extend(cv.COMPONENT_SCHEMA) ) +FINAL_VALIDATE_SCHEMA = ota_esphome_final_validate + @coroutine_with_priority(52.0) async def to_code(config): From 1579dfeb80a7b49d6cc4cfeb4f52074c026621b3 Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Tue, 25 Jun 2024 19:50:54 -0400 Subject: [PATCH 122/233] Improve 'body' handling in http_request on_response triggers (#6968) --- esphome/codegen.py | 1 + esphome/components/http_request/__init__.py | 2 +- .../components/http_request/http_request.h | 19 ++++++++++++++----- esphome/cpp_types.py | 1 + 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/esphome/codegen.py b/esphome/codegen.py index b552490129..6b000b53a1 100644 --- a/esphome/codegen.py +++ b/esphome/codegen.py @@ -60,6 +60,7 @@ from esphome.cpp_types import ( # noqa std_ns, std_shared_ptr, std_string, + std_string_ref, std_vector, uint8, uint16, diff --git a/esphome/components/http_request/__init__.py b/esphome/components/http_request/__init__.py index 37487ec9a7..ade7024bed 100644 --- a/esphome/components/http_request/__init__.py +++ b/esphome/components/http_request/__init__.py @@ -257,7 +257,7 @@ async def http_request_action_to_code(config, action_id, template_arg, args): trigger, [ (cg.std_shared_ptr.template(HttpContainer), "response"), - (cg.std_string, "body"), + (cg.std_string_ref, "body"), ], conf, ) diff --git a/esphome/components/http_request/http_request.h b/esphome/components/http_request/http_request.h index 6281adddb6..82b7392648 100644 --- a/esphome/components/http_request/http_request.h +++ b/esphome/components/http_request/http_request.h @@ -43,10 +43,10 @@ class HttpContainer : public Parented { bool secure_{false}; }; -class HttpRequestResponseTrigger : public Trigger, std::string> { +class HttpRequestResponseTrigger : public Trigger, std::string &> { public: - void process(std::shared_ptr container, std::string response_body) { - this->trigger(std::move(container), std::move(response_body)); + void process(std::shared_ptr container, std::string &response_body) { + this->trigger(std::move(container), response_body); } }; @@ -153,8 +153,17 @@ template class HttpRequestSendAction : public Action { } } - for (auto *trigger : this->response_triggers_) { - trigger->process(container, response_body); + if (this->response_triggers_.size() == 1) { + // if there is only one trigger, no need to copy the response body + this->response_triggers_[0]->process(container, response_body); + } else { + for (auto *trigger : this->response_triggers_) { + // with multiple triggers, pass a copy of the response body to each + // one so that modifications made in one trigger are not visible to + // the others + auto response_body_copy = std::string(response_body); + trigger->process(container, response_body_copy); + } } container->end(); } diff --git a/esphome/cpp_types.py b/esphome/cpp_types.py index bd79d3b2f9..dab993f87f 100644 --- a/esphome/cpp_types.py +++ b/esphome/cpp_types.py @@ -10,6 +10,7 @@ int_ = global_ns.namespace("int") std_ns = global_ns.namespace("std") std_shared_ptr = std_ns.class_("shared_ptr") std_string = std_ns.class_("string") +std_string_ref = std_ns.namespace("string &") std_vector = std_ns.class_("vector") uint8 = global_ns.namespace("uint8_t") uint16 = global_ns.namespace("uint16_t") From 169fb79c977aa451655fa1840b738dfee9bfca13 Mon Sep 17 00:00:00 2001 From: Pieter Viljoen Date: Tue, 25 Jun 2024 16:54:02 -0700 Subject: [PATCH 123/233] [ds1307] Initialize uninitialized struct members (#6985) --- esphome/components/ds1307/ds1307.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/esphome/components/ds1307/ds1307.cpp b/esphome/components/ds1307/ds1307.cpp index 472ccc7a9a..9df8a1d373 100644 --- a/esphome/components/ds1307/ds1307.cpp +++ b/esphome/components/ds1307/ds1307.cpp @@ -37,14 +37,18 @@ void DS1307Component::read_time() { ESP_LOGW(TAG, "RTC halted, not syncing to system clock."); return; } - ESPTime rtc_time{.second = uint8_t(ds1307_.reg.second + 10 * ds1307_.reg.second_10), - .minute = uint8_t(ds1307_.reg.minute + 10u * ds1307_.reg.minute_10), - .hour = uint8_t(ds1307_.reg.hour + 10u * ds1307_.reg.hour_10), - .day_of_week = uint8_t(ds1307_.reg.weekday), - .day_of_month = uint8_t(ds1307_.reg.day + 10u * ds1307_.reg.day_10), - .day_of_year = 1, // ignored by recalc_timestamp_utc(false) - .month = uint8_t(ds1307_.reg.month + 10u * ds1307_.reg.month_10), - .year = uint16_t(ds1307_.reg.year + 10u * ds1307_.reg.year_10 + 2000)}; + ESPTime rtc_time{ + .second = uint8_t(ds1307_.reg.second + 10 * ds1307_.reg.second_10), + .minute = uint8_t(ds1307_.reg.minute + 10u * ds1307_.reg.minute_10), + .hour = uint8_t(ds1307_.reg.hour + 10u * ds1307_.reg.hour_10), + .day_of_week = uint8_t(ds1307_.reg.weekday), + .day_of_month = uint8_t(ds1307_.reg.day + 10u * ds1307_.reg.day_10), + .day_of_year = 1, // ignored by recalc_timestamp_utc(false) + .month = uint8_t(ds1307_.reg.month + 10u * ds1307_.reg.month_10), + .year = uint16_t(ds1307_.reg.year + 10u * ds1307_.reg.year_10 + 2000), + .is_dst = false, // not used + .timestamp = 0 // overwritten by recalc_timestamp_utc(false) + }; rtc_time.recalc_timestamp_utc(false); if (!rtc_time.is_valid()) { ESP_LOGE(TAG, "Invalid RTC time, not syncing to system clock."); From bbd7c9cf861d199c7e671aa175c3d225a3bea14f Mon Sep 17 00:00:00 2001 From: Petapton <14984292+Petapton@users.noreply.github.com> Date: Wed, 26 Jun 2024 02:08:16 +0200 Subject: [PATCH 124/233] Fix float encoding in modbus server (#6986) --- esphome/components/modbus_controller/modbus_controller.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/components/modbus_controller/modbus_controller.cpp b/esphome/components/modbus_controller/modbus_controller.cpp index 9f73988b03..29d3137603 100644 --- a/esphome/components/modbus_controller/modbus_controller.cpp +++ b/esphome/components/modbus_controller/modbus_controller.cpp @@ -116,7 +116,8 @@ void ModbusController::on_modbus_read_registers(uint8_t function_code, uint16_t ESP_LOGD(TAG, "Matched register. Address: 0x%02X. Value type: %zu. Register count: %u. Value: %0.1f.", server_register->address, static_cast(server_register->value_type), server_register->register_count, value); - number_to_payload(sixteen_bit_response, value, server_register->value_type); + std::vector payload = float_to_payload(value, server_register->value_type); + sixteen_bit_response.insert(sixteen_bit_response.end(), payload.cbegin(), payload.cend()); current_address += server_register->register_count; found = true; break; From c747d7d45d15469c111635045e2c95437bedccc1 Mon Sep 17 00:00:00 2001 From: Samuel Sieb Date: Wed, 26 Jun 2024 00:27:07 -0700 Subject: [PATCH 125/233] [dallas_temp] fix ds18s20 temp calc (#6988) --- .../components/dallas_temp/dallas_temp.cpp | 33 +++++++++---------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/esphome/components/dallas_temp/dallas_temp.cpp b/esphome/components/dallas_temp/dallas_temp.cpp index fe7c9a95ea..ae567d6a76 100644 --- a/esphome/components/dallas_temp/dallas_temp.cpp +++ b/esphome/components/dallas_temp/dallas_temp.cpp @@ -145,24 +145,21 @@ bool DallasTemperatureSensor::check_scratch_pad_() { float DallasTemperatureSensor::get_temp_c_() { int16_t temp = (this->scratch_pad_[1] << 8) | this->scratch_pad_[0]; if ((this->address_ & 0xff) == DALLAS_MODEL_DS18S20) { - if (this->scratch_pad_[7] != 0x10) - ESP_LOGE(TAG, "unexpected COUNT_PER_C value: %u", this->scratch_pad_[7]); - temp = ((temp & 0xfff7) << 3) + (0x10 - this->scratch_pad_[6]) - 4; - } else { - switch (this->resolution_) { - case 9: - temp &= 0xfff8; - break; - case 10: - temp &= 0xfffc; - break; - case 11: - temp &= 0xfffe; - break; - case 12: - default: - break; - } + return (temp >> 1) + (this->scratch_pad_[7] - this->scratch_pad_[6]) / float(this->scratch_pad_[7]) - 0.25; + } + switch (this->resolution_) { + case 9: + temp &= 0xfff8; + break; + case 10: + temp &= 0xfffc; + break; + case 11: + temp &= 0xfffe; + break; + case 12: + default: + break; } return temp / 16.0f; From 9c2af6318ced3de3927db404172fe358fd0afa7d Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Wed, 26 Jun 2024 14:38:11 +0400 Subject: [PATCH 126/233] [modbus-text-sensor] fix potential buffer overflow (#6993) --- .../modbus_controller/text_sensor/modbus_textsensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp index 359c6e2f50..da5c0fba37 100644 --- a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +++ b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp @@ -15,7 +15,7 @@ void ModbusTextSensor::parse_and_publish(const std::vector &data) { std::ostringstream output; uint8_t items_left = this->response_bytes; uint8_t index = this->offset; - char buffer[4]; + char buffer[5]; while ((items_left > 0) && index < data.size()) { uint8_t b = data[index]; switch (this->encode_) { From 86791422f02a5401c2fff948bba4eb1b0d82ac85 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 26 Jun 2024 22:41:48 +1200 Subject: [PATCH 127/233] Bump version to 2024.6.3 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index cde917ca98..2434609191 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.2" +__version__ = "2024.6.3" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 7174cf35dd9dc3e9e48ab84466dfcd69f2cb2f03 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 17:53:29 -0500 Subject: [PATCH 128/233] [CI] Add more mdns and safe_mode tests (#6990) --- tests/components/mdns/{common.yaml => common-enabled.yaml} | 0 tests/components/mdns/test-disabled.esp32-idf.yaml | 6 ++++++ tests/components/mdns/test-enabled.esp32-ard.yaml | 1 + tests/components/mdns/test-enabled.esp32-c3-ard.yaml | 1 + tests/components/mdns/test-enabled.esp32-c3-idf.yaml | 1 + tests/components/mdns/test-enabled.esp32-idf.yaml | 1 + tests/components/mdns/test-enabled.esp8266-ard.yaml | 1 + tests/components/mdns/test-enabled.rp2040-ard.yaml | 1 + tests/components/mdns/test.esp32-ard.yaml | 1 - tests/components/mdns/test.esp32-c3-ard.yaml | 1 - tests/components/mdns/test.esp32-c3-idf.yaml | 1 - tests/components/mdns/test.esp32-idf.yaml | 1 - tests/components/mdns/test.esp8266-ard.yaml | 1 - tests/components/mdns/test.rp2040-ard.yaml | 1 - .../safe_mode/{common.yaml => common-enabled.yaml} | 0 tests/components/safe_mode/test-disabled.esp32-idf.yaml | 6 ++++++ tests/components/safe_mode/test-enabled.esp32-ard.yaml | 1 + tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml | 1 + tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml | 1 + tests/components/safe_mode/test-enabled.esp32-idf.yaml | 1 + tests/components/safe_mode/test-enabled.esp8266-ard.yaml | 1 + tests/components/safe_mode/test-enabled.rp2040-ard.yaml | 1 + tests/components/safe_mode/test.esp32-ard.yaml | 1 - tests/components/safe_mode/test.esp32-c3-ard.yaml | 1 - tests/components/safe_mode/test.esp32-c3-idf.yaml | 1 - tests/components/safe_mode/test.esp32-idf.yaml | 1 - tests/components/safe_mode/test.esp8266-ard.yaml | 1 - tests/components/safe_mode/test.rp2040-ard.yaml | 1 - 28 files changed, 24 insertions(+), 12 deletions(-) rename tests/components/mdns/{common.yaml => common-enabled.yaml} (100%) create mode 100644 tests/components/mdns/test-disabled.esp32-idf.yaml create mode 100644 tests/components/mdns/test-enabled.esp32-ard.yaml create mode 100644 tests/components/mdns/test-enabled.esp32-c3-ard.yaml create mode 100644 tests/components/mdns/test-enabled.esp32-c3-idf.yaml create mode 100644 tests/components/mdns/test-enabled.esp32-idf.yaml create mode 100644 tests/components/mdns/test-enabled.esp8266-ard.yaml create mode 100644 tests/components/mdns/test-enabled.rp2040-ard.yaml delete mode 100644 tests/components/mdns/test.esp32-ard.yaml delete mode 100644 tests/components/mdns/test.esp32-c3-ard.yaml delete mode 100644 tests/components/mdns/test.esp32-c3-idf.yaml delete mode 100644 tests/components/mdns/test.esp32-idf.yaml delete mode 100644 tests/components/mdns/test.esp8266-ard.yaml delete mode 100644 tests/components/mdns/test.rp2040-ard.yaml rename tests/components/safe_mode/{common.yaml => common-enabled.yaml} (100%) create mode 100644 tests/components/safe_mode/test-disabled.esp32-idf.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp32-ard.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp32-idf.yaml create mode 100644 tests/components/safe_mode/test-enabled.esp8266-ard.yaml create mode 100644 tests/components/safe_mode/test-enabled.rp2040-ard.yaml delete mode 100644 tests/components/safe_mode/test.esp32-ard.yaml delete mode 100644 tests/components/safe_mode/test.esp32-c3-ard.yaml delete mode 100644 tests/components/safe_mode/test.esp32-c3-idf.yaml delete mode 100644 tests/components/safe_mode/test.esp32-idf.yaml delete mode 100644 tests/components/safe_mode/test.esp8266-ard.yaml delete mode 100644 tests/components/safe_mode/test.rp2040-ard.yaml diff --git a/tests/components/mdns/common.yaml b/tests/components/mdns/common-enabled.yaml similarity index 100% rename from tests/components/mdns/common.yaml rename to tests/components/mdns/common-enabled.yaml diff --git a/tests/components/mdns/test-disabled.esp32-idf.yaml b/tests/components/mdns/test-disabled.esp32-idf.yaml new file mode 100644 index 0000000000..07c70bf248 --- /dev/null +++ b/tests/components/mdns/test-disabled.esp32-idf.yaml @@ -0,0 +1,6 @@ +wifi: + ssid: MySSID + password: password1 + +mdns: + disabled: true diff --git a/tests/components/mdns/test-enabled.esp32-ard.yaml b/tests/components/mdns/test-enabled.esp32-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.esp32-c3-ard.yaml b/tests/components/mdns/test-enabled.esp32-c3-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.esp32-c3-idf.yaml b/tests/components/mdns/test-enabled.esp32-c3-idf.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.esp32-idf.yaml b/tests/components/mdns/test-enabled.esp32-idf.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.esp8266-ard.yaml b/tests/components/mdns/test-enabled.esp8266-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.esp8266-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test-enabled.rp2040-ard.yaml b/tests/components/mdns/test-enabled.rp2040-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/mdns/test-enabled.rp2040-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/mdns/test.esp32-ard.yaml b/tests/components/mdns/test.esp32-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp32-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.esp32-c3-ard.yaml b/tests/components/mdns/test.esp32-c3-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp32-c3-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.esp32-c3-idf.yaml b/tests/components/mdns/test.esp32-c3-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp32-c3-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.esp32-idf.yaml b/tests/components/mdns/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.esp8266-ard.yaml b/tests/components/mdns/test.esp8266-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.esp8266-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/mdns/test.rp2040-ard.yaml b/tests/components/mdns/test.rp2040-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/mdns/test.rp2040-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/common.yaml b/tests/components/safe_mode/common-enabled.yaml similarity index 100% rename from tests/components/safe_mode/common.yaml rename to tests/components/safe_mode/common-enabled.yaml diff --git a/tests/components/safe_mode/test-disabled.esp32-idf.yaml b/tests/components/safe_mode/test-disabled.esp32-idf.yaml new file mode 100644 index 0000000000..291f5a2c7c --- /dev/null +++ b/tests/components/safe_mode/test-disabled.esp32-idf.yaml @@ -0,0 +1,6 @@ +wifi: + ssid: MySSID + password: password1 + +safe_mode: + disabled: true diff --git a/tests/components/safe_mode/test-enabled.esp32-ard.yaml b/tests/components/safe_mode/test-enabled.esp32-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml b/tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml b/tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.esp32-idf.yaml b/tests/components/safe_mode/test-enabled.esp32-idf.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.esp8266-ard.yaml b/tests/components/safe_mode/test-enabled.esp8266-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.esp8266-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test-enabled.rp2040-ard.yaml b/tests/components/safe_mode/test-enabled.rp2040-ard.yaml new file mode 100644 index 0000000000..97fd63d70e --- /dev/null +++ b/tests/components/safe_mode/test-enabled.rp2040-ard.yaml @@ -0,0 +1 @@ +<<: !include common-enabled.yaml diff --git a/tests/components/safe_mode/test.esp32-ard.yaml b/tests/components/safe_mode/test.esp32-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp32-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.esp32-c3-ard.yaml b/tests/components/safe_mode/test.esp32-c3-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp32-c3-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.esp32-c3-idf.yaml b/tests/components/safe_mode/test.esp32-c3-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp32-c3-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.esp32-idf.yaml b/tests/components/safe_mode/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.esp8266-ard.yaml b/tests/components/safe_mode/test.esp8266-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.esp8266-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/safe_mode/test.rp2040-ard.yaml b/tests/components/safe_mode/test.rp2040-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/safe_mode/test.rp2040-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml From 300d48a55e14f9d6170069364d4eaf9b0217a7d5 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 17:54:17 -0500 Subject: [PATCH 129/233] [CI] Remove old test yamls (#6991) --- .github/workflows/ci.yml | 67 ---------------------------------------- 1 file changed, 67 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df7a9178e1..45fe336d77 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -248,72 +248,6 @@ jobs: run: script/ci-suggest-changes if: always() - compile-tests-list: - runs-on: ubuntu-latest - outputs: - matrix: ${{ steps.set-matrix.outputs.matrix }} - steps: - - name: Check out code from GitHub - uses: actions/checkout@v4.1.7 - - name: Find all YAML test files - id: set-matrix - run: echo "matrix=$(ls tests/test*.yaml | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT - - validate-tests: - name: Validate YAML test ${{ matrix.file }} - runs-on: ubuntu-latest - needs: - - common - - compile-tests-list - strategy: - fail-fast: false - matrix: - file: ${{ fromJson(needs.compile-tests-list.outputs.matrix) }} - steps: - - name: Check out code from GitHub - uses: actions/checkout@v4.1.7 - - name: Restore Python - uses: ./.github/actions/restore-python - with: - python-version: ${{ env.DEFAULT_PYTHON }} - cache-key: ${{ needs.common.outputs.cache-key }} - - name: Run esphome config ${{ matrix.file }} - run: | - . venv/bin/activate - esphome config ${{ matrix.file }} - - compile-tests: - name: Run YAML test ${{ matrix.file }} - runs-on: ubuntu-latest - needs: - - common - - black - - ci-custom - - clang-format - - flake8 - - pylint - - pytest - - pyupgrade - - compile-tests-list - - validate-tests - strategy: - fail-fast: false - max-parallel: 2 - matrix: - file: ${{ fromJson(needs.compile-tests-list.outputs.matrix) }} - steps: - - name: Check out code from GitHub - uses: actions/checkout@v4.1.7 - - name: Restore Python - uses: ./.github/actions/restore-python - with: - python-version: ${{ env.DEFAULT_PYTHON }} - cache-key: ${{ needs.common.outputs.cache-key }} - - name: Run esphome compile ${{ matrix.file }} - run: | - . venv/bin/activate - esphome compile ${{ matrix.file }} - clang-tidy: name: ${{ matrix.name }} runs-on: ubuntu-latest @@ -550,7 +484,6 @@ jobs: - pylint - pytest - pyupgrade - - compile-tests - clang-tidy - list-components - test-build-components From 855d154439906ea0b150eb57ae7fa866bf52ca3d Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 17:55:05 -0500 Subject: [PATCH 130/233] [CI] Update tests to run against IDF 5.1 (#6992) --- ...f-50.yaml => build_components_base.esp32-c3-idf-51.yaml} | 6 +++--- ...-idf-50.yaml => build_components_base.esp32-idf-51.yaml} | 6 +++--- ...f-50.yaml => build_components_base.esp32-s2-idf-51.yaml} | 6 +++--- ...f-50.yaml => build_components_base.esp32-s3-idf-51.yaml} | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) rename tests/test_build_components/{build_components_base.esp32-c3-idf-50.yaml => build_components_base.esp32-c3-idf-51.yaml} (76%) rename tests/test_build_components/{build_components_base.esp32-idf-50.yaml => build_components_base.esp32-idf-51.yaml} (77%) rename tests/test_build_components/{build_components_base.esp32-s2-idf-50.yaml => build_components_base.esp32-s2-idf-51.yaml} (78%) rename tests/test_build_components/{build_components_base.esp32-s3-idf-50.yaml => build_components_base.esp32-s3-idf-51.yaml} (77%) diff --git a/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml similarity index 76% rename from tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml index 08d4d8679c..73d2c8fa19 100644 --- a/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32c3idf50 + name: componenttestesp32c3idf51 friendly_name: $component_name esp32: board: lolin_c3_mini framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.6.0 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-idf-51.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-idf-51.yaml index c9f2c1e943..6c8eb3c193 100644 --- a/tests/test_build_components/build_components_base.esp32-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-idf-51.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32idf50 + name: componenttestesp32idf51 friendly_name: $component_name esp32: board: nodemcu-32s framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.6.0 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml similarity index 78% rename from tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml index 351f5fb019..8894efb6b8 100644 --- a/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s2idf50 + name: componenttestesp32s2idf51 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S2 framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.6.0 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml index c05378903f..efeffa5a0f 100644 --- a/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s3idf50 + name: componenttestesp32s3idf51 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S3 framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.6.0 logger: level: VERY_VERBOSE From 192718fee626852690acd575efae60dc06453df6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jun 2024 10:55:42 +1200 Subject: [PATCH 131/233] Bump docker/build-push-action from 6.1.0 to 6.2.0 in /.github/actions/build-image (#6999) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index 27d2ffc533..b038a285ef 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.1.0 + uses: docker/build-push-action@v6.2.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.1.0 + uses: docker/build-push-action@v6.2.0 with: context: . file: ./docker/Dockerfile From 10504c4d68b9808b86d51763f3b92ee0a41b96db Mon Sep 17 00:00:00 2001 From: Christiaan de Ridder Date: Thu, 27 Jun 2024 01:03:55 +0200 Subject: [PATCH 132/233] Tuya invalid command 0x22 (#6980) --- esphome/components/tuya/tuya.cpp | 10 ++++++++-- esphome/components/tuya/tuya.h | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/esphome/components/tuya/tuya.cpp b/esphome/components/tuya/tuya.cpp index 402953bb3b..1443d10254 100644 --- a/esphome/components/tuya/tuya.cpp +++ b/esphome/components/tuya/tuya.cpp @@ -223,13 +223,19 @@ void Tuya::handle_command_(uint8_t command, uint8_t version, const uint8_t *buff break; case TuyaCommandType::DATAPOINT_DELIVER: break; - case TuyaCommandType::DATAPOINT_REPORT: + case TuyaCommandType::DATAPOINT_REPORT_ASYNC: + case TuyaCommandType::DATAPOINT_REPORT_SYNC: if (this->init_state_ == TuyaInitState::INIT_DATAPOINT) { this->init_state_ = TuyaInitState::INIT_DONE; this->set_timeout("datapoint_dump", 1000, [this] { this->dump_config(); }); this->initialized_callback_.call(); } this->handle_datapoints_(buffer, len); + + if (command_type == TuyaCommandType::DATAPOINT_REPORT_SYNC) { + this->send_command_( + TuyaCommand{.cmd = TuyaCommandType::DATAPOINT_REPORT_ACK, .payload = std::vector{0x01}}); + } break; case TuyaCommandType::DATAPOINT_QUERY: break; @@ -423,7 +429,7 @@ void Tuya::send_raw_command_(TuyaCommand command) { break; case TuyaCommandType::DATAPOINT_DELIVER: case TuyaCommandType::DATAPOINT_QUERY: - this->expected_response_ = TuyaCommandType::DATAPOINT_REPORT; + this->expected_response_ = TuyaCommandType::DATAPOINT_REPORT_ASYNC; break; default: break; diff --git a/esphome/components/tuya/tuya.h b/esphome/components/tuya/tuya.h index 6db417d474..76431ddfe4 100644 --- a/esphome/components/tuya/tuya.h +++ b/esphome/components/tuya/tuya.h @@ -53,10 +53,12 @@ enum class TuyaCommandType : uint8_t { WIFI_RESET = 0x04, WIFI_SELECT = 0x05, DATAPOINT_DELIVER = 0x06, - DATAPOINT_REPORT = 0x07, + DATAPOINT_REPORT_ASYNC = 0x07, DATAPOINT_QUERY = 0x08, WIFI_TEST = 0x0E, LOCAL_TIME_QUERY = 0x1C, + DATAPOINT_REPORT_SYNC = 0x22, + DATAPOINT_REPORT_ACK = 0x23, WIFI_RSSI = 0x24, VACUUM_MAP_UPLOAD = 0x28, GET_NETWORK_STATUS = 0x2B, From cd7894ae8f235df2d601e03b20a725b61b5a2921 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 20:07:07 -0500 Subject: [PATCH 133/233] [ota-esphome] Merge configurations by port (#7001) --- esphome/components/esphome/ota/__init__.py | 65 +++++++++++++++++++--- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/esphome/components/esphome/ota/__init__.py b/esphome/components/esphome/ota/__init__.py index 88e729f230..a852d8d001 100644 --- a/esphome/components/esphome/ota/__init__.py +++ b/esphome/components/esphome/ota/__init__.py @@ -1,7 +1,10 @@ +import logging + import esphome.codegen as cg import esphome.config_validation as cv import esphome.final_validate as fv from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent +from esphome.config_helpers import merge_config from esphome.const import ( CONF_ESPHOME, CONF_ID, @@ -16,6 +19,8 @@ from esphome.const import ( ) from esphome.core import coroutine_with_priority +_LOGGER = logging.getLogger(__name__) + CODEOWNERS = ["@esphome/core"] AUTO_LOAD = ["md5", "socket"] @@ -26,16 +31,62 @@ ESPHomeOTAComponent = esphome.class_("ESPHomeOTAComponent", OTAComponent) def ota_esphome_final_validate(config): - fconf = fv.full_config.get()[CONF_OTA] - used_ports = [] - for ota_conf in fconf: + full_conf = fv.full_config.get() + full_ota_conf = full_conf[CONF_OTA] + new_ota_conf = [] + merged_ota_esphome_configs_by_port = {} + ports_with_merged_configs = [] + for ota_conf in full_ota_conf: if ota_conf.get(CONF_PLATFORM) == CONF_ESPHOME: - if (plat_port := ota_conf.get(CONF_PORT)) not in used_ports: - used_ports.append(plat_port) + if ( + conf_port := ota_conf.get(CONF_PORT) + ) not in merged_ota_esphome_configs_by_port: + merged_ota_esphome_configs_by_port[conf_port] = ota_conf else: - raise cv.Invalid( - f"Only one instance of the {CONF_ESPHOME} {CONF_OTA} {CONF_PLATFORM} is allowed per port. Note that this error may result from OTA specified in packages" + if merged_ota_esphome_configs_by_port[conf_port][ + CONF_VERSION + ] != ota_conf.get(CONF_VERSION): + raise cv.Invalid( + f"Found multiple configurations but {CONF_VERSION} is inconsistent" + ) + if ( + merged_ota_esphome_configs_by_port[conf_port][CONF_ID].is_manual + and ota_conf.get(CONF_ID).is_manual + ): + raise cv.Invalid( + f"Found multiple configurations but {CONF_ID} is inconsistent" + ) + if ( + CONF_PASSWORD in merged_ota_esphome_configs_by_port[conf_port] + and CONF_PASSWORD in ota_conf + and merged_ota_esphome_configs_by_port[conf_port][CONF_PASSWORD] + != ota_conf.get(CONF_PASSWORD) + ): + raise cv.Invalid( + f"Found multiple configurations but {CONF_PASSWORD} is inconsistent" + ) + + ports_with_merged_configs.append(conf_port) + merged_ota_esphome_configs_by_port[conf_port] = merge_config( + merged_ota_esphome_configs_by_port[conf_port], ota_conf ) + else: + new_ota_conf.append(ota_conf) + + for port_conf in merged_ota_esphome_configs_by_port.values(): + new_ota_conf.append(port_conf) + + full_conf[CONF_OTA] = new_ota_conf + fv.full_config.set(full_conf) + + if len(ports_with_merged_configs) > 0: + _LOGGER.warning( + "Found and merged multiple configurations for %s %s %s port(s) %s", + CONF_OTA, + CONF_PLATFORM, + CONF_ESPHOME, + ports_with_merged_configs, + ) CONFIG_SCHEMA = ( From bfdf63055fa1113be5b2ee664e464f7763cab808 Mon Sep 17 00:00:00 2001 From: Simone Rossetto Date: Thu, 27 Jun 2024 03:42:16 +0200 Subject: [PATCH 134/233] Allow wireguard to bind to PPP interface (#6989) Co-authored-by: Tim Lunn --- esphome/components/wireguard/__init__.py | 2 +- platformio.ini | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/esphome/components/wireguard/__init__.py b/esphome/components/wireguard/__init__.py index 5d5f620b51..16d0d0226e 100644 --- a/esphome/components/wireguard/__init__.py +++ b/esphome/components/wireguard/__init__.py @@ -132,7 +132,7 @@ async def to_code(config): # the '+1' modifier is relative to the device's own address that will # be automatically added to the provided list. cg.add_build_flag(f"-DCONFIG_WIREGUARD_MAX_SRC_IPS={len(allowed_ips) + 1}") - cg.add_library("droscy/esp_wireguard", "0.4.1") + cg.add_library("droscy/esp_wireguard", "0.4.2") await cg.register_component(var, config) diff --git a/platformio.ini b/platformio.ini index e2e66bf672..aa73437222 100644 --- a/platformio.ini +++ b/platformio.ini @@ -94,7 +94,7 @@ lib_deps = ESP8266mDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir - droscy/esp_wireguard@0.4.1 ; wireguard + droscy/esp_wireguard@0.4.2 ; wireguard build_flags = ${common:arduino.build_flags} -Wno-nonnull-compare @@ -124,7 +124,7 @@ lib_deps = DNSServer ; captive_portal (Arduino built-in) esphome/ESP32-audioI2S@2.0.7 ; i2s_audio crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir - droscy/esp_wireguard@0.4.1 ; wireguard + droscy/esp_wireguard@0.4.2 ; wireguard build_flags = ${common:arduino.build_flags} -DUSE_ESP32 @@ -142,7 +142,7 @@ platform_packages = framework = espidf lib_deps = ${common:idf.lib_deps} - droscy/esp_wireguard@0.4.1 ; wireguard + droscy/esp_wireguard@0.4.2 ; wireguard build_flags = ${common:idf.build_flags} -Wno-nonnull-compare @@ -174,7 +174,7 @@ extends = common:arduino platform = libretiny framework = arduino lib_deps = - droscy/esp_wireguard@0.4.1 ; wireguard + droscy/esp_wireguard@0.4.2 ; wireguard build_flags = ${common:arduino.build_flags} -DUSE_LIBRETINY From decf50ed492a06aeba7ce1735a0ab324bc4dad73 Mon Sep 17 00:00:00 2001 From: Markus <974709+Links2004@users.noreply.github.com> Date: Thu, 27 Jun 2024 03:48:01 +0200 Subject: [PATCH 135/233] Fix LEDC 100% is not 100% duty with ESP32 IDF (#6997) --- esphome/components/ledc/ledc_output.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/esphome/components/ledc/ledc_output.cpp b/esphome/components/ledc/ledc_output.cpp index 1040ac25b6..90e11fe4ad 100644 --- a/esphome/components/ledc/ledc_output.cpp +++ b/esphome/components/ledc/ledc_output.cpp @@ -115,12 +115,15 @@ void LEDCOutput::write_state(float state) { const uint32_t max_duty = (uint32_t(1) << this->bit_depth_) - 1; const float duty_rounded = roundf(state * max_duty); auto duty = static_cast(duty_rounded); - #ifdef USE_ARDUINO ESP_LOGV(TAG, "Setting duty: %u on channel %u", duty, this->channel_); ledcWrite(this->channel_, duty); #endif #ifdef USE_ESP_IDF + // ensure that 100% on is not 99.975% on + if ((duty == max_duty) && (max_duty != 1)) { + duty = max_duty + 1; + } auto speed_mode = get_speed_mode(channel_); auto chan_num = static_cast(channel_ % 8); int hpoint = ledc_angle_to_htop(this->phase_angle_, this->bit_depth_); From 9a26cdb3364fa40957a05309d16b007f96f29c0f Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Thu, 27 Jun 2024 05:50:25 +0400 Subject: [PATCH 136/233] [modbus_text_sensor] new default ANSI encoding type (#6975) --- esphome/components/modbus_controller/text_sensor/__init__.py | 3 ++- .../modbus_controller/text_sensor/modbus_textsensor.cpp | 5 ++++- .../modbus_controller/text_sensor/modbus_textsensor.h | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/esphome/components/modbus_controller/text_sensor/__init__.py b/esphome/components/modbus_controller/text_sensor/__init__.py index 763336e104..81d6453c6f 100644 --- a/esphome/components/modbus_controller/text_sensor/__init__.py +++ b/esphome/components/modbus_controller/text_sensor/__init__.py @@ -37,6 +37,7 @@ RAW_ENCODING = { "NONE": RawEncoding.NONE, "HEXBYTES": RawEncoding.HEXBYTES, "COMMA": RawEncoding.COMMA, + "ANSI": RawEncoding.ANSI, } CONFIG_SCHEMA = cv.All( @@ -49,7 +50,7 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_REGISTER_TYPE): cv.enum(MODBUS_REGISTER_TYPE), cv.Optional(CONF_REGISTER_COUNT, default=0): cv.positive_int, cv.Optional(CONF_RESPONSE_SIZE, default=2): cv.positive_int, - cv.Optional(CONF_RAW_ENCODE, default="NONE"): cv.enum(RAW_ENCODING), + cv.Optional(CONF_RAW_ENCODE, default="ANSI"): cv.enum(RAW_ENCODING), } ), validate_modbus_register, diff --git a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp index da5c0fba37..acdcacc083 100644 --- a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp +++ b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.cpp @@ -27,8 +27,11 @@ void ModbusTextSensor::parse_and_publish(const std::vector &data) { sprintf(buffer, index != this->offset ? ",%d" : "%d", b); output << buffer; break; + case RawEncoding::ANSI: + if (b < 0x20) + break; + // FALLTHROUGH // Anything else no encoding - case RawEncoding::NONE: default: output << (char) b; break; diff --git a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.h b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.h index 9cc0db05a5..d6eb5fd230 100644 --- a/esphome/components/modbus_controller/text_sensor/modbus_textsensor.h +++ b/esphome/components/modbus_controller/text_sensor/modbus_textsensor.h @@ -9,7 +9,7 @@ namespace esphome { namespace modbus_controller { -enum class RawEncoding { NONE = 0, HEXBYTES = 1, COMMA = 2 }; +enum class RawEncoding { NONE = 0, HEXBYTES = 1, COMMA = 2, ANSI = 3 }; class ModbusTextSensor : public Component, public text_sensor::TextSensor, public SensorItem { public: From e23153d090061c93a314a4de7bfb0c58ff05a006 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 21:34:39 -0500 Subject: [PATCH 137/233] [CI] Remove old test yaml files (#7002) --- tests/test1.1.yaml | 232 --- tests/test1.yaml | 4427 ------------------------------------------- tests/test11.5.yaml | 809 -------- tests/test2.yaml | 879 --------- tests/test3.1.yaml | 734 ------- tests/test3.yaml | 1432 -------------- tests/test4.yaml | 998 ---------- tests/test5.yaml | 747 -------- tests/test6.yaml | 77 - tests/test7.yaml | 27 - tests/test8.1.yaml | 78 - tests/test8.2.yaml | 75 - tests/test8.yaml | 125 -- tests/test9.1.yaml | 29 - tests/test9.yaml | 35 - 15 files changed, 10704 deletions(-) delete mode 100644 tests/test1.1.yaml delete mode 100644 tests/test1.yaml delete mode 100644 tests/test11.5.yaml delete mode 100644 tests/test2.yaml delete mode 100644 tests/test3.1.yaml delete mode 100644 tests/test3.yaml delete mode 100644 tests/test4.yaml delete mode 100644 tests/test5.yaml delete mode 100644 tests/test6.yaml delete mode 100644 tests/test7.yaml delete mode 100644 tests/test8.1.yaml delete mode 100644 tests/test8.2.yaml delete mode 100644 tests/test8.yaml delete mode 100644 tests/test9.1.yaml delete mode 100644 tests/test9.yaml diff --git a/tests/test1.1.yaml b/tests/test1.1.yaml deleted file mode 100644 index c71aa6e0ef..0000000000 --- a/tests/test1.1.yaml +++ /dev/null @@ -1,232 +0,0 @@ ---- -substitutions: - devicename: test1_1 - sensorname: my - textname: template - roomname: fastled_room - -esphome: - name: test1-1 - name_add_mac_suffix: true - platform: ESP32 - board: nodemcu-32s - platformio_options: - board_build.partitions: huge_app.csv - on_loop: - then: - - light.addressable_set: - id: addr1 - range_from: 0 - range_to: 100 - red: 100% - green: !lambda "return 255;" - blue: 0% - white: 100% - -wled: - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - -uart: - - id: adalight_uart - tx_pin: GPIO25 - rx_pin: GPIO26 - baud_rate: 115200 - rx_buffer_size: 1024 - -adalight: - -network: - -e131: - -power_supply: - - id: atx_power_supply - enable_time: 20ms - keep_on_time: 10s - enable_on_boot: true - pin: - number: 13 - inverted: true - -i2c: - sda: 21 - scl: - number: 22 - allow_other_uses: true - scan: true - frequency: 100kHz - setup_priority: -100 - id: i2c_bus - -pca9685: - frequency: 500 - address: 0x0 - i2c_id: i2c_bus - -output: - - platform: pca9685 - id: pca_0 - channel: 0 - - platform: pca9685 - id: pca_1 - channel: 1 - - platform: pca9685 - id: pca_2 - channel: 2 - -light: - - platform: rgb - name: Living Room Lights - id: ${roomname}_lights - red: pca_0 - green: pca_1 - blue: pca_2 - - platform: fastled_clockless - id: addr1 - chipset: WS2811 - pin: - allow_other_uses: true - number: GPIO23 - num_leds: 60 - rgb_order: BRG - max_refresh_rate: 20ms - power_supply: atx_power_supply - color_correct: [75%, 100%, 50%] - name: FastLED WS2811 Light - effects: - - addressable_color_wipe: - - addressable_color_wipe: - name: Color Wipe Effect With Custom Values - colors: - - red: 100% - green: 100% - blue: 100% - num_leds: 1 - - red: 0% - green: 0% - blue: 0% - num_leds: 1 - add_led_interval: 100ms - reverse: false - - addressable_scan: - - addressable_scan: - name: Scan Effect With Custom Values - move_interval: 100ms - - addressable_twinkle: - - addressable_twinkle: - name: Twinkle Effect With Custom Values - twinkle_probability: 5% - progress_interval: 4ms - - addressable_random_twinkle: - - addressable_random_twinkle: - name: Random Twinkle Effect With Custom Values - twinkle_probability: 5% - progress_interval: 32ms - - addressable_fireworks: - - addressable_fireworks: - name: Fireworks Effect With Custom Values - update_interval: 32ms - spark_probability: 10% - use_random_color: false - fade_out_rate: 120 - - addressable_flicker: - - addressable_flicker: - name: Flicker Effect With Custom Values - update_interval: 16ms - intensity: 5% - - addressable_lambda: - name: Test For Custom Lambda Effect - lambda: |- - if (initial_run) { - it[0] = current_color; - } - - - wled: - port: 11111 - - - adalight: - uart_id: adalight_uart - - - e131: - universe: 1 - - - automation: - name: Custom Effect - sequence: - - light.addressable_set: - id: addr1 - red: 100% - green: 100% - blue: 0% - - delay: 100ms - - light.addressable_set: - id: addr1 - red: 0% - green: 100% - blue: 0% - - - platform: fastled_spi - id: addr2 - chipset: WS2801 - data_pin: - allow_other_uses: true - number: GPIO23 - clock_pin: - number: GPIO22 - allow_other_uses: true - data_rate: 2MHz - num_leds: 60 - rgb_order: BRG - name: FastLED SPI Light - - platform: neopixelbus - id: addr3 - name: Neopixelbus Light - gamma_correct: 2.8 - color_correct: [0.0, 0.0, 0.0, 0.0] - default_transition_length: 10s - power_supply: atx_power_supply - effects: - - addressable_flicker: - name: Flicker Effect With Custom Values - update_interval: 16ms - intensity: 5% - type: GRBW - variant: SK6812 - method: ESP32_I2S_0 - num_leds: 60 - pin: - allow_other_uses: true - number: GPIO23 - - platform: partition - name: Partition Light - segments: - - id: addr1 - from: 0 - to: 0 - - id: addr2 - from: 1 - to: 10 - - id: addr2 - from: 20 - to: 25 - - single_light_id: ${roomname}_lights - -canbus: - - platform: esp32_can - id: esp32_internal_can - rx_pin: GPIO04 - tx_pin: GPIO05 - can_id: 4 - bit_rate: 50kbps - -button: - - platform: template - name: Canbus Actions - on_press: - - canbus.send: "abc" - - canbus.send: [0, 1, 2] - - canbus.send: !lambda return {0, 1, 2}; diff --git a/tests/test1.yaml b/tests/test1.yaml deleted file mode 100644 index 79cb1bba2b..0000000000 --- a/tests/test1.yaml +++ /dev/null @@ -1,4427 +0,0 @@ ---- -substitutions: - devicename: test1 - sensorname: my - textname: template - roomname: living_room - -esphome: - name: test1 - name_add_mac_suffix: true - platform: ESP32 - board: nodemcu-32s - platformio_options: - board_build.partitions: huge_app.csv - on_boot: - priority: 150.0 - then: - - lambda: >- - ESP_LOGD("main", "ON BOOT!"); - on_shutdown: - then: - - lambda: >- - ESP_LOGD("main", "ON SHUTDOWN!"); - on_loop: - then: - - lambda: >- - ESP_LOGV("main", "ON LOOP!"); - build_path: build/test1 - -packages: - wifi: !include test_packages/test_packages_package_wifi.yaml - pkg_test: !include test_packages/test_packages_package1.yaml - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - - ssid: "MySSID2" - password: "" - channel: 14 - bssid: "A1:63:95:47:D3:1D" - manual_ip: - static_ip: 192.168.178.230 - gateway: 192.168.178.1 - subnet: 255.255.255.0 - dns1: 1.1.1.1 - dns2: 1.2.2.1 - domain: .local - reboot_timeout: 120s - power_save_mode: light - on_connect: - - light.turn_on: ${roomname}_lights - on_disconnect: - - light.turn_off: ${roomname}_lights - -network: - enable_ipv6: true - -mdns: - disabled: false - -mqtt: - broker: "192.168.178.84" - port: 1883 - username: "debug" - password: "debug" - client_id: someclient - use_abbreviations: false - discovery: true - discovery_retain: false - discovery_prefix: discovery - discovery_unique_id_generator: legacy - topic_prefix: helloworld - log_topic: - topic: helloworld/hi - level: INFO - birth_message: - will_message: - shutdown_message: - topic: topic/to/send/to - payload: hi - qos: 2 - retain: true - keepalive: 60s - reboot_timeout: 60s - on_message: - - topic: my/custom/topic - qos: 0 - then: - - lambda: >- - ESP_LOGD("main", "Got message %s", x.c_str()); - - topic: livingroom/ota_mode - then: - - deep_sleep.prevent - - deep_sleep.allow - - topic: livingroom/ota_mode - then: - - deep_sleep.enter: - on_json_message: - topic: the/topic - then: - - if: - condition: - - wifi.connected: - - mqtt.connected: - - light.is_on: kitchen - - light.is_off: kitchen - - fan.is_on: fan_speed - - fan.is_off: fan_speed - then: - - lambda: |- - int data = x["my_data"]; - ESP_LOGD("main", "The data is: %d", data); - - light.turn_on: - id: ${roomname}_lights - brightness: !lambda |- - float brightness = 1.0; - if (x.containsKey("brightness")) - brightness = x["brightness"]; - return brightness; - effect: !lambda |- - const char *effect = "None"; - if (x.containsKey("effect")) - effect = x["effect"]; - return effect; - - light.control: - id: ${roomname}_lights - # yamllint disable-line rule:line-length - brightness: !lambda "return id(${roomname}_lights).current_values.get_brightness() + 0.5;" - - light.dim_relative: - id: ${roomname}_lights - relative_brightness: 5% - - uart.write: - id: uart_0 - data: Hello World - - uart.write: - id: uart_0 - data: [0x00, 0x20, 0x30] - - uart.write: - id: uart_0 - data: !lambda |- - return {}; - - bluetooth_password.set: - id: my_ld2410 - password: abcdef - on_connect: - - light.turn_on: ${roomname}_lights - - mqtt.publish: - topic: some/topic - payload: Hello - on_disconnect: - - light.turn_off: ${roomname}_lights - -i2c: - sda: - allow_other_uses: true - number: 21 - scl: - allow_other_uses: true - number: 22 - scan: true - frequency: 100kHz - setup_priority: -100 - id: i2c_bus - -spi: - id: spi_bus - clk_pin: - allow_other_uses: true - number: GPIO21 - mosi_pin: - allow_other_uses: true - number: GPIO22 - miso_pin: - allow_other_uses: true - number: GPIO23 - -uart: - - tx_pin: - allow_other_uses: true - number: GPIO22 - inverted: true - rx_pin: - allow_other_uses: true - number: GPIO23 - inverted: true - baud_rate: 115200 - id: uart_0 - parity: NONE - data_bits: 8 - stop_bits: 1 - rx_buffer_size: 512 - debug: - dummy_receiver: true - direction: both - after: - bytes: 50 - timeout: 500ms - delimiter: "\r\n" - sequence: - - lambda: UARTDebug::log_hex(direction, bytes, ':'); - - lambda: UARTDebug::log_string(direction, bytes); - - lambda: UARTDebug::log_int(direction, bytes, ','); - - lambda: UARTDebug::log_binary(direction, bytes, ';'); - - id: ld2410_uart - tx_pin: - allow_other_uses: true - number: 18 - rx_pin: - allow_other_uses: true - number: 23 - baud_rate: 256000 - parity: NONE - stop_bits: 1 - - id: dfrobot_mmwave_uart - tx_pin: - allow_other_uses: true - number: 14 - rx_pin: - allow_other_uses: true - number: 27 - baud_rate: 115200 - - id: ld2420_uart - tx_pin: - allow_other_uses: true - number: 17 - rx_pin: - allow_other_uses: true - number: 16 - baud_rate: 115200 - parity: NONE - stop_bits: 1 - - id: gcja5_uart - rx_pin: GPIO10 - parity: EVEN - baud_rate: 9600 - -safe_mode: - num_attempts: 3 - reboot_timeout: 2min - -ota: - - platform: esphome - password: "superlongpasswordthatnoonewillknow" - port: 3286 - on_state_change: - then: - lambda: >- - ESP_LOGD("ota", "State %d", state); - on_begin: - then: - logger.log: OTA begin - on_progress: - then: - lambda: >- - ESP_LOGD("ota", "Got progress %f", x); - on_end: - then: - logger.log: OTA end - on_error: - then: - lambda: >- - ESP_LOGD("ota", "Got error code %d", x); - -logger: - baud_rate: 0 - level: VERBOSE - logs: - mqtt.component: DEBUG - mqtt.client: ERROR - -web_server: - port: 8080 - version: 2 - -power_supply: - id: atx_power_supply - enable_time: 20ms - keep_on_time: 10s - pin: - number: 13 - allow_other_uses: true - inverted: true - -deep_sleep: - run_duration: 20s - sleep_duration: 50s - wakeup_pin: - allow_other_uses: true - number: GPIO2 - ignore_strapping_warning: true - wakeup_pin_mode: INVERT_WAKEUP - -ads1115: - address: 0x48 - i2c_id: i2c_bus - -ads1118: - spi_id: spi_bus - cs_pin: - allow_other_uses: true - number: GPIO12 - -as5600: - i2c_id: i2c_bus - dir_pin: - number: 27 - allow_other_uses: true - direction: clockwise - start_position: 90deg - range: 180deg - watchdog: true - power_mode: low1 - hysteresis: lsb1 - slow_filter: 8x - fast_filter: lsb6 - -as3935_spi: - cs_pin: - ignore_strapping_warning: true - allow_other_uses: true - number: GPIO12 - irq_pin: - allow_other_uses: true - number: GPIO13 - -esp32_ble: - io_capability: keyboard_only - -esp32_ble_tracker: - -ble_client: - - mac_address: AA:BB:CC:DD:EE:FF - id: ble_foo - auto_connect: true - - mac_address: 11:22:33:44:55:66 - id: ble_blah - auto_connect: false - on_connect: - then: - - switch.turn_on: ble1_status - on_disconnect: - then: - - switch.turn_on: ble1_status - on_passkey_request: - then: - - ble_client.passkey_reply: - id: ble_blah - passkey: 123456 - on_passkey_notification: - then: - - logger.log: "Passkey notification received" - on_numeric_comparison_request: - then: - - ble_client.numeric_comparison_reply: - id: ble_blah - accept: true - - mac_address: C4:4F:33:11:22:33 - id: my_bedjet_ble_client - -bedjet: - - ble_client_id: my_bedjet_ble_client - id: my_bedjet_client - time_id: sntp_time -mcp23s08: - - id: mcp23s08_hub - cs_pin: - ignore_strapping_warning: true - number: GPIO12 - allow_other_uses: true - deviceaddress: 0 - -mcp23s17: - - id: mcp23s17_hub - cs_pin: - ignore_strapping_warning: true - number: GPIO12 - allow_other_uses: true - deviceaddress: 1 - -micronova: - enable_rx_pin: - allow_other_uses: true - number: 4 - uart_id: uart_0 - -dfrobot_sen0395: - - id: mmwave - uart_id: dfrobot_mmwave_uart - -sensor: - - platform: xgzp68xx - i2c_id: i2c_bus - temperature: - name: Pressure Temperature - pressure: - name: Differential pressure - k_value: 4096 - - - platform: pmwcs3 - i2c_id: i2c_bus - e25: - name: pmwcs3_e25 - ec: - name: pmwcs3_ec - temperature: - name: pmwcs3_temperature - vwc: - name: pmwcs3_vwc - - platform: gcja5 - pm_1_0: - name: "Particulate Matter <1.0µm Concentration" - pm_2_5: - name: "Particulate Matter <2.5µm Concentration" - pm_10_0: - name: "Particulate Matter <10.0µm Concentration" - pmc_0_5: - name: "PMC 0.5" - pmc_1_0: - name: "PMC 1.0" - pmc_2_5: - name: "PMC 2.5" - pmc_5_0: - name: "PMC 5.0" - pmc_10_0: - name: "PMC 10.0" - uart_id: gcja5_uart - - platform: internal_temperature - name: Internal Temperature - - platform: ble_client - type: characteristic - ble_client_id: ble_foo - name: Green iTag btn - service_uuid: ffe0 - characteristic_uuid: ffe1 - descriptor_uuid: ffe2 - notify: true - update_interval: never - lambda: |- - ESP_LOGD("main", "Length of data is %i", x.size()); - return x[0]; - on_notify: - then: - - lambda: |- - ESP_LOGD("green_btn", "Button was pressed, val%f", x); - - platform: ble_client - type: rssi - ble_client_id: ble_foo - name: Green iTag RSSI - update_interval: 15s - - platform: adc - pin: A0 - name: Living Room Brightness - update_interval: "1:01" - attenuation: 2.5db - unit_of_measurement: "°C" - icon: "mdi:water-percent" - accuracy_decimals: 5 - expire_after: 120s - setup_priority: -100 - force_update: true - filters: - - offset: 2.0 - - multiply: 1.2 - - calibrate_linear: - datapoints: - - 0.0 -> 0.0 - - 40.0 -> 45.0 - - 100.0 -> 102.5 - - clamp: - min_value: -100 - max_value: 100 - - filter_out: 42.0 - - filter_out: nan - - median: - window_size: 5 - send_every: 5 - send_first_at: 3 - - min: - window_size: 5 - send_every: 5 - send_first_at: 3 - - max: - window_size: 5 - send_every: 5 - send_first_at: 3 - - sliding_window_moving_average: - window_size: 15 - send_every: 15 - send_first_at: 15 - - exponential_moving_average: - alpha: 0.1 - send_every: 15 - send_first_at: 15 - - throttle_average: 60s - - throttle: 1s - - heartbeat: 5s - - debounce: 0.1s - - delta: 5.0 - - delta: 1% - - or: - - throttle: 1s - - delta: 5.0 - - lambda: return x * (9.0/5.0) + 32.0; - on_value: - then: - # yamllint disable rule:line-length - - lambda: |- - ESP_LOGD("main", "Got value %f", x); - id(${sensorname}_sensor).publish_state(42.0); - ESP_LOGI("main", "Value of my sensor: %f", id(${sensorname}_sensor).state); - ESP_LOGI("main", "Raw Value of my sensor: %f", id(${sensorname}_sensor).state); - # yamllint enable rule:line-length - on_value_range: - above: 5 - below: 10 - then: - - lambda: >- - ESP_LOGD("main", "Got value range %f", x); - - wait_until: wifi.connected - - wait_until: - condition: - binary_sensor.is_on: binary_sensor1 - timeout: 1s - on_raw_value: - - lambda: >- - ESP_LOGD("main", "Got raw value %f", x); - - logger.log: - level: DEBUG - format: Got raw value %f - args: ["x"] - - logger.log: Got raw value NAN - - mqtt.publish: - topic: some/topic - payload: Hello - qos: 2 - retain: true - - platform: esp32_hall - name: ESP32 Hall Sensor - - platform: ads1115 - multiplexer: A0_A1 - gain: 1.024 - id: ${sensorname}_sensor - filters: - state_topic: hi/me - retain: false - availability: - - platform: ads1118 - name: ads1118 adc - multiplexer: A0_A1 - gain: 1.024 - type: adc - - platform: ads1118 - name: ads1118 temperature - type: temperature - - platform: as5600 - name: AS5600 Position - raw_position: - name: AS5600 Raw Position - gain: - name: AS5600 Gain - magnitude: - name: AS5600 Magnitude - status: - name: AS5600 Status - - platform: as7341 - update_interval: 15s - gain: X8 - atime: 120 - astep: 99 - f1: - name: F1 - f2: - name: F2 - f3: - name: F3 - f4: - name: F4 - f5: - name: F5 - f6: - name: F6 - f7: - name: F7 - f8: - name: F8 - clear: - name: Clear - nir: - name: NIR - i2c_id: i2c_bus - - platform: atm90e26 - cs_pin: - allow_other_uses: true - number: 5 - voltage: - name: Line Voltage - current: - name: CT Amps - power: - name: Active Watts - power_factor: - name: Power Factor - frequency: - name: Line Frequency - line_frequency: 50Hz - meter_constant: 1000 - pl_const: 1429876 - gain_pga: 1X - gain_metering: 7481 - gain_voltage: 26400 - gain_ct: 31251 - - platform: atm90e32 - cs_pin: - allow_other_uses: true - number: 5 - phase_a: - voltage: - name: EMON Line Voltage A - current: - name: EMON CT1 Current - power: - name: EMON Active Power CT1 - reactive_power: - name: EMON Reactive Power CT1 - power_factor: - name: EMON Power Factor CT1 - gain_voltage: 7305 - gain_ct: 27961 - phase_b: - current: - name: EMON CT2 Current - power: - name: EMON Active Power CT2 - reactive_power: - name: EMON Reactive Power CT2 - power_factor: - name: EMON Power Factor CT2 - gain_voltage: 7305 - gain_ct: 27961 - phase_c: - current: - name: EMON CT3 Current - power: - name: EMON Active Power CT3 - reactive_power: - name: EMON Reactive Power CT3 - power_factor: - name: EMON Power Factor CT3 - gain_voltage: 7305 - gain_ct: 27961 - frequency: - name: EMON Line Frequency - chip_temperature: - name: EMON Chip Temp A - line_frequency: 60Hz - current_phases: 3 - gain_pga: 2X - - platform: bh1750 - name: Living Room Brightness 3 - internal: true - address: 0x23 - update_interval: 30s - qos: 2 - retain: false - availability: - state_topic: livingroom/custom_state_topic - i2c_id: i2c_bus - - platform: max44009 - name: Outside Brightness 1 - internal: true - address: 0x4A - update_interval: 30s - mode: low_power - i2c_id: i2c_bus - - platform: bme680 - temperature: - name: Outside Temperature - oversampling: 16x - pressure: - name: Outside Pressure - humidity: - name: Outside Humidity - gas_resistance: - name: Outside Gas Sensor - address: 0x77 - heater: - temperature: 320 - duration: 150ms - update_interval: 15s - i2c_id: i2c_bus - - platform: bmp085 - temperature: - name: Outside Temperature - pressure: - name: Outside Pressure - filters: - - lambda: >- - return x / powf(1.0 - (x / 44330.0), 5.255); - update_interval: 15s - i2c_id: i2c_bus - - platform: bmp280 - temperature: - name: Outside Temperature - oversampling: 16x - pressure: - name: Outside Pressure - address: 0x77 - update_interval: 15s - iir_filter: 16x - i2c_id: i2c_bus - - platform: dht - pin: - allow_other_uses: true - number: GPIO26 - temperature: - id: dht_temperature - name: Living Room Temperature 3 - humidity: - id: dht_humidity - name: Living Room Humidity 3 - model: AM2302 - update_interval: 15s - - platform: dht12 - temperature: - name: Living Room Temperature 4 - humidity: - name: Living Room Humidity 4 - update_interval: 15s - i2c_id: i2c_bus - - platform: duty_cycle - pin: - allow_other_uses: true - number: GPIO25 - name: Duty Cycle Sensor - - platform: ee895 - co2: - name: Office CO2 1 - temperature: - name: Office Temperature 1 - pressure: - name: Office Pressure 1 - address: 0x5F - i2c_id: i2c_bus - - platform: esp32_hall - name: ESP32 Hall Sensor - update_interval: 15s - - platform: ens210 - temperature: - name: Living Room Temperature 5 - humidity: - name: Living Room Humidity 5 - update_interval: 15s - i2c_id: i2c_bus - - platform: hdc1080 - temperature: - name: Living Room Temperature 6 - humidity: - name: Living Room Humidity 5 - update_interval: 15s - i2c_id: i2c_bus - - platform: hlw8012 - sel_pin: - allow_other_uses: true - number: 5 - cf_pin: - allow_other_uses: true - number: 14 - cf1_pin: - allow_other_uses: true - number: 13 - current: - name: HLW8012 Current - voltage: - name: HLW8012 Voltage - power: - name: HLW8012 Power - id: hlw8012_power - energy: - name: HLW8012 Energy - id: hlw8012_energy - update_interval: 15s - current_resistor: 0.001 ohm - voltage_divider: 2351 - change_mode_every: "never" - initial_mode: VOLTAGE - model: hlw8012 - - platform: total_daily_energy - power_id: hlw8012_power - name: HLW8012 Total Daily Energy - - platform: integration - sensor: hlw8012_power - name: Integration Sensor - time_unit: s - - platform: integration - sensor: hlw8012_power - name: Integration Sensor lazy - time_unit: s - - platform: hmc5883l - address: 0x68 - field_strength_x: - name: HMC5883L Field Strength X - field_strength_y: - name: HMC5883L Field Strength Y - field_strength_z: - name: HMC5883L Field Strength Z - heading: - name: HMC5883L Heading - range: 130uT - oversampling: 8x - update_interval: 15s - i2c_id: i2c_bus - - platform: honeywell_hih_i2c - temperature: - name: Living Room Temperature 7 - humidity: - name: Living Room Humidity 7 - update_interval: 15s - i2c_id: i2c_bus - - platform: honeywellabp - pressure: - name: Honeywell pressure - min_pressure: 0 - max_pressure: 15 - temperature: - name: Honeywell temperature - cs_pin: - allow_other_uses: true - number: GPIO5 - - platform: honeywellabp2_i2c - pressure: - name: Honeywell2 pressure - min_pressure: 0 - max_pressure: 16000 - transfer_function: A - temperature: - name: Honeywell temperature - i2c_id: i2c_bus - address: 0x28 - - platform: hte501 - temperature: - name: Office Temperature 2 - humidity: - name: Office Humidity 1 - address: 0x40 - i2c_id: i2c_bus - - platform: qmc5883l - address: 0x0D - field_strength_x: - name: QMC5883L Field Strength X - field_strength_y: - name: QMC5883L Field Strength Y - field_strength_z: - name: QMC5883L Field Strength Z - heading: - name: QMC5883L Heading - range: 800uT - oversampling: 256x - update_interval: 15s - i2c_id: i2c_bus - - platform: hx711 - name: HX711 Value - dout_pin: - allow_other_uses: true - number: GPIO23 - clk_pin: - allow_other_uses: true - number: GPIO25 - gain: 128 - update_interval: 15s - - platform: ina219 - address: 0x40 - shunt_resistance: 0.1 ohm - current: - name: INA219 Current - power: - name: INA219 Power - bus_voltage: - name: INA219 Bus Voltage - shunt_voltage: - name: INA219 Shunt Voltage - max_voltage: 32.0V - max_current: 3.2A - update_interval: 15s - i2c_id: i2c_bus - - platform: ina226 - address: 0x40 - shunt_resistance: 0.1 ohm - current: - name: INA226 Current - power: - name: INA226 Power - bus_voltage: - name: INA226 Bus Voltage - shunt_voltage: - name: INA226 Shunt Voltage - max_current: 3.2A - update_interval: 15s - i2c_id: i2c_bus - - platform: ina3221 - address: 0x40 - channel_1: - shunt_resistance: 0.1 ohm - current: - name: INA3221 Channel 1 Current - power: - name: INA3221 Channel 1 Power - bus_voltage: - name: INA3221 Channel 1 Bus Voltage - shunt_voltage: - name: INA3221 Channel 1 Shunt Voltage - update_interval: 15s - i2c_id: i2c_bus - - platform: kmeteriso - temperature: - name: Outside Temperature - internal_temperature: - name: Internal Ttemperature - update_interval: 15s - i2c_id: i2c_bus - - platform: combination - type: kalman - name: Kalman-filtered temperature - process_std_dev: 0.00139 - sources: - - source: scd30_temperature - error: !lambda |- - return 0.4 + std::abs(x - 25) * 0.023; - - source: scd4x_temperature - error: 1.5 - - platform: combination - type: linear - name: Linearly combined temperatures - sources: - - source: scd30_temperature - coeffecient: !lambda |- - return 0.4 + std::abs(x - 25) * 0.023; - - source: scd4x_temperature - coeffecient: 1.5 - - platform: combination - type: max - name: Max of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: mean - name: Mean of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: median - name: Median of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: min - name: Min of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: most_recently_updated - name: Most recently updated of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: range - name: Range of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: combination - type: sum - name: Sum of combined temperatures - sources: - - source: scd30_temperature - - source: scd4x_temperature - - platform: htu21d - temperature: - name: Living Room Temperature 6 - humidity: - name: Living Room Humidity 6 - heater: - name: Living Room Heater 6 - update_interval: 15s - i2c_id: i2c_bus - - platform: max6675 - name: Living Room Temperature - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 15s - - platform: max31855 - name: Den Temperature - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 15s - reference_temperature: - name: MAX31855 Internal Temperature - - platform: max31856 - name: BBQ Temperature - cs_pin: - allow_other_uses: true - number: GPIO17 - update_interval: 15s - mains_filter: 50Hz - - platform: max31865 - name: Water Tank Temperature - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 15s - reference_resistance: 430 Ω - rtd_nominal_resistance: 100 Ω - - platform: mhz19 - uart_id: uart_0 - co2: - name: MH-Z19 CO2 Value - temperature: - name: MH-Z19 Temperature - update_interval: 15s - automatic_baseline_calibration: false - - platform: mpu6050 - address: 0x68 - accel_x: - name: MPU6050 Accel X - accel_y: - name: MPU6050 Accel Y - accel_z: - name: MPU6050 Accel z - gyro_x: - name: MPU6050 Gyro X - gyro_y: - name: MPU6050 Gyro Y - gyro_z: - name: MPU6050 Gyro z - temperature: - name: MPU6050 Temperature - i2c_id: i2c_bus - - platform: mpu6886 - address: 0x68 - accel_x: - name: MPU6886 Accel X - accel_y: - name: MPU6886 Accel Y - accel_z: - name: MPU6886 Accel z - gyro_x: - name: MPU6886 Gyro X - gyro_y: - name: MPU6886 Gyro Y - gyro_z: - name: MPU6886 Gyro z - temperature: - name: MPU6886 Temperature - i2c_id: i2c_bus - - platform: bmi160 - address: 0x68 - acceleration_x: - name: BMI160 Accel X - acceleration_y: - name: BMI160 Accel Y - acceleration_z: - name: BMI160 Accel z - gyroscope_x: - name: BMI160 Gyro X - gyroscope_y: - name: BMI160 Gyro Y - gyroscope_z: - name: BMI160 Gyro z - temperature: - name: BMI160 Temperature - i2c_id: i2c_bus - - platform: mmc5603 - address: 0x30 - field_strength_x: - name: HMC5883L Field Strength X - field_strength_y: - name: HMC5883L Field Strength Y - field_strength_z: - name: HMC5883L Field Strength Z - i2c_id: i2c_bus - - platform: dps310 - temperature: - name: DPS310 Temperature - pressure: - name: DPS310 Pressure - address: 0x77 - update_interval: 15s - i2c_id: i2c_bus - - platform: ms5611 - temperature: - name: Outside Temperature - pressure: - name: Outside Pressure - address: 0x77 - update_interval: 15s - i2c_id: i2c_bus - - platform: pmsa003i - pm_1_0: - name: PMSA003i PM1.0 - pm_2_5: - name: PMSA003i PM2.5 - pm_10_0: - name: PMSA003i PM10.0 - pmc_0_3: - name: PMSA003i PMC <0.3µm - pmc_0_5: - name: PMSA003i PMC <0.5µm - pmc_1_0: - name: PMSA003i PMC <1µm - pmc_2_5: - name: PMSA003i PMC <2.5µm - pmc_5_0: - name: PMSA003i PMC <5µm - pmc_10_0: - name: PMSA003i PMC <10µm - address: 0x12 - standard_units: true - i2c_id: i2c_bus - - platform: pulse_counter - name: Pulse Counter - pin: - ignore_strapping_warning: true - number: GPIO12 - allow_other_uses: true - count_mode: - rising_edge: INCREMENT - falling_edge: DECREMENT - internal_filter: 13us - update_interval: 15s - - platform: pulse_meter - name: Pulse Meter - id: pulse_meter_sensor - pin: - ignore_strapping_warning: true - number: GPIO12 - allow_other_uses: true - internal_filter: 100ms - timeout: 2 min - on_value: - - pulse_meter.set_total_pulses: - id: pulse_meter_sensor - value: 12345 - total: - name: Pulse Meter Total - - platform: qmp6988 - temperature: - name: Living Temperature QMP - oversampling: 32x - pressure: - name: Living Pressure QMP - oversampling: 2x - address: 0x70 - update_interval: 30s - iir_filter: 16x - i2c_id: i2c_bus - - platform: rotary_encoder - name: Rotary Encoder - id: rotary_encoder1 - pin_a: - allow_other_uses: true - number: GPIO23 - pin_b: - allow_other_uses: true - number: GPIO25 - pin_reset: - allow_other_uses: true - number: GPIO25 - filters: - - or: - - debounce: 0.1s - - delta: 10 - resolution: 4 - min_value: -10 - max_value: 30 - on_value: - - sensor.rotary_encoder.set_value: - id: rotary_encoder1 - value: 10 - - sensor.rotary_encoder.set_value: - id: rotary_encoder1 - value: !lambda "return -1;" - on_clockwise: - - logger.log: Clockwise - - display_menu.down: test_lcd_menu - - display_menu.down: test_graphical_display_menu - on_anticlockwise: - - logger.log: Anticlockwise - - display_menu.up: test_lcd_menu - - display_menu.up: test_graphical_display_menu - - platform: pulse_width - name: Pulse Width - pin: - allow_other_uses: true - number: GPIO12 - - platform: sm300d2 - uart_id: uart_0 - co2: - name: SM300D2 CO2 Value - formaldehyde: - name: SM300D2 Formaldehyde Value - tvoc: - name: SM300D2 TVOC Value - pm_2_5: - name: SM300D2 PM2.5 Value - pm_10_0: - name: SM300D2 PM10 Value - temperature: - name: SM300D2 Temperature Value - humidity: - name: SM300D2 Humidity Value - update_interval: 60s - - platform: sht3xd - temperature: - name: Living Room Temperature 8 - humidity: - name: Living Room Humidity 8 - address: 0x44 - i2c_id: i2c_bus - update_interval: 15s - - platform: sts3x - name: Living Room Temperature 9 - address: 0x4A - i2c_id: i2c_bus - - platform: scd30 - co2: - name: Living Room CO2 9 - temperature: - id: scd30_temperature - name: Living Room Temperature 9 - humidity: - name: Living Room Humidity 9 - address: 0x61 - update_interval: 15s - automatic_self_calibration: true - altitude_compensation: 10m - ambient_pressure_compensation: 961mBar - temperature_offset: 4.2C - i2c_id: i2c_bus - - platform: scd4x - id: scd40 - co2: - name: SCD4X CO2 - temperature: - id: scd4x_temperature - name: SCD4X Temperature - humidity: - name: SCD4X Humidity - update_interval: 15s - automatic_self_calibration: true - altitude_compensation: 10m - ambient_pressure_compensation: 961mBar - temperature_offset: 4.2C - i2c_id: i2c_bus - - platform: sfa30 - formaldehyde: - name: "SFA30 formaldehyde" - temperature: - name: "SFA30 temperature" - humidity: - name: "SFA30 humidity" - i2c_id: i2c_bus - address: 0x5D - update_interval: 30s - - platform: sen0321 - name: Workshop Ozone Sensor - id: sen0321_ozone - update_interval: 10s - i2c_id: i2c_bus - - platform: sgp30 - eco2: - name: Workshop eCO2 - accuracy_decimals: 1 - tvoc: - name: Workshop TVOC - accuracy_decimals: 1 - address: 0x58 - update_interval: 5s - i2c_id: i2c_bus - - platform: sps30 - pm_1_0: - name: Workshop PM <1µm Weight concentration - id: workshop_PM_1_0 - pm_2_5: - name: Workshop PM <2.5µm Weight concentration - id: workshop_PM_2_5 - pm_4_0: - name: Workshop PM <4µm Weight concentration - id: workshop_PM_4_0 - pm_10_0: - name: Workshop PM <10µm Weight concentration - id: workshop_PM_10_0 - pmc_0_5: - name: Workshop PM <0.5µm Number concentration - id: workshop_PMC_0_5 - pmc_1_0: - name: Workshop PM <1µm Number concentration - id: workshop_PMC_1_0 - pmc_2_5: - name: Workshop PM <2.5µm Number concentration - id: workshop_PMC_2_5 - pmc_4_0: - name: Workshop PM <4µm Number concentration - id: workshop_PMC_4_0 - pmc_10_0: - name: Workshop PM <10µm Number concentration - id: workshop_PMC_10_0 - address: 0x69 - update_interval: 10s - i2c_id: i2c_bus - - platform: sht4x - temperature: - name: SHT4X Temperature - humidity: - name: SHT4X Humidity - address: 0x44 - update_interval: 15s - i2c_id: i2c_bus - - platform: shtcx - temperature: - name: Living Room Temperature 10 - humidity: - name: Living Room Humidity 10 - address: 0x70 - update_interval: 15s - i2c_id: i2c_bus - - platform: template - name: Template Sensor - state_class: measurement - id: template_sensor - lambda: |- - if (id(ultrasonic_sensor1).state > 1) { - return 42.0; - } else { - return {}; - } - update_interval: 15s - on_value: - - sensor.template.publish: - id: template_sensor - state: 43.0 - - sensor.template.publish: - id: template_sensor - state: !lambda "return NAN;" - - platform: tsl2561 - name: TSL2561 Ambient Light - address: 0x39 - update_interval: 15s - is_cs_package: true - integration_time: 402ms - gain: 16x - i2c_id: i2c_bus - - platform: tsl2591 - id: this_little_light_of_mine - address: 0x29 - update_interval: 15s - integration_time: 600ms - gain: high - visible: - name: tsl2591 visible - id: tsl2591_vis - unit_of_measurement: pH - infrared: - name: tsl2591 infrared - id: tsl2591_ir - full_spectrum: - name: tsl2591 full_spectrum - id: tsl2591_fs - calculated_lux: - name: tsl2591 calculated_lux - id: tsl2591_cl - i2c_id: i2c_bus - - platform: veml3235 - id: veml3235_sensor - name: VEML3235 Light Sensor - i2c_id: i2c_bus - auto_gain: true - auto_gain_threshold_high: 90% - auto_gain_threshold_low: 15% - digital_gain: 1X - gain: 1X - integration_time: 50ms - - platform: tee501 - name: Office Temperature 3 - address: 0x48 - i2c_id: i2c_bus - - platform: ultrasonic - trigger_pin: - allow_other_uses: true - number: GPIO25 - echo_pin: - number: GPIO23 - allow_other_uses: true - inverted: true - name: Ultrasonic Sensor - timeout: 5.5m - id: ultrasonic_sensor1 - - platform: uptime - name: Uptime Sensor - - id: !extend ${devicename}_uptime_pcg - unit_of_measurement: s - - platform: wifi_signal - name: WiFi Signal Sensor - update_interval: 15s - - platform: mqtt_subscribe - name: MQTT Subscribe Sensor 1 - topic: mqtt/topic - id: the_sensor - qos: 2 - on_value: - - mqtt.publish_json: - topic: the/topic - payload: |- - root["key"] = id(the_sensor).state; - root["greeting"] = "Hello World"; - - platform: sds011 - uart_id: uart_0 - pm_2_5: - name: SDS011 PM2.5 - pm_10_0: - name: SDS011 PM10.0 - update_interval: 5min - rx_only: false - - platform: ccs811 - eco2: - name: CCS811 eCO2 - tvoc: - name: CCS811 TVOC - update_interval: 30s - baseline: 0x4242 - i2c_id: i2c_bus - - platform: tx20 - wind_speed: - name: Windspeed - wind_direction_degrees: - name: Winddirection Degrees - pin: - number: GPIO04 - mode: INPUT - allow_other_uses: true - - platform: zyaura - clock_pin: - allow_other_uses: true - number: GPIO5 - data_pin: - allow_other_uses: true - number: GPIO4 - co2: - name: ZyAura CO2 - temperature: - name: ZyAura Temperature - humidity: - name: ZyAura Humidity - - platform: as3935 - lightning_energy: - name: Lightning Energy - distance: - name: Distance Storm - - platform: tmp117 - name: TMP117 Temperature - update_interval: 5s - i2c_id: i2c_bus - - platform: hm3301 - pm_1_0: - name: PM1.0 - pm_2_5: - name: PM2.5 - pm_10_0: - name: PM10.0 - aqi: - name: AQI - calculation_type: CAQI - i2c_id: i2c_bus - - platform: teleinfo - tag_name: HCHC - name: hchc - unit_of_measurement: Wh - icon: mdi:flash - teleinfo_id: myteleinfo - - platform: mcp9808 - name: MCP9808 Temperature - update_interval: 15s - i2c_id: i2c_bus - - platform: ezo - id: ph_ezo - address: 99 - unit_of_measurement: pH - i2c_id: i2c_bus - - platform: sdp3x - name: HVAC Filter Pressure drop - id: filter_pressure - update_interval: 5s - accuracy_decimals: 3 - i2c_id: i2c_bus - - platform: cs5460a - id: cs5460a1 - current: - name: Socket current - voltage: - name: Mains voltage - power: - name: Socket power - on_value: - then: - cs5460a.restart: cs5460a1 - samples: 1600 - pga_gain: 10X - current_gain: 0.01 - voltage_gain: 0.000573 - current_hpf: true - voltage_hpf: true - phase_offset: 20 - pulse_energy: 0.01 kWh - cs_pin: - mcp23xxx: mcp23017_hub - number: 14 - - platform: max9611 - i2c_id: i2c_bus - shunt_resistance: 0.2 ohm - gain: 1X - voltage: - name: Max9611 Voltage - current: - name: Max9611 Current - power: - name: Max9611 Watts - temperature: - name: Max9611 Temp - update_interval: 1s - - platform: mlx90614 - i2c_id: i2c_bus - ambient: - name: Ambient - object: - name: Object - emissivity: 1.0 - - platform: mpl3115a2 - i2c_id: i2c_bus - temperature: - name: "MPL3115A2 Temperature" - pressure: - name: "MPL3115A2 Pressure" - update_interval: 10s - - platform: alpha3 - ble_client_id: ble_foo - flow: - name: "Radiator Pump Flow" - head: - name: "Radiator Pump Head" - power: - name: "Radiator Pump Power" - speed: - name: "Radiator Pump Speed" - - platform: ld2410 - light: - name: light - moving_distance: - name: "Moving distance (cm)" - still_distance: - name: "Still Distance (cm)" - moving_energy: - name: "Move Energy (%)" - still_energy: - name: "Still Energy (%)" - detection_distance: - name: "Distance Detection (cm)" - g0: - move_energy: - name: g0 move energy - still_energy: - name: g0 still energy - g1: - move_energy: - name: g1 move energy - still_energy: - name: g1 still energy - g2: - move_energy: - name: g2 move energy - still_energy: - name: g2 still energy - g3: - move_energy: - name: g3 move energy - still_energy: - name: g3 still energy - g4: - move_energy: - name: g4 move energy - still_energy: - name: g4 still energy - g5: - move_energy: - name: g5 move energy - still_energy: - name: g5 still energy - g6: - move_energy: - name: g6 move energy - still_energy: - name: g6 still energy - g7: - move_energy: - name: g7 move energy - still_energy: - name: g7 still energy - g8: - move_energy: - name: g8 move energy - still_energy: - name: g8 still energy - - - platform: ld2420 - moving_distance: - name: "Moving distance (cm)" - - platform: sen21231 - name: "Person Sensor" - i2c_id: i2c_bus - - platform: fs3000 - name: "Air Velocity" - model: 1005 - update_interval: 60s - i2c_id: i2c_bus - - platform: absolute_humidity - name: DHT Absolute Humidity - temperature: dht_temperature - humidity: dht_humidity - - platform: hyt271 - i2c_id: i2c_bus - temperature: - name: "Temperature hyt271" - id: temp_etuve - humidity: - name: "Humidity hyt271" - - platform: iaqcore - i2c_id: i2c_bus - co2: - name: "iAQ Core CO2 Sensor" - tvoc: - name: "iAQ Core TVOC Sensor" - - platform: tmp1075 - name: "Temperature TMP1075" - update_interval: 10s - i2c_id: i2c_bus - conversion_rate: 27.5ms - alert: - limit_low: 50 - limit_high: 75 - fault_count: 1 - polarity: active_high - function: comparator - - platform: zio_ultrasonic - name: "Distance" - update_interval: 60s - i2c_id: i2c_bus - - platform: bmp581 - i2c_id: i2c_bus - temperature: - name: "BMP581 Temperature" - iir_filter: 2x - pressure: - name: "BMP581 Pressure" - oversampling: 128x - - platform: debug - free: - name: "Heap Free" - block: - name: "Heap Max Block" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" - - platform: mmc5983 - i2c_id: i2c_bus - field_strength_x: - name: "Magnet X" - id: magnet_x - field_strength_y: - name: "Magnet Y" - id: magnet_y - field_strength_z: - name: "Magnet Z" - id: magnet_z - - platform: micronova - room_temperature: - name: Room Temperature - fumes_temperature: - name: Fumes Temperature - water_temperature: - name: Water temperature - water_pressure: - name: Water pressure - stove_power: - name: Stove Power - fan_speed: - fan_rpm_offset: 240 - name: Fan RPM - memory_address_sensor: - memory_location: 0x20 - memory_address: 0x7d - name: Adres sensor - - platform: ade7880 - i2c_id: i2c_bus - irq0_pin: - number: GPIO13 - allow_other_uses: true - irq1_pin: - number: GPIO5 - allow_other_uses: true - reset_pin: - number: GPIO16 - allow_other_uses: true - frequency: 60Hz - phase_a: - name: Channel A - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3116628 - voltage_gain: -757178 - power_gain: -1344457 - phase_angle: 188 - phase_b: - name: Channel B - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3133655 - voltage_gain: -755235 - power_gain: -1345638 - phase_angle: 188 - phase_c: - name: Channel C - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3111158 - voltage_gain: -743813 - power_gain: -1351437 - phase_angle: 180 - neutral: - name: Neutral - current: Current - calibration: - current_gain: 3189 - -psram: - -esp32_touch: - setup_mode: false - iir_filter: 10ms - sleep_duration: 27ms - measurement_duration: 8ms - low_voltage_reference: 0.5V - high_voltage_reference: 2.7V - voltage_attenuation: 1.5V - -binary_sensor: - - platform: gpio - name: "MCP23S08 Pin #1" - pin: - mcp23xxx: mcp23s08_hub - # Use pin number 1 - number: 1 - # One of INPUT or INPUT_PULLUP - mode: INPUT_PULLUP - inverted: false - - platform: gpio - name: "MCP23S17 Pin #1" - pin: - mcp23xxx: mcp23s17_hub - # Use pin number 1 - number: 1 - allow_other_uses: true - # One of INPUT or INPUT_PULLUP - mode: INPUT_PULLUP - inverted: false - - platform: gpio - name: "MCP23S17 Pin #1 with interrupt" - pin: - mcp23xxx: mcp23s17_hub - # Use pin number 1 - allow_other_uses: true - number: 1 - # One of INPUT or INPUT_PULLUP - mode: INPUT_PULLUP - inverted: false - interrupt: FALLING - - platform: gpio - pin: - allow_other_uses: true - number: GPIO9 - name: Living Room Window - device_class: window - filters: - - invert: - - delayed_on_off: 40ms - - delayed_on_off: - time_on: 10s - time_off: !lambda "return 1000;" - - delayed_on: 40ms - - delayed_off: 40ms - - delayed_on_off: !lambda "return 10;" - - delayed_on: !lambda "return 1000;" - - delayed_off: !lambda "return 0;" - - settle: 40ms - - settle: !lambda "return 10;" - on_press: - then: - - lambda: >- - ESP_LOGD("main", "Pressed"); - on_release: - then: - - lambda: >- - ESP_LOGD("main", "Released"); - on_click: - - min_length: 50ms - max_length: 350ms - then: - - lambda: >- - ESP_LOGD("main", "Clicked"); - - then: - - lambda: >- - ESP_LOGD("main", "Clicked"); - on_double_click: - - min_length: 50ms - max_length: 350ms - then: - - lambda: >- - ESP_LOGD("main", "Double Clicked"); - - then: - - lambda: >- - ESP_LOGD("main", "Double Clicked"); - on_multi_click: - - timing: - - ON for at most 1s - - OFF for at most 1s - - ON for at most 1s - - OFF for at least 0.2s - then: - - logger.log: - format: Multi Clicked TWO - level: warn - - timing: - - OFF for 1s to 2s - - ON for 1s to 2s - - OFF for at least 0.5s - then: - - logger.log: - format: Multi Clicked LONG SINGLE - level: warn - - timing: - - ON for at most 1s - - OFF for at least 0.5s - then: - - logger.log: - format: Multi Clicked SINGLE - level: warn - id: binary_sensor1 - - platform: gpio - pin: - number: GPIO9 - allow_other_uses: true - mode: INPUT_PULLUP - name: Living Room Window 2 - - platform: gpio - pin: - number: GPIO9 - allow_other_uses: true - mode: INPUT_OUTPUT_OPEN_DRAIN - name: Living Room Button - - platform: status - name: Living Room Status - - platform: esp32_touch - name: ESP32 Touch Pad GPIO27 - pin: GPIO27 - threshold: 1000 - id: btn_left - on_press: - - if: - condition: - display_menu.is_active: test_lcd_menu - then: - - display_menu.enter: test_lcd_menu - else: - - display_menu.left: test_lcd_menu - - display_menu.right: test_lcd_menu - - display_menu.show: test_lcd_menu - - if: - condition: - display_menu.is_active: test_graphical_display_menu - then: - - display_menu.enter: test_graphical_display_menu - else: - - display_menu.left: test_graphical_display_menu - - display_menu.right: test_graphical_display_menu - - display_menu.show: test_graphical_display_menu - - platform: template - name: Garage Door Open - id: garage_door - lambda: |- - if (isnan(id(${sensorname}_sensor).state)) { - // isnan checks if the ultrasonic sensor echo - // has timed out, resulting in a NaN (not a number) state - // in that case, return {} to indicate that we don't know. - return {}; - } else if (id(${sensorname}_sensor).state > 30) { - // Garage Door is open. - return true; - } else { - // Garage Door is closed. - return false; - } - on_press: - - binary_sensor.template.publish: - id: garage_door - state: false - - output.ledc.set_frequency: - id: gpio_19 - frequency: 500.0Hz - - output.ledc.set_frequency: - id: gpio_19 - frequency: !lambda "return 500.0;" - - platform: pn532 - pn532_id: pn532_bs - uid: 74-10-37-94 - name: PN532 NFC Tag - - platform: rdm6300 - uid: 7616525 - name: RDM6300 NFC Tag - - platform: gpio - name: PCF binary sensor - pin: - pcf8574: pcf8574_hub - number: 1 - mode: INPUT - inverted: true - - platform: gpio - name: PCA9554 binary sensor - pin: - pca9554: pca9554_hub - number: 1 - mode: INPUT - inverted: true - - platform: gpio - name: PCA6416A binary sensor - pin: - pca6416a: pca6416a_hub - number: 15 - mode: INPUT - inverted: true - - platform: gpio - name: MCP21 binary sensor - pin: - mcp23xxx: mcp23017_hub - number: 1 - allow_other_uses: true - mode: INPUT - inverted: true - - platform: gpio - name: MCP22 binary sensor - pin: - mcp23xxx: mcp23008_hub - number: 7 - mode: INPUT_PULLUP - inverted: false - - platform: gpio - name: MCP23 binary sensor - pin: - mcp23016: mcp23016_hub - number: 7 - mode: INPUT - inverted: false - - platform: gpio - name: Speed Fan Cycle binary sensor" - pin: - number: 18 - allow_other_uses: true - mode: - input: true - pulldown: true - on_press: - - fan.cycle_speed: - id: fan_speed - off_speed_cycle: false - - logger.log: "Cycle speed clicked" - - platform: remote_receiver - name: Raw Remote Receiver Test - raw: - code: - [ - 5685, - -4252, - 1711, - -2265, - 1712, - -2265, - 1711, - -2264, - 1712, - -2266, - 3700, - -2263, - 1712, - -4254, - 1711, - -4249, - 1715, - -2266, - 1710, - -2267, - 1709, - -2265, - 3704, - -4250, - 1712, - -4254, - 3700, - -2260, - 1714, - -2265, - 1712, - -2262, - 1714, - -2267, - 1709, - ] - - platform: remote_receiver - name: Coolix Test 1 - coolix: 0xB21F98 - - platform: remote_receiver - name: Coolix Test 2 - coolix: - first: 0xB2E003 - - platform: remote_receiver - name: Coolix Test 3 - coolix: - first: 0xB2E003 - second: 0xB21F98 - - platform: as3935 - name: Storm Alert - - platform: analog_threshold - name: Analog Trheshold 1 - sensor_id: template_sensor - threshold: - upper: 110 - lower: 90 - filters: - - delayed_on: 0s - - delayed_off: 10s - - platform: analog_threshold - name: Analog Trheshold 2 - sensor_id: template_sensor - threshold: 100 - filters: - - invert: - - platform: template - id: open_endstop_sensor - - platform: template - id: open_sensor - - platform: template - id: open_obstacle_sensor - - - platform: template - id: close_endstop_sensor - - platform: template - id: close_sensor - - platform: template - id: close_obstacle_sensor - - platform: ld2410 - has_target: - name: presence - has_moving_target: - name: movement - has_still_target: - name: still - out_pin_presence_status: - name: out pin presence status - - platform: qwiic_pir - i2c_id: i2c_bus - name: "Qwiic PIR Motion Sensor" - - platform: dfrobot_sen0395 - id: mmwave_detected_uart - dfrobot_sen0395_id: mmwave - - platform: nfc - nfcc_id: nfcc_pn7160_i2c - ndef_contains: pulse - name: MFC Tag 1 - - platform: nfc - nfcc_id: nfcc_pn7160_i2c - tag_id: pulse - name: MFC Tag 2 - - platform: nfc - nfcc_id: nfcc_pn7160_i2c - uid: 59-FC-AB-15 - name: MFC Tag 3 - -pca9685: - frequency: 500 - address: 0x0 - i2c_id: i2c_bus - -tlc59208f: - - address: 0x20 - id: tlc59208f_1 - i2c_id: i2c_bus - - address: 0x22 - id: tlc59208f_2 - i2c_id: i2c_bus - - address: 0x24 - id: tlc59208f_3 - i2c_id: i2c_bus - -my9231: - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - num_channels: 6 - num_chips: 2 - bit_depth: 16 - -sm2235: - data_pin: - allow_other_uses: true - number: GPIO4 - clock_pin: - allow_other_uses: true - number: GPIO5 - max_power_color_channels: 9 - max_power_white_channels: 9 - -sm2335: - data_pin: - allow_other_uses: true - number: GPIO4 - clock_pin: - allow_other_uses: true - number: GPIO5 - max_power_color_channels: 9 - max_power_white_channels: 9 - -bp1658cj: - data_pin: - allow_other_uses: true - number: GPIO3 - clock_pin: - allow_other_uses: true - number: GPIO5 - max_power_color_channels: 4 - max_power_white_channels: 6 - -bp5758d: - data_pin: - allow_other_uses: true - number: GPIO3 - clock_pin: - allow_other_uses: true - number: GPIO5 - -output: - - platform: gpio - pin: - allow_other_uses: true - number: GPIO26 - id: gpio_26 - power_supply: atx_power_supply - inverted: false - - platform: ledc - pin: - allow_other_uses: true - number: 19 - id: gpio_19 - frequency: 1500Hz - channel: 14 - max_power: 0.5 - - platform: pca9685 - id: pca_0 - channel: 0 - - platform: pca9685 - id: pca_1 - channel: 1 - - platform: pca9685 - id: pca_2 - channel: 2 - - platform: pca9685 - id: pca_3 - channel: 3 - - platform: pca9685 - id: pca_4 - channel: 4 - - platform: pca9685 - id: pca_5 - channel: 5 - - platform: pca9685 - id: pca_6 - channel: 6 - - platform: pca9685 - id: pca_7 - channel: 7 - - platform: tlc59208f - id: tlc_0 - channel: 0 - tlc59208f_id: tlc59208f_1 - - platform: tlc59208f - id: tlc_1 - channel: 1 - tlc59208f_id: tlc59208f_1 - - platform: tlc59208f - id: tlc_2 - channel: 2 - tlc59208f_id: tlc59208f_1 - - platform: tlc59208f - id: tlc_3 - channel: 0 - tlc59208f_id: tlc59208f_2 - - platform: tlc59208f - id: tlc_4 - channel: 1 - tlc59208f_id: tlc59208f_2 - - platform: tlc59208f - id: tlc_5 - channel: 2 - tlc59208f_id: tlc59208f_2 - - platform: tlc59208f - id: tlc_6 - channel: 0 - tlc59208f_id: tlc59208f_3 - - platform: tlc59208f - id: tlc_7 - channel: 1 - tlc59208f_id: tlc59208f_3 - - platform: tlc59208f - id: tlc_8 - channel: 2 - tlc59208f_id: tlc59208f_3 - - platform: gpio - id: id2 - pin: - pcf8574: pcf8574_hub - number: 0 - # allow_other_uses: true - mode: OUTPUT - inverted: false - - platform: gpio - id: id26 - pin: - pca9554: pca9554_hub - number: 0 - # allow_other_uses: true - mode: OUTPUT - inverted: false - - platform: gpio - id: id22 - pin: - mcp23xxx: mcp23017_hub - number: 0 - mode: OUTPUT - inverted: false - - platform: gpio - id: id23 - pin: - mcp23xxx: mcp23008_hub - number: 0 - mode: OUTPUT - inverted: false - - platform: gpio - id: id25 - pin: - mcp23016: mcp23016_hub - number: 0 - mode: OUTPUT - inverted: false - - platform: my9231 - id: my_0 - channel: 0 - - platform: my9231 - id: my_1 - channel: 1 - - platform: my9231 - id: my_2 - channel: 2 - - platform: my9231 - id: my_3 - channel: 3 - - platform: my9231 - id: my_4 - channel: 4 - - platform: my9231 - id: my_5 - channel: 5 - - platform: sm2235 - id: sm2235_red - channel: 1 - - platform: sm2235 - id: sm2235_green - channel: 0 - - platform: sm2235 - id: sm2235_blue - channel: 2 - - platform: sm2235 - id: sm2235_coldwhite - channel: 4 - - platform: sm2235 - id: sm2235_warmwhite - channel: 3 - - platform: sm2335 - id: sm2335_red - channel: 1 - - platform: sm2335 - id: sm2335_green - channel: 0 - - platform: sm2335 - id: sm2335_blue - channel: 2 - - platform: sm2335 - id: sm2335_coldwhite - channel: 4 - - platform: sm2335 - id: sm2335_warmwhite - channel: 3 - - platform: slow_pwm - id: id24 - pin: - allow_other_uses: true - number: GPIO26 - period: 15s - - platform: ac_dimmer - id: dimmer1 - gate_pin: - allow_other_uses: true - number: GPIO5 - zero_cross_pin: - allow_other_uses: true - number: GPIO26 - - platform: esp32_dac - pin: - allow_other_uses: true - number: GPIO25 - id: dac_output - - platform: mcp4725 - id: mcp4725_dac_output - i2c_id: i2c_bus - - platform: mcp4728 - id: mcp4728_dac_output_a - channel: A - vref: vdd - power_down: normal - - platform: mcp4728 - id: mcp4728_dac_output_b - channel: B - vref: internal - gain: X1 - power_down: gnd_1k - - platform: mcp4728 - id: mcp4728_dac_output_c - channel: C - vref: vdd - power_down: gnd_100k - - platform: mcp4728 - id: mcp4728_dac_output_d - channel: D - vref: internal - gain: X2 - power_down: gnd_500k - - platform: bp1658cj - id: bp1658cj_red - channel: 1 - - platform: bp1658cj - id: bp1658cj_green - channel: 2 - - platform: bp1658cj - id: bp1658cj_blue - channel: 0 - - platform: bp1658cj - id: bp1658cj_coldwhite - channel: 3 - - platform: bp1658cj - id: bp1658cj_warmwhite - channel: 4 - - platform: bp5758d - id: bp5758d_red - channel: 2 - current: 10 - - platform: bp5758d - id: bp5758d_green - channel: 3 - current: 10 - - platform: bp5758d - id: bp5758d_blue - channel: 1 - current: 10 - - platform: bp5758d - id: bp5758d_coldwhite - channel: 5 - current: 10 - - platform: bp5758d - id: bp5758d_warmwhite - channel: 4 - current: 10 - - platform: x9c - id: test_x9c - cs_pin: - allow_other_uses: true - number: GPIO25 - inc_pin: - allow_other_uses: true - number: GPIO26 - ud_pin: - allow_other_uses: true - number: GPIO27 - initial_value: 0.5 - -light: - - platform: binary - name: Desk Lamp - output: gpio_26 - effects: - - strobe: - - strobe: - name: My Strobe - colors: - - state: true - duration: 250ms - - state: false - duration: 250ms - on_turn_on: - - switch.template.publish: - id: livingroom_lights - state: true - on_turn_off: - - switch.template.publish: - id: livingroom_lights - state: true - - platform: monochromatic - name: Kitchen Lights - id: kitchen - output: gpio_19 - gamma_correct: 2.8 - default_transition_length: 2s - effects: - - strobe: - - flicker: - - flicker: - name: My Flicker - alpha: 98% - intensity: 1.5% - - lambda: - name: My Custom Effect - update_interval: 1s - lambda: |- - static int state = 0; - state += 1; - if (state == 4) - state = 0; - - pulse: - transition_length: 10s - update_interval: 20s - min_brightness: 10% - max_brightness: 90% - - pulse: - name: pulse2 - transition_length: - on_length: 10s - off_length: 5s - update_interval: 15s - min_brightness: 10% - max_brightness: 90% - - - platform: rgb - name: Living Room Lights - id: ${roomname}_lights - red: pca_0 - green: pca_1 - blue: pca_2 - - platform: rgbw - name: Living Room Lights 2 - red: pca_3 - green: pca_4 - blue: pca_5 - white: pca_6 - color_interlock: true - - platform: rgbww - name: Living Room Lights 2 - red: pca_3 - green: pca_4 - blue: pca_5 - cold_white: pca_6 - warm_white: pca_6 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - color_interlock: true - - platform: rgbct - name: Living Room Lights 2 - red: pca_3 - green: pca_4 - blue: pca_5 - color_temperature: pca_6 - white_brightness: pca_6 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - color_interlock: true - - platform: cwww - name: Living Room Lights 2 - cold_white: pca_6 - warm_white: pca_6 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - constant_brightness: true - - platform: color_temperature - name: Living Room Lights 2 - color_temperature: pca_6 - brightness: pca_6 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - -remote_transmitter: - - pin: - allow_other_uses: true - number: 32 - carrier_duty_percent: 100% - -climate: - - platform: tcl112 - name: TCL112 Climate With Sensor - supports_heat: true - supports_cool: true - sensor: ${sensorname}_sensor - - platform: tcl112 - name: TCL112 Climate - action_state_topic: action/state/topic - away_command_topic: away/command/topic - away_state_topic: away/state/topic - current_temperature_state_topic: current/temperature/state/topic - fan_mode_command_topic: fan_mode/mode/command/topic - fan_mode_state_topic: fan_mode/mode/state/topic - mode_command_topic: mode/command/topic - mode_state_topic: mode/state/topic - swing_mode_command_topic: swing_mode/command/topic - swing_mode_state_topic: swing_mode/state/topic - target_temperature_command_topic: target/temperature/command/topic - target_temperature_high_command_topic: target/temperature/high/command/topic - target_temperature_high_state_topic: target/temperature/high/state/topic - target_temperature_low_command_topic: target/temperature/low/command/topic - target_temperature_low_state_topic: target/temperature/low/state/topic - target_temperature_state_topic: target/temperature/state/topic - - platform: coolix - name: Coolix Climate With Sensor - supports_heat: true - supports_cool: true - sensor: ${sensorname}_sensor - - platform: coolix - name: Coolix Climate - - platform: fujitsu_general - name: Fujitsu General Climate - - platform: daikin - name: Daikin Climate - - platform: daikin_brc - name: Daikin BRC Climate - use_fahrenheit: true - - platform: delonghi - name: Delonghi Climate - - platform: yashima - name: Yashima Climate - - platform: mitsubishi - name: Mitsubishi - supports_dry: "true" - supports_fan_only: "true" - horizontal_default: "left" - vertical_default: "down" - - platform: whirlpool - name: Whirlpool Climate - - platform: climate_ir_lg - name: LG Climate - - platform: toshiba - name: Toshiba Climate - - platform: hitachi_ac344 - name: Hitachi Climate - - platform: heatpumpir - protocol: mitsubishi_heavy_zm - horizontal_default: left - vertical_default: up - name: HeatpumpIR Climate - min_temperature: 18 - max_temperature: 30 - - platform: heatpumpir - protocol: greeyt - horizontal_default: left - vertical_default: up - name: HeatpumpIR Climate - min_temperature: 18 - max_temperature: 30 - - platform: midea_ir - name: Midea IR - use_fahrenheit: true - - platform: midea - on_control: - - logger.log: Control message received! - - lambda: |- - x.set_mode(CLIMATE_MODE_FAN_ONLY); - on_state: - - logger.log: State changed! - - lambda: |- - if (x.mode == CLIMATE_MODE_FAN_ONLY) - id(binary_sensor1).publish_state(true); - id: midea_unit - uart_id: uart_0 - name: Midea Climate - transmitter_id: - period: 1s - num_attempts: 5 - timeout: 2s - beeper: false - autoconf: true - visual: - min_temperature: 17 °C - max_temperature: 30 °C - temperature_step: 0.5 °C - supported_modes: - - FAN_ONLY - - HEAT_COOL - - COOL - - HEAT - - DRY - custom_fan_modes: - - SILENT - - TURBO - supported_presets: - - ECO - - BOOST - - SLEEP - custom_presets: - - FREEZE_PROTECTION - supported_swing_modes: - - VERTICAL - - HORIZONTAL - - BOTH - outdoor_temperature: - name: Temp - power_usage: - name: Power - humidity_setpoint: - name: Humidity - - platform: anova - name: Anova cooker - ble_client_id: ble_blah - unit_of_measurement: c - icon: mdi:stove - - platform: bedjet - name: My Bedjet - bedjet_id: my_bedjet_client - heat_mode: extended - - platform: whynter - name: Whynter - - platform: noblex - name: AC Living - id: noblex_ac - sensor: ${sensorname}_sensor - receiver_id: rcvr - - platform: gree - name: GREE - model: generic - - platform: zhlt01 - name: ZH/LT-01 Climate - -script: - - id: climate_custom - then: - - climate.control: - id: midea_unit - custom_preset: FREEZE_PROTECTION - custom_fan_mode: SILENT - - id: climate_preset - then: - - climate.control: - id: midea_unit - preset: SLEEP - -switch: - - platform: template - name: MIDEA_AC_BEEPER_CONTROL - optimistic: true - turn_on_action: - midea_ac.beeper_on: - turn_off_action: - midea_ac.beeper_off: - - platform: template - name: MIDEA_RAW - turn_on_action: - - remote_transmitter.transmit_coolix: - first: 0xB21F98 - - remote_transmitter.transmit_coolix: - first: 0xB21F98 - second: 0xB21F98 - - remote_transmitter.transmit_coolix: - first: !lambda "return 0xB21F98;" - second: !lambda "return 0xB21F98;" - - remote_transmitter.transmit_midea: - code: [0xA2, 0x08, 0xFF, 0xFF, 0xFF] - - remote_transmitter.transmit_midea: - code: !lambda "return {0xA2, 0x08, 0xFF, 0xFF, 0xFF};" - - platform: gpio - name: "MCP23S08 Pin #0" - pin: - mcp23xxx: mcp23s08_hub - # Use pin number 0 - number: 0 - mode: OUTPUT - inverted: false - - platform: gpio - name: "MCP23S17 Pin #0" - pin: - mcp23xxx: mcp23s17_hub - # Use pin number 0 - number: 1 - allow_other_uses: true - mode: OUTPUT - inverted: false - - platform: gpio - pin: - allow_other_uses: true - number: GPIO25 - name: Living Room Dehumidifier - icon: "mdi:restart" - inverted: true - command_topic: custom_command_topic - command_retain: true - restore_mode: ALWAYS_OFF - - platform: template - name: JVC Off - id: living_room_lights_on - turn_on_action: - remote_transmitter.transmit_jvc: - data: 0x10EF - - platform: template - name: MagiQuest - turn_on_action: - remote_transmitter.transmit_magiquest: - wand_id: 0x01234567 - - platform: template - name: NEC - id: living_room_lights_off - turn_on_action: - remote_transmitter.transmit_nec: - address: 0x4242 - command: 0x8484 - - platform: template - name: LG - turn_on_action: - remote_transmitter.transmit_lg: - data: 4294967295 - nbits: 28 - - platform: template - name: Samsung - turn_on_action: - remote_transmitter.transmit_samsung: - data: 0xABCDEF - - platform: template - name: Samsung36 - turn_on_action: - remote_transmitter.transmit_samsung36: - address: 0x0400 - command: 0x000E00FF - - platform: template - name: ToshibaAC - turn_on_action: - - remote_transmitter.transmit_toshiba_ac: - rc_code_1: 0xB24DBF4050AF - rc_code_2: 0xD5660001003C - - platform: template - name: Sony - turn_on_action: - remote_transmitter.transmit_sony: - data: 0xABCDEF - nbits: 12 - - platform: template - name: Panasonic - turn_on_action: - remote_transmitter.transmit_panasonic: - address: 0x4004 - command: 0x1000BCD - - platform: template - name: Pioneer - turn_on_action: - - remote_transmitter.transmit_pioneer: - rc_code_1: 0xA556 - rc_code_2: 0xA506 - repeat: - times: 2 - - platform: template - name: RC Switch Raw - turn_on_action: - remote_transmitter.transmit_rc_switch_raw: - code: "00101001100111110101xxxx" - protocol: 1 - - platform: template - name: RC Switch Type A - turn_on_action: - remote_transmitter.transmit_rc_switch_type_a: - group: "11001" - device: "01000" - state: true - protocol: - pulse_length: 175 - sync: [1, 31] - zero: [1, 3] - one: [3, 1] - inverted: false - - platform: template - name: RC Switch Type B - turn_on_action: - remote_transmitter.transmit_rc_switch_type_b: - address: 4 - channel: 2 - state: true - - platform: template - name: RC Switch Type C - turn_on_action: - remote_transmitter.transmit_rc_switch_type_c: - family: "a" - group: 1 - device: 2 - state: true - - platform: template - name: RC Switch Type D - turn_on_action: - remote_transmitter.transmit_rc_switch_type_d: - group: "a" - device: 2 - state: true - - platform: template - name: RC5 - turn_on_action: - remote_transmitter.transmit_rc5: - address: 0x00 - command: 0x0B - - platform: template - name: RC5 - turn_on_action: - remote_transmitter.transmit_raw: - code: [1000, -1000] - - platform: template - name: AEHA - id: eaha_hitachi_climate_power_on - turn_on_action: - remote_transmitter.transmit_aeha: - address: 0x8008 - carrier_frequency: 36700Hz - data: - [ - 0x00, - 0x02, - 0xFD, - 0xFF, - 0x00, - 0x33, - 0xCC, - 0x49, - 0xB6, - 0xC8, - 0x37, - 0x16, - 0xE9, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0xCA, - 0x35, - 0x8F, - 0x70, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - 0x00, - 0xFF, - ] - - platform: template - name: Haier - turn_on_action: - remote_transmitter.transmit_haier: - code: - [ - 0xA6, - 0xDA, - 0x00, - 0x00, - 0x40, - 0x40, - 0x00, - 0x80, - 0x00, - 0x00, - 0x00, - 0x00, - 0x05, - ] - - platform: template - name: Living Room Lights - id: livingroom_lights - optimistic: true - assumed_state: true - turn_on_action: - - switch.turn_on: living_room_lights_on - - output.set_level: - id: gpio_19 - level: 50% - - output.set_level: - id: gpio_19 - level: !lambda "return 0.5;" - - output.set_level: - id: dac_output - level: 50% - - output.set_level: - id: dac_output - level: !lambda "return 0.5;" - - output.set_level: - id: mcp4725_dac_output - level: !lambda "return 0.5;" - - output.set_level: - id: mcp4728_dac_output_a - level: !lambda "return 0.5;" - turn_off_action: - - switch.turn_on: living_room_lights_off - on_turn_on: - - switch.template.publish: - id: livingroom_lights - state: true - - platform: restart - name: Living Room Restart - - platform: safe_mode - name: Living Room Restart (Safe Mode) - - platform: factory_reset - name: Living Room Restart (Factory Default Settings) - - platform: shutdown - name: Living Room Shutdown - - platform: output - name: Generic Output - output: pca_6 - - platform: template - name: Template Switch - id: my_switch - lambda: |- - if (id(binary_sensor1).state) { - return true; - } else { - return {}; - } - id(my_switch).publish_state(false); - id(my_switch).publish_state(true); - if (id(my_switch).state) { - // Switch is ON, do something here - id(my_switch).turn_off(); - id(my_switch).turn_on(); - } else { - // Switch is OFF, do something else here - } - optimistic: true - assumed_state: false - on_turn_off: - - switch.template.publish: - id: my_switch - state: !lambda "return false;" - - platform: uart - uart_id: uart_0 - name: UART String Output - data: DataToSend - - platform: uart - uart_id: uart_0 - name: UART Bytes Output - data: [0xDE, 0xAD, 0xBE, 0xEF] - - platform: uart - uart_id: uart_0 - name: UART Recurring Output - data: [0xDE, 0xAD, 0xBE, 0xEF] - send_every: 1s - - platform: uart - uart_id: uart_0 - name: "UART On/Off" - data: - turn_on: "TurnOn\r\n" - turn_off: "TurnOff\r\n" - - platform: template - assumed_state: true - name: Stepper Switch - turn_on_action: - - stepper.set_target: - id: my_stepper - target: !lambda |- - static int32_t i = 0; - i += 1000; - if (i > 5000) { - i = -5000; - } - return i; - - stepper.report_position: - id: my_stepper - position: 0 - - - platform: gpio - name: "SN74HC595 Pin #0" - pin: - sn74hc595: sn74hc595_hub_2 - # Use pin number 0 - number: 0 - inverted: false - - platform: template - id: ble1_status - optimistic: true - - platform: template - id: outlet_switch - optimistic: true - device_class: outlet - - platform: ld2410 - engineering_mode: - name: "control ld2410 engineering mode" - bluetooth: - name: "control ld2410 bluetooth" - - platform: micronova - stove: - name: Stove on/off - -fan: - - platform: binary - output: gpio_26 - name: Living Room Fan 1 - oscillation_output: gpio_19 - direction_output: gpio_26 - - platform: speed - id: fan_speed - icon: mdi:weather-windy - output: pca_6 - speed_count: 10 - name: Living Room Fan 2 - oscillation_output: gpio_19 - direction_output: gpio_26 - oscillation_state_topic: oscillation/state/topic - oscillation_command_topic: oscillation/command/topic - speed_level_state_topic: speed_level/state/topic - speed_level_command_topic: speed_level/command/topic - speed_state_topic: speed/state/topic - speed_command_topic: speed/command/topic - on_speed_set: - then: - - logger.log: Fan speed was changed! - - platform: speed - id: fan_speed_presets - icon: mdi:weather-windy - output: pca_6 - speed_count: 10 - name: Speed Fan w/ Presets - oscillation_output: gpio_19 - direction_output: gpio_26 - preset_modes: - - Preset 1 - - Preset 2 - on_preset_set: - then: - - logger.log: Preset mode was changed! - - platform: hbridge - id: fan_hbridge_presets - icon: mdi:weather-windy - speed_count: 4 - name: H-bridge Fan w/ Presets - pin_a: pca_6 - pin_b: pca_7 - preset_modes: - - Preset 1 - - Preset 2 - on_preset_set: - then: - - logger.log: Preset mode was changed! - - platform: bedjet - name: My Bedjet fan - bedjet_id: my_bedjet_client - - platform: copy - source_id: fan_speed - name: Fan Speed Copy - -interval: - - interval: 10s - then: - - display.page.show: !lambda |- - if (true) return id(page1); else return id(page2); - - display.page.show_next: display1 - - display.page.show_previous: display1 - - interval: 2s - then: - # yamllint disable rule:line-length - - lambda: |- - static uint16_t btn_left_state = id(btn_left)->get_value(); - - ESP_LOGD("adaptive touch", "___ Touch Pad '%s' (T%u): val: %u state: %u tres:%u", id(btn_left)->get_name().c_str(), id(btn_left)->get_touch_pad(), id(btn_left)->get_value(), btn_left_state, id(btn_left)->get_threshold()); - - btn_left_state = ((uint32_t) id(btn_left)->get_value() + 63 * (uint32_t)btn_left_state) >> 6; - - id(btn_left)->set_threshold(btn_left_state * 0.9); - # yamllint enable rule:line-length - - if: - condition: - display.is_displaying_page: - id: display1 - page_id: page1 - then: - - logger.log: Seeing page 1 - - interval: 60min - then: - - ble_client.connect: ble_blah - - ble_client.ble_write: - id: ble_blah - service_uuid: EBE0CCB0-7A0A-4B0C-8A1A-6FF2997DA3A6 - characteristic_uuid: EBE0CCB7-7A0A-4B0C-8A1A-6FF2997DA3A6 - value: !lambda |- - return {1, 0}; - - ble_client.disconnect: ble_blah - -color: - - id: kbx_red - red: 100% - green_int: 123 - blue: 2% - - id: kbx_blue - red: 0% - green: 1% - blue: 100% - - id: kbx_green - hex: "3DEC55" - -display: - - platform: lcd_gpio - id: my_lcd_gpio - dimensions: 18x4 - data_pins: - - allow_other_uses: true - number: GPIO19 - - allow_other_uses: true - number: GPIO21 - - allow_other_uses: true - number: GPIO22 - - allow_other_uses: true - number: GPIO23 - enable_pin: - allow_other_uses: true - number: GPIO23 - rs_pin: - allow_other_uses: true - number: GPIO25 - lambda: |- - it.print("Hello World!"); - - platform: lcd_pcf8574 - dimensions: 18x4 - address: 0x3F - user_characters: - - position: 0 - data: - - 0b00000 - - 0b01010 - - 0b00000 - - 0b00100 - - 0b00100 - - 0b10001 - - 0b01110 - - 0b00000 - lambda: |- - it.print("Hello World!"); - i2c_id: i2c_bus - - platform: max7219 - cs_pin: - allow_other_uses: true - number: GPIO23 - num_chips: 1 - lambda: |- - it.print("01234567"); - - platform: tm1637 - clk_pin: - allow_other_uses: true - number: GPIO23 - dio_pin: - allow_other_uses: true - number: GPIO25 - intensity: 3 - lambda: |- - it.print("1234"); - - platform: tm1637 - clk_pin: - mcp23xxx: mcp23017_hub - number: 1 - allow_other_uses: true - dio_pin: - mcp23xxx: mcp23017_hub - number: 2 - intensity: 3 - inverted: true - length: 4 - lambda: |- - it.print("1234"); - - platform: pcd8544 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - contrast: 60 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1306_i2c - model: SSD1306_128X64 - reset_pin: - allow_other_uses: true - number: GPIO23 - address: 0x3C - id: display1 - contrast: 60% - pages: - - id: page1 - lambda: |- - it.qr_code(0, 0, id(homepage_qr)); - it.rectangle(0, 0, it.get_width(), it.get_height()); - - id: page2 - lambda: |- - // Nothing - on_page_change: - from: page1 - to: page2 - then: - lambda: |- - ESP_LOGD("display", "1 -> 2"); - i2c_id: i2c_bus - - platform: ssd1306_spi - model: SSD1306 128x64 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1322_spi - model: SSD1322 256x64 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1325_spi - model: SSD1325 128x64 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1327_i2c - model: SSD1327 128X128 - reset_pin: - allow_other_uses: true - number: GPIO23 - address: 0x3D - id: display1327 - brightness: 60% - pages: - - id: page13271 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - id: page13272 - lambda: |- - // Nothing - i2c_id: i2c_bus - - platform: ssd1327_spi - model: SSD1327 128x128 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1331_spi - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ssd1351_spi - model: SSD1351 128x128 - cs_pin: - allow_other_uses: true - number: GPIO23 - dc_pin: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7789v - model: TTGO TDisplay 135x240 - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO16 - reset_pin: - allow_other_uses: true - number: GPIO23 - backlight_pin: false - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7920 - width: 128 - height: 64 - cs_pin: - allow_other_uses: true - number: GPIO23 - inverted: true - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7567_i2c - id: st7735_display_i2c - address: 0x3F - i2c_id: i2c_bus - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7567_spi - id: st7735_display_spi - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO16 - reset_pin: - allow_other_uses: true - number: GPIO23 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: st7735 - id: st7735_display - model: INITR_BLACKTAB - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO16 - reset_pin: - allow_other_uses: true - number: GPIO23 - rotation: 0 - device_width: 128 - device_height: 160 - col_start: 0 - row_start: 0 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ili9xxx - invert_colors: true - dimensions: 320x240 - transform: - swap_xy: true - mirror_x: true - mirror_y: false - model: TFT 2.4 - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO4 - color_palette: GRAYSCALE - reset_pin: - allow_other_uses: true - number: GPIO22 - lambda: |- - it.rectangle(0, 0, it.get_width(), it.get_height()); - - platform: ili9xxx - dimensions: - width: 320 - height: 240 - offset_width: 20 - offset_height: 10 - model: TFT 2.4 - cs_pin: - allow_other_uses: true - number: GPIO5 - dc_pin: - allow_other_uses: true - number: GPIO4 - reset_pin: - allow_other_uses: true - number: GPIO22 - auto_clear_enabled: false - rotation: 90 - lambda: |- - if (!id(glob_bool_processed)) { - it.fill(Color::WHITE); - id(glob_bool_processed) = true; - } - - platform: pvvx_mithermometer - ble_client_id: ble_foo - time_id: sntp_time - disconnect_delay: 3s - update_interval: 10min - validity_period: 20min - lambda: |- - it.print_bignum(188.8); - it.print_unit(pvvx_mithermometer::UNIT_DEG_E); - it.print_smallnum(88); - it.print_percent(true); - it.print_happy(true); - it.print_sad(true); - it.print_bracket(true); - it.print_battery(true); - - platform: tm1621 - id: tm1621_display - cs_pin: - allow_other_uses: true - number: GPIO17 - data_pin: - allow_other_uses: true - number: GPIO5 - read_pin: - allow_other_uses: true - number: GPIO23 - write_pin: - allow_other_uses: true - number: GPIO18 - lambda: |- - it.printf(0, "%.1f", id(dht_temperature).state); - it.display_celsius(true); - it.printf(1, "%.1f", id(dht_humidity).state); - it.display_humidity(true); - -tm1651: - id: tm1651_battery - clk_pin: - allow_other_uses: true - number: GPIO23 - dio_pin: - allow_other_uses: true - number: GPIO23 - -remote_receiver: - id: rcvr - pin: - allow_other_uses: true - number: GPIO32 - dump: all - on_coolix: - then: - delay: !lambda "return x.first + x.second;" - on_rc_switch: - then: - delay: !lambda "return uint32_t(x.code) + x.protocol;" - -status_led: - pin: - allow_other_uses: true - number: GPIO2 - ignore_strapping_warning: true - -pn532_spi: - id: pn532_bs - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 1s - on_tag: - - lambda: |- - ESP_LOGD("main", "Found tag %s", x.c_str()); - - mqtt.publish: - topic: the/topic - payload: !lambda "return x;" - on_tag_removed: - - lambda: |- - ESP_LOGD("main", "Removed tag %s", x.c_str()); - - mqtt.publish: - topic: the/topic - payload: !lambda "return x;" - -pn532_i2c: - i2c_id: i2c_bus - -pn7150_i2c: - id: nfcc_pn7150_i2c - i2c_id: i2c_bus - irq_pin: - allow_other_uses: true - number: GPIO32 - ven_pin: - allow_other_uses: true - number: GPIO16 - -pn7160_i2c: - id: nfcc_pn7160_i2c - i2c_id: i2c_bus - dwl_req_pin: - allow_other_uses: true - number: GPIO17 - irq_pin: - allow_other_uses: true - number: GPIO35 - ven_pin: - allow_other_uses: true - number: GPIO16 - wkup_req_pin: - allow_other_uses: true - number: GPIO21 - emulation_message: https://www.home-assistant.io/tag/pulse_ce - tag_ttl: 1000ms - -pn7160_spi: - id: nfcc_pn7160_spi - cs_pin: - number: GPIO15 - dwl_req_pin: - allow_other_uses: true - number: GPIO17 - irq_pin: - allow_other_uses: true - number: GPIO35 - ven_pin: - allow_other_uses: true - number: GPIO16 - wkup_req_pin: - allow_other_uses: true - number: GPIO21 - emulation_message: https://www.home-assistant.io/tag/pulse_ce - tag_ttl: 1000ms - -rdm6300: - uart_id: uart_0 - -rc522_spi: - cs_pin: - allow_other_uses: true - number: GPIO23 - update_interval: 1s - on_tag: - - lambda: |- - ESP_LOGD("main", "Found tag %s", x.c_str()); - -rc522_i2c: - - update_interval: 1s - on_tag: - - lambda: |- - ESP_LOGD("main", "Found tag %s", x.c_str()); - i2c_id: i2c_bus - - - update_interval: 1s - on_tag: - - lambda: |- - ESP_LOGD("main", "Found tag %s", x.c_str()); - i2c_id: i2c_bus - -mcp4728: - - id: mcp4728_dac - store_in_eeprom: false - address: 0x60 - i2c_id: i2c_bus - -gps: - uart_id: uart_0 - -time: - - platform: sntp - id: sntp_time - servers: - - 0.pool.ntp.org - - 1.pool.ntp.org - - 192.168.178.1 - on_time: - cron: "/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI" - then: - - lambda: 'ESP_LOGD("main", "time");' - - platform: gps - on_time_sync: - then: - ds1307.write_time: - id: ds1307_time - - platform: ds1307 - id: ds1307_time - update_interval: never - i2c_id: i2c_bus - on_time: - - seconds: 0 - then: ds1307.read_time - - at: "16:00:00" - then: - - if: - condition: - or: - - binary_sensor.is_on: close_sensor - - binary_sensor.is_on: open_sensor - then: - logger.log: "close_sensor or open_sensor is on" - - if: - condition: - and: - - binary_sensor.is_on: close_sensor - - binary_sensor.is_on: open_sensor - then: - logger.log: "close_sensor and open_sensor are both on" - - if: - condition: - xor: - - binary_sensor.is_on: close_sensor - - binary_sensor.is_on: open_sensor - then: - logger.log: "close_sensor or open_sensor is exclusively on" - - if: - condition: - not: - - binary_sensor.is_on: close_sensor - then: - logger.log: "close_sensor is not on" -cover: - - platform: template - name: Template Cover - id: template_cover - lambda: |- - if (id(binary_sensor1).state) { - return COVER_OPEN; - } else { - return {}; - } - optimistic: true - open_action: - - cover.template.publish: - id: template_cover - state: CLOSED - assumed_state: false - has_position: true - position_state_topic: position/state/topic - position_command_topic: position/command/topic - tilt_lambda: !lambda "return 0.5;" - tilt_state_topic: tilt/state/topic - tilt_command_topic: tilt/command/topic - on_open: - then: - - lambda: 'ESP_LOGD("cover", "open");' - on_closed: - then: - - lambda: 'ESP_LOGD("cover", "closed");' - - platform: am43 - name: Test AM43 - id: am43_test - ble_client_id: ble_foo - icon: mdi:blinds - - platform: feedback - name: Feedback Cover - id: gate - device_class: gate - - infer_endstop_from_movement: false - has_built_in_endstop: false - max_duration: 30s - direction_change_wait_time: 300ms - acceleration_wait_time: 150ms - obstacle_rollback: 10% - - open_duration: 22.1s - open_endstop: open_endstop_sensor - open_sensor: open_sensor - open_obstacle_sensor: open_obstacle_sensor - - close_duration: 22.4s - close_endstop: close_endstop_sensor - close_sensor: close_sensor - close_obstacle_sensor: close_obstacle_sensor - - open_action: - - logger.log: Open Action - - close_action: - - logger.log: Close Action - - stop_action: - - logger.log: Stop Action - -debug: - -tca9548a: - - address: 0x70 - id: multiplex0 - channels: - - bus_id: multiplex0_chan0 - channel: 0 - i2c_id: i2c_bus - - address: 0x71 - id: multiplex1 - i2c_id: multiplex0_chan0 - -pcf8574: - - id: pcf8574_hub - address: 0x21 - pcf8575: false - i2c_id: i2c_bus - -pca9554: - - id: pca9554_hub - pin_count: 8 - address: 0x3F - i2c_id: i2c_bus - -pca6416a: - - id: pca6416a_hub - address: 0x21 - i2c_id: i2c_bus - -mcp23017: - - id: mcp23017_hub - open_drain_interrupt: true - i2c_id: i2c_bus - -mcp23008: - - id: mcp23008_hub - address: 0x22 - open_drain_interrupt: true - i2c_id: i2c_bus - -mcp23016: - - id: mcp23016_hub - address: 0x23 - i2c_id: i2c_bus - -stepper: - - platform: a4988 - id: my_stepper - step_pin: - allow_other_uses: true - number: GPIO23 - dir_pin: - allow_other_uses: true - number: GPIO25 - sleep_pin: - allow_other_uses: true - number: GPIO25 - max_speed: 250 steps/s - acceleration: 100 steps/s^2 - deceleration: 200 steps/s^2 - -globals: - - id: glob_int - type: int - restore_value: true - initial_value: "0" - - id: glob_float - type: float - restore_value: true - initial_value: "0.0f" - - id: glob_bool - type: bool - restore_value: false - initial_value: "true" - - id: glob_string - type: std::string - restore_value: false - # initial_value: "" - - id: glob_bool_processed - type: bool - restore_value: false - initial_value: "false" - -text_sensor: - - platform: ble_client - ble_client_id: ble_foo - name: Sensor Location - service_uuid: "180d" - characteristic_uuid: "2a38" - descriptor_uuid: "2902" - notify: true - update_interval: never - on_notify: - then: - - lambda: |- - ESP_LOGD("green_btn", "Location changed: %s", x.c_str()); - - platform: mqtt_subscribe - name: MQTT Subscribe Text - topic: "the/topic" - qos: 2 - on_value: - - text_sensor.template.publish: - id: ${textname}_text - state: Hello World - - text_sensor.template.publish: - id: ${textname}_text - state: |- - return "Hello World2"; - - globals.set: - id: glob_int - value: "0" - - canbus.send: - canbus_id: mcp2515_can - can_id: 23 - data: [0x10, 0x20, 0x30] - - canbus.send: - canbus_id: mcp2515_can - can_id: 23 - data: !lambda return {0x10, 0x20, 0x30}; - - canbus.send: - canbus_id: esp32_internal_can - can_id: 23 - data: [0x10, 0x20, 0x30] - - canbus.send: - canbus_id: mcp2515_can - can_id: 24 - remote_transmission_request: true - data: [] - - canbus.send: - canbus_id: esp32_internal_can - can_id: 24 - remote_transmission_request: true - data: [] - - platform: template - name: Template Text Sensor - id: ${textname}_text - - platform: template - name: Template Text Sensor Timestamp - id: ${textname}_text_timestamp - device_class: timestamp - - platform: wifi_info - scan_results: - name: Scan Results - ip_address: - name: IP Address - ssid: - name: SSID - bssid: - name: BSSID - mac_address: - name: Mac Address - dns_address: - name: DNS ADdress - - platform: version - name: ESPHome Version No Timestamp - hide_timestamp: true - - platform: teleinfo - tag_name: OPTARIF - name: optarif - teleinfo_id: myteleinfo - - platform: ld2410 - version: - name: "presenece sensor version" - mac_address: - name: "presenece sensor mac address" - -sn74hc595: - - id: sn74hc595_hub - data_pin: - allow_other_uses: true - number: GPIO21 - clock_pin: - allow_other_uses: true - number: GPIO23 - latch_pin: - allow_other_uses: true - number: GPIO22 - oe_pin: - allow_other_uses: true - number: GPIO32 - sr_count: 2 - - id: sn74hc595_hub_2 - latch_pin: - allow_other_uses: true - number: GPIO22 - oe_pin: - allow_other_uses: true - number: GPIO32 - sr_count: 2 - spi_id: spi_bus - type: spi - -rtttl: - output: gpio_19 - -canbus: - - platform: mcp2515 - id: mcp2515_can - cs_pin: - pca9554: pca9554_hub - number: 7 - mode: - output: true - inverted: true - can_id: 4 - bit_rate: 50kbps - on_frame: - - can_id: 500 - then: - - lambda: |- - std::string b(x.begin(), x.end()); - ESP_LOGD("canid 500", "%s", b.c_str()); - - can_id: 23 - then: - - if: - condition: - lambda: "return x[0] == 0x11;" - then: - light.toggle: ${roomname}_lights - - can_id: 0b00000000000000000000001000000 - can_id_mask: 0b11111000000000011111111000000 - use_extended_id: true - then: - - lambda: |- - auto pdo_id = can_id >> 14; - switch (pdo_id) - { - case 117: - ESP_LOGD("canbus", "exhaust_fan_duty"); - break; - case 118: - ESP_LOGD("canbus", "supply_fan_duty"); - break; - case 119: - ESP_LOGD("canbus", "supply_fan_flow"); - break; - // to be continued... - } - - platform: esp32_can - id: esp32_internal_can - rx_pin: - allow_other_uses: true - number: GPIO04 - tx_pin: - allow_other_uses: true - number: GPIO05 - can_id: 4 - bit_rate: 50kbps - on_frame: - - can_id: 500 - then: - - lambda: |- - std::string b(x.begin(), x.end()); - ESP_LOGD("canid 500", "%s", b.c_str() ); - - can_id: 23 - then: - - if: - condition: - lambda: "return x[0] == 0x11;" - then: - light.toggle: ${roomname}_lights - - can_id: 0b00000000000000000000001000000 - can_id_mask: 0b11111000000000011111111000000 - use_extended_id: true - then: - - lambda: |- - auto pdo_id = can_id >> 14; - switch (pdo_id) - { - case 117: - ESP_LOGD("canbus", "exhaust_fan_duty"); - break; - case 118: - ESP_LOGD("canbus", "supply_fan_duty"); - break; - case 119: - ESP_LOGD("canbus", "supply_fan_flow"); - break; - // to be continued... - } - -teleinfo: - id: myteleinfo - uart_id: uart_0 - update_interval: 60s - historical_mode: true - -number: - - platform: template - id: test_number - state_topic: livingroom/custom_state_topic - command_topic: livingroom/custom_command_topic - min_value: 0 - step: 1 - max_value: 10 - optimistic: true - - platform: ld2410 - light_threshold: - name: light threshold - timeout: - name: timeout - max_move_distance_gate: - name: max move distance gate - max_still_distance_gate: - name: max still distance gate - g0: - move_threshold: - name: g0 move threshold - still_threshold: - name: g0 still threshold - g1: - move_threshold: - name: g1 move threshold - still_threshold: - name: g1 still threshold - g2: - move_threshold: - name: g2 move threshold - still_threshold: - name: g2 still threshold - g3: - move_threshold: - name: g3 move threshold - still_threshold: - name: g3 still threshold - g4: - move_threshold: - name: g4 move threshold - still_threshold: - name: g4 still threshold - g5: - move_threshold: - name: g5 move threshold - still_threshold: - name: g5 still threshold - g6: - move_threshold: - name: g6 move threshold - still_threshold: - name: g6 still threshold - g7: - move_threshold: - name: g7 move threshold - still_threshold: - name: g7 still threshold - g8: - move_threshold: - name: g8 move threshold - still_threshold: - name: g8 still threshold - - platform: micronova - thermostat_temperature: - name: Micronova Thermostaat - step: 1 - power_level: - name: Micronova Power level - -select: - - platform: template - id: test_select - state_topic: livingroom/custom_state_topic - command_topic: livingroom/custom_command_topic - options: - - one - - two - optimistic: true - - platform: copy - source_id: test_select - name: Test Select Copy - - platform: ld2410 - distance_resolution: - name: distance resolution - baud_rate: - name: baud rate - light_function: - name: light function - out_pin_level: - name: out ping level - -qr_code: - - id: homepage_qr - value: https://esphome.io/index.html - -lock: - - platform: template - id: test_lock1 - name: Template Switch - lambda: |- - if (id(binary_sensor1).state) { - return LOCK_STATE_LOCKED; - }else{ - return LOCK_STATE_UNLOCKED; - } - optimistic: true - assumed_state: false - on_unlock: - - lock.template.publish: - id: test_lock1 - state: !lambda "return LOCK_STATE_UNLOCKED;" - on_lock: - - lock.template.publish: - id: test_lock1 - state: !lambda "return LOCK_STATE_LOCKED;" - - platform: output - name: Generic Output Lock - id: test_lock2 - output: pca_6 - - platform: copy - source_id: test_lock2 - name: Generic Output Lock Copy - -button: - - platform: template - name: Start calibration - on_press: - - scd4x.perform_forced_calibration: - value: 419 - id: scd40 - - scd4x.factory_reset: - id: scd40 - - platform: template - name: Midea Display Toggle - on_press: - midea_ac.display_toggle: - - platform: template - name: Midea Swing Step - on_press: - midea_ac.swing_step: - - platform: template - name: Midea Power On - on_press: - midea_ac.power_on: - - platform: template - name: Midea Power Off - on_press: - midea_ac.power_off: - - platform: template - name: Midea Power Inverse - on_press: - midea_ac.power_toggle: - - platform: template - name: Update Mmwave Sensor Settings - on_press: - - dfrobot_sen0395.settings: - id: mmwave - factory_reset: true - detection_segments: - - [0cm, 5m] - - 600cm - - !lambda |- - return 7; - output_latency: - delay_after_detect: 0s - delay_after_disappear: 0s - sensitivity: 6 - - platform: template - name: Reset Mmwave Sensor - on_press: - - dfrobot_sen0395.reset: - - platform: template - name: Poller component suspend test - on_press: - - component.suspend: myteleinfo - - delay: 20s - - component.update: myteleinfo - - delay: 20s - - component.resume: myteleinfo - - delay: 20s - - component.resume: - id: myteleinfo - update_interval: 2s - - delay: 20s - - component.resume: - id: myteleinfo - update_interval: !lambda return 2500; - - platform: ld2410 - factory_reset: - name: "factory reset" - restart: - name: "restart" - query_params: - name: query params - - platform: uart - uart_id: uart_0 - name: UART button - data: "Pressed\r\n" - - platform: micronova - custom_button: - name: Custom Micronova Button - memory_location: 0xA0 - memory_address: 0x7D - memory_data: 0x0F - -ld2410: - id: my_ld2410 - uart_id: ld2410_uart - -ld2420: - id: my_ld2420 - uart_id: ld2420_uart - -lcd_menu: - id: test_lcd_menu - display_id: my_lcd_gpio - mark_back: 0x5e - mark_selected: 0x3e - mark_editing: 0x2a - mark_submenu: 0x7e - active: false - mode: rotary - on_enter: - then: - lambda: 'ESP_LOGI("lcd_menu", "root enter");' - on_leave: - then: - lambda: 'ESP_LOGI("lcd_menu", "root leave");' - items: - - type: back - text: Back - - type: label - - type: menu - text: Submenu 1 - items: - - type: back - text: Back - - type: menu - text: Submenu 21 - items: - - type: back - text: Back - - type: command - text: Show Main - on_value: - then: - - display_menu.show_main: test_lcd_menu - - type: select - text: Enum Item - immediate_edit: true - select: test_select - on_enter: - then: - lambda: 'ESP_LOGI("lcd_menu", "select enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_leave: - then: - lambda: 'ESP_LOGI("lcd_menu", "select leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_value: - then: - lambda: 'ESP_LOGI("lcd_menu", "select value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - - type: number - text: Number - number: test_number - on_enter: - then: - lambda: 'ESP_LOGI("lcd_menu", "number enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_leave: - then: - lambda: 'ESP_LOGI("lcd_menu", "number leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_value: - then: - lambda: 'ESP_LOGI("lcd_menu", "number value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - - type: command - text: Hide - on_value: - then: - - display_menu.hide: test_lcd_menu - - type: switch - text: Switch - switch: my_switch - on_text: Bright - off_text: Dark - immediate_edit: false - on_value: - then: - lambda: 'ESP_LOGI("lcd_menu", "switch value: %s", it->get_value_text().c_str());' - - type: custom - text: !lambda 'return "Custom";' - value_lambda: 'return "Val";' - on_next: - then: - lambda: 'ESP_LOGI("lcd_menu", "custom next: %s", it->get_text().c_str());' - on_prev: - then: - lambda: 'ESP_LOGI("lcd_menu", "custom prev: %s", it->get_text().c_str());' - -font: - - file: "gfonts://Roboto" - id: roboto - size: 20 - -graphical_display_menu: - id: test_graphical_display_menu - display: st7735_display - font: roboto - active: false - mode: rotary - on_enter: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "root enter");' - on_leave: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "root leave");' - items: - - type: back - text: "Back" - - type: label - - type: menu - text: "Submenu 1" - items: - - type: back - text: "Back" - - type: menu - text: "Submenu 21" - items: - - type: back - text: "Back" - - type: command - text: "Show Main" - on_value: - then: - - display_menu.show_main: test_graphical_display_menu - - type: select - text: "Enum Item" - immediate_edit: true - select: test_select - on_enter: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "select enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_leave: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "select leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_value: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "select value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - - type: number - text: "Number" - number: test_number - on_enter: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "number enter: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_leave: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "number leave: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - on_value: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "number value: %s, %s", it->get_text().c_str(), it->get_value_text().c_str());' - - type: command - text: "Hide" - on_value: - then: - - display_menu.hide: test_graphical_display_menu - - type: switch - text: "Switch" - switch: my_switch - on_text: "Bright" - off_text: "Dark" - immediate_edit: false - on_value: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "switch value: %s", it->get_value_text().c_str());' - - type: custom - text: !lambda 'return "Custom";' - value_lambda: 'return "Val";' - on_next: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "custom next: %s", it->get_text().c_str());' - on_prev: - then: - lambda: 'ESP_LOGI("graphical_display_menu", "custom prev: %s", it->get_text().c_str());' - -alarm_control_panel: - - platform: template - id: alarmcontrolpanel1 - name: Alarm Panel - codes: - - "1234" - requires_code_to_arm: true - arming_home_time: 1s - arming_away_time: 15s - pending_time: 15s - trigger_time: 30s - binary_sensors: - - binary_sensor1 - on_state: - then: - - lambda: !lambda |- - ESP_LOGD("TEST", "State change %s", alarm_control_panel_state_to_string(id(alarmcontrolpanel1)->get_state())); diff --git a/tests/test11.5.yaml b/tests/test11.5.yaml deleted file mode 100644 index 758f295a6c..0000000000 --- a/tests/test11.5.yaml +++ /dev/null @@ -1,809 +0,0 @@ ---- -# copy of test5.yaml configured to build on IDF 5 -esphome: - name: test11-5 - build_path: build/test11.5 - project: - name: esphome.test11_5_project - version: "1.0.0" - -esp32: - board: nodemcu-32s - framework: - type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 - advanced: - ignore_efuse_mac_crc: true - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - manual_ip: - static_ip: 192.168.1.23 - gateway: 192.168.1.1 - subnet: 255.255.255.0 - -network: - enable_ipv6: true - -api: - -ota: - - platform: esphome - -logger: - -debug: - -psram: - -uart: - - id: uart_1 - tx_pin: 1 - rx_pin: 3 - baud_rate: 9600 - - id: uart_2 - tx_pin: - allow_other_uses: true - number: 17 - rx_pin: - allow_other_uses: true - number: 16 - baud_rate: 19200 - -i2c: - sda: - number: 21 - allow_other_uses: true - frequency: 100khz - -spi: - - id: spi_1 - clk_pin: - allow_other_uses: true - number: 12 - mosi_pin: - allow_other_uses: true - number: 13 - miso_pin: - allow_other_uses: true - number: 14 - - id: spi_2 - clk_pin: - allow_other_uses: true - number: 32 - mosi_pin: 33 - -modbus: - uart_id: uart_1 - flow_control_pin: - allow_other_uses: true - number: 5 - id: mod_bus1 - -modbus_controller: - - id: modbus_controller_test - address: 0x2 - modbus_id: mod_bus1 - -mqtt: - broker: test.mosquitto.org - port: 1883 - discovery: true - discovery_prefix: homeassistant - idf_send_async: false - on_message: - topic: testing/sensor/testing_sensor/state - qos: 0 - then: - # yamllint disable rule:line-length - - lambda: |- - ESP_LOGD("Mqtt Test", "testing/sensor/testing_sensor/state=[%s]", x.c_str()); - # yamllint enable rule:line-length - -vbus: - - uart_id: uart_2 - -binary_sensor: - - platform: gpio - pin: GPIO0 - id: io0_button - icon: mdi:gesture-tap-button - - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_binsensortest - register_type: read - address: 0x3200 - bitmask: 0x80 # (bit 8) - lambda: "return x;" - - - platform: tm1638 - id: Button0 - key: 0 - filters: - - delayed_on: 10ms - on_press: - then: - - switch.turn_on: Led0 - on_release: - then: - - switch.turn_off: Led0 - - if: - condition: ble.enabled - then: - - ble.disable: - else: - - ble.enable: - - - platform: tm1638 - id: Button1 - key: 1 - on_press: - then: - - switch.turn_on: Led1 - on_release: - then: - - switch.turn_off: Led1 - - - platform: tm1638 - id: Button2 - key: 2 - on_press: - then: - - switch.turn_on: Led2 - on_release: - then: - - switch.turn_off: Led2 - - - platform: tm1638 - id: Button3 - key: 3 - on_press: - then: - - switch.turn_on: Led3 - on_release: - then: - - switch.turn_off: Led3 - - - platform: tm1638 - id: Button4 - key: 4 - on_press: - then: - - output.turn_on: Led4 - on_release: - then: - - output.turn_off: Led4 - - - platform: tm1638 - id: Button5 - key: 5 - on_press: - then: - - output.turn_on: Led5 - on_release: - then: - - output.turn_off: Led5 - - - platform: tm1638 - id: Button6 - key: 6 - on_press: - then: - - output.turn_on: Led6 - on_release: - then: - - output.turn_off: Led6 - - - platform: tm1638 - id: Button7 - key: 7 - on_press: - then: - - output.turn_on: Led7 - on_release: - then: - - output.turn_off: Led7 - - - platform: gpio - id: sn74hc165_pin_0 - pin: - sn74hc165: sn74hc165_hub - number: 0 - - - platform: ezo_pmp - pump_state: - name: "Pump State" - is_paused: - name: "Is Paused" - - - platform: matrix_keypad - keypad_id: keypad - id: key4 - row: 1 - col: 1 - - platform: matrix_keypad - id: key1 - key: 1 - - - platform: vbus - model: deltasol_bs_plus - relay2: - name: Relay 2 On - sensor1_error: - name: Sensor 1 Error - - - platform: vbus - model: custom - command: 0x100 - source: 0x1234 - dest: 0x10 - binary_sensors: - - id: vcustom_b - name: VBus Custom Binary Sensor - lambda: return x[0] & 1; - -tlc5947: - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - lat_pin: - allow_other_uses: true - number: GPIO15 - -gp8403: - - id: gp8403_5v - voltage: 5V - - id: gp8403_10v - voltage: 10V - -output: - - platform: gpio - pin: GPIO2 - id: built_in_led - - - platform: tlc5947 - id: output_red - channel: 0 - max_power: 0.8 - - - platform: mcp47a1 - id: output_mcp47a1 - - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_output_test - lambda: |- - return x * 1.0 ; - address: 0x9001 - value_type: U_WORD - - - platform: tm1638 - id: Led4 - led: 4 - - - platform: tm1638 - id: Led5 - led: 5 - - - platform: tm1638 - id: Led6 - led: 6 - - - platform: tm1638 - id: Led7 - led: 7 - - - platform: gp8403 - id: gp8403_output_0 - gp8403_id: gp8403_5v - channel: 0 - - platform: gp8403 - gp8403_id: gp8403_10v - id: gp8403_output_1 - channel: 1 - -demo: - -esp32_ble: - enable_on_boot: false - -esp32_ble_server: - manufacturer: ESPHome - model: Test11 - -esp32_improv: - authorizer: io0_button - authorized_duration: 1min - status_indicator: built_in_led - -ezo_pmp: - id: hcl_pump - update_interval: 1s - -number: - - platform: template - name: My template number - id: template_number_id - optimistic: true - max_value: 100 - min_value: 0 - step: 5 - unit_of_measurement: "%" - mode: slider - device_class: humidity - on_value: - - logger.log: - format: Number changed to %f - args: [x] - set_action: - - logger.log: - format: Template Number set to %f - args: [x] - - number.set: - id: template_number_id - value: 50 - - number.to_min: template_number_id - - number.to_min: - id: template_number_id - - number.to_max: template_number_id - - number.to_max: - id: template_number_id - - number.increment: template_number_id - - number.increment: - id: template_number_id - cycle: false - - number.decrement: template_number_id - - number.decrement: - id: template_number_id - cycle: false - - number.operation: - id: template_number_id - operation: Increment - cycle: false - - number.operation: - id: template_number_id - operation: !lambda "return NUMBER_OP_INCREMENT;" - cycle: !lambda "return false;" - - - id: modbus_numbertest - platform: modbus_controller - modbus_controller_id: modbus_controller_test - name: ModbusNumber - address: 0x9002 - value_type: U_WORD - lambda: "return x * 1.0;" - write_lambda: |- - return x * 1.0 ; - multiply: 1.0 - -select: - - platform: template - name: My template select - id: template_select_id - optimistic: true - initial_option: two - restore_value: true - on_value: - - logger.log: - format: Select changed to %s (index %d)" - args: ["x.c_str()", "i"] - set_action: - - logger.log: - format: Template Select set to %s - args: ["x.c_str()"] - - select.set: - id: template_select_id - option: two - - select.first: template_select_id - - select.last: - id: template_select_id - - select.previous: template_select_id - - select.next: - id: template_select_id - cycle: false - - select.operation: - id: template_select_id - operation: Previous - cycle: false - - select.operation: - id: template_select_id - operation: !lambda "return SELECT_OP_PREVIOUS;" - cycle: !lambda "return true;" - - select.set_index: - id: template_select_id - index: 1 - - select.set_index: - id: template_select_id - index: !lambda "return 1 + 1;" - options: - - one - - two - - three - - - platform: modbus_controller - name: Modbus Select Register 1000 - address: 1000 - value_type: U_WORD - optionsmap: - "Zero": 0 - "One": 1 - "Two": 2 - "Three": 3 - -sensor: - - platform: adc - id: adc_sensor_p32 - name: ADC pin 32 - pin: - allow_other_uses: true - number: 32 - attenuation: 11db - update_interval: 1s - - platform: internal_temperature - name: Internal Temperature - - platform: selec_meter - total_active_energy: - name: SelecEM2M Total Active Energy - import_active_energy: - name: SelecEM2M Import Active Energy - export_active_energy: - name: SelecEM2M Export Active Energy - total_reactive_energy: - name: SelecEM2M Total Reactive Energy - import_reactive_energy: - name: SelecEM2M Import Reactive Energy - export_reactive_energy: - name: SelecEM2M Export Reactive Energy - apparent_energy: - name: SelecEM2M Apparent Energy - active_power: - name: SelecEM2M Active Power - reactive_power: - name: SelecEM2M Reactive Power - apparent_power: - name: SelecEM2M Apparent Power - voltage: - name: SelecEM2M Voltage - current: - name: SelecEM2M Current - power_factor: - name: SelecEM2M Power Factor - frequency: - name: SelecEM2M Frequency - maximum_demand_active_power: - name: SelecEM2M Maximum Demand Active Power - disabled_by_default: true - maximum_demand_reactive_power: - name: SelecEM2M Maximum Demand Reactive Power - disabled_by_default: true - maximum_demand_apparent_power: - name: SelecEM2M Maximum Demand Apparent Power - disabled_by_default: true - - - id: modbus_sensortest - platform: modbus_controller - modbus_controller_id: modbus_controller_test - address: 0x331A - register_type: read - value_type: U_WORD - - - platform: t6615 - uart_id: uart_2 - co2: - name: CO2 Sensor - - - platform: sen5x - id: sen54 - 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 - algorithm_tuning: - index_offset: 100 - learning_time_offset_hours: 12 - learning_time_gain_hours: 12 - gating_max_duration_minutes: 180 - std_initial: 50 - gain_factor: 230 - temperature_compensation: - offset: 0 - normalized_offset_slope: 0 - time_constant: 0 - auto_cleaning_interval: 604800s - acceleration_mode: low - store_baseline: true - address: 0x69 - - platform: mcp9600 - thermocouple_type: K - hot_junction: - name: Thermocouple Temperature - cold_junction: - name: Ambient Temperature - - - platform: ezo_pmp - current_volume_dosed: - name: Current Volume Dosed - total_volume_dosed: - name: Total Volume Dosed - absolute_total_volume_dosed: - name: Absolute Total Volume Dosed - pump_voltage: - name: Pump Voltage - last_volume_requested: - name: Last Volume Requested - max_flow_rate: - name: Max Flow Rate - - - platform: vbus - model: deltasol c - temperature_3: - name: Temperature 3 - operating_hours_1: - name: Operating Hours 1 - heat_quantity: - name: Heat Quantity - time: - name: System Time - - - platform: debug - free: - name: "Heap Free" - block: - name: "Heap Max Block" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" - - - platform: vbus - model: custom - command: 0x100 - source: 0x1234 - dest: 0x10 - sensors: - - id: vcustom - name: VBus Custom Sensor - lambda: return x[0] / 10.0; - - - platform: kuntze - ph: - name: Kuntze pH - temperature: - name: Kuntze temperature - - - platform: ade7953_i2c - irq_pin: - allow_other_uses: true - number: 16 - voltage: - name: ADE7953 Voltage - current_a: - name: ADE7953 Current A - current_b: - name: ADE7953 Current B - power_factor_a: - name: "ADE7953 Power Factor A" - power_factor_b: - name: "ADE7953 Power Factor B" - apparent_power_a: - name: "ADE7953 Apparent Power A" - apparent_power_b: - name: "ADE7953 Apparent Power B" - active_power_a: - name: ADE7953 Active Power A - active_power_b: - name: ADE7953 Active Power B - reactive_power_a: - name: "ADE7953 Reactive Power A" - reactive_power_b: - name: "ADE7953 Reactive Power B" - update_interval: 1s - - - platform: ade7953_spi - spi_id: spi_1 - cs_pin: 04 - irq_pin: - allow_other_uses: true - number: 16 - voltage: - name: ADE7953 Voltage - current_a: - name: ADE7953 Current A - current_b: - name: ADE7953 Current B - power_factor_a: - name: "ADE7953 Power Factor A" - power_factor_b: - name: "ADE7953 Power Factor B" - apparent_power_a: - name: "ADE7953 Apparent Power A" - apparent_power_b: - name: "ADE7953 Apparent Power B" - active_power_a: - name: ADE7953 Active Power A - active_power_b: - name: ADE7953 Active Power B - reactive_power_a: - name: "ADE7953 Reactive Power A" - reactive_power_b: - name: "ADE7953 Reactive Power B" - update_interval: 1s - -script: - - id: automation_test - then: - - repeat: - count: 5 - then: - - logger.log: looping! - - - id: zero_repeat_test - then: - - repeat: - count: !lambda "return 0;" - then: - - logger.log: shouldn't see mee! - -switch: - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_switch_test - register_type: coil - address: 2 - bitmask: 1 - - - platform: tm1638 - id: Led0 - led: 0 - name: TM1638Led0 - - - platform: tm1638 - id: Led1 - led: 1 - name: TM1638Led1 - - - platform: tm1638 - id: Led2 - led: 2 - name: TM1638Led2 - - - platform: tm1638 - id: Led3 - led: 3 - name: TM1638Led3 - -display: - - platform: tm1638 - id: primarydisplay - stb_pin: - allow_other_uses: true - number: 5 # TM1638 STB - clk_pin: 18 # TM1638 CLK - dio_pin: 23 # TM1638 DIO - update_interval: 5s - intensity: 5 - lambda: |- - it.print("81818181"); - -time: - - platform: pcf85063 - - platform: pcf8563 - -text_sensor: - - platform: ezo_pmp - dosing_mode: - name: Dosing Mode - calibration_status: - name: Calibration Status - on_value: - - ezo_pmp.dose_volume: - id: hcl_pump - volume: 10 - - ezo_pmp.dose_volume_over_time: - id: hcl_pump - volume: 10 - duration: 2 - - ezo_pmp.dose_with_constant_flow_rate: - id: hcl_pump - volume_per_minute: 10 - duration: 2 - - ezo_pmp.set_calibration_volume: - id: hcl_pump - volume: 10 - - ezo_pmp.find: hcl_pump - - ezo_pmp.dose_continuously: hcl_pump - - ezo_pmp.clear_total_volume_dosed: hcl_pump - - ezo_pmp.clear_calibration: hcl_pump - - ezo_pmp.pause_dosing: hcl_pump - - ezo_pmp.stop_dosing: hcl_pump - - ezo_pmp.arbitrary_command: - id: hcl_pump - command: D,? - -sn74hc165: - id: sn74hc165_hub - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - load_pin: - number: GPIO27 - clock_inhibit_pin: - number: GPIO26 - sr_count: 4 - -matrix_keypad: - id: keypad - rows: - - pin: - allow_other_uses: true - number: 21 - - pin: 19 - columns: - - pin: - allow_other_uses: true - number: 17 - - pin: - allow_other_uses: true - number: 16 - keys: "1234" - -key_collector: - - id: reader - source_id: keypad - min_length: 4 - max_length: 4 - -light: - - platform: esp32_rmt_led_strip - id: led_strip - pin: - allow_other_uses: true - number: 13 - num_leds: 60 - rmt_channel: 6 - rgb_order: GRB - chipset: ws2812 - - platform: esp32_rmt_led_strip - id: led_strip2 - pin: - allow_other_uses: true - number: 15 - num_leds: 60 - rmt_channel: 2 - rgb_order: RGB - bit0_high: 100us - bit0_low: 100us - bit1_high: 100us - bit1_low: 100us diff --git a/tests/test2.yaml b/tests/test2.yaml deleted file mode 100644 index 92977697c1..0000000000 --- a/tests/test2.yaml +++ /dev/null @@ -1,879 +0,0 @@ ---- -esphome: - name: $devicename - build_path: build/test2 - -esp32: - board: esp32dev - flash_size: 8MB - -globals: - - id: my_global_string - type: std::string - restore_value: true - max_restore_data_length: 70 - initial_value: '"DefaultValue"' - -substitutions: - devicename: test2 - -ethernet: - type: LAN8720 - mdc_pin: - allow_other_uses: true - number: GPIO23 - mdio_pin: - allow_other_uses: true - number: GPIO25 - clk_mode: GPIO0_IN - phy_addr: 0 - power_pin: - allow_other_uses: true - number: GPIO25 - manual_ip: - static_ip: 192.168.178.56 - gateway: 192.168.178.1 - subnet: 255.255.255.0 - domain: .local - -network: - enable_ipv6: true - -mdns: - disabled: true - -api: - -i2c: - sda: - allow_other_uses: true - number: 21 - scl: - allow_other_uses: true - number: 22 - scan: false - -spi: - clk_pin: - allow_other_uses: true - number: GPIO21 - mosi_pin: - allow_other_uses: true - number: GPIO22 - miso_pin: - allow_other_uses: true - number: GPIO23 - -uart: - tx_pin: - allow_other_uses: true - number: GPIO22 - rx_pin: - allow_other_uses: true - number: GPIO23 - baud_rate: 115200 - # Specifically added for testing debug with no after: definition. - debug: - dummy_receiver: false - direction: rx - sequence: - - lambda: UARTDebug::log_hex(direction, bytes, ':'); - -safe_mode: - -ota: - - platform: esphome - port: 3286 - -logger: - level: DEBUG - -debug: - -deep_sleep: - run_duration: - default: 20s - gpio_wakeup_reason: 10s - touch_wakeup_reason: 15s - sleep_duration: 50s - wakeup_pin: - allow_other_uses: true - number: GPIO2 - wakeup_pin_mode: INVERT_WAKEUP - -as3935_i2c: - irq_pin: - allow_other_uses: true - number: GPIO12 - -mcp3008: - - id: mcp3008_hub - cs_pin: - allow_other_uses: true - number: GPIO12 - -output: - - platform: ac_dimmer - id: dimmer1 - gate_pin: GPIO5 - zero_cross_pin: - allow_other_uses: true - number: GPIO12 - -sensor: - - platform: homeassistant - entity_id: sensor.hello_world - id: ha_hello_world - - platform: homeassistant - entity_id: climate.living_room - attribute: temperature - id: ha_hello_world_temperature - - platform: ble_rssi - mac_address: AC:37:43:77:5F:4C - name: BLE Google Home Mini RSSI value - - platform: ble_rssi - service_uuid: 11aa - name: BLE Test Service 16 - - platform: ble_rssi - service_uuid: "11223344" - name: BLE Test Service 32 - - platform: ble_rssi - service_uuid: 11223344-5566-7788-99aa-bbccddeeff00 - name: BLE Test Service 128 - - platform: ble_rssi - service_uuid: 11223344-5566-7788-99aa-bbccddeeff00 - name: BLE Test iBeacon UUID - - platform: b_parasite - mac_address: F0:CA:F0:CA:01:01 - humidity: - name: b-parasite Air Humidity - temperature: - name: b-parasite Air Temperature - moisture: - name: b-parasite Soil Moisture - battery_voltage: - name: b-parasite Battery Voltage - illuminance: - name: b-parasite Illuminance - - platform: senseair - id: senseair0 - co2: - name: SenseAir CO2 Value - on_value: - then: - - senseair.background_calibration: senseair0 - - senseair.background_calibration_result: senseair0 - - senseair.abc_get_period: senseair0 - - senseair.abc_enable: senseair0 - - senseair.abc_disable: senseair0 - update_interval: 15s - - platform: ruuvitag - mac_address: FF:56:D3:2F:7D:E8 - humidity: - name: RuuviTag Humidity - temperature: - name: RuuviTag Temperature - pressure: - name: RuuviTag Pressure - acceleration_x: - name: RuuviTag Acceleration X - acceleration_y: - name: RuuviTag Acceleration Y - acceleration_z: - name: RuuviTag Acceleration Z - battery_voltage: - name: RuuviTag Battery Voltage - tx_power: - name: RuuviTag TX Power - movement_counter: - name: RuuviTag Movement Counter - measurement_sequence_number: - name: RuuviTag Measurement Sequence Number - - platform: as3935 - lightning_energy: - name: Lightning Energy - distance: - name: Distance Storm - - platform: xiaomi_hhccjcy01 - mac_address: 94:2B:FF:5C:91:61 - temperature: - name: Xiaomi HHCCJCY01 Temperature - moisture: - name: Xiaomi HHCCJCY01 Moisture - illuminance: - name: Xiaomi HHCCJCY01 Illuminance - conductivity: - name: Xiaomi HHCCJCY01 Soil Conductivity - battery_level: - name: Xiaomi HHCCJCY01 Battery Level - - platform: xiaomi_hhccjcy10 - mac_address: DD:25:6D:E4:FF:8F - temperature: - name: "Xiaomi HHCCJCY10 Temperature" - moisture: - name: "Xiaomi HHCCJCY10 Moisture" - illuminance: - name: "Xiaomi HHCCJCY10 Illuminance" - conductivity: - name: "Xiaomi HHCCJCY10 Soil Conductivity" - battery_level: - name: "Xiaomi HHCCJCY10 Battery Level" - - platform: xiaomi_lywsdcgq - mac_address: 7A:80:8E:19:36:BA - temperature: - name: Xiaomi LYWSDCGQ Temperature - humidity: - name: Xiaomi LYWSDCGQ Humidity - battery_level: - name: Xiaomi LYWSDCGQ Battery Level - - platform: xiaomi_lywsd02 - mac_address: 3F:5B:7D:82:58:4E - temperature: - name: Xiaomi LYWSD02 Temperature - humidity: - name: Xiaomi LYWSD02 Humidity - battery_level: - name: Xiaomi LYWSD02 Battery Level - - platform: xiaomi_cgg1 - mac_address: 7A:80:8E:19:36:BA - temperature: - name: Xiaomi CGG1 Temperature - humidity: - name: Xiaomi CGG1 Humidity - battery_level: - name: Xiaomi CGG1 Battery Level - - platform: xiaomi_gcls002 - mac_address: 94:2B:FF:5C:91:61 - temperature: - name: GCLS02 Temperature - moisture: - name: GCLS02 Moisture - conductivity: - name: GCLS02 Soil Conductivity - illuminance: - name: GCLS02 Illuminance - - platform: xiaomi_hhccpot002 - mac_address: 94:2B:FF:5C:91:61 - moisture: - name: HHCCPOT002 Moisture - conductivity: - name: HHCCPOT002 Soil Conductivity - - platform: xiaomi_lywsd03mmc - mac_address: A4:C1:38:4E:16:78 - bindkey: e9efaa6873f9f9c87a5e75a5f814801c - temperature: - name: Xiaomi LYWSD03MMC Temperature - humidity: - name: Xiaomi LYWSD03MMC Humidity - battery_level: - name: Xiaomi LYWSD03MMC Battery Level - - platform: xiaomi_cgd1 - mac_address: A4:C1:38:D1:61:7D - bindkey: c99d2313182473b38001086febf781bd - temperature: - name: Xiaomi CGD1 Temperature - humidity: - name: Xiaomi CGD1 Humidity - battery_level: - name: Xiaomi CGD1 Battery Level - - platform: xiaomi_jqjcy01ym - mac_address: 7A:80:8E:19:36:BA - temperature: - name: JQJCY01YM Temperature - humidity: - name: JQJCY01YM Humidity - formaldehyde: - name: JQJCY01YM Formaldehyde - battery_level: - name: JQJCY01YM Battery Level - - platform: xiaomi_mhoc303 - mac_address: E7:50:59:32:A0:1C - temperature: - name: MHO-C303 Temperature - humidity: - name: MHO-C303 Humidity - battery_level: - name: MHO-C303 Battery Level - - platform: atc_mithermometer - mac_address: A4:C1:38:4E:16:78 - temperature: - name: ATC Temperature - humidity: - name: ATC Humidity - battery_level: - name: ATC Battery-Level - battery_voltage: - name: ATC Battery-Voltage - - platform: pvvx_mithermometer - mac_address: A4:C1:38:4E:16:78 - temperature: - name: PVVX Temperature - humidity: - name: PVVX Humidity - battery_level: - name: PVVX Battery-Level - battery_voltage: - name: PVVX Battery-Voltage - - platform: inkbird_ibsth1_mini - mac_address: 38:81:D7:0A:9C:11 - temperature: - name: Inkbird IBS-TH1 Temperature - humidity: - name: Inkbird IBS-TH1 Humidity - battery_level: - name: Inkbird IBS-TH1 Battery Level - - platform: xiaomi_rtcgq02lm - id: motion_rtcgq02lm - battery_level: - name: Mi Motion Sensor 2 Battery level - - platform: ltr390 - uv: - name: LTR390 UV - uv_index: - name: LTR390 UVI - light: - name: LTR390 Light - ambient_light: - name: LTR390 ALS - gain: X3 - resolution: 18 - window_correction_factor: 1.0 - address: 0x53 - update_interval: 60s - - platform: sgp4x - voc: - name: VOC Index - id: sgp40_voc_index - algorithm_tuning: - index_offset: 100 - learning_time_offset_hours: 12 - learning_time_gain_hours: 12 - gating_max_duration_minutes: 180 - std_initial: 50 - gain_factor: 230 - nox: - name: NOx - algorithm_tuning: - index_offset: 100 - learning_time_offset_hours: 12 - learning_time_gain_hours: 12 - gating_max_duration_minutes: 180 - std_initial: 50 - gain_factor: 230 - update_interval: 5s - - platform: mcp3008 - update_interval: 5s - mcp3008_id: mcp3008_hub - id: freezer_temp_source - reference_voltage: 3.19 - number: 0 - - id: airthingswp - platform: airthings_wave_plus - ble_client_id: airthings01 - update_interval: 5min - battery_update_interval: 12h - temperature: - name: Wave Plus Temperature - radon: - name: Wave Plus Radon - radon_long_term: - name: Wave Plus Radon Long Term - pressure: - name: Wave Plus Pressure - humidity: - name: Wave Plus Humidity - co2: - name: Wave Plus CO2 - tvoc: - name: Wave Plus VOC - battery_voltage: - name: Wave Plus Battery Voltage - - id: airthingswm - platform: airthings_wave_mini - ble_client_id: airthingsmini01 - update_interval: 5min - battery_update_interval: 12h - temperature: - name: Wave Mini Temperature - humidity: - name: Wave Mini Humidity - pressure: - name: Wave Mini Pressure - tvoc: - name: Wave Mini VOC - battery_voltage: - name: Wave Mini Battery Voltage - - platform: ina260 - address: 0x40 - current: - name: INA260 Current - power: - name: INA260 Power - bus_voltage: - name: INA260 Voltage - update_interval: 60s - - platform: radon_eye_rd200 - ble_client_id: radon_eye_ble_id - update_interval: 10min - radon: - name: RD200 Radon - radon_long_term: - name: RD200 Radon Long Term - - platform: mopeka_pro_check - mac_address: D3:75:F2:DC:16:91 - tank_type: CUSTOM - custom_distance_full: 40cm - custom_distance_empty: 10mm - temperature: - name: Propane test temp - level: - name: Propane test level - distance: - name: Propane test distance - battery_level: - name: Propane test battery level - - platform: ufire_ec - id: ufire_ec_board - ec: - name: Ufire EC - temperature_sensor: ha_hello_world_temperature - temperature_compensation: 20.0 - temperature_coefficient: 0.019 - - platform: ufire_ise - id: ufire_ise_board - temperature_sensor: ha_hello_world_temperature - ph: - name: Ufire pH - - platform: mics_4514 - update_interval: 60s - nitrogen_dioxide: - name: MICS-4514 NO2 - carbon_monoxide: - name: MICS-4514 CO - methane: - name: MICS-4514 CH4 - hydrogen: - name: MICS-4514 H2 - ethanol: - name: MICS-4514 C2H5OH - ammonia: - name: MICS-4514 NH3 - - platform: mopeka_std_check - mac_address: D3:75:F2:DC:16:91 - tank_type: CUSTOM - custom_distance_full: 40cm - custom_distance_empty: 10mm - temperature: - name: Propane test temp - level: - name: Propane test level - distance: - name: Propane test distance - battery_level: - name: Propane test battery level - - platform: duty_time - id: duty_time1 - name: Test Duty Time - restore: true - last_time: - name: Test Last Duty Time Sensor - sensor: ha_hello_world_binary - - platform: duty_time - id: duty_time2 - name: Test Duty Time 2 - restore: false - lambda: "return true;" - -time: - - platform: homeassistant - on_time: - - at: "16:00:00" - then: - - logger.log: It's 16:00 - - if: - condition: - - sensor.duty_time.is_running: duty_time2 - then: - - sensor.duty_time.start: duty_time1 - - if: - condition: - - sensor.duty_time.is_not_running: duty_time1 - then: - - sensor.duty_time.stop: duty_time2 - - sensor.duty_time.reset: duty_time1 - -esp32_touch: - setup_mode: true - -binary_sensor: - - platform: homeassistant - entity_id: binary_sensor.hello_world - id: ha_hello_world_binary - - platform: homeassistant - entity_id: binary_sensor.hello - attribute: world - id: ha_hello_world_binary_attribute - - platform: ble_presence - mac_address: AC:37:43:77:5F:4C - name: ESP32 BLE Tracker Google Home Mini - timeout: 30s - - platform: ble_presence - service_uuid: 11aa - name: BLE Test Service 16 Presence - - platform: ble_presence - service_uuid: "11223344" - name: BLE Test Service 32 Presence - - platform: ble_presence - service_uuid: 11223344-5566-7788-99aa-bbccddeeff00 - name: BLE Test Service 128 Presence - - platform: ble_presence - ibeacon_uuid: 11223344-5566-7788-99aa-bbccddeeff00 - ibeacon_major: 100 - ibeacon_minor: 1 - name: BLE Test iBeacon Presence - - platform: esp32_touch - name: ESP32 Touch Pad GPIO27 - pin: GPIO27 - threshold: 1000 - - platform: as3935 - name: Storm Alert - - platform: xiaomi_mue4094rt - name: MUE4094RT Motion - mac_address: 7A:80:8E:19:36:BA - timeout: 5s - - platform: xiaomi_mjyd02yla - name: MJYD02YL-A Motion - mac_address: 50:EC:50:CD:32:02 - bindkey: 48403ebe2d385db8d0c187f81e62cb64 - idle_time: - name: MJYD02YL-A Idle Time - light: - name: MJYD02YL-A Light Status - battery_level: - name: MJYD02YL-A Battery Level - - platform: xiaomi_wx08zm - name: WX08ZM Activation State - mac_address: 74:a3:4a:b5:07:34 - tablet: - name: WX08ZM Tablet Resource - battery_level: - name: WX08ZM Battery Level - - platform: xiaomi_cgpr1 - name: CGPR1 Motion - mac_address: "12:34:56:12:34:56" - bindkey: 48403ebe2d385db8d0c187f81e62cb64 - battery_level: - name: CGPR1 battery Level - idle_time: - name: CGPR1 Idle Time - illuminance: - name: CGPR1 Illuminance - - platform: xiaomi_rtcgq02lm - id: motion_rtcgq02lm - motion: - name: Mi Motion Sensor 2 - light: - name: Mi Motion Sensor 2 Light - button: - name: Mi Motion Sensor 2 Button - - platform: gpio - id: gpio_set_retry_test - pin: - allow_other_uses: true - number: GPIO9 - on_press: - then: - - lambda: |- - App.scheduler.set_retry(id(gpio_set_retry_test), "set_retry_test", 100, 3, [](const uint8_t remaining) { - return remaining ? RetryResult::RETRY : RetryResult::DONE; // just to reference both symbols - }, 5.0f); - -esp32_ble_tracker: - on_ble_advertise: - - mac_address: - - AA:BB:CC:DD:EE:FF - - FF:EE:DD:CC:BB:AA - then: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The device address (%s) exists in list", x.address_str().c_str()); - # yamllint enable rule:line-length - - mac_address: AC:37:43:77:5F:4C - then: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The device address is %s", x.address_str().c_str()); - # yamllint enable rule:line-length - - then: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The device address is %s", x.address_str().c_str()); - # yamllint enable rule:line-length - on_ble_service_data_advertise: - - service_uuid: ABCD - then: - - lambda: !lambda |- - ESP_LOGD("main", "Length of service data is %i", x.size()); - on_ble_manufacturer_data_advertise: - - manufacturer_id: ABCD - then: - - lambda: !lambda |- - ESP_LOGD("main", "Length of manufacturer data is %i", x.size()); - -ble_client: - - mac_address: 01:02:03:04:05:06 - id: airthings01 - - mac_address: 01:02:03:04:05:06 - id: airthingsmini01 - - mac_address: 01:02:03:04:05:06 - id: radon_eye_ble_id - -airthings_ble: - -radon_eye_ble: - -ruuvi_ble: - -xiaomi_ble: - -mopeka_ble: - -bluetooth_proxy: - active: true - -xiaomi_rtcgq02lm: - - id: motion_rtcgq02lm - mac_address: 01:02:03:04:05:06 - bindkey: "48403ebe2d385db8d0c187f81e62cb64" - -status_led: - pin: - allow_other_uses: true - number: GPIO2 - -text_sensor: - - platform: version - name: ESPHome Version - icon: mdi:icon - id: version_sensor - on_value: - - if: - condition: - - api.connected: - then: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The state is %s=%s", x.c_str(), id(version_sensor).state.c_str()); - # yamllint enable rule:line-length - - script.execute: my_script - - script.execute: - id: my_script_with_params - prefix: Running my_script_with_params - param2: 100 - param3: true - - script.execute: - id: my_script_with_params - prefix: Running my_script_with_params using lambda parameters - param2: !lambda return 200; - param3: !lambda return true; - - homeassistant.service: - service: notify.html5 - data: - title: New Humidity - data_template: - message: The humidity is {{ my_variable }}%. - variables: - my_variable: |- - return id(version_sensor).state; - my_variable_str: |- - return "Hello World"; - - homeassistant.service: - service: light.turn_on - data: - entity_id: light.my_light - - homeassistant.tag_scanned: - tag: 1234-abcd - - homeassistant.tag_scanned: 1234-abcd - - deep_sleep.enter: - sleep_duration: 30min - - deep_sleep.enter: - sleep_duration: !lambda "return 30 * 60 * 1000;" - - platform: template - name: Template Text Sensor - lambda: |- - return {"Hello World"}; - filters: - - to_upper: - - to_lower: - - append: xyz - - prepend: abcd - - substitute: - - Hello -> Goodbye - - map: - - red -> green - - lambda: 'return {"1234"};' - - platform: homeassistant - entity_id: sensor.hello_world2 - id: ha_hello_world2 - - platform: homeassistant - entity_id: sensor.hello_world3 - id: ha_hello_world3 - attribute: some_attribute - - platform: ble_scanner - name: Scanner - -script: - - id: my_script - mode: single - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - - id: my_script_queued - mode: queued - max_runs: 2 - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - - id: my_script_parallel - mode: parallel - max_runs: 2 - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - - id: my_script_restart - mode: restart - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - - id: my_script_with_params - parameters: - prefix: string - param2: int - param3: bool - then: - - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());' - -stepper: - - platform: uln2003 - id: my_stepper - pin_a: - allow_other_uses: true - number: GPIO23 - pin_b: GPIO27 - pin_c: - allow_other_uses: true - number: GPIO25 - pin_d: GPIO26 - sleep_when_done: false - step_mode: HALF_STEP - max_speed: 250 steps/s - - # Optional: - acceleration: inf - deceleration: inf - -interval: - interval: 5s - startup_delay: 10s - then: - - logger.log: Interval Run - -display: - - platform: st7789v - model: LILYGO_T-EMBED_170X320 - spi_mode: mode0 - height: 320 - width: 170 - offset_height: 35 - offset_width: 0 - dc_pin: GPIO13 - reset_pin: - allow_other_uses: true - number: GPIO9 - -image: - - id: binary_image - file: pnglogo.png - type: BINARY - dither: FloydSteinberg - - id: transparent_transparent_image - file: pnglogo.png - type: TRANSPARENT_BINARY - - id: rgba_image - file: pnglogo.png - type: RGBA - resize: 50x50 - - id: rgb24_image - file: pnglogo.png - type: RGB24 - use_transparency: true - - id: rgb565_image - file: pnglogo.png - type: RGB565 - use_transparency: false - - id: web_svg_image - file: https://raw.githubusercontent.com/esphome/esphome-docs/a62d7ab193c1a464ed791670170c7d518189109b/images/logo.svg - resize: 256x48 - type: TRANSPARENT_BINARY - - id: web_tiff_image - file: https://upload.wikimedia.org/wikipedia/commons/b/b6/SIPI_Jelly_Beans_4.1.07.tiff - type: RGB24 - resize: 48x48 - - id: web_redirect_image - file: https://avatars.githubusercontent.com/u/3060199?s=48&v=4 - type: RGB24 - resize: 48x48 - - - id: mdi_alert - file: mdi:alert-circle-outline - resize: 50x50 - - id: another_alert_icon - file: mdi:alert-outline - type: BINARY - -graph: - - id: my_graph - sensor: ha_hello_world_temperature - duration: 1h - width: 100 - height: 100 - -cap1188: - id: cap1188_component - address: 0x29 - touch_threshold: 0x20 - allow_multiple_touches: true - reset_pin: 14 - -switch: - - platform: template - name: Test BLE Write Action - turn_on_action: - - ble_client.ble_write: - id: airthings01 - service_uuid: F61E3BE9-2826-A81B-970A-4D4DECFABBAE - characteristic_uuid: 6490FAFE-0734-732C-8705-91B653A081FC - value: [0x01, 0xab, 0xff] - - ble_client.ble_write: - id: airthings01 - service_uuid: F61E3BE9-2826-A81B-970A-4D4DECFABBAE - characteristic_uuid: 6490FAFE-0734-732C-8705-91B653A081FC - value: !lambda |- - return {0x13, 0x37}; - -esp32_ble_server: - id: ble - manufacturer_data: [0x72, 0x4, 0x00, 0x23] - -text: - - platform: template - name: My Text - id: my_text - min_length: 0 - max_length: 20 - mode: text - pattern: "[a-z]+" - optimistic: true - restore_value: true - initial_value: "Hello World" - - platform: copy - name: My Text Copy - id: my_text_copy - source_id: my_text - mode: password diff --git a/tests/test3.1.yaml b/tests/test3.1.yaml deleted file mode 100644 index c3b078fe67..0000000000 --- a/tests/test3.1.yaml +++ /dev/null @@ -1,734 +0,0 @@ ---- -esphome: - name: $device_name - comment: $device_comment - build_path: build/test3.1 - includes: - - custom.h - -esp8266: - board: d1_mini - -substitutions: - device_name: test3-1 - device_comment: test3-1 device - min_sub: "0.03" - max_sub: "12.0%" - -api: - -wifi: - ssid: "MySSID" - password: "password1" - -network: - enable_ipv6: true - -web_server: - port: 80 - version: 2 - -i2c: - sda: - allow_other_uses: true - number: 4 - scl: - allow_other_uses: true - number: 5 - scan: false - -spi: - clk_pin: - allow_other_uses: true - number: GPIO12 - mosi_pin: - allow_other_uses: true - number: GPIO13 - miso_pin: - allow_other_uses: true - number: GPIO14 - -ota: - - platform: esphome - version: 2 - -logger: - -debug: - -sensor: - - platform: apds9960 - type: proximity - name: APDS9960 Proximity - - platform: vl53l0x - name: VL53L0x Distance - address: 0x29 - update_interval: 60s - enable_pin: - allow_other_uses: true - number: GPIO13 - timeout: 200us - - platform: apds9960 - type: clear - name: APDS9960 Clear - - platform: apds9960 - type: red - name: APDS9960 Red - - platform: apds9960 - type: green - name: APDS9960 Green - - platform: apds9960 - type: blue - name: APDS9960 Blue - - - platform: aht10 - temperature: - name: Temperature - humidity: - name: Humidity - - platform: am2320 - temperature: - name: Temperature - humidity: - name: Humidity - - platform: adc - pin: VCC - id: my_sensor - filters: - - offset: 5.0 - - multiply: 2.0 - - filter_out: NAN - - sliding_window_moving_average: - - exponential_moving_average: - - quantile: - window_size: 5 - send_every: 5 - send_first_at: 3 - quantile: .8 - - lambda: "return 0;" - - delta: 100 - - throttle: 100ms - - debounce: 500s - - timeout: 10min - - timeout: - timeout: 10min - value: 0 - - calibrate_linear: - method: exact - datapoints: - - -1 -> 3 - - 0.0 -> 1.0 - - 1.0 -> 2.0 - - 2.0 -> 3.0 - - calibrate_polynomial: - degree: 3 - datapoints: - - 0 -> 0 - - 100 -> 200 - - 400 -> 500 - - -50 -> -1000 - - -100 -> -10000 - - platform: cd74hc4067 - id: cd74hc4067_0 - number: 0 - sensor: my_sensor - - platform: resistance - sensor: my_sensor - configuration: DOWNSTREAM - resistor: 10kΩ - reference_voltage: 3.3V - name: Resistance - id: resist - - platform: ntc - sensor: resist - name: NTC Sensor - calibration: - b_constant: 3950 - reference_resistance: 10k - reference_temperature: 25°C - - platform: ntc - sensor: resist - name: NTC Sensor2 - calibration: - - 10.0kOhm -> 25°C - - 27.219kOhm -> 0°C - - 14.674kOhm -> 15°C - - platform: ct_clamp - sensor: my_sensor - name: CT Clamp - sample_duration: 500ms - update_interval: 5s - - - platform: tcs34725 - red_channel: - name: Red Channel - green_channel: - name: Green Channel - blue_channel: - name: Blue Channel - clear_channel: - name: Clear Channel - illuminance: - name: Illuminance - color_temperature: - name: Color Temperature - integration_time: 614ms - gain: 60x - - platform: custom - lambda: |- - auto s = new CustomSensor(); - App.register_component(s); - return {s}; - sensors: - - id: custom_sensor - name: Custom Sensor - - - platform: ade7953_i2c - irq_pin: - allow_other_uses: true - number: GPIO16 - voltage: - name: ADE7953 Voltage - id: ade7953_voltage - current_a: - name: ADE7953 Current A - id: ade7953_current_a - current_b: - name: ADE7953 Current B - id: ade7953_current_b - power_factor_a: - name: "ADE7953 Power Factor A" - power_factor_b: - name: "ADE7953 Power Factor B" - apparent_power_a: - name: "ADE7953 Apparent Power A" - apparent_power_b: - name: "ADE7953 Apparent Power B" - active_power_a: - name: ADE7953 Active Power A - active_power_b: - name: ADE7953 Active Power B - reactive_power_a: - name: "ADE7953 Reactive Power A" - reactive_power_b: - name: "ADE7953 Reactive Power B" - update_interval: 1s - - - platform: ade7953_spi - cs_pin: - allow_other_uses: true - number: GPIO04 - irq_pin: - allow_other_uses: true - number: GPIO16 - voltage: - name: ADE7953 Voltage - current_a: - name: ADE7953 Current A - current_b: - name: ADE7953 Current B - power_factor_a: - name: "ADE7953 Power Factor A" - power_factor_b: - name: "ADE7953 Power Factor B" - apparent_power_a: - name: "ADE7953 Apparent Power A" - apparent_power_b: - name: "ADE7953 Apparent Power B" - active_power_a: - name: ADE7953 Active Power A - active_power_b: - name: ADE7953 Active Power B - reactive_power_a: - name: "ADE7953 Reactive Power A" - reactive_power_b: - name: "ADE7953 Reactive Power B" - update_interval: 1s - - - platform: tmp102 - name: TMP102 Temperature - - platform: hm3301 - pm_1_0: - name: PM1.0 - pm_2_5: - name: PM2.5 - pm_10_0: - name: PM10.0 - aqi: - name: AQI - calculation_type: AQI - - platform: ezo - id: ph_ezo - address: 99 - unit_of_measurement: pH - - platform: tof10120 - name: Distance sensor - update_interval: 5s - - - platform: mlx90393 - oversampling: 1 - filter: 0 - gain: 3X - x_axis: - name: mlxxaxis - y_axis: - name: mlxyaxis - z_axis: - name: mlxzaxis - resolution: 17BIT - temperature: - name: mlxtemp - oversampling: 2 - - - platform: adc128s102 - id: adc128s102_channel_0 - channel: 0 - - - platform: ade7880 - irq0_pin: - number: GPIO13 - allow_other_uses: true - irq1_pin: - number: GPIO5 - allow_other_uses: true - reset_pin: - number: GPIO16 - allow_other_uses: true - frequency: 60Hz - phase_a: - name: Channel A - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3116628 - voltage_gain: -757178 - power_gain: -1344457 - phase_angle: 188 - phase_b: - name: Channel B - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3133655 - voltage_gain: -755235 - power_gain: -1345638 - phase_angle: 188 - phase_c: - name: Channel C - voltage: Voltage - current: Current - active_power: Active Power - power_factor: Power Factor - forward_active_energy: Forward Active Energy - reverse_active_energy: Reverse Active Energy - calibration: - current_gain: 3111158 - voltage_gain: -743813 - power_gain: -1351437 - phase_angle: 180 - neutral: - name: Neutral - current: Current - calibration: - current_gain: 3189 - -apds9960: - address: 0x20 - update_interval: 60s - -binary_sensor: - - platform: apds9960 - direction: up - name: APDS9960 Up - device_class: motion - filters: - - invert - - delayed_on: 20ms - - delayed_off: 20ms - - lambda: "return false;" - on_state: - - logger.log: New state - id: my_binary_sensor - - platform: apds9960 - direction: down - name: APDS9960 Down - - platform: apds9960 - direction: left - name: APDS9960 Left - - platform: apds9960 - direction: right - name: APDS9960 Right - - - platform: ttp229_lsf - channel: 1 - name: TTP229 LSF Test - - platform: ttp229_bsf - channel: 1 - name: TTP229 BSF Test - - platform: custom - lambda: |- - auto s = new CustomBinarySensor(); - App.register_component(s); - return {s}; - binary_sensors: - - id: custom_binary_sensor - name: Custom Binary Sensor - - - platform: template - id: cover_toggle - on_press: - then: - - cover.toggle: time_based_cover - - cover.toggle: endstop_cover - - cover.toggle: current_based_cover - -globals: - - id: my_global_string - type: std::string - initial_value: '""' - -text_sensor: - - platform: custom - lambda: |- - auto s = new CustomTextSensor(); - App.register_component(s); - return {s}; - text_sensors: - - id: custom_text_sensor - name: Custom Text Sensor - -sm2135: - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - rgb_current: 20mA - cw_current: 60mA - -grove_tb6612fng: - id: test_motor - address: 0x14 - -switch: - - platform: gpio - id: gpio_switch1 - pin: - mcp23xxx: mcp23017_hub - number: 0 - mode: OUTPUT - interlock: &interlock [gpio_switch1, gpio_switch2, gpio_switch3] - - platform: gpio - id: gpio_switch2 - pin: - mcp23xxx: mcp23008_hub - number: 0 - mode: OUTPUT - interlock: *interlock - - platform: gpio - id: gpio_switch3 - pin: - allow_other_uses: true - number: GPIO1 - interlock: *interlock - - platform: custom - lambda: |- - auto s = new CustomSwitch(); - return {s}; - switches: - - id: custom_switch - name: Custom Switch - - platform: template - name: open_vent - id: open_vent - optimistic: true - on_turn_on: - then: - - grove_tb6612fng.run: - channel: 1 - speed: 255 - direction: BACKWARD - id: test_motor - -custom_component: - lambda: |- - auto s = new CustomComponent(); - s->set_update_interval(15000); - return {s}; - -stepper: - - platform: uln2003 - id: my_stepper - pin_a: - allow_other_uses: true - number: GPIO12 - pin_b: - allow_other_uses: true - number: GPIO13 - pin_c: - allow_other_uses: true - number: GPIO14 - pin_d: - allow_other_uses: true - number: GPIO15 - sleep_when_done: false - step_mode: HALF_STEP - max_speed: 250 steps/s - acceleration: inf - deceleration: inf - - platform: a4988 - id: my_stepper2 - step_pin: - allow_other_uses: true - number: GPIO1 - dir_pin: - allow_other_uses: true - number: GPIO2 - max_speed: 0.1 steps/s - acceleration: 10 steps/s^2 - deceleration: 10 steps/s^2 - -interval: - interval: 5s - then: - - logger.log: Interval Run - - stepper.set_target: - id: my_stepper2 - target: 500 - - stepper.set_target: - id: my_stepper - target: !lambda "return 0;" - - stepper.report_position: - id: my_stepper2 - position: 0 - - stepper.report_position: - id: my_stepper - position: !lambda "return 50/100.0;" - -cover: - - platform: endstop - name: Endstop Cover - id: endstop_cover - stop_action: - - switch.turn_on: gpio_switch1 - open_endstop: my_binary_sensor - open_action: - - switch.turn_on: gpio_switch1 - open_duration: 5min - close_endstop: my_binary_sensor - close_action: - - switch.turn_on: gpio_switch2 - - output.set_level: - id: out - level: 50% - - output.esp8266_pwm.set_frequency: - id: out - frequency: 500.0Hz - - output.esp8266_pwm.set_frequency: - id: out - frequency: !lambda "return 500.0;" - - servo.write: - id: my_servo - level: -100% - - servo.write: - id: my_servo - level: !lambda "return -1.0;" - - delay: 2s - - servo.detach: my_servo - close_duration: 4.5min - max_duration: 10min - - platform: time_based - name: Time Based Cover - id: time_based_cover - stop_action: - - switch.turn_on: gpio_switch1 - open_action: - - switch.turn_on: gpio_switch1 - open_duration: 5min - close_action: - - switch.turn_on: gpio_switch2 - close_duration: 4.5min - - platform: current_based - name: Current Based Cover - id: current_based_cover - open_sensor: ade7953_current_a - open_moving_current_threshold: 0.5 - open_obstacle_current_threshold: 0.8 - open_duration: 12s - open_action: - - switch.turn_on: gpio_switch1 - close_sensor: ade7953_current_b - close_moving_current_threshold: 0.5 - close_obstacle_current_threshold: 0.8 - close_duration: 10s - close_action: - - switch.turn_on: gpio_switch2 - stop_action: - - switch.turn_off: gpio_switch1 - - switch.turn_off: gpio_switch2 - obstacle_rollback: 30% - start_sensing_delay: 0.8s - malfunction_detection: true - malfunction_action: - then: - - logger.log: Malfunction Detected - - platform: template - name: Template Cover with Tilt - tilt_lambda: "return 0.5;" - tilt_action: - - output.set_level: - id: out - level: !lambda "return tilt;" - position_action: - - output.set_level: - id: out - level: !lambda "return pos;" - -output: - - platform: esp8266_pwm - id: out - pin: - number: D3 - frequency: 50Hz - - platform: esp8266_pwm - id: out2 - pin: - allow_other_uses: true - number: D4 - - platform: custom - type: binary - lambda: |- - auto s = new CustomBinaryOutput(); - App.register_component(s); - return {s}; - outputs: - - id: custom_binary - - platform: sigma_delta_output - id: sddac - update_interval: 60s - pin: - allow_other_uses: true - number: D4 - turn_on_action: - then: - - logger.log: "Turned on" - turn_off_action: - then: - - logger.log: "Turned off" - state_change_action: - then: - - logger.log: - format: "Changed state: %d" - args: ["state"] - - platform: custom - type: float - lambda: |- - auto s = new CustomFloatOutput(); - App.register_component(s); - return {s}; - outputs: - - id: custom_float - - platform: slow_pwm - pin: - allow_other_uses: true - number: GPIO5 - id: my_slow_pwm - period: 15s - restart_cycle_on_state_change: false - - platform: sm2135 - id: sm2135_0 - channel: 0 - - platform: sm2135 - id: sm2135_1 - channel: 1 - - platform: sm2135 - id: sm2135_2 - channel: 2 - - platform: sm2135 - id: sm2135_3 - channel: 3 - - platform: sm2135 - id: sm2135_4 - channel: 4 - -mcp23017: - id: mcp23017_hub - -mcp23008: - id: mcp23008_hub - -light: - - platform: hbridge - name: Icicle Lights - pin_a: out - pin_b: out2 - -servo: - id: my_servo - output: out - restore: true - min_level: $min_sub - max_level: $max_sub - -ttp229_lsf: - -ttp229_bsf: - sdo_pin: - allow_other_uses: true - number: D2 - scl_pin: - allow_other_uses: true - number: D1 - -display: - - platform: max7219digit - cs_pin: - allow_other_uses: true - number: GPIO15 - num_chips: 4 - rotate_chip: 0 - intensity: 10 - scroll_mode: STOP - id: my_matrix - lambda: |- - it.printdigit("hello"); - -button: - - platform: output - id: output_button - output: out - duration: 100ms - - platform: wake_on_lan - target_mac_address: 12:34:56:78:90:ab - name: wol_test_1 - id: wol_1 - - platform: factory_reset - name: Restart Button (Factory Default Settings) - -cd74hc4067: - pin_s0: - allow_other_uses: true - number: GPIO12 - pin_s1: - allow_other_uses: true - number: GPIO13 - pin_s2: - allow_other_uses: true - number: GPIO14 - pin_s3: - allow_other_uses: true - number: GPIO15 - -adc128s102: - cs_pin: - allow_other_uses: true - number: GPIO12 diff --git a/tests/test3.yaml b/tests/test3.yaml deleted file mode 100644 index d10413b142..0000000000 --- a/tests/test3.yaml +++ /dev/null @@ -1,1432 +0,0 @@ ---- -esphome: - name: $device_name - comment: $device_comment - build_path: build/test3 - on_boot: - - if: - condition: - - api.connected - - wifi.connected - - time.has_time - then: - - logger.log: Have time - -esp8266: - board: d1_mini - early_pin_init: true - -substitutions: - device_name: test3 - device_comment: test3 device - -api: - port: 8000 - password: pwd - reboot_timeout: 0min - encryption: - key: bOFFzzvfpg5DB94DuBGLXD/hMnhpDKgP9UQyBulwWVU= - services: - - service: hello_world - variables: - name: string - then: - - logger.log: - format: Hello World %s! - args: - - name.c_str() - - service: empty_service - then: - - logger.log: Service Called - - service: all_types - variables: - bool_: bool - int_: int - float_: float - string_: string - then: - - logger.log: Something happened - - service: array_types - variables: - bool_arr: bool[] - int_arr: int[] - float_arr: float[] - string_arr: string[] - then: - - logger.log: - # yamllint disable rule:line-length - format: "Bool: %s (%u), Int: %d (%u), Float: %f (%u), String: %s (%u)" - # yamllint enable rule:line-length - args: - - YESNO(bool_arr[0]) - - bool_arr.size() - - int_arr[0] - - int_arr.size() - - float_arr[0] - - float_arr.size() - - string_arr[0].c_str() - - string_arr.size() - - service: dfplayer_next - then: - - dfplayer.play_next: - - service: dfplayer_previous - then: - - dfplayer.play_previous: - - service: dfplayer_play - variables: - file: int - then: - - dfplayer.play: !lambda "return file;" - - service: dfplayer_play_loop - variables: - file: int - loop_: bool - then: - - dfplayer.play: - file: !lambda "return file;" - loop: !lambda "return loop_;" - - service: dfplayer_play_folder - variables: - folder: int - file: int - then: - - dfplayer.play_folder: - folder: !lambda "return folder;" - file: !lambda "return file;" - - - service: dfplayer_play_loo_folder - variables: - folder: int - then: - - dfplayer.play_folder: - folder: !lambda "return folder;" - loop: true - - - service: dfplayer_set_device - variables: - device: int - then: - - dfplayer.set_device: - device: TF_CARD - - - service: dfplayer_set_volume - variables: - volume: int - then: - - dfplayer.set_volume: !lambda "return volume;" - - service: dfplayer_set_eq - variables: - preset: int - then: - # yamllint disable rule:line-length - - dfplayer.set_eq: !lambda "return static_cast(preset);" - # yamllint enable rule:line-length - - - service: dfplayer_sleep - then: - - dfplayer.sleep - - - service: dfplayer_reset - then: - - dfplayer.reset - - - service: dfplayer_start - then: - - dfplayer.start - - - service: dfplayer_pause - then: - - dfplayer.pause - - - service: dfplayer_stop - then: - - dfplayer.stop - - - service: dfplayer_random - then: - - dfplayer.random - - - service: dfplayer_volume_up - then: - - dfplayer.volume_up - - - service: dfplayer_volume_down - then: - - dfplayer.volume_down - - - service: battery_level_percent - variables: - level_percent: int - then: - - tm1651.set_level_percent: - id: tm1651_battery - level_percent: !lambda "return level_percent;" - - service: battery_level - variables: - level: int - then: - - tm1651.set_level: - id: tm1651_battery - level: !lambda "return level;" - - service: battery_brightness - variables: - brightness: int - then: - - tm1651.set_brightness: - id: tm1651_battery - brightness: !lambda "return brightness;" - - service: battery_turn_on - then: - - tm1651.turn_on: - id: tm1651_battery - - service: battery_turn_on - then: - - tm1651.turn_off: - id: tm1651_battery - - service: pid_set_control_parameters - then: - - climate.pid.set_control_parameters: - id: pid_climate - kp: 1.0 - kd: 1.0 - ki: 1.0 - - service: fingerprint_grow_enroll - variables: - finger_id: int - num_scans: int - then: - - fingerprint_grow.enroll: - finger_id: !lambda "return finger_id;" - num_scans: !lambda "return num_scans;" - - service: fingerprint_grow_cancel_enroll - then: - - fingerprint_grow.cancel_enroll: - - service: fingerprint_grow_delete - variables: - finger_id: int - then: - - fingerprint_grow.delete: - finger_id: !lambda "return finger_id;" - - service: fingerprint_grow_delete_all - then: - - fingerprint_grow.delete_all: - -wifi: - ssid: "MySSID" - password: "password1" - -network: - enable_ipv6: true - -uart: - - id: uart_1 - tx_pin: - number: GPIO1 - inverted: true - allow_other_uses: true - rx_pin: - allow_other_uses: true - number: GPIO3 - baud_rate: 115200 - - id: uart_2 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_3 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 4800 - - id: uart_4 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_5 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_6 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_7 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 38400 - - id: uart_8 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 4800 - parity: NONE - stop_bits: 2 - # Specifically added for testing debug with no options at all. - debug: - - id: uart_9 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_10 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_11 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - - id: uart_12 - tx_pin: - allow_other_uses: true - number: GPIO4 - rx_pin: - allow_other_uses: true - number: GPIO5 - baud_rate: 9600 - -modbus: - uart_id: uart_1 - -vbus: - uart_id: uart_4 - -safe_mode: - num_attempts: 5 - reboot_timeout: 10min - -ota: - - platform: esphome - port: 3286 - -logger: - hardware_uart: UART1 - level: DEBUG - esp8266_store_log_strings_in_flash: true - -debug: - -improv_serial: - next_url: https://esphome.io/?name={{device_name}}&version={{esphome_version}}&ip={{ip_address}} - -deep_sleep: - run_duration: 20s - sleep_duration: 50s - -wled: - -adalight: - -sensor: - - platform: daly_bms - voltage: - name: Battery Voltage - current: - name: Battery Current - battery_level: - name: Battery Level - max_cell_voltage: - name: Max Cell Voltage - max_cell_voltage_number: - name: Max Cell Voltage Number - min_cell_voltage: - name: Min Cell Voltage - min_cell_voltage_number: - name: Min Cell Voltage Number - max_temperature: - name: Max Temperature - max_temperature_probe_number: - name: Max Temperature Probe Number - min_temperature: - name: Min Temperature - min_temperature_probe_number: - name: Min Temperature Probe Number - remaining_capacity: - name: Remaining Capacity - cells_number: - name: Cells Number - temperature_1: - name: Temperature 1 - temperature_2: - name: Temperature 2 - - - platform: homeassistant - entity_id: sensor.hello_world - id: ha_hello_world - - - platform: hydreon_rgxx - model: RG 9 - uart_id: uart_6 - id: hydreon_rg9 - moisture: - name: hydreon_rain - id: hydreon_rain - temperature: - name: hydreon_temperature - disable_led: true - - - platform: hydreon_rgxx - model: RG_15 - uart_id: uart_6 - acc: - name: hydreon_acc - event_acc: - name: hydreon_event_acc - total_acc: - name: hydreon_total_acc - r_int: - name: hydreon_r_int - resolution: low - - - platform: adc - pin: VCC - id: my_sensor - - - platform: binary_sensor_map - name: Binary Sensor Map - type: group - channels: - - binary_sensor: bin1 - value: 10.0 - - binary_sensor: bin2 - value: 15.0 - - binary_sensor: bin3 - value: 100.0 - - - platform: binary_sensor_map - name: Binary Sensor Map - type: sum - channels: - - binary_sensor: bin1 - value: 10.0 - - binary_sensor: bin2 - value: 15.0 - - binary_sensor: bin3 - value: 100.0 - - - platform: binary_sensor_map - name: Binary Sensor Map - type: bayesian - prior: 0.4 - observations: - - binary_sensor: bin1 - prob_given_true: 0.9 - prob_given_false: 0.4 - - binary_sensor: bin2 - prob_given_true: 0.7 - prob_given_false: 0.05 - - binary_sensor: bin3 - prob_given_true: 0.8 - prob_given_false: 0.2 - - - platform: bl0939 - uart_id: uart_8 - voltage: - name: BL0939 Voltage - current_1: - name: BL0939 Current 1 - current_2: - name: BL0939 Current 2 - active_power_1: - name: BL0939 Active Power 1 - active_power_2: - name: BL0939 Active Power 2 - energy_1: - name: BL0939 Energy 1 - energy_2: - name: BL0939 Energy 2 - energy_total: - name: BL0939 Total energy - - platform: bl0940 - uart_id: uart_3 - voltage: - name: BL0940 Voltage - current: - name: BL0940 Current - power: - name: BL0940 Power - energy: - name: BL0940 Energy - internal_temperature: - name: BL0940 Internal temperature - external_temperature: - name: BL0940 External temperature - - platform: bl0942 - uart_id: uart_3 - voltage: - name: BL0942 Voltage - current: - name: BL0942 Current - power: - name: BL0942 Power - energy: - name: BL0942 Energy - frequency: - name: BL0942 Frequency - - platform: pzem004t - uart_id: uart_3 - voltage: - name: PZEM004T Voltage - current: - name: PZEM004T Current - power: - name: PZEM004T Power - - platform: pzemac - id: pzemac1 - voltage: - name: PZEMAC Voltage - current: - name: PZEMAC Current - power: - name: PZEMAC Power - energy: - name: PZEMAC Energy - frequency: - name: PZEMAC Frequency - power_factor: - name: PZEMAC Power Factor - - platform: pzemdc - id: pzemdc1 - voltage: - name: PZEMDC Voltage - current: - name: PZEMDC Current - power: - name: PZEMDC Power - energy: - name: PZEMDC Energy - - platform: pmsx003 - uart_id: uart_9 - type: PMSX003 - pm_1_0: - name: PM 1.0 Concentration - pm_2_5: - name: PM 2.5 Concentration - pm_10_0: - name: PM 10.0 Concentration - pm_1_0_std: - name: PM 1.0 Standard Atmospher Concentration - pm_2_5_std: - name: PM 2.5 Standard Atmospher Concentration - pm_10_0_std: - name: PM 10.0 Standard Atmospher Concentration - pm_0_3um: - name: Particulate Count >0.3um - pm_0_5um: - name: Particulate Count >0.5um - pm_1_0um: - name: Particulate Count >1.0um - pm_2_5um: - name: Particulate Count >2.5um - pm_5_0um: - name: Particulate Count >5.0um - pm_10_0um: - name: Particulate Count >10.0um - update_interval: 30s - - platform: pmsx003 - uart_id: uart_5 - type: PMS5003T - pm_1_0: - name: PM 1.0 Concentration - pm_2_5: - name: PM 2.5 Concentration - pm_10_0: - name: PM 10.0 Concentration - pm_1_0_std: - name: PM 1.0 Standard Atmospher Concentration - pm_2_5_std: - name: PM 2.5 Standard Atmospher Concentration - pm_10_0_std: - name: PM 10.0 Standard Atmospher Concentration - pm_0_3um: - name: Particulate Count >0.3um - pm_0_5um: - name: Particulate Count >0.5um - pm_1_0um: - name: Particulate Count >1.0um - pm_2_5um: - name: Particulate Count >2.5um - temperature: - name: PMS Temperature - humidity: - name: PMS Humidity - - platform: pmsx003 - uart_id: uart_6 - type: PMS5003ST - pm_1_0: - name: PM 1.0 Concentration - pm_2_5: - name: PM 2.5 Concentration - pm_10_0: - name: PM 10.0 Concentration - pm_1_0_std: - name: PM 1.0 Standard Atmospher Concentration - pm_2_5_std: - name: PM 2.5 Standard Atmospher Concentration - pm_10_0_std: - name: PM 10.0 Standard Atmospher Concentration - pm_0_3um: - name: Particulate Count >0.3um - pm_0_5um: - name: Particulate Count >0.5um - pm_1_0um: - name: Particulate Count >1.0um - pm_2_5um: - name: Particulate Count >2.5um - pm_5_0um: - name: Particulate Count >5.0um - pm_10_0um: - name: Particulate Count >10.0um - temperature: - name: PMS Temperature - humidity: - name: PMS Humidity - formaldehyde: - name: PMS Formaldehyde Concentration - - platform: cse7761 - uart_id: uart_7 - voltage: - name: CSE7761 Voltage - current_1: - name: CSE7761 Current 1 - current_2: - name: CSE7761 Current 2 - active_power_1: - name: CSE7761 Active Power 1 - active_power_2: - name: CSE7761 Active Power 2 - - platform: cse7766 - uart_id: uart_3 - voltage: - name: CSE7766 Voltage - current: - name: CSE7766 Current - power: - name: CSE7766 Power - apparent_power: - name: CSE7766 Apparent Power - power_factor: - name: CSE7766 Power Factor - - - platform: fingerprint_grow - fingerprint_count: - name: Fingerprint Count - status: - name: Fingerprint Status - capacity: - name: Fingerprint Capacity - security_level: - name: Fingerprint Security Level - last_finger_id: - name: Fingerprint Last Finger ID - last_confidence: - name: Fingerprint Last Confidence - - platform: sdm_meter - phase_a: - current: - name: Phase A Current - voltage: - name: Phase A Voltage - active_power: - name: Phase A Power - power_factor: - name: Phase A Power Factor - apparent_power: - name: Phase A Apparent Power - reactive_power: - name: Phase A Reactive Power - phase_angle: - name: Phase A Phase Angle - phase_b: - current: - name: Phase B Current - voltage: - name: Phase B Voltage - active_power: - name: Phase B Power - power_factor: - name: Phase B Power Factor - apparent_power: - name: Phase B Apparent Power - reactive_power: - name: Phase B Reactive Power - phase_angle: - name: Phase B Phase Angle - phase_c: - current: - name: Phase C Current - voltage: - name: Phase C Voltage - active_power: - name: Phase C Power - power_factor: - name: Phase C Power Factor - apparent_power: - name: Phase C Apparent Power - reactive_power: - name: Phase C Reactive Power - phase_angle: - name: Phase C Phase Angle - frequency: - name: Frequency - import_active_energy: - name: Import Active Energy - export_active_energy: - name: Export Active Energy - import_reactive_energy: - name: Import Reactive Energy - export_reactive_energy: - name: Export Reactive Energy - - platform: dsmr - energy_delivered_tariff1: - name: dsmr_energy_delivered_tariff1 - - - platform: nextion - id: testnumber - name: testnumber - variable_name: testnumber - - platform: nextion - id: testwave - name: testwave - component_id: 2 - wave_channel_id: 1 - - platform: smt100 - uart_id: uart_10 - counts: - name: Counts - dielectric_constant: - name: Dielectric Constant - temperature: - name: Temperature - moisture: - name: Moisture - voltage: - name: Voltage - update_interval: 60s - - - platform: vbus - model: deltasol c - temperature_1: - name: Temperature 1 - - - platform: kuntze - ph: - name: Kuntze pH - temperature: - name: Kuntze temperature - - - platform: haier - haier_id: haier_climate - compressor_current: - name: Haier AC compressor current - compressor_frequency: - name: Haier AC compressor frequency - expansion_valve_open_degree: - name: Haier AC expansion valve open degree - humidity: - name: Haier AC indoor humidity - indoor_coil_temperature: - name: Haier AC indoor coil temperature - outdoor_coil_temperature: - name: Haier AC outdoor coil temperature - outdoor_defrost_temperature: - name: Haier AC outdoor defrost temperature - outdoor_in_air_temperature: - name: Haier AC outdoor in air temperature - outdoor_out_air_temperature: - name: Haier AC outdoor out air temperature - outdoor_temperature: - name: Haier AC outdoor temperature - power: - name: Haier AC power - -time: - - platform: homeassistant - -binary_sensor: - - platform: daly_bms - charging_mos_enabled: - name: Charging MOS - discharging_mos_enabled: - name: Discharging MOS - - - platform: homeassistant - entity_id: binary_sensor.hello_world - id: ha_hello_world_binary - - - platform: fingerprint_grow - name: Fingerprint Enrolling - - platform: nextion - page_id: 0 - component_id: 2 - name: Nextion Component 2 Touch - - platform: nextion - id: r0_sensor - name: R0 Sensor - component_name: page0.r0 - - - platform: hydreon_rgxx - hydreon_rgxx_id: hydreon_rg9 - too_cold: - name: rg9_toocold - em_sat: - name: rg9_emsat - lens_bad: - name: rg9_lens_bad - - - platform: template - id: pzemac_reset_energy - on_press: - then: - - pzemac.reset_energy: pzemac1 - - platform: template - id: pzemdc_reset_energy - on_press: - then: - - pzemdc.reset_energy: pzemdc1 - - - platform: vbus - model: deltasol_bs_plus - relay1: - name: Relay 1 On - - - platform: gpio - id: bin1 - pin: - allow_other_uses: true - number: 1 - - platform: gpio - id: bin2 - pin: - allow_other_uses: true - number: 2 - - platform: gpio - id: bin3 - pin: - allow_other_uses: true - number: 3 - - - platform: haier - haier_id: haier_climate - compressor_status: - name: Haier AC compressor status - defrost_status: - name: Haier AC defrost status - four_way_valve_status: - name: Haier AC four-way valve status - indoor_electric_heating_status: - name: Haier AC indoor electric heating status - indoor_fan_status: - name: Haier AC indoor fan status - outdoor_fan_status: - name: Haier AC outdoor fan status - -globals: - - id: my_global_string - type: std::string - initial_value: '""' - -remote_receiver: - pin: - allow_other_uses: true - number: GPIO12 - dump: [] - -status_led: - pin: - allow_other_uses: true - number: GPIO2 - -text_sensor: - - platform: daly_bms - status: - name: BMS Status - - platform: version - name: ESPHome Version - icon: mdi:icon - id: version_sensor - on_value: - # yamllint disable rule:line-length - - lambda: !lambda |- - ESP_LOGD("main", "The state is %s=%s", x.c_str(), id(version_sensor).state.c_str()); - # yamllint enable rule:line-length - - script.execute: my_script - - script.wait: my_script - - script.stop: my_script - - homeassistant.service: - service: notify.html5 - data: - title: New Humidity - data_template: - message: The humidity is {{ my_variable }}%. - variables: - my_variable: |- - return id(version_sensor).state; - - platform: template - name: Template Text Sensor - lambda: |- - return {"Hello World"}; - - platform: homeassistant - entity_id: sensor.hello_world2 - id: ha_hello_world2 - - platform: nextion - name: text0 - id: text0 - update_interval: 4s - component_name: text0 - - platform: dsmr - identification: - name: dsmr_identification - p1_version: - name: dsmr_p1_version - -script: - - id: my_script - then: - - lambda: 'ESP_LOGD("main", "Hello World!");' - -switch: - - platform: gpio - id: gpio_switch1 - pin: - allow_other_uses: true - number: 1 - - platform: gpio - id: gpio_switch2 - pin: - allow_other_uses: true - number: 2 - - platform: gpio - id: gpio_switch3 - pin: - allow_other_uses: true - number: 3 - - - platform: nextion - id: r0 - name: R0 Switch - component_name: page0.r0 - -climate: - - platform: bang_bang - name: Bang Bang Climate - sensor: ha_hello_world - humidity_sensor: ha_hello_world - default_target_temperature_low: 18°C - default_target_temperature_high: 24°C - idle_action: - - switch.turn_on: gpio_switch1 - cool_action: - - switch.turn_on: gpio_switch2 - heat_action: - - switch.turn_on: gpio_switch1 - away_config: - default_target_temperature_low: 16°C - default_target_temperature_high: 20°C - - platform: thermostat - name: Thermostat Climate - sensor: ha_hello_world - humidity_sensor: ha_hello_world - preset: - - name: Default Preset - default_target_temperature_low: 18°C - default_target_temperature_high: 24°C - - name: Away - default_target_temperature_low: 16°C - default_target_temperature_high: 20°C - idle_action: - - switch.turn_on: gpio_switch1 - cool_action: - - switch.turn_on: gpio_switch2 - supplemental_cooling_action: - - switch.turn_on: gpio_switch3 - heat_action: - - switch.turn_on: gpio_switch1 - supplemental_heating_action: - - switch.turn_on: gpio_switch3 - dry_action: - - switch.turn_on: gpio_switch2 - fan_only_action: - - switch.turn_on: gpio_switch1 - auto_mode: - - switch.turn_on: gpio_switch2 - off_mode: - - switch.turn_on: gpio_switch1 - heat_mode: - - switch.turn_on: gpio_switch2 - cool_mode: - - switch.turn_on: gpio_switch1 - dry_mode: - - switch.turn_on: gpio_switch2 - fan_only_mode: - - switch.turn_on: gpio_switch1 - fan_mode_auto_action: - - switch.turn_on: gpio_switch2 - fan_mode_on_action: - - switch.turn_on: gpio_switch1 - fan_mode_off_action: - - switch.turn_on: gpio_switch2 - fan_mode_low_action: - - switch.turn_on: gpio_switch1 - fan_mode_medium_action: - - switch.turn_on: gpio_switch2 - fan_mode_high_action: - - switch.turn_on: gpio_switch1 - fan_mode_middle_action: - - switch.turn_on: gpio_switch2 - fan_mode_focus_action: - - switch.turn_on: gpio_switch1 - fan_mode_diffuse_action: - - switch.turn_on: gpio_switch2 - fan_mode_quiet_action: - - switch.turn_on: gpio_switch1 - swing_off_action: - - switch.turn_on: gpio_switch2 - swing_horizontal_action: - - switch.turn_on: gpio_switch1 - swing_vertical_action: - - switch.turn_on: gpio_switch2 - swing_both_action: - - switch.turn_on: gpio_switch1 - startup_delay: true - supplemental_cooling_delta: 2.0 - cool_deadband: 0.5 - cool_overrun: 0.5 - min_cooling_off_time: 300s - min_cooling_run_time: 300s - max_cooling_run_time: 600s - supplemental_heating_delta: 2.0 - heat_deadband: 0.5 - heat_overrun: 0.5 - min_heating_off_time: 300s - min_heating_run_time: 300s - max_heating_run_time: 600s - min_fanning_off_time: 30s - min_fanning_run_time: 30s - min_fan_mode_switching_time: 15s - min_idle_time: 30s - set_point_minimum_differential: 0.5 - fan_only_action_uses_fan_mode_timer: true - fan_only_cooling: true - fan_with_cooling: true - fan_with_heating: true - - platform: pid - id: pid_climate - name: PID Climate Controller - sensor: ha_hello_world - humidity_sensor: ha_hello_world - default_target_temperature: 21°C - heat_output: my_slow_pwm - control_parameters: - kp: 0.0 - ki: 0.0 - kd: 0.0 - max_integral: 0.0 - output_averaging_samples: 1 - derivative_averaging_samples: 1 - deadband_parameters: - threshold_high: 0.4 - threshold_low: -2.0 - kp_multiplier: 0.0 - ki_multiplier: 0.0 - kd_multiplier: 0.0 - deadband_output_averaging_samples: 1 - - platform: haier - id: haier_climate - protocol: hOn - name: Haier AC - uart_id: uart_12 - wifi_signal: true - answer_timeout: 200ms - beeper: true - visual: - min_temperature: 16 °C - max_temperature: 30 °C - temperature_step: - target_temperature: 1 - current_temperature: 0.5 - supported_modes: - - "OFF" - - HEAT_COOL - - COOL - - HEAT - - DRY - - FAN_ONLY - supported_swing_modes: - - "OFF" - - VERTICAL - - HORIZONTAL - - BOTH - supported_presets: - - AWAY - - BOOST - - ECO - - SLEEP - on_alarm_start: - then: - - logger.log: - level: DEBUG - format: 'Alarm activated. Code: %d. Message: "%s"' - args: [code, message] - on_alarm_end: - then: - - logger.log: - level: DEBUG - format: 'Alarm deactivated. Code: %d. Message: "%s"' - args: [code, message] - -sprinkler: - - id: yard_sprinkler_ctrlr - main_switch: Yard Sprinklers - auto_advance_switch: Yard Sprinklers Auto Advance - reverse_switch: Yard Sprinklers Reverse - pump_start_pump_delay: 2s - pump_stop_valve_delay: 4s - pump_switch_off_during_valve_open_delay: true - valve_open_delay: 5s - valves: - - valve_switch: Yard Valve 0 - enable_switch: Enable Yard Valve 0 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - - valve_switch: Yard Valve 1 - enable_switch: Enable Yard Valve 1 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - - valve_switch: Yard Valve 2 - enable_switch: Enable Yard Valve 2 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - - id: garden_sprinkler_ctrlr - main_switch: Garden Sprinklers - auto_advance_switch: Garden Sprinklers Auto Advance - reverse_switch: Garden Sprinklers Reverse - valve_overlap: 5s - valves: - - valve_switch: Garden Valve 0 - enable_switch: Enable Garden Valve 0 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - - valve_switch: Garden Valve 1 - enable_switch: Enable Garden Valve 1 - pump_switch_id: gpio_switch1 - run_duration: 10s - valve_switch_id: gpio_switch2 - -output: - - platform: esp8266_pwm - id: out - pin: - number: D3 - frequency: 50Hz - - platform: esp8266_pwm - id: out2 - pin: - allow_other_uses: true - number: D4 - - platform: slow_pwm - pin: - allow_other_uses: true - number: GPIO5 - id: my_slow_pwm - period: 15s - restart_cycle_on_state_change: false - -e131: - -light: - - platform: neopixelbus - name: Neopixelbus Light - pin: - allow_other_uses: true - number: GPIO1 - type: GRBW - variant: SK6812 - method: ESP8266_UART0 - num_leds: 100 - effects: - - wled: - - adalight: - uart_id: uart_3 - - e131: - universe: 1 - - platform: hbridge - name: Icicle Lights - pin_a: out - pin_b: out2 - - platform: sonoff_d1 - uart_id: uart_2 - use_rm433_remote: false - name: Sonoff D1 Dimmer - id: d1_light - restore_mode: RESTORE_DEFAULT_OFF - - platform: shelly_dimmer - name: "Shelly Dimmer Light" - power: - name: "Shelly Dimmer Power" - voltage: - name: "Shelly Dimmer Voltage" - current: - name: "Shelly Dimmer Current" - max_brightness: 500 - firmware: "51.6" - uart_id: uart_11 - nrst_pin: - number: 5 - allow_other_uses: true - boot0_pin: - number: 4 - allow_other_uses: true - -sim800l: - uart_id: uart_4 - on_sms_received: - - lambda: |- - std::string str; - str = sender; - str = message; - - sim800l.send_sms: - message: hello you - recipient: "+1234" - - sim800l.dial: - recipient: "+1234" - -dfplayer: - uart_id: uart_5 - on_finished_playback: - then: - if: - condition: - not: dfplayer.is_playing - then: - logger.log: Playback finished event -tm1651: - id: tm1651_battery - clk_pin: - allow_other_uses: true - number: D6 - dio_pin: - allow_other_uses: true - number: D5 - -rf_bridge: - uart_id: uart_5 - on_code_received: - - lambda: |- - uint32_t test; - test = data.sync; - test = data.low; - test = data.high; - test = data.code; - - rf_bridge.send_code: - sync: 0x1234 - low: 0x1234 - high: 0x1234 - code: 0x123456 - - rf_bridge.learn - - on_advanced_code_received: - - lambda: |- - uint32_t test; - std::string test_code; - test = data.length; - test = data.protocol; - test_code = data.code; - - rf_bridge.start_advanced_sniffing: - - rf_bridge.stop_advanced_sniffing: - - rf_bridge.send_advanced_code: - length: 0x04 - protocol: 0x01 - code: "ABC123" - - rf_bridge.send_raw: - raw: "AAA5070008001000ABC12355" - -display: - - platform: nextion - uart_id: uart_1 - tft_url: http://esphome.io/default35.tft - update_interval: 5s - on_sleep: - then: - lambda: 'ESP_LOGD("display","Display went to sleep");' - on_wake: - then: - lambda: 'ESP_LOGD("display","Display woke up");' - on_setup: - then: - lambda: 'ESP_LOGD("display","Display setup completed");' - on_page: - then: - lambda: 'ESP_LOGD("display","Display shows new page %u", x);' - -fingerprint_grow: - sensing_pin: - allow_other_uses: true - number: 4 - sensor_power_pin: - allow_other_uses: true - number: 5 - inverted: true - idle_period_to_sleep: 5s - password: 0x12FE37DC - new_password: 0xA65B9840 - on_finger_scan_start: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_start - on_finger_scan_invalid: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_invalid - on_finger_scan_matched: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_matched - data: - finger_id: !lambda "return finger_id;" - confidence: !lambda "return confidence;" - on_finger_scan_unmatched: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_unmatched - on_finger_scan_misplaced: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_finger_scan_misplaced - on_enrollment_scan: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_enrollment_scan - data: - finger_id: !lambda "return finger_id;" - scan_num: !lambda "return scan_num;" - on_enrollment_done: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_node_enrollment_done - data: - finger_id: !lambda "return finger_id;" - on_enrollment_failed: - - homeassistant.event: - event: esphome.${device_name}_fingerprint_grow_enrollment_failed - data: - finger_id: !lambda "return finger_id;" - uart_id: uart_6 - -dsmr: - decryption_key: 00112233445566778899aabbccddeeff - uart_id: uart_6 - max_telegram_length: 1000 - request_pin: - allow_other_uses: true - number: D5 - request_interval: 20s - receive_timeout: 100ms - -daly_bms: - update_interval: 20s - uart_id: uart_1 - -qr_code: - - id: homepage_qr - value: https://esphome.io/index.html - -lightwaverf: - read_pin: - number: 13 - write_pin: - allow_other_uses: true - number: 14 - -alarm_control_panel: - - platform: template - id: alarmcontrolpanel1 - name: Alarm Panel - codes: - - "1234" - requires_code_to_arm: true - arming_home_time: 1s - arming_night_time: 1s - arming_away_time: 15s - pending_time: 15s - trigger_time: 30s - binary_sensors: - - input: bin1 - bypass_armed_home: true - bypass_armed_night: true - on_state: - then: - - lambda: !lambda |- - ESP_LOGD("TEST", "State change %s", alarm_control_panel_state_to_string(id(alarmcontrolpanel1)->get_state())); - - platform: template - id: alarmcontrolpanel2 - name: Alarm Panel - codes: - - "1234" - requires_code_to_arm: true - arming_home_time: 1s - arming_night_time: 1s - arming_away_time: 15s - pending_time: 15s - trigger_time: 30s - binary_sensors: - - input: bin1 - bypass_armed_home: true - bypass_armed_night: true - on_disarmed: - then: - - logger.log: "### DISARMED ###" - on_pending: - then: - - logger.log: "### PENDING ###" - on_arming: - then: - - logger.log: "### ARMING ###" - on_armed_home: - then: - - logger.log: "### ARMED HOME ###" - on_armed_night: - then: - - logger.log: "### ARMED NIGHT ###" - on_armed_away: - then: - - logger.log: "### ARMED AWAY ###" - on_triggered: - then: - - logger.log: "### TRIGGERED ###" - on_cleared: - then: - - logger.log: "### CLEARED ###" diff --git a/tests/test4.yaml b/tests/test4.yaml deleted file mode 100644 index c9e8a27317..0000000000 --- a/tests/test4.yaml +++ /dev/null @@ -1,998 +0,0 @@ ---- -esphome: - name: $devicename - platform: ESP32 - board: nodemcu-32s - build_path: build/test4 - -substitutions: - devicename: test-4 - -ethernet: - type: LAN8720 - mdc_pin: - allow_other_uses: true - number: GPIO23 - mdio_pin: - allow_other_uses: true - number: GPIO25 - clk_mode: GPIO0_IN - phy_addr: 0 - power_pin: - allow_other_uses: true - number: GPIO25 - manual_ip: - static_ip: 192.168.178.56 - gateway: 192.168.178.1 - subnet: 255.255.255.0 - domain: .local - -network: - enable_ipv6: true - -mqtt: - broker: test.mosquitto.org - port: 1883 - discovery: true - discovery_prefix: homeassistant - topic_prefix: - -api: - -i2c: - sda: - allow_other_uses: true - number: 21 - scl: - allow_other_uses: true - number: 22 - scan: false - -spi: - - id: spi_id_1 - clk_pin: - allow_other_uses: true - number: GPIO21 - mosi_pin: - allow_other_uses: true - number: GPIO22 - miso_pin: - allow_other_uses: true - number: GPIO23 - interface: hardware - - id: spi_id_2 - clk_pin: - number: GPIO32 - mosi_pin: - number: GPIO33 - interface: hardware - -uart: - - id: uart115200 - tx_pin: - allow_other_uses: true - number: GPIO22 - rx_pin: - allow_other_uses: true - number: GPIO23 - baud_rate: 115200 - - id: uart9600 - tx_pin: - allow_other_uses: true - number: GPIO25 - rx_pin: - allow_other_uses: true - number: GPIO26 - baud_rate: 9600 - - id: uart_a02yyuw - tx_pin: - allow_other_uses: true - number: GPIO22 - rx_pin: - allow_other_uses: true - number: GPIO23 - baud_rate: 9600 - - id: uart_he60r - tx_pin: - number: GPIO18 - allow_other_uses: true - rx_pin: - number: GPIO36 - allow_other_uses: true - baud_rate: 1200 - parity: EVEN - -safe_mode: - -ota: - - platform: esphome - port: 3286 - -logger: - level: DEBUG - -debug: - -web_server: - ota: false - auth: - username: admin - password: admin - include_internal: true - -time: - - platform: sntp - id: sntp_time - -tuya: - time_id: sntp_time - uart_id: uart115200 - status_pin: - number: GPIO5 - inverted: true - allow_other_uses: true - -select: - - platform: tuya - id: tuya_select - enum_datapoint: 42 - options: - 0: Internal - 1: Floor - 2: Both - -pipsolar: - id: inverter0 - uart_id: uart115200 - -pylontech: - - id: pylontech0 - uart_id: uart115200 - - id: pylontech1 - uart_id: uart115200 - -sx1509: - - id: sx1509_hub - address: 0x3E - -mcp3204: - spi_id: spi_id_1 - cs_pin: - allow_other_uses: true - number: GPIO23 - -dac7678: - address: 0x4A - id: dac7678_hub1 - internal_reference: true - -sensor: - - platform: pylontech - pylontech_id: pylontech0 - battery: 1 - voltage: - id: pyl01_voltage - current: - id: pyl01_current - coulomb: - id: pyl01_soc - mos_temperature: - id: pyl01_mos_temperature - - platform: pylontech - pylontech_id: pylontech1 - battery: 1 - voltage: - id: pyl13_voltage - temperature_low: - id: pyl13_temperature_low - temperature_high: - id: pyl13_temperature_high - voltage_low: - id: pyl13_voltage_low - voltage_high: - id: pyl13_voltage_high - - platform: homeassistant - entity_id: sensor.hello_world - id: ha_hello_world - - platform: tuya - id: tuya_sensor - sensor_datapoint: 1 - - platform: pipsolar - pipsolar_id: inverter0 - grid_rating_voltage: - id: inverter0_grid_rating_voltage - name: inverter0_grid_rating_voltage - grid_rating_current: - id: inverter0_grid_rating_current - name: inverter0_grid_rating_current - ac_output_rating_voltage: - id: inverter0_ac_output_rating_voltage - name: inverter0_ac_output_rating_voltage - ac_output_rating_frequency: - id: inverter0_ac_output_rating_frequency - name: inverter0_ac_output_rating_frequency - ac_output_rating_current: - id: inverter0_ac_output_rating_current - name: inverter0_ac_output_rating_current - ac_output_rating_apparent_power: - id: inverter0_ac_output_rating_apparent_power - name: inverter0_ac_output_rating_apparent_power - ac_output_rating_active_power: - id: inverter0_ac_output_rating_active_power - name: inverter0_ac_output_rating_active_power - battery_rating_voltage: - id: inverter0_battery_rating_voltage - name: inverter0_battery_rating_voltage - battery_recharge_voltage: - id: inverter0_battery_recharge_voltage - name: inverter0_battery_recharge_voltage - battery_under_voltage: - id: inverter0_battery_under_voltage - name: inverter0_battery_under_voltage - battery_bulk_voltage: - id: inverter0_battery_bulk_voltage - name: inverter0_battery_bulk_voltage - battery_float_voltage: - id: inverter0_battery_float_voltage - name: inverter0_battery_float_voltage - battery_type: - id: inverter0_battery_type - name: inverter0_battery_type - current_max_ac_charging_current: - id: inverter0_current_max_ac_charging_current - name: inverter0_current_max_ac_charging_current - current_max_charging_current: - id: inverter0_current_max_charging_current - name: inverter0_current_max_charging_current - input_voltage_range: - id: inverter0_input_voltage_range - name: inverter0_input_voltage_range - output_source_priority: - id: inverter0_output_source_priority - name: inverter0_output_source_priority - charger_source_priority: - id: inverter0_charger_source_priority - name: inverter0_charger_source_priority - parallel_max_num: - id: inverter0_parallel_max_num - name: inverter0_parallel_max_num - machine_type: - id: inverter0_machine_type - name: inverter0_machine_type - topology: - id: inverter0_topology - name: inverter0_topology - output_mode: - id: inverter0_output_mode - name: inverter0_output_mode - battery_redischarge_voltage: - id: inverter0_battery_redischarge_voltage - name: inverter0_battery_redischarge_voltage - pv_ok_condition_for_parallel: - id: inverter0_pv_ok_condition_for_parallel - name: inverter0_pv_ok_condition_for_parallel - pv_power_balance: - id: inverter0_pv_power_balance - name: inverter0_pv_power_balance - grid_voltage: - id: inverter0_grid_voltage - name: inverter0_grid_voltage - grid_frequency: - id: inverter0_grid_frequency - name: inverter0_grid_frequency - ac_output_voltage: - id: inverter0_ac_output_voltage - name: inverter0_ac_output_voltage - ac_output_frequency: - id: inverter0_ac_output_frequency - name: inverter0_ac_output_frequency - ac_output_apparent_power: - id: inverter0_ac_output_apparent_power - name: inverter0_ac_output_apparent_power - ac_output_active_power: - id: inverter0_ac_output_active_power - name: inverter0_ac_output_active_power - output_load_percent: - id: inverter0_output_load_percent - name: inverter0_output_load_percent - bus_voltage: - id: inverter0_bus_voltage - name: inverter0_bus_voltage - battery_voltage: - id: inverter0_battery_voltage - name: inverter0_battery_voltage - battery_charging_current: - id: inverter0_battery_charging_current - name: inverter0_battery_charging_current - battery_capacity_percent: - id: inverter0_battery_capacity_percent - name: inverter0_battery_capacity_percent - inverter_heat_sink_temperature: - id: inverter0_inverter_heat_sink_temperature - name: inverter0_inverter_heat_sink_temperature - pv_input_current_for_battery: - id: inverter0_pv_input_current_for_battery - name: inverter0_pv_input_current_for_battery - pv_input_voltage: - id: inverter0_pv_input_voltage - name: inverter0_pv_input_voltage - battery_voltage_scc: - id: inverter0_battery_voltage_scc - name: inverter0_battery_voltage_scc - battery_discharge_current: - id: inverter0_battery_discharge_current - name: inverter0_battery_discharge_current - battery_voltage_offset_for_fans_on: - id: inverter0_battery_voltage_offset_for_fans_on - name: inverter0_battery_voltage_offset_for_fans_on - eeprom_version: - id: inverter0_eeprom_version - name: inverter0_eeprom_version - pv_charging_power: - id: inverter0_pv_charging_power - name: inverter0_pv_charging_power - - platform: hrxl_maxsonar_wr - name: Rainwater Tank Level - uart_id: uart115200 - filters: - - sliding_window_moving_average: - window_size: 12 - send_every: 12 - - or: - - throttle: 20min - - delta: 0.02 - - platform: mcp3204 - name: MCP3204 Pin 1 - number: 1 - id: mcp_sensor - - platform: copy - source_id: mcp_sensor - name: MCP binary sensor copy - - platform: ufire_ec - id: ufire_ec_board - temperature: - name: Ufire Temperature - ec: - name: Ufire EC - temperature_compensation: 20.0 - temperature_coefficient: 0.019 - - platform: ufire_ise - id: ufire_ise_board - temperature: - name: Ufire Temperature - ph: - name: Ufire pH - - platform: a01nyub - id: a01nyub_sensor - name: "a01nyub Distance" - uart_id: uart9600 - state_topic: "esphome/sensor/a01nyub_sensor/state" - - platform: a02yyuw - id: a02yyuw_sensor - name: "a02yyuw Distance" - uart_id: uart_a02yyuw - state_topic: "esphome/sensor/a02yyuw_sensor/state" - -# -# platform sensor.apds9960 requires component apds9960 -# -# - platform: apds9960 -# type: proximity -# name: APDS9960 Proximity -# - platform: apds9960 -# type: clear -# name: APDS9960 Clear -# - platform: apds9960 -# type: red -# name: APDS9960 Red -# - platform: apds9960 -# type: green -# name: APDS9960 Green -# - platform: apds9960 -# type: blue -# name: APDS9960 Blue - -binary_sensor: - - platform: tuya - id: tuya_binary_sensor - sensor_datapoint: 1 - - platform: pipsolar - pipsolar_id: inverter0 - add_sbu_priority_version: - id: inverter0_add_sbu_priority_version - name: inverter0_add_sbu_priority_version - configuration_status: - id: inverter0_configuration_status - name: inverter0_configuration_status - scc_firmware_version: - id: inverter0_scc_firmware_version - name: inverter0_scc_firmware_version - load_status: - id: inverter0_load_status - name: inverter0_load_status - battery_voltage_to_steady_while_charging: - id: inverter0_battery_voltage_to_steady_while_charging - name: inverter0_battery_voltage_to_steady_while_charging - charging_status: - id: inverter0_charging_status - name: inverter0_charging_status - scc_charging_status: - id: inverter0_scc_charging_status - name: inverter0_scc_charging_status - ac_charging_status: - id: inverter0_ac_charging_status - name: inverter0_ac_charging_status - charging_to_floating_mode: - id: inverter0_charging_to_floating_mode - name: inverter0_charging_to_floating_mode - switch_on: - id: inverter0_switch_on - name: inverter0_switch_on - dustproof_installed: - id: inverter0_dustproof_installed - name: inverter0_dustproof_installed - silence_buzzer_open_buzzer: - id: inverter0_silence_buzzer_open_buzzer - name: inverter0_silence_buzzer_open_buzzer - overload_bypass_function: - id: inverter0_overload_bypass_function - name: inverter0_overload_bypass_function - lcd_escape_to_default: - id: inverter0_lcd_escape_to_default - name: inverter0_lcd_escape_to_default - overload_restart_function: - id: inverter0_overload_restart_function - name: inverter0_overload_restart_function - over_temperature_restart_function: - id: inverter0_over_temperature_restart_function - name: inverter0_over_temperature_restart_function - backlight_on: - id: inverter0_backlight_on - name: inverter0_backlight_on - - platform: template - id: ar1 - lambda: "return {};" - filters: - - autorepeat: - - delay: 2s - time_off: 100ms - time_on: 900ms - - delay: 4s - time_off: 100ms - time_on: 400ms - on_state: - then: - - lambda: 'ESP_LOGI("ar1:", "%d", x);' - - platform: touchscreen - touchscreen_id: xpt_touchscreen - id: touch_key0 - x_min: 80 - x_max: 160 - y_min: 106 - y_max: 212 - on_press: - - logger.log: Touched - - - platform: gpio - name: GPIO SX1509 test - pin: - sx1509: sx1509_hub - number: 3 - - - platform: touchscreen - touchscreen_id: lilygo_touchscreen - id: touch_key1 - x_min: 0 - x_max: 100 - y_min: 0 - y_max: 100 - on_press: - - logger.log: Touched - - platform: gt911 - id: touch_key_911 - index: 0 - - - platform: gpio - name: MaxIn Pin 4 - pin: - max6956: max6956_1 - number: 4 - - mode: - input: true - pullup: true - inverted: false - - - platform: gpio - name: XL9535 Pin 0 - pin: - xl9535: xl9535_hub - number: 0 - mode: - input: true - inverted: false - - - platform: gpio - name: XL9535 Pin 17 - pin: - xl9535: xl9535_hub - number: 17 - mode: - input: true - inverted: false - -climate: - - platform: tuya - id: tuya_climate - switch_datapoint: 1 - target_temperature_datapoint: 3 - current_temperature_multiplier: 0.5 - target_temperature_multiplier: 0.5 - reports_fahrenheit: true - -switch: - - platform: tuya - id: tuya_switch - switch_datapoint: 1 - - platform: pipsolar - pipsolar_id: inverter0 - output_source_priority_utility: - name: inverter0_output_source_priority_utility - output_source_priority_solar: - name: inverter0_output_source_priority_solar - output_source_priority_battery: - name: inverter0_output_source_priority_battery - input_voltage_range: - name: inverter0_input_voltage_range - pv_ok_condition_for_parallel: - name: inverter0_pv_ok_condition_for_parallel - pv_power_balance: - name: inverter0_pv_power_balance - - platform: copy - source_id: tuya_switch - name: Tuya Switch Copy - -light: - - platform: fastled_clockless - id: led_matrix_32x8 - name: led_matrix_32x8 - chipset: WS2812B - pin: - allow_other_uses: true - number: GPIO15 - num_leds: 256 - rgb_order: GRB - default_transition_length: 0s - color_correct: [50%, 50%, 50%] - - platform: tuya - id: tuya_light - switch_datapoint: 1 - dimmer_datapoint: 2 - min_value_datapoint: 3 - color_temperature_datapoint: 4 - min_value: 1 - max_value: 100 - cold_white_color_temperature: 153 mireds - warm_white_color_temperature: 500 mireds - gamma_correct: 1 - -cover: - - platform: tuya - id: tuya_cover - position_datapoint: 2 - - platform: copy - source_id: tuya_cover - name: Tuya Cover copy - - platform: he60r - uart_id: uart_he60r - id: garage_door - name: Garage Door - open_duration: 14s - close_duration: 14s - -display: - - platform: addressable_light - id: led_matrix_32x8_display - addressable_light_id: led_matrix_32x8 - width: 32 - height: 8 - pixel_mapper: |- - if (x % 2 == 0) { - return (x * 8) + y; - } - return (x * 8) + (7 - y); - lambda: |- - Color red = Color(0xFF0000); - Color green = Color(0x00FF00); - Color blue = Color(0x0000FF); - it.rectangle(0, 0, it.get_width(), it.get_height(), red); - it.rectangle(1, 1, it.get_width()-2, it.get_height()-2, green); - it.rectangle(2, 2, it.get_width()-4, it.get_height()-4, blue); - it.rectangle(3, 3, it.get_width()-6, it.get_height()-6, red); - auto touch = id(ft63_touchscreen)->get_touch(); - if (touch) { ESP_LOGD("touch", "%d/%d", touch.value().x, touch.value().y); } - rotation: 0° - update_interval: 16ms - - - platform: inkplate6 - id: inkplate_display - greyscale: false - partial_updating: false - update_interval: 60s - display_data_1_pin: - number: GPIO5 - allow_other_uses: true - display_data_2_pin: - number: GPIO18 - allow_other_uses: true - display_data_3_pin: - number: GPIO19 - allow_other_uses: true - display_data_5_pin: - number: GPIO25 - allow_other_uses: true - display_data_4_pin: - number: GPIO23 - allow_other_uses: true - display_data_6_pin: - number: GPIO26 - allow_other_uses: true - display_data_7_pin: - number: GPIO27 - allow_other_uses: true - ckv_pin: - number: GPIO1 - allow_other_uses: true - sph_pin: - number: GPIO1 - allow_other_uses: true - gmod_pin: - number: GPIO1 - allow_other_uses: true - gpio0_enable_pin: - number: GPIO1 - allow_other_uses: true - oe_pin: - number: GPIO1 - allow_other_uses: true - spv_pin: - number: GPIO1 - allow_other_uses: true - powerup_pin: - number: GPIO1 - allow_other_uses: true - wakeup_pin: - number: GPIO1 - allow_other_uses: true - vcom_pin: - number: GPIO1 - allow_other_uses: true - -number: - - platform: tuya - id: tuya_number - number_datapoint: 102 - min_value: 0 - max_value: 17 - step: 1 - - platform: copy - source_id: tuya_number - name: Tuya Number Copy - -text_sensor: - - platform: pylontech - pylontech_id: pylontech0 - battery: 1 - base_state: - id: pyl0_base_state - voltage_state: - id: pyl0_voltage_state - current_state: - id: pyl0_current_state - temperature_state: - id: pyl0_temperature_state - - platform: pipsolar - pipsolar_id: inverter0 - device_mode: - id: inverter0_device_mode - name: inverter0_device_mode - last_qpigs: - id: inverter0_last_qpigs - name: inverter0_last_qpigs - last_qpiri: - id: inverter0_last_qpiri - name: inverter0_last_qpiri - last_qmod: - id: inverter0_last_qmod - name: inverter0_last_qmod - last_qflag: - id: inverter0_last_qflag - name: inverter0_last_qflag - - platform: copy - source_id: inverter0_device_mode - name: Inverter Text Sensor Copy - - platform: ethernet_info - ip_address: - name: IP Address - -output: - - platform: pipsolar - pipsolar_id: inverter0 - battery_recharge_voltage: - id: inverter0_battery_recharge_voltage_out - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 0 - id: dac7678_1_ch0 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 1 - id: dac7678_1_ch1 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 2 - id: dac7678_1_ch2 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 3 - id: dac7678_1_ch3 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 4 - id: dac7678_1_ch4 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 5 - id: dac7678_1_ch5 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 6 - id: dac7678_1_ch6 - - platform: dac7678 - dac7678_id: dac7678_hub1 - channel: 7 - id: dac7678_1_ch7 -esp32_camera: - name: ESP-32 Camera - data_pins: - - number: GPIO17 - allow_other_uses: true - - number: GPIO35 - allow_other_uses: true - - number: GPIO34 - - number: GPIO5 - allow_other_uses: true - - number: GPIO39 - allow_other_uses: true - - number: GPIO18 - allow_other_uses: true - - number: GPIO36 - allow_other_uses: true - - number: GPIO19 - allow_other_uses: true - vsync_pin: - allow_other_uses: true - number: GPIO22 - href_pin: - allow_other_uses: true - number: GPIO26 - pixel_clock_pin: - allow_other_uses: true - number: GPIO21 - external_clock: - pin: - allow_other_uses: true - number: GPIO27 - frequency: 20MHz - i2c_pins: - sda: - allow_other_uses: true - number: GPIO25 - scl: - allow_other_uses: true - number: GPIO23 - reset_pin: - allow_other_uses: true - number: GPIO15 - power_down_pin: - allow_other_uses: true - number: GPIO1 - resolution: 640x480 - jpeg_quality: 10 - on_image: - then: - - lambda: |- - ESP_LOGD("main", "image len=%d, data=%c", image.length, image.data[0]); - -esp32_camera_web_server: - - port: 8080 - mode: stream - - port: 8081 - mode: snapshot - -external_components: - - source: github://esphome/esphome@dev - refresh: 1d - components: [bh1750] - - source: ../esphome/components - components: [sntp] - -button: - - platform: restart - name: Restart Button - - platform: safe_mode - name: Safe Mode Button - - platform: shutdown - name: Shutdown Button - id: shutdown_btn - - platform: copy - source_id: shutdown_btn - name: Shutdown Button Copy - -touchscreen: - - platform: ektf2232 - interrupt_pin: - allow_other_uses: true - number: GPIO36 - rts_pin: - allow_other_uses: true - number: GPIO5 - display: inkplate_display - on_touch: - - logger.log: - format: Touch at (%d, %d) - args: [touch.x, touch.y] - - - platform: xpt2046 - id: xpt_touchscreen - spi_id: spi_id_2 - cs_pin: - allow_other_uses: true - number: GPIO17 - interrupt_pin: - number: GPIO16 - display: inkplate_display - update_interval: 50ms - threshold: 400 - calibration: - x_min: 3860 - x_max: 280 - y_min: 340 - y_max: 3860 - on_touch: - - logger.log: - format: Touch at (%d, %d) - args: [touch.x, touch.y] - - - platform: lilygo_t5_47 - id: lilygo_touchscreen - interrupt_pin: - allow_other_uses: true - number: GPIO36 - display: inkplate_display - on_touch: - - logger.log: - format: Touch at (%d, %d) - args: [touch.x, touch.y] - - platform: gt911 - interrupt_pin: - number: GPIO3 - display: inkplate_display - - - platform: ft63x6 - id: ft63_touchscreen - interrupt_pin: - allow_other_uses: true - number: GPIO39 - reset_pin: - allow_other_uses: true - number: GPIO5 - display: inkplate_display - on_touch: - - logger.log: - format: Touch at (%d, %d) - args: [touch.x, touch.y] - -i2s_audio: - i2s_lrclk_pin: - allow_other_uses: true - number: GPIO26 - i2s_bclk_pin: - allow_other_uses: true - number: GPIO27 - i2s_mclk_pin: - allow_other_uses: true - number: GPIO25 - -media_player: - - platform: i2s_audio - name: None - dac_type: external - i2s_dout_pin: - allow_other_uses: true - number: GPIO25 - mute_pin: - number: GPIO14 - on_state: - - media_player.play: - - media_player.play_media: http://localhost/media.mp3 - - media_player.play_media: !lambda 'return "http://localhost/media.mp3";' - on_idle: - - media_player.pause: - on_play: - - media_player.stop: - on_pause: - - media_player.toggle: - - wait_until: - media_player.is_idle: - - wait_until: - media_player.is_playing: - - media_player.volume_up: - - media_player.volume_down: - - media_player.volume_set: 50% - -prometheus: - include_internal: true - relabel: - ha_hello_world: - id: hellow_world - name: Hello World - -microphone: - - platform: i2s_audio - id: mic_id_adc - adc_pin: - allow_other_uses: true - number: GPIO35 - adc_type: internal - - - platform: i2s_audio - id: mic_id_external - i2s_din_pin: - allow_other_uses: true - number: GPIO23 - adc_type: external - pdm: false - -speaker: - - platform: i2s_audio - id: speaker_id - dac_type: external - i2s_dout_pin: - allow_other_uses: true - number: GPIO25 - mode: mono - -voice_assistant: - microphone: mic_id_external - speaker: speaker_id - on_listening: - - logger.log: "Voice assistant microphone listening" - on_start: - - logger.log: "Voice assistant started" - on_stt_end: - - logger.log: - format: "Voice assistant STT ended with result %s" - args: [x.c_str()] - on_tts_start: - - logger.log: - format: "Voice assistant TTS started with text %s" - args: [x.c_str()] - on_tts_end: - - logger.log: - format: "Voice assistant TTS ended with url %s" - args: [x.c_str()] - on_end: - - logger.log: "Voice assistant ended" - on_error: - - logger.log: - format: "Voice assistant error - code %s, message: %s" - args: [code.c_str(), message.c_str()] - -max6956: - - id: max6956_1 - address: 0x40 - -xl9535: - - id: xl9535_hub - address: 0x20 diff --git a/tests/test5.yaml b/tests/test5.yaml deleted file mode 100644 index f7a34d5a1b..0000000000 --- a/tests/test5.yaml +++ /dev/null @@ -1,747 +0,0 @@ ---- -esphome: - name: test5 - build_path: build/test5 - project: - name: esphome.test5_project - version: "1.0.0" - -esp32: - board: nodemcu-32s - framework: - type: esp-idf - advanced: - ignore_efuse_mac_crc: true - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - manual_ip: - static_ip: 192.168.1.23 - gateway: 192.168.1.1 - subnet: 255.255.255.0 - -network: - enable_ipv6: true - -api: - -ota: - - platform: esphome - -logger: - -debug: - -psram: - -uart: - - id: uart_1 - tx_pin: 1 - rx_pin: 3 - baud_rate: 9600 - - id: uart_2 - tx_pin: - allow_other_uses: true - number: 17 - inverted: true - rx_pin: - allow_other_uses: true - number: 16 - baud_rate: 19200 - -i2c: - sda: - allow_other_uses: true - number: 21 - scl: - number: 22 - frequency: 100khz - -modbus: - uart_id: uart_1 - flow_control_pin: - allow_other_uses: true - number: 5 - id: mod_bus1 - -modbus_controller: - - id: modbus_controller_test - address: 0x2 - modbus_id: mod_bus1 - -mqtt: - broker: test.mosquitto.org - port: 1883 - discovery: true - discovery_prefix: homeassistant - idf_send_async: false - log_topic: - on_message: - topic: testing/sensor/testing_sensor/state - qos: 0 - then: - # yamllint disable rule:line-length - - lambda: |- - ESP_LOGD("Mqtt Test", "testing/sensor/testing_sensor/state=[%s]", x.c_str()); - # yamllint enable rule:line-length - -vbus: - - uart_id: uart_2 - -binary_sensor: - - platform: gpio - pin: GPIO0 - id: io0_button - icon: mdi:gesture-tap-button - - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_binsensortest - register_type: read - address: 0x3200 - bitmask: 0x80 # (bit 8) - lambda: "return x;" - - - platform: tm1638 - id: Button0 - key: 0 - filters: - - delayed_on: 10ms - on_press: - then: - - switch.turn_on: Led0 - on_release: - then: - - switch.turn_off: Led0 - - - platform: tm1638 - id: Button1 - key: 1 - on_press: - then: - - switch.turn_on: Led1 - on_release: - then: - - switch.turn_off: Led1 - - - platform: tm1638 - id: Button2 - key: 2 - on_press: - then: - - switch.turn_on: Led2 - on_release: - then: - - switch.turn_off: Led2 - - - platform: tm1638 - id: Button3 - key: 3 - on_press: - then: - - switch.turn_on: Led3 - on_release: - then: - - switch.turn_off: Led3 - - - platform: tm1638 - id: Button4 - key: 4 - on_press: - then: - - output.turn_on: Led4 - on_release: - then: - - output.turn_off: Led4 - - - platform: tm1638 - id: Button5 - key: 5 - on_press: - then: - - output.turn_on: Led5 - on_release: - then: - - output.turn_off: Led5 - - - platform: tm1638 - id: Button6 - key: 6 - on_press: - then: - - output.turn_on: Led6 - on_release: - then: - - output.turn_off: Led6 - - - platform: tm1638 - id: Button7 - key: 7 - on_press: - then: - - output.turn_on: Led7 - on_release: - then: - - output.turn_off: Led7 - - - platform: gpio - id: sn74hc165_pin_0 - pin: - sn74hc165: sn74hc165_hub - number: 0 - - - platform: ezo_pmp - pump_state: - name: "Pump State" - is_paused: - name: "Is Paused" - - - platform: matrix_keypad - keypad_id: keypad - id: key4 - row: 1 - col: 1 - - platform: matrix_keypad - id: key1 - key: 1 - - - platform: vbus - model: deltasol_bs_plus - relay2: - name: Relay 2 On - sensor1_error: - name: Sensor 1 Error - - - platform: vbus - model: custom - command: 0x100 - source: 0x1234 - dest: 0x10 - binary_sensors: - - id: vcustom_b - name: VBus Custom Binary Sensor - lambda: return x[0] & 1; - -tlc5947: - data_pin: - number: GPIO12 - allow_other_uses: true - clock_pin: - allow_other_uses: true - number: GPIO14 - lat_pin: - allow_other_uses: true - number: GPIO15 - -gp8403: - - id: gp8403_5v - voltage: 5V - - id: gp8403_10v - voltage: 10V - -output: - - platform: gpio - pin: GPIO2 - id: built_in_led - - - platform: tlc5947 - id: output_red - channel: 0 - max_power: 0.8 - - - platform: mcp47a1 - id: output_mcp47a1 - - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_output_test - lambda: |- - return x * 1.0 ; - address: 0x9001 - value_type: U_WORD - - - platform: tm1638 - id: Led4 - led: 4 - - - platform: tm1638 - id: Led5 - led: 5 - - - platform: tm1638 - id: Led6 - led: 6 - - - platform: tm1638 - id: Led7 - led: 7 - - - platform: gp8403 - id: gp8403_output_0 - gp8403_id: gp8403_5v - channel: 0 - - platform: gp8403 - gp8403_id: gp8403_10v - id: gp8403_output_1 - channel: 1 - -demo: - -esp32_ble: - -esp32_ble_server: - manufacturer: ESPHome - model: Test5 - -esp32_improv: - authorizer: io0_button - authorized_duration: 1min - status_indicator: built_in_led - -ezo_pmp: - id: hcl_pump - update_interval: 1s - -number: - - platform: template - name: My template number - id: template_number_id - optimistic: true - max_value: 100 - min_value: 0 - step: 5 - unit_of_measurement: "%" - mode: slider - device_class: humidity - on_value: - - logger.log: - format: Number changed to %f - args: [x] - set_action: - - logger.log: - format: Template Number set to %f - args: [x] - - number.set: - id: template_number_id - value: 50 - - number.to_min: template_number_id - - number.to_min: - id: template_number_id - - number.to_max: template_number_id - - number.to_max: - id: template_number_id - - number.increment: template_number_id - - number.increment: - id: template_number_id - cycle: false - - number.decrement: template_number_id - - number.decrement: - id: template_number_id - cycle: false - - number.operation: - id: template_number_id - operation: Increment - cycle: false - - number.operation: - id: template_number_id - operation: !lambda "return NUMBER_OP_INCREMENT;" - cycle: !lambda "return false;" - - - id: modbus_numbertest - platform: modbus_controller - modbus_controller_id: modbus_controller_test - name: ModbusNumber - address: 0x9002 - value_type: U_WORD - lambda: "return x * 1.0;" - write_lambda: |- - return x * 1.0 ; - multiply: 1.0 - -select: - - platform: template - name: My template select - id: template_select_id - optimistic: true - initial_option: two - restore_value: true - on_value: - - logger.log: - format: Select changed to %s (index %d)" - args: ["x.c_str()", "i"] - set_action: - - logger.log: - format: Template Select set to %s - args: ["x.c_str()"] - - select.set: - id: template_select_id - option: two - - select.first: template_select_id - - select.last: - id: template_select_id - - select.previous: template_select_id - - select.next: - id: template_select_id - cycle: false - - select.operation: - id: template_select_id - operation: Previous - cycle: false - - select.operation: - id: template_select_id - operation: !lambda "return SELECT_OP_PREVIOUS;" - cycle: !lambda "return true;" - - select.set_index: - id: template_select_id - index: 1 - - select.set_index: - id: template_select_id - index: !lambda "return 1 + 1;" - options: - - one - - two - - three - - - platform: modbus_controller - name: Modbus Select Register 1000 - address: 1000 - value_type: U_WORD - optionsmap: - "Zero": 0 - "One": 1 - "Two": 2 - "Three": 3 - -sensor: - - platform: adc - id: adc_sensor_p32 - name: ADC pin 32 - pin: 32 - attenuation: 11db - update_interval: 1s - - platform: internal_temperature - name: Internal Temperature - state_topic: - - platform: selec_meter - total_active_energy: - name: SelecEM2M Total Active Energy - import_active_energy: - name: SelecEM2M Import Active Energy - export_active_energy: - name: SelecEM2M Export Active Energy - total_reactive_energy: - name: SelecEM2M Total Reactive Energy - import_reactive_energy: - name: SelecEM2M Import Reactive Energy - export_reactive_energy: - name: SelecEM2M Export Reactive Energy - apparent_energy: - name: SelecEM2M Apparent Energy - active_power: - name: SelecEM2M Active Power - reactive_power: - name: SelecEM2M Reactive Power - apparent_power: - name: SelecEM2M Apparent Power - voltage: - name: SelecEM2M Voltage - current: - name: SelecEM2M Current - power_factor: - name: SelecEM2M Power Factor - frequency: - name: SelecEM2M Frequency - maximum_demand_active_power: - name: SelecEM2M Maximum Demand Active Power - disabled_by_default: true - maximum_demand_reactive_power: - name: SelecEM2M Maximum Demand Reactive Power - disabled_by_default: true - maximum_demand_apparent_power: - name: SelecEM2M Maximum Demand Apparent Power - disabled_by_default: true - - - id: modbus_sensortest - platform: modbus_controller - modbus_controller_id: modbus_controller_test - address: 0x331A - register_type: read - value_type: U_WORD - - - platform: t6615 - uart_id: uart_2 - co2: - name: CO2 Sensor - - - platform: ms8607 - temperature: - name: Temperature - humidity: - name: Humidity - pressure: - name: Pressure - - platform: ms8607 - id: ms8607_more_config - temperature: - name: Indoor Temperature - accuracy_decimals: 1 - pressure: - name: Indoor Pressure - internal: true - humidity: - name: Indoor Humidity - address: 0x41 - i2c_id: - i2c_id: - address: 0x77 - update_interval: 10min - - - platform: sen5x - id: sen54 - 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 - algorithm_tuning: - index_offset: 100 - learning_time_offset_hours: 12 - learning_time_gain_hours: 12 - gating_max_duration_minutes: 180 - std_initial: 50 - gain_factor: 230 - temperature_compensation: - offset: 0 - normalized_offset_slope: 0 - time_constant: 0 - auto_cleaning_interval: 604800s - acceleration_mode: low - store_baseline: true - address: 0x69 - - platform: mcp9600 - thermocouple_type: K - hot_junction: - name: Thermocouple Temperature - cold_junction: - name: Ambient Temperature - - - platform: ezo_pmp - current_volume_dosed: - name: Current Volume Dosed - total_volume_dosed: - name: Total Volume Dosed - absolute_total_volume_dosed: - name: Absolute Total Volume Dosed - pump_voltage: - name: Pump Voltage - last_volume_requested: - name: Last Volume Requested - max_flow_rate: - name: Max Flow Rate - - - platform: vbus - model: deltasol c - temperature_3: - name: Temperature 3 - operating_hours_1: - name: Operating Hours 1 - heat_quantity: - name: Heat Quantity - time: - name: System Time - - - platform: debug - free: - name: "Heap Free" - block: - name: "Heap Max Block" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" - - - platform: vbus - model: custom - command: 0x100 - source: 0x1234 - dest: 0x10 - sensors: - - id: vcustom - name: VBus Custom Sensor - lambda: return x[0] / 10.0; - - - platform: kuntze - ph: - name: Kuntze pH - temperature: - name: Kuntze temperature - -script: - - id: automation_test - then: - - repeat: - count: 5 - then: - - logger.log: looping! - - - id: zero_repeat_test - then: - - repeat: - count: !lambda "return 0;" - then: - - logger.log: shouldn't see mee! - -switch: - - platform: modbus_controller - modbus_controller_id: modbus_controller_test - id: modbus_switch_test - register_type: coil - address: 2 - bitmask: 1 - - - platform: tm1638 - id: Led0 - led: 0 - name: TM1638Led0 - - - platform: tm1638 - id: Led1 - led: 1 - name: TM1638Led1 - - - platform: tm1638 - id: Led2 - led: 2 - name: TM1638Led2 - - - platform: tm1638 - id: Led3 - led: 3 - name: TM1638Led3 - -display: - - platform: tm1638 - id: primarydisplay - stb_pin: - allow_other_uses: true - number: 5 # TM1638 STB - clk_pin: 18 # TM1638 CLK - dio_pin: 23 # TM1638 DIO - update_interval: 5s - intensity: 5 - lambda: |- - it.print("81818181"); - -time: - - platform: pcf85063 - - platform: pcf8563 - -text_sensor: - - platform: ezo_pmp - dosing_mode: - name: Dosing Mode - calibration_status: - name: Calibration Status - on_value: - - ezo_pmp.dose_volume: - id: hcl_pump - volume: 10 - - ezo_pmp.dose_volume_over_time: - id: hcl_pump - volume: 10 - duration: 2 - - ezo_pmp.dose_with_constant_flow_rate: - id: hcl_pump - volume_per_minute: 10 - duration: 2 - - ezo_pmp.set_calibration_volume: - id: hcl_pump - volume: 10 - - ezo_pmp.find: hcl_pump - - ezo_pmp.dose_continuously: hcl_pump - - ezo_pmp.clear_total_volume_dosed: hcl_pump - - ezo_pmp.clear_calibration: hcl_pump - - ezo_pmp.pause_dosing: hcl_pump - - ezo_pmp.stop_dosing: hcl_pump - - ezo_pmp.arbitrary_command: - id: hcl_pump - command: D,? - -sn74hc165: - id: sn74hc165_hub - data_pin: - allow_other_uses: true - number: GPIO12 - clock_pin: - allow_other_uses: true - number: GPIO14 - load_pin: GPIO27 - clock_inhibit_pin: GPIO26 - sr_count: 4 - -matrix_keypad: - id: keypad - rows: - - pin: - allow_other_uses: true - number: 21 - - pin: 19 - columns: - - pin: - allow_other_uses: true - number: 17 - - pin: - allow_other_uses: true - number: 16 - keys: "1234" - has_pulldowns: true - -key_collector: - - id: reader - source_id: keypad - min_length: 4 - max_length: 4 - -light: - - platform: esp32_rmt_led_strip - id: led_strip - pin: 13 - num_leds: 60 - rmt_channel: 6 - rgb_order: GRB - chipset: ws2812 - - platform: esp32_rmt_led_strip - id: led_strip2 - pin: - allow_other_uses: true - number: 15 - num_leds: 60 - rmt_channel: 2 - rgb_order: RGB - bit0_high: 100us - bit0_low: 100us - bit1_high: 100us - bit1_low: 100us diff --git a/tests/test6.yaml b/tests/test6.yaml deleted file mode 100644 index b1103eb126..0000000000 --- a/tests/test6.yaml +++ /dev/null @@ -1,77 +0,0 @@ ---- -esphome: - name: test6 - project: - name: esphome.test6_project - version: "1.0.0" - -rp2040: - board: rpipicow - framework: - # Waiting for https://github.com/platformio/platform-raspberrypi/pull/36 - platform_version: https://github.com/maxgerhardt/platform-raspberrypi.git - -wifi: - networks: - - ssid: "MySSID" - password: "password1" - -network: - enable_ipv6: true - -api: - -ota: - - platform: esphome - -logger: - -debug: - -binary_sensor: - - platform: gpio - pin: GPIO5 - id: pin_5_button - -output: - - platform: gpio - pin: GPIO4 - id: pin_4 - -switch: - - platform: output - output: pin_4 - id: pin_4_switch - -spi: # Pins are for SPI1 on the RP2040 Pico-W - miso_pin: 8 - clk_pin: 10 - mosi_pin: 11 - id: spi_0 - interface: hardware - -# light: -# - platform: rp2040_pio_led_strip -# id: led_strip -# pin: GPIO13 -# num_leds: 60 -# pio: 0 -# rgb_order: GRB -# chipset: WS2812 -# - platform: rp2040_pio_led_strip -# id: led_strip_custom_timings -# pin: GPIO13 -# num_leds: 60 -# pio: 1 -# rgb_order: GRB -# bit0_high: .1us -# bit0_low: 1.2us -# bit1_high: .69us -# bit1_low: .4us - -sensor: - - platform: internal_temperature - name: Internal Temperature - - platform: adc - pin: VCC - name: VSYS diff --git a/tests/test7.yaml b/tests/test7.yaml deleted file mode 100644 index ac193eae4e..0000000000 --- a/tests/test7.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Tests for ESP32-C3 boards which use toolchain-riscv32-esp ---- -wifi: - ssid: "ssid" - -network: - enable_ipv6: true - -esp32: - board: lolin_c3_mini - framework: - type: arduino - -esphome: - name: test7 - -logger: - -debug: - -sensor: - - platform: adc - id: adc_sensor_p4 - name: ADC pin 4 - pin: 4 - attenuation: 11db - update_interval: 1s diff --git a/tests/test8.1.yaml b/tests/test8.1.yaml deleted file mode 100644 index ab3d0d44aa..0000000000 --- a/tests/test8.1.yaml +++ /dev/null @@ -1,78 +0,0 @@ -# Tests for ESP32-S3 boards - IDf ---- -wifi: - ssid: "ssid" - -network: - enable_ipv6: true - -esp32: - board: esp32s3box - variant: ESP32S3 - framework: - type: esp-idf - -esphome: - name: esp32-s3-test - -logger: - -debug: - -psram: - -spi: - - id: spi_id_1 - type: single - clk_pin: - number: GPIO7 - allow_other_uses: false - mosi_pin: GPIO6 - interface: hardware -spi_device: - id: spidev - data_rate: 2MHz - spi_id: spi_id_1 - mode: 3 - bit_order: lsb_first - -display: - - platform: ili9xxx - id: displ8 - model: ili9342 - cs_pin: GPIO5 - dc_pin: GPIO4 - reset_pin: - number: GPIO48 - allow_other_uses: true - -i2c: - scl: GPIO18 - sda: GPIO8 - -touchscreen: - - platform: tt21100 - display: displ8 - interrupt_pin: - number: GPIO3 - ignore_strapping_warning: true - allow_other_uses: false - reset_pin: - number: GPIO48 - allow_other_uses: true - -binary_sensor: - - platform: tt21100 - name: Home Button - index: 1 - -sensor: - - platform: debug - free: - name: "Heap Free" - block: - name: "Max Block Free" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" diff --git a/tests/test8.2.yaml b/tests/test8.2.yaml deleted file mode 100644 index ae892559e5..0000000000 --- a/tests/test8.2.yaml +++ /dev/null @@ -1,75 +0,0 @@ -# Tests for ESP32-C3 boards - IDf ---- -wifi: - ssid: "ssid" - -network: - enable_ipv6: true - -esp32: - board: lolin_c3_mini - variant: ESP32C3 - framework: - type: esp-idf - -esphome: - name: esp32-c3-test - -logger: - -debug: - -psram: - -spi: - - id: spi_id_1 - clk_pin: - number: GPIO7 - allow_other_uses: false - mosi_pin: GPIO6 - interface: any - -spi_device: - id: spidev - data_rate: 2MHz - spi_id: spi_id_1 - mode: 3 - bit_order: lsb_first - -display: - - platform: ili9xxx - id: displ8 - model: ili9342 - cs_pin: GPIO5 - dc_pin: GPIO4 - reset_pin: - number: GPIO21 - -i2c: - scl: GPIO18 - sda: GPIO8 - -touchscreen: - - platform: tt21100 - display: displ8 - interrupt_pin: - number: GPIO3 - allow_other_uses: false - reset_pin: - number: GPIO20 - -binary_sensor: - - platform: tt21100 - name: Home Button - index: 1 - -sensor: - - platform: debug - free: - name: "Heap Free" - block: - name: "Max Block Free" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" diff --git a/tests/test8.yaml b/tests/test8.yaml deleted file mode 100644 index fcc93c6154..0000000000 --- a/tests/test8.yaml +++ /dev/null @@ -1,125 +0,0 @@ -# Tests for ESP32-S3 boards ---- -wifi: - ssid: "ssid" - -network: - enable_ipv6: true - -esp32: - board: esp32s3box - variant: ESP32S3 - framework: - type: arduino - -esphome: - name: esp32-s3-test - -logger: - -debug: - -psram: - -light: - - platform: neopixelbus - type: GRB - variant: WS2812 - pin: GPIO38 - num_leds: 1 - id: neopixel - method: esp32_rmt - name: neopixel-enable - internal: false - restore_mode: ALWAYS_OFF - - platform: spi_led_strip - num_leds: 4 - color_correct: [80%, 60%, 100%] - id: rgb_led - name: "RGB LED" - data_rate: 8MHz - - platform: binary - name: "Red Info Light" - output: board_info_ed - entity_category: diagnostic - restore_mode: ALWAYS_OFF - -spi: - id: spi_id_1 - clk_pin: GPIO7 - mosi_pin: GPIO6 - interface: any - -spi_device: - id: spidev - data_rate: 2MHz - spi_id: spi_id_1 - mode: 3 - bit_order: lsb_first - -font: - - file: "gfonts://Roboto" - id: roboto - size: 20 - -display: - - platform: ili9xxx - id: displ8 - model: ili9342 - cs_pin: GPIO5 - dc_pin: GPIO4 - reset_pin: - number: GPIO48 - allow_other_uses: true - lambda: |- - it.printf(10, 100, id(roboto), Color(0x123456), COLOR_OFF, display::TextAlign::BASELINE, "%f", id(heap_free).state); - -i2c: - scl: GPIO18 - sda: GPIO8 - -output: - - platform: gpio - id: board_info_ed - pin: - # This pin is reserved on the ESP32S3! - number: 26 - ignore_pin_validation_error: true - -touchscreen: - - platform: tt21100 - display: displ8 - interrupt_pin: - number: GPIO3 - ignore_strapping_warning: true - allow_other_uses: false - reset_pin: - number: GPIO48 - allow_other_uses: true - -binary_sensor: - - platform: tt21100 - name: Home Button - index: 1 - -sensor: - - platform: debug - free: - id: heap_free - name: "Heap Free" - block: - name: "Max Block Free" - loop_time: - name: "Loop Time" - psram: - name: "PSRAM Free" - -# Purposely test that `animation:` does auto-load `image:` -# Keep the `image:` undefined. -# image: - -animation: - - id: rgb565_animation - file: pnglogo.png - type: RGB565 - use_transparency: false diff --git a/tests/test9.1.yaml b/tests/test9.1.yaml deleted file mode 100644 index 2d205ef4e6..0000000000 --- a/tests/test9.1.yaml +++ /dev/null @@ -1,29 +0,0 @@ -# Tests for rtl87xx boards using LibreTiny ---- -wifi: - ssid: "ssid" - -rtl87xx: - board: generic-rtl8710bn-2mb-788k - -esphome: - name: rtl87xx-test - -logger: - -ota: - - platform: esphome - -captive_portal: - -binary_sensor: - - platform: gpio - name: Home Button - pin: GPIO11 - -sensor: - - platform: adc - id: adc_sensor - name: ADC - pin: PA19 - update_interval: 1s diff --git a/tests/test9.yaml b/tests/test9.yaml deleted file mode 100644 index 5017ccc5ed..0000000000 --- a/tests/test9.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Tests for bk7xx boards using LibreTiny ---- -wifi: - ssid: "ssid" - -bk72xx: - board: cb2s - -esphome: - name: bk72xx-test - -logger: - -ota: - - platform: esphome - -captive_portal: - -binary_sensor: - - platform: gpio - name: Home Button - pin: GPIO24 - -sensor: - - platform: adc - id: adc_sensor - name: ADC - pin: GPIO23 - update_interval: 1s - -mqtt: - broker: test.mosquitto.org - port: 1883 - discovery: true - discovery_prefix: homeassistant From dc4a93f5d0ec268bc1a0de28ac2f9d4c7b96aa6d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:15:02 +1200 Subject: [PATCH 138/233] Revert "[CI] Update tests to run against IDF 5.1" (#7003) --- ...f-51.yaml => build_components_base.esp32-c3-idf-50.yaml} | 6 +++--- ...-idf-51.yaml => build_components_base.esp32-idf-50.yaml} | 6 +++--- ...f-51.yaml => build_components_base.esp32-s2-idf-50.yaml} | 6 +++--- ...f-51.yaml => build_components_base.esp32-s3-idf-50.yaml} | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) rename tests/test_build_components/{build_components_base.esp32-c3-idf-51.yaml => build_components_base.esp32-c3-idf-50.yaml} (76%) rename tests/test_build_components/{build_components_base.esp32-idf-51.yaml => build_components_base.esp32-idf-50.yaml} (77%) rename tests/test_build_components/{build_components_base.esp32-s2-idf-51.yaml => build_components_base.esp32-s2-idf-50.yaml} (78%) rename tests/test_build_components/{build_components_base.esp32-s3-idf-51.yaml => build_components_base.esp32-s3-idf-50.yaml} (77%) diff --git a/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml b/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml similarity index 76% rename from tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml rename to tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml index 73d2c8fa19..08d4d8679c 100644 --- a/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml +++ b/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32c3idf51 + name: componenttestesp32c3idf50 friendly_name: $component_name esp32: board: lolin_c3_mini framework: type: esp-idf - version: 5.1.2 - platform_version: 6.6.0 + version: 5.0.2 + platform_version: 6.3.2 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-idf-51.yaml b/tests/test_build_components/build_components_base.esp32-idf-50.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-idf-51.yaml rename to tests/test_build_components/build_components_base.esp32-idf-50.yaml index 6c8eb3c193..c9f2c1e943 100644 --- a/tests/test_build_components/build_components_base.esp32-idf-51.yaml +++ b/tests/test_build_components/build_components_base.esp32-idf-50.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32idf51 + name: componenttestesp32idf50 friendly_name: $component_name esp32: board: nodemcu-32s framework: type: esp-idf - version: 5.1.2 - platform_version: 6.6.0 + version: 5.0.2 + platform_version: 6.3.2 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml similarity index 78% rename from tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml rename to tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml index 8894efb6b8..351f5fb019 100644 --- a/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml +++ b/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s2idf51 + name: componenttestesp32s2idf50 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S2 framework: type: esp-idf - version: 5.1.2 - platform_version: 6.6.0 + version: 5.0.2 + platform_version: 6.3.2 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml rename to tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml index efeffa5a0f..c05378903f 100644 --- a/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml +++ b/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s3idf51 + name: componenttestesp32s3idf50 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S3 framework: type: esp-idf - version: 5.1.2 - platform_version: 6.6.0 + version: 5.0.2 + platform_version: 6.3.2 logger: level: VERY_VERBOSE From 0e50cac39930770cb9321a06a03403ff938206fd Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 26 Jun 2024 20:07:07 -0500 Subject: [PATCH 139/233] [ota-esphome] Merge configurations by port (#7001) --- esphome/components/esphome/ota/__init__.py | 65 +++++++++++++++++++--- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/esphome/components/esphome/ota/__init__.py b/esphome/components/esphome/ota/__init__.py index 88e729f230..a852d8d001 100644 --- a/esphome/components/esphome/ota/__init__.py +++ b/esphome/components/esphome/ota/__init__.py @@ -1,7 +1,10 @@ +import logging + import esphome.codegen as cg import esphome.config_validation as cv import esphome.final_validate as fv from esphome.components.ota import BASE_OTA_SCHEMA, ota_to_code, OTAComponent +from esphome.config_helpers import merge_config from esphome.const import ( CONF_ESPHOME, CONF_ID, @@ -16,6 +19,8 @@ from esphome.const import ( ) from esphome.core import coroutine_with_priority +_LOGGER = logging.getLogger(__name__) + CODEOWNERS = ["@esphome/core"] AUTO_LOAD = ["md5", "socket"] @@ -26,16 +31,62 @@ ESPHomeOTAComponent = esphome.class_("ESPHomeOTAComponent", OTAComponent) def ota_esphome_final_validate(config): - fconf = fv.full_config.get()[CONF_OTA] - used_ports = [] - for ota_conf in fconf: + full_conf = fv.full_config.get() + full_ota_conf = full_conf[CONF_OTA] + new_ota_conf = [] + merged_ota_esphome_configs_by_port = {} + ports_with_merged_configs = [] + for ota_conf in full_ota_conf: if ota_conf.get(CONF_PLATFORM) == CONF_ESPHOME: - if (plat_port := ota_conf.get(CONF_PORT)) not in used_ports: - used_ports.append(plat_port) + if ( + conf_port := ota_conf.get(CONF_PORT) + ) not in merged_ota_esphome_configs_by_port: + merged_ota_esphome_configs_by_port[conf_port] = ota_conf else: - raise cv.Invalid( - f"Only one instance of the {CONF_ESPHOME} {CONF_OTA} {CONF_PLATFORM} is allowed per port. Note that this error may result from OTA specified in packages" + if merged_ota_esphome_configs_by_port[conf_port][ + CONF_VERSION + ] != ota_conf.get(CONF_VERSION): + raise cv.Invalid( + f"Found multiple configurations but {CONF_VERSION} is inconsistent" + ) + if ( + merged_ota_esphome_configs_by_port[conf_port][CONF_ID].is_manual + and ota_conf.get(CONF_ID).is_manual + ): + raise cv.Invalid( + f"Found multiple configurations but {CONF_ID} is inconsistent" + ) + if ( + CONF_PASSWORD in merged_ota_esphome_configs_by_port[conf_port] + and CONF_PASSWORD in ota_conf + and merged_ota_esphome_configs_by_port[conf_port][CONF_PASSWORD] + != ota_conf.get(CONF_PASSWORD) + ): + raise cv.Invalid( + f"Found multiple configurations but {CONF_PASSWORD} is inconsistent" + ) + + ports_with_merged_configs.append(conf_port) + merged_ota_esphome_configs_by_port[conf_port] = merge_config( + merged_ota_esphome_configs_by_port[conf_port], ota_conf ) + else: + new_ota_conf.append(ota_conf) + + for port_conf in merged_ota_esphome_configs_by_port.values(): + new_ota_conf.append(port_conf) + + full_conf[CONF_OTA] = new_ota_conf + fv.full_config.set(full_conf) + + if len(ports_with_merged_configs) > 0: + _LOGGER.warning( + "Found and merged multiple configurations for %s %s %s port(s) %s", + CONF_OTA, + CONF_PLATFORM, + CONF_ESPHOME, + ports_with_merged_configs, + ) CONFIG_SCHEMA = ( From 3a48b1075700bbc1e7a46b9bfda062b1a4400f2d Mon Sep 17 00:00:00 2001 From: Markus <974709+Links2004@users.noreply.github.com> Date: Thu, 27 Jun 2024 03:48:01 +0200 Subject: [PATCH 140/233] Fix LEDC 100% is not 100% duty with ESP32 IDF (#6997) --- esphome/components/ledc/ledc_output.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/esphome/components/ledc/ledc_output.cpp b/esphome/components/ledc/ledc_output.cpp index 1040ac25b6..90e11fe4ad 100644 --- a/esphome/components/ledc/ledc_output.cpp +++ b/esphome/components/ledc/ledc_output.cpp @@ -115,12 +115,15 @@ void LEDCOutput::write_state(float state) { const uint32_t max_duty = (uint32_t(1) << this->bit_depth_) - 1; const float duty_rounded = roundf(state * max_duty); auto duty = static_cast(duty_rounded); - #ifdef USE_ARDUINO ESP_LOGV(TAG, "Setting duty: %u on channel %u", duty, this->channel_); ledcWrite(this->channel_, duty); #endif #ifdef USE_ESP_IDF + // ensure that 100% on is not 99.975% on + if ((duty == max_duty) && (max_duty != 1)) { + duty = max_duty + 1; + } auto speed_mode = get_speed_mode(channel_); auto chan_num = static_cast(channel_ % 8); int hpoint = ledc_angle_to_htop(this->phase_angle_, this->bit_depth_); From 7904d3b157280387295d57e1dc9f60b253836b56 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:19:13 +1200 Subject: [PATCH 141/233] Bump version to 2024.6.4 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 2434609191..b26d8d2851 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.3" +__version__ = "2024.6.4" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From d0ab2a16a6774d0acf8efe5d475049d9439752ac Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Sat, 29 Jun 2024 14:12:59 +1200 Subject: [PATCH 142/233] [mpr121] await register parented (#7014) fixes https://github.com/esphome/issues/issues/5913 --- esphome/components/mpr121/binary_sensor/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/mpr121/binary_sensor/__init__.py b/esphome/components/mpr121/binary_sensor/__init__.py index 292c631c37..dfae92a9af 100644 --- a/esphome/components/mpr121/binary_sensor/__init__.py +++ b/esphome/components/mpr121/binary_sensor/__init__.py @@ -27,7 +27,7 @@ async def to_code(config): var = await binary_sensor.new_binary_sensor(config) hub = await cg.get_variable(config[CONF_MPR121_ID]) cg.add(var.set_channel(config[CONF_CHANNEL])) - cg.register_parented(var, hub) + await cg.register_parented(var, hub) if CONF_TOUCH_THRESHOLD in config: cg.add(var.set_touch_threshold(config[CONF_TOUCH_THRESHOLD])) From e9cf3623d1e2238b7f92fa8f9eaf6bdd788ad3e1 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 1 Jul 2024 08:54:04 +1200 Subject: [PATCH 143/233] Bump dockerfile dependencies (#7017) --- docker/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index fcb5a5e7ae..eabd118939 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -34,7 +34,7 @@ RUN \ python3-wheel=0.38.4-2 \ iputils-ping=3:20221126-1 \ git=1:2.39.2-1.1 \ - curl=7.88.1-10+deb12u5 \ + curl=7.88.1-10+deb12u6 \ openssh-client=1:9.2p1-2+deb12u2 \ python3-cffi=1.15.1-5 \ libcairo2=1.16.0-7 \ @@ -190,8 +190,8 @@ RUN \ clang-format-13=1:13.0.1-11+b2 \ clang-tidy-14=1:14.0.6-12 \ patch=2.7.6-7 \ - software-properties-common=0.99.30-4 \ - nano=7.2-1 \ + software-properties-common=0.99.30-4.1~deb12u1 \ + nano=7.2-1+deb12u1 \ build-essential=12.9 \ python3-dev=3.11.2-1+b1 \ && rm -rf \ From 6294c3b913d1f36b92f3c3845c4101644343e95e Mon Sep 17 00:00:00 2001 From: orland0m Date: Sun, 30 Jun 2024 16:06:59 -0700 Subject: [PATCH 144/233] Enable devcontainer linters (#7019) --- .devcontainer/devcontainer.json | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 4596b59200..8d9565ad5f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,7 +1,9 @@ { "name": "ESPHome Dev", "image": "ghcr.io/esphome/esphome-lint:dev", - "postCreateCommand": ["script/devcontainer-post-create"], + "postCreateCommand": [ + "script/devcontainer-post-create" + ], "containerEnv": { "DEVCONTAINER": "1", "PIP_BREAK_SYSTEM_PACKAGES": "1", @@ -27,6 +29,9 @@ "extensions": [ // python "ms-python.python", + "ms-python.pylint", + "ms-python.flake8", + "ms-python.black-formatter", "visualstudioexptteam.vscodeintellicode", // yaml "redhat.vscode-yaml", @@ -38,9 +43,21 @@ "settings": { "python.languageServer": "Pylance", "python.pythonPath": "/usr/bin/python3", - "python.linting.pylintEnabled": true, - "python.linting.enabled": true, - "python.formatting.provider": "black", + "pylint.args": [ + "--rcfile=${workspaceFolder}/pyproject.toml" + ], + "flake8.args": [ + "--config=${workspaceFolder}/.flake8" + ], + "black-formatter.args": [ + "--config", + "${workspaceFolder}/pyproject.toml" + ], + "[python]": { + // VS will say "Value is not accepted" before building the devcontainer, but the warning + // should go away after build is completed. + "editor.defaultFormatter": "ms-python.black-formatter" + }, "editor.formatOnPaste": false, "editor.formatOnSave": true, "editor.formatOnType": true, From 715184070d92ac437db85d37c64c30c135725b53 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:17:44 +1200 Subject: [PATCH 145/233] [docker] Bump versions inside armv7 block (#7022) --- docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index eabd118939..b0c800f167 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -46,8 +46,8 @@ RUN \ python3-dev=3.11.2-1+b1 \ zlib1g-dev=1:1.2.13.dfsg-1 \ libjpeg-dev=1:2.1.5-2 \ - libfreetype-dev=2.12.1+dfsg-5 \ - libssl-dev=3.0.11-1~deb12u2 \ + libfreetype-dev=2.12.1+dfsg-5+deb12u3 \ + libssl-dev=3.0.13-1~deb12u1 \ libffi-dev=3.4.4-1 \ libopenjp2-7=2.5.0-2 \ libtiff6=4.5.0-6+deb12u1 \ From b89dea97d9bfbe81f0eb639544e4e186b67c8378 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:51:51 +1200 Subject: [PATCH 146/233] [docker] Fix docker build error fall through (#7021) --- docker/Dockerfile | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index b0c800f167..16f37274c6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -39,23 +39,27 @@ RUN \ python3-cffi=1.15.1-5 \ libcairo2=1.16.0-7 \ libmagic1=1:5.44-3 \ - patch=2.7.6-7; \ - if [ "$TARGETARCH$TARGETVARIANT" = "armv7" ]; then \ - apt-get install -y --no-install-recommends \ - build-essential=12.9 \ - python3-dev=3.11.2-1+b1 \ - zlib1g-dev=1:1.2.13.dfsg-1 \ - libjpeg-dev=1:2.1.5-2 \ - libfreetype-dev=2.12.1+dfsg-5+deb12u3 \ - libssl-dev=3.0.13-1~deb12u1 \ - libffi-dev=3.4.4-1 \ - libopenjp2-7=2.5.0-2 \ - libtiff6=4.5.0-6+deb12u1 \ - cargo=0.66.0+ds1-1 \ - pkg-config=1.8.1-1 \ - gcc-arm-linux-gnueabihf=4:12.2.0-3; \ - fi; \ - rm -rf \ + patch=2.7.6-7 \ + && ( \ + ( \ + [ "$TARGETARCH$TARGETVARIANT" = "armv7" ] && \ + apt-get install -y --no-install-recommends \ + build-essential=12.9 \ + python3-dev=3.11.2-1+b1 \ + zlib1g-dev=1:1.2.13.dfsg-1 \ + libjpeg-dev=1:2.1.5-2 \ + libfreetype-dev=2.12.1+dfsg-5+deb12u3 \ + libssl-dev=3.0.13-1~deb12u1 \ + libffi-dev=3.4.4-1 \ + libopenjp2-7=2.5.0-2 \ + libtiff6=4.5.0-6+deb12u1 \ + cargo=0.66.0+ds1-1 \ + pkg-config=1.8.1-1 \ + gcc-arm-linux-gnueabihf=4:12.2.0-3 \ + ) \ + || [ "$TARGETARCH$TARGETVARIANT" != "armv7" ] \ + ) \ + && rm -rf \ /tmp/* \ /var/{cache,log}/* \ /var/lib/apt/lists/* From 5278ae4b5e620cd6983f2371759c18099878e1fe Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Sun, 30 Jun 2024 19:52:05 -0400 Subject: [PATCH 147/233] 'uart' and 'improv_serial' need to understand non-UART logger configurations (#6998) --- .../improv_serial/improv_serial_component.cpp | 16 +++++----- .../uart/uart_component_esp32_arduino.cpp | 22 +++++++++++--- .../uart/uart_component_esp_idf.cpp | 24 +++++++++++++-- .../{common.yaml => common-default_uart.yaml} | 0 tests/components/logger/common-usb_cdc.yaml | 8 +++++ .../logger/common-usb_serial_jtag.yaml | 8 +++++ .../logger/test-usb_cdc.esp32-c3-ard.yaml | 1 + .../logger/test-usb_cdc.esp32-s2-ard.yaml | 1 + .../logger/test-usb_cdc.esp32-s2-idf.yaml | 1 + .../logger/test-usb_cdc.esp32-s3-ard.yaml | 1 + .../test-usb_serial_jtag.esp32-c3-idf.yaml | 1 + .../test-usb_serial_jtag.esp32-s3-idf.yaml | 1 + tests/components/logger/test.esp32-ard.yaml | 2 +- .../components/logger/test.esp32-c3-ard.yaml | 2 +- .../components/logger/test.esp32-c3-idf.yaml | 2 +- tests/components/logger/test.esp32-idf.yaml | 2 +- tests/components/logger/test.esp8266-ard.yaml | 2 +- tests/components/logger/test.rp2040-ard.yaml | 2 +- ...st-uart_max_with_usb_cdc.esp32-c3-ard.yaml | 30 +++++++++++++++++++ ...st-uart_max_with_usb_cdc.esp32-s2-ard.yaml | 30 +++++++++++++++++++ ...st-uart_max_with_usb_cdc.esp32-s2-idf.yaml | 30 +++++++++++++++++++ ...st-uart_max_with_usb_cdc.esp32-s3-ard.yaml | 30 +++++++++++++++++++ ...max_with_usb_serial_jtag.esp32-c3-idf.yaml | 30 +++++++++++++++++++ ...max_with_usb_serial_jtag.esp32-s3-idf.yaml | 30 +++++++++++++++++++ 24 files changed, 256 insertions(+), 20 deletions(-) rename tests/components/logger/{common.yaml => common-default_uart.yaml} (100%) create mode 100644 tests/components/logger/common-usb_cdc.yaml create mode 100644 tests/components/logger/common-usb_serial_jtag.yaml create mode 100644 tests/components/logger/test-usb_cdc.esp32-c3-ard.yaml create mode 100644 tests/components/logger/test-usb_cdc.esp32-s2-ard.yaml create mode 100644 tests/components/logger/test-usb_cdc.esp32-s2-idf.yaml create mode 100644 tests/components/logger/test-usb_cdc.esp32-s3-ard.yaml create mode 100644 tests/components/logger/test-usb_serial_jtag.esp32-c3-idf.yaml create mode 100644 tests/components/logger/test-usb_serial_jtag.esp32-s3-idf.yaml create mode 100644 tests/components/uart/test-uart_max_with_usb_cdc.esp32-c3-ard.yaml create mode 100644 tests/components/uart/test-uart_max_with_usb_cdc.esp32-s2-ard.yaml create mode 100644 tests/components/uart/test-uart_max_with_usb_cdc.esp32-s2-idf.yaml create mode 100644 tests/components/uart/test-uart_max_with_usb_cdc.esp32-s3-ard.yaml create mode 100644 tests/components/uart/test-uart_max_with_usb_serial_jtag.esp32-c3-idf.yaml create mode 100644 tests/components/uart/test-uart_max_with_usb_serial_jtag.esp32-s3-idf.yaml diff --git a/esphome/components/improv_serial/improv_serial_component.cpp b/esphome/components/improv_serial/improv_serial_component.cpp index 2937720496..02ffa9f31c 100644 --- a/esphome/components/improv_serial/improv_serial_component.cpp +++ b/esphome/components/improv_serial/improv_serial_component.cpp @@ -57,7 +57,7 @@ optional ImprovSerialComponent::read_byte_() { } } break; -#if defined(CONFIG_ESP_CONSOLE_USB_CDC) && (defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)) +#ifdef USE_LOGGER_USB_CDC case logger::UART_SELECTION_USB_CDC: #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) if (esp_usb_console_available_for_read()) { @@ -68,15 +68,15 @@ optional ImprovSerialComponent::read_byte_() { byte = data; } break; -#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 -#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3) +#endif // USE_LOGGER_USB_CDC +#ifdef USE_LOGGER_USB_SERIAL_JTAG case logger::UART_SELECTION_USB_SERIAL_JTAG: { if (usb_serial_jtag_read_bytes((char *) &data, 1, 0)) { byte = data; } break; } -#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32C6 || USE_ESP32_VARIANT_ESP32S3 +#endif // USE_LOGGER_USB_SERIAL_JTAG default: break; } @@ -99,19 +99,19 @@ void ImprovSerialComponent::write_data_(std::vector &data) { #endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3 uart_write_bytes(this->uart_num_, data.data(), data.size()); break; -#if defined(CONFIG_ESP_CONSOLE_USB_CDC) && (defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3)) +#ifdef USE_LOGGER_USB_CDC case logger::UART_SELECTION_USB_CDC: { const char *msg = (char *) data.data(); esp_usb_console_write_buf(msg, data.size()); break; } -#endif // USE_ESP32_VARIANT_ESP32S2 || USE_ESP32_VARIANT_ESP32S3 -#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32C6) || defined(USE_ESP32_VARIANT_ESP32S3) +#endif // USE_LOGGER_USB_CDC +#ifdef USE_LOGGER_USB_SERIAL_JTAG case logger::UART_SELECTION_USB_SERIAL_JTAG: usb_serial_jtag_write_bytes((char *) data.data(), data.size(), 20 / portTICK_PERIOD_MS); usb_serial_jtag_ll_txfifo_flush(); // fixes for issue in IDF 4.4.7 break; -#endif // USE_ESP32_VARIANT_ESP32C3 || USE_ESP32_VARIANT_ESP32S3 +#endif // USE_LOGGER_USB_SERIAL_JTAG default: break; } diff --git a/esphome/components/uart/uart_component_esp32_arduino.cpp b/esphome/components/uart/uart_component_esp32_arduino.cpp index f77783e20e..793c1d52f4 100644 --- a/esphome/components/uart/uart_component_esp32_arduino.cpp +++ b/esphome/components/uart/uart_component_esp32_arduino.cpp @@ -96,10 +96,24 @@ void ESP32ArduinoUARTComponent::setup() { next_uart_num++; } else { #ifdef USE_LOGGER - // The logger doesn't use this UART component, instead it targets the UARTs - // directly (i.e. Serial/Serial0, Serial1, and Serial2). If the logger is - // enabled, skip the UART that it is configured to use. - if (logger::global_logger->get_baud_rate() > 0 && logger::global_logger->get_uart() == next_uart_num) { + bool logger_uses_hardware_uart = true; + +#ifdef USE_LOGGER_USB_CDC + if (logger::global_logger->get_uart() == logger::UART_SELECTION_USB_CDC) { + // this is not a hardware UART, ignore it + logger_uses_hardware_uart = false; + } +#endif // USE_LOGGER_USB_CDC + +#ifdef USE_LOGGER_USB_SERIAL_JTAG + if (logger::global_logger->get_uart() == logger::UART_SELECTION_USB_SERIAL_JTAG) { + // this is not a hardware UART, ignore it + logger_uses_hardware_uart = false; + } +#endif // USE_LOGGER_USB_SERIAL_JTAG + + if (logger_uses_hardware_uart && logger::global_logger->get_baud_rate() > 0 && + logger::global_logger->get_uart() == next_uart_num) { next_uart_num++; } #endif // USE_LOGGER diff --git a/esphome/components/uart/uart_component_esp_idf.cpp b/esphome/components/uart/uart_component_esp_idf.cpp index c66753b0c4..6999dfb619 100644 --- a/esphome/components/uart/uart_component_esp_idf.cpp +++ b/esphome/components/uart/uart_component_esp_idf.cpp @@ -60,10 +60,30 @@ uart_config_t IDFUARTComponent::get_config_() { void IDFUARTComponent::setup() { static uint8_t next_uart_num = 0; + #ifdef USE_LOGGER - if (logger::global_logger->get_uart_num() == next_uart_num) + bool logger_uses_hardware_uart = true; + +#ifdef USE_LOGGER_USB_CDC + if (logger::global_logger->get_uart() == logger::UART_SELECTION_USB_CDC) { + // this is not a hardware UART, ignore it + logger_uses_hardware_uart = false; + } +#endif // USE_LOGGER_USB_CDC + +#ifdef USE_LOGGER_USB_SERIAL_JTAG + if (logger::global_logger->get_uart() == logger::UART_SELECTION_USB_SERIAL_JTAG) { + // this is not a hardware UART, ignore it + logger_uses_hardware_uart = false; + } +#endif // USE_LOGGER_USB_SERIAL_JTAG + + if (logger_uses_hardware_uart && logger::global_logger->get_baud_rate() > 0 && + logger::global_logger->get_uart_num() == next_uart_num) { next_uart_num++; -#endif + } +#endif // USE_LOGGER + if (next_uart_num >= UART_NUM_MAX) { ESP_LOGW(TAG, "Maximum number of UART components created already."); this->mark_failed(); diff --git a/tests/components/logger/common.yaml b/tests/components/logger/common-default_uart.yaml similarity index 100% rename from tests/components/logger/common.yaml rename to tests/components/logger/common-default_uart.yaml diff --git a/tests/components/logger/common-usb_cdc.yaml b/tests/components/logger/common-usb_cdc.yaml new file mode 100644 index 0000000000..4df320527d --- /dev/null +++ b/tests/components/logger/common-usb_cdc.yaml @@ -0,0 +1,8 @@ +esphome: + on_boot: + then: + - logger.log: Hello world + +logger: + level: DEBUG + hardware_uart: USB_CDC diff --git a/tests/components/logger/common-usb_serial_jtag.yaml b/tests/components/logger/common-usb_serial_jtag.yaml new file mode 100644 index 0000000000..5891c9ea40 --- /dev/null +++ b/tests/components/logger/common-usb_serial_jtag.yaml @@ -0,0 +1,8 @@ +esphome: + on_boot: + then: + - logger.log: Hello world + +logger: + level: DEBUG + hardware_uart: USB_SERIAL_JTAG diff --git a/tests/components/logger/test-usb_cdc.esp32-c3-ard.yaml b/tests/components/logger/test-usb_cdc.esp32-c3-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/logger/test-usb_cdc.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/logger/test-usb_cdc.esp32-s2-ard.yaml b/tests/components/logger/test-usb_cdc.esp32-s2-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/logger/test-usb_cdc.esp32-s2-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/logger/test-usb_cdc.esp32-s2-idf.yaml b/tests/components/logger/test-usb_cdc.esp32-s2-idf.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/logger/test-usb_cdc.esp32-s2-idf.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/logger/test-usb_cdc.esp32-s3-ard.yaml b/tests/components/logger/test-usb_cdc.esp32-s3-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/logger/test-usb_cdc.esp32-s3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/logger/test-usb_serial_jtag.esp32-c3-idf.yaml b/tests/components/logger/test-usb_serial_jtag.esp32-c3-idf.yaml new file mode 100644 index 0000000000..46a927ff10 --- /dev/null +++ b/tests/components/logger/test-usb_serial_jtag.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-usb_serial_jtag.yaml diff --git a/tests/components/logger/test-usb_serial_jtag.esp32-s3-idf.yaml b/tests/components/logger/test-usb_serial_jtag.esp32-s3-idf.yaml new file mode 100644 index 0000000000..46a927ff10 --- /dev/null +++ b/tests/components/logger/test-usb_serial_jtag.esp32-s3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-usb_serial_jtag.yaml diff --git a/tests/components/logger/test.esp32-ard.yaml b/tests/components/logger/test.esp32-ard.yaml index dade44d145..3fe04e18a3 100644 --- a/tests/components/logger/test.esp32-ard.yaml +++ b/tests/components/logger/test.esp32-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common-default_uart.yaml diff --git a/tests/components/logger/test.esp32-c3-ard.yaml b/tests/components/logger/test.esp32-c3-ard.yaml index dade44d145..3fe04e18a3 100644 --- a/tests/components/logger/test.esp32-c3-ard.yaml +++ b/tests/components/logger/test.esp32-c3-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common-default_uart.yaml diff --git a/tests/components/logger/test.esp32-c3-idf.yaml b/tests/components/logger/test.esp32-c3-idf.yaml index dade44d145..3fe04e18a3 100644 --- a/tests/components/logger/test.esp32-c3-idf.yaml +++ b/tests/components/logger/test.esp32-c3-idf.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common-default_uart.yaml diff --git a/tests/components/logger/test.esp32-idf.yaml b/tests/components/logger/test.esp32-idf.yaml index dade44d145..3fe04e18a3 100644 --- a/tests/components/logger/test.esp32-idf.yaml +++ b/tests/components/logger/test.esp32-idf.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common-default_uart.yaml diff --git a/tests/components/logger/test.esp8266-ard.yaml b/tests/components/logger/test.esp8266-ard.yaml index dade44d145..3fe04e18a3 100644 --- a/tests/components/logger/test.esp8266-ard.yaml +++ b/tests/components/logger/test.esp8266-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common-default_uart.yaml diff --git a/tests/components/logger/test.rp2040-ard.yaml b/tests/components/logger/test.rp2040-ard.yaml index dade44d145..3fe04e18a3 100644 --- a/tests/components/logger/test.rp2040-ard.yaml +++ b/tests/components/logger/test.rp2040-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common-default_uart.yaml diff --git a/tests/components/uart/test-uart_max_with_usb_cdc.esp32-c3-ard.yaml b/tests/components/uart/test-uart_max_with_usb_cdc.esp32-c3-ard.yaml new file mode 100644 index 0000000000..2a73826c51 --- /dev/null +++ b/tests/components/uart/test-uart_max_with_usb_cdc.esp32-c3-ard.yaml @@ -0,0 +1,30 @@ +<<: !include ../logger/common-usb_cdc.yaml + +esphome: + on_boot: + then: + - uart.write: + id: uart_1 + data: 'Hello World' + - uart.write: + id: uart_1 + data: [0x00, 0x20, 0x42] + +uart: + - id: uart_1 + tx_pin: 4 + rx_pin: 5 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 + + - id: uart_2 + tx_pin: 6 + rx_pin: 7 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 diff --git a/tests/components/uart/test-uart_max_with_usb_cdc.esp32-s2-ard.yaml b/tests/components/uart/test-uart_max_with_usb_cdc.esp32-s2-ard.yaml new file mode 100644 index 0000000000..2a73826c51 --- /dev/null +++ b/tests/components/uart/test-uart_max_with_usb_cdc.esp32-s2-ard.yaml @@ -0,0 +1,30 @@ +<<: !include ../logger/common-usb_cdc.yaml + +esphome: + on_boot: + then: + - uart.write: + id: uart_1 + data: 'Hello World' + - uart.write: + id: uart_1 + data: [0x00, 0x20, 0x42] + +uart: + - id: uart_1 + tx_pin: 4 + rx_pin: 5 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 + + - id: uart_2 + tx_pin: 6 + rx_pin: 7 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 diff --git a/tests/components/uart/test-uart_max_with_usb_cdc.esp32-s2-idf.yaml b/tests/components/uart/test-uart_max_with_usb_cdc.esp32-s2-idf.yaml new file mode 100644 index 0000000000..2a73826c51 --- /dev/null +++ b/tests/components/uart/test-uart_max_with_usb_cdc.esp32-s2-idf.yaml @@ -0,0 +1,30 @@ +<<: !include ../logger/common-usb_cdc.yaml + +esphome: + on_boot: + then: + - uart.write: + id: uart_1 + data: 'Hello World' + - uart.write: + id: uart_1 + data: [0x00, 0x20, 0x42] + +uart: + - id: uart_1 + tx_pin: 4 + rx_pin: 5 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 + + - id: uart_2 + tx_pin: 6 + rx_pin: 7 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 diff --git a/tests/components/uart/test-uart_max_with_usb_cdc.esp32-s3-ard.yaml b/tests/components/uart/test-uart_max_with_usb_cdc.esp32-s3-ard.yaml new file mode 100644 index 0000000000..2a73826c51 --- /dev/null +++ b/tests/components/uart/test-uart_max_with_usb_cdc.esp32-s3-ard.yaml @@ -0,0 +1,30 @@ +<<: !include ../logger/common-usb_cdc.yaml + +esphome: + on_boot: + then: + - uart.write: + id: uart_1 + data: 'Hello World' + - uart.write: + id: uart_1 + data: [0x00, 0x20, 0x42] + +uart: + - id: uart_1 + tx_pin: 4 + rx_pin: 5 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 + + - id: uart_2 + tx_pin: 6 + rx_pin: 7 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 diff --git a/tests/components/uart/test-uart_max_with_usb_serial_jtag.esp32-c3-idf.yaml b/tests/components/uart/test-uart_max_with_usb_serial_jtag.esp32-c3-idf.yaml new file mode 100644 index 0000000000..e0a07dde91 --- /dev/null +++ b/tests/components/uart/test-uart_max_with_usb_serial_jtag.esp32-c3-idf.yaml @@ -0,0 +1,30 @@ +<<: !include ../logger/common-usb_serial_jtag.yaml + +esphome: + on_boot: + then: + - uart.write: + id: uart_1 + data: 'Hello World' + - uart.write: + id: uart_1 + data: [0x00, 0x20, 0x42] + +uart: + - id: uart_1 + tx_pin: 4 + rx_pin: 5 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 + + - id: uart_2 + tx_pin: 6 + rx_pin: 7 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 diff --git a/tests/components/uart/test-uart_max_with_usb_serial_jtag.esp32-s3-idf.yaml b/tests/components/uart/test-uart_max_with_usb_serial_jtag.esp32-s3-idf.yaml new file mode 100644 index 0000000000..e0a07dde91 --- /dev/null +++ b/tests/components/uart/test-uart_max_with_usb_serial_jtag.esp32-s3-idf.yaml @@ -0,0 +1,30 @@ +<<: !include ../logger/common-usb_serial_jtag.yaml + +esphome: + on_boot: + then: + - uart.write: + id: uart_1 + data: 'Hello World' + - uart.write: + id: uart_1 + data: [0x00, 0x20, 0x42] + +uart: + - id: uart_1 + tx_pin: 4 + rx_pin: 5 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 + + - id: uart_2 + tx_pin: 6 + rx_pin: 7 + baud_rate: 9600 + data_bits: 8 + rx_buffer_size: 512 + parity: EVEN + stop_bits: 2 From 7aaa5ce9c859426964bcca238418c4a75dd0017a Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 1 Jul 2024 01:20:59 -0500 Subject: [PATCH 148/233] Move some consts for #4585 (#7023) --- esphome/components/bme680_bsec/__init__.py | 3 +-- esphome/components/bme680_bsec/sensor.py | 12 ++++++------ esphome/components/bme680_bsec/text_sensor.py | 2 +- esphome/components/i2s_audio/microphone/__init__.py | 3 +-- esphome/const.py | 2 ++ 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/esphome/components/bme680_bsec/__init__.py b/esphome/components/bme680_bsec/__init__.py index 62ab50b8f7..743ef6e85d 100644 --- a/esphome/components/bme680_bsec/__init__.py +++ b/esphome/components/bme680_bsec/__init__.py @@ -1,7 +1,7 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import i2c, esp32 -from esphome.const import CONF_ID, CONF_TEMPERATURE_OFFSET +from esphome.const import CONF_ID, CONF_SAMPLE_RATE, CONF_TEMPERATURE_OFFSET CODEOWNERS = ["@trvrnrth"] DEPENDENCIES = ["i2c"] @@ -11,7 +11,6 @@ MULTI_CONF = True CONF_BME680_BSEC_ID = "bme680_bsec_id" CONF_IAQ_MODE = "iaq_mode" CONF_SUPPLY_VOLTAGE = "supply_voltage" -CONF_SAMPLE_RATE = "sample_rate" CONF_STATE_SAVE_INTERVAL = "state_save_interval" bme680_bsec_ns = cg.esphome_ns.namespace("bme680_bsec") diff --git a/esphome/components/bme680_bsec/sensor.py b/esphome/components/bme680_bsec/sensor.py index 43b068b926..aa96998232 100644 --- a/esphome/components/bme680_bsec/sensor.py +++ b/esphome/components/bme680_bsec/sensor.py @@ -4,33 +4,33 @@ from esphome.components import sensor from esphome.const import ( CONF_GAS_RESISTANCE, CONF_HUMIDITY, + CONF_IAQ_ACCURACY, CONF_PRESSURE, + CONF_SAMPLE_RATE, CONF_TEMPERATURE, + DEVICE_CLASS_ATMOSPHERIC_PRESSURE, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_HUMIDITY, - DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS_PARTS, - DEVICE_CLASS_ATMOSPHERIC_PRESSURE, DEVICE_CLASS_TEMPERATURE, + DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS_PARTS, + ICON_GAS_CYLINDER, + ICON_GAUGE, STATE_CLASS_MEASUREMENT, UNIT_CELSIUS, UNIT_HECTOPASCAL, UNIT_OHM, UNIT_PARTS_PER_MILLION, UNIT_PERCENT, - ICON_GAS_CYLINDER, - ICON_GAUGE, ) from . import ( BME680BSECComponent, CONF_BME680_BSEC_ID, - CONF_SAMPLE_RATE, SAMPLE_RATE_OPTIONS, ) DEPENDENCIES = ["bme680_bsec"] CONF_IAQ = "iaq" -CONF_IAQ_ACCURACY = "iaq_accuracy" CONF_CO2_EQUIVALENT = "co2_equivalent" CONF_BREATH_VOC_EQUIVALENT = "breath_voc_equivalent" UNIT_IAQ = "IAQ" diff --git a/esphome/components/bme680_bsec/text_sensor.py b/esphome/components/bme680_bsec/text_sensor.py index 3494ba0cac..6b46e501da 100644 --- a/esphome/components/bme680_bsec/text_sensor.py +++ b/esphome/components/bme680_bsec/text_sensor.py @@ -1,11 +1,11 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import text_sensor +from esphome.const import CONF_IAQ_ACCURACY from . import BME680BSECComponent, CONF_BME680_BSEC_ID DEPENDENCIES = ["bme680_bsec"] -CONF_IAQ_ACCURACY = "iaq_accuracy" ICON_ACCURACY = "mdi:checkbox-marked-circle-outline" TYPES = [CONF_IAQ_ACCURACY] diff --git a/esphome/components/i2s_audio/microphone/__init__.py b/esphome/components/i2s_audio/microphone/__init__.py index 5ee359dc26..d9c31e8e7b 100644 --- a/esphome/components/i2s_audio/microphone/__init__.py +++ b/esphome/components/i2s_audio/microphone/__init__.py @@ -2,7 +2,7 @@ import esphome.config_validation as cv import esphome.codegen as cg from esphome import pins -from esphome.const import CONF_CHANNEL, CONF_ID, CONF_NUMBER +from esphome.const import CONF_CHANNEL, CONF_ID, CONF_NUMBER, CONF_SAMPLE_RATE from esphome.components import microphone, esp32 from esphome.components.adc import ESP32_VARIANT_ADC1_PIN_TO_CHANNEL, validate_adc_pin @@ -20,7 +20,6 @@ DEPENDENCIES = ["i2s_audio"] CONF_ADC_PIN = "adc_pin" CONF_ADC_TYPE = "adc_type" CONF_PDM = "pdm" -CONF_SAMPLE_RATE = "sample_rate" CONF_BITS_PER_SAMPLE = "bits_per_sample" CONF_USE_APLL = "use_apll" diff --git a/esphome/const.py b/esphome/const.py index a13a0af8eb..543b1d00cc 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -355,6 +355,7 @@ CONF_HUMIDITY_SENSOR = "humidity_sensor" CONF_HYSTERESIS = "hysteresis" CONF_I2C = "i2c" CONF_I2C_ID = "i2c_id" +CONF_IAQ_ACCURACY = "iaq_accuracy" CONF_IBEACON_MAJOR = "ibeacon_major" CONF_IBEACON_MINOR = "ibeacon_minor" CONF_IBEACON_UUID = "ibeacon_uuid" @@ -719,6 +720,7 @@ CONF_RX_BUFFER_SIZE = "rx_buffer_size" CONF_RX_ONLY = "rx_only" CONF_RX_PIN = "rx_pin" CONF_SAFE_MODE = "safe_mode" +CONF_SAMPLE_RATE = "sample_rate" CONF_SAMSUNG = "samsung" CONF_SATELLITES = "satellites" CONF_SCAN = "scan" From 582386d3a2cf0812e84f5e245b3f1764b185c88b Mon Sep 17 00:00:00 2001 From: Andreas Fritiofson Date: Tue, 2 Jul 2024 03:47:56 +0200 Subject: [PATCH 149/233] Make crc8 const-correct (#7027) --- esphome/core/helpers.cpp | 2 +- esphome/core/helpers.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/core/helpers.cpp b/esphome/core/helpers.cpp index dee771d4e9..7f040f855f 100644 --- a/esphome/core/helpers.cpp +++ b/esphome/core/helpers.cpp @@ -93,7 +93,7 @@ std::string to_string(long double value) { return str_snprintf("%Lf", 32, value) // Mathematics float lerp(float completion, float start, float end) { return start + (end - start) * completion; } -uint8_t crc8(uint8_t *data, uint8_t len) { +uint8_t crc8(const uint8_t *data, uint8_t len) { uint8_t crc = 0; while ((len--) != 0u) { diff --git a/esphome/core/helpers.h b/esphome/core/helpers.h index 4af840f77b..b4ad22b083 100644 --- a/esphome/core/helpers.h +++ b/esphome/core/helpers.h @@ -155,7 +155,7 @@ template T remap(U value, U min, U max, T min_out, T max } /// Calculate a CRC-8 checksum of \p data with size \p len. -uint8_t crc8(uint8_t *data, uint8_t len); +uint8_t crc8(const uint8_t *data, uint8_t len); /// Calculate a CRC-16 checksum of \p data with size \p len. uint16_t crc16(const uint8_t *data, uint16_t len, uint16_t crc = 0xffff, uint16_t reverse_poly = 0xa001, From 83f9664efbc04fa0b66780c23aabc85557aa85f0 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 1 Jul 2024 21:06:33 -0500 Subject: [PATCH 150/233] [CI] Run all tests when a base test changes (#7010) --- script/list-components.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/script/list-components.py b/script/list-components.py index 4eccdbf96c..559919bb8a 100755 --- a/script/list-components.py +++ b/script/list-components.py @@ -140,7 +140,10 @@ def get_components(files: list[str], get_dependencies: bool = False): def main(): parser = argparse.ArgumentParser() parser.add_argument( - "-c", "--changed", action="store_true", help="Only run on changed files" + "-c", + "--changed", + action="store_true", + help="List all components required for testing based on changes", ) parser.add_argument( "-b", "--branch", help="Branch to compare changed files against" @@ -158,7 +161,9 @@ def main(): changed = changed_files(args.branch) else: changed = changed_files() - files = [f for f in files if f in changed] + # If any base test file(s) changed, there's no need to filter out components + if not any("tests/test_build_components" in file for file in changed): + files = [f for f in files if f in changed] for c in get_components(files, args.changed): print(c) From 5e6c69b9307724f62ff25873d7c687cf239104dc Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 1 Jul 2024 21:07:36 -0500 Subject: [PATCH 151/233] [CI] Update tests to run against IDF 5.1 (#7011) --- ...f-50.yaml => build_components_base.esp32-c3-idf-51.yaml} | 6 +++--- ...-idf-50.yaml => build_components_base.esp32-idf-51.yaml} | 6 +++--- ...f-50.yaml => build_components_base.esp32-s2-idf-51.yaml} | 6 +++--- ...f-50.yaml => build_components_base.esp32-s3-idf-51.yaml} | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) rename tests/test_build_components/{build_components_base.esp32-c3-idf-50.yaml => build_components_base.esp32-c3-idf-51.yaml} (76%) rename tests/test_build_components/{build_components_base.esp32-idf-50.yaml => build_components_base.esp32-idf-51.yaml} (77%) rename tests/test_build_components/{build_components_base.esp32-s2-idf-50.yaml => build_components_base.esp32-s2-idf-51.yaml} (78%) rename tests/test_build_components/{build_components_base.esp32-s3-idf-50.yaml => build_components_base.esp32-s3-idf-51.yaml} (77%) diff --git a/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml similarity index 76% rename from tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml index 08d4d8679c..eb5b23a4ec 100644 --- a/tests/test_build_components/build_components_base.esp32-c3-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-c3-idf-51.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32c3idf50 + name: componenttestesp32c3idf51 friendly_name: $component_name esp32: board: lolin_c3_mini framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.5.0 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-idf-51.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-idf-51.yaml index c9f2c1e943..b5e3dd6d83 100644 --- a/tests/test_build_components/build_components_base.esp32-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-idf-51.yaml @@ -1,13 +1,13 @@ esphome: - name: componenttestesp32idf50 + name: componenttestesp32idf51 friendly_name: $component_name esp32: board: nodemcu-32s framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.5.0 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml similarity index 78% rename from tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml index 351f5fb019..11b077509e 100644 --- a/tests/test_build_components/build_components_base.esp32-s2-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-s2-idf-51.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s2idf50 + name: componenttestesp32s2idf51 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S2 framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.5.0 logger: level: VERY_VERBOSE diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml similarity index 77% rename from tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml rename to tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml index c05378903f..4357b3581b 100644 --- a/tests/test_build_components/build_components_base.esp32-s3-idf-50.yaml +++ b/tests/test_build_components/build_components_base.esp32-s3-idf-51.yaml @@ -1,5 +1,5 @@ esphome: - name: componenttestesp32s3idf50 + name: componenttestesp32s3idf51 friendly_name: $component_name esp32: @@ -7,8 +7,8 @@ esp32: variant: ESP32S3 framework: type: esp-idf - version: 5.0.2 - platform_version: 6.3.2 + version: 5.1.2 + platform_version: 6.5.0 logger: level: VERY_VERBOSE From d8f0dce08f6e76cddd1ccc784713f14befb4c36f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 2 Jul 2024 14:29:49 +1200 Subject: [PATCH 152/233] [uptime] Add new timestamp type for uptime sensor (#7029) * [uptime] Add new timestamp type for uptime sensor * Remove debug logs --- esphome/components/uptime/sensor.py | 55 +++++++++++++++---- ...e_sensor.cpp => uptime_seconds_sensor.cpp} | 18 +++--- ...ptime_sensor.h => uptime_seconds_sensor.h} | 4 +- .../uptime/uptime_timestamp_sensor.cpp | 39 +++++++++++++ .../uptime/uptime_timestamp_sensor.h | 30 ++++++++++ tests/components/uptime/common.yaml | 12 ++++ 6 files changed, 138 insertions(+), 20 deletions(-) rename esphome/components/uptime/{uptime_sensor.cpp => uptime_seconds_sensor.cpp} (72%) rename esphome/components/uptime/{uptime_sensor.h => uptime_seconds_sensor.h} (82%) create mode 100644 esphome/components/uptime/uptime_timestamp_sensor.cpp create mode 100644 esphome/components/uptime/uptime_timestamp_sensor.h diff --git a/esphome/components/uptime/sensor.py b/esphome/components/uptime/sensor.py index 07d7d8f2cf..30220751b6 100644 --- a/esphome/components/uptime/sensor.py +++ b/esphome/components/uptime/sensor.py @@ -1,7 +1,9 @@ import esphome.codegen as cg import esphome.config_validation as cv -from esphome.components import sensor +from esphome.components import sensor, time from esphome.const import ( + CONF_TIME_ID, + DEVICE_CLASS_TIMESTAMP, ENTITY_CATEGORY_DIAGNOSTIC, STATE_CLASS_TOTAL_INCREASING, UNIT_SECOND, @@ -10,19 +12,50 @@ from esphome.const import ( ) uptime_ns = cg.esphome_ns.namespace("uptime") -UptimeSensor = uptime_ns.class_("UptimeSensor", sensor.Sensor, cg.PollingComponent) +UptimeSecondsSensor = uptime_ns.class_( + "UptimeSecondsSensor", sensor.Sensor, cg.PollingComponent +) +UptimeTimestampSensor = uptime_ns.class_( + "UptimeTimestampSensor", sensor.Sensor, cg.Component +) -CONFIG_SCHEMA = sensor.sensor_schema( - UptimeSensor, - unit_of_measurement=UNIT_SECOND, - icon=ICON_TIMER, - accuracy_decimals=0, - state_class=STATE_CLASS_TOTAL_INCREASING, - device_class=DEVICE_CLASS_DURATION, - entity_category=ENTITY_CATEGORY_DIAGNOSTIC, -).extend(cv.polling_component_schema("60s")) + +CONFIG_SCHEMA = cv.typed_schema( + { + "seconds": sensor.sensor_schema( + UptimeSecondsSensor, + unit_of_measurement=UNIT_SECOND, + icon=ICON_TIMER, + accuracy_decimals=0, + state_class=STATE_CLASS_TOTAL_INCREASING, + device_class=DEVICE_CLASS_DURATION, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ).extend(cv.polling_component_schema("60s")), + "timestamp": sensor.sensor_schema( + UptimeTimestampSensor, + icon=ICON_TIMER, + accuracy_decimals=0, + device_class=DEVICE_CLASS_TIMESTAMP, + entity_category=ENTITY_CATEGORY_DIAGNOSTIC, + ) + .extend( + cv.Schema( + { + cv.GenerateID(CONF_TIME_ID): cv.All( + cv.requires_component("time"), cv.use_id(time.RealTimeClock) + ), + } + ) + ) + .extend(cv.COMPONENT_SCHEMA), + }, + default_type="seconds", +) async def to_code(config): var = await sensor.new_sensor(config) await cg.register_component(var, config) + if time_id_config := config.get(CONF_TIME_ID): + time_id = await cg.get_variable(time_id_config) + cg.add(var.set_time(time_id)) diff --git a/esphome/components/uptime/uptime_sensor.cpp b/esphome/components/uptime/uptime_seconds_sensor.cpp similarity index 72% rename from esphome/components/uptime/uptime_sensor.cpp rename to esphome/components/uptime/uptime_seconds_sensor.cpp index 40325d2a36..fa6b9d621d 100644 --- a/esphome/components/uptime/uptime_sensor.cpp +++ b/esphome/components/uptime/uptime_seconds_sensor.cpp @@ -1,14 +1,15 @@ -#include "uptime_sensor.h" -#include "esphome/core/log.h" -#include "esphome/core/helpers.h" +#include "uptime_seconds_sensor.h" + #include "esphome/core/hal.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" namespace esphome { namespace uptime { static const char *const TAG = "uptime.sensor"; -void UptimeSensor::update() { +void UptimeSecondsSensor::update() { const uint32_t ms = millis(); const uint64_t ms_mask = (1ULL << 32) - 1ULL; const uint32_t last_ms = this->uptime_ & ms_mask; @@ -26,9 +27,12 @@ void UptimeSensor::update() { const float seconds = float(seconds_int) + (this->uptime_ % 1000ULL) / 1000.0f; this->publish_state(seconds); } -std::string UptimeSensor::unique_id() { return get_mac_address() + "-uptime"; } -float UptimeSensor::get_setup_priority() const { return setup_priority::HARDWARE; } -void UptimeSensor::dump_config() { LOG_SENSOR("", "Uptime Sensor", this); } +std::string UptimeSecondsSensor::unique_id() { return get_mac_address() + "-uptime"; } +float UptimeSecondsSensor::get_setup_priority() const { return setup_priority::HARDWARE; } +void UptimeSecondsSensor::dump_config() { + LOG_SENSOR("", "Uptime Sensor", this); + ESP_LOGCONFIG(TAG, " Type: Seconds"); +} } // namespace uptime } // namespace esphome diff --git a/esphome/components/uptime/uptime_sensor.h b/esphome/components/uptime/uptime_seconds_sensor.h similarity index 82% rename from esphome/components/uptime/uptime_sensor.h rename to esphome/components/uptime/uptime_seconds_sensor.h index dab380d2d9..41b3647822 100644 --- a/esphome/components/uptime/uptime_sensor.h +++ b/esphome/components/uptime/uptime_seconds_sensor.h @@ -1,12 +1,12 @@ #pragma once -#include "esphome/core/component.h" #include "esphome/components/sensor/sensor.h" +#include "esphome/core/component.h" namespace esphome { namespace uptime { -class UptimeSensor : public sensor::Sensor, public PollingComponent { +class UptimeSecondsSensor : public sensor::Sensor, public PollingComponent { public: void update() override; void dump_config() override; diff --git a/esphome/components/uptime/uptime_timestamp_sensor.cpp b/esphome/components/uptime/uptime_timestamp_sensor.cpp new file mode 100644 index 0000000000..fa8cb2bb61 --- /dev/null +++ b/esphome/components/uptime/uptime_timestamp_sensor.cpp @@ -0,0 +1,39 @@ +#include "uptime_timestamp_sensor.h" + +#ifdef USE_TIME + +#include "esphome/core/hal.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" + +namespace esphome { +namespace uptime { + +static const char *const TAG = "uptime.sensor"; + +void UptimeTimestampSensor::setup() { + this->time_->add_on_time_sync_callback([this]() { + if (this->has_state_) + return; // No need to update the timestamp if it's already set + + auto now = this->time_->now(); + const uint32_t ms = millis(); + if (!now.is_valid()) + return; // No need to update the timestamp if the time is not valid + + time_t timestamp = now.timestamp; + uint32_t seconds = ms / 1000; + timestamp -= seconds; + this->publish_state(timestamp); + }); +} +float UptimeTimestampSensor::get_setup_priority() const { return setup_priority::HARDWARE; } +void UptimeTimestampSensor::dump_config() { + LOG_SENSOR("", "Uptime Sensor", this); + ESP_LOGCONFIG(TAG, " Type: Timestamp"); +} + +} // namespace uptime +} // namespace esphome + +#endif // USE_TIME diff --git a/esphome/components/uptime/uptime_timestamp_sensor.h b/esphome/components/uptime/uptime_timestamp_sensor.h new file mode 100644 index 0000000000..f38b5d53b4 --- /dev/null +++ b/esphome/components/uptime/uptime_timestamp_sensor.h @@ -0,0 +1,30 @@ +#pragma once + +#include "esphome/core/defines.h" + +#ifdef USE_TIME + +#include "esphome/components/sensor/sensor.h" +#include "esphome/components/time/real_time_clock.h" +#include "esphome/core/component.h" + +namespace esphome { +namespace uptime { + +class UptimeTimestampSensor : public sensor::Sensor, public Component { + public: + void setup() override; + void dump_config() override; + + float get_setup_priority() const override; + + void set_time(time::RealTimeClock *time) { this->time_ = time; } + + protected: + time::RealTimeClock *time_; +}; + +} // namespace uptime +} // namespace esphome + +#endif // USE_TIME diff --git a/tests/components/uptime/common.yaml b/tests/components/uptime/common.yaml index 872a0e7402..f63f80b050 100644 --- a/tests/components/uptime/common.yaml +++ b/tests/components/uptime/common.yaml @@ -1,3 +1,15 @@ +wifi: + ap: + +time: + - platform: sntp + sensor: - platform: uptime name: Uptime Sensor + - platform: uptime + name: Uptime Sensor Seconds + type: seconds + - platform: uptime + name: Uptime Sensor Timestamp + type: timestamp From 3fb9c93a24b3b9683c5987af3ebe88cfa0492e49 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 3 Jul 2024 14:21:41 +1200 Subject: [PATCH 153/233] [wifi] Only set default ttls phase 2 on esp-idf (#7033) * [wifi] Only set default ttls phase 2 on esp-idf * Add eap arduino test --- esphome/components/wifi/__init__.py | 4 ++-- tests/components/wifi/test-eap.esp32-ard.yaml | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 tests/components/wifi/test-eap.esp32-ard.yaml diff --git a/esphome/components/wifi/__init__.py b/esphome/components/wifi/__init__.py index 3b9e00956f..624bcdabdc 100644 --- a/esphome/components/wifi/__init__.py +++ b/esphome/components/wifi/__init__.py @@ -114,7 +114,7 @@ EAP_AUTH_SCHEMA = cv.All( cv.Optional(CONF_USERNAME): cv.string_strict, cv.Optional(CONF_PASSWORD): cv.string_strict, cv.Optional(CONF_CERTIFICATE_AUTHORITY): wpa2_eap.validate_certificate, - cv.Optional(CONF_TTLS_PHASE_2): cv.All( + cv.SplitDefault(CONF_TTLS_PHASE_2, esp32_idf="mschapv2"): cv.All( cv.enum(TTLS_PHASE_2), cv.only_with_esp_idf ), cv.Inclusive( @@ -350,7 +350,7 @@ def eap_auth(config): ("ca_cert", ca_cert), ("client_cert", client_cert), ("client_key", key), - ("ttls_phase_2", config.get(CONF_TTLS_PHASE_2, TTLS_PHASE_2["mschapv2"])), + ("ttls_phase_2", config.get(CONF_TTLS_PHASE_2)), ) diff --git a/tests/components/wifi/test-eap.esp32-ard.yaml b/tests/components/wifi/test-eap.esp32-ard.yaml new file mode 100644 index 0000000000..779cd6b49a --- /dev/null +++ b/tests/components/wifi/test-eap.esp32-ard.yaml @@ -0,0 +1,7 @@ +wifi: + networks: + - ssid: MySSID + eap: + username: username + password: password + identity: identity From 12f00a9d3d4e5354bd3c21b414b60cc14e04ee73 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Sat, 29 Jun 2024 14:12:59 +1200 Subject: [PATCH 154/233] [mpr121] await register parented (#7014) fixes https://github.com/esphome/issues/issues/5913 --- esphome/components/mpr121/binary_sensor/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/mpr121/binary_sensor/__init__.py b/esphome/components/mpr121/binary_sensor/__init__.py index 292c631c37..dfae92a9af 100644 --- a/esphome/components/mpr121/binary_sensor/__init__.py +++ b/esphome/components/mpr121/binary_sensor/__init__.py @@ -27,7 +27,7 @@ async def to_code(config): var = await binary_sensor.new_binary_sensor(config) hub = await cg.get_variable(config[CONF_MPR121_ID]) cg.add(var.set_channel(config[CONF_CHANNEL])) - cg.register_parented(var, hub) + await cg.register_parented(var, hub) if CONF_TOUCH_THRESHOLD in config: cg.add(var.set_touch_threshold(config[CONF_TOUCH_THRESHOLD])) From 0914dc719889d25e71bf12a4025c821ed6542504 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Mon, 1 Jul 2024 01:20:59 -0500 Subject: [PATCH 155/233] Move some consts for #4585 (#7023) --- esphome/components/bme680_bsec/__init__.py | 3 +-- esphome/components/bme680_bsec/sensor.py | 12 ++++++------ esphome/components/bme680_bsec/text_sensor.py | 2 +- esphome/components/i2s_audio/microphone/__init__.py | 3 +-- esphome/const.py | 2 ++ 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/esphome/components/bme680_bsec/__init__.py b/esphome/components/bme680_bsec/__init__.py index 62ab50b8f7..743ef6e85d 100644 --- a/esphome/components/bme680_bsec/__init__.py +++ b/esphome/components/bme680_bsec/__init__.py @@ -1,7 +1,7 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import i2c, esp32 -from esphome.const import CONF_ID, CONF_TEMPERATURE_OFFSET +from esphome.const import CONF_ID, CONF_SAMPLE_RATE, CONF_TEMPERATURE_OFFSET CODEOWNERS = ["@trvrnrth"] DEPENDENCIES = ["i2c"] @@ -11,7 +11,6 @@ MULTI_CONF = True CONF_BME680_BSEC_ID = "bme680_bsec_id" CONF_IAQ_MODE = "iaq_mode" CONF_SUPPLY_VOLTAGE = "supply_voltage" -CONF_SAMPLE_RATE = "sample_rate" CONF_STATE_SAVE_INTERVAL = "state_save_interval" bme680_bsec_ns = cg.esphome_ns.namespace("bme680_bsec") diff --git a/esphome/components/bme680_bsec/sensor.py b/esphome/components/bme680_bsec/sensor.py index 43b068b926..aa96998232 100644 --- a/esphome/components/bme680_bsec/sensor.py +++ b/esphome/components/bme680_bsec/sensor.py @@ -4,33 +4,33 @@ from esphome.components import sensor from esphome.const import ( CONF_GAS_RESISTANCE, CONF_HUMIDITY, + CONF_IAQ_ACCURACY, CONF_PRESSURE, + CONF_SAMPLE_RATE, CONF_TEMPERATURE, + DEVICE_CLASS_ATMOSPHERIC_PRESSURE, DEVICE_CLASS_CARBON_DIOXIDE, DEVICE_CLASS_HUMIDITY, - DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS_PARTS, - DEVICE_CLASS_ATMOSPHERIC_PRESSURE, DEVICE_CLASS_TEMPERATURE, + DEVICE_CLASS_VOLATILE_ORGANIC_COMPOUNDS_PARTS, + ICON_GAS_CYLINDER, + ICON_GAUGE, STATE_CLASS_MEASUREMENT, UNIT_CELSIUS, UNIT_HECTOPASCAL, UNIT_OHM, UNIT_PARTS_PER_MILLION, UNIT_PERCENT, - ICON_GAS_CYLINDER, - ICON_GAUGE, ) from . import ( BME680BSECComponent, CONF_BME680_BSEC_ID, - CONF_SAMPLE_RATE, SAMPLE_RATE_OPTIONS, ) DEPENDENCIES = ["bme680_bsec"] CONF_IAQ = "iaq" -CONF_IAQ_ACCURACY = "iaq_accuracy" CONF_CO2_EQUIVALENT = "co2_equivalent" CONF_BREATH_VOC_EQUIVALENT = "breath_voc_equivalent" UNIT_IAQ = "IAQ" diff --git a/esphome/components/bme680_bsec/text_sensor.py b/esphome/components/bme680_bsec/text_sensor.py index 3494ba0cac..6b46e501da 100644 --- a/esphome/components/bme680_bsec/text_sensor.py +++ b/esphome/components/bme680_bsec/text_sensor.py @@ -1,11 +1,11 @@ import esphome.codegen as cg import esphome.config_validation as cv from esphome.components import text_sensor +from esphome.const import CONF_IAQ_ACCURACY from . import BME680BSECComponent, CONF_BME680_BSEC_ID DEPENDENCIES = ["bme680_bsec"] -CONF_IAQ_ACCURACY = "iaq_accuracy" ICON_ACCURACY = "mdi:checkbox-marked-circle-outline" TYPES = [CONF_IAQ_ACCURACY] diff --git a/esphome/components/i2s_audio/microphone/__init__.py b/esphome/components/i2s_audio/microphone/__init__.py index 5ee359dc26..d9c31e8e7b 100644 --- a/esphome/components/i2s_audio/microphone/__init__.py +++ b/esphome/components/i2s_audio/microphone/__init__.py @@ -2,7 +2,7 @@ import esphome.config_validation as cv import esphome.codegen as cg from esphome import pins -from esphome.const import CONF_CHANNEL, CONF_ID, CONF_NUMBER +from esphome.const import CONF_CHANNEL, CONF_ID, CONF_NUMBER, CONF_SAMPLE_RATE from esphome.components import microphone, esp32 from esphome.components.adc import ESP32_VARIANT_ADC1_PIN_TO_CHANNEL, validate_adc_pin @@ -20,7 +20,6 @@ DEPENDENCIES = ["i2s_audio"] CONF_ADC_PIN = "adc_pin" CONF_ADC_TYPE = "adc_type" CONF_PDM = "pdm" -CONF_SAMPLE_RATE = "sample_rate" CONF_BITS_PER_SAMPLE = "bits_per_sample" CONF_USE_APLL = "use_apll" diff --git a/esphome/const.py b/esphome/const.py index b26d8d2851..fee9c1796a 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -355,6 +355,7 @@ CONF_HUMIDITY_SENSOR = "humidity_sensor" CONF_HYSTERESIS = "hysteresis" CONF_I2C = "i2c" CONF_I2C_ID = "i2c_id" +CONF_IAQ_ACCURACY = "iaq_accuracy" CONF_IBEACON_MAJOR = "ibeacon_major" CONF_IBEACON_MINOR = "ibeacon_minor" CONF_IBEACON_UUID = "ibeacon_uuid" @@ -719,6 +720,7 @@ CONF_RX_BUFFER_SIZE = "rx_buffer_size" CONF_RX_ONLY = "rx_only" CONF_RX_PIN = "rx_pin" CONF_SAFE_MODE = "safe_mode" +CONF_SAMPLE_RATE = "sample_rate" CONF_SAMSUNG = "samsung" CONF_SATELLITES = "satellites" CONF_SCAN = "scan" From 5cb80619ddd362c055e9e418f9da1c4c175687b5 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 3 Jul 2024 14:21:41 +1200 Subject: [PATCH 156/233] [wifi] Only set default ttls phase 2 on esp-idf (#7033) * [wifi] Only set default ttls phase 2 on esp-idf * Add eap arduino test --- esphome/components/wifi/__init__.py | 4 ++-- tests/components/wifi/test-eap.esp32-ard.yaml | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 tests/components/wifi/test-eap.esp32-ard.yaml diff --git a/esphome/components/wifi/__init__.py b/esphome/components/wifi/__init__.py index 3b9e00956f..624bcdabdc 100644 --- a/esphome/components/wifi/__init__.py +++ b/esphome/components/wifi/__init__.py @@ -114,7 +114,7 @@ EAP_AUTH_SCHEMA = cv.All( cv.Optional(CONF_USERNAME): cv.string_strict, cv.Optional(CONF_PASSWORD): cv.string_strict, cv.Optional(CONF_CERTIFICATE_AUTHORITY): wpa2_eap.validate_certificate, - cv.Optional(CONF_TTLS_PHASE_2): cv.All( + cv.SplitDefault(CONF_TTLS_PHASE_2, esp32_idf="mschapv2"): cv.All( cv.enum(TTLS_PHASE_2), cv.only_with_esp_idf ), cv.Inclusive( @@ -350,7 +350,7 @@ def eap_auth(config): ("ca_cert", ca_cert), ("client_cert", client_cert), ("client_key", key), - ("ttls_phase_2", config.get(CONF_TTLS_PHASE_2, TTLS_PHASE_2["mschapv2"])), + ("ttls_phase_2", config.get(CONF_TTLS_PHASE_2)), ) diff --git a/tests/components/wifi/test-eap.esp32-ard.yaml b/tests/components/wifi/test-eap.esp32-ard.yaml new file mode 100644 index 0000000000..779cd6b49a --- /dev/null +++ b/tests/components/wifi/test-eap.esp32-ard.yaml @@ -0,0 +1,7 @@ +wifi: + networks: + - ssid: MySSID + eap: + username: username + password: password + identity: identity From 995db1d0e11554fed3fa62672df3faa535b7f1ba Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:45:30 +1200 Subject: [PATCH 157/233] Bump version to 2024.6.5 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index fee9c1796a..5b441faa6c 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.4" +__version__ = "2024.6.5" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From ee6f2bfecb1bb728d37f4f4283b05301894eaab9 Mon Sep 17 00:00:00 2001 From: lhy Date: Wed, 3 Jul 2024 17:03:54 +0900 Subject: [PATCH 158/233] Fix compile errors on ESP32-C6 with W5500 SPI ethernet (#7030) --- esphome/components/ethernet/ethernet_component.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/components/ethernet/ethernet_component.cpp b/esphome/components/ethernet/ethernet_component.cpp index 7370cb4b44..6b34157b9d 100644 --- a/esphome/components/ethernet/ethernet_component.cpp +++ b/esphome/components/ethernet/ethernet_component.cpp @@ -65,7 +65,8 @@ void EthernetComponent::setup() { .intr_flags = 0, }; -#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) +#if defined(USE_ESP32_VARIANT_ESP32C3) || defined(USE_ESP32_VARIANT_ESP32S2) || defined(USE_ESP32_VARIANT_ESP32S3) || \ + defined(USE_ESP32_VARIANT_ESP32C6) auto host = SPI2_HOST; #else auto host = SPI3_HOST; From 849a98d5b4e93ba61cd323cd224d46774d3566bc Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 1 Jul 2024 08:54:04 +1200 Subject: [PATCH 159/233] Bump dockerfile dependencies (#7017) --- docker/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index fcb5a5e7ae..eabd118939 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -34,7 +34,7 @@ RUN \ python3-wheel=0.38.4-2 \ iputils-ping=3:20221126-1 \ git=1:2.39.2-1.1 \ - curl=7.88.1-10+deb12u5 \ + curl=7.88.1-10+deb12u6 \ openssh-client=1:9.2p1-2+deb12u2 \ python3-cffi=1.15.1-5 \ libcairo2=1.16.0-7 \ @@ -190,8 +190,8 @@ RUN \ clang-format-13=1:13.0.1-11+b2 \ clang-tidy-14=1:14.0.6-12 \ patch=2.7.6-7 \ - software-properties-common=0.99.30-4 \ - nano=7.2-1 \ + software-properties-common=0.99.30-4.1~deb12u1 \ + nano=7.2-1+deb12u1 \ build-essential=12.9 \ python3-dev=3.11.2-1+b1 \ && rm -rf \ From c013c3bf6194ab257c108ef66b27af18939bcf5f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:17:44 +1200 Subject: [PATCH 160/233] [docker] Bump versions inside armv7 block (#7022) --- docker/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index eabd118939..b0c800f167 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -46,8 +46,8 @@ RUN \ python3-dev=3.11.2-1+b1 \ zlib1g-dev=1:1.2.13.dfsg-1 \ libjpeg-dev=1:2.1.5-2 \ - libfreetype-dev=2.12.1+dfsg-5 \ - libssl-dev=3.0.11-1~deb12u2 \ + libfreetype-dev=2.12.1+dfsg-5+deb12u3 \ + libssl-dev=3.0.13-1~deb12u1 \ libffi-dev=3.4.4-1 \ libopenjp2-7=2.5.0-2 \ libtiff6=4.5.0-6+deb12u1 \ From fc3f806555eb395452c0526b3e9cf1503fdcee51 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:51:51 +1200 Subject: [PATCH 161/233] [docker] Fix docker build error fall through (#7021) --- docker/Dockerfile | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index b0c800f167..16f37274c6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -39,23 +39,27 @@ RUN \ python3-cffi=1.15.1-5 \ libcairo2=1.16.0-7 \ libmagic1=1:5.44-3 \ - patch=2.7.6-7; \ - if [ "$TARGETARCH$TARGETVARIANT" = "armv7" ]; then \ - apt-get install -y --no-install-recommends \ - build-essential=12.9 \ - python3-dev=3.11.2-1+b1 \ - zlib1g-dev=1:1.2.13.dfsg-1 \ - libjpeg-dev=1:2.1.5-2 \ - libfreetype-dev=2.12.1+dfsg-5+deb12u3 \ - libssl-dev=3.0.13-1~deb12u1 \ - libffi-dev=3.4.4-1 \ - libopenjp2-7=2.5.0-2 \ - libtiff6=4.5.0-6+deb12u1 \ - cargo=0.66.0+ds1-1 \ - pkg-config=1.8.1-1 \ - gcc-arm-linux-gnueabihf=4:12.2.0-3; \ - fi; \ - rm -rf \ + patch=2.7.6-7 \ + && ( \ + ( \ + [ "$TARGETARCH$TARGETVARIANT" = "armv7" ] && \ + apt-get install -y --no-install-recommends \ + build-essential=12.9 \ + python3-dev=3.11.2-1+b1 \ + zlib1g-dev=1:1.2.13.dfsg-1 \ + libjpeg-dev=1:2.1.5-2 \ + libfreetype-dev=2.12.1+dfsg-5+deb12u3 \ + libssl-dev=3.0.13-1~deb12u1 \ + libffi-dev=3.4.4-1 \ + libopenjp2-7=2.5.0-2 \ + libtiff6=4.5.0-6+deb12u1 \ + cargo=0.66.0+ds1-1 \ + pkg-config=1.8.1-1 \ + gcc-arm-linux-gnueabihf=4:12.2.0-3 \ + ) \ + || [ "$TARGETARCH$TARGETVARIANT" != "armv7" ] \ + ) \ + && rm -rf \ /tmp/* \ /var/{cache,log}/* \ /var/lib/apt/lists/* From 3727342bce096a38d6f3d20d00aa89e7295c8c89 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 3 Jul 2024 20:14:27 +1200 Subject: [PATCH 162/233] Bump version to 2024.6.6 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 5b441faa6c..0d79908226 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.6.5" +__version__ = "2024.6.6" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From de19588d10a3350ae2625e490387dbccd6048677 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:22:06 +1200 Subject: [PATCH 163/233] Bump docker/setup-buildx-action from 3.3.0 to 3.4.0 (#7043) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-docker.yml | 2 +- .github/workflows/release.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 421a885f74..59b58ad82c 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -46,7 +46,7 @@ jobs: with: python-version: "3.9" - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.3.0 + uses: docker/setup-buildx-action@v3.4.0 - name: Set up QEMU uses: docker/setup-qemu-action@v3.0.0 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a1942e8cac..70b88bfd71 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -90,7 +90,7 @@ jobs: python-version: "3.9" - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.3.0 + uses: docker/setup-buildx-action@v3.4.0 - name: Set up QEMU if: matrix.platform != 'linux/amd64' uses: docker/setup-qemu-action@v3.0.0 @@ -184,7 +184,7 @@ jobs: merge-multiple: true - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3.3.0 + uses: docker/setup-buildx-action@v3.4.0 - name: Log in to docker hub if: matrix.registry == 'dockerhub' From 803f3f2e13cc27470113a23708558a1bd7b934b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 11:31:50 +1200 Subject: [PATCH 164/233] Bump docker/build-push-action from 6.2.0 to 6.3.0 in /.github/actions/build-image (#7038) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index b038a285ef..d5baf339aa 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.2.0 + uses: docker/build-push-action@v6.3.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.2.0 + uses: docker/build-push-action@v6.3.0 with: context: . file: ./docker/Dockerfile From 5fa54b0885e3c55f2afb518b2b4fbbad50dd10b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Jul 2024 13:27:46 +1200 Subject: [PATCH 165/233] Bump docker/setup-qemu-action from 3.0.0 to 3.1.0 (#7039) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci-docker.yml | 2 +- .github/workflows/release.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml index 59b58ad82c..147efe089e 100644 --- a/.github/workflows/ci-docker.yml +++ b/.github/workflows/ci-docker.yml @@ -48,7 +48,7 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3.4.0 - name: Set up QEMU - uses: docker/setup-qemu-action@v3.0.0 + uses: docker/setup-qemu-action@v3.1.0 - name: Set TAG run: | diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 70b88bfd71..71a366d535 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -93,7 +93,7 @@ jobs: uses: docker/setup-buildx-action@v3.4.0 - name: Set up QEMU if: matrix.platform != 'linux/amd64' - uses: docker/setup-qemu-action@v3.0.0 + uses: docker/setup-qemu-action@v3.1.0 - name: Log in to docker hub uses: docker/login-action@v3.2.0 From b0a3b5e080d457708decc70b35abd0aad7ca3b69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 16:23:37 +1200 Subject: [PATCH 166/233] Bump actions/upload-artifact from 4.3.3 to 4.3.4 (#7047) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 71a366d535..83641d8aa5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -141,7 +141,7 @@ jobs: echo name=$(cat /tmp/platform) >> $GITHUB_OUTPUT - name: Upload digests - uses: actions/upload-artifact@v4.3.3 + uses: actions/upload-artifact@v4.3.4 with: name: digests-${{ steps.sanitize.outputs.name }} path: /tmp/digests From 6ca7b30f7514572dec8019f9335c1ea3ce73db1a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Jul 2024 16:23:47 +1200 Subject: [PATCH 167/233] Bump actions/download-artifact from 4.1.7 to 4.1.8 (#7046) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 83641d8aa5..f66c504bda 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -177,7 +177,7 @@ jobs: - uses: actions/checkout@v4.1.7 - name: Download digests - uses: actions/download-artifact@v4.1.7 + uses: actions/download-artifact@v4.1.8 with: pattern: digests-* path: /tmp/digests From dd1e480142ad378e4e93b82fd435da70635de2c4 Mon Sep 17 00:00:00 2001 From: leejoow Date: Sat, 6 Jul 2024 06:57:30 +0200 Subject: [PATCH 168/233] Fix display of update state in webinterfae (#7045) Co-authored-by: Leo Schelvis --- .../http_request/update/http_request_update.cpp | 13 ++++++------- .../http_request/update/http_request_update.h | 3 --- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/esphome/components/http_request/update/http_request_update.cpp b/esphome/components/http_request/update/http_request_update.cpp index 98129e59dc..0a14dfd933 100644 --- a/esphome/components/http_request/update/http_request_update.cpp +++ b/esphome/components/http_request/update/http_request_update.cpp @@ -116,19 +116,18 @@ void HttpRequestUpdate::update() { } } - std::string current_version = this->current_version_; - if (current_version.empty()) { + std::string current_version; #ifdef ESPHOME_PROJECT_VERSION - current_version = ESPHOME_PROJECT_VERSION; + current_version = ESPHOME_PROJECT_VERSION; #else - current_version = ESPHOME_VERSION; + current_version = ESPHOME_VERSION; #endif - } + this->update_info_.current_version = current_version; - if (this->update_info_.latest_version.empty()) { + if (this->update_info_.latest_version.empty() || this->update_info_.latest_version == update_info_.current_version) { this->state_ = update::UPDATE_STATE_NO_UPDATE; - } else if (this->update_info_.latest_version != this->current_version_) { + } else { this->state_ = update::UPDATE_STATE_AVAILABLE; } diff --git a/esphome/components/http_request/update/http_request_update.h b/esphome/components/http_request/update/http_request_update.h index 1337822ecc..a6bc97392b 100644 --- a/esphome/components/http_request/update/http_request_update.h +++ b/esphome/components/http_request/update/http_request_update.h @@ -22,15 +22,12 @@ class HttpRequestUpdate : public update::UpdateEntity, public PollingComponent { void set_request_parent(HttpRequestComponent *request_parent) { this->request_parent_ = request_parent; } void set_ota_parent(OtaHttpRequestComponent *ota_parent) { this->ota_parent_ = ota_parent; } - void set_current_version(const std::string ¤t_version) { this->current_version_ = current_version; } - float get_setup_priority() const override { return setup_priority::AFTER_WIFI; } protected: HttpRequestComponent *request_parent_; OtaHttpRequestComponent *ota_parent_; std::string source_url_; - std::string current_version_{""}; }; } // namespace http_request From ddaa84683be70cba79a1dcc191eec23f59a4f973 Mon Sep 17 00:00:00 2001 From: Pavlo Dudnytskyi Date: Sat, 6 Jul 2024 09:00:44 +0200 Subject: [PATCH 169/233] Haier component update to support more protocol variations (#7040) Co-authored-by: Pavlo Dudnytskyi --- esphome/components/haier/climate.py | 41 ++++- esphome/components/haier/haier_base.cpp | 4 + esphome/components/haier/haier_base.h | 12 +- esphome/components/haier/hon_climate.cpp | 164 ++++++++++++------ esphome/components/haier/hon_climate.h | 8 +- esphome/components/haier/hon_packet.h | 5 + .../components/haier/smartair2_climate.cpp | 1 + platformio.ini | 2 +- tests/components/haier/common.yaml | 114 ++++++++++++ tests/components/haier/test.esp32-ard.yaml | 116 +------------ tests/components/haier/test.esp32-c3-ard.yaml | 112 +----------- tests/components/haier/test.esp32-c3-idf.yaml | 112 +----------- tests/components/haier/test.esp32-idf.yaml | 112 +----------- tests/components/haier/test.esp8266-ard.yaml | 112 +----------- tests/components/haier/test.rp2040-ard.yaml | 112 +----------- 15 files changed, 316 insertions(+), 711 deletions(-) create mode 100644 tests/components/haier/common.yaml diff --git a/esphome/components/haier/climate.py b/esphome/components/haier/climate.py index 3dcb35708c..f7423a1356 100644 --- a/esphome/components/haier/climate.py +++ b/esphome/components/haier/climate.py @@ -38,6 +38,9 @@ PROTOCOL_MAX_TEMPERATURE = 30.0 PROTOCOL_TARGET_TEMPERATURE_STEP = 1.0 PROTOCOL_CURRENT_TEMPERATURE_STEP = 0.5 PROTOCOL_CONTROL_PACKET_SIZE = 10 +PROTOCOL_MIN_SENSORS_PACKET_SIZE = 18 +PROTOCOL_DEFAULT_SENSORS_PACKET_SIZE = 22 +PROTOCOL_STATUS_MESSAGE_HEADER_SIZE = 0 CODEOWNERS = ["@paveldn"] DEPENDENCIES = ["climate", "uart"] @@ -48,6 +51,9 @@ CONF_CONTROL_PACKET_SIZE = "control_packet_size" CONF_HORIZONTAL_AIRFLOW = "horizontal_airflow" CONF_ON_ALARM_START = "on_alarm_start" CONF_ON_ALARM_END = "on_alarm_end" +CONF_ON_STATUS_MESSAGE = "on_status_message" +CONF_SENSORS_PACKET_SIZE = "sensors_packet_size" +CONF_STATUS_MESSAGE_HEADER_SIZE = "status_message_header_size" CONF_VERTICAL_AIRFLOW = "vertical_airflow" CONF_WIFI_SIGNAL = "wifi_signal" @@ -129,6 +135,11 @@ HaierAlarmEndTrigger = haier_ns.class_( automation.Trigger.template(cg.uint8, cg.const_char_ptr), ) +StatusMessageTrigger = haier_ns.class_( + "StatusMessageTrigger", + automation.Trigger.template(cg.const_char_ptr, cg.size_t), +) + def validate_visual(config): if CONF_VISUAL in config: @@ -193,6 +204,11 @@ BASE_CONFIG_SCHEMA = ( cv.Optional( CONF_ANSWER_TIMEOUT, ): cv.positive_time_period_milliseconds, + cv.Optional(CONF_ON_STATUS_MESSAGE): automation.validate_automation( + { + cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(StatusMessageTrigger), + } + ), } ) .extend(uart.UART_DEVICE_SCHEMA) @@ -228,6 +244,14 @@ CONFIG_SCHEMA = cv.All( cv.Optional( CONF_CONTROL_PACKET_SIZE, default=PROTOCOL_CONTROL_PACKET_SIZE ): cv.int_range(min=PROTOCOL_CONTROL_PACKET_SIZE, max=50), + cv.Optional( + CONF_SENSORS_PACKET_SIZE, + default=PROTOCOL_DEFAULT_SENSORS_PACKET_SIZE, + ): cv.int_range(min=PROTOCOL_MIN_SENSORS_PACKET_SIZE, max=50), + cv.Optional( + CONF_STATUS_MESSAGE_HEADER_SIZE, + default=PROTOCOL_STATUS_MESSAGE_HEADER_SIZE, + ): cv.int_range(min=PROTOCOL_STATUS_MESSAGE_HEADER_SIZE), cv.Optional( CONF_SUPPORTED_PRESETS, default=["BOOST", "ECO", "SLEEP"], # No AWAY by default @@ -468,6 +492,16 @@ async def to_code(config): config[CONF_CONTROL_PACKET_SIZE] - PROTOCOL_CONTROL_PACKET_SIZE ) ) + if CONF_SENSORS_PACKET_SIZE in config: + cg.add( + var.set_extra_sensors_packet_bytes_size( + config[CONF_SENSORS_PACKET_SIZE] - PROTOCOL_MIN_SENSORS_PACKET_SIZE + ) + ) + if CONF_STATUS_MESSAGE_HEADER_SIZE in config: + cg.add( + var.set_status_message_header_size(config[CONF_STATUS_MESSAGE_HEADER_SIZE]) + ) for conf in config.get(CONF_ON_ALARM_START, []): trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) await automation.build_automation( @@ -478,5 +512,10 @@ async def to_code(config): await automation.build_automation( trigger, [(cg.uint8, "code"), (cg.const_char_ptr, "message")], conf ) + for conf in config.get(CONF_ON_STATUS_MESSAGE, []): + trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var) + await automation.build_automation( + trigger, [(cg.const_char_ptr, "data"), (cg.size_t, "data_size")], conf + ) # https://github.com/paveldn/HaierProtocol - cg.add_library("pavlodn/HaierProtocol", "0.9.28") + cg.add_library("pavlodn/HaierProtocol", "0.9.31") diff --git a/esphome/components/haier/haier_base.cpp b/esphome/components/haier/haier_base.cpp index 1fca3dfb85..0bd3863160 100644 --- a/esphome/components/haier/haier_base.cpp +++ b/esphome/components/haier/haier_base.cpp @@ -186,6 +186,10 @@ void HaierClimateBase::send_custom_command(const haier_protocol::HaierMessage &m this->action_request_ = PendingAction({ActionRequest::SEND_CUSTOM_COMMAND, message}); } +void HaierClimateBase::add_status_message_callback(std::function &&callback) { + this->status_message_callback_.add(std::move(callback)); +} + haier_protocol::HandlerError HaierClimateBase::answer_preprocess_( haier_protocol::FrameType request_message_type, haier_protocol::FrameType expected_request_message_type, haier_protocol::FrameType answer_message_type, haier_protocol::FrameType expected_answer_message_type, diff --git a/esphome/components/haier/haier_base.h b/esphome/components/haier/haier_base.h index f261a106a2..c0bf878519 100644 --- a/esphome/components/haier/haier_base.h +++ b/esphome/components/haier/haier_base.h @@ -4,6 +4,7 @@ #include #include "esphome/components/climate/climate.h" #include "esphome/components/uart/uart.h" +#include "esphome/core/automation.h" // HaierProtocol #include @@ -56,6 +57,7 @@ class HaierClimateBase : public esphome::Component, void set_answer_timeout(uint32_t timeout); void set_send_wifi(bool send_wifi); void send_custom_command(const haier_protocol::HaierMessage &message); + void add_status_message_callback(std::function &&callback); protected: enum class ProtocolPhases { @@ -140,11 +142,19 @@ class HaierClimateBase : public esphome::Component, esphome::climate::ClimateTraits traits_; HvacSettings current_hvac_settings_; HvacSettings next_hvac_settings_; - std::unique_ptr last_status_message_; + std::unique_ptr last_status_message_{nullptr}; std::chrono::steady_clock::time_point last_request_timestamp_; // For interval between messages std::chrono::steady_clock::time_point last_valid_status_timestamp_; // For protocol timeout std::chrono::steady_clock::time_point last_status_request_; // To request AC status std::chrono::steady_clock::time_point last_signal_request_; // To send WiFI signal level + CallbackManager status_message_callback_{}; +}; + +class StatusMessageTrigger : public Trigger { + public: + explicit StatusMessageTrigger(HaierClimateBase *parent) { + parent->add_status_message_callback([this](const char *data, size_t data_size) { this->trigger(data, data_size); }); + } }; } // namespace haier diff --git a/esphome/components/haier/hon_climate.cpp b/esphome/components/haier/hon_climate.cpp index 903f7964da..a1c5098cec 100644 --- a/esphome/components/haier/hon_climate.cpp +++ b/esphome/components/haier/hon_climate.cpp @@ -18,12 +18,13 @@ constexpr int PROTOCOL_OUTDOOR_TEMPERATURE_OFFSET = -64; constexpr uint8_t CONTROL_MESSAGE_RETRIES = 5; constexpr std::chrono::milliseconds CONTROL_MESSAGE_RETRIES_INTERVAL = std::chrono::milliseconds(500); constexpr size_t ALARM_STATUS_REQUEST_INTERVAL_MS = 600000; +const uint8_t ONE_BUF[] = {0x00, 0x01}; +const uint8_t ZERO_BUF[] = {0x00, 0x00}; HonClimate::HonClimate() : cleaning_status_(CleaningState::NO_CLEANING), got_valid_outdoor_temp_(false), active_alarms_{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} { - last_status_message_ = std::unique_ptr(new uint8_t[sizeof(hon_protocol::HaierPacketControl)]); this->fan_mode_speed_ = (uint8_t) hon_protocol::FanMode::FAN_MID; this->other_modes_fan_speed_ = (uint8_t) hon_protocol::FanMode::FAN_AUTO; } @@ -169,11 +170,18 @@ haier_protocol::HandlerError HonClimate::status_handler_(haier_protocol::FrameTy this->action_request_.reset(); this->force_send_control_ = false; } else { - if (data_size >= sizeof(hon_protocol::HaierPacketControl) + 2) { - memcpy(this->last_status_message_.get(), data + 2, sizeof(hon_protocol::HaierPacketControl)); + if (!this->last_status_message_) { + this->real_control_packet_size_ = sizeof(hon_protocol::HaierPacketControl) + this->extra_control_packet_bytes_; + this->real_sensors_packet_size_ = sizeof(hon_protocol::HaierPacketSensors) + this->extra_sensors_packet_bytes_; + this->last_status_message_.reset(); + this->last_status_message_ = std::unique_ptr(new uint8_t[this->real_control_packet_size_]); + }; + if (data_size >= this->real_control_packet_size_ + 2) { + memcpy(this->last_status_message_.get(), data + 2 + this->status_message_header_size_, + this->real_control_packet_size_); + this->status_message_callback_.call((const char *) data, data_size); } else { - ESP_LOGW(TAG, "Status packet too small: %d (should be >= %d)", data_size, - sizeof(hon_protocol::HaierPacketControl)); + ESP_LOGW(TAG, "Status packet too small: %d (should be >= %d)", data_size, this->real_control_packet_size_); } switch (this->protocol_phase_) { case ProtocolPhases::SENDING_FIRST_STATUS_REQUEST: @@ -479,8 +487,8 @@ void HonClimate::initialization() { } haier_protocol::HaierMessage HonClimate::get_control_message() { - uint8_t control_out_buffer[sizeof(hon_protocol::HaierPacketControl)]; - memcpy(control_out_buffer, this->last_status_message_.get(), sizeof(hon_protocol::HaierPacketControl)); + uint8_t control_out_buffer[haier_protocol::MAX_FRAME_SIZE]; + memcpy(control_out_buffer, this->last_status_message_.get(), this->real_control_packet_size_); hon_protocol::HaierPacketControl *out_data = (hon_protocol::HaierPacketControl *) control_out_buffer; control_out_buffer[4] = 0; // This byte should be cleared before setting values bool has_hvac_settings = false; @@ -636,7 +644,7 @@ haier_protocol::HaierMessage HonClimate::get_control_message() { out_data->health_mode = this->health_mode_ ? 1 : 0; return haier_protocol::HaierMessage(haier_protocol::FrameType::CONTROL, (uint16_t) hon_protocol::SubcommandsControl::SET_GROUP_PARAMETERS, - control_out_buffer, sizeof(hon_protocol::HaierPacketControl)); + control_out_buffer, this->real_control_packet_size_); } void HonClimate::process_alarm_message_(const uint8_t *packet, uint8_t size, bool check_new) { @@ -758,15 +766,17 @@ void HonClimate::update_sub_text_sensor_(SubTextSensorType type, const std::stri #endif // USE_TEXT_SENSOR haier_protocol::HandlerError HonClimate::process_status_message_(const uint8_t *packet_buffer, uint8_t size) { - size_t expected_size = 2 + sizeof(hon_protocol::HaierPacketControl) + sizeof(hon_protocol::HaierPacketSensors) + - this->extra_control_packet_bytes_; - if (size < expected_size) + size_t expected_size = + 2 + this->status_message_header_size_ + this->real_control_packet_size_ + this->real_sensors_packet_size_; + if (size < expected_size) { + ESP_LOGW(TAG, "Unexpected message size %d (expexted >= %d)", size, expected_size); return haier_protocol::HandlerError::WRONG_MESSAGE_STRUCTURE; + } uint16_t subtype = (((uint16_t) packet_buffer[0]) << 8) + packet_buffer[1]; - if ((subtype == 0x7D01) && (size >= expected_size + 4 + sizeof(hon_protocol::HaierPacketBigData))) { + if ((subtype == 0x7D01) && (size >= expected_size + sizeof(hon_protocol::HaierPacketBigData))) { // Got BigData packet const hon_protocol::HaierPacketBigData *bd_packet = - (const hon_protocol::HaierPacketBigData *) (&packet_buffer[expected_size + 4]); + (const hon_protocol::HaierPacketBigData *) (&packet_buffer[expected_size]); #ifdef USE_SENSOR this->update_sub_sensor_(SubSensorType::INDOOR_COIL_TEMPERATURE, bd_packet->indoor_coil_temperature / 2.0 - 20); this->update_sub_sensor_(SubSensorType::OUTDOOR_COIL_TEMPERATURE, bd_packet->outdoor_coil_temperature - 64); @@ -795,9 +805,9 @@ haier_protocol::HandlerError HonClimate::process_status_message_(const uint8_t * hon_protocol::HaierPacketControl control; hon_protocol::HaierPacketSensors sensors; } packet; - memcpy(&packet.control, packet_buffer + 2, sizeof(hon_protocol::HaierPacketControl)); - memcpy(&packet.sensors, - packet_buffer + 2 + sizeof(hon_protocol::HaierPacketControl) + this->extra_control_packet_bytes_, + memcpy(&packet.control, packet_buffer + 2 + this->status_message_header_size_, + sizeof(hon_protocol::HaierPacketControl)); + memcpy(&packet.sensors, packet_buffer + 2 + this->status_message_header_size_ + this->real_control_packet_size_, sizeof(hon_protocol::HaierPacketSensors)); if (packet.sensors.error_status != 0) { ESP_LOGW(TAG, "HVAC error, code=0x%02X", packet.sensors.error_status); @@ -996,8 +1006,6 @@ haier_protocol::HandlerError HonClimate::process_status_message_(const uint8_t * } void HonClimate::fill_control_messages_queue_() { - static uint8_t one_buf[] = {0x00, 0x01}; - static uint8_t zero_buf[] = {0x00, 0x00}; if (!this->current_hvac_settings_.valid && !this->force_send_control_) return; this->clear_control_messages_queue_(); @@ -1009,7 +1017,7 @@ void HonClimate::fill_control_messages_queue_() { haier_protocol::HaierMessage(haier_protocol::FrameType::CONTROL, (uint16_t) hon_protocol::SubcommandsControl::SET_SINGLE_PARAMETER + (uint8_t) hon_protocol::DataParameters::BEEPER_STATUS, - this->beeper_status_ ? zero_buf : one_buf, 2)); + this->beeper_status_ ? ZERO_BUF : ONE_BUF, 2)); } // Health mode { @@ -1017,7 +1025,7 @@ void HonClimate::fill_control_messages_queue_() { haier_protocol::HaierMessage(haier_protocol::FrameType::CONTROL, (uint16_t) hon_protocol::SubcommandsControl::SET_SINGLE_PARAMETER + (uint8_t) hon_protocol::DataParameters::HEALTH_MODE, - this->health_mode_ ? one_buf : zero_buf, 2)); + this->health_mode_ ? ONE_BUF : ZERO_BUF, 2)); } // Climate mode bool new_power = this->mode != CLIMATE_MODE_OFF; @@ -1092,7 +1100,7 @@ void HonClimate::fill_control_messages_queue_() { haier_protocol::HaierMessage(haier_protocol::FrameType::CONTROL, (uint16_t) hon_protocol::SubcommandsControl::SET_SINGLE_PARAMETER + (uint8_t) hon_protocol::DataParameters::AC_POWER, - new_power ? one_buf : zero_buf, 2)); + new_power ? ONE_BUF : ZERO_BUF, 2)); } // CLimate preset { @@ -1165,6 +1173,35 @@ void HonClimate::fill_control_messages_queue_() { (uint8_t) hon_protocol::DataParameters::SET_POINT, buffer, 2)); } + // Vertical swing mode + if (climate_control.swing_mode.has_value()) { + uint8_t vertical_swing_buf[] = {0x00, (uint8_t) hon_protocol::VerticalSwingMode::AUTO}; + uint8_t horizontal_swing_buf[] = {0x00, (uint8_t) hon_protocol::HorizontalSwingMode::AUTO}; + switch (climate_control.swing_mode.value()) { + case CLIMATE_SWING_OFF: + horizontal_swing_buf[1] = (uint8_t) this->settings_.last_horizontal_swing; + vertical_swing_buf[1] = (uint8_t) this->settings_.last_vertiacal_swing; + break; + case CLIMATE_SWING_VERTICAL: + horizontal_swing_buf[1] = (uint8_t) this->settings_.last_horizontal_swing; + break; + case CLIMATE_SWING_HORIZONTAL: + vertical_swing_buf[1] = (uint8_t) this->settings_.last_vertiacal_swing; + break; + case CLIMATE_SWING_BOTH: + break; + } + this->control_messages_queue_.push( + haier_protocol::HaierMessage(haier_protocol::FrameType::CONTROL, + (uint16_t) hon_protocol::SubcommandsControl::SET_SINGLE_PARAMETER + + (uint8_t) hon_protocol::DataParameters::HORIZONTAL_SWING_MODE, + horizontal_swing_buf, 2)); + this->control_messages_queue_.push( + haier_protocol::HaierMessage(haier_protocol::FrameType::CONTROL, + (uint16_t) hon_protocol::SubcommandsControl::SET_SINGLE_PARAMETER + + (uint8_t) hon_protocol::DataParameters::VERTICAL_SWING_MODE, + vertical_swing_buf, 2)); + } // Fan mode if (climate_control.fan_mode.has_value()) { switch (climate_control.fan_mode.value()) { @@ -1202,40 +1239,56 @@ void HonClimate::clear_control_messages_queue_() { bool HonClimate::prepare_pending_action() { switch (this->action_request_.value().action) { - case ActionRequest::START_SELF_CLEAN: { - uint8_t control_out_buffer[sizeof(hon_protocol::HaierPacketControl)]; - memcpy(control_out_buffer, this->last_status_message_.get(), sizeof(hon_protocol::HaierPacketControl)); - hon_protocol::HaierPacketControl *out_data = (hon_protocol::HaierPacketControl *) control_out_buffer; - out_data->self_cleaning_status = 1; - out_data->steri_clean = 0; - out_data->set_point = 0x06; - out_data->vertical_swing_mode = (uint8_t) hon_protocol::VerticalSwingMode::CENTER; - out_data->horizontal_swing_mode = (uint8_t) hon_protocol::HorizontalSwingMode::CENTER; - out_data->ac_power = 1; - out_data->ac_mode = (uint8_t) hon_protocol::ConditioningMode::DRY; - out_data->light_status = 0; - this->action_request_.value().message = haier_protocol::HaierMessage( - haier_protocol::FrameType::CONTROL, (uint16_t) hon_protocol::SubcommandsControl::SET_GROUP_PARAMETERS, - control_out_buffer, sizeof(hon_protocol::HaierPacketControl)); - } - return true; - case ActionRequest::START_STERI_CLEAN: { - uint8_t control_out_buffer[sizeof(hon_protocol::HaierPacketControl)]; - memcpy(control_out_buffer, this->last_status_message_.get(), sizeof(hon_protocol::HaierPacketControl)); - hon_protocol::HaierPacketControl *out_data = (hon_protocol::HaierPacketControl *) control_out_buffer; - out_data->self_cleaning_status = 0; - out_data->steri_clean = 1; - out_data->set_point = 0x06; - out_data->vertical_swing_mode = (uint8_t) hon_protocol::VerticalSwingMode::CENTER; - out_data->horizontal_swing_mode = (uint8_t) hon_protocol::HorizontalSwingMode::CENTER; - out_data->ac_power = 1; - out_data->ac_mode = (uint8_t) hon_protocol::ConditioningMode::DRY; - out_data->light_status = 0; - this->action_request_.value().message = haier_protocol::HaierMessage( - haier_protocol::FrameType::CONTROL, (uint16_t) hon_protocol::SubcommandsControl::SET_GROUP_PARAMETERS, - control_out_buffer, sizeof(hon_protocol::HaierPacketControl)); - } - return true; + case ActionRequest::START_SELF_CLEAN: + if (this->control_method_ == HonControlMethod::SET_GROUP_PARAMETERS) { + uint8_t control_out_buffer[haier_protocol::MAX_FRAME_SIZE]; + memcpy(control_out_buffer, this->last_status_message_.get(), this->real_control_packet_size_); + hon_protocol::HaierPacketControl *out_data = (hon_protocol::HaierPacketControl *) control_out_buffer; + out_data->self_cleaning_status = 1; + out_data->steri_clean = 0; + out_data->set_point = 0x06; + out_data->vertical_swing_mode = (uint8_t) hon_protocol::VerticalSwingMode::CENTER; + out_data->horizontal_swing_mode = (uint8_t) hon_protocol::HorizontalSwingMode::CENTER; + out_data->ac_power = 1; + out_data->ac_mode = (uint8_t) hon_protocol::ConditioningMode::DRY; + out_data->light_status = 0; + this->action_request_.value().message = haier_protocol::HaierMessage( + haier_protocol::FrameType::CONTROL, (uint16_t) hon_protocol::SubcommandsControl::SET_GROUP_PARAMETERS, + control_out_buffer, this->real_control_packet_size_); + return true; + } else if (this->control_method_ == HonControlMethod::SET_SINGLE_PARAMETER) { + this->action_request_.value().message = + haier_protocol::HaierMessage(haier_protocol::FrameType::CONTROL, + (uint16_t) hon_protocol::SubcommandsControl::SET_SINGLE_PARAMETER + + (uint8_t) hon_protocol::DataParameters::SELF_CLEANING, + ONE_BUF, 2); + return true; + } else { + this->action_request_.reset(); + return false; + } + case ActionRequest::START_STERI_CLEAN: + if (this->control_method_ == HonControlMethod::SET_GROUP_PARAMETERS) { + uint8_t control_out_buffer[haier_protocol::MAX_FRAME_SIZE]; + memcpy(control_out_buffer, this->last_status_message_.get(), this->real_control_packet_size_); + hon_protocol::HaierPacketControl *out_data = (hon_protocol::HaierPacketControl *) control_out_buffer; + out_data->self_cleaning_status = 0; + out_data->steri_clean = 1; + out_data->set_point = 0x06; + out_data->vertical_swing_mode = (uint8_t) hon_protocol::VerticalSwingMode::CENTER; + out_data->horizontal_swing_mode = (uint8_t) hon_protocol::HorizontalSwingMode::CENTER; + out_data->ac_power = 1; + out_data->ac_mode = (uint8_t) hon_protocol::ConditioningMode::DRY; + out_data->light_status = 0; + this->action_request_.value().message = haier_protocol::HaierMessage( + haier_protocol::FrameType::CONTROL, (uint16_t) hon_protocol::SubcommandsControl::SET_GROUP_PARAMETERS, + control_out_buffer, this->real_control_packet_size_); + return true; + } else { + // No Steri clean support (yet?) in SET_SINGLE_PARAMETER + this->action_request_.reset(); + return false; + } default: return HaierClimateBase::prepare_pending_action(); } @@ -1251,6 +1304,7 @@ void HonClimate::process_protocol_reset() { #endif // USE_SENSOR this->got_valid_outdoor_temp_ = false; this->hvac_hardware_info_.reset(); + this->last_status_message_.reset(nullptr); } bool HonClimate::should_get_big_data_() { diff --git a/esphome/components/haier/hon_climate.h b/esphome/components/haier/hon_climate.h index 7b4fcee6b9..64c54186ed 100644 --- a/esphome/components/haier/hon_climate.h +++ b/esphome/components/haier/hon_climate.h @@ -104,6 +104,8 @@ class HonClimate : public HaierClimateBase { void start_self_cleaning(); void start_steri_cleaning(); void set_extra_control_packet_bytes_size(size_t size) { this->extra_control_packet_bytes_ = size; }; + void set_extra_sensors_packet_bytes_size(size_t size) { this->extra_sensors_packet_bytes_ = size; }; + void set_status_message_header_size(size_t size) { this->status_message_header_size_ = size; }; void set_control_method(HonControlMethod method) { this->control_method_ = method; }; void add_alarm_start_callback(std::function &&callback); void add_alarm_end_callback(std::function &&callback); @@ -158,7 +160,11 @@ class HonClimate : public HaierClimateBase { esphome::optional pending_horizontal_direction_{}; esphome::optional hvac_hardware_info_{}; uint8_t active_alarms_[8]; - int extra_control_packet_bytes_; + int extra_control_packet_bytes_{0}; + int extra_sensors_packet_bytes_{4}; + int status_message_header_size_{0}; + int real_control_packet_size_{sizeof(hon_protocol::HaierPacketControl)}; + int real_sensors_packet_size_{sizeof(hon_protocol::HaierPacketSensors) + 4}; HonControlMethod control_method_; std::queue control_messages_queue_; CallbackManager alarm_start_callback_{}; diff --git a/esphome/components/haier/hon_packet.h b/esphome/components/haier/hon_packet.h index a03ac2831f..615f93528e 100644 --- a/esphome/components/haier/hon_packet.h +++ b/esphome/components/haier/hon_packet.h @@ -41,15 +41,20 @@ enum class ConditioningMode : uint8_t { enum class DataParameters : uint8_t { AC_POWER = 0x01, SET_POINT = 0x02, + VERTICAL_SWING_MODE = 0x03, AC_MODE = 0x04, FAN_MODE = 0x05, USE_FAHRENHEIT = 0x07, + DISPLAY_STATUS = 0x09, TEN_DEGREE = 0x0A, HEALTH_MODE = 0x0B, + HORIZONTAL_SWING_MODE = 0x0C, + SELF_CLEANING = 0x0D, BEEPER_STATUS = 0x16, LOCK_REMOTE = 0x17, QUIET_MODE = 0x19, FAST_MODE = 0x1A, + SLEEP_MODE = 0x1B, }; enum class SpecialMode : uint8_t { NONE = 0x00, ELDERLY = 0x01, CHILDREN = 0x02, PREGNANT = 0x03 }; diff --git a/esphome/components/haier/smartair2_climate.cpp b/esphome/components/haier/smartair2_climate.cpp index 00590694d5..028e8a4087 100644 --- a/esphome/components/haier/smartair2_climate.cpp +++ b/esphome/components/haier/smartair2_climate.cpp @@ -37,6 +37,7 @@ haier_protocol::HandlerError Smartair2Climate::status_handler_(haier_protocol::F } else { if (data_size >= sizeof(smartair2_protocol::HaierPacketControl) + 2) { memcpy(this->last_status_message_.get(), data + 2, sizeof(smartair2_protocol::HaierPacketControl)); + this->status_message_callback_.call((const char *) data, data_size); } else { ESP_LOGW(TAG, "Status packet too small: %d (should be >= %d)", data_size, sizeof(smartair2_protocol::HaierPacketControl)); diff --git a/platformio.ini b/platformio.ini index aa73437222..a72bf598c5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -39,7 +39,7 @@ lib_deps = bblanchon/ArduinoJson@6.18.5 ; json wjtje/qr-code-generator-library@1.7.0 ; qr_code functionpointer/arduino-MLX90393@1.0.0 ; mlx90393 - pavlodn/HaierProtocol@0.9.28 ; haier + pavlodn/HaierProtocol@0.9.31 ; haier ; This is using the repository until a new release is published to PlatformIO https://github.com/Sensirion/arduino-gas-index-algorithm.git#3.2.1 ; Sensirion Gas Index Algorithm Arduino Library build_flags = diff --git a/tests/components/haier/common.yaml b/tests/components/haier/common.yaml new file mode 100644 index 0000000000..b8a23bac5a --- /dev/null +++ b/tests/components/haier/common.yaml @@ -0,0 +1,114 @@ +wifi: + ssid: MySSID + password: password1 + +uart: + - id: uart_haier + tx_pin: ${tx_pin} + rx_pin: ${rx_pin} + baud_rate: 9600 + +climate: + - platform: haier + id: haier_ac + uart_id: uart_haier + protocol: hOn + name: Haier AC + wifi_signal: true + answer_timeout: 200ms + beeper: true + visual: + min_temperature: 16 °C + max_temperature: 30 °C + temperature_step: + target_temperature: 1 + current_temperature: 0.5 + supported_modes: + - 'OFF' + - HEAT_COOL + - COOL + - HEAT + - DRY + - FAN_ONLY + supported_swing_modes: + - 'OFF' + - VERTICAL + - HORIZONTAL + - BOTH + supported_presets: + - AWAY + - BOOST + - ECO + - SLEEP + on_alarm_start: + then: + - logger.log: + level: DEBUG + format: "Alarm activated. Code: %d. Message: \"%s\"" + args: [code, message] + on_alarm_end: + then: + - logger.log: + level: DEBUG + format: "Alarm deactivated. Code: %d. Message: \"%s\"" + args: [code, message] + +sensor: + - platform: haier + haier_id: haier_ac + outdoor_temperature: + name: Haier outdoor temperature + humidity: + name: Haier Indoor Humidity + compressor_current: + name: Haier Compressor Current + compressor_frequency: + name: Haier Compressor Frequency + expansion_valve_open_degree: + name: Haier Expansion Valve Open Degree + indoor_coil_temperature: + name: Haier Indoor Coil Temperature + outdoor_coil_temperature: + name: Haier Outdoor Coil Temperature + outdoor_defrost_temperature: + name: Haier Outdoor Defrost Temperature + outdoor_in_air_temperature: + name: Haier Outdoor In Air Temperature + outdoor_out_air_temperature: + name: Haier Outdoor Out Air Temperature + power: + name: Haier Power + +binary_sensor: + - platform: haier + haier_id: haier_ac + compressor_status: + name: Haier Outdoor Compressor Status + defrost_status: + name: Haier Defrost Status + four_way_valve_status: + name: Haier Four Way Valve Status + indoor_electric_heating_status: + name: Haier Indoor Electric Heating Status + indoor_fan_status: + name: Haier Indoor Fan Status + outdoor_fan_status: + name: Haier Outdoor Fan Status + +button: + - platform: haier + haier_id: haier_ac + self_cleaning: + name: Haier start self cleaning + steri_cleaning: + name: Haier start 56°C steri-cleaning + +text_sensor: + - platform: haier + haier_id: haier_ac + appliance_name: + name: Haier appliance name + cleaning_status: + name: Haier cleaning status + protocol_version: + name: Haier protocol version diff --git a/tests/components/haier/test.esp32-ard.yaml b/tests/components/haier/test.esp32-ard.yaml index efff532d25..f486544afa 100644 --- a/tests/components/haier/test.esp32-ard.yaml +++ b/tests/components/haier/test.esp32-ard.yaml @@ -1,113 +1,5 @@ -wifi: - ssid: MySSID - password: password1 +substitutions: + tx_pin: GPIO17 + rx_pin: GPIO16 -uart: - - id: uart_haier - tx_pin: 17 - rx_pin: 16 - baud_rate: 9600 - -climate: - - platform: haier - id: haier_ac - protocol: hOn - name: Haier AC - wifi_signal: true - answer_timeout: 200ms - beeper: true - visual: - min_temperature: 16 °C - max_temperature: 30 °C - temperature_step: - target_temperature: 1 - current_temperature: 0.5 - supported_modes: - - 'OFF' - - HEAT_COOL - - COOL - - HEAT - - DRY - - FAN_ONLY - supported_swing_modes: - - 'OFF' - - VERTICAL - - HORIZONTAL - - BOTH - supported_presets: - - AWAY - - BOOST - - ECO - - SLEEP - on_alarm_start: - then: - - logger.log: - level: DEBUG - format: "Alarm activated. Code: %d. Message: \"%s\"" - args: [code, message] - on_alarm_end: - then: - - logger.log: - level: DEBUG - format: "Alarm deactivated. Code: %d. Message: \"%s\"" - args: [code, message] - -sensor: - - platform: haier - haier_id: haier_ac - outdoor_temperature: - name: Haier outdoor temperature - humidity: - name: Haier Indoor Humidity - compressor_current: - name: Haier Compressor Current - compressor_frequency: - name: Haier Compressor Frequency - expansion_valve_open_degree: - name: Haier Expansion Valve Open Degree - indoor_coil_temperature: - name: Haier Indoor Coil Temperature - outdoor_coil_temperature: - name: Haier Outdoor Coil Temperature - outdoor_defrost_temperature: - name: Haier Outdoor Defrost Temperature - outdoor_in_air_temperature: - name: Haier Outdoor In Air Temperature - outdoor_out_air_temperature: - name: Haier Outdoor Out Air Temperature - power: - name: Haier Power - -binary_sensor: - - platform: haier - haier_id: haier_ac - compressor_status: - name: Haier Outdoor Compressor Status - defrost_status: - name: Haier Defrost Status - four_way_valve_status: - name: Haier Four Way Valve Status - indoor_electric_heating_status: - name: Haier Indoor Electric Heating Status - indoor_fan_status: - name: Haier Indoor Fan Status - outdoor_fan_status: - name: Haier Outdoor Fan Status - -button: - - platform: haier - haier_id: haier_ac - self_cleaning: - name: Haier start self cleaning - steri_cleaning: - name: Haier start 56°C steri-cleaning - -text_sensor: - - platform: haier - haier_id: haier_ac - appliance_name: - name: Haier appliance name - cleaning_status: - name: Haier cleaning status - protocol_version: - name: Haier protocol version +<<: !include common.yaml diff --git a/tests/components/haier/test.esp32-c3-ard.yaml b/tests/components/haier/test.esp32-c3-ard.yaml index 0053220669..b516342f3b 100644 --- a/tests/components/haier/test.esp32-c3-ard.yaml +++ b/tests/components/haier/test.esp32-c3-ard.yaml @@ -1,109 +1,5 @@ -wifi: - ssid: MySSID - password: password1 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -uart: - - id: uart_haier - tx_pin: 4 - rx_pin: 5 - baud_rate: 9600 - -climate: - - platform: haier - id: haier_ac - protocol: hOn - name: Haier AC - wifi_signal: true - answer_timeout: 200ms - beeper: true - visual: - min_temperature: 16 °C - max_temperature: 30 °C - temperature_step: - target_temperature: 1 - current_temperature: 0.5 - supported_modes: - - 'OFF' - - HEAT_COOL - - COOL - - HEAT - - DRY - - FAN_ONLY - supported_swing_modes: - - 'OFF' - - VERTICAL - - HORIZONTAL - - BOTH - supported_presets: - - AWAY - - BOOST - - ECO - - SLEEP - on_alarm_start: - then: - - logger.log: - level: DEBUG - format: "Alarm activated. Code: %d. Message: \"%s\"" - args: [code, message] - on_alarm_end: - then: - - logger.log: - level: DEBUG - format: "Alarm deactivated. Code: %d. Message: \"%s\"" - args: [code, message] - -sensor: - - platform: haier - outdoor_temperature: - name: Haier outdoor temperature - humidity: - name: Haier Indoor Humidity - compressor_current: - name: Haier Compressor Current - compressor_frequency: - name: Haier Compressor Frequency - expansion_valve_open_degree: - name: Haier Expansion Valve Open Degree - indoor_coil_temperature: - name: Haier Indoor Coil Temperature - outdoor_coil_temperature: - name: Haier Outdoor Coil Temperature - outdoor_defrost_temperature: - name: Haier Outdoor Defrost Temperature - outdoor_in_air_temperature: - name: Haier Outdoor In Air Temperature - outdoor_out_air_temperature: - name: Haier Outdoor Out Air Temperature - power: - name: Haier Power - -binary_sensor: - - platform: haier - compressor_status: - name: Haier Outdoor Compressor Status - defrost_status: - name: Haier Defrost Status - four_way_valve_status: - name: Haier Four Way Valve Status - indoor_electric_heating_status: - name: Haier Indoor Electric Heating Status - indoor_fan_status: - name: Haier Indoor Fan Status - outdoor_fan_status: - name: Haier Outdoor Fan Status - -button: - - platform: haier - self_cleaning: - name: Haier start self cleaning - steri_cleaning: - name: Haier start 56°C steri-cleaning - -text_sensor: - - platform: haier - appliance_name: - name: Haier appliance name - cleaning_status: - name: Haier cleaning status - protocol_version: - name: Haier protocol version +<<: !include common.yaml diff --git a/tests/components/haier/test.esp32-c3-idf.yaml b/tests/components/haier/test.esp32-c3-idf.yaml index 0053220669..b516342f3b 100644 --- a/tests/components/haier/test.esp32-c3-idf.yaml +++ b/tests/components/haier/test.esp32-c3-idf.yaml @@ -1,109 +1,5 @@ -wifi: - ssid: MySSID - password: password1 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -uart: - - id: uart_haier - tx_pin: 4 - rx_pin: 5 - baud_rate: 9600 - -climate: - - platform: haier - id: haier_ac - protocol: hOn - name: Haier AC - wifi_signal: true - answer_timeout: 200ms - beeper: true - visual: - min_temperature: 16 °C - max_temperature: 30 °C - temperature_step: - target_temperature: 1 - current_temperature: 0.5 - supported_modes: - - 'OFF' - - HEAT_COOL - - COOL - - HEAT - - DRY - - FAN_ONLY - supported_swing_modes: - - 'OFF' - - VERTICAL - - HORIZONTAL - - BOTH - supported_presets: - - AWAY - - BOOST - - ECO - - SLEEP - on_alarm_start: - then: - - logger.log: - level: DEBUG - format: "Alarm activated. Code: %d. Message: \"%s\"" - args: [code, message] - on_alarm_end: - then: - - logger.log: - level: DEBUG - format: "Alarm deactivated. Code: %d. Message: \"%s\"" - args: [code, message] - -sensor: - - platform: haier - outdoor_temperature: - name: Haier outdoor temperature - humidity: - name: Haier Indoor Humidity - compressor_current: - name: Haier Compressor Current - compressor_frequency: - name: Haier Compressor Frequency - expansion_valve_open_degree: - name: Haier Expansion Valve Open Degree - indoor_coil_temperature: - name: Haier Indoor Coil Temperature - outdoor_coil_temperature: - name: Haier Outdoor Coil Temperature - outdoor_defrost_temperature: - name: Haier Outdoor Defrost Temperature - outdoor_in_air_temperature: - name: Haier Outdoor In Air Temperature - outdoor_out_air_temperature: - name: Haier Outdoor Out Air Temperature - power: - name: Haier Power - -binary_sensor: - - platform: haier - compressor_status: - name: Haier Outdoor Compressor Status - defrost_status: - name: Haier Defrost Status - four_way_valve_status: - name: Haier Four Way Valve Status - indoor_electric_heating_status: - name: Haier Indoor Electric Heating Status - indoor_fan_status: - name: Haier Indoor Fan Status - outdoor_fan_status: - name: Haier Outdoor Fan Status - -button: - - platform: haier - self_cleaning: - name: Haier start self cleaning - steri_cleaning: - name: Haier start 56°C steri-cleaning - -text_sensor: - - platform: haier - appliance_name: - name: Haier appliance name - cleaning_status: - name: Haier cleaning status - protocol_version: - name: Haier protocol version +<<: !include common.yaml diff --git a/tests/components/haier/test.esp32-idf.yaml b/tests/components/haier/test.esp32-idf.yaml index 54e384f3ce..f486544afa 100644 --- a/tests/components/haier/test.esp32-idf.yaml +++ b/tests/components/haier/test.esp32-idf.yaml @@ -1,109 +1,5 @@ -wifi: - ssid: MySSID - password: password1 +substitutions: + tx_pin: GPIO17 + rx_pin: GPIO16 -uart: - - id: uart_haier - tx_pin: 17 - rx_pin: 16 - baud_rate: 9600 - -climate: - - platform: haier - id: haier_ac - protocol: hOn - name: Haier AC - wifi_signal: true - answer_timeout: 200ms - beeper: true - visual: - min_temperature: 16 °C - max_temperature: 30 °C - temperature_step: - target_temperature: 1 - current_temperature: 0.5 - supported_modes: - - 'OFF' - - HEAT_COOL - - COOL - - HEAT - - DRY - - FAN_ONLY - supported_swing_modes: - - 'OFF' - - VERTICAL - - HORIZONTAL - - BOTH - supported_presets: - - AWAY - - BOOST - - ECO - - SLEEP - on_alarm_start: - then: - - logger.log: - level: DEBUG - format: "Alarm activated. Code: %d. Message: \"%s\"" - args: [code, message] - on_alarm_end: - then: - - logger.log: - level: DEBUG - format: "Alarm deactivated. Code: %d. Message: \"%s\"" - args: [code, message] - -sensor: - - platform: haier - outdoor_temperature: - name: Haier outdoor temperature - humidity: - name: Haier Indoor Humidity - compressor_current: - name: Haier Compressor Current - compressor_frequency: - name: Haier Compressor Frequency - expansion_valve_open_degree: - name: Haier Expansion Valve Open Degree - indoor_coil_temperature: - name: Haier Indoor Coil Temperature - outdoor_coil_temperature: - name: Haier Outdoor Coil Temperature - outdoor_defrost_temperature: - name: Haier Outdoor Defrost Temperature - outdoor_in_air_temperature: - name: Haier Outdoor In Air Temperature - outdoor_out_air_temperature: - name: Haier Outdoor Out Air Temperature - power: - name: Haier Power - -binary_sensor: - - platform: haier - compressor_status: - name: Haier Outdoor Compressor Status - defrost_status: - name: Haier Defrost Status - four_way_valve_status: - name: Haier Four Way Valve Status - indoor_electric_heating_status: - name: Haier Indoor Electric Heating Status - indoor_fan_status: - name: Haier Indoor Fan Status - outdoor_fan_status: - name: Haier Outdoor Fan Status - -button: - - platform: haier - self_cleaning: - name: Haier start self cleaning - steri_cleaning: - name: Haier start 56°C steri-cleaning - -text_sensor: - - platform: haier - appliance_name: - name: Haier appliance name - cleaning_status: - name: Haier cleaning status - protocol_version: - name: Haier protocol version +<<: !include common.yaml diff --git a/tests/components/haier/test.esp8266-ard.yaml b/tests/components/haier/test.esp8266-ard.yaml index 0053220669..b516342f3b 100644 --- a/tests/components/haier/test.esp8266-ard.yaml +++ b/tests/components/haier/test.esp8266-ard.yaml @@ -1,109 +1,5 @@ -wifi: - ssid: MySSID - password: password1 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -uart: - - id: uart_haier - tx_pin: 4 - rx_pin: 5 - baud_rate: 9600 - -climate: - - platform: haier - id: haier_ac - protocol: hOn - name: Haier AC - wifi_signal: true - answer_timeout: 200ms - beeper: true - visual: - min_temperature: 16 °C - max_temperature: 30 °C - temperature_step: - target_temperature: 1 - current_temperature: 0.5 - supported_modes: - - 'OFF' - - HEAT_COOL - - COOL - - HEAT - - DRY - - FAN_ONLY - supported_swing_modes: - - 'OFF' - - VERTICAL - - HORIZONTAL - - BOTH - supported_presets: - - AWAY - - BOOST - - ECO - - SLEEP - on_alarm_start: - then: - - logger.log: - level: DEBUG - format: "Alarm activated. Code: %d. Message: \"%s\"" - args: [code, message] - on_alarm_end: - then: - - logger.log: - level: DEBUG - format: "Alarm deactivated. Code: %d. Message: \"%s\"" - args: [code, message] - -sensor: - - platform: haier - outdoor_temperature: - name: Haier outdoor temperature - humidity: - name: Haier Indoor Humidity - compressor_current: - name: Haier Compressor Current - compressor_frequency: - name: Haier Compressor Frequency - expansion_valve_open_degree: - name: Haier Expansion Valve Open Degree - indoor_coil_temperature: - name: Haier Indoor Coil Temperature - outdoor_coil_temperature: - name: Haier Outdoor Coil Temperature - outdoor_defrost_temperature: - name: Haier Outdoor Defrost Temperature - outdoor_in_air_temperature: - name: Haier Outdoor In Air Temperature - outdoor_out_air_temperature: - name: Haier Outdoor Out Air Temperature - power: - name: Haier Power - -binary_sensor: - - platform: haier - compressor_status: - name: Haier Outdoor Compressor Status - defrost_status: - name: Haier Defrost Status - four_way_valve_status: - name: Haier Four Way Valve Status - indoor_electric_heating_status: - name: Haier Indoor Electric Heating Status - indoor_fan_status: - name: Haier Indoor Fan Status - outdoor_fan_status: - name: Haier Outdoor Fan Status - -button: - - platform: haier - self_cleaning: - name: Haier start self cleaning - steri_cleaning: - name: Haier start 56°C steri-cleaning - -text_sensor: - - platform: haier - appliance_name: - name: Haier appliance name - cleaning_status: - name: Haier cleaning status - protocol_version: - name: Haier protocol version +<<: !include common.yaml diff --git a/tests/components/haier/test.rp2040-ard.yaml b/tests/components/haier/test.rp2040-ard.yaml index 0053220669..b516342f3b 100644 --- a/tests/components/haier/test.rp2040-ard.yaml +++ b/tests/components/haier/test.rp2040-ard.yaml @@ -1,109 +1,5 @@ -wifi: - ssid: MySSID - password: password1 +substitutions: + tx_pin: GPIO4 + rx_pin: GPIO5 -uart: - - id: uart_haier - tx_pin: 4 - rx_pin: 5 - baud_rate: 9600 - -climate: - - platform: haier - id: haier_ac - protocol: hOn - name: Haier AC - wifi_signal: true - answer_timeout: 200ms - beeper: true - visual: - min_temperature: 16 °C - max_temperature: 30 °C - temperature_step: - target_temperature: 1 - current_temperature: 0.5 - supported_modes: - - 'OFF' - - HEAT_COOL - - COOL - - HEAT - - DRY - - FAN_ONLY - supported_swing_modes: - - 'OFF' - - VERTICAL - - HORIZONTAL - - BOTH - supported_presets: - - AWAY - - BOOST - - ECO - - SLEEP - on_alarm_start: - then: - - logger.log: - level: DEBUG - format: "Alarm activated. Code: %d. Message: \"%s\"" - args: [code, message] - on_alarm_end: - then: - - logger.log: - level: DEBUG - format: "Alarm deactivated. Code: %d. Message: \"%s\"" - args: [code, message] - -sensor: - - platform: haier - outdoor_temperature: - name: Haier outdoor temperature - humidity: - name: Haier Indoor Humidity - compressor_current: - name: Haier Compressor Current - compressor_frequency: - name: Haier Compressor Frequency - expansion_valve_open_degree: - name: Haier Expansion Valve Open Degree - indoor_coil_temperature: - name: Haier Indoor Coil Temperature - outdoor_coil_temperature: - name: Haier Outdoor Coil Temperature - outdoor_defrost_temperature: - name: Haier Outdoor Defrost Temperature - outdoor_in_air_temperature: - name: Haier Outdoor In Air Temperature - outdoor_out_air_temperature: - name: Haier Outdoor Out Air Temperature - power: - name: Haier Power - -binary_sensor: - - platform: haier - compressor_status: - name: Haier Outdoor Compressor Status - defrost_status: - name: Haier Defrost Status - four_way_valve_status: - name: Haier Four Way Valve Status - indoor_electric_heating_status: - name: Haier Indoor Electric Heating Status - indoor_fan_status: - name: Haier Indoor Fan Status - outdoor_fan_status: - name: Haier Outdoor Fan Status - -button: - - platform: haier - self_cleaning: - name: Haier start self cleaning - steri_cleaning: - name: Haier start 56°C steri-cleaning - -text_sensor: - - platform: haier - appliance_name: - name: Haier appliance name - cleaning_status: - name: Haier cleaning status - protocol_version: - name: Haier protocol version +<<: !include common.yaml From 4c6a17e304002b741388335db30c06725a6730c6 Mon Sep 17 00:00:00 2001 From: Colm Date: Sat, 6 Jul 2024 08:02:41 +0100 Subject: [PATCH 170/233] Don't test for IPv6 addresses when min_ipv6_addr_count is 0 (#7037) --- esphome/components/wifi/wifi_component_esp_idf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/wifi/wifi_component_esp_idf.cpp b/esphome/components/wifi/wifi_component_esp_idf.cpp index c21486fee4..96fa837767 100644 --- a/esphome/components/wifi/wifi_component_esp_idf.cpp +++ b/esphome/components/wifi/wifi_component_esp_idf.cpp @@ -757,7 +757,7 @@ void WiFiComponent::wifi_process_event_(IDFWiFiEvent *data) { WiFiSTAConnectStatus WiFiComponent::wifi_sta_connect_status_() { if (s_sta_connected && this->got_ipv4_address_) { -#if USE_NETWORK_IPV6 +#if USE_NETWORK_IPV6 && (USE_NETWORK_MIN_IPV6_ADDR_COUNT > 0) if (this->num_ipv6_addresses_ >= USE_NETWORK_MIN_IPV6_ADDR_COUNT) { return WiFiSTAConnectStatus::CONNECTED; } From 894d81c57767444425c15e340fec292b3341aacb Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Tue, 9 Jul 2024 04:07:54 +0200 Subject: [PATCH 171/233] [CI] Allow running specific target test(s) only (#7051) --- script/test_build_components | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/script/test_build_components b/script/test_build_components index 9bbb694dcc..e885294b99 100755 --- a/script/test_build_components +++ b/script/test_build_components @@ -7,12 +7,13 @@ set -e # - `c` - Component folder name to test. Default `*`. esphome_command="compile" target_component="*" -while getopts e:c: flag +while getopts e:c:t: flag do case $flag in e) esphome_command=${OPTARG};; c) target_component=${OPTARG};; - \?) echo "Usage: $0 [-e ] [-c ]" 1>&2; exit 1;; + t) requested_target_platform=${OPTARG};; + \?) echo "Usage: $0 [-e ] [-c ] [-t ]" 1>&2; exit 1;; esac done @@ -23,6 +24,10 @@ if ! [ -d "./tests/test_build_components/build" ]; then fi start_esphome() { + if [ -n "$requested_target_platform" ] && [ "$requested_target_platform" != "$target_platform" ]; then + echo "Skiping $target_platform" + return + fi # create dynamic yaml file in `build` folder. # `./tests/test_build_components/build/[target_component].[test_name].[target_platform_with_version].yaml` component_test_file="./tests/test_build_components/build/$target_component.$test_name.$target_platform_with_version.yaml" From ee398441b664722d9af67699035af5fd38b6ab28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 23:21:11 +0200 Subject: [PATCH 172/233] Bump actions/setup-python from 5.1.0 to 5.1.1 in /.github/actions/restore-python (#7071) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/restore-python/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/restore-python/action.yml b/.github/actions/restore-python/action.yml index 4ad9e2eaed..d3fe2a89dc 100644 --- a/.github/actions/restore-python/action.yml +++ b/.github/actions/restore-python/action.yml @@ -17,7 +17,7 @@ runs: steps: - name: Set up Python ${{ inputs.python-version }} id: python - uses: actions/setup-python@v5.1.0 + uses: actions/setup-python@v5.1.1 with: python-version: ${{ inputs.python-version }} - name: Restore Python virtual environment From 2da939c81c1ec506eb96010a101e6263060f9a1c Mon Sep 17 00:00:00 2001 From: MichD Date: Wed, 10 Jul 2024 23:37:50 +0100 Subject: [PATCH 173/233] Fix RC Switch protocol not transmitting correctly via IR (#5411) --- esphome/components/remote_base/rc_switch_protocol.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/components/remote_base/rc_switch_protocol.cpp b/esphome/components/remote_base/rc_switch_protocol.cpp index 1f38fdca67..cb8a077975 100644 --- a/esphome/components/remote_base/rc_switch_protocol.cpp +++ b/esphome/components/remote_base/rc_switch_protocol.cpp @@ -54,7 +54,7 @@ void RCSwitchBase::sync(RemoteTransmitData *dst) const { } } void RCSwitchBase::transmit(RemoteTransmitData *dst, uint64_t code, uint8_t len) const { - dst->set_carrier_frequency(0); + dst->set_carrier_frequency(38000); this->sync(dst); for (int16_t i = len - 1; i >= 0; i--) { if (code & ((uint64_t) 1 << i)) { From 2873c6bbaffc22383f870dc5203f4246279c709e Mon Sep 17 00:00:00 2001 From: Kevin Ahrendt Date: Wed, 10 Jul 2024 21:21:04 -0400 Subject: [PATCH 174/233] [micro_wake_word] Version 2 (#7032) --- .../components/micro_wake_word/__init__.py | 262 +++++++-- .../audio_preprocessor_int8_model_data.h | 493 ----------------- .../micro_wake_word/micro_wake_word.cpp | 522 ++++++++---------- .../micro_wake_word/micro_wake_word.h | 190 +++---- .../micro_wake_word/preprocessor_settings.h | 20 + .../micro_wake_word/streaming_model.cpp | 189 +++++++ .../micro_wake_word/streaming_model.h | 84 +++ esphome/core/defines.h | 1 + platformio.ini | 3 +- tests/components/micro_wake_word/common.yaml | 6 +- .../micro_wake_word/test.esp32-idf.yaml | 1 + 11 files changed, 822 insertions(+), 949 deletions(-) delete mode 100644 esphome/components/micro_wake_word/audio_preprocessor_int8_model_data.h create mode 100644 esphome/components/micro_wake_word/preprocessor_settings.h create mode 100644 esphome/components/micro_wake_word/streaming_model.cpp create mode 100644 esphome/components/micro_wake_word/streaming_model.h create mode 100644 tests/components/micro_wake_word/test.esp32-idf.yaml diff --git a/esphome/components/micro_wake_word/__init__.py b/esphome/components/micro_wake_word/__init__.py index 35ee3cfedc..3d3459ccab 100644 --- a/esphome/components/micro_wake_word/__init__.py +++ b/esphome/components/micro_wake_word/__init__.py @@ -9,7 +9,7 @@ import requests import esphome.config_validation as cv import esphome.codegen as cg -from esphome.core import CORE, HexInt, EsphomeError +from esphome.core import CORE, HexInt from esphome.components import esp32, microphone from esphome import automation, git, external_files @@ -41,9 +41,15 @@ CODEOWNERS = ["@kahrendt", "@jesserockz"] DEPENDENCIES = ["microphone"] DOMAIN = "micro_wake_word" + +CONF_FEATURE_STEP_SIZE = "feature_step_size" +CONF_MODELS = "models" +CONF_ON_WAKE_WORD_DETECTED = "on_wake_word_detected" CONF_PROBABILITY_CUTOFF = "probability_cutoff" CONF_SLIDING_WINDOW_AVERAGE_SIZE = "sliding_window_average_size" -CONF_ON_WAKE_WORD_DETECTED = "on_wake_word_detected" +CONF_SLIDING_WINDOW_SIZE = "sliding_window_size" +CONF_TENSOR_ARENA_SIZE = "tensor_arena_size" +CONF_VAD = "vad" TYPE_HTTP = "http" @@ -98,12 +104,14 @@ GIT_SCHEMA = cv.All( _process_git_source, ) -KEY_WAKE_WORD = "wake_word" + KEY_AUTHOR = "author" -KEY_WEBSITE = "website" -KEY_VERSION = "version" KEY_MICRO = "micro" KEY_MINIMUM_ESPHOME_VERSION = "minimum_esphome_version" +KEY_TRAINED_LANGUAGES = "trained_languages" +KEY_VERSION = "version" +KEY_WAKE_WORD = "wake_word" +KEY_WEBSITE = "website" MANIFEST_SCHEMA_V1 = cv.Schema( { @@ -125,6 +133,29 @@ MANIFEST_SCHEMA_V1 = cv.Schema( } ) +MANIFEST_SCHEMA_V2 = cv.Schema( + { + cv.Required(CONF_TYPE): "micro", + cv.Required(CONF_MODEL): cv.string, + cv.Required(KEY_AUTHOR): cv.string, + cv.Required(KEY_VERSION): cv.All(cv.int_, 2), + cv.Required(KEY_WAKE_WORD): cv.string, + cv.Required(KEY_TRAINED_LANGUAGES): cv.ensure_list(cv.string), + cv.Optional(KEY_WEBSITE): cv.url, + cv.Required(KEY_MICRO): cv.Schema( + { + cv.Required(CONF_FEATURE_STEP_SIZE): cv.int_range(min=0, max=30), + cv.Required(CONF_TENSOR_ARENA_SIZE): cv.int_, + cv.Required(CONF_PROBABILITY_CUTOFF): cv.float_, + cv.Required(CONF_SLIDING_WINDOW_SIZE): cv.positive_int, + cv.Required(KEY_MINIMUM_ESPHOME_VERSION): cv.All( + cv.version_number, cv.validate_esphome_version + ), + } + ), + } +) + def _compute_local_file_path(config: dict) -> Path: url = config[CONF_URL] @@ -135,6 +166,24 @@ def _compute_local_file_path(config: dict) -> Path: return base_dir / key +def _convert_manifest_v1_to_v2(v1_manifest): + v2_manifest = v1_manifest.copy() + + v2_manifest[KEY_VERSION] = 2 + v2_manifest[KEY_MICRO][CONF_SLIDING_WINDOW_SIZE] = v1_manifest[KEY_MICRO][ + CONF_SLIDING_WINDOW_AVERAGE_SIZE + ] + del v2_manifest[KEY_MICRO][CONF_SLIDING_WINDOW_AVERAGE_SIZE] + v2_manifest[KEY_MICRO][ + CONF_TENSOR_ARENA_SIZE + ] = 45672 # Original Inception-based V1 manifest models require a minimum of 45672 bytes + v2_manifest[KEY_MICRO][ + CONF_FEATURE_STEP_SIZE + ] = 20 # Original Inception-based V1 manifest models use a 20 ms feature step size + + return v2_manifest + + def _download_file(url: str, path: Path) -> bytes: if not external_files.has_remote_file_changed(url, path): _LOGGER.debug("Remote file has not changed, skipping download") @@ -155,6 +204,24 @@ def _download_file(url: str, path: Path) -> bytes: return req.content +def _validate_manifest_version(manifest_data): + if manifest_version := manifest_data.get(KEY_VERSION): + if manifest_version == 1: + try: + MANIFEST_SCHEMA_V1(manifest_data) + except cv.Invalid as e: + raise cv.Invalid(f"Invalid manifest file: {e}") from e + elif manifest_version == 2: + try: + MANIFEST_SCHEMA_V2(manifest_data) + except cv.Invalid as e: + raise cv.Invalid(f"Invalid manifest file: {e}") from e + else: + raise cv.Invalid("Invalid manifest version") + else: + raise cv.Invalid("Invalid manifest file, missing 'version' key.") + + def _process_http_source(config): url = config[CONF_URL] path = _compute_local_file_path(config) @@ -167,11 +234,6 @@ def _process_http_source(config): if not isinstance(manifest_data, dict): raise cv.Invalid("Manifest file must contain a JSON object") - try: - MANIFEST_SCHEMA_V1(manifest_data) - except cv.Invalid as e: - raise cv.Invalid(f"Invalid manifest file: {e}") from e - model = manifest_data[CONF_MODEL] model_url = urljoin(url, model) @@ -206,7 +268,7 @@ def _validate_source_model_name(value): return MODEL_SOURCE_SCHEMA( { CONF_TYPE: TYPE_HTTP, - CONF_URL: f"https://github.com/esphome/micro-wake-word-models/raw/main/models/{value}.json", + CONF_URL: f"https://github.com/esphome/micro-wake-word-models/raw/main/models/v2/{value}.json", } ) @@ -260,18 +322,55 @@ MODEL_SOURCE_SCHEMA = cv.Any( msg="Not a valid model name, local path, http(s) url, or github shorthand", ) +MODEL_SCHEMA = cv.Schema( + { + cv.Optional(CONF_MODEL): MODEL_SOURCE_SCHEMA, + cv.Optional(CONF_PROBABILITY_CUTOFF): cv.percentage, + cv.Optional(CONF_SLIDING_WINDOW_SIZE): cv.positive_int, + cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8), + } +) + +# Provide a default VAD model that could be overridden +VAD_MODEL_SCHEMA = MODEL_SCHEMA.extend( + cv.Schema( + { + cv.Optional( + CONF_MODEL, + default="vad", + ): MODEL_SOURCE_SCHEMA, + } + ) +) + + +def _maybe_empty_vad_schema(value): + # Idea borrowed from uart/__init__.py's ``maybe_empty_debug`` function. Accessed 2 July 2024. + # Loads a default VAD model without any parameters overridden. + if value is None: + value = {} + return VAD_MODEL_SCHEMA(value) + + CONFIG_SCHEMA = cv.All( cv.Schema( { cv.GenerateID(): cv.declare_id(MicroWakeWord), cv.GenerateID(CONF_MICROPHONE): cv.use_id(microphone.Microphone), - cv.Optional(CONF_PROBABILITY_CUTOFF): cv.percentage, - cv.Optional(CONF_SLIDING_WINDOW_AVERAGE_SIZE): cv.positive_int, + cv.Required(CONF_MODELS): cv.ensure_list(MODEL_SCHEMA), cv.Optional(CONF_ON_WAKE_WORD_DETECTED): automation.validate_automation( single=True ), - cv.Required(CONF_MODEL): MODEL_SOURCE_SCHEMA, - cv.GenerateID(CONF_RAW_DATA_ID): cv.declare_id(cg.uint8), + cv.Optional(CONF_VAD): _maybe_empty_vad_schema, + cv.Optional(CONF_MODEL): cv.invalid( + f"The {CONF_MODEL} parameter has moved to be a list element under the {CONF_MODELS} parameter." + ), + cv.Optional(CONF_PROBABILITY_CUTOFF): cv.invalid( + f"The {CONF_PROBABILITY_CUTOFF} parameter has moved to be a list element under the {CONF_MODELS} parameter." + ), + cv.Optional(CONF_SLIDING_WINDOW_AVERAGE_SIZE): cv.invalid( + f"The {CONF_SLIDING_WINDOW_AVERAGE_SIZE} parameter has been renamed to {CONF_SLIDING_WINDOW_SIZE} and moved to be a list element under the {CONF_MODELS} parameter." + ), } ).extend(cv.COMPONENT_SCHEMA), cv.only_with_esp_idf, @@ -282,45 +381,20 @@ def _load_model_data(manifest_path: Path): with open(manifest_path, encoding="utf-8") as f: manifest = json.load(f) - try: - MANIFEST_SCHEMA_V1(manifest) - except cv.Invalid as e: - raise EsphomeError(f"Invalid manifest file: {e}") from e + _validate_manifest_version(manifest) model_path = manifest_path.parent / manifest[CONF_MODEL] with open(model_path, "rb") as f: model = f.read() + if manifest.get(KEY_VERSION) == 1: + manifest = _convert_manifest_v1_to_v2(manifest) + return manifest, model -async def to_code(config): - var = cg.new_Pvariable(config[CONF_ID]) - await cg.register_component(var, config) - - mic = await cg.get_variable(config[CONF_MICROPHONE]) - cg.add(var.set_microphone(mic)) - - if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED): - await automation.build_automation( - var.get_wake_word_detected_trigger(), - [(cg.std_string, "wake_word")], - on_wake_word_detection_config, - ) - - esp32.add_idf_component( - name="esp-tflite-micro", - repo="https://github.com/espressif/esp-tflite-micro", - ref="v1.3.1", - ) - - cg.add_build_flag("-DTF_LITE_STATIC_MEMORY") - cg.add_build_flag("-DTF_LITE_DISABLE_X86_NEON") - cg.add_build_flag("-DESP_NN") - - model_config = config.get(CONF_MODEL) - data = [] +def _model_config_to_manifest_data(model_config): if model_config[CONF_TYPE] == TYPE_GIT: # compute path to model file key = f"{model_config[CONF_URL]}@{model_config.get(CONF_REF)}" @@ -338,23 +412,95 @@ async def to_code(config): else: raise ValueError("Unsupported config type: {model_config[CONF_TYPE]}") - manifest, data = _load_model_data(file) + return _load_model_data(file) - rhs = [HexInt(x) for x in data] - prog_arr = cg.progmem_array(config[CONF_RAW_DATA_ID], rhs) - cg.add(var.set_model_start(prog_arr)) - probability_cutoff = config.get( - CONF_PROBABILITY_CUTOFF, manifest[KEY_MICRO][CONF_PROBABILITY_CUTOFF] +def _feature_step_size_validate(config): + features_step_size = None + + for model_parameters in config[CONF_MODELS]: + model_config = model_parameters.get(CONF_MODEL) + manifest, _ = _model_config_to_manifest_data(model_config) + + model_step_size = manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE] + + if features_step_size is None: + features_step_size = model_step_size + elif features_step_size != model_step_size: + raise cv.Invalid("Cannot load models with different features step sizes.") + + +FINAL_VALIDATE_SCHEMA = _feature_step_size_validate + + +async def to_code(config): + var = cg.new_Pvariable(config[CONF_ID]) + await cg.register_component(var, config) + + mic = await cg.get_variable(config[CONF_MICROPHONE]) + cg.add(var.set_microphone(mic)) + + esp32.add_idf_component( + name="esp-tflite-micro", + repo="https://github.com/espressif/esp-tflite-micro", + ref="v1.3.1", ) - cg.add(var.set_probability_cutoff(probability_cutoff)) - sliding_window_average_size = config.get( - CONF_SLIDING_WINDOW_AVERAGE_SIZE, - manifest[KEY_MICRO][CONF_SLIDING_WINDOW_AVERAGE_SIZE], - ) - cg.add(var.set_sliding_window_average_size(sliding_window_average_size)) - cg.add(var.set_wake_word(manifest[KEY_WAKE_WORD])) + cg.add_build_flag("-DTF_LITE_STATIC_MEMORY") + cg.add_build_flag("-DTF_LITE_DISABLE_X86_NEON") + cg.add_build_flag("-DESP_NN") + + if on_wake_word_detection_config := config.get(CONF_ON_WAKE_WORD_DETECTED): + await automation.build_automation( + var.get_wake_word_detected_trigger(), + [(cg.std_string, "wake_word")], + on_wake_word_detection_config, + ) + + if vad_model := config.get(CONF_VAD): + cg.add_define("USE_MICRO_WAKE_WORD_VAD") + + # Use the general model loading code for the VAD codegen + config[CONF_MODELS].append(vad_model) + + for model_parameters in config[CONF_MODELS]: + model_config = model_parameters.get(CONF_MODEL) + data = [] + manifest, data = _model_config_to_manifest_data(model_config) + + rhs = [HexInt(x) for x in data] + prog_arr = cg.progmem_array(model_parameters[CONF_RAW_DATA_ID], rhs) + + probability_cutoff = model_parameters.get( + CONF_PROBABILITY_CUTOFF, manifest[KEY_MICRO][CONF_PROBABILITY_CUTOFF] + ) + sliding_window_size = model_parameters.get( + CONF_SLIDING_WINDOW_SIZE, + manifest[KEY_MICRO][CONF_SLIDING_WINDOW_SIZE], + ) + + if manifest[KEY_WAKE_WORD] == "vad": + cg.add( + var.add_vad_model( + prog_arr, + probability_cutoff, + sliding_window_size, + manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE], + ) + ) + else: + cg.add( + var.add_wake_word_model( + prog_arr, + probability_cutoff, + sliding_window_size, + manifest[KEY_WAKE_WORD], + manifest[KEY_MICRO][CONF_TENSOR_ARENA_SIZE], + ) + ) + + cg.add(var.set_features_step_size(manifest[KEY_MICRO][CONF_FEATURE_STEP_SIZE])) + cg.add_library("kahrendt/ESPMicroSpeechFeatures", "1.0.0") MICRO_WAKE_WORD_ACTION_SCHEMA = cv.Schema({cv.GenerateID(): cv.use_id(MicroWakeWord)}) diff --git a/esphome/components/micro_wake_word/audio_preprocessor_int8_model_data.h b/esphome/components/micro_wake_word/audio_preprocessor_int8_model_data.h deleted file mode 100644 index 918e76045f..0000000000 --- a/esphome/components/micro_wake_word/audio_preprocessor_int8_model_data.h +++ /dev/null @@ -1,493 +0,0 @@ -#pragma once - -#ifdef USE_ESP_IDF - -// Converted audio_preprocessor_int8.tflite -// From https://github.com/tensorflow/tflite-micro/tree/main/tensorflow/lite/micro/examples/micro_speech/models accessed -// January 2024 -// -// Copyright 2023 The TensorFlow Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -namespace esphome { -namespace micro_wake_word { - -const unsigned char G_AUDIO_PREPROCESSOR_INT8_TFLITE[] = { - 0x1c, 0x00, 0x00, 0x00, 0x54, 0x46, 0x4c, 0x33, 0x14, 0x00, 0x20, 0x00, 0x1c, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, - 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x88, 0x00, - 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x80, 0x0e, 0x00, 0x00, 0x90, 0x0e, 0x00, 0x00, 0xcc, 0x1f, 0x00, 0x00, 0x03, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xe2, 0xeb, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, - 0x1c, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x73, 0x65, 0x72, 0x76, 0x69, 0x6e, 0x67, - 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x94, 0xff, - 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x5f, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc2, 0xf5, 0xff, 0xff, - 0x04, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xdc, 0xff, 0xff, 0xff, 0x2d, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x43, 0x4f, 0x4e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, - 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x6d, 0x69, 0x6e, - 0x5f, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x2e, 0x00, - 0x00, 0x00, 0x9c, 0x0d, 0x00, 0x00, 0x94, 0x0d, 0x00, 0x00, 0xc4, 0x09, 0x00, 0x00, 0x6c, 0x09, 0x00, 0x00, 0x48, - 0x09, 0x00, 0x00, 0x34, 0x09, 0x00, 0x00, 0x20, 0x09, 0x00, 0x00, 0x0c, 0x09, 0x00, 0x00, 0xf8, 0x08, 0x00, 0x00, - 0xec, 0x07, 0x00, 0x00, 0x88, 0x07, 0x00, 0x00, 0x24, 0x07, 0x00, 0x00, 0xc0, 0x06, 0x00, 0x00, 0x38, 0x04, 0x00, - 0x00, 0xb0, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0x88, 0x01, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x60, 0x01, - 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x2c, - 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x1c, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, - 0x04, 0x01, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, - 0x00, 0xdc, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0xcc, 0x00, 0x00, 0x00, 0xc4, 0x00, 0x00, 0x00, 0xbc, 0x00, - 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0x94, - 0x00, 0x00, 0x00, 0x8c, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xf2, 0xf6, 0xff, 0xff, - 0x04, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, - 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x08, 0x00, - 0x07, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x32, 0x2e, 0x31, 0x32, 0x2e, 0x30, 0x00, - 0x00, 0x56, 0xf7, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x32, 0x2e, 0x38, 0x2e, 0x30, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0xe1, 0xff, 0xff, 0xd8, 0xe1, 0xff, 0xff, 0xdc, - 0xe1, 0xff, 0xff, 0xe0, 0xe1, 0xff, 0xff, 0xe4, 0xe1, 0xff, 0xff, 0xe8, 0xe1, 0xff, 0xff, 0xec, 0xe1, 0xff, 0xff, - 0xf0, 0xe1, 0xff, 0xff, 0xf4, 0xe1, 0xff, 0xff, 0xf8, 0xe1, 0xff, 0xff, 0xfc, 0xe1, 0xff, 0xff, 0x00, 0xe2, 0xff, - 0xff, 0x04, 0xe2, 0xff, 0xff, 0x08, 0xe2, 0xff, 0xff, 0x0c, 0xe2, 0xff, 0xff, 0x10, 0xe2, 0xff, 0xff, 0x14, 0xe2, - 0xff, 0xff, 0x18, 0xe2, 0xff, 0xff, 0x1c, 0xe2, 0xff, 0xff, 0x20, 0xe2, 0xff, 0xff, 0x24, 0xe2, 0xff, 0xff, 0x28, - 0xe2, 0xff, 0xff, 0x2c, 0xe2, 0xff, 0xff, 0x30, 0xe2, 0xff, 0xff, 0xd2, 0xf7, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x9a, 0x02, 0x00, 0x00, 0xe2, 0xf7, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0xf2, 0xf7, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x80, 0xff, - 0xff, 0xff, 0x02, 0xf8, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x12, - 0xf8, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x22, 0xf8, 0xff, 0xff, - 0x04, 0x00, 0x00, 0x00, 0x78, 0x02, 0x00, 0x00, 0x00, 0x00, 0x61, 0x05, 0x00, 0x00, 0x00, 0x00, 0x23, 0x0b, 0x41, - 0x01, 0x00, 0x00, 0x00, 0x00, 0xb3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x0e, 0x80, 0x05, - 0x00, 0x00, 0x00, 0x00, 0xd1, 0x0c, 0x63, 0x04, 0x00, 0x00, 0x00, 0x00, 0x34, 0x0c, 0x3f, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x81, 0x0c, 0xf7, 0x04, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x0d, 0x77, 0x06, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x0f, - 0xa9, 0x08, 0x01, 0x02, 0x7f, 0x0b, 0x22, 0x05, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x0e, 0xd1, 0x08, 0xdb, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x03, 0x0d, 0x4a, 0x07, 0xad, 0x01, 0x2c, 0x0c, 0xc6, 0x06, 0x79, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x45, 0x0c, 0x29, 0x07, 0x23, 0x02, 0x34, 0x0d, 0x5b, 0x08, 0x96, 0x03, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x0e, 0x48, - 0x0a, 0xbd, 0x05, 0x45, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0x0c, 0x88, 0x08, 0x43, 0x04, - 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe9, 0x0b, 0xd3, 0x07, 0xcb, 0x03, 0xd2, 0x0f, 0xe7, - 0x0b, 0x09, 0x08, 0x39, 0x04, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbf, 0x0c, 0x14, 0x09, - 0x75, 0x05, 0xe2, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x0e, 0xdd, 0x0a, 0x6b, 0x07, 0x03, - 0x04, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x0d, 0x09, 0x0a, 0xc9, 0x06, 0x93, 0x03, 0x65, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x0d, 0x25, 0x0a, 0x12, 0x07, 0x07, 0x04, 0x05, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x0a, 0x0e, 0x17, 0x0b, 0x2c, 0x08, 0x49, 0x05, 0x6d, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x98, 0x0f, 0xcb, 0x0c, 0x04, 0x0a, 0x44, 0x07, 0x8b, 0x04, 0xd8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x0f, 0x87, - 0x0c, 0xe7, 0x09, 0x4e, 0x07, 0xba, 0x04, 0x2d, 0x02, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x0f, 0x23, 0x0d, 0xa7, 0x0a, - 0x30, 0x08, 0xbe, 0x05, 0x52, 0x03, 0xeb, 0x00, 0x89, 0x0e, 0x2c, 0x0c, 0xd4, 0x09, 0x81, 0x07, 0x33, 0x05, 0xe9, - 0x02, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x0e, 0x29, 0x0c, 0xf1, 0x09, 0xbe, 0x07, 0x90, 0x05, 0x65, 0x03, - 0x3f, 0x01, 0x1d, 0x0f, 0xff, 0x0c, 0xe5, 0x0a, 0xcf, 0x08, 0xbc, 0x06, 0xae, 0x04, 0xa3, 0x02, 0x9c, 0x00, 0x99, - 0x0e, 0x99, 0x0c, 0x9d, 0x0a, 0xa4, 0x08, 0xaf, 0x06, 0xbd, 0x04, 0xcf, 0x02, 0xe4, 0x00, 0xfc, 0x0e, 0x17, 0x0d, - 0x36, 0x0b, 0x57, 0x09, 0x7c, 0x07, 0xa4, 0x05, 0xcf, 0x03, 0xfd, 0x01, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x62, 0x0e, 0x98, 0x0c, 0xd2, 0x0a, 0x0e, 0x09, 0x4d, 0x07, 0x8f, 0x05, 0xd4, 0x03, 0x1b, 0x02, - 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb1, 0x0e, 0x00, 0x0d, 0x52, 0x0b, 0xa6, 0x09, 0xfd, 0x07, 0x56, 0x06, 0xb1, - 0x04, 0x0f, 0x03, 0x6f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd2, 0x0f, 0x37, 0x0e, 0x9e, 0x0c, - 0x08, 0x0b, 0x73, 0x09, 0xe1, 0x07, 0x52, 0x06, 0xc4, 0x04, 0x38, 0x03, 0xaf, 0x01, 0x28, 0x00, 0xa3, 0x0e, 0x1f, - 0x0d, 0x9e, 0x0b, 0x1f, 0x0a, 0xa2, 0x08, 0x27, 0x07, 0xae, 0x05, 0x37, 0x04, 0xc2, 0x02, 0x4e, 0x01, 0x00, 0x00, - 0x00, 0x00, 0xdd, 0x0f, 0x6d, 0x0e, 0xff, 0x0c, 0x93, 0x0b, 0x29, 0x0a, 0xc1, 0x08, 0x5a, 0x07, 0xf5, 0x05, 0x92, - 0x04, 0x30, 0x03, 0xd1, 0x01, 0x73, 0x00, 0x16, 0x0f, 0xbc, 0x0d, 0x62, 0x0c, 0x0b, 0x0b, 0xb5, 0x09, 0x61, 0x08, - 0x0e, 0x07, 0xbd, 0x05, 0x6d, 0x04, 0x1f, 0x03, 0xd3, 0x01, 0x88, 0x00, 0x3e, 0x0f, 0xf6, 0x0d, 0xaf, 0x0c, 0x6a, - 0x0b, 0x27, 0x0a, 0xe4, 0x08, 0xa3, 0x07, 0x64, 0x06, 0x26, 0x05, 0xe9, 0x03, 0xae, 0x02, 0x74, 0x01, 0x3b, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x0f, 0xce, 0x0d, 0x99, 0x0c, 0x66, 0x0b, 0x34, 0x0a, 0x03, - 0x09, 0xd3, 0x07, 0xa5, 0x06, 0x78, 0x05, 0x4c, 0x04, 0x22, 0x03, 0xf8, 0x01, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xa9, 0x0f, 0x83, 0x0e, 0x5f, 0x0d, 0x3b, 0x0c, 0x19, 0x0b, 0xf8, 0x09, 0xd8, 0x08, 0xb9, 0x07, 0x9b, 0x06, 0x7e, - 0x05, 0x63, 0x04, 0x48, 0x03, 0x2f, 0x02, 0x17, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa6, 0xfa, 0xff, 0xff, 0x04, 0x00, - 0x00, 0x00, 0x78, 0x02, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xdc, 0x04, 0xbe, 0x0e, 0x00, - 0x00, 0x00, 0x00, 0x4c, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0x01, 0x7f, 0x0a, 0x00, 0x00, - 0x00, 0x00, 0x2e, 0x03, 0x9c, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xcb, 0x03, 0xc0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x7e, - 0x03, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x60, 0x02, 0x88, 0x09, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x56, 0x07, - 0xfe, 0x0d, 0x80, 0x04, 0xdd, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x16, 0x01, 0x2e, 0x07, 0x24, 0x0d, 0x00, 0x00, 0x00, - 0x00, 0xfc, 0x02, 0xb5, 0x08, 0x52, 0x0e, 0xd3, 0x03, 0x39, 0x09, 0x86, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xba, 0x03, - 0xd6, 0x08, 0xdc, 0x0d, 0xcb, 0x02, 0xa4, 0x07, 0x69, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x01, 0xb7, 0x05, 0x42, - 0x0a, 0xba, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x03, 0x77, 0x07, 0xbc, 0x0b, 0xf1, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x04, 0x2c, 0x08, 0x34, 0x0c, 0x2d, 0x00, 0x18, 0x04, 0xf6, - 0x07, 0xc6, 0x0b, 0x89, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x03, 0xeb, 0x06, 0x8a, 0x0a, - 0x1d, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa5, 0x01, 0x22, 0x05, 0x94, 0x08, 0xfc, 0x0b, 0x59, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0xac, 0x02, 0xf6, 0x05, 0x36, 0x09, 0x6c, 0x0c, 0x9a, 0x0f, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xbe, 0x02, 0xda, 0x05, 0xed, 0x08, 0xf8, 0x0b, 0xfa, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xf5, - 0x01, 0xe8, 0x04, 0xd3, 0x07, 0xb6, 0x0a, 0x92, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x00, - 0x34, 0x03, 0xfb, 0x05, 0xbb, 0x08, 0x74, 0x0b, 0x27, 0x0e, 0x00, 0x00, 0x00, 0x00, 0xd3, 0x00, 0x78, 0x03, 0x18, - 0x06, 0xb1, 0x08, 0x45, 0x0b, 0xd2, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0xdc, 0x02, 0x58, 0x05, 0xcf, 0x07, - 0x41, 0x0a, 0xad, 0x0c, 0x14, 0x0f, 0x76, 0x01, 0xd3, 0x03, 0x2b, 0x06, 0x7e, 0x08, 0xcc, 0x0a, 0x16, 0x0d, 0x5a, - 0x0f, 0x00, 0x00, 0x00, 0x00, 0x9b, 0x01, 0xd6, 0x03, 0x0e, 0x06, 0x41, 0x08, 0x6f, 0x0a, 0x9a, 0x0c, 0xc0, 0x0e, - 0xe2, 0x00, 0x00, 0x03, 0x1a, 0x05, 0x30, 0x07, 0x43, 0x09, 0x51, 0x0b, 0x5c, 0x0d, 0x63, 0x0f, 0x66, 0x01, 0x66, - 0x03, 0x62, 0x05, 0x5b, 0x07, 0x50, 0x09, 0x42, 0x0b, 0x30, 0x0d, 0x1b, 0x0f, 0x03, 0x01, 0xe8, 0x02, 0xc9, 0x04, - 0xa8, 0x06, 0x83, 0x08, 0x5b, 0x0a, 0x30, 0x0c, 0x02, 0x0e, 0xd1, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x9d, 0x01, 0x67, 0x03, 0x2d, 0x05, 0xf1, 0x06, 0xb2, 0x08, 0x70, 0x0a, 0x2b, 0x0c, 0xe4, 0x0d, 0x9a, 0x0f, - 0x00, 0x00, 0x00, 0x00, 0x4e, 0x01, 0xff, 0x02, 0xad, 0x04, 0x59, 0x06, 0x02, 0x08, 0xa9, 0x09, 0x4e, 0x0b, 0xf0, - 0x0c, 0x90, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0xc8, 0x01, 0x61, 0x03, 0xf7, 0x04, - 0x8c, 0x06, 0x1e, 0x08, 0xad, 0x09, 0x3b, 0x0b, 0xc7, 0x0c, 0x50, 0x0e, 0xd7, 0x0f, 0x5c, 0x01, 0xe0, 0x02, 0x61, - 0x04, 0xe0, 0x05, 0x5d, 0x07, 0xd8, 0x08, 0x51, 0x0a, 0xc8, 0x0b, 0x3d, 0x0d, 0xb1, 0x0e, 0x00, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x92, 0x01, 0x00, 0x03, 0x6c, 0x04, 0xd6, 0x05, 0x3e, 0x07, 0xa5, 0x08, 0x0a, 0x0a, 0x6d, 0x0b, 0xcf, - 0x0c, 0x2e, 0x0e, 0x8c, 0x0f, 0xe9, 0x00, 0x43, 0x02, 0x9d, 0x03, 0xf4, 0x04, 0x4a, 0x06, 0x9e, 0x07, 0xf1, 0x08, - 0x42, 0x0a, 0x92, 0x0b, 0xe0, 0x0c, 0x2c, 0x0e, 0x77, 0x0f, 0xc1, 0x00, 0x09, 0x02, 0x50, 0x03, 0x95, 0x04, 0xd8, - 0x05, 0x1b, 0x07, 0x5c, 0x08, 0x9b, 0x09, 0xd9, 0x0a, 0x16, 0x0c, 0x51, 0x0d, 0x8b, 0x0e, 0xc4, 0x0f, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x00, 0x31, 0x02, 0x66, 0x03, 0x99, 0x04, 0xcb, 0x05, 0xfc, 0x06, 0x2c, - 0x08, 0x5a, 0x09, 0x87, 0x0a, 0xb3, 0x0b, 0xdd, 0x0c, 0x07, 0x0e, 0x2f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, - 0x7c, 0x01, 0xa0, 0x02, 0xc4, 0x03, 0xe6, 0x04, 0x07, 0x06, 0x27, 0x07, 0x46, 0x08, 0x64, 0x09, 0x81, 0x0a, 0x9c, - 0x0b, 0xb7, 0x0c, 0xd0, 0x0d, 0xe8, 0x0e, 0x00, 0x10, 0x00, 0x00, 0x2a, 0xfd, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, - 0x52, 0x00, 0x00, 0x00, 0x04, 0x00, 0x06, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0a, 0x00, 0x0c, 0x00, 0x0e, 0x00, 0x10, - 0x00, 0x12, 0x00, 0x16, 0x00, 0x18, 0x00, 0x1a, 0x00, 0x1e, 0x00, 0x20, 0x00, 0x24, 0x00, 0x26, 0x00, 0x2a, 0x00, - 0x2e, 0x00, 0x32, 0x00, 0x36, 0x00, 0x3a, 0x00, 0x40, 0x00, 0x44, 0x00, 0x4a, 0x00, 0x4e, 0x00, 0x54, 0x00, 0x5a, - 0x00, 0x62, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, 0x92, 0x00, 0x9a, 0x00, 0xa6, 0x00, - 0xb0, 0x00, 0xbc, 0x00, 0xc8, 0x00, 0xd4, 0x00, 0xe2, 0x00, 0x00, 0x00, 0x8a, 0xfd, 0xff, 0xff, 0x04, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, - 0x1c, 0x00, 0x20, 0x00, 0x24, 0x00, 0x28, 0x00, 0x2c, 0x00, 0x30, 0x00, 0x34, 0x00, 0x38, 0x00, 0x3c, 0x00, 0x44, - 0x00, 0x4c, 0x00, 0x50, 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x70, 0x00, 0x78, 0x00, 0x80, 0x00, 0x88, 0x00, - 0x90, 0x00, 0x98, 0x00, 0xa0, 0x00, 0xa8, 0x00, 0xb0, 0x00, 0xb8, 0x00, 0xc4, 0x00, 0xd0, 0x00, 0xdc, 0x00, 0xe8, - 0x00, 0xf4, 0x00, 0x00, 0x01, 0x0c, 0x01, 0x1c, 0x01, 0x2c, 0x01, 0x00, 0x00, 0xea, 0xfd, 0xff, 0xff, 0x04, 0x00, - 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, - 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, - 0x08, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, - 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, - 0x0c, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x4a, 0xfe, 0xff, 0xff, 0x04, - 0x00, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x7c, 0x7f, 0x79, 0x7f, 0x76, 0x7f, 0xfa, 0xff, 0x00, 0x00, 0x00, 0x00, - 0x70, 0x7f, 0xf4, 0xff, 0x00, 0x00, 0x00, 0x00, 0x64, 0x7f, 0xe9, 0xff, 0xfe, 0xff, 0x00, 0x00, 0x4b, 0x7f, 0xd0, - 0xff, 0x00, 0x00, 0x00, 0x00, 0x1b, 0x7f, 0xa0, 0xff, 0x00, 0x00, 0x00, 0x00, 0xbb, 0x7e, 0x42, 0xff, 0x00, 0x00, - 0x00, 0x00, 0xfd, 0x7d, 0x86, 0xfe, 0x04, 0x00, 0x00, 0x00, 0x87, 0x7c, 0x1d, 0xfd, 0x12, 0x00, 0x00, 0x00, 0xb6, - 0x79, 0x7f, 0xfa, 0x3e, 0x00, 0x00, 0x00, 0x73, 0x74, 0xf9, 0xf5, 0xca, 0x00, 0x00, 0x00, 0x36, 0x6b, 0x33, 0xef, - 0x32, 0x02, 0x00, 0x00, 0x9b, 0x5c, 0x87, 0xe7, 0xce, 0x04, 0x00, 0x00, 0xf0, 0x48, 0xde, 0xe2, 0xa0, 0x07, 0x00, - 0x00, 0x6e, 0x33, 0x8a, 0xe4, 0xa4, 0x08, 0x00, 0x00, 0x9c, 0x20, 0x22, 0xeb, 0x4c, 0x07, 0x00, 0x00, 0x0a, 0x13, - 0x7d, 0xf2, 0x02, 0x05, 0x00, 0x00, 0x89, 0x0a, 0x17, 0xf8, 0x06, 0x03, 0x00, 0x00, 0xa6, 0x05, 0xa0, 0xfb, 0xb4, - 0x01, 0x00, 0x00, 0xfa, 0x02, 0xac, 0xfd, 0xe8, 0x00, 0x00, 0x00, 0x8e, 0x01, 0xc7, 0xfe, 0x7a, 0x00, 0x00, 0x00, - 0xcf, 0x00, 0x5c, 0xff, 0x40, 0x00, 0x00, 0x00, 0x6b, 0x00, 0xab, 0xff, 0x22, 0x00, 0x00, 0x00, 0x38, 0x00, 0xd3, - 0xff, 0x12, 0x00, 0x00, 0x00, 0x1d, 0x00, 0xea, 0xff, 0x08, 0x00, 0x00, 0x00, 0x0f, 0x00, 0xf3, 0xff, 0x06, 0x00, - 0x00, 0x00, 0x08, 0x00, 0xf8, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x00, 0xfd, 0xff, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xfd, 0xff, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x62, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0xf1, 0x00, 0x00, 0x00, 0x72, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x82, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x4d, 0x01, 0x00, 0x00, - 0x92, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0xff, 0xff, 0xff, 0x04, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x00, - 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x02, 0x00, 0x04, 0x00, 0x05, 0x00, 0x07, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x13, 0x00, 0x17, 0x00, - 0x1b, 0x00, 0x20, 0x00, 0x25, 0x00, 0x2a, 0x00, 0x30, 0x00, 0x35, 0x00, 0x3c, 0x00, 0x42, 0x00, 0x49, 0x00, 0x51, - 0x00, 0x58, 0x00, 0x60, 0x00, 0x68, 0x00, 0x71, 0x00, 0x7a, 0x00, 0x83, 0x00, 0x8d, 0x00, 0x97, 0x00, 0xa1, 0x00, - 0xac, 0x00, 0xb7, 0x00, 0xc2, 0x00, 0xcd, 0x00, 0xd9, 0x00, 0xe5, 0x00, 0xf2, 0x00, 0xff, 0x00, 0x0c, 0x01, 0x19, - 0x01, 0x27, 0x01, 0x35, 0x01, 0x43, 0x01, 0x52, 0x01, 0x61, 0x01, 0x70, 0x01, 0x7f, 0x01, 0x8f, 0x01, 0x9f, 0x01, - 0xaf, 0x01, 0xc0, 0x01, 0xd1, 0x01, 0xe2, 0x01, 0xf3, 0x01, 0x05, 0x02, 0x17, 0x02, 0x29, 0x02, 0x3c, 0x02, 0x4e, - 0x02, 0x61, 0x02, 0x75, 0x02, 0x88, 0x02, 0x9c, 0x02, 0xb0, 0x02, 0xc4, 0x02, 0xd8, 0x02, 0xed, 0x02, 0x02, 0x03, - 0x17, 0x03, 0x2c, 0x03, 0x41, 0x03, 0x57, 0x03, 0x6d, 0x03, 0x83, 0x03, 0x99, 0x03, 0xb0, 0x03, 0xc7, 0x03, 0xdd, - 0x03, 0xf4, 0x03, 0x0c, 0x04, 0x23, 0x04, 0x3b, 0x04, 0x52, 0x04, 0x6a, 0x04, 0x82, 0x04, 0x9a, 0x04, 0xb3, 0x04, - 0xcb, 0x04, 0xe4, 0x04, 0xfd, 0x04, 0x16, 0x05, 0x2f, 0x05, 0x48, 0x05, 0x61, 0x05, 0x7a, 0x05, 0x94, 0x05, 0xad, - 0x05, 0xc7, 0x05, 0xe1, 0x05, 0xfb, 0x05, 0x15, 0x06, 0x2f, 0x06, 0x49, 0x06, 0x63, 0x06, 0x7e, 0x06, 0x98, 0x06, - 0xb2, 0x06, 0xcd, 0x06, 0xe7, 0x06, 0x02, 0x07, 0x1d, 0x07, 0x37, 0x07, 0x52, 0x07, 0x6d, 0x07, 0x87, 0x07, 0xa2, - 0x07, 0xbd, 0x07, 0xd8, 0x07, 0xf3, 0x07, 0x0d, 0x08, 0x28, 0x08, 0x43, 0x08, 0x5e, 0x08, 0x79, 0x08, 0x93, 0x08, - 0xae, 0x08, 0xc9, 0x08, 0xe3, 0x08, 0xfe, 0x08, 0x19, 0x09, 0x33, 0x09, 0x4e, 0x09, 0x68, 0x09, 0x82, 0x09, 0x9d, - 0x09, 0xb7, 0x09, 0xd1, 0x09, 0xeb, 0x09, 0x05, 0x0a, 0x1f, 0x0a, 0x39, 0x0a, 0x53, 0x0a, 0x6c, 0x0a, 0x86, 0x0a, - 0x9f, 0x0a, 0xb8, 0x0a, 0xd1, 0x0a, 0xea, 0x0a, 0x03, 0x0b, 0x1c, 0x0b, 0x35, 0x0b, 0x4d, 0x0b, 0x66, 0x0b, 0x7e, - 0x0b, 0x96, 0x0b, 0xae, 0x0b, 0xc5, 0x0b, 0xdd, 0x0b, 0xf4, 0x0b, 0x0c, 0x0c, 0x23, 0x0c, 0x39, 0x0c, 0x50, 0x0c, - 0x67, 0x0c, 0x7d, 0x0c, 0x93, 0x0c, 0xa9, 0x0c, 0xbf, 0x0c, 0xd4, 0x0c, 0xe9, 0x0c, 0xfe, 0x0c, 0x13, 0x0d, 0x28, - 0x0d, 0x3c, 0x0d, 0x50, 0x0d, 0x64, 0x0d, 0x78, 0x0d, 0x8b, 0x0d, 0x9f, 0x0d, 0xb2, 0x0d, 0xc4, 0x0d, 0xd7, 0x0d, - 0xe9, 0x0d, 0xfb, 0x0d, 0x0d, 0x0e, 0x1e, 0x0e, 0x2f, 0x0e, 0x40, 0x0e, 0x51, 0x0e, 0x61, 0x0e, 0x71, 0x0e, 0x81, - 0x0e, 0x90, 0x0e, 0x9f, 0x0e, 0xae, 0x0e, 0xbd, 0x0e, 0xcb, 0x0e, 0xd9, 0x0e, 0xe7, 0x0e, 0xf4, 0x0e, 0x01, 0x0f, - 0x0e, 0x0f, 0x1b, 0x0f, 0x27, 0x0f, 0x33, 0x0f, 0x3e, 0x0f, 0x49, 0x0f, 0x54, 0x0f, 0x5f, 0x0f, 0x69, 0x0f, 0x73, - 0x0f, 0x7d, 0x0f, 0x86, 0x0f, 0x8f, 0x0f, 0x98, 0x0f, 0xa0, 0x0f, 0xa8, 0x0f, 0xaf, 0x0f, 0xb7, 0x0f, 0xbe, 0x0f, - 0xc4, 0x0f, 0xcb, 0x0f, 0xd0, 0x0f, 0xd6, 0x0f, 0xdb, 0x0f, 0xe0, 0x0f, 0xe5, 0x0f, 0xe9, 0x0f, 0xed, 0x0f, 0xf0, - 0x0f, 0xf3, 0x0f, 0xf6, 0x0f, 0xf9, 0x0f, 0xfb, 0x0f, 0xfc, 0x0f, 0xfe, 0x0f, 0xff, 0x0f, 0x00, 0x10, 0x00, 0x10, - 0x00, 0x10, 0x00, 0x10, 0xff, 0x0f, 0xfe, 0x0f, 0xfc, 0x0f, 0xfb, 0x0f, 0xf9, 0x0f, 0xf6, 0x0f, 0xf3, 0x0f, 0xf0, - 0x0f, 0xed, 0x0f, 0xe9, 0x0f, 0xe5, 0x0f, 0xe0, 0x0f, 0xdb, 0x0f, 0xd6, 0x0f, 0xd0, 0x0f, 0xcb, 0x0f, 0xc4, 0x0f, - 0xbe, 0x0f, 0xb7, 0x0f, 0xaf, 0x0f, 0xa8, 0x0f, 0xa0, 0x0f, 0x98, 0x0f, 0x8f, 0x0f, 0x86, 0x0f, 0x7d, 0x0f, 0x73, - 0x0f, 0x69, 0x0f, 0x5f, 0x0f, 0x54, 0x0f, 0x49, 0x0f, 0x3e, 0x0f, 0x33, 0x0f, 0x27, 0x0f, 0x1b, 0x0f, 0x0e, 0x0f, - 0x01, 0x0f, 0xf4, 0x0e, 0xe7, 0x0e, 0xd9, 0x0e, 0xcb, 0x0e, 0xbd, 0x0e, 0xae, 0x0e, 0x9f, 0x0e, 0x90, 0x0e, 0x81, - 0x0e, 0x71, 0x0e, 0x61, 0x0e, 0x51, 0x0e, 0x40, 0x0e, 0x2f, 0x0e, 0x1e, 0x0e, 0x0d, 0x0e, 0xfb, 0x0d, 0xe9, 0x0d, - 0xd7, 0x0d, 0xc4, 0x0d, 0xb2, 0x0d, 0x9f, 0x0d, 0x8b, 0x0d, 0x78, 0x0d, 0x64, 0x0d, 0x50, 0x0d, 0x3c, 0x0d, 0x28, - 0x0d, 0x13, 0x0d, 0xfe, 0x0c, 0xe9, 0x0c, 0xd4, 0x0c, 0xbf, 0x0c, 0xa9, 0x0c, 0x93, 0x0c, 0x7d, 0x0c, 0x67, 0x0c, - 0x50, 0x0c, 0x39, 0x0c, 0x23, 0x0c, 0x0c, 0x0c, 0xf4, 0x0b, 0xdd, 0x0b, 0xc5, 0x0b, 0xae, 0x0b, 0x96, 0x0b, 0x7e, - 0x0b, 0x66, 0x0b, 0x4d, 0x0b, 0x35, 0x0b, 0x1c, 0x0b, 0x03, 0x0b, 0xea, 0x0a, 0xd1, 0x0a, 0xb8, 0x0a, 0x9f, 0x0a, - 0x86, 0x0a, 0x6c, 0x0a, 0x53, 0x0a, 0x39, 0x0a, 0x1f, 0x0a, 0x05, 0x0a, 0xeb, 0x09, 0xd1, 0x09, 0xb7, 0x09, 0x9d, - 0x09, 0x82, 0x09, 0x68, 0x09, 0x4e, 0x09, 0x33, 0x09, 0x19, 0x09, 0xfe, 0x08, 0xe3, 0x08, 0xc9, 0x08, 0xae, 0x08, - 0x93, 0x08, 0x79, 0x08, 0x5e, 0x08, 0x43, 0x08, 0x28, 0x08, 0x0d, 0x08, 0xf3, 0x07, 0xd8, 0x07, 0xbd, 0x07, 0xa2, - 0x07, 0x87, 0x07, 0x6d, 0x07, 0x52, 0x07, 0x37, 0x07, 0x1d, 0x07, 0x02, 0x07, 0xe7, 0x06, 0xcd, 0x06, 0xb2, 0x06, - 0x98, 0x06, 0x7e, 0x06, 0x63, 0x06, 0x49, 0x06, 0x2f, 0x06, 0x15, 0x06, 0xfb, 0x05, 0xe1, 0x05, 0xc7, 0x05, 0xad, - 0x05, 0x94, 0x05, 0x7a, 0x05, 0x61, 0x05, 0x48, 0x05, 0x2f, 0x05, 0x16, 0x05, 0xfd, 0x04, 0xe4, 0x04, 0xcb, 0x04, - 0xb3, 0x04, 0x9a, 0x04, 0x82, 0x04, 0x6a, 0x04, 0x52, 0x04, 0x3b, 0x04, 0x23, 0x04, 0x0c, 0x04, 0xf4, 0x03, 0xdd, - 0x03, 0xc7, 0x03, 0xb0, 0x03, 0x99, 0x03, 0x83, 0x03, 0x6d, 0x03, 0x57, 0x03, 0x41, 0x03, 0x2c, 0x03, 0x17, 0x03, - 0x02, 0x03, 0xed, 0x02, 0xd8, 0x02, 0xc4, 0x02, 0xb0, 0x02, 0x9c, 0x02, 0x88, 0x02, 0x75, 0x02, 0x61, 0x02, 0x4e, - 0x02, 0x3c, 0x02, 0x29, 0x02, 0x17, 0x02, 0x05, 0x02, 0xf3, 0x01, 0xe2, 0x01, 0xd1, 0x01, 0xc0, 0x01, 0xaf, 0x01, - 0x9f, 0x01, 0x8f, 0x01, 0x7f, 0x01, 0x70, 0x01, 0x61, 0x01, 0x52, 0x01, 0x43, 0x01, 0x35, 0x01, 0x27, 0x01, 0x19, - 0x01, 0x0c, 0x01, 0xff, 0x00, 0xf2, 0x00, 0xe5, 0x00, 0xd9, 0x00, 0xcd, 0x00, 0xc2, 0x00, 0xb7, 0x00, 0xac, 0x00, - 0xa1, 0x00, 0x97, 0x00, 0x8d, 0x00, 0x83, 0x00, 0x7a, 0x00, 0x71, 0x00, 0x68, 0x00, 0x60, 0x00, 0x58, 0x00, 0x51, - 0x00, 0x49, 0x00, 0x42, 0x00, 0x3c, 0x00, 0x35, 0x00, 0x30, 0x00, 0x2a, 0x00, 0x25, 0x00, 0x20, 0x00, 0x1b, 0x00, - 0x17, 0x00, 0x13, 0x00, 0x10, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x07, 0x00, 0x05, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xee, 0xff, 0xff, 0x38, 0xee, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x4d, 0x4c, - 0x49, 0x52, 0x20, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x74, 0x65, 0x64, 0x2e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x04, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0xf4, 0x05, 0x00, 0x00, 0xf8, 0x05, 0x00, - 0x00, 0xfc, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, - 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x68, 0x05, 0x00, 0x00, 0x24, 0x05, 0x00, 0x00, 0xc8, 0x04, 0x00, 0x00, 0x70, - 0x04, 0x00, 0x00, 0x4c, 0x04, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0xc8, 0x03, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x00, - 0x4c, 0x03, 0x00, 0x00, 0x14, 0x03, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, 0x6c, 0x01, 0x00, - 0x00, 0x48, 0x01, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x78, 0x00, - 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xf6, 0xfa, 0xff, 0xff, 0x0c, - 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x16, 0xfb, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x3a, 0xfb, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, - 0x0e, 0x00, 0x00, 0x00, 0xa6, 0xfc, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x10, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x68, 0xef, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x27, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xd6, 0xfc, 0xff, 0xff, 0x14, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1d, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, - 0x98, 0xef, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, - 0x00, 0x12, 0x00, 0x00, 0x00, 0x06, 0xfd, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x10, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0xc8, 0xef, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x25, - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x36, 0xfd, 0xff, 0xff, - 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, - 0x00, 0xf8, 0xef, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, - 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x1e, 0xfc, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, - 0x84, 0xfc, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, - 0x00, 0x30, 0x00, 0x00, 0x00, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x63, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x00, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, - 0x65, 0x00, 0x02, 0x24, 0x0f, 0x02, 0x01, 0x02, 0x03, 0x40, 0x04, 0x04, 0x04, 0x24, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x22, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xdc, 0xfc, 0xff, 0xff, 0x10, 0x00, 0x00, - 0x00, 0x24, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x73, 0x6e, - 0x72, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x00, 0x01, 0x0b, 0x01, 0x01, 0x01, 0x06, 0x04, 0x02, 0x24, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x20, 0xfd, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, - 0x00, 0x0a, 0x00, 0x00, 0x00, 0xd2, 0x00, 0x00, 0x00, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x5f, - 0x6f, 0x6e, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x5f, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, - 0x00, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, - 0x67, 0x00, 0x63, 0x6c, 0x61, 0x6d, 0x70, 0x69, 0x6e, 0x67, 0x00, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x00, 0x6e, 0x75, 0x6d, 0x5f, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x00, 0x6f, 0x6e, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x75, 0x73, 0x5f, 0x73, 0x6d, - 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x00, 0x73, 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x00, 0x73, - 0x6d, 0x6f, 0x6f, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x00, 0x73, 0x70, 0x65, 0x63, 0x74, - 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x69, 0x74, - 0x73, 0x00, 0x09, 0xa5, 0x88, 0x75, 0x6d, 0x59, 0x4d, 0x3a, 0x31, 0x23, 0x09, 0x00, 0x01, 0x00, 0x09, 0x00, 0x29, - 0x3c, 0xd7, 0x03, 0x00, 0x00, 0x33, 0x03, 0x28, 0x00, 0x67, 0x3e, 0x99, 0x01, 0x0a, 0x00, 0x0e, 0x00, 0x05, 0x05, - 0x69, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x1b, 0x25, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, - 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x20, 0xfe, 0xff, 0xff, 0x10, 0x00, - 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x1d, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x54, 0xfe, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, - 0x00, 0x2c, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x6e, 0x75, 0x6d, 0x5f, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x00, 0x01, 0x0e, 0x01, 0x01, 0x01, 0x28, 0x04, 0x02, 0x24, 0x01, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, - 0x0c, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x62, 0xfe, 0xff, - 0xff, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0xca, 0xff, 0xff, 0xff, 0x14, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x0a, 0x10, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x8c, 0xf2, 0xff, 0xff, - 0x01, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, - 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x18, 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x0b, 0x00, - 0x04, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0xd0, 0xf2, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, - 0x00, 0xfe, 0xfe, 0xff, 0xff, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x64, 0xff, 0xff, 0xff, 0x10, - 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, - 0x65, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x00, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x00, 0x02, 0x17, 0x0e, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0xf1, 0x00, 0x05, 0x00, 0x05, 0x05, - 0x06, 0x25, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, - 0x00, 0x00, 0x00, 0xb8, 0xff, 0xff, 0xff, 0x10, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x54, 0x00, 0x66, 0x66, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x00, 0x02, 0x0e, 0x0d, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x07, 0x00, 0x00, 0x02, 0x05, 0x05, 0x06, 0x25, - 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x14, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x00, - 0x10, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x24, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, - 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, - 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, - 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x73, - 0x68, 0x69, 0x66, 0x74, 0x00, 0x01, 0x07, 0x01, 0x01, 0x01, 0x0c, 0x04, 0x02, 0x24, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0xc4, 0x0a, - 0x00, 0x00, 0x74, 0x0a, 0x00, 0x00, 0x3c, 0x0a, 0x00, 0x00, 0x04, 0x0a, 0x00, 0x00, 0xd0, 0x09, 0x00, 0x00, 0x88, - 0x09, 0x00, 0x00, 0x40, 0x09, 0x00, 0x00, 0xfc, 0x08, 0x00, 0x00, 0xb8, 0x08, 0x00, 0x00, 0x6c, 0x08, 0x00, 0x00, - 0x20, 0x08, 0x00, 0x00, 0xd4, 0x07, 0x00, 0x00, 0x88, 0x07, 0x00, 0x00, 0x3c, 0x07, 0x00, 0x00, 0xf8, 0x06, 0x00, - 0x00, 0xb8, 0x06, 0x00, 0x00, 0x84, 0x06, 0x00, 0x00, 0x50, 0x06, 0x00, 0x00, 0x1c, 0x06, 0x00, 0x00, 0xd8, 0x05, - 0x00, 0x00, 0xa0, 0x05, 0x00, 0x00, 0x58, 0x05, 0x00, 0x00, 0x14, 0x05, 0x00, 0x00, 0xd8, 0x04, 0x00, 0x00, 0x98, - 0x04, 0x00, 0x00, 0x60, 0x04, 0x00, 0x00, 0x20, 0x04, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0xb0, 0x03, 0x00, 0x00, - 0x6c, 0x03, 0x00, 0x00, 0x1c, 0x03, 0x00, 0x00, 0xc4, 0x02, 0x00, 0x00, 0x68, 0x02, 0x00, 0x00, 0x2c, 0x02, 0x00, - 0x00, 0xe4, 0x01, 0x00, 0x00, 0xac, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x08, 0x01, - 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xfe, - 0xf5, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x09, 0x20, 0x00, 0x00, 0x00, 0x44, 0xf5, 0xff, 0xff, 0x11, 0x00, 0x00, 0x00, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x43, 0x61, 0x6c, 0x6c, 0x3a, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x3e, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x84, 0xf5, 0xff, 0xff, - 0x0d, 0x00, 0x00, 0x00, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x62, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x00, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x7a, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x00, 0xc0, - 0xf5, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x62, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x2f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, - 0x00, 0xbe, 0xf6, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x00, 0x04, 0xf6, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x61, - 0x64, 0x64, 0x5f, 0x31, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xf2, 0xf6, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x18, 0x00, 0x00, 0x00, 0x38, 0xf6, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, - 0x74, 0x65, 0x44, 0x69, 0x76, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x2a, 0xf7, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x10, 0x00, 0x00, 0x00, 0x70, 0xf6, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x61, 0x64, 0x64, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x28, 0x00, 0x00, 0x00, 0x5a, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00, 0x00, 0xa0, 0xf6, 0xff, 0xff, 0x03, - 0x00, 0x00, 0x00, 0x6d, 0x75, 0x6c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x8a, 0xf7, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x14, 0x00, 0x00, 0x00, 0xd0, 0xf6, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x43, 0x61, 0x73, 0x74, 0x5f, 0x32, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0xbe, 0xf7, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x24, 0x00, 0x00, 0x00, - 0x04, 0xf7, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6e, 0x6b, 0x5f, 0x6c, 0x6f, 0x67, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x02, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x22, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x18, 0x00, 0x00, 0x00, 0x48, 0xf7, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x63, 0x61, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, - 0x00, 0x3a, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x38, 0x00, 0x00, 0x00, 0x80, 0xf7, 0xff, 0xff, 0x28, 0x00, 0x00, 0x00, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6e, 0x6b, 0x5f, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x72, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x31, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x92, 0xf8, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x34, - 0x00, 0x00, 0x00, 0xd8, 0xf7, 0xff, 0xff, 0x27, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6e, 0x6b, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x74, 0x72, 0x61, 0x6c, - 0x5f, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0xe6, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x2c, 0x00, 0x00, 0x00, 0x2c, 0xf8, 0xff, 0xff, 0x1e, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6e, 0x6b, 0x5f, - 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, - 0x00, 0x00, 0x32, 0xf9, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x20, 0x00, 0x00, 0x00, 0x78, 0xf8, 0xff, 0xff, 0x12, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6e, 0x6b, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x72, 0xf9, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x14, 0x00, 0x00, 0x00, 0xb8, - 0xf8, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x43, 0x61, 0x73, 0x74, 0x5f, 0x31, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x00, 0x00, 0xa6, 0xf9, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x00, 0xec, 0xf8, 0xff, 0xff, 0x06, 0x00, - 0x00, 0x00, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0xda, - 0xf9, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1b, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x1c, 0x00, 0x00, 0x00, 0x20, 0xf9, 0xff, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x73, 0x74, 0x72, - 0x69, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xec, 0x00, - 0x00, 0x00, 0x16, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x1a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x00, 0x5c, 0xf9, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, - 0x43, 0x61, 0x73, 0x74, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x4a, 0xfa, 0xff, - 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x0f, 0x1c, 0x00, 0x00, 0x00, 0x90, 0xf9, 0xff, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x61, - 0x6c, 0x5f, 0x65, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, - 0x86, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x00, 0x00, 0x00, 0xcc, 0xf9, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x73, 0x69, - 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x72, 0x66, 0x66, 0x74, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0xbe, - 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x00, 0x04, 0xfa, 0xff, 0xff, 0x16, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, - 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x66, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x31, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfa, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, - 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x24, 0x00, 0x00, 0x00, 0x44, 0xfa, 0xff, 0xff, - 0x15, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x66, 0x74, 0x5f, 0x61, 0x75, 0x74, 0x6f, - 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x42, 0xfb, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x07, 0x14, 0x00, 0x00, 0x00, 0x88, 0xfa, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x68, - 0x61, 0x70, 0x65, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x76, 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, - 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x1c, 0x00, - 0x00, 0x00, 0xbc, 0xfa, 0xff, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x77, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, - 0xb6, 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x43, 0x6f, - 0x6e, 0x73, 0x74, 0x5f, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe6, 0xfb, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, - 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x00, - 0x2c, 0xfb, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x16, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x11, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x00, 0x5c, 0xfb, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x43, - 0x6f, 0x6e, 0x73, 0x74, 0x5f, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, - 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1c, 0x00, 0x00, - 0x00, 0x8c, 0xfb, 0xff, 0xff, 0x0d, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x68, 0x61, 0x70, 0x65, 0x2f, 0x73, 0x68, - 0x61, 0x70, 0x65, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x82, 0xfc, 0xff, 0xff, 0x00, - 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, - 0x24, 0x00, 0x00, 0x00, 0xc8, 0xfb, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x63, 0x6c, 0x69, 0x70, 0x5f, 0x62, 0x79, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2f, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x2f, 0x79, 0x00, 0x00, 0x00, - 0x00, 0x00, 0xc2, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0e, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x28, 0x00, 0x00, 0x00, 0x08, 0xfc, 0xff, 0xff, 0x18, 0x00, 0x00, 0x00, - 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6e, 0x6b, 0x2f, - 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x0a, 0xfd, - 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x07, 0x28, 0x00, 0x00, 0x00, 0x50, 0xfc, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, - 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6e, 0x6b, 0x2f, 0x43, 0x6f, 0x6e, 0x73, - 0x74, 0x5f, 0x31, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x01, 0x00, 0x00, 0x52, 0xfd, 0xff, 0xff, 0x00, 0x00, - 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x28, - 0x00, 0x00, 0x00, 0x98, 0xfc, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, 0x6e, 0x6b, 0x2f, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x5f, 0x32, 0x00, - 0x00, 0x01, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x9a, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x28, 0x00, 0x00, 0x00, 0xe0, - 0xfc, 0xff, 0xff, 0x1a, 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x5f, 0x62, 0x61, 0x6e, 0x6b, 0x2f, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x5f, 0x33, 0x00, 0x00, 0x01, 0x00, 0x00, - 0x00, 0x29, 0x00, 0x00, 0x00, 0xe2, 0xfd, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, - 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x28, 0x00, 0x00, 0x00, 0x28, 0xfd, 0xff, 0xff, 0x1a, - 0x00, 0x00, 0x00, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x61, - 0x6e, 0x6b, 0x2f, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x5f, 0x34, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, - 0x00, 0x2a, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x09, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x20, 0x00, 0x00, 0x00, 0x70, 0xfd, 0xff, 0xff, 0x11, 0x00, 0x00, 0x00, 0x73, - 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x5f, 0x70, 0x63, 0x61, 0x6e, 0x2f, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x7d, 0x00, 0x00, 0x00, 0x6a, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, - 0x00, 0x14, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00, 0xb0, 0xfd, - 0xff, 0xff, 0x13, 0x00, 0x00, 0x00, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, - 0x2f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xaa, 0xfe, 0xff, 0xff, - 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x24, 0x00, 0x00, 0x00, 0xf0, 0xfd, 0xff, 0xff, 0x15, 0x00, 0x00, 0x00, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, - 0x64, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x31, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xee, 0xfe, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, - 0x14, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x24, 0x00, 0x00, 0x00, 0x34, 0xfe, 0xff, - 0xff, 0x15, 0x00, 0x00, 0x00, 0x73, 0x74, 0x72, 0x69, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x2f, - 0x73, 0x74, 0x61, 0x63, 0x6b, 0x5f, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x32, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x00, 0x78, 0xfe, 0xff, 0xff, 0x06, 0x00, 0x00, 0x00, 0x43, 0x61, 0x73, - 0x74, 0x5f, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, - 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x00, 0xa8, - 0xfe, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x05, 0x00, 0x00, 0x00, 0x96, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x14, 0x00, 0x00, 0x00, 0xdc, 0xfe, 0xff, 0xff, 0x07, 0x00, - 0x00, 0x00, 0x7a, 0x65, 0x72, 0x6f, 0x73, 0x5f, 0x31, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0xca, - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x14, 0x00, 0x00, 0x00, 0x10, 0xff, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, - 0x73, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x1c, 0x00, - 0x18, 0x00, 0x17, 0x00, 0x10, 0x00, 0x0c, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x16, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x07, 0x2c, 0x00, 0x00, 0x00, 0x5c, 0xff, 0xff, 0xff, 0x1d, 0x00, 0x00, 0x00, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, - 0x66, 0x72, 0x61, 0x6d, 0x65, 0x3a, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xe0, - 0x01, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x1c, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xc8, 0x01, 0x00, 0x00, - 0xa4, 0x01, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x68, 0x01, 0x00, 0x00, 0x4c, 0x01, 0x00, 0x00, 0x3c, 0x01, 0x00, - 0x00, 0x10, 0x01, 0x00, 0x00, 0xdc, 0x00, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x50, 0x00, - 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x50, 0xfe, 0xff, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x5c, 0xfe, 0xff, 0xff, - 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x68, 0xfe, 0xff, 0xff, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2a, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7c, 0xfe, 0xff, 0xff, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x12, 0x70, 0xfe, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x13, - 0x00, 0x00, 0x00, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x61, 0x6e, 0x6b, - 0x4c, 0x6f, 0x67, 0x00, 0x98, 0xfe, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x0a, 0x00, 0x00, 0x00, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x50, 0x43, 0x41, 0x4e, 0x00, 0x00, 0xb8, 0xfe, - 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x23, 0x00, 0x00, 0x00, 0x53, - 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x61, 0x6e, 0x6b, 0x53, 0x70, 0x65, 0x63, - 0x74, 0x72, 0x61, 0x6c, 0x53, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0xf0, 0xfe, 0xff, - 0xff, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1a, 0x00, 0x00, 0x00, 0x53, 0x69, - 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x42, 0x61, 0x6e, 0x6b, 0x53, 0x71, 0x75, 0x61, 0x72, - 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x00, 0x00, 0x20, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x00, 0x00, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x42, 0x61, 0x6e, 0x6b, 0x00, 0x00, 0x00, 0x00, 0x60, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x02, 0x6c, 0xff, 0xff, 0xff, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x0c, 0x00, 0x10, 0x00, 0x0f, - 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x35, 0x7c, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20, 0x0c, 0x00, 0x00, 0x00, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x45, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x00, 0x00, - 0x00, 0x00, 0xa0, 0xff, 0xff, 0xff, 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0a, - 0x00, 0x00, 0x00, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x52, 0x66, 0x66, 0x74, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x12, 0x00, 0x00, 0x00, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x6c, 0x46, 0x66, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x00, 0x00, 0x0c, 0x00, - 0x0c, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x16, 0x0c, 0x00, 0x10, 0x00, 0x0f, 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0c, 0x00, 0x00, 0x00, - 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0c, 0x00, 0x00, 0x00, 0x53, 0x69, 0x67, - 0x6e, 0x61, 0x6c, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x00, 0x00, 0x00, 0x00}; - -} // namespace micro_wake_word -} // namespace esphome - -#endif // USE_ESP_IDF diff --git a/esphome/components/micro_wake_word/micro_wake_word.cpp b/esphome/components/micro_wake_word/micro_wake_word.cpp index 5a89708127..b58c7ec434 100644 --- a/esphome/components/micro_wake_word/micro_wake_word.cpp +++ b/esphome/components/micro_wake_word/micro_wake_word.cpp @@ -1,12 +1,5 @@ #include "micro_wake_word.h" - -/** - * This is a workaround until we can figure out a way to get - * the tflite-micro idf component code available in CI - * - * */ -// -#ifndef CLANG_TIDY +#include "streaming_model.h" #ifdef USE_ESP_IDF @@ -14,13 +7,13 @@ #include "esphome/core/helpers.h" #include "esphome/core/log.h" -#include "audio_preprocessor_int8_model_data.h" +#include +#include #include #include #include -#include #include namespace esphome { @@ -29,9 +22,9 @@ namespace micro_wake_word { static const char *const TAG = "micro_wake_word"; static const size_t SAMPLE_RATE_HZ = 16000; // 16 kHz -static const size_t BUFFER_LENGTH = 500; // 0.5 seconds +static const size_t BUFFER_LENGTH = 64; // 0.064 seconds static const size_t BUFFER_SIZE = SAMPLE_RATE_HZ / 1000 * BUFFER_LENGTH; -static const size_t INPUT_BUFFER_SIZE = 32 * SAMPLE_RATE_HZ / 1000; // 32ms * 16kHz / 1000ms +static const size_t INPUT_BUFFER_SIZE = 16 * SAMPLE_RATE_HZ / 1000; // 16ms * 16kHz / 1000ms float MicroWakeWord::get_setup_priority() const { return setup_priority::AFTER_CONNECTION; } @@ -56,58 +49,56 @@ static const LogString *micro_wake_word_state_to_string(State state) { void MicroWakeWord::dump_config() { ESP_LOGCONFIG(TAG, "microWakeWord:"); - ESP_LOGCONFIG(TAG, " Wake Word: %s", this->get_wake_word().c_str()); - ESP_LOGCONFIG(TAG, " Probability cutoff: %.3f", this->probability_cutoff_); - ESP_LOGCONFIG(TAG, " Sliding window size: %d", this->sliding_window_average_size_); + ESP_LOGCONFIG(TAG, " models:"); + for (auto &model : this->wake_word_models_) { + model.log_model_config(); + } +#ifdef USE_MICRO_WAKE_WORD_VAD + this->vad_model_->log_model_config(); +#endif } void MicroWakeWord::setup() { ESP_LOGCONFIG(TAG, "Setting up microWakeWord..."); - if (!this->initialize_models()) { - ESP_LOGE(TAG, "Failed to initialize models"); - this->mark_failed(); - return; - } - - ExternalRAMAllocator allocator(ExternalRAMAllocator::ALLOW_FAILURE); - this->input_buffer_ = allocator.allocate(INPUT_BUFFER_SIZE * sizeof(int16_t)); - if (this->input_buffer_ == nullptr) { - ESP_LOGW(TAG, "Could not allocate input buffer"); - this->mark_failed(); - return; - } - - this->ring_buffer_ = RingBuffer::create(BUFFER_SIZE * sizeof(int16_t)); - if (this->ring_buffer_ == nullptr) { - ESP_LOGW(TAG, "Could not allocate ring buffer"); + if (!this->register_streaming_ops_(this->streaming_op_resolver_)) { this->mark_failed(); return; } ESP_LOGCONFIG(TAG, "Micro Wake Word initialized"); + + this->frontend_config_.window.size_ms = FEATURE_DURATION_MS; + this->frontend_config_.window.step_size_ms = this->features_step_size_; + this->frontend_config_.filterbank.num_channels = PREPROCESSOR_FEATURE_SIZE; + this->frontend_config_.filterbank.lower_band_limit = 125.0; + this->frontend_config_.filterbank.upper_band_limit = 7500.0; + this->frontend_config_.noise_reduction.smoothing_bits = 10; + this->frontend_config_.noise_reduction.even_smoothing = 0.025; + this->frontend_config_.noise_reduction.odd_smoothing = 0.06; + this->frontend_config_.noise_reduction.min_signal_remaining = 0.05; + this->frontend_config_.pcan_gain_control.enable_pcan = 1; + this->frontend_config_.pcan_gain_control.strength = 0.95; + this->frontend_config_.pcan_gain_control.offset = 80.0; + this->frontend_config_.pcan_gain_control.gain_bits = 21; + this->frontend_config_.log_scale.enable_log = 1; + this->frontend_config_.log_scale.scale_shift = 6; } -int MicroWakeWord::read_microphone_() { - size_t bytes_read = this->microphone_->read(this->input_buffer_, INPUT_BUFFER_SIZE * sizeof(int16_t)); - if (bytes_read == 0) { - return 0; - } - - size_t bytes_free = this->ring_buffer_->free(); - - if (bytes_free < bytes_read) { - ESP_LOGW(TAG, - "Not enough free bytes in ring buffer to store incoming audio data (free bytes=%d, incoming bytes=%d). " - "Resetting the ring buffer. Wake word detection accuracy will be reduced.", - bytes_free, bytes_read); - - this->ring_buffer_->reset(); - } - - return this->ring_buffer_->write((void *) this->input_buffer_, bytes_read); +void MicroWakeWord::add_wake_word_model(const uint8_t *model_start, float probability_cutoff, + size_t sliding_window_average_size, const std::string &wake_word, + size_t tensor_arena_size) { + this->wake_word_models_.emplace_back(model_start, probability_cutoff, sliding_window_average_size, wake_word, + tensor_arena_size); } +#ifdef USE_MICRO_WAKE_WORD_VAD +void MicroWakeWord::add_vad_model(const uint8_t *model_start, float probability_cutoff, size_t sliding_window_size, + size_t tensor_arena_size) { + this->vad_model_ = make_unique(model_start, probability_cutoff, sliding_window_size, tensor_arena_size); +} +#endif + void MicroWakeWord::loop() { switch (this->state_) { case State::IDLE: @@ -124,9 +115,12 @@ void MicroWakeWord::loop() { } break; case State::DETECTING_WAKE_WORD: - this->read_microphone_(); - if (this->detect_wake_word_()) { - ESP_LOGD(TAG, "Wake Word Detected"); + while (!this->has_enough_samples_()) { + this->read_microphone_(); + } + this->update_model_probabilities_(); + if (this->detect_wake_words_()) { + ESP_LOGD(TAG, "Wake Word '%s' Detected", (this->detected_wake_word_).c_str()); this->detected_ = true; this->set_state_(State::STOP_MICROPHONE); } @@ -136,13 +130,16 @@ void MicroWakeWord::loop() { this->microphone_->stop(); this->set_state_(State::STOPPING_MICROPHONE); this->high_freq_.stop(); + this->unload_models_(); + this->deallocate_buffers_(); break; case State::STOPPING_MICROPHONE: if (this->microphone_->is_stopped()) { this->set_state_(State::IDLE); if (this->detected_) { + this->wake_word_detected_trigger_->trigger(this->detected_wake_word_); this->detected_ = false; - this->wake_word_detected_trigger_->trigger(this->wake_word_); + this->detected_wake_word_ = ""; } } break; @@ -150,14 +147,34 @@ void MicroWakeWord::loop() { } void MicroWakeWord::start() { + if (!this->is_ready()) { + ESP_LOGW(TAG, "Wake word detection can't start as the component hasn't been setup yet"); + return; + } + if (this->is_failed()) { ESP_LOGW(TAG, "Wake word component is marked as failed. Please check setup logs"); return; } + + if (!this->load_models_() || !this->allocate_buffers_()) { + ESP_LOGE(TAG, "Failed to load the wake word model(s) or allocate buffers"); + this->status_set_error(); + } else { + this->status_clear_error(); + } + + if (this->status_has_error()) { + ESP_LOGW(TAG, "Wake word component has an error. Please check logs"); + return; + } + if (this->state_ != State::IDLE) { ESP_LOGW(TAG, "Wake word is already running"); return; } + + this->reset_states_(); this->set_state_(State::START_MICROPHONE); } @@ -179,289 +196,218 @@ void MicroWakeWord::set_state_(State state) { this->state_ = state; } -bool MicroWakeWord::initialize_models() { - ExternalRAMAllocator arena_allocator(ExternalRAMAllocator::ALLOW_FAILURE); - ExternalRAMAllocator features_allocator(ExternalRAMAllocator::ALLOW_FAILURE); +size_t MicroWakeWord::read_microphone_() { + size_t bytes_read = this->microphone_->read(this->input_buffer_, INPUT_BUFFER_SIZE * sizeof(int16_t)); + if (bytes_read == 0) { + return 0; + } + + size_t bytes_free = this->ring_buffer_->free(); + + if (bytes_free < bytes_read) { + ESP_LOGW(TAG, + "Not enough free bytes in ring buffer to store incoming audio data (free bytes=%d, incoming bytes=%d). " + "Resetting the ring buffer. Wake word detection accuracy will be reduced.", + bytes_free, bytes_read); + + this->ring_buffer_->reset(); + } + + return this->ring_buffer_->write((void *) this->input_buffer_, bytes_read); +} + +bool MicroWakeWord::allocate_buffers_() { ExternalRAMAllocator audio_samples_allocator(ExternalRAMAllocator::ALLOW_FAILURE); - this->streaming_tensor_arena_ = arena_allocator.allocate(STREAMING_MODEL_ARENA_SIZE); - if (this->streaming_tensor_arena_ == nullptr) { - ESP_LOGE(TAG, "Could not allocate the streaming model's tensor arena."); - return false; + if (this->input_buffer_ == nullptr) { + this->input_buffer_ = audio_samples_allocator.allocate(INPUT_BUFFER_SIZE * sizeof(int16_t)); + if (this->input_buffer_ == nullptr) { + ESP_LOGE(TAG, "Could not allocate input buffer"); + return false; + } } - this->streaming_var_arena_ = arena_allocator.allocate(STREAMING_MODEL_VARIABLE_ARENA_SIZE); - if (this->streaming_var_arena_ == nullptr) { - ESP_LOGE(TAG, "Could not allocate the streaming model variable's tensor arena."); - return false; - } - - this->preprocessor_tensor_arena_ = arena_allocator.allocate(PREPROCESSOR_ARENA_SIZE); - if (this->preprocessor_tensor_arena_ == nullptr) { - ESP_LOGE(TAG, "Could not allocate the audio preprocessor model's tensor arena."); - return false; - } - - this->new_features_data_ = features_allocator.allocate(PREPROCESSOR_FEATURE_SIZE); - if (this->new_features_data_ == nullptr) { - ESP_LOGE(TAG, "Could not allocate the audio features buffer."); - return false; - } - - this->preprocessor_audio_buffer_ = audio_samples_allocator.allocate(SAMPLE_DURATION_COUNT); if (this->preprocessor_audio_buffer_ == nullptr) { - ESP_LOGE(TAG, "Could not allocate the audio preprocessor's buffer."); - return false; + this->preprocessor_audio_buffer_ = audio_samples_allocator.allocate(this->new_samples_to_get_()); + if (this->preprocessor_audio_buffer_ == nullptr) { + ESP_LOGE(TAG, "Could not allocate the audio preprocessor's buffer."); + return false; + } } - this->preprocessor_model_ = tflite::GetModel(G_AUDIO_PREPROCESSOR_INT8_TFLITE); - if (this->preprocessor_model_->version() != TFLITE_SCHEMA_VERSION) { - ESP_LOGE(TAG, "Wake word's audio preprocessor model's schema is not supported"); - return false; - } - - this->streaming_model_ = tflite::GetModel(this->model_start_); - if (this->streaming_model_->version() != TFLITE_SCHEMA_VERSION) { - ESP_LOGE(TAG, "Wake word's streaming model's schema is not supported"); - return false; - } - - static tflite::MicroMutableOpResolver<18> preprocessor_op_resolver; - static tflite::MicroMutableOpResolver<17> streaming_op_resolver; - - if (!this->register_preprocessor_ops_(preprocessor_op_resolver)) - return false; - if (!this->register_streaming_ops_(streaming_op_resolver)) - return false; - - tflite::MicroAllocator *ma = - tflite::MicroAllocator::Create(this->streaming_var_arena_, STREAMING_MODEL_VARIABLE_ARENA_SIZE); - this->mrv_ = tflite::MicroResourceVariables::Create(ma, 15); - - static tflite::MicroInterpreter static_preprocessor_interpreter( - this->preprocessor_model_, preprocessor_op_resolver, this->preprocessor_tensor_arena_, PREPROCESSOR_ARENA_SIZE); - - static tflite::MicroInterpreter static_streaming_interpreter(this->streaming_model_, streaming_op_resolver, - this->streaming_tensor_arena_, - STREAMING_MODEL_ARENA_SIZE, this->mrv_); - - this->preprocessor_interperter_ = &static_preprocessor_interpreter; - this->streaming_interpreter_ = &static_streaming_interpreter; - - // Allocate tensors for each models. - if (this->preprocessor_interperter_->AllocateTensors() != kTfLiteOk) { - ESP_LOGE(TAG, "Failed to allocate tensors for the audio preprocessor"); - return false; - } - if (this->streaming_interpreter_->AllocateTensors() != kTfLiteOk) { - ESP_LOGE(TAG, "Failed to allocate tensors for the streaming model"); - return false; - } - - // Verify input tensor matches expected values - TfLiteTensor *input = this->streaming_interpreter_->input(0); - if ((input->dims->size != 3) || (input->dims->data[0] != 1) || (input->dims->data[0] != 1) || - (input->dims->data[1] != 1) || (input->dims->data[2] != PREPROCESSOR_FEATURE_SIZE)) { - ESP_LOGE(TAG, "Wake word detection model tensor input dimensions is not 1x1x%u", input->dims->data[2]); - return false; - } - - if (input->type != kTfLiteInt8) { - ESP_LOGE(TAG, "Wake word detection model tensor input is not int8."); - return false; - } - - // Verify output tensor matches expected values - TfLiteTensor *output = this->streaming_interpreter_->output(0); - if ((output->dims->size != 2) || (output->dims->data[0] != 1) || (output->dims->data[1] != 1)) { - ESP_LOGE(TAG, "Wake word detection model tensor output dimensions is not 1x1."); - } - - if (output->type != kTfLiteUInt8) { - ESP_LOGE(TAG, "Wake word detection model tensor input is not uint8."); - return false; - } - - this->recent_streaming_probabilities_.resize(this->sliding_window_average_size_, 0.0); - - return true; -} - -bool MicroWakeWord::update_features_() { - // Retrieve strided audio samples - int16_t *audio_samples = nullptr; - if (!this->stride_audio_samples_(&audio_samples)) { - return false; - } - - // Compute the features for the newest audio samples - if (!this->generate_single_feature_(audio_samples, SAMPLE_DURATION_COUNT, this->new_features_data_)) { - return false; + if (this->ring_buffer_ == nullptr) { + this->ring_buffer_ = RingBuffer::create(BUFFER_SIZE * sizeof(int16_t)); + if (this->ring_buffer_ == nullptr) { + ESP_LOGE(TAG, "Could not allocate ring buffer"); + return false; + } } return true; } -float MicroWakeWord::perform_streaming_inference_() { - TfLiteTensor *input = this->streaming_interpreter_->input(0); - - size_t bytes_to_copy = input->bytes; - - memcpy((void *) (tflite::GetTensorData(input)), (const void *) (this->new_features_data_), bytes_to_copy); - - uint32_t prior_invoke = millis(); - - TfLiteStatus invoke_status = this->streaming_interpreter_->Invoke(); - if (invoke_status != kTfLiteOk) { - ESP_LOGW(TAG, "Streaming Interpreter Invoke failed"); - return false; - } - - ESP_LOGV(TAG, "Streaming Inference Latency=%" PRIu32 " ms", (millis() - prior_invoke)); - - TfLiteTensor *output = this->streaming_interpreter_->output(0); - - return static_cast(output->data.uint8[0]) / 255.0; +void MicroWakeWord::deallocate_buffers_() { + ExternalRAMAllocator audio_samples_allocator(ExternalRAMAllocator::ALLOW_FAILURE); + audio_samples_allocator.deallocate(this->input_buffer_, INPUT_BUFFER_SIZE * sizeof(int16_t)); + this->input_buffer_ = nullptr; + audio_samples_allocator.deallocate(this->preprocessor_audio_buffer_, this->new_samples_to_get_()); + this->preprocessor_audio_buffer_ = nullptr; } -bool MicroWakeWord::detect_wake_word_() { - // Preprocess the newest audio samples into features - if (!this->update_features_()) { +bool MicroWakeWord::load_models_() { + // Setup preprocesor feature generator + if (!FrontendPopulateState(&this->frontend_config_, &this->frontend_state_, AUDIO_SAMPLE_FREQUENCY)) { + ESP_LOGD(TAG, "Failed to populate frontend state"); + FrontendFreeStateContents(&this->frontend_state_); return false; } - // Perform inference - float streaming_prob = this->perform_streaming_inference_(); + // Setup streaming models + for (auto &model : this->wake_word_models_) { + if (!model.load_model(this->streaming_op_resolver_)) { + ESP_LOGE(TAG, "Failed to initialize a wake word model."); + return false; + } + } +#ifdef USE_MICRO_WAKE_WORD_VAD + if (!this->vad_model_->load_model(this->streaming_op_resolver_)) { + ESP_LOGE(TAG, "Failed to initialize VAD model."); + return false; + } +#endif - // Add the most recent probability to the sliding window - this->recent_streaming_probabilities_[this->last_n_index_] = streaming_prob; - ++this->last_n_index_; - if (this->last_n_index_ == this->sliding_window_average_size_) - this->last_n_index_ = 0; + return true; +} - float sum = 0.0; - for (auto &prob : this->recent_streaming_probabilities_) { - sum += prob; +void MicroWakeWord::unload_models_() { + FrontendFreeStateContents(&this->frontend_state_); + + for (auto &model : this->wake_word_models_) { + model.unload_model(); + } +#ifdef USE_MICRO_WAKE_WORD_VAD + this->vad_model_->unload_model(); +#endif +} + +void MicroWakeWord::update_model_probabilities_() { + int8_t audio_features[PREPROCESSOR_FEATURE_SIZE]; + + if (!this->generate_features_for_window_(audio_features)) { + return; } - float sliding_window_average = sum / static_cast(this->sliding_window_average_size_); - - // Ensure we have enough samples since the last positive detection + // Increase the counter since the last positive detection this->ignore_windows_ = std::min(this->ignore_windows_ + 1, 0); + + for (auto &model : this->wake_word_models_) { + // Perform inference + model.perform_streaming_inference(audio_features); + } +#ifdef USE_MICRO_WAKE_WORD_VAD + this->vad_model_->perform_streaming_inference(audio_features); +#endif +} + +bool MicroWakeWord::detect_wake_words_() { + // Verify we have processed samples since the last positive detection if (this->ignore_windows_ < 0) { return false; } - // Detect the wake word if the sliding window average is above the cutoff - if (sliding_window_average > this->probability_cutoff_) { - this->ignore_windows_ = -MIN_SLICES_BEFORE_DETECTION; - for (auto &prob : this->recent_streaming_probabilities_) { - prob = 0; - } +#ifdef USE_MICRO_WAKE_WORD_VAD + bool vad_state = this->vad_model_->determine_detected(); +#endif - ESP_LOGD(TAG, "Wake word sliding average probability is %.3f and most recent probability is %.3f", - sliding_window_average, streaming_prob); - return true; + for (auto &model : this->wake_word_models_) { + if (model.determine_detected()) { +#ifdef USE_MICRO_WAKE_WORD_VAD + if (vad_state) { +#endif + this->detected_wake_word_ = model.get_wake_word(); + return true; +#ifdef USE_MICRO_WAKE_WORD_VAD + } else { + ESP_LOGD(TAG, "Wake word model predicts %s, but VAD model doesn't.", model.get_wake_word().c_str()); + } +#endif + } } return false; } -void MicroWakeWord::set_sliding_window_average_size(size_t size) { - this->sliding_window_average_size_ = size; - this->recent_streaming_probabilities_.resize(this->sliding_window_average_size_, 0.0); +bool MicroWakeWord::has_enough_samples_() { + return this->ring_buffer_->available() >= + (this->features_step_size_ * (AUDIO_SAMPLE_FREQUENCY / 1000)) * sizeof(int16_t); } -bool MicroWakeWord::slice_available_() { - size_t available = this->ring_buffer_->available(); - - return available > (NEW_SAMPLES_TO_GET * sizeof(int16_t)); -} - -bool MicroWakeWord::stride_audio_samples_(int16_t **audio_samples) { - if (!this->slice_available_()) { +bool MicroWakeWord::generate_features_for_window_(int8_t features[PREPROCESSOR_FEATURE_SIZE]) { + // Ensure we have enough new audio samples in the ring buffer for a full window + if (!this->has_enough_samples_()) { return false; } - // Copy the last 320 bytes (160 samples over 10 ms) from the audio buffer to the start of the audio buffer - memcpy((void *) (this->preprocessor_audio_buffer_), (void *) (this->preprocessor_audio_buffer_ + NEW_SAMPLES_TO_GET), - HISTORY_SAMPLES_TO_KEEP * sizeof(int16_t)); - - // Copy 640 bytes (320 samples over 20 ms) from the ring buffer into the audio buffer offset 320 bytes (160 samples - // over 10 ms) - size_t bytes_read = this->ring_buffer_->read((void *) (this->preprocessor_audio_buffer_ + HISTORY_SAMPLES_TO_KEEP), - NEW_SAMPLES_TO_GET * sizeof(int16_t), pdMS_TO_TICKS(200)); + size_t bytes_read = this->ring_buffer_->read((void *) (this->preprocessor_audio_buffer_), + this->new_samples_to_get_() * sizeof(int16_t), pdMS_TO_TICKS(200)); if (bytes_read == 0) { ESP_LOGE(TAG, "Could not read data from Ring Buffer"); - } else if (bytes_read < NEW_SAMPLES_TO_GET * sizeof(int16_t)) { + } else if (bytes_read < this->new_samples_to_get_() * sizeof(int16_t)) { ESP_LOGD(TAG, "Partial Read of Data by Model"); ESP_LOGD(TAG, "Could only read %d bytes when required %d bytes ", bytes_read, - (int) (NEW_SAMPLES_TO_GET * sizeof(int16_t))); + (int) (this->new_samples_to_get_() * sizeof(int16_t))); return false; } - *audio_samples = this->preprocessor_audio_buffer_; - return true; -} + size_t num_samples_read; + struct FrontendOutput frontend_output = FrontendProcessSamples( + &this->frontend_state_, this->preprocessor_audio_buffer_, this->new_samples_to_get_(), &num_samples_read); -bool MicroWakeWord::generate_single_feature_(const int16_t *audio_data, const int audio_data_size, - int8_t feature_output[PREPROCESSOR_FEATURE_SIZE]) { - TfLiteTensor *input = this->preprocessor_interperter_->input(0); - TfLiteTensor *output = this->preprocessor_interperter_->output(0); - std::copy_n(audio_data, audio_data_size, tflite::GetTensorData(input)); - - if (this->preprocessor_interperter_->Invoke() != kTfLiteOk) { - ESP_LOGE(TAG, "Failed to preprocess audio for local wake word."); - return false; + for (size_t i = 0; i < frontend_output.size; ++i) { + // These scaling values are set to match the TFLite audio frontend int8 output. + // The feature pipeline outputs 16-bit signed integers in roughly a 0 to 670 + // range. In training, these are then arbitrarily divided by 25.6 to get + // float values in the rough range of 0.0 to 26.0. This scaling is performed + // for historical reasons, to match up with the output of other feature + // generators. + // The process is then further complicated when we quantize the model. This + // means we have to scale the 0.0 to 26.0 real values to the -128 to 127 + // signed integer numbers. + // All this means that to get matching values from our integer feature + // output into the tensor input, we have to perform: + // input = (((feature / 25.6) / 26.0) * 256) - 128 + // To simplify this and perform it in 32-bit integer math, we rearrange to: + // input = (feature * 256) / (25.6 * 26.0) - 128 + constexpr int32_t value_scale = 256; + constexpr int32_t value_div = 666; // 666 = 25.6 * 26.0 after rounding + int32_t value = ((frontend_output.values[i] * value_scale) + (value_div / 2)) / value_div; + value -= 128; + if (value < -128) { + value = -128; + } + if (value > 127) { + value = 127; + } + features[i] = value; } - std::memcpy(feature_output, tflite::GetTensorData(output), PREPROCESSOR_FEATURE_SIZE * sizeof(int8_t)); return true; } -bool MicroWakeWord::register_preprocessor_ops_(tflite::MicroMutableOpResolver<18> &op_resolver) { - if (op_resolver.AddReshape() != kTfLiteOk) - return false; - if (op_resolver.AddCast() != kTfLiteOk) - return false; - if (op_resolver.AddStridedSlice() != kTfLiteOk) - return false; - if (op_resolver.AddConcatenation() != kTfLiteOk) - return false; - if (op_resolver.AddMul() != kTfLiteOk) - return false; - if (op_resolver.AddAdd() != kTfLiteOk) - return false; - if (op_resolver.AddDiv() != kTfLiteOk) - return false; - if (op_resolver.AddMinimum() != kTfLiteOk) - return false; - if (op_resolver.AddMaximum() != kTfLiteOk) - return false; - if (op_resolver.AddWindow() != kTfLiteOk) - return false; - if (op_resolver.AddFftAutoScale() != kTfLiteOk) - return false; - if (op_resolver.AddRfft() != kTfLiteOk) - return false; - if (op_resolver.AddEnergy() != kTfLiteOk) - return false; - if (op_resolver.AddFilterBank() != kTfLiteOk) - return false; - if (op_resolver.AddFilterBankSquareRoot() != kTfLiteOk) - return false; - if (op_resolver.AddFilterBankSpectralSubtraction() != kTfLiteOk) - return false; - if (op_resolver.AddPCAN() != kTfLiteOk) - return false; - if (op_resolver.AddFilterBankLog() != kTfLiteOk) - return false; - - return true; +void MicroWakeWord::reset_states_() { + ESP_LOGD(TAG, "Resetting buffers and probabilities"); + this->ring_buffer_->reset(); + this->ignore_windows_ = -MIN_SLICES_BEFORE_DETECTION; + for (auto &model : this->wake_word_models_) { + model.reset_probabilities(); + } +#ifdef USE_MICRO_WAKE_WORD_VAD + this->vad_model_->reset_probabilities(); +#endif } -bool MicroWakeWord::register_streaming_ops_(tflite::MicroMutableOpResolver<17> &op_resolver) { +bool MicroWakeWord::register_streaming_ops_(tflite::MicroMutableOpResolver<20> &op_resolver) { if (op_resolver.AddCallOnce() != kTfLiteOk) return false; if (op_resolver.AddVarHandle() != kTfLiteOk) @@ -496,6 +442,12 @@ bool MicroWakeWord::register_streaming_ops_(tflite::MicroMutableOpResolver<17> & return false; if (op_resolver.AddMaxPool2D() != kTfLiteOk) return false; + if (op_resolver.AddPad() != kTfLiteOk) + return false; + if (op_resolver.AddPack() != kTfLiteOk) + return false; + if (op_resolver.AddSplitV() != kTfLiteOk) + return false; return true; } @@ -504,5 +456,3 @@ bool MicroWakeWord::register_streaming_ops_(tflite::MicroMutableOpResolver<17> & } // namespace esphome #endif // USE_ESP_IDF - -#endif // CLANG_TIDY diff --git a/esphome/components/micro_wake_word/micro_wake_word.h b/esphome/components/micro_wake_word/micro_wake_word.h index 1d7c18d686..0c805b75fc 100644 --- a/esphome/components/micro_wake_word/micro_wake_word.h +++ b/esphome/components/micro_wake_word/micro_wake_word.h @@ -1,21 +1,18 @@ #pragma once -/** - * This is a workaround until we can figure out a way to get - * the tflite-micro idf component code available in CI - * - * */ -// -#ifndef CLANG_TIDY - #ifdef USE_ESP_IDF +#include "preprocessor_settings.h" +#include "streaming_model.h" + #include "esphome/core/automation.h" #include "esphome/core/component.h" #include "esphome/core/ring_buffer.h" #include "esphome/components/microphone/microphone.h" +#include + #include #include #include @@ -23,35 +20,6 @@ namespace esphome { namespace micro_wake_word { -// The following are dictated by the preprocessor model -// -// The number of features the audio preprocessor generates per slice -static const uint8_t PREPROCESSOR_FEATURE_SIZE = 40; -// How frequently the preprocessor generates a new set of features -static const uint8_t FEATURE_STRIDE_MS = 20; -// Duration of each slice used as input into the preprocessor -static const uint8_t FEATURE_DURATION_MS = 30; -// Audio sample frequency in hertz -static const uint16_t AUDIO_SAMPLE_FREQUENCY = 16000; -// The number of old audio samples that are saved to be part of the next feature window -static const uint16_t HISTORY_SAMPLES_TO_KEEP = - ((FEATURE_DURATION_MS - FEATURE_STRIDE_MS) * (AUDIO_SAMPLE_FREQUENCY / 1000)); -// The number of new audio samples to receive to be included with the next feature window -static const uint16_t NEW_SAMPLES_TO_GET = (FEATURE_STRIDE_MS * (AUDIO_SAMPLE_FREQUENCY / 1000)); -// The total number of audio samples included in the feature window -static const uint16_t SAMPLE_DURATION_COUNT = FEATURE_DURATION_MS * AUDIO_SAMPLE_FREQUENCY / 1000; -// Number of bytes in memory needed for the preprocessor arena -static const uint32_t PREPROCESSOR_ARENA_SIZE = 9528; - -// The following configure the streaming wake word model -// -// The number of audio slices to process before accepting a positive detection -static const uint8_t MIN_SLICES_BEFORE_DETECTION = 74; - -// Number of bytes in memory needed for the streaming wake word model -static const uint32_t STREAMING_MODEL_ARENA_SIZE = 64000; -static const uint32_t STREAMING_MODEL_VARIABLE_ARENA_SIZE = 1024; - enum State { IDLE, START_MICROPHONE, @@ -61,6 +29,9 @@ enum State { STOPPING_MICROPHONE, }; +// The number of audio slices to process before accepting a positive detection +static const uint8_t MIN_SLICES_BEFORE_DETECTION = 74; + class MicroWakeWord : public Component { public: void setup() override; @@ -73,28 +44,21 @@ class MicroWakeWord : public Component { bool is_running() const { return this->state_ != State::IDLE; } - bool initialize_models(); - - std::string get_wake_word() { return this->wake_word_; } - - // Increasing either of these will reduce the rate of false acceptances while increasing the false rejection rate - void set_probability_cutoff(float probability_cutoff) { this->probability_cutoff_ = probability_cutoff; } - void set_sliding_window_average_size(size_t size); + void set_features_step_size(uint8_t step_size) { this->features_step_size_ = step_size; } void set_microphone(microphone::Microphone *microphone) { this->microphone_ = microphone; } Trigger *get_wake_word_detected_trigger() const { return this->wake_word_detected_trigger_; } - void set_model_start(const uint8_t *model_start) { this->model_start_ = model_start; } - void set_wake_word(const std::string &wake_word) { this->wake_word_ = wake_word; } + void add_wake_word_model(const uint8_t *model_start, float probability_cutoff, size_t sliding_window_average_size, + const std::string &wake_word, size_t tensor_arena_size); + +#ifdef USE_MICRO_WAKE_WORD_VAD + void add_vad_model(const uint8_t *model_start, float probability_cutoff, size_t sliding_window_size, + size_t tensor_arena_size); +#endif protected: - void set_state_(State state); - int read_microphone_(); - - const uint8_t *model_start_; - std::string wake_word_; - microphone::Microphone *microphone_{nullptr}; Trigger *wake_word_detected_trigger_ = new Trigger(); State state_{State::IDLE}; @@ -102,85 +66,93 @@ class MicroWakeWord : public Component { std::unique_ptr ring_buffer_; - int16_t *input_buffer_; + std::vector wake_word_models_; - const tflite::Model *preprocessor_model_{nullptr}; - const tflite::Model *streaming_model_{nullptr}; - tflite::MicroInterpreter *streaming_interpreter_{nullptr}; - tflite::MicroInterpreter *preprocessor_interperter_{nullptr}; +#ifdef USE_MICRO_WAKE_WORD_VAD + std::unique_ptr vad_model_; +#endif - std::vector recent_streaming_probabilities_; - size_t last_n_index_{0}; + tflite::MicroMutableOpResolver<20> streaming_op_resolver_; - float probability_cutoff_{0.5}; - size_t sliding_window_average_size_{10}; + // Audio frontend handles generating spectrogram features + struct FrontendConfig frontend_config_; + struct FrontendState frontend_state_; - // When the wake word detection first starts or after the word has been detected once, we ignore this many audio - // feature slices before accepting a positive detection again + // When the wake word detection first starts, we ignore this many audio + // feature slices before accepting a positive detection int16_t ignore_windows_{-MIN_SLICES_BEFORE_DETECTION}; - uint8_t *streaming_var_arena_{nullptr}; - uint8_t *streaming_tensor_arena_{nullptr}; - uint8_t *preprocessor_tensor_arena_{nullptr}; - int8_t *new_features_data_{nullptr}; + uint8_t features_step_size_; - tflite::MicroResourceVariables *mrv_{nullptr}; - - // Stores audio fed into feature generator preprocessor - int16_t *preprocessor_audio_buffer_; + // Stores audio read from the microphone before being added to the ring buffer. + int16_t *input_buffer_{nullptr}; + // Stores audio to be fed into the audio frontend for generating features. + int16_t *preprocessor_audio_buffer_{nullptr}; bool detected_{false}; + std::string detected_wake_word_{""}; - /** Detects if wake word has been said + void set_state_(State state); + + /// @brief Tests if there are enough samples in the ring buffer to generate new features. + /// @return True if enough samples, false otherwise. + bool has_enough_samples_(); + + /** Reads audio from microphone into the ring buffer + * + * Audio data (16000 kHz with int16 samples) is read into the input_buffer_. + * Verifies the ring buffer has enough space for all audio data. If not, it logs + * a warning and resets the ring buffer entirely. + * @return Number of bytes written to the ring buffer + */ + size_t read_microphone_(); + + /// @brief Allocates memory for input_buffer_, preprocessor_audio_buffer_, and ring_buffer_ + /// @return True if successful, false otherwise + bool allocate_buffers_(); + + /// @brief Frees memory allocated for input_buffer_ and preprocessor_audio_buffer_ + void deallocate_buffers_(); + + /// @brief Loads streaming models and prepares the feature generation frontend + /// @return True if successful, false otherwise + bool load_models_(); + + /// @brief Deletes each model's TFLite interpreters and frees tensor arena memory. Frees memory used by the feature + /// generation frontend. + void unload_models_(); + + /** Performs inference with each configured model * * If enough audio samples are available, it will generate one slice of new features. - * If the streaming model predicts the wake word, then the nonstreaming model confirms it. - * @param ring_Buffer Ring buffer containing raw audio samples - * @return True if the wake word is detected, false otherwise + * It then loops through and performs inference with each of the loaded models. */ - bool detect_wake_word_(); + void update_model_probabilities_(); - /// @brief Returns true if there are enough audio samples in the buffer to generate another slice of features - bool slice_available_(); - - /** Shifts previous feature slices over by one and generates a new slice of features + /** Checks every model's recent probabilities to determine if the wake word has been predicted * - * @param ring_buffer ring buffer containing raw audio samples - * @return True if a new slice of features was generated, false otherwise + * Verifies the models have processed enough new samples for accurate predictions. + * Sets detected_wake_word_ to the wake word, if one is detected. + * @return True if a wake word is predicted, false otherwise */ - bool update_features_(); + bool detect_wake_words_(); - /** Generates features from audio samples + /** Generates features for a window of audio samples * - * Adapted from TFLite micro speech example - * @param audio_data Pointer to array with the audio samples - * @param audio_data_size The number of samples to use as input to the preprocessor model - * @param feature_output Array that will store the features + * Reads samples from the ring buffer and feeds them into the preprocessor frontend. + * Adapted from TFLite microspeech frontend. + * @param features int8_t array to store the audio features * @return True if successful, false otherwise. */ - bool generate_single_feature_(const int16_t *audio_data, int audio_data_size, - int8_t feature_output[PREPROCESSOR_FEATURE_SIZE]); + bool generate_features_for_window_(int8_t features[PREPROCESSOR_FEATURE_SIZE]); - /** Performs inference over the most recent feature slice with the streaming model - * - * @return Probability of the wake word between 0.0 and 1.0 - */ - float perform_streaming_inference_(); - - /** Strides the audio samples by keeping the last 10 ms of the previous slice - * - * Adapted from the TFLite micro speech example - * @param ring_buffer Ring buffer containing raw audio samples - * @param audio_samples Pointer to an array that will store the strided audio samples - * @return True if successful, false otherwise - */ - bool stride_audio_samples_(int16_t **audio_samples); - - /// @brief Returns true if successfully registered the preprocessor's TensorFlow operations - bool register_preprocessor_ops_(tflite::MicroMutableOpResolver<18> &op_resolver); + /// @brief Resets the ring buffer, ignore_windows_, and sliding window probabilities + void reset_states_(); /// @brief Returns true if successfully registered the streaming model's TensorFlow operations - bool register_streaming_ops_(tflite::MicroMutableOpResolver<17> &op_resolver); + bool register_streaming_ops_(tflite::MicroMutableOpResolver<20> &op_resolver); + + inline uint16_t new_samples_to_get_() { return (this->features_step_size_ * (AUDIO_SAMPLE_FREQUENCY / 1000)); } }; template class StartAction : public Action, public Parented { @@ -202,5 +174,3 @@ template class IsRunningCondition : public Condition, pub } // namespace esphome #endif // USE_ESP_IDF - -#endif // CLANG_TIDY diff --git a/esphome/components/micro_wake_word/preprocessor_settings.h b/esphome/components/micro_wake_word/preprocessor_settings.h new file mode 100644 index 0000000000..03f4fb5230 --- /dev/null +++ b/esphome/components/micro_wake_word/preprocessor_settings.h @@ -0,0 +1,20 @@ +#pragma once + +#ifdef USE_ESP_IDF + +#include + +namespace esphome { +namespace micro_wake_word { + +// The number of features the audio preprocessor generates per slice +static const uint8_t PREPROCESSOR_FEATURE_SIZE = 40; +// Duration of each slice used as input into the preprocessor +static const uint8_t FEATURE_DURATION_MS = 30; +// Audio sample frequency in hertz +static const uint16_t AUDIO_SAMPLE_FREQUENCY = 16000; + +} // namespace micro_wake_word +} // namespace esphome + +#endif diff --git a/esphome/components/micro_wake_word/streaming_model.cpp b/esphome/components/micro_wake_word/streaming_model.cpp new file mode 100644 index 0000000000..013fa2ce6e --- /dev/null +++ b/esphome/components/micro_wake_word/streaming_model.cpp @@ -0,0 +1,189 @@ +#ifdef USE_ESP_IDF + +#include "streaming_model.h" + +#include "esphome/core/hal.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" + +static const char *const TAG = "micro_wake_word"; + +namespace esphome { +namespace micro_wake_word { + +void WakeWordModel::log_model_config() { + ESP_LOGCONFIG(TAG, " - Wake Word: %s", this->wake_word_.c_str()); + ESP_LOGCONFIG(TAG, " Probability cutoff: %.3f", this->probability_cutoff_); + ESP_LOGCONFIG(TAG, " Sliding window size: %d", this->sliding_window_size_); +} + +void VADModel::log_model_config() { + ESP_LOGCONFIG(TAG, " - VAD Model"); + ESP_LOGCONFIG(TAG, " Probability cutoff: %.3f", this->probability_cutoff_); + ESP_LOGCONFIG(TAG, " Sliding window size: %d", this->sliding_window_size_); +} + +bool StreamingModel::load_model(tflite::MicroMutableOpResolver<20> &op_resolver) { + ExternalRAMAllocator arena_allocator(ExternalRAMAllocator::ALLOW_FAILURE); + + if (this->tensor_arena_ == nullptr) { + this->tensor_arena_ = arena_allocator.allocate(this->tensor_arena_size_); + if (this->tensor_arena_ == nullptr) { + ESP_LOGE(TAG, "Could not allocate the streaming model's tensor arena."); + return false; + } + } + + if (this->var_arena_ == nullptr) { + this->var_arena_ = arena_allocator.allocate(STREAMING_MODEL_VARIABLE_ARENA_SIZE); + if (this->var_arena_ == nullptr) { + ESP_LOGE(TAG, "Could not allocate the streaming model's variable tensor arena."); + return false; + } + this->ma_ = tflite::MicroAllocator::Create(this->var_arena_, STREAMING_MODEL_VARIABLE_ARENA_SIZE); + this->mrv_ = tflite::MicroResourceVariables::Create(this->ma_, 20); + } + + const tflite::Model *model = tflite::GetModel(this->model_start_); + if (model->version() != TFLITE_SCHEMA_VERSION) { + ESP_LOGE(TAG, "Streaming model's schema is not supported"); + return false; + } + + if (this->interpreter_ == nullptr) { + this->interpreter_ = make_unique( + tflite::GetModel(this->model_start_), op_resolver, this->tensor_arena_, this->tensor_arena_size_, this->mrv_); + if (this->interpreter_->AllocateTensors() != kTfLiteOk) { + ESP_LOGE(TAG, "Failed to allocate tensors for the streaming model"); + return false; + } + + // Verify input tensor matches expected values + // Dimension 3 will represent the first layer stride, so skip it may vary + TfLiteTensor *input = this->interpreter_->input(0); + if ((input->dims->size != 3) || (input->dims->data[0] != 1) || + (input->dims->data[2] != PREPROCESSOR_FEATURE_SIZE)) { + ESP_LOGE(TAG, "Streaming model tensor input dimensions has improper dimensions."); + return false; + } + + if (input->type != kTfLiteInt8) { + ESP_LOGE(TAG, "Streaming model tensor input is not int8."); + return false; + } + + // Verify output tensor matches expected values + TfLiteTensor *output = this->interpreter_->output(0); + if ((output->dims->size != 2) || (output->dims->data[0] != 1) || (output->dims->data[1] != 1)) { + ESP_LOGE(TAG, "Streaming model tensor output dimension is not 1x1."); + } + + if (output->type != kTfLiteUInt8) { + ESP_LOGE(TAG, "Streaming model tensor output is not uint8."); + return false; + } + } + + return true; +} + +void StreamingModel::unload_model() { + this->interpreter_.reset(); + + ExternalRAMAllocator arena_allocator(ExternalRAMAllocator::ALLOW_FAILURE); + + arena_allocator.deallocate(this->tensor_arena_, this->tensor_arena_size_); + this->tensor_arena_ = nullptr; + arena_allocator.deallocate(this->var_arena_, STREAMING_MODEL_VARIABLE_ARENA_SIZE); + this->var_arena_ = nullptr; +} + +bool StreamingModel::perform_streaming_inference(const int8_t features[PREPROCESSOR_FEATURE_SIZE]) { + if (this->interpreter_ != nullptr) { + TfLiteTensor *input = this->interpreter_->input(0); + + std::memmove( + (int8_t *) (tflite::GetTensorData(input)) + PREPROCESSOR_FEATURE_SIZE * this->current_stride_step_, + features, PREPROCESSOR_FEATURE_SIZE); + ++this->current_stride_step_; + + uint8_t stride = this->interpreter_->input(0)->dims->data[1]; + + if (this->current_stride_step_ >= stride) { + this->current_stride_step_ = 0; + + TfLiteStatus invoke_status = this->interpreter_->Invoke(); + if (invoke_status != kTfLiteOk) { + ESP_LOGW(TAG, "Streaming interpreter invoke failed"); + return false; + } + + TfLiteTensor *output = this->interpreter_->output(0); + + ++this->last_n_index_; + if (this->last_n_index_ == this->sliding_window_size_) + this->last_n_index_ = 0; + this->recent_streaming_probabilities_[this->last_n_index_] = output->data.uint8[0]; // probability; + } + return true; + } + ESP_LOGE(TAG, "Streaming interpreter is not initialized."); + return false; +} + +void StreamingModel::reset_probabilities() { + for (auto &prob : this->recent_streaming_probabilities_) { + prob = 0; + } +} + +WakeWordModel::WakeWordModel(const uint8_t *model_start, float probability_cutoff, size_t sliding_window_average_size, + const std::string &wake_word, size_t tensor_arena_size) { + this->model_start_ = model_start; + this->probability_cutoff_ = probability_cutoff; + this->sliding_window_size_ = sliding_window_average_size; + this->recent_streaming_probabilities_.resize(sliding_window_average_size, 0); + this->wake_word_ = wake_word; + this->tensor_arena_size_ = tensor_arena_size; +}; + +bool WakeWordModel::determine_detected() { + int32_t sum = 0; + for (auto &prob : this->recent_streaming_probabilities_) { + sum += prob; + } + + float sliding_window_average = static_cast(sum) / static_cast(255 * this->sliding_window_size_); + + // Detect the wake word if the sliding window average is above the cutoff + if (sliding_window_average > this->probability_cutoff_) { + ESP_LOGD(TAG, "The '%s' model sliding average probability is %.3f and most recent probability is %.3f", + this->wake_word_.c_str(), sliding_window_average, + this->recent_streaming_probabilities_[this->last_n_index_] / (255.0)); + return true; + } + return false; +} + +VADModel::VADModel(const uint8_t *model_start, float probability_cutoff, size_t sliding_window_size, + size_t tensor_arena_size) { + this->model_start_ = model_start; + this->probability_cutoff_ = probability_cutoff; + this->sliding_window_size_ = sliding_window_size; + this->recent_streaming_probabilities_.resize(sliding_window_size, 0); + this->tensor_arena_size_ = tensor_arena_size; +}; + +bool VADModel::determine_detected() { + uint8_t max = 0; + for (auto &prob : this->recent_streaming_probabilities_) { + max = std::max(prob, max); + } + + return max > this->probability_cutoff_; +} + +} // namespace micro_wake_word +} // namespace esphome + +#endif diff --git a/esphome/components/micro_wake_word/streaming_model.h b/esphome/components/micro_wake_word/streaming_model.h new file mode 100644 index 0000000000..0d85579f35 --- /dev/null +++ b/esphome/components/micro_wake_word/streaming_model.h @@ -0,0 +1,84 @@ +#pragma once + +#ifdef USE_ESP_IDF + +#include "preprocessor_settings.h" + +#include +#include +#include + +namespace esphome { +namespace micro_wake_word { + +static const uint32_t STREAMING_MODEL_VARIABLE_ARENA_SIZE = 1024; + +class StreamingModel { + public: + virtual void log_model_config() = 0; + virtual bool determine_detected() = 0; + + bool perform_streaming_inference(const int8_t features[PREPROCESSOR_FEATURE_SIZE]); + + /// @brief Sets all recent_streaming_probabilities to 0 + void reset_probabilities(); + + /// @brief Allocates tensor and variable arenas and sets up the model interpreter + /// @param op_resolver MicroMutableOpResolver object that must exist until the model is unloaded + /// @return True if successful, false otherwise + bool load_model(tflite::MicroMutableOpResolver<20> &op_resolver); + + /// @brief Destroys the TFLite interpreter and frees the tensor and variable arenas' memory + void unload_model(); + + protected: + uint8_t current_stride_step_{0}; + + float probability_cutoff_; + size_t sliding_window_size_; + size_t last_n_index_{0}; + size_t tensor_arena_size_; + std::vector recent_streaming_probabilities_; + + const uint8_t *model_start_; + uint8_t *tensor_arena_{nullptr}; + uint8_t *var_arena_{nullptr}; + std::unique_ptr interpreter_; + tflite::MicroResourceVariables *mrv_{nullptr}; + tflite::MicroAllocator *ma_{nullptr}; +}; + +class WakeWordModel final : public StreamingModel { + public: + WakeWordModel(const uint8_t *model_start, float probability_cutoff, size_t sliding_window_average_size, + const std::string &wake_word, size_t tensor_arena_size); + + void log_model_config() override; + + /// @brief Checks for the wake word by comparing the mean probability in the sliding window with the probability + /// cutoff + /// @return True if wake word is detected, false otherwise + bool determine_detected() override; + + const std::string &get_wake_word() const { return this->wake_word_; } + + protected: + std::string wake_word_; +}; + +class VADModel final : public StreamingModel { + public: + VADModel(const uint8_t *model_start, float probability_cutoff, size_t sliding_window_size, size_t tensor_arena_size); + + void log_model_config() override; + + /// @brief Checks for voice activity by comparing the max probability in the sliding window with the probability + /// cutoff + /// @return True if voice activity is detected, false otherwise + bool determine_detected() override; +}; + +} // namespace micro_wake_word +} // namespace esphome + +#endif diff --git a/esphome/core/defines.h b/esphome/core/defines.h index 1e6f3517db..4831ed2c9e 100644 --- a/esphome/core/defines.h +++ b/esphome/core/defines.h @@ -86,6 +86,7 @@ #define USE_ESP32_BLE_SERVER #define USE_ESP32_CAMERA #define USE_IMPROV +#define USE_MICRO_WAKE_WORD_VAD #define USE_MICROPHONE #define USE_PSRAM #define USE_SOCKET_IMPL_BSD_SOCKETS diff --git a/platformio.ini b/platformio.ini index a72bf598c5..f07889526f 100644 --- a/platformio.ini +++ b/platformio.ini @@ -142,7 +142,8 @@ platform_packages = framework = espidf lib_deps = ${common:idf.lib_deps} - droscy/esp_wireguard@0.4.2 ; wireguard + droscy/esp_wireguard@0.4.2 ; wireguard + kahrendt/ESPMicroSpeechFeatures@1.0.0 ; micro_wake_word build_flags = ${common:idf.build_flags} -Wno-nonnull-compare diff --git a/tests/components/micro_wake_word/common.yaml b/tests/components/micro_wake_word/common.yaml index c0f3593cc6..8bd7345307 100644 --- a/tests/components/micro_wake_word/common.yaml +++ b/tests/components/micro_wake_word/common.yaml @@ -10,6 +10,10 @@ microphone: pdm: true micro_wake_word: - model: hey_jarvis on_wake_word_detected: - logger.log: "Wake word detected" + models: + - model: hey_jarvis + probability_cutoff: 0.7 + - model: okay_nabu + sliding_window_size: 5 diff --git a/tests/components/micro_wake_word/test.esp32-idf.yaml b/tests/components/micro_wake_word/test.esp32-idf.yaml new file mode 100644 index 0000000000..dade44d145 --- /dev/null +++ b/tests/components/micro_wake_word/test.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common.yaml From aa8c963c50467b194fa5d7ebb25f81a6692d3d19 Mon Sep 17 00:00:00 2001 From: Pavlo Dudnytskyi Date: Thu, 11 Jul 2024 03:30:55 +0200 Subject: [PATCH 175/233] UART component support added for host platform (#6912) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Co-authored-by: Pavlo Dudnytskyi --- esphome/components/uart/__init__.py | 66 +++- .../components/uart/uart_component_host.cpp | 295 ++++++++++++++++++ esphome/components/uart/uart_component_host.h | 38 +++ tests/components/uart/test.host.yaml | 13 + 4 files changed, 410 insertions(+), 2 deletions(-) create mode 100644 esphome/components/uart/uart_component_host.cpp create mode 100644 esphome/components/uart/uart_component_host.h create mode 100644 tests/components/uart/test.host.yaml diff --git a/esphome/components/uart/__init__.py b/esphome/components/uart/__init__.py index b036288078..0738a127e1 100644 --- a/esphome/components/uart/__init__.py +++ b/esphome/components/uart/__init__.py @@ -1,5 +1,5 @@ from typing import Optional - +import re import esphome.codegen as cg import esphome.config_validation as cv import esphome.final_validate as fv @@ -11,6 +11,7 @@ from esphome.const import ( CONF_NUMBER, CONF_RX_PIN, CONF_TX_PIN, + CONF_PORT, CONF_UART_ID, CONF_DATA, CONF_RX_BUFFER_SIZE, @@ -27,6 +28,7 @@ from esphome.const import ( CONF_DUMMY_RECEIVER, CONF_DUMMY_RECEIVER_ID, CONF_LAMBDA, + PLATFORM_HOST, ) from esphome.core import CORE @@ -45,6 +47,7 @@ RP2040UartComponent = uart_ns.class_("RP2040UartComponent", UARTComponent, cg.Co LibreTinyUARTComponent = uart_ns.class_( "LibreTinyUARTComponent", UARTComponent, cg.Component ) +HostUartComponent = uart_ns.class_("HostUartComponent", UARTComponent, cg.Component) NATIVE_UART_CLASSES = ( str(IDFUARTComponent), @@ -54,6 +57,39 @@ NATIVE_UART_CLASSES = ( str(LibreTinyUARTComponent), ) +HOST_BAUD_RATES = [ + 50, + 75, + 110, + 134, + 150, + 200, + 300, + 600, + 1200, + 1800, + 2400, + 4800, + 9600, + 19200, + 38400, + 57600, + 115200, + 230400, + 460800, + 500000, + 576000, + 921600, + 1000000, + 1152000, + 1500000, + 2000000, + 2500000, + 3000000, + 3500000, + 4000000, +] + UARTDevice = uart_ns.class_("UARTDevice") UARTWriteAction = uart_ns.class_("UARTWriteAction", automation.Action) UARTDebugger = uart_ns.class_("UARTDebugger", cg.Component, automation.Action) @@ -95,6 +131,20 @@ def validate_invert_esp32(config): return config +def validate_host_config(config): + if CORE.is_host: + if CONF_TX_PIN in config or CONF_RX_PIN in config: + raise cv.Invalid( + "TX and RX pins are not supported for UART on host platform." + ) + if config[CONF_BAUD_RATE] not in HOST_BAUD_RATES: + raise cv.Invalid( + f"Host platform doesn't support baud rate {config[CONF_BAUD_RATE]}", + path=[CONF_BAUD_RATE], + ) + return config + + def _uart_declare_type(value): if CORE.is_esp8266: return cv.declare_id(ESP8266UartComponent)(value) @@ -107,6 +157,8 @@ def _uart_declare_type(value): return cv.declare_id(RP2040UartComponent)(value) if CORE.is_libretiny: return cv.declare_id(LibreTinyUARTComponent)(value) + if CORE.is_host: + return cv.declare_id(HostUartComponent)(value) raise NotImplementedError @@ -149,6 +201,12 @@ def maybe_empty_debug(value): return DEBUG_SCHEMA(value) +def validate_port(value): + if not re.match(r"^/(?:[^/]+/)[^/]+$", value): + raise cv.Invalid("Port must be a valid device path") + return value + + DEBUG_SCHEMA = cv.Schema( { cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(UARTDebugger), @@ -181,6 +239,7 @@ CONFIG_SCHEMA = cv.All( cv.Required(CONF_BAUD_RATE): cv.int_range(min=1), cv.Optional(CONF_TX_PIN): pins.internal_gpio_output_pin_schema, cv.Optional(CONF_RX_PIN): validate_rx_pin, + cv.Optional(CONF_PORT): cv.All(validate_port, cv.only_on(PLATFORM_HOST)), cv.Optional(CONF_RX_BUFFER_SIZE, default=256): cv.validate_bytes, cv.Optional(CONF_STOP_BITS, default=1): cv.one_of(1, 2, int=True), cv.Optional(CONF_DATA_BITS, default=8): cv.int_range(min=5, max=8), @@ -193,8 +252,9 @@ CONFIG_SCHEMA = cv.All( cv.Optional(CONF_DEBUG): maybe_empty_debug, } ).extend(cv.COMPONENT_SCHEMA), - cv.has_at_least_one_key(CONF_TX_PIN, CONF_RX_PIN), + cv.has_at_least_one_key(CONF_TX_PIN, CONF_RX_PIN, CONF_PORT), validate_invert_esp32, + validate_host_config, ) @@ -236,6 +296,8 @@ async def to_code(config): if CONF_RX_PIN in config: rx_pin = await cg.gpio_pin_expression(config[CONF_RX_PIN]) cg.add(var.set_rx_pin(rx_pin)) + if CONF_PORT in config: + cg.add(var.set_name(config[CONF_PORT])) cg.add(var.set_rx_buffer_size(config[CONF_RX_BUFFER_SIZE])) cg.add(var.set_stop_bits(config[CONF_STOP_BITS])) cg.add(var.set_data_bits(config[CONF_DATA_BITS])) diff --git a/esphome/components/uart/uart_component_host.cpp b/esphome/components/uart/uart_component_host.cpp new file mode 100644 index 0000000000..d8d2fd75b8 --- /dev/null +++ b/esphome/components/uart/uart_component_host.cpp @@ -0,0 +1,295 @@ +#ifdef USE_HOST +#include "uart_component_host.h" +#include "esphome/core/application.h" +#include "esphome/core/defines.h" +#include "esphome/core/helpers.h" +#include "esphome/core/log.h" + +#ifndef __linux__ +#error This HostUartComponent implementation is only for Linux +#endif + +#include +#include +#include +#include +#include +#include +#include + +#ifdef USE_LOGGER +#include "esphome/components/logger/logger.h" +#endif + +namespace { + +speed_t get_baud(int baud) { + switch (baud) { + case 50: + return B50; + case 75: + return B75; + case 110: + return B110; + case 134: + return B134; + case 150: + return B150; + case 200: + return B200; + case 300: + return B300; + case 600: + return B600; + case 1200: + return B1200; + case 1800: + return B1800; + case 2400: + return B2400; + case 4800: + return B4800; + case 9600: + return B9600; + case 19200: + return B19200; + case 38400: + return B38400; + case 57600: + return B57600; + case 115200: + return B115200; + case 230400: + return B230400; + case 460800: + return B460800; + case 500000: + return B500000; + case 576000: + return B576000; + case 921600: + return B921600; + case 1000000: + return B1000000; + case 1152000: + return B1152000; + case 1500000: + return B1500000; + case 2000000: + return B2000000; + case 2500000: + return B2500000; + case 3000000: + return B3000000; + case 3500000: + return B3500000; + case 4000000: + return B4000000; + default: + return B0; + } +} + +} // namespace + +namespace esphome { +namespace uart { + +static const char *const TAG = "uart.host"; + +HostUartComponent::~HostUartComponent() { + if (this->file_descriptor_ != -1) { + close(this->file_descriptor_); + this->file_descriptor_ = -1; + } +} + +void HostUartComponent::setup() { + ESP_LOGCONFIG(TAG, "Opening UART port..."); + speed_t baud = get_baud(this->baud_rate_); + if (baud == B0) { + ESP_LOGE(TAG, "Unsupported baud rate: %d", this->baud_rate_); + this->mark_failed(); + return; + } + this->file_descriptor_ = ::open(this->port_name_.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); + if (this->file_descriptor_ == -1) { + this->update_error_(strerror(errno)); + this->mark_failed(); + return; + } + fcntl(this->file_descriptor_, F_SETFL, 0); + struct termios options; + tcgetattr(this->file_descriptor_, &options); + options.c_cflag &= ~CRTSCTS; + options.c_cflag |= CREAD | CLOCAL; + options.c_lflag &= ~ICANON; + options.c_lflag &= ~ECHO; + options.c_lflag &= ~ECHOE; + options.c_lflag &= ~ECHONL; + options.c_lflag &= ~ISIG; + options.c_iflag &= ~(IXON | IXOFF | IXANY); + options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL); + options.c_oflag &= ~OPOST; + options.c_oflag &= ~ONLCR; + // Set data bits + options.c_cflag &= ~CSIZE; // Mask the character size bits + switch (this->data_bits_) { + case 5: + options.c_cflag |= CS5; + break; + case 6: + options.c_cflag |= CS6; + break; + case 7: + options.c_cflag |= CS7; + break; + case 8: + default: + options.c_cflag |= CS8; + break; + } + // Set parity + switch (this->parity_) { + case UART_CONFIG_PARITY_NONE: + options.c_cflag &= ~PARENB; + break; + case UART_CONFIG_PARITY_EVEN: + options.c_cflag |= PARENB; + options.c_cflag &= ~PARODD; + break; + case UART_CONFIG_PARITY_ODD: + options.c_cflag |= PARENB; + options.c_cflag |= PARODD; + break; + }; + // Set stop bits + if (this->stop_bits_ == 2) { + options.c_cflag |= CSTOPB; + } else { + options.c_cflag &= ~CSTOPB; + } + cfsetispeed(&options, baud); + cfsetospeed(&options, baud); + tcsetattr(this->file_descriptor_, TCSANOW, &options); +} + +void HostUartComponent::dump_config() { + ESP_LOGCONFIG(TAG, "UART:"); + ESP_LOGCONFIG(TAG, " Port: %s", this->port_name_.c_str()); + if (this->file_descriptor_ == -1) { + ESP_LOGCONFIG(TAG, " Port status: Not opened"); + if (!this->first_error_.empty()) { + ESP_LOGCONFIG(TAG, " Error: %s", this->first_error_.c_str()); + } + return; + } + ESP_LOGCONFIG(TAG, " Port status: opened"); + ESP_LOGCONFIG(TAG, " Baud Rate: %d", this->baud_rate_); + ESP_LOGCONFIG(TAG, " Data Bits: %d", this->data_bits_); + ESP_LOGCONFIG(TAG, " Parity: %s", + this->parity_ == UART_CONFIG_PARITY_NONE ? "None" + : this->parity_ == UART_CONFIG_PARITY_EVEN ? "Even" + : "Odd"); + ESP_LOGCONFIG(TAG, " Stop Bits: %d", this->stop_bits_); + this->check_logger_conflict(); +} + +void HostUartComponent::write_array(const uint8_t *data, size_t len) { + if (this->file_descriptor_ == -1) { + return; + } + size_t written = ::write(this->file_descriptor_, data, len); + if (written != len) { + this->update_error_(strerror(errno)); + return; + } +#ifdef USE_UART_DEBUGGER + for (size_t i = 0; i < len; i++) { + this->debug_callback_.call(UART_DIRECTION_TX, data[i]); + } +#endif + return; +} + +bool HostUartComponent::peek_byte(uint8_t *data) { + if (this->file_descriptor_ == -1) { + return false; + } + if (!this->has_peek_) { + if (!this->check_read_timeout_()) { + return false; + } + if (::read(this->file_descriptor_, &this->peek_byte_, 1) != 1) { + this->update_error_(strerror(errno)); + return false; + } + this->has_peek_ = true; + } + *data = this->peek_byte_; + return true; +} + +bool HostUartComponent::read_array(uint8_t *data, size_t len) { + if ((this->file_descriptor_ == -1) || (len == 0)) { + return false; + } + if (!this->check_read_timeout_(len)) + return false; + uint8_t *data_ptr = data; + size_t length_to_read = len; + if (this->has_peek_) { + length_to_read--; + *data_ptr = this->peek_byte_; + data_ptr++; + this->has_peek_ = false; + } + if (length_to_read > 0) { + int sz = ::read(this->file_descriptor_, data_ptr, length_to_read); + if (sz == -1) { + this->update_error_(strerror(errno)); + return false; + } + } +#ifdef USE_UART_DEBUGGER + for (size_t i = 0; i < len; i++) { + this->debug_callback_.call(UART_DIRECTION_RX, data[i]); + } +#endif + return true; +} + +int HostUartComponent::available() { + if (this->file_descriptor_ == -1) { + return 0; + } + int available; + int res = ioctl(this->file_descriptor_, FIONREAD, &available); + if (res == -1) { + this->update_error_(strerror(errno)); + return 0; + } + if (this->has_peek_) + available++; + return available; +}; + +void HostUartComponent::flush() { + if (this->file_descriptor_ == -1) { + return; + } + tcflush(this->file_descriptor_, TCIOFLUSH); + ESP_LOGV(TAG, " Flushing..."); +} + +void HostUartComponent::update_error_(const std::string &error) { + if (this->first_error_.empty()) { + this->first_error_ = error; + } + ESP_LOGE(TAG, "Port error: %s", error.c_str()); +} + +} // namespace uart +} // namespace esphome + +#endif // USE_HOST diff --git a/esphome/components/uart/uart_component_host.h b/esphome/components/uart/uart_component_host.h new file mode 100644 index 0000000000..c1f1dd0d2c --- /dev/null +++ b/esphome/components/uart/uart_component_host.h @@ -0,0 +1,38 @@ +#pragma once + +#ifdef USE_HOST + +#include "esphome/core/component.h" +#include "esphome/core/log.h" +#include "uart_component.h" + +namespace esphome { +namespace uart { + +class HostUartComponent : public UARTComponent, public Component { + public: + virtual ~HostUartComponent(); + void setup() override; + void dump_config() override; + float get_setup_priority() const override { return setup_priority::BUS; } + void write_array(const uint8_t *data, size_t len) override; + bool peek_byte(uint8_t *data) override; + bool read_array(uint8_t *data, size_t len) override; + int available() override; + void flush() override; + void set_name(std::string port_name) { port_name_ = port_name; }; + + protected: + void update_error_(const std::string &error); + void check_logger_conflict() override {} + std::string port_name_; + std::string first_error_{""}; + int file_descriptor_ = -1; + bool has_peek_{false}; + uint8_t peek_byte_; +}; + +} // namespace uart +} // namespace esphome + +#endif // USE_HOST diff --git a/tests/components/uart/test.host.yaml b/tests/components/uart/test.host.yaml new file mode 100644 index 0000000000..63f0ade084 --- /dev/null +++ b/tests/components/uart/test.host.yaml @@ -0,0 +1,13 @@ +esphome: + on_boot: + then: + - uart.write: 'Hello World' + - uart.write: [0x00, 0x20, 0x42] + +uart: + - id: uart_uart + port: "/dev/ttyS0" + baud_rate: 9600 + data_bits: 8 + parity: EVEN + stop_bits: 2 From 2f669c99f8954ccc8c960fb527040ae2febe13cf Mon Sep 17 00:00:00 2001 From: Jimmy Hedman Date: Thu, 11 Jul 2024 03:32:17 +0200 Subject: [PATCH 176/233] Configure ap ip for RP2040 (#7065) --- .../components/wifi/wifi_component_pico_w.cpp | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/esphome/components/wifi/wifi_component_pico_w.cpp b/esphome/components/wifi/wifi_component_pico_w.cpp index 2bb1af5489..4afcf2d78b 100644 --- a/esphome/components/wifi/wifi_component_pico_w.cpp +++ b/esphome/components/wifi/wifi_component_pico_w.cpp @@ -141,13 +141,29 @@ bool WiFiComponent::wifi_scan_start_(bool passive) { #ifdef USE_WIFI_AP bool WiFiComponent::wifi_ap_ip_config_(optional manual_ip) { - // TODO: - return false; + esphome::network::IPAddress ip_address, gateway, subnet, dns; + if (manual_ip.has_value()) { + ip_address = manual_ip->static_ip; + gateway = manual_ip->gateway; + subnet = manual_ip->subnet; + dns = manual_ip->static_ip; + } else { + ip_address = network::IPAddress(192, 168, 4, 1); + gateway = network::IPAddress(192, 168, 4, 1); + subnet = network::IPAddress(255, 255, 255, 0); + dns = network::IPAddress(192, 168, 4, 1); + } + WiFi.config(ip_address, dns, gateway, subnet); + return true; } bool WiFiComponent::wifi_start_ap_(const WiFiAP &ap) { if (!this->wifi_mode_({}, true)) return false; + if (!this->wifi_ap_ip_config_(ap.get_manual_ip())) { + ESP_LOGV(TAG, "wifi_ap_ip_config_ failed!"); + return false; + } WiFi.beginAP(ap.get_ssid().c_str(), ap.get_password().c_str(), ap.get_channel().value_or(1)); From d1b0e6b5fe11d0e77e20432c11f8f68b421ac841 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:41:48 +1200 Subject: [PATCH 177/233] Bump version to 2024.8.0-dev --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 543b1d00cc..faf6ce19fa 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.7.0-dev" +__version__ = "2024.8.0-dev" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 6417f1f907d0dbbef3f2011905a3cb7c9abf9763 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:41:48 +1200 Subject: [PATCH 178/233] Bump version to 2024.7.0b1 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 543b1d00cc..d672cc92af 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.7.0-dev" +__version__ = "2024.7.0b1" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From fb6c2aef59d5b3ca1463705eba01d0eb3de19535 Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Thu, 11 Jul 2024 05:58:54 +0200 Subject: [PATCH 179/233] helpers.cpp: Fix GLIBCXX_RELEASE check < 8 (#7062) --- esphome/core/helpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/core/helpers.cpp b/esphome/core/helpers.cpp index 7f040f855f..e75b06ccd3 100644 --- a/esphome/core/helpers.cpp +++ b/esphome/core/helpers.cpp @@ -78,7 +78,7 @@ static const uint16_t CRC16_1021_BE_LUT_H[] = {0x0000, 0x1231, 0x2462, 0x3653, 0 // STL backports -#if _GLIBCXX_RELEASE < 7 +#if _GLIBCXX_RELEASE < 8 std::string to_string(int value) { return str_snprintf("%d", 32, value); } // NOLINT std::string to_string(long value) { return str_snprintf("%ld", 32, value); } // NOLINT std::string to_string(long long value) { return str_snprintf("%lld", 32, value); } // NOLINT From fa4fbf9d7384e1962e2982ab2ad0db449d33e4c6 Mon Sep 17 00:00:00 2001 From: Z3LIFF Date: Thu, 11 Jul 2024 00:01:14 -0400 Subject: [PATCH 180/233] Fix pmsa003i cold boot marked as failed on ESP32 et al (#7064) --- esphome/components/pmsa003i/pmsa003i.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/esphome/components/pmsa003i/pmsa003i.cpp b/esphome/components/pmsa003i/pmsa003i.cpp index ca3d28367a..a9665c6a5a 100644 --- a/esphome/components/pmsa003i/pmsa003i.cpp +++ b/esphome/components/pmsa003i/pmsa003i.cpp @@ -13,6 +13,15 @@ void PMSA003IComponent::setup() { PM25AQIData data; bool successful_read = this->read_data_(&data); + if (!successful_read) { + for (int i = 0; i < 3; i++) { + successful_read = this->read_data_(&data); + if (successful_read) { + break; + } + } + } + if (!successful_read) { this->mark_failed(); return; From dea1e9a1e05ea1b01c3a70d6789d02569498becf Mon Sep 17 00:00:00 2001 From: guillempages Date: Thu, 11 Jul 2024 06:08:51 +0200 Subject: [PATCH 181/233] [http_request] Fix follow_redirects on arduino (#7054) --- esphome/components/http_request/http_request_arduino.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/esphome/components/http_request/http_request_arduino.cpp b/esphome/components/http_request/http_request_arduino.cpp index 248a85a439..95b1cdc38e 100644 --- a/esphome/components/http_request/http_request_arduino.cpp +++ b/esphome/components/http_request/http_request_arduino.cpp @@ -32,6 +32,13 @@ std::shared_ptr HttpRequestArduino::start(std::string url, std::s watchdog::WatchdogManager wdm(this->get_watchdog_timeout()); + if (this->follow_redirects_) { + container->client_.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); + container->client_.setRedirectLimit(this->redirect_limit_); + } else { + container->client_.setFollowRedirects(HTTPC_DISABLE_FOLLOW_REDIRECTS); + } + #if defined(USE_ESP8266) std::unique_ptr stream_ptr; #ifdef USE_HTTP_REQUEST_ESP8266_HTTPS @@ -59,8 +66,6 @@ std::shared_ptr HttpRequestArduino::start(std::string url, std::s "in your YAML, or use HTTPS"); } #endif // USE_ARDUINO_VERSION_CODE - - container->client_.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); bool status = container->client_.begin(*stream_ptr, url.c_str()); #elif defined(USE_RP2040) From ee4d5178d6fa54dcc8069b86bfdd63571d8a4f9e Mon Sep 17 00:00:00 2001 From: Jimmy Hedman Date: Thu, 11 Jul 2024 06:09:51 +0200 Subject: [PATCH 182/233] [ethernet] Fix compile warning for IPv6 (#7048) --- esphome/components/ethernet/ethernet_component.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/esphome/components/ethernet/ethernet_component.cpp b/esphome/components/ethernet/ethernet_component.cpp index 6b34157b9d..962a864a29 100644 --- a/esphome/components/ethernet/ethernet_component.cpp +++ b/esphome/components/ethernet/ethernet_component.cpp @@ -394,7 +394,7 @@ void EthernetComponent::got_ip_event_handler(void *arg, esp_event_base_t event_b const esp_netif_ip_info_t *ip_info = &event->ip_info; ESP_LOGV(TAG, "[Ethernet event] ETH Got IP " IPSTR, IP2STR(&ip_info->ip)); global_eth_component->got_ipv4_address_ = true; -#if USE_NETWORK_IPV6 +#if USE_NETWORK_IPV6 && (USE_NETWORK_MIN_IPV6_ADDR_COUNT > 0) global_eth_component->connected_ = global_eth_component->ipv6_count_ >= USE_NETWORK_MIN_IPV6_ADDR_COUNT; #else global_eth_component->connected_ = true; @@ -407,8 +407,12 @@ void EthernetComponent::got_ip6_event_handler(void *arg, esp_event_base_t event_ ip_event_got_ip6_t *event = (ip_event_got_ip6_t *) event_data; ESP_LOGV(TAG, "[Ethernet event] ETH Got IPv6: " IPV6STR, IPV62STR(event->ip6_info.ip)); global_eth_component->ipv6_count_ += 1; +#if (USE_NETWORK_MIN_IPV6_ADDR_COUNT > 0) global_eth_component->connected_ = global_eth_component->got_ipv4_address_ && (global_eth_component->ipv6_count_ >= USE_NETWORK_MIN_IPV6_ADDR_COUNT); +#else + global_eth_component->connected_ = global_eth_component->got_ipv4_address_; +#endif } #endif /* USE_NETWORK_IPV6 */ From 1b57d8511be329fac18c039d22ac06679e616b8f Mon Sep 17 00:00:00 2001 From: esphomebot Date: Thu, 11 Jul 2024 16:10:18 +1200 Subject: [PATCH 183/233] Update webserver local assets to 20240704-081526 (#7041) --- .../components/web_server/server_index_v2.h | 83 +- .../components/web_server/server_index_v3.h | 735 +++++++++--------- 2 files changed, 410 insertions(+), 408 deletions(-) diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h index c942cda592..c9932624ba 100644 --- a/esphome/components/web_server/server_index_v2.h +++ b/esphome/components/web_server/server_index_v2.h @@ -68,7 +68,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe3, 0x9b, 0x82, 0xde, 0xc5, 0x0e, 0x21, 0xa9, 0x64, 0x54, 0x44, 0x2c, 0x97, 0x29, 0x21, 0x29, 0xc2, 0x3f, 0x90, 0x45, 0x68, 0xd6, 0x13, 0xec, 0x34, 0x30, 0x9c, 0xcb, 0x40, 0x71, 0x17, 0x3c, 0xe0, 0xc9, 0x9c, 0xa6, 0x82, 0xa6, 0xc1, 0x5f, 0x71, 0x4a, 0x87, 0x31, 0x40, 0xb1, 0xd3, 0xc4, 0xe3, 0x30, 0x3b, 0x1f, 0x87, 0xc9, 0x88, 0x46, 0xc1, - 0x8d, 0xc8, 0xf1, 0xdf, 0x89, 0x3b, 0x64, 0x49, 0x18, 0xb3, 0x5f, 0x69, 0xe4, 0x6a, 0x69, 0x70, 0xeb, 0xd0, 0x5b, + 0x8d, 0xc8, 0xf1, 0xdf, 0x89, 0x3b, 0x64, 0x49, 0x18, 0xb3, 0x5f, 0x69, 0xe4, 0x6a, 0x69, 0x70, 0xe6, 0xd0, 0x5b, 0x41, 0x93, 0x28, 0x73, 0x9e, 0xbf, 0x7b, 0xf9, 0x42, 0xef, 0x63, 0x45, 0x40, 0xa0, 0x45, 0x36, 0x9b, 0xd2, 0xd4, 0x43, 0x58, 0x0b, 0x88, 0x67, 0x4c, 0x32, 0xc7, 0x97, 0xe1, 0x54, 0x95, 0xb0, 0xec, 0xfd, 0x34, 0x0a, 0x05, 0x7d, 0x43, 0x93, 0x88, 0x25, 0x23, 0xb2, 0xd3, 0x54, 0xe5, 0xe3, 0x50, 0x57, 0x44, 0x45, 0xd1, 0xe5, 0xee, 0xb3, 0x58, @@ -150,19 +150,19 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xa6, 0x57, 0xfd, 0xcf, 0xf9, 0x64, 0x0a, 0xda, 0xd8, 0x0a, 0x49, 0x8f, 0xa8, 0x9e, 0xb0, 0xac, 0xcf, 0x37, 0x94, 0x55, 0xfa, 0xc8, 0xf3, 0x58, 0xa1, 0xa6, 0xc2, 0x5e, 0xde, 0x69, 0xe4, 0xb3, 0xa2, 0xa8, 0x60, 0x1c, 0x9b, 0x9c, 0x2a, 0xe7, 0xab, 0x2e, 0x19, 0x53, 0xf1, 0xda, 0x63, 0x8a, 0x0f, 0x33, 0xe0, 0x75, 0x16, 0xfb, 0x31, 0xe4, 0x6e, - 0xef, 0x7f, 0x5e, 0x22, 0x67, 0x91, 0xaf, 0xa0, 0x6f, 0x91, 0xe7, 0xb7, 0xca, 0xc8, 0xc6, 0xb7, 0xdb, 0xad, 0xe1, - 0xb2, 0x4e, 0x1b, 0x8b, 0xbd, 0x3e, 0xbe, 0x5d, 0x57, 0x1d, 0xc9, 0x62, 0xc2, 0x23, 0x1a, 0xb8, 0x7c, 0x4a, 0x13, - 0x37, 0x07, 0xaf, 0xaa, 0xde, 0xfb, 0x81, 0xf0, 0x16, 0x6f, 0xab, 0xee, 0xd5, 0xe0, 0x36, 0x07, 0xef, 0xd7, 0xd7, + 0xef, 0x7f, 0x5e, 0x22, 0x67, 0x91, 0xaf, 0xa0, 0x6f, 0x91, 0xe7, 0x67, 0xca, 0xc8, 0xc6, 0x67, 0xdb, 0xad, 0xe1, + 0xb2, 0x4e, 0x1b, 0x8b, 0xbd, 0x3e, 0x3e, 0x5b, 0x57, 0x1d, 0xc9, 0x62, 0xc2, 0x23, 0x1a, 0xb8, 0x7c, 0x4a, 0x13, + 0x37, 0x07, 0xaf, 0xaa, 0xde, 0xfb, 0x81, 0xf0, 0x16, 0x6f, 0xab, 0xee, 0xd5, 0xe0, 0x2c, 0x07, 0xef, 0xd7, 0xd7, 0xeb, 0x8e, 0xd7, 0xef, 0x69, 0x9a, 0x49, 0x45, 0xb4, 0xd0, 0x69, 0xbf, 0x2e, 0xc5, 0xd2, 0xd7, 0xc1, 0xd6, 0xf6, 0xa5, 0x09, 0xe2, 0x36, 0xfd, 0x63, 0xff, 0xc0, 0x45, 0xd2, 0x2d, 0xfc, 0x93, 0x3e, 0xf0, 0x1f, 0x8c, 0x5b, 0xf8, 0x19, 0xf9, 0x50, 0xf5, 0x0a, 0x47, 0x82, 0x3c, 0xeb, 0x3e, 0x33, 0x16, 0x33, 0x8f, 0xd9, 0xe0, 0xce, 0x73, 0x63, 0x26, 0xea, 0x10, 0x7a, 0x73, 0xf1, 0x42, 0x55, 0x80, 0x4b, 0x51, 0xba, 0xb3, 0x73, 0x63, 0xeb, 0x61, 0x21, 0x88, 0xbb, 0x1b, 0x33, 0xb1, 0xeb, 0xe2, 0x09, 0xb9, 0x82, 0x1f, 0xbb, 0x0b, 0xef, 0x65, 0x28, 0xc6, 0x7e, 0x1a, 0x26, - 0x11, 0x9f, 0x78, 0xa8, 0xe6, 0xba, 0xc8, 0xcf, 0xa4, 0xbd, 0xf1, 0x18, 0xe5, 0xbb, 0x57, 0xf8, 0x4c, 0x10, 0xb7, - 0xeb, 0xd6, 0x26, 0xf8, 0x95, 0x20, 0x57, 0xa7, 0xbb, 0x8b, 0x33, 0x91, 0x77, 0xae, 0xf0, 0x59, 0xe1, 0xb1, 0xc7, - 0x6f, 0x88, 0x87, 0x48, 0xe7, 0x4c, 0x43, 0x73, 0xce, 0x27, 0xca, 0x73, 0xef, 0x22, 0xfc, 0x1e, 0xe2, 0x2a, 0x69, - 0xc9, 0x6d, 0x74, 0x68, 0x65, 0x87, 0xb8, 0x5c, 0xba, 0x08, 0xdc, 0xbd, 0x3d, 0xab, 0xac, 0x50, 0x15, 0xf0, 0xad, - 0x20, 0x15, 0x83, 0x1c, 0xbf, 0x95, 0x11, 0x9a, 0x5b, 0xe1, 0xa5, 0xc8, 0x0c, 0xe3, 0x19, 0x3f, 0xb4, 0x3e, 0x9a, + 0x11, 0x9f, 0x78, 0xa8, 0xe6, 0xba, 0xc8, 0xcf, 0xa4, 0xbd, 0xf1, 0x18, 0xe5, 0xbb, 0x57, 0xf8, 0x56, 0x10, 0xb7, + 0xeb, 0xd6, 0x26, 0xf8, 0x95, 0x20, 0x57, 0xa7, 0xbb, 0x8b, 0x5b, 0x91, 0x77, 0xae, 0xf0, 0x6d, 0xe1, 0xb1, 0xc7, + 0x6f, 0x88, 0x87, 0x48, 0xe7, 0x56, 0x43, 0x73, 0xce, 0x27, 0xca, 0x73, 0xef, 0x22, 0xfc, 0x1e, 0xe2, 0x2a, 0x69, + 0xc9, 0x6d, 0x74, 0x68, 0x65, 0x87, 0xb8, 0x5c, 0xba, 0x08, 0xdc, 0xbd, 0x3d, 0xab, 0xac, 0x50, 0x15, 0xf0, 0x99, + 0x20, 0x15, 0x83, 0x1c, 0xbf, 0x95, 0x11, 0x9a, 0x33, 0xe1, 0xa5, 0xc8, 0x0c, 0xe3, 0x19, 0x3f, 0xb4, 0x3e, 0x9a, 0x69, 0x4f, 0x79, 0x18, 0x7c, 0x26, 0x68, 0x1a, 0x0a, 0x9e, 0xf6, 0x91, 0xad, 0x7e, 0xe0, 0xbf, 0x91, 0xab, 0x9e, 0xf3, 0x9f, 0xbe, 0xf8, 0x79, 0xf8, 0x73, 0xda, 0xbf, 0xc2, 0xaf, 0xc9, 0xfe, 0xa9, 0xd7, 0x0d, 0xbc, 0x9d, 0x7a, 0x7d, 0xf9, 0xf3, 0x7e, 0xef, 0x1f, 0x61, 0xfd, 0xd7, 0xb3, 0xfa, 0x4f, 0x7d, 0xb4, 0xf4, 0x7e, 0xde, 0xef, 0xf6, @@ -177,7 +177,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xf2, 0x03, 0x64, 0x81, 0xc0, 0xf3, 0x30, 0x9e, 0xd1, 0x2c, 0xa0, 0x39, 0xc2, 0x03, 0x72, 0x21, 0xbc, 0x26, 0xc2, 0xcf, 0x05, 0xfc, 0x68, 0x21, 0x7c, 0xa1, 0x03, 0x98, 0x70, 0x90, 0x15, 0x51, 0x25, 0x5c, 0x69, 0x2c, 0x2e, 0xc2, 0xd3, 0x0d, 0x95, 0x62, 0x0c, 0xde, 0x05, 0x84, 0x87, 0x95, 0x70, 0x27, 0xbe, 0x21, 0x86, 0x24, 0xde, 0xa5, 0x94, - 0xfe, 0x10, 0xc6, 0x1f, 0x69, 0xea, 0x9d, 0xe1, 0x66, 0xeb, 0x31, 0x96, 0x2e, 0xe8, 0x9d, 0x26, 0x6a, 0x17, 0xb1, + 0xfe, 0x10, 0xc6, 0x1f, 0x69, 0xea, 0xdd, 0xe2, 0x66, 0xeb, 0x31, 0x96, 0x2e, 0xe8, 0x9d, 0x26, 0x6a, 0x17, 0xb1, 0xaa, 0x73, 0xa1, 0x62, 0x04, 0x20, 0x64, 0xab, 0xbe, 0x18, 0xd8, 0xf1, 0x9d, 0x74, 0xcd, 0x61, 0x95, 0x86, 0x37, 0x2e, 0xaa, 0xc6, 0x45, 0x59, 0x32, 0x0f, 0x63, 0x16, 0x39, 0x82, 0x4e, 0xa6, 0x71, 0x28, 0xa8, 0xa3, 0xd7, 0xeb, 0x84, 0x30, 0x90, 0x5b, 0xa8, 0x0c, 0x91, 0x65, 0x70, 0x46, 0x26, 0xe0, 0x04, 0x67, 0xc5, 0x83, 0xe8, 0x94, 0x56, @@ -220,10 +220,10 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x73, 0xd4, 0x69, 0xa0, 0x45, 0xa5, 0xad, 0xd4, 0x99, 0xaa, 0x71, 0xf4, 0x82, 0x4f, 0xcf, 0x49, 0xa3, 0x3d, 0x3f, 0x1d, 0xb5, 0xe7, 0xb5, 0x1a, 0xca, 0x0c, 0x69, 0xcd, 0x7a, 0xf3, 0x3e, 0x7e, 0x03, 0x4e, 0x3d, 0x9b, 0x96, 0x70, 0x65, 0x79, 0x2d, 0xbd, 0xbc, 0x5a, 0x2d, 0xc9, 0x51, 0xdb, 0xea, 0x3a, 0x52, 0x5d, 0xf3, 0x5c, 0xe1, 0x64, 0x95, - 0xd4, 0x4e, 0x90, 0x2c, 0x81, 0x64, 0x28, 0x42, 0xc8, 0x99, 0x40, 0x1b, 0x47, 0x85, 0x31, 0xa1, 0xbb, 0x3c, 0xb3, + 0xd4, 0x4e, 0x90, 0x2c, 0x81, 0x64, 0x28, 0x42, 0xc8, 0xad, 0x40, 0x1b, 0x47, 0x85, 0x31, 0xa1, 0xbb, 0x3c, 0xb3, 0xc0, 0x3e, 0x95, 0x94, 0xf0, 0x00, 0x0b, 0xd0, 0xb5, 0xf0, 0x04, 0x4f, 0xf0, 0xac, 0xd6, 0x94, 0x64, 0x5e, 0x6f, 0xb6, 0xab, 0x63, 0x3d, 0x2a, 0xc7, 0xc2, 0xb3, 0x1a, 0x99, 0x14, 0x58, 0xca, 0x93, 0x5a, 0x2d, 0xaf, 0x06, 0x3b, - 0xcd, 0xc9, 0xad, 0x04, 0x20, 0xce, 0x56, 0x93, 0x32, 0x8c, 0x84, 0x2d, 0x65, 0x2a, 0xf3, 0x59, 0x92, 0xd0, 0x14, + 0xcd, 0xc9, 0xad, 0x04, 0x20, 0x6e, 0x57, 0x93, 0x32, 0x8c, 0x84, 0x2d, 0x65, 0x2a, 0xf3, 0x59, 0x92, 0xd0, 0x14, 0xa4, 0x28, 0x11, 0x98, 0xe5, 0x79, 0x29, 0xd9, 0x41, 0x8c, 0x62, 0x4a, 0x52, 0xe0, 0x3c, 0xd2, 0xee, 0xc2, 0x09, 0xe6, 0x78, 0x2c, 0xf9, 0x06, 0x21, 0xe4, 0xc2, 0xa4, 0xb3, 0x08, 0xc9, 0x83, 0x62, 0xc2, 0x2c, 0x99, 0x94, 0x11, 0xea, 0x5f, 0xee, 0x9e, 0xf3, 0x7b, 0x6d, 0xb2, 0x1e, 0xeb, 0x07, 0xb2, 0x59, 0xac, 0x39, 0x57, 0x48, 0xde, 0x7b, @@ -238,14 +238,14 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x13, 0xf3, 0xec, 0xa5, 0x5f, 0xd6, 0xca, 0xc6, 0x97, 0xbb, 0x67, 0xef, 0x37, 0x35, 0x83, 0xf2, 0x7c, 0x56, 0xda, 0xf8, 0x12, 0xbe, 0x05, 0x8d, 0x83, 0x85, 0x16, 0x0e, 0x01, 0xcb, 0xb1, 0x14, 0x48, 0x41, 0x96, 0x17, 0xae, 0x91, 0xa7, 0x38, 0x21, 0x32, 0x0c, 0x54, 0xdd, 0x35, 0xad, 0xe6, 0x31, 0x9e, 0x5c, 0x0c, 0xf8, 0x94, 0x6e, 0x89, 0x0d, - 0x9d, 0x21, 0x9f, 0x4d, 0x20, 0x75, 0x46, 0x82, 0xce, 0xf0, 0x4e, 0x03, 0xb5, 0xab, 0xe2, 0x2b, 0x91, 0x44, 0xca, + 0xdd, 0x22, 0x9f, 0x4d, 0x20, 0x75, 0x46, 0x82, 0xce, 0xf0, 0x4e, 0x03, 0xb5, 0xab, 0xe2, 0x2b, 0x91, 0x44, 0xca, 0x2b, 0xb2, 0x05, 0x8f, 0x49, 0x03, 0xc7, 0xa4, 0x81, 0x43, 0x92, 0xf5, 0x1a, 0x4a, 0x40, 0xb4, 0xc3, 0x62, 0x5c, 0x25, 0x66, 0x20, 0x2b, 0x4c, 0x9f, 0x56, 0x25, 0x80, 0xa3, 0x76, 0x28, 0x7d, 0x8f, 0x52, 0xa6, 0x47, 0x92, 0x2c, 0xde, 0x7a, 0x1c, 0x73, 0x39, 0xf0, 0x05, 0xbb, 0x8e, 0x21, 0xb1, 0x04, 0x56, 0x85, 0x05, 0x0a, 0x8a, 0xa6, 0x4d, 0xdd, 0x34, 0xf4, 0xe5, 0x3e, 0x71, 0x1c, 0xfa, 0xc0, 0xb9, 0x71, 0xa8, 0xf3, 0x70, 0xb2, 0xf5, 0x2e, 0xc7, 0x7b, 0x7b, 0x9e, 0xea, 0xf4, 0x8b, 0xf0, 0xb8, 0xa9, 0x2f, 0x23, 0x77, 0xdf, 0x2b, 0x5e, 0x11, 0x21, 0x09, 0x7f, 0xad, 0x16, 0xf7, 0x73, 0x08, 0x43, 0x7b, 0x61, 0x15, 0x83, 0x06, 0x78, 0xa9, 0xeb, 0x55, 0x97, 0x5f, 0xab, 0x15, 0x51, - 0xda, 0x2a, 0xb6, 0xce, 0x70, 0x92, 0xcf, 0xbd, 0x22, 0xf5, 0xa7, 0xb1, 0x96, 0x2f, 0x65, 0x40, 0x40, 0xcc, 0xa6, + 0xda, 0x2a, 0xb6, 0x6e, 0x71, 0x92, 0xcf, 0xbd, 0x22, 0xf5, 0xa7, 0xb1, 0x96, 0x2f, 0x65, 0x40, 0x40, 0xcc, 0xa6, 0x59, 0x66, 0x16, 0x63, 0x1d, 0x09, 0x06, 0xed, 0xbe, 0xd1, 0x59, 0x0b, 0x58, 0x66, 0x57, 0xe9, 0x46, 0x86, 0x9d, 0xb5, 0x50, 0x60, 0x1a, 0x41, 0x54, 0x0a, 0x1a, 0xd5, 0x72, 0x4d, 0xde, 0x6f, 0xd7, 0x73, 0x2e, 0x71, 0x86, 0xb4, 0x93, 0x4b, 0x42, 0x21, 0x91, 0xd5, 0x2a, 0x90, 0xf2, 0x9c, 0x4c, 0xb7, 0x93, 0xfc, 0x99, 0x45, 0xf2, 0x4f, 0x08, @@ -268,7 +268,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x36, 0x44, 0x4d, 0xa5, 0xd4, 0x91, 0x2d, 0x50, 0xd1, 0xc1, 0x9f, 0x7b, 0x4c, 0x2b, 0x6e, 0x26, 0x6e, 0x06, 0x0c, 0xf8, 0x89, 0xf0, 0x54, 0x30, 0x0a, 0x64, 0x06, 0xf7, 0x67, 0x5e, 0x65, 0xea, 0x36, 0x97, 0xdd, 0xb0, 0x46, 0xdc, 0xd8, 0x46, 0x13, 0x97, 0x71, 0xbd, 0xf3, 0x92, 0x97, 0x0e, 0x55, 0x06, 0xb5, 0x30, 0x5c, 0xb0, 0x4c, 0x24, 0xb1, - 0x96, 0x3f, 0x54, 0x49, 0xd1, 0x45, 0x23, 0x4c, 0x25, 0x18, 0xef, 0xe4, 0x1e, 0xd0, 0x1c, 0xfe, 0x2e, 0x6e, 0x85, + 0x96, 0x3f, 0x54, 0x49, 0xd1, 0x45, 0x23, 0x4c, 0x25, 0x18, 0xef, 0xe4, 0x1e, 0xd0, 0x1c, 0xfe, 0x2e, 0xce, 0x84, 0xb5, 0xa3, 0xc6, 0x89, 0x2d, 0xe7, 0xb4, 0xa4, 0xfe, 0x5b, 0x48, 0x75, 0x59, 0x3d, 0xf3, 0xcf, 0xa5, 0x2c, 0x64, 0x38, 0xab, 0x30, 0xf6, 0x44, 0x32, 0x76, 0x04, 0x7a, 0x9a, 0x49, 0xfc, 0xee, 0xea, 0x8c, 0x17, 0xa6, 0xa5, 0x9c, 0x26, 0xb1, 0x37, 0x45, 0xb4, 0xdc, 0xfa, 0xbd, 0xb2, 0x1b, 0x01, 0x23, 0x90, 0x05, 0x84, 0x35, 0x67, 0x4f, 0x10, @@ -312,7 +312,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xf1, 0xb5, 0x7b, 0x78, 0x63, 0x02, 0x1e, 0xb4, 0x87, 0x4d, 0x61, 0x19, 0xdb, 0x99, 0xba, 0x07, 0x64, 0x8f, 0x4f, 0xb8, 0xd1, 0xdd, 0xaa, 0x56, 0xc6, 0x1b, 0xb0, 0xff, 0x11, 0x1e, 0x9b, 0xcb, 0x71, 0x54, 0x73, 0x60, 0x1a, 0x2c, 0xf2, 0xc2, 0x29, 0xc0, 0x95, 0xf2, 0x96, 0x22, 0xcc, 0x73, 0x19, 0xe0, 0xfe, 0x16, 0x7f, 0xa7, 0x59, 0xe2, 0xb0, - 0xe0, 0x38, 0xb7, 0x0f, 0xe5, 0x88, 0x0a, 0xfc, 0x22, 0x7e, 0x0f, 0x74, 0x2c, 0x29, 0x34, 0x37, 0x54, 0xf4, 0x94, + 0xe0, 0x38, 0x67, 0x0f, 0xe5, 0x88, 0x0a, 0xfc, 0x22, 0x7e, 0x0f, 0x74, 0x2c, 0x29, 0x34, 0x37, 0x54, 0xf4, 0x94, 0xeb, 0x85, 0x6c, 0x4d, 0x4b, 0xc5, 0xb4, 0x48, 0xa9, 0x91, 0xd3, 0x6c, 0xc8, 0xe3, 0x34, 0x56, 0xb6, 0x28, 0x4e, 0x55, 0x65, 0x5e, 0xb4, 0x05, 0x8b, 0x65, 0x68, 0x71, 0xb9, 0xf4, 0xaa, 0xa8, 0x26, 0xcc, 0x8a, 0x64, 0x20, 0xcc, 0xac, 0x8c, 0x8a, 0x8a, 0x66, 0xad, 0xfa, 0x78, 0x68, 0x35, 0xa1, 0xc8, 0xe8, 0xe6, 0x15, 0x38, 0x6c, 0x17, 0x82, @@ -612,31 +612,32 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xde, 0x0b, 0x3e, 0xda, 0x3c, 0x56, 0xcc, 0x47, 0x5d, 0x79, 0x05, 0x42, 0xdd, 0xb5, 0x35, 0xca, 0x2f, 0x8f, 0xdd, 0xce, 0xa9, 0x56, 0x06, 0x1c, 0x19, 0x0e, 0x77, 0x8f, 0x1a, 0xe6, 0x56, 0x45, 0xcc, 0x47, 0x70, 0x20, 0x55, 0x17, 0x6b, 0x92, 0x8a, 0xc7, 0x7d, 0xdc, 0xec, 0x9c, 0x86, 0x8e, 0xe4, 0x2d, 0x92, 0x79, 0x64, 0xc1, 0x3e, 0x74, 0x1e, - 0xf3, 0x09, 0xf5, 0x19, 0xdf, 0xbf, 0xa1, 0xd7, 0xf5, 0x70, 0xca, 0x4a, 0xf7, 0x36, 0x28, 0x1d, 0xc5, 0x94, 0xbc, - 0x9c, 0x09, 0x7e, 0x86, 0x2b, 0x8b, 0x94, 0x2c, 0x3c, 0xd7, 0xbe, 0x73, 0xb0, 0x55, 0x80, 0x84, 0x5c, 0x47, 0x71, - 0x78, 0xe3, 0x63, 0xd7, 0xb2, 0x37, 0x77, 0x3b, 0xff, 0xfa, 0x3f, 0xfe, 0x97, 0x76, 0x9b, 0x9f, 0xee, 0x8f, 0x9b, - 0x66, 0xac, 0x15, 0x44, 0xe7, 0xa7, 0x70, 0x11, 0xb1, 0x8c, 0xf3, 0xd2, 0xdb, 0xfa, 0x28, 0x65, 0x51, 0x7d, 0x1c, - 0xc6, 0x43, 0xb7, 0xb3, 0x1d, 0x41, 0xf6, 0x0d, 0x24, 0x0d, 0x75, 0xb5, 0x08, 0x48, 0xf0, 0x37, 0xdd, 0xa1, 0x31, - 0x57, 0x31, 0xe4, 0x69, 0xb5, 0x6f, 0xd4, 0x94, 0x07, 0xaa, 0x72, 0xab, 0x26, 0xd5, 0x5f, 0xaf, 0xd2, 0x4c, 0x2d, - 0xad, 0x5c, 0xa6, 0xc9, 0x5d, 0xa7, 0x88, 0x53, 0xfd, 0xdf, 0xff, 0xf9, 0x5f, 0xfe, 0x9b, 0x79, 0x84, 0xf0, 0xd3, - 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, 0x85, 0x0b, 0x18, 0x3a, 0x44, 0x25, 0xf9, 0x84, 0x53, 0xc6, - 0xa7, 0x14, 0xc3, 0x70, 0x20, 0x47, 0x71, 0xc2, 0x32, 0xc1, 0x06, 0xd5, 0xeb, 0x35, 0x17, 0x72, 0x42, 0x79, 0xd8, - 0x34, 0x74, 0xf2, 0xd0, 0xe6, 0x25, 0x8d, 0x54, 0x50, 0x2e, 0x69, 0x31, 0x3f, 0xdd, 0x07, 0x7c, 0x3f, 0xec, 0x46, - 0xa2, 0x5f, 0x6c, 0xc7, 0xc2, 0x38, 0x65, 0xa1, 0x24, 0x2f, 0xcb, 0x1d, 0x08, 0x97, 0x2c, 0xe0, 0x31, 0x68, 0x59, - 0xc5, 0x72, 0xf7, 0x2a, 0x7d, 0xda, 0x1f, 0x66, 0x99, 0x60, 0x43, 0x40, 0xb9, 0x72, 0xfd, 0xca, 0xc8, 0x74, 0x1d, - 0xd4, 0xbf, 0xf8, 0x2e, 0x97, 0xa3, 0x28, 0xdb, 0xfa, 0xf0, 0xe4, 0x4f, 0xf9, 0x5f, 0x26, 0xa0, 0x64, 0x39, 0xde, - 0x24, 0xbc, 0xd5, 0x16, 0xf7, 0x71, 0xa3, 0x31, 0xbd, 0x45, 0x8b, 0x72, 0x06, 0xbc, 0x6d, 0x32, 0xe9, 0x2e, 0xb6, - 0x07, 0x94, 0x21, 0xed, 0xc2, 0x33, 0xdd, 0x70, 0xc0, 0xbd, 0xed, 0x34, 0xf2, 0xfc, 0xcf, 0x0b, 0xe9, 0x1c, 0x65, - 0xbf, 0x42, 0xe8, 0x59, 0xfb, 0x91, 0xaf, 0xb9, 0xbd, 0xb8, 0x85, 0xd5, 0xab, 0xa5, 0x7a, 0x8d, 0x9b, 0xeb, 0x17, - 0xed, 0xec, 0xd0, 0xb9, 0x1d, 0xf4, 0x3e, 0x84, 0x30, 0xf6, 0xb8, 0x89, 0xc7, 0xad, 0x45, 0x31, 0xbc, 0x10, 0x7c, - 0x62, 0xc7, 0xca, 0x69, 0x48, 0x07, 0x74, 0x68, 0xfc, 0xef, 0xba, 0x5e, 0xc5, 0xc1, 0xf3, 0xf1, 0xc1, 0x86, 0xb9, - 0x34, 0x48, 0x32, 0x46, 0xee, 0x34, 0xf2, 0x2f, 0xe1, 0x04, 0x2e, 0x86, 0x31, 0x0f, 0x45, 0x20, 0x09, 0xb6, 0x6d, - 0x47, 0xdc, 0x43, 0x60, 0x33, 0x7c, 0x61, 0xc1, 0xd3, 0x56, 0x4d, 0xc1, 0x13, 0x5e, 0xbd, 0x0e, 0x99, 0xfb, 0xb2, - 0xbb, 0x3d, 0x94, 0x72, 0xa4, 0x7d, 0xaf, 0x03, 0xd9, 0xaf, 0x2a, 0x1e, 0x28, 0x2d, 0x63, 0x5a, 0x68, 0x73, 0xbd, - 0x12, 0xd5, 0xaa, 0xf6, 0x27, 0xe1, 0xb9, 0x12, 0x4c, 0x77, 0xb5, 0x95, 0x2c, 0x84, 0x56, 0xaf, 0xc8, 0xf7, 0x85, - 0x15, 0x14, 0x4e, 0xa7, 0xb2, 0x21, 0x6a, 0x9f, 0xee, 0x2b, 0xe5, 0x15, 0xb8, 0x87, 0xcc, 0xd2, 0x50, 0x49, 0x11, - 0xba, 0x91, 0x3e, 0x0a, 0xea, 0x97, 0x4e, 0x97, 0x80, 0xcf, 0x9a, 0x75, 0xfe, 0x1f, 0xd6, 0xb2, 0x30, 0xa4, 0x67, - 0x88, 0x00, 0x00}; + 0xf3, 0x09, 0xf5, 0x19, 0xdf, 0xbf, 0xa1, 0xd7, 0xf5, 0x70, 0xca, 0x4a, 0xf7, 0x36, 0x28, 0x1d, 0xc5, 0x94, 0xdc, + 0x78, 0xc4, 0xf5, 0x9d, 0xa3, 0x56, 0xe9, 0x6e, 0x3b, 0x04, 0x9b, 0xc7, 0xb8, 0xe6, 0xa4, 0x4f, 0xce, 0x02, 0x8b, + 0x77, 0x4e, 0xf7, 0xc3, 0x15, 0x8c, 0x48, 0x7e, 0x9f, 0x6b, 0x47, 0x3b, 0x18, 0x36, 0x40, 0x6f, 0xae, 0xa3, 0xc4, + 0x81, 0x71, 0xc8, 0x6b, 0x41, 0x9d, 0xbb, 0x9d, 0x7f, 0xfd, 0x1f, 0xff, 0x4b, 0xfb, 0xd8, 0x4f, 0xf7, 0xc7, 0x4d, + 0x33, 0xd6, 0xca, 0xae, 0xe4, 0xa7, 0x70, 0x6b, 0xb1, 0x0c, 0x0a, 0xd3, 0xdb, 0xfa, 0x28, 0x65, 0x51, 0x7d, 0x1c, + 0xc6, 0x43, 0xb7, 0xb3, 0x1d, 0x9b, 0xf6, 0x75, 0x25, 0x0d, 0x75, 0xb5, 0x08, 0xe8, 0xf5, 0x37, 0x5d, 0xb8, 0x31, + 0xf7, 0x36, 0xe4, 0xd1, 0xb6, 0xaf, 0xdf, 0x94, 0xa7, 0xaf, 0x72, 0x05, 0x27, 0xd5, 0x9f, 0xba, 0xd2, 0x1c, 0x30, + 0xad, 0xdc, 0xbc, 0xc9, 0x5d, 0xa7, 0x08, 0x6a, 0xfd, 0xdf, 0xff, 0xf9, 0x5f, 0xfe, 0x9b, 0x79, 0x84, 0x58, 0xd5, + 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, 0x85, 0xdb, 0x1a, 0x3a, 0x9e, 0x25, 0x99, 0x8a, 0x53, 0x06, + 0xb3, 0x14, 0x77, 0x71, 0x20, 0xa1, 0x71, 0xc2, 0x32, 0xc1, 0x06, 0xd5, 0xbb, 0x38, 0x17, 0x72, 0x42, 0x79, 0x32, + 0x35, 0x74, 0xf2, 0x84, 0xe7, 0x25, 0x41, 0x55, 0x50, 0x2e, 0x09, 0x37, 0x3f, 0xdd, 0x07, 0x7c, 0x3f, 0xec, 0xfa, + 0xa2, 0x5f, 0x6c, 0xc7, 0xc2, 0x90, 0x09, 0x94, 0xe4, 0x65, 0xb9, 0x03, 0xb1, 0x95, 0x05, 0x3c, 0x06, 0x2d, 0xab, + 0x58, 0xee, 0x5e, 0xa5, 0x4f, 0xfb, 0xc3, 0x2c, 0x13, 0x6c, 0x08, 0x28, 0x57, 0x7e, 0x62, 0x19, 0xc6, 0xae, 0x83, + 0xae, 0x18, 0xdf, 0xe5, 0x72, 0x14, 0x45, 0xa0, 0x87, 0x27, 0x7f, 0xca, 0xff, 0x32, 0x01, 0x8d, 0xcc, 0xf1, 0x26, + 0xe1, 0xad, 0x36, 0xcf, 0x8f, 0x1b, 0x8d, 0xe9, 0x2d, 0x5a, 0x94, 0x33, 0xe0, 0x6d, 0x93, 0x49, 0x3a, 0xb6, 0x07, + 0x94, 0xf1, 0xef, 0xc2, 0x8d, 0xdd, 0x70, 0xc0, 0x17, 0xee, 0x34, 0xf2, 0xfc, 0xcf, 0x0b, 0xe9, 0x49, 0x65, 0xbf, + 0x42, 0x9c, 0x5a, 0x3b, 0x9d, 0xaf, 0xb9, 0xbd, 0xb8, 0x85, 0xd5, 0xab, 0xa5, 0x7a, 0x8d, 0x9b, 0xeb, 0xb7, 0xf2, + 0xec, 0x38, 0xbb, 0x1d, 0x21, 0x3f, 0x84, 0x98, 0xf7, 0xb8, 0x89, 0xc7, 0xad, 0x45, 0x31, 0xbc, 0x10, 0x7c, 0x62, + 0x07, 0xd6, 0x69, 0x48, 0x07, 0x74, 0x68, 0x9c, 0xf5, 0xba, 0x5e, 0x05, 0xcd, 0xf3, 0xf1, 0xc1, 0x86, 0xb9, 0x34, + 0x48, 0x32, 0xa0, 0xee, 0x34, 0xf2, 0x2f, 0xe1, 0x04, 0x2e, 0x86, 0x31, 0x0f, 0x45, 0x20, 0x09, 0xb6, 0x6d, 0x87, + 0xe7, 0x43, 0xe0, 0x49, 0x7c, 0x61, 0xc1, 0xd3, 0x56, 0x4d, 0xc1, 0x6d, 0x5e, 0xbd, 0x3b, 0x99, 0xfb, 0xb2, 0xbb, + 0x3d, 0x94, 0xf2, 0xba, 0x7d, 0xaf, 0xa3, 0xde, 0xaf, 0x2a, 0xee, 0x2a, 0x2d, 0x90, 0x5a, 0x68, 0x73, 0xbd, 0x92, + 0xeb, 0xaa, 0xf6, 0x27, 0xe1, 0xb9, 0x12, 0x4c, 0x77, 0xb5, 0x95, 0x2c, 0x84, 0x56, 0xaf, 0xc8, 0xf7, 0x85, 0xc9, + 0x14, 0x4e, 0xa7, 0xb2, 0x21, 0x6a, 0x9f, 0xee, 0x2b, 0x4d, 0x17, 0xb8, 0x87, 0x4c, 0xe9, 0x50, 0x19, 0x14, 0xba, + 0x91, 0x3e, 0x0a, 0xea, 0x97, 0xce, 0xad, 0x80, 0x6f, 0xa0, 0x75, 0xfe, 0x1f, 0xa2, 0x48, 0xf6, 0xdd, 0x94, 0x88, + 0x00, 0x00}; } // namespace web_server } // namespace esphome diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h index bde1ce1fb5..0c16ea9f37 100644 --- a/esphome/components/web_server/server_index_v3.h +++ b/esphome/components/web_server/server_index_v3.h @@ -3632,373 +3632,374 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe7, 0xec, 0xd8, 0x98, 0x31, 0x94, 0x4f, 0x43, 0x40, 0x9e, 0xd0, 0xf7, 0x01, 0xcd, 0x25, 0x67, 0x23, 0xad, 0x2b, 0xfb, 0x10, 0x17, 0x97, 0xdc, 0x84, 0x6a, 0x31, 0x6f, 0x2b, 0x3d, 0x2a, 0xc4, 0x1b, 0x16, 0x80, 0x65, 0xe9, 0x69, 0x93, 0x82, 0x6c, 0x94, 0x54, 0x45, 0xfe, 0x13, 0xbf, 0x03, 0xae, 0xad, 0xac, 0xe4, 0x0a, 0x78, 0xf5, 0xff, 0xd3, - 0xdc, 0x93, 0x2e, 0xb7, 0x6d, 0x24, 0xfd, 0x3f, 0x4f, 0x01, 0xc3, 0x5e, 0x87, 0xb0, 0x01, 0x08, 0x00, 0x45, 0x89, - 0x26, 0x45, 0x69, 0x13, 0x1f, 0xb5, 0x4e, 0x29, 0x71, 0xca, 0x56, 0x5c, 0xbb, 0x51, 0x54, 0x22, 0x48, 0x0e, 0x49, - 0xac, 0x41, 0x80, 0x05, 0x80, 0x3a, 0x42, 0x63, 0x9f, 0x65, 0x9f, 0x65, 0x9f, 0xec, 0xab, 0xee, 0x9e, 0x19, 0x0c, - 0x0e, 0x1e, 0x8a, 0x9d, 0xdd, 0xaf, 0x12, 0xdb, 0xc4, 0xdc, 0xd3, 0x33, 0xd3, 0xd3, 0xd3, 0xa7, 0x3f, 0xe3, 0xbc, - 0x17, 0xb3, 0xc5, 0xf6, 0xeb, 0xee, 0xf3, 0x67, 0x66, 0xe3, 0x96, 0x04, 0x82, 0xcf, 0xce, 0xe2, 0xd9, 0x2c, 0x64, - 0x2d, 0x5d, 0x04, 0x0f, 0xd1, 0x4d, 0xd9, 0xcd, 0xd9, 0x23, 0x47, 0x78, 0xec, 0x34, 0xf2, 0x4d, 0x47, 0x4b, 0xcc, - 0x98, 0x49, 0x97, 0x76, 0x44, 0xb9, 0x22, 0x6f, 0xf6, 0x06, 0xc5, 0x1b, 0x7c, 0x5d, 0x8a, 0xa3, 0x6b, 0x4d, 0xe2, - 0xd5, 0x28, 0x64, 0x16, 0x6e, 0x77, 0xe8, 0x72, 0x3d, 0x5a, 0x8d, 0x46, 0x10, 0xa5, 0xe5, 0x91, 0x63, 0x82, 0xdf, - 0x99, 0x38, 0xc5, 0xf7, 0x60, 0x6e, 0xf4, 0x61, 0x52, 0x76, 0x56, 0x1d, 0x3e, 0xe8, 0x8a, 0x00, 0xab, 0x87, 0x3a, - 0xc8, 0xe0, 0xed, 0xd7, 0x70, 0x6a, 0x07, 0xfa, 0x07, 0xd8, 0x7d, 0xa9, 0xde, 0x6f, 0x3a, 0xfa, 0x83, 0x4b, 0xfd, - 0x03, 0xc2, 0x18, 0xa3, 0x17, 0xbf, 0xa4, 0xdd, 0xab, 0x9b, 0x3a, 0x09, 0xbd, 0x57, 0x18, 0xc7, 0x00, 0x98, 0xbe, - 0xaf, 0x02, 0x7f, 0x16, 0xc5, 0x69, 0x16, 0x8c, 0xf5, 0xab, 0xfe, 0xdb, 0xa0, 0x75, 0xb9, 0xc8, 0x5a, 0xc6, 0x95, - 0x39, 0xce, 0xd4, 0x10, 0x28, 0x02, 0x61, 0x62, 0x04, 0x94, 0x4d, 0x85, 0xd4, 0x13, 0xb4, 0xb5, 0xa0, 0x40, 0xcd, - 0x58, 0x68, 0x9c, 0x0d, 0xa0, 0x5c, 0x25, 0x9e, 0x0a, 0x06, 0x86, 0xd2, 0xb1, 0xa6, 0xd1, 0xa7, 0x97, 0xca, 0xcb, - 0xd5, 0x1a, 0xaf, 0xf2, 0xac, 0xb8, 0x2d, 0xd1, 0x07, 0xb0, 0x30, 0x9c, 0xa1, 0xef, 0x47, 0xaa, 0xd2, 0x67, 0xe9, - 0xde, 0x1d, 0x7e, 0x57, 0xa6, 0x0b, 0xe0, 0xfe, 0x06, 0x8d, 0x8b, 0x28, 0xce, 0x34, 0x70, 0x6c, 0x03, 0x3d, 0x0e, - 0xab, 0x4a, 0x62, 0xbc, 0xd5, 0x96, 0x91, 0x73, 0x64, 0xf0, 0x3d, 0x5e, 0x7e, 0x2d, 0xee, 0xde, 0xac, 0xe4, 0xc1, - 0x82, 0x1e, 0x0b, 0x11, 0x2c, 0x60, 0x16, 0x9f, 0xc7, 0xb7, 0x55, 0x39, 0xc8, 0xcb, 0xe1, 0xee, 0xbb, 0xb7, 0x25, - 0xc8, 0x64, 0x11, 0xd5, 0xaf, 0xc5, 0x03, 0x93, 0x0a, 0x42, 0xa7, 0x72, 0xa6, 0x50, 0xf1, 0x43, 0xd0, 0x30, 0x19, - 0xe8, 0x89, 0xe1, 0x5d, 0x00, 0x28, 0x89, 0x5f, 0xd3, 0xc3, 0xfc, 0x5a, 0x84, 0x4e, 0x16, 0x81, 0x8b, 0x95, 0xcb, - 0x19, 0xb0, 0x6b, 0xb4, 0x5c, 0x65, 0xe8, 0x6a, 0x17, 0x06, 0xc0, 0x72, 0x5d, 0x43, 0xd7, 0x9d, 0x80, 0xa5, 0x0b, - 0x32, 0x31, 0xd7, 0xb5, 0x60, 0x52, 0x4f, 0xe3, 0x44, 0x2f, 0x20, 0x2f, 0xc4, 0xef, 0xc8, 0xa8, 0x82, 0xcf, 0x84, - 0x4f, 0x63, 0x6c, 0x16, 0x7e, 0xea, 0x5b, 0x63, 0x14, 0xe8, 0x34, 0x60, 0x86, 0x31, 0xb5, 0xd3, 0x6f, 0x85, 0x8d, - 0x93, 0x05, 0xf7, 0x9b, 0xa5, 0x69, 0x0e, 0x9f, 0xac, 0xa3, 0xfc, 0xec, 0xc9, 0x3a, 0xcd, 0x07, 0x4f, 0xd6, 0xbe, - 0xd4, 0x15, 0xd0, 0x2f, 0x74, 0x52, 0x14, 0x18, 0x22, 0x18, 0x86, 0xf9, 0x75, 0x61, 0xb9, 0x53, 0xcc, 0x17, 0x76, - 0x19, 0xa5, 0x6b, 0x28, 0xba, 0x1f, 0x70, 0x01, 0xfd, 0x32, 0x09, 0x16, 0x7e, 0x72, 0x4f, 0xf2, 0x7c, 0x53, 0x15, - 0xfa, 0x1b, 0xba, 0x46, 0x88, 0x9e, 0x00, 0x40, 0x38, 0x5f, 0xd7, 0xfe, 0x2a, 0xd3, 0x18, 0x9f, 0xad, 0x14, 0x6a, - 0x42, 0x5f, 0xd7, 0xfa, 0x73, 0x66, 0x4f, 0x58, 0xe6, 0x07, 0x21, 0x55, 0xe9, 0x8b, 0x68, 0xf5, 0xb5, 0xe9, 0xa5, - 0xe5, 0xe9, 0x45, 0xe5, 0xfd, 0x83, 0x93, 0xa1, 0x2b, 0x80, 0xc6, 0x8d, 0x33, 0xc3, 0x28, 0x56, 0xcd, 0x2b, 0x4a, - 0x79, 0xff, 0xd5, 0xe5, 0x60, 0xb0, 0x1c, 0x11, 0x2c, 0x07, 0x8b, 0xc6, 0xf1, 0x84, 0xfd, 0xf2, 0xfe, 0xad, 0x0c, - 0x9b, 0x05, 0x1c, 0xa0, 0x21, 0xdf, 0x98, 0x29, 0xd2, 0x0f, 0x09, 0xd2, 0x0e, 0x14, 0xe0, 0x4a, 0x93, 0x5b, 0x28, - 0xc9, 0x75, 0xed, 0x8c, 0xc6, 0xce, 0x26, 0x34, 0xea, 0x41, 0x8c, 0xb5, 0x92, 0xfc, 0xe4, 0x80, 0x4a, 0xd3, 0x6d, - 0x47, 0x85, 0x00, 0x0c, 0x09, 0xcc, 0xb0, 0x80, 0x02, 0x44, 0xf8, 0x1c, 0xb8, 0xc5, 0x83, 0xc2, 0x5e, 0x20, 0x9f, - 0xdd, 0x3d, 0x2b, 0x93, 0x2a, 0x58, 0x4b, 0x3f, 0x3d, 0xc1, 0x98, 0x5d, 0x70, 0x5f, 0x83, 0x97, 0x8f, 0x93, 0x03, - 0xfa, 0xd4, 0x2a, 0x27, 0xa2, 0x68, 0x44, 0x3c, 0xed, 0x7a, 0xbc, 0x81, 0x07, 0x1d, 0x15, 0x08, 0x11, 0x0f, 0xa9, - 0x7e, 0xae, 0x6b, 0x0b, 0x4e, 0x1a, 0x71, 0x77, 0x42, 0xe0, 0x6b, 0xc0, 0x81, 0xb3, 0xab, 0x6b, 0x0b, 0xff, 0x0e, - 0x67, 0x2e, 0x72, 0xfc, 0xbb, 0x96, 0xcb, 0xb3, 0x8a, 0xb3, 0x96, 0x96, 0xcf, 0xda, 0x98, 0x2f, 0x2e, 0x18, 0x12, - 0xc8, 0x97, 0xf5, 0x1c, 0x05, 0xb4, 0x0d, 0x8b, 0x3b, 0x17, 0x8b, 0x3b, 0xd9, 0xb0, 0xb8, 0x93, 0x2d, 0x8b, 0x1b, - 0xf2, 0x85, 0xd4, 0x24, 0xe8, 0x12, 0x34, 0x0e, 0x93, 0xc0, 0xe3, 0x84, 0x46, 0x8f, 0x9f, 0x33, 0x84, 0x93, 0x95, - 0x86, 0xa0, 0x1c, 0xb5, 0x01, 0x56, 0x4d, 0x70, 0x51, 0x00, 0x51, 0x9f, 0xb8, 0x3c, 0x75, 0x62, 0xde, 0x10, 0x83, - 0xb3, 0x15, 0x56, 0xe7, 0x0b, 0xbb, 0x94, 0xe2, 0x8b, 0xb7, 0xe6, 0x1b, 0x66, 0x3a, 0xdf, 0x32, 0xd3, 0x71, 0xe9, - 0xe8, 0xf2, 0x69, 0xd3, 0x21, 0x54, 0x27, 0x05, 0x7b, 0x10, 0x14, 0x46, 0x71, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x1c, - 0xab, 0xec, 0xa8, 0xa5, 0x9f, 0xa6, 0xb7, 0x71, 0x02, 0x12, 0x17, 0x68, 0xe6, 0x61, 0x5b, 0x6a, 0x11, 0x44, 0xdc, - 0x99, 0xcb, 0xc6, 0xcd, 0x54, 0xe4, 0xab, 0x5b, 0xca, 0xeb, 0x74, 0xa8, 0xc4, 0xd2, 0xcf, 0x32, 0x96, 0x20, 0xd0, - 0x7d, 0xf0, 0xfa, 0xfd, 0xff, 0x64, 0x9b, 0x35, 0xe0, 0x90, 0x50, 0xc1, 0xea, 0x88, 0xa1, 0x97, 0x40, 0x5b, 0x25, - 0xe2, 0x22, 0x56, 0x1c, 0xc3, 0x25, 0x12, 0xf0, 0x3f, 0xe1, 0x71, 0x6d, 0x25, 0x8a, 0xe9, 0x92, 0x7b, 0x64, 0xd8, - 0x4b, 0x7f, 0xf2, 0x01, 0x04, 0x7b, 0x2d, 0xcf, 0x04, 0x25, 0x5d, 0xd5, 0x0d, 0x5c, 0x42, 0xc4, 0xde, 0xb8, 0x40, - 0x92, 0x88, 0x25, 0xb9, 0x0a, 0x14, 0x58, 0x4f, 0xfa, 0xd6, 0xf4, 0x6a, 0xed, 0xe5, 0x07, 0xb3, 0xc0, 0xa8, 0x61, - 0x4d, 0x40, 0x6d, 0xe1, 0xe0, 0x54, 0xbe, 0xb9, 0x42, 0xd3, 0x3d, 0x32, 0x80, 0xf3, 0x7b, 0x09, 0xf1, 0x4c, 0x1d, - 0xf1, 0xa0, 0x1d, 0x26, 0x70, 0x6b, 0x5d, 0x3a, 0x57, 0xf9, 0xd3, 0x19, 0xfe, 0x72, 0xaf, 0xf2, 0xa7, 0x23, 0xfc, - 0xe5, 0x5d, 0x61, 0xe4, 0xba, 0x86, 0x87, 0xbc, 0x32, 0x67, 0xfd, 0xb4, 0xb4, 0x9f, 0x48, 0xff, 0xec, 0x01, 0xdb, - 0x86, 0x2f, 0xf0, 0xe3, 0x27, 0xeb, 0x14, 0x2c, 0x2e, 0xd5, 0x39, 0x44, 0x76, 0x62, 0xe4, 0x8d, 0xe9, 0xb3, 0x0d, - 0xe9, 0x23, 0xe3, 0xbf, 0x7c, 0xf1, 0xe3, 0x2e, 0x89, 0x8b, 0x3b, 0xa5, 0xcc, 0x86, 0xb8, 0x1e, 0x05, 0x91, 0x9f, - 0xdc, 0x5f, 0xd3, 0xf3, 0xa2, 0x25, 0x68, 0x77, 0xc9, 0x5e, 0x21, 0xf2, 0xb2, 0x2c, 0xee, 0xca, 0x14, 0x06, 0xef, - 0x3d, 0xbf, 0xe8, 0x07, 0x7f, 0x4f, 0x14, 0xb2, 0xad, 0xf4, 0x00, 0xe5, 0x0b, 0x52, 0xea, 0xe8, 0xfa, 0xc9, 0xba, - 0xc5, 0xea, 0xcd, 0x54, 0x66, 0x5b, 0xa1, 0x0b, 0x61, 0x79, 0xf0, 0x31, 0xbb, 0x98, 0x04, 0x3d, 0x94, 0x67, 0x8d, - 0xe2, 0x3b, 0xeb, 0xc9, 0x3a, 0x3b, 0xd3, 0x17, 0x7e, 0xf2, 0x89, 0x4d, 0xac, 0x71, 0x90, 0x8c, 0x43, 0xa6, 0xf7, - 0xf4, 0x51, 0xe8, 0x47, 0x9f, 0xf8, 0xa7, 0x15, 0xaf, 0x32, 0x94, 0x50, 0xef, 0x7c, 0xfb, 0x0a, 0x98, 0x10, 0xcb, - 0x0e, 0x89, 0xd5, 0x06, 0x28, 0x68, 0x2f, 0x25, 0xc3, 0xab, 0x20, 0x14, 0x8b, 0x52, 0x26, 0x28, 0x58, 0x82, 0xd0, - 0x1c, 0x2c, 0x56, 0x4d, 0x1d, 0xd7, 0x4b, 0x37, 0xd5, 0xa9, 0x12, 0xb3, 0x52, 0x86, 0x5c, 0xbc, 0xc6, 0x16, 0xfe, - 0x78, 0x77, 0x14, 0x0c, 0x7b, 0xff, 0xee, 0x64, 0x2b, 0x5f, 0x36, 0x43, 0x48, 0xb5, 0xc8, 0x52, 0xe2, 0x01, 0x9d, - 0x73, 0x02, 0x73, 0x73, 0xd7, 0x6a, 0x65, 0x3f, 0x4d, 0x57, 0x0b, 0x36, 0x21, 0xc9, 0xe0, 0x59, 0x31, 0xa8, 0xf2, - 0xcb, 0x42, 0x1d, 0xd8, 0x6f, 0x2b, 0xef, 0xf8, 0xf0, 0x25, 0x68, 0x2c, 0x00, 0x41, 0x19, 0x4f, 0xa7, 0x7a, 0xf1, - 0xc6, 0xdf, 0x51, 0xcd, 0x3d, 0xfc, 0x6d, 0xf5, 0xe6, 0xb5, 0xf3, 0x46, 0x56, 0x8e, 0x80, 0x30, 0x16, 0xe2, 0x57, - 0x4e, 0x17, 0x2b, 0xe3, 0x15, 0x33, 0x9a, 0xfa, 0xd1, 0xe6, 0xe9, 0x5c, 0x96, 0xb6, 0xf8, 0x92, 0xb1, 0x09, 0x10, - 0xdc, 0x66, 0x2d, 0xf5, 0x3a, 0x64, 0x37, 0x4c, 0x8a, 0x76, 0xeb, 0x9d, 0x35, 0xd4, 0x40, 0xdf, 0x73, 0x5c, 0x64, - 0xcc, 0xa9, 0x3a, 0x65, 0x4a, 0x43, 0x9c, 0x03, 0x9f, 0xb9, 0x7a, 0xc4, 0x2a, 0x47, 0x6a, 0x68, 0xea, 0xca, 0x00, - 0x36, 0x8e, 0xec, 0x6c, 0x43, 0x7a, 0x0f, 0x03, 0x4f, 0x37, 0x8f, 0xcd, 0x74, 0x8d, 0x1e, 0xf8, 0xea, 0xe6, 0x70, - 0x0a, 0xe1, 0xe4, 0xb5, 0x0a, 0x76, 0xc8, 0x26, 0x88, 0x35, 0x31, 0xc9, 0x74, 0xe2, 0xbe, 0x08, 0x6d, 0x47, 0x54, - 0xfb, 0x15, 0x7c, 0xa8, 0xc6, 0xb5, 0xd1, 0xca, 0x33, 0x1f, 0x61, 0x40, 0xd7, 0x88, 0xa5, 0xe9, 0x46, 0x80, 0xc9, - 0x45, 0x37, 0xf5, 0xa2, 0x74, 0x19, 0x1e, 0x45, 0xba, 0xe9, 0x98, 0x40, 0x12, 0xe0, 0x04, 0xab, 0x7d, 0xe1, 0xf5, - 0x72, 0xbd, 0xe0, 0xfa, 0x2a, 0xc9, 0x6c, 0xa4, 0x73, 0x5d, 0x82, 0x4d, 0xf9, 0xb7, 0x3a, 0x1f, 0x54, 0xe9, 0x9a, - 0x6e, 0x1c, 0x5a, 0xab, 0x84, 0x7a, 0x6b, 0xec, 0x22, 0x6c, 0x40, 0x8c, 0xa9, 0x82, 0x5f, 0xd9, 0x74, 0xca, 0xc6, - 0x59, 0x6a, 0x08, 0xe6, 0x91, 0xf4, 0x1e, 0x0b, 0x56, 0x43, 0x8f, 0x06, 0xfa, 0x4f, 0x60, 0x43, 0x2f, 0x9c, 0x2c, - 0xf1, 0x01, 0x89, 0x37, 0x53, 0x33, 0x98, 0xa8, 0xc5, 0x32, 0x88, 0x78, 0x2f, 0x10, 0x1c, 0xbc, 0x21, 0x1d, 0x87, - 0xc6, 0xef, 0x9f, 0x62, 0x5f, 0xc4, 0x52, 0xab, 0x65, 0x3b, 0x2a, 0xda, 0x76, 0x7c, 0xd7, 0xee, 0x9b, 0x8e, 0xeb, - 0xe4, 0xba, 0x09, 0xb6, 0x5b, 0x9f, 0xf6, 0x3d, 0xf4, 0x58, 0xab, 0x0d, 0xb5, 0x56, 0xd1, 0x43, 0xea, 0x79, 0xee, - 0x0b, 0x57, 0x37, 0x49, 0x65, 0x4e, 0xc1, 0x6d, 0xe3, 0xf8, 0x86, 0x25, 0x5f, 0x3c, 0x95, 0x72, 0xe3, 0xfb, 0x8d, - 0xe7, 0xc8, 0x75, 0x00, 0x09, 0x67, 0xf1, 0xf2, 0x01, 0x53, 0x68, 0xeb, 0xa6, 0x3e, 0x0e, 0xe3, 0x94, 0xa9, 0x73, - 0x20, 0x26, 0xc8, 0x17, 0x4e, 0xe2, 0xe7, 0xf7, 0xaf, 0x3f, 0x7c, 0xd0, 0x4d, 0x8c, 0x04, 0x9a, 0xaa, 0xad, 0xf3, - 0x0d, 0xb5, 0x03, 0xfb, 0x37, 0xee, 0x3b, 0xba, 0x61, 0xe8, 0x51, 0x5b, 0xde, 0x73, 0x94, 0x56, 0xdb, 0x72, 0xfc, - 0xe6, 0xe1, 0x3d, 0xd3, 0x4b, 0x74, 0xaf, 0x79, 0x35, 0xe0, 0x86, 0xed, 0xd7, 0x5b, 0x29, 0x65, 0x11, 0x44, 0xd7, - 0x0d, 0xa9, 0xfe, 0x5d, 0x43, 0x2a, 0x3c, 0xe5, 0x6a, 0xb8, 0x6a, 0x15, 0x2f, 0x14, 0xd2, 0x00, 0x02, 0x39, 0xef, - 0x02, 0x97, 0xf2, 0x9e, 0xfa, 0x82, 0x41, 0x73, 0x4f, 0xee, 0xd5, 0x51, 0x37, 0x24, 0xf3, 0x47, 0x90, 0x84, 0xed, - 0x38, 0x04, 0x85, 0x3f, 0xa6, 0x4a, 0xe5, 0xca, 0x64, 0xa3, 0x54, 0xd7, 0x55, 0x1a, 0x21, 0xf2, 0xf6, 0x3a, 0x63, - 0x8b, 0x25, 0x4b, 0xfc, 0x6c, 0x95, 0xb0, 0xeb, 0x30, 0xbe, 0x7d, 0x54, 0xa8, 0xd3, 0xef, 0x28, 0x3c, 0x0f, 0x66, - 0x73, 0x59, 0xfa, 0xac, 0xc5, 0x06, 0x72, 0x01, 0xb7, 0x76, 0x90, 0xff, 0xe7, 0xdf, 0xb6, 0xfd, 0x9f, 0x7f, 0xef, - 0x2c, 0x0a, 0xcd, 0xe7, 0x43, 0x33, 0x1b, 0xec, 0xb1, 0x2f, 0x9a, 0x7b, 0x2a, 0xc3, 0xbc, 0xb9, 0x4c, 0x6d, 0x11, - 0x20, 0xbf, 0xb6, 0x04, 0xb5, 0xc4, 0xf2, 0xbe, 0x79, 0xd0, 0xc0, 0x60, 0x5e, 0x3b, 0x47, 0x06, 0x85, 0xbe, 0x68, - 0x68, 0x43, 0xa3, 0xb7, 0xd7, 0x8a, 0xfc, 0x71, 0x08, 0xef, 0x9a, 0xc3, 0x17, 0x0e, 0x9f, 0xf3, 0x25, 0x5f, 0x0e, - 0x87, 0x32, 0xb6, 0x9c, 0x5a, 0x15, 0x54, 0xfc, 0xcf, 0x6a, 0x29, 0xfc, 0xf2, 0xec, 0x39, 0x06, 0xd9, 0xde, 0x0f, - 0x5e, 0x0e, 0x51, 0x19, 0xed, 0x64, 0x94, 0x14, 0xc4, 0xca, 0x46, 0xd4, 0x46, 0xca, 0xe4, 0xb5, 0x46, 0x6b, 0x78, - 0x0d, 0x52, 0x31, 0xe0, 0x58, 0x3e, 0x34, 0xcc, 0x97, 0x43, 0xce, 0x58, 0xe2, 0xfa, 0xaf, 0xbd, 0xea, 0xd6, 0xe6, - 0x6c, 0xd9, 0x12, 0xd0, 0x4d, 0x8d, 0xe4, 0x3f, 0x58, 0x98, 0x15, 0x7c, 0x3c, 0x64, 0xf0, 0x03, 0x47, 0x61, 0x98, - 0x63, 0xbc, 0x93, 0x77, 0x9b, 0x74, 0xc4, 0x7e, 0xde, 0xad, 0x23, 0x76, 0xb1, 0x97, 0x8e, 0xd8, 0xcf, 0x5f, 0x5d, - 0x47, 0xec, 0x9d, 0xaa, 0x23, 0x06, 0x8b, 0xf8, 0x9a, 0xed, 0xa5, 0xb8, 0x25, 0xb4, 0x36, 0xe2, 0xdb, 0x74, 0xe0, - 0x72, 0x92, 0x36, 0x1d, 0xcf, 0x19, 0xf0, 0x08, 0xf8, 0xaa, 0x84, 0xf1, 0x0c, 0x94, 0xb8, 0xfe, 0x7c, 0x75, 0xab, - 0x30, 0x9e, 0xa9, 0xca, 0x56, 0x11, 0xf7, 0xf8, 0x5a, 0x78, 0x71, 0x22, 0x05, 0x27, 0xc7, 0x14, 0x3e, 0x9f, 0xac, - 0x43, 0x43, 0x89, 0x6a, 0x2d, 0xb5, 0xd7, 0x3c, 0xa1, 0x02, 0xd5, 0x43, 0xed, 0x29, 0x59, 0xd1, 0x7b, 0x2e, 0x7c, - 0x5b, 0xa8, 0x2d, 0x48, 0x2d, 0x61, 0xf2, 0x13, 0xb1, 0xd6, 0x7f, 0xbb, 0x73, 0xbf, 0xbf, 0x74, 0xfb, 0x6d, 0x17, - 0x8c, 0xb3, 0xe1, 0x85, 0x89, 0x09, 0x4e, 0xbf, 0xdd, 0x86, 0x84, 0x5b, 0x25, 0xc1, 0x83, 0x84, 0x40, 0x49, 0xe8, - 0x40, 0xc2, 0x58, 0x49, 0x38, 0x82, 0x84, 0x89, 0x92, 0x70, 0x0c, 0x09, 0x37, 0x7a, 0x7e, 0x19, 0xc9, 0xe1, 0x1e, - 0x1b, 0x57, 0x26, 0x3d, 0x2a, 0x44, 0xda, 0xb1, 0xe9, 0x82, 0xd6, 0x94, 0x3f, 0xeb, 0xc5, 0x26, 0x71, 0x17, 0x7b, - 0x89, 0x79, 0x3b, 0x67, 0xe4, 0x28, 0xfa, 0x15, 0xde, 0x39, 0x76, 0x16, 0x83, 0xde, 0xb4, 0x70, 0xc0, 0x20, 0xe0, - 0xa0, 0xe9, 0x06, 0x30, 0x8c, 0xfa, 0x72, 0xe5, 0x84, 0x13, 0x0b, 0x65, 0x2d, 0x8b, 0x3c, 0xea, 0xce, 0x92, 0x5b, - 0xa0, 0xd0, 0x38, 0x69, 0xa9, 0x5c, 0xc9, 0xaf, 0xa1, 0x77, 0xf0, 0x8a, 0x8d, 0x56, 0x33, 0xed, 0x3c, 0x9e, 0xed, - 0x54, 0x21, 0x50, 0xb3, 0x60, 0x94, 0x3a, 0x89, 0x5f, 0x2c, 0xb1, 0x2d, 0x79, 0x5f, 0xf4, 0x99, 0x97, 0xcb, 0x67, - 0x30, 0x36, 0x2d, 0x23, 0x05, 0x16, 0xe8, 0x07, 0x60, 0xa4, 0xc8, 0xf0, 0xcf, 0x01, 0xce, 0xca, 0xf7, 0x85, 0xaf, - 0x8c, 0xe7, 0xf4, 0x47, 0x96, 0xa6, 0xfe, 0x4c, 0x94, 0xaf, 0x8f, 0x13, 0x94, 0x76, 0xe4, 0xfb, 0x0b, 0x01, 0x08, - 0x9c, 0xbc, 0xa0, 0xa6, 0x9b, 0x91, 0xc4, 0xb7, 0x1a, 0x68, 0xff, 0xc0, 0x86, 0x2a, 0xf4, 0x14, 0x02, 0x1b, 0x96, - 0xb0, 0xac, 0x51, 0x00, 0x87, 0xff, 0x86, 0x85, 0xd5, 0xc4, 0xcc, 0x9f, 0x55, 0x93, 0x68, 0x1f, 0xe4, 0xea, 0xd8, - 0xa4, 0x40, 0xbf, 0x94, 0xf8, 0x25, 0x12, 0xea, 0x30, 0x9e, 0xfd, 0xa9, 0xe2, 0xe9, 0x2d, 0x6a, 0x05, 0x1f, 0x22, - 0x33, 0xc8, 0x86, 0x36, 0xc2, 0x58, 0xb3, 0x01, 0x84, 0xbd, 0x28, 0x9b, 0x5b, 0x68, 0x5a, 0xd6, 0xf2, 0x22, 0xc3, - 0xb4, 0x71, 0x6d, 0xd7, 0x55, 0x83, 0xda, 0x5e, 0x32, 0x1b, 0xf9, 0x2d, 0xd7, 0x3b, 0x36, 0xc5, 0x1f, 0xdb, 0xe9, - 0x18, 0x39, 0xb6, 0xa0, 0x4d, 0x82, 0x9b, 0xf5, 0x34, 0x8e, 0x32, 0x6b, 0xea, 0x2f, 0x82, 0xf0, 0xbe, 0xb7, 0x88, - 0xa3, 0x38, 0x5d, 0xfa, 0x63, 0xd6, 0x2f, 0x1e, 0xd4, 0x7d, 0x74, 0xd5, 0xc0, 0xad, 0x05, 0x5d, 0xdb, 0x4b, 0xd8, - 0x82, 0x6a, 0x4b, 0x4f, 0x0c, 0xd3, 0x90, 0xdd, 0xe5, 0xbc, 0xfb, 0x52, 0x61, 0x2a, 0x8a, 0x5b, 0x8e, 0x6a, 0x00, - 0x45, 0xca, 0xdd, 0x3c, 0x80, 0x73, 0xa3, 0xfe, 0xd2, 0x9f, 0xa0, 0x67, 0x42, 0xdb, 0xeb, 0x24, 0x6c, 0xa1, 0xd9, - 0x9d, 0x8d, 0x8d, 0x27, 0xf1, 0xed, 0x29, 0x8c, 0x16, 0x2b, 0x5b, 0x29, 0x0b, 0xa7, 0x98, 0x63, 0xa1, 0x65, 0x89, - 0x68, 0xc7, 0xc2, 0x87, 0x38, 0xb4, 0xc6, 0x16, 0x7d, 0xc8, 0xee, 0x79, 0x9a, 0xd3, 0x5f, 0x04, 0x91, 0x45, 0xd3, - 0x39, 0x76, 0x96, 0x4a, 0x5b, 0x2a, 0xfc, 0x8c, 0x35, 0x16, 0x77, 0x35, 0xa7, 0x0f, 0x8f, 0xb5, 0x69, 0x18, 0xdf, - 0xf6, 0xe6, 0xc1, 0x64, 0xc2, 0xa2, 0x3e, 0x8e, 0x59, 0x26, 0xb2, 0x30, 0x0c, 0x96, 0x69, 0x90, 0xf6, 0x17, 0xfe, - 0x1d, 0x6f, 0xf5, 0x70, 0x53, 0xab, 0x6d, 0xde, 0x6a, 0x7b, 0xef, 0x56, 0x95, 0x66, 0xc0, 0x8a, 0x85, 0xda, 0xe1, - 0x43, 0xeb, 0x68, 0x4e, 0x65, 0x9e, 0x7b, 0xb7, 0xba, 0x4c, 0xd8, 0x7a, 0xe1, 0x27, 0xb3, 0x20, 0xea, 0x39, 0xb9, - 0x7d, 0xb3, 0xa6, 0x8d, 0xf1, 0xb8, 0xdb, 0xed, 0xe6, 0xf6, 0x44, 0x7c, 0x39, 0x93, 0x49, 0x6e, 0x8f, 0xc5, 0xd7, - 0x74, 0xea, 0x38, 0xd3, 0x69, 0x6e, 0x07, 0x22, 0xa1, 0xed, 0x8d, 0x27, 0x6d, 0x2f, 0xb7, 0x6f, 0x95, 0x12, 0xb9, - 0xcd, 0xf8, 0x57, 0xc2, 0x26, 0x7d, 0xdc, 0x48, 0xa4, 0x56, 0xda, 0x3b, 0x76, 0x9c, 0x1c, 0x31, 0xc0, 0x65, 0x09, - 0x37, 0x21, 0xaf, 0xe7, 0x6a, 0xbd, 0x77, 0x49, 0xad, 0xe8, 0x6e, 0x3c, 0x6e, 0x2c, 0x37, 0xf1, 0x93, 0x4f, 0x57, - 0x9a, 0x32, 0x0b, 0xdf, 0xa7, 0x62, 0x6b, 0x01, 0x06, 0xeb, 0xae, 0x07, 0x2e, 0xbb, 0xfa, 0xa3, 0x38, 0x81, 0x33, - 0x9b, 0xf8, 0x93, 0x60, 0x95, 0xf6, 0x5c, 0x6f, 0x79, 0x27, 0x92, 0xf8, 0x5e, 0x2f, 0x12, 0xf0, 0xec, 0xf5, 0xd2, - 0x38, 0x0c, 0x26, 0x22, 0x69, 0xd3, 0x59, 0x72, 0x3d, 0xa3, 0x8f, 0x06, 0xeb, 0x01, 0xba, 0x5d, 0xf0, 0xc3, 0x50, - 0xb3, 0xdb, 0xa9, 0xc6, 0xfc, 0x14, 0xf9, 0xcb, 0x9a, 0x93, 0x12, 0x5c, 0xd0, 0x38, 0xdd, 0x3d, 0x5c, 0xde, 0xc9, - 0x3d, 0xef, 0x1e, 0x2d, 0xef, 0xf2, 0xbf, 0x2e, 0xd8, 0x24, 0xf0, 0xb5, 0x56, 0xb1, 0x9b, 0x5c, 0x07, 0x78, 0xd0, - 0xc6, 0x7a, 0xc3, 0x36, 0x15, 0xc7, 0x02, 0x5c, 0x1b, 0x3e, 0x0a, 0x16, 0xcb, 0x38, 0xc9, 0xfc, 0x28, 0xcb, 0xf3, - 0xe1, 0x55, 0x9e, 0xf7, 0x2f, 0x82, 0xd6, 0xe5, 0x3f, 0x5a, 0x74, 0x4f, 0x93, 0xcc, 0x26, 0x37, 0xae, 0xcc, 0xd7, - 0x4c, 0xd5, 0x19, 0x81, 0x6b, 0x0c, 0xf5, 0x45, 0xd4, 0xc2, 0x74, 0x4b, 0xd6, 0x0b, 0x13, 0x90, 0x65, 0x71, 0xd2, - 0x41, 0x29, 0x17, 0xc1, 0x1b, 0x08, 0x0a, 0xbc, 0x66, 0x83, 0x0b, 0x45, 0xff, 0x04, 0x88, 0x15, 0x2c, 0x4c, 0x76, - 0x05, 0x4f, 0x36, 0xd1, 0x8c, 0xdf, 0xed, 0xa6, 0x19, 0x7f, 0xcd, 0xf6, 0xa1, 0x19, 0xbf, 0xfb, 0xea, 0x34, 0xe3, - 0x93, 0xba, 0x5d, 0xc1, 0xdb, 0x78, 0xa0, 0x4b, 0x09, 0x03, 0x5c, 0x4d, 0x09, 0x79, 0xec, 0x79, 0xfb, 0x87, 0xcd, - 0x00, 0x44, 0x6b, 0x14, 0x83, 0x8e, 0x6e, 0x6e, 0xe0, 0xc7, 0xbe, 0x8b, 0x06, 0x7f, 0x4f, 0xd4, 0xef, 0xe9, 0x74, - 0xf0, 0x2a, 0x56, 0x12, 0xe4, 0x17, 0x57, 0xbe, 0x28, 0x79, 0x57, 0xa0, 0x1c, 0xa1, 0x85, 0x89, 0xf1, 0x27, 0xc0, - 0x38, 0x9b, 0xb4, 0x8e, 0x27, 0x52, 0xfb, 0xac, 0x5f, 0x1e, 0x42, 0x4b, 0xaa, 0x7c, 0x0a, 0x13, 0x9c, 0x1a, 0x2b, - 0x71, 0xc6, 0x32, 0x6e, 0x33, 0xfb, 0xfd, 0xfd, 0xdb, 0x49, 0xeb, 0x6d, 0x6c, 0xe4, 0x41, 0xfa, 0xae, 0x6a, 0x00, - 0xc3, 0x65, 0x3f, 0x03, 0x75, 0x3a, 0x39, 0xd7, 0x20, 0x53, 0x03, 0x4c, 0x43, 0x36, 0x55, 0x3f, 0x2b, 0xcd, 0xb4, - 0xa7, 0x56, 0xe4, 0x81, 0xae, 0x6a, 0x97, 0x31, 0xb7, 0x3e, 0x58, 0x73, 0x0a, 0x10, 0x63, 0x77, 0xa1, 0xdd, 0xf0, - 0x84, 0xaa, 0x07, 0x93, 0x3c, 0x37, 0xfa, 0x02, 0x10, 0xca, 0x45, 0xcb, 0x76, 0x11, 0x71, 0xe9, 0xad, 0xd4, 0x69, - 0xe0, 0x12, 0x42, 0x12, 0xff, 0xbd, 0x05, 0x81, 0x3a, 0x17, 0x16, 0x72, 0x98, 0xe9, 0x1a, 0x81, 0x8f, 0x14, 0x2d, - 0x94, 0x09, 0x81, 0x04, 0x58, 0xc2, 0x5f, 0x64, 0x89, 0x84, 0xba, 0x0e, 0x27, 0x01, 0x07, 0x35, 0x02, 0xc0, 0xca, - 0x5f, 0xf0, 0xb5, 0x09, 0xed, 0xf0, 0x32, 0xf8, 0x91, 0xeb, 0x92, 0xf6, 0xc3, 0xed, 0x77, 0x7a, 0x72, 0x00, 0x15, - 0x4e, 0x2b, 0x8a, 0x03, 0x3b, 0x34, 0x14, 0x81, 0x94, 0x48, 0x6f, 0x4d, 0x3b, 0xbd, 0xd5, 0x9e, 0xad, 0x85, 0x87, - 0x8c, 0xcc, 0x5f, 0x5a, 0xf0, 0xc4, 0x47, 0xdc, 0xcb, 0x31, 0x9e, 0xe2, 0x8c, 0xa3, 0xbf, 0x4a, 0x01, 0x37, 0xe2, - 0x43, 0x15, 0xf1, 0x4f, 0x7f, 0xbc, 0x4a, 0xd2, 0x38, 0xe9, 0x2d, 0xe3, 0x20, 0xca, 0x58, 0x92, 0x23, 0xa8, 0x2e, - 0x11, 0x3e, 0x02, 0x3c, 0x57, 0xeb, 0x78, 0xe9, 0x8f, 0x83, 0xec, 0xbe, 0xe7, 0x70, 0x92, 0xc2, 0xe9, 0x73, 0xea, - 0xc0, 0x69, 0x2c, 0xdf, 0xe3, 0xd0, 0x7c, 0x8e, 0x84, 0x5f, 0x52, 0x27, 0x67, 0xd4, 0x6d, 0xde, 0x57, 0x72, 0xc9, - 0x47, 0x08, 0x90, 0x1f, 0x7e, 0x62, 0xcd, 0x00, 0xcb, 0xc3, 0x52, 0x3b, 0x13, 0x36, 0x33, 0x11, 0x6b, 0x03, 0x5f, - 0x5e, 0xfc, 0xb1, 0x3b, 0x86, 0xe6, 0x34, 0x27, 0x03, 0xc5, 0x63, 0xec, 0x33, 0xb2, 0x9e, 0x0f, 0x11, 0xb5, 0xcc, - 0x7d, 0x4a, 0x8e, 0xd8, 0x34, 0x4e, 0x18, 0xf9, 0x93, 0x75, 0xbb, 0xcb, 0xbb, 0xfd, 0x9b, 0xdf, 0x3e, 0xfd, 0xe6, - 0x76, 0xa2, 0x38, 0x6b, 0x89, 0xc6, 0x8c, 0x1d, 0xad, 0xd5, 0xef, 0x33, 0x20, 0x0d, 0x09, 0xf2, 0x63, 0x72, 0xdd, - 0xd5, 0xd3, 0xf5, 0x7e, 0xa3, 0xdb, 0xae, 0x65, 0xcc, 0xef, 0xbc, 0x84, 0x85, 0x7e, 0x16, 0xdc, 0x08, 0x9a, 0xb1, - 0x7d, 0xb4, 0xbc, 0x13, 0x6b, 0x8c, 0x17, 0xde, 0x03, 0x16, 0xa9, 0x32, 0x14, 0xb1, 0x48, 0xd5, 0x64, 0x5c, 0xa4, - 0x7e, 0x6d, 0x36, 0xc2, 0x93, 0x45, 0xe5, 0xa6, 0xef, 0x2c, 0xef, 0xd4, 0x2b, 0xba, 0xa8, 0x26, 0x6f, 0xea, 0xaa, - 0x0b, 0xb2, 0x45, 0x30, 0x99, 0x84, 0x2c, 0x2f, 0x2d, 0x74, 0x79, 0x2d, 0x15, 0xe0, 0x48, 0x38, 0xf8, 0xa3, 0x34, - 0x0e, 0x57, 0x19, 0x6b, 0x06, 0x17, 0x01, 0xc7, 0x73, 0x0a, 0xe0, 0xe0, 0xef, 0xf2, 0x58, 0x3b, 0x40, 0x6e, 0xc3, - 0x36, 0x71, 0xfa, 0xe0, 0x71, 0xd8, 0x6a, 0x97, 0x87, 0x0e, 0x59, 0x72, 0xd0, 0x66, 0xc3, 0x44, 0x4c, 0xb8, 0x96, - 0x08, 0x7b, 0x6b, 0xb6, 0xcb, 0xd3, 0xa4, 0xd7, 0x55, 0x99, 0x94, 0x97, 0x27, 0xf3, 0xe7, 0x9c, 0xb1, 0x17, 0xcd, - 0x67, 0xec, 0x85, 0x38, 0x63, 0xdb, 0x77, 0xe6, 0xe3, 0xa9, 0x0b, 0xff, 0xf5, 0x8b, 0x09, 0xf5, 0x1c, 0xad, 0xbd, - 0xbc, 0xd3, 0xdc, 0xe5, 0x9d, 0x66, 0x79, 0xcb, 0x3b, 0x0d, 0x9b, 0x46, 0x7d, 0x10, 0xd3, 0xf6, 0x0c, 0xd3, 0xd1, - 0x20, 0x11, 0xfe, 0x38, 0xa5, 0x2c, 0xf7, 0x10, 0xf2, 0xa0, 0x56, 0xa7, 0x9e, 0xe7, 0x6d, 0x3f, 0xea, 0x74, 0x96, - 0x04, 0xd2, 0x36, 0xec, 0xcc, 0x1f, 0x8d, 0xd8, 0xa4, 0x37, 0x8d, 0xc7, 0xab, 0xf4, 0x5f, 0x7c, 0xfc, 0x1c, 0x88, - 0x5b, 0x11, 0x41, 0xa5, 0x1d, 0x51, 0x15, 0x04, 0x25, 0x37, 0x4c, 0xb4, 0xb0, 0x96, 0xeb, 0xd4, 0x23, 0xf7, 0xc8, - 0x9e, 0x7d, 0xd8, 0xb0, 0xc9, 0x9b, 0x01, 0xfd, 0xa7, 0xad, 0xd2, 0x66, 0x14, 0xf3, 0x05, 0x60, 0xd9, 0x0a, 0x8e, - 0x87, 0x43, 0x83, 0xaf, 0xa6, 0xd3, 0x6d, 0x1e, 0xee, 0xa5, 0xe8, 0xe9, 0x4a, 0x5c, 0x2a, 0xfc, 0xde, 0xe2, 0x86, - 0x29, 0xdb, 0x5b, 0xdd, 0xb4, 0x47, 0x6a, 0xad, 0x6e, 0xb9, 0x10, 0x8a, 0xb2, 0x7b, 0x62, 0xf9, 0xc7, 0x2f, 0x0e, - 0xe1, 0x3f, 0xa2, 0xea, 0x7f, 0xcd, 0x9a, 0x08, 0xf5, 0xb7, 0x65, 0x4d, 0x70, 0x22, 0x95, 0x90, 0x10, 0xdf, 0xbf, - 0xfc, 0x74, 0xfa, 0xb0, 0x0a, 0x7b, 0x97, 0x26, 0x55, 0xaa, 0x6a, 0xe9, 0xef, 0xe3, 0x18, 0x42, 0x77, 0xd6, 0x8b, - 0x0b, 0xf0, 0x90, 0xb2, 0x7b, 0x36, 0x80, 0x4a, 0xe2, 0x1d, 0x41, 0x52, 0x7c, 0x1d, 0xeb, 0xd0, 0x53, 0xe2, 0xf5, - 0xa6, 0xa7, 0xc4, 0xab, 0xdd, 0x4f, 0x89, 0x1f, 0xf6, 0x7a, 0x4a, 0xbc, 0xfa, 0xea, 0x4f, 0x89, 0xd7, 0xf5, 0xa7, - 0xc4, 0x45, 0x2c, 0xf4, 0x67, 0xcd, 0xb7, 0x2b, 0xfe, 0xf3, 0x23, 0x09, 0xe5, 0xce, 0xe3, 0x41, 0xc7, 0x21, 0x97, - 0xc7, 0x17, 0x7f, 0xf8, 0x61, 0x81, 0x1b, 0xf1, 0x3d, 0xaa, 0x93, 0x15, 0x4f, 0x0b, 0x8e, 0xd9, 0xb1, 0x1f, 0x25, - 0x39, 0x8c, 0xa3, 0xd9, 0xcf, 0x20, 0x94, 0x05, 0x76, 0x60, 0xa2, 0x64, 0x04, 0xe9, 0xcf, 0xf1, 0x72, 0xb5, 0x7c, - 0x0b, 0x6d, 0x7d, 0x0c, 0xd2, 0x60, 0x14, 0x32, 0x69, 0x89, 0x4c, 0xea, 0x6f, 0x9c, 0x27, 0x0e, 0x1a, 0xa7, 0xe2, - 0xa7, 0x7f, 0x27, 0x7e, 0xa2, 0x4e, 0x2a, 0xff, 0x4d, 0x7a, 0x75, 0x7a, 0xf3, 0x43, 0x44, 0x08, 0x01, 0x95, 0x41, - 0x3f, 0xfc, 0x31, 0x72, 0x11, 0x1b, 0x0d, 0xb3, 0x14, 0xfa, 0x0e, 0x1b, 0xdb, 0x61, 0xb5, 0x47, 0xcd, 0xca, 0x30, - 0xa5, 0x0b, 0xae, 0x3a, 0x1b, 0x7e, 0x11, 0xaf, 0x52, 0x36, 0x89, 0x6f, 0x23, 0xdd, 0x8c, 0xa4, 0x91, 0x01, 0x48, - 0x38, 0x65, 0x1d, 0x0c, 0x1e, 0xf9, 0x01, 0x09, 0xe5, 0x38, 0x69, 0xe9, 0x10, 0xbb, 0x74, 0xb5, 0xb4, 0x48, 0xd4, - 0x6c, 0xe1, 0x14, 0x75, 0x19, 0xe5, 0xe8, 0x51, 0xab, 0x15, 0x0f, 0x1e, 0x56, 0x53, 0xa8, 0x6a, 0xc4, 0x36, 0xe7, - 0x0a, 0xa7, 0xad, 0x48, 0x30, 0x17, 0x85, 0x1f, 0x8c, 0x86, 0x85, 0xe3, 0x39, 0x64, 0xba, 0x5a, 0xe4, 0x82, 0x17, - 0x91, 0x7c, 0xc5, 0xd7, 0x83, 0x7b, 0x85, 0xa0, 0xcf, 0x97, 0x0a, 0x18, 0xdf, 0xdd, 0xb0, 0x24, 0xf4, 0xef, 0x5b, - 0x46, 0x1e, 0x47, 0x3f, 0x02, 0x00, 0x5e, 0xc5, 0xb7, 0x91, 0x5a, 0x00, 0x83, 0xb5, 0x34, 0xec, 0xa5, 0x46, 0xff, - 0x25, 0x60, 0xb8, 0xa2, 0x8c, 0x00, 0xc2, 0xe4, 0xce, 0xd8, 0xdf, 0x4d, 0xfa, 0xf7, 0x1f, 0x46, 0x6e, 0x9e, 0xc7, - 0xb2, 0xa3, 0x5f, 0x96, 0x7b, 0x74, 0xf3, 0xf4, 0xe9, 0xa3, 0xcd, 0xd3, 0x2e, 0x87, 0x67, 0x6f, 0xa8, 0x6d, 0x6c, - 0x3c, 0x05, 0x30, 0x8a, 0x8b, 0x78, 0x35, 0x9e, 0xa3, 0xa2, 0xeb, 0xd7, 0x9b, 0x6f, 0x06, 0x6d, 0x62, 0x94, 0x52, - 0x39, 0xf5, 0x4a, 0x52, 0x01, 0x05, 0xec, 0xff, 0x35, 0x38, 0xe0, 0xfc, 0x1f, 0x82, 0xa1, 0xbe, 0x6b, 0xf8, 0x2b, - 0x3e, 0x78, 0xd8, 0xe6, 0xed, 0x43, 0x30, 0x4d, 0xee, 0xda, 0x42, 0x08, 0xd7, 0x9a, 0x91, 0x4c, 0x5e, 0x05, 0x9a, - 0xea, 0x46, 0x6e, 0x93, 0x87, 0x3c, 0xd1, 0x0b, 0xb3, 0xe9, 0x99, 0xce, 0x0d, 0x0d, 0x4c, 0xc6, 0xb1, 0x55, 0x05, - 0xc9, 0x70, 0x95, 0x07, 0x86, 0xe8, 0xab, 0x9a, 0xb7, 0x08, 0x22, 0x13, 0xbd, 0xc0, 0xd7, 0x73, 0xfc, 0x3b, 0xf0, - 0x83, 0x0c, 0xc8, 0xad, 0x9a, 0x05, 0x89, 0xa6, 0x6a, 0x37, 0x07, 0xa1, 0x9e, 0xf4, 0x46, 0x48, 0x08, 0x29, 0xde, - 0xf0, 0x1b, 0x4d, 0xd3, 0x34, 0xf9, 0x8c, 0xd0, 0xe4, 0x3b, 0x02, 0xd3, 0xf1, 0x39, 0x00, 0xd2, 0x92, 0x7c, 0x79, - 0x47, 0x29, 0xf0, 0x32, 0x40, 0x99, 0xac, 0x48, 0xe0, 0xae, 0xfe, 0x3a, 0x8e, 0x48, 0x10, 0x0f, 0x7a, 0x70, 0xd3, - 0xe6, 0x27, 0xe0, 0x11, 0xb8, 0xa7, 0xe1, 0x83, 0x1d, 0x73, 0x39, 0x27, 0x58, 0x73, 0xe8, 0x73, 0xd8, 0x67, 0xcd, - 0x3e, 0xe1, 0x22, 0x05, 0x0b, 0x82, 0xd4, 0xa1, 0xe2, 0xe2, 0xd9, 0x64, 0x0d, 0xb8, 0x11, 0xdf, 0x45, 0x77, 0xd9, - 0x82, 0x45, 0x2b, 0x1d, 0x63, 0x42, 0xa1, 0x8f, 0x3e, 0x28, 0xf3, 0x8a, 0x88, 0x2d, 0xc0, 0x36, 0xcd, 0x35, 0xe7, - 0x74, 0x17, 0xa6, 0x1c, 0xa5, 0xfa, 0xe6, 0x98, 0x0b, 0x36, 0x53, 0x8e, 0xdb, 0xaa, 0x37, 0x04, 0x5f, 0xd2, 0xb8, - 0x6a, 0xc8, 0x45, 0x9a, 0xd0, 0xd0, 0x06, 0x79, 0xc7, 0xe0, 0xec, 0x22, 0x01, 0xf6, 0x96, 0x5f, 0x5d, 0x34, 0x29, - 0x91, 0xf1, 0x2b, 0x8c, 0xa2, 0xc4, 0xa8, 0x37, 0xc3, 0xc7, 0x09, 0x8e, 0x89, 0x36, 0xb6, 0x33, 0xae, 0xb5, 0xb3, - 0x61, 0xd2, 0x9f, 0xd8, 0x3d, 0x5d, 0x24, 0x04, 0xaa, 0x4f, 0xec, 0x1e, 0x74, 0xff, 0x5e, 0x03, 0x37, 0x45, 0xdf, - 0x82, 0xae, 0x4d, 0x70, 0xf5, 0x3f, 0x06, 0x67, 0x55, 0x5b, 0x0e, 0x90, 0x93, 0x6f, 0xc1, 0xe2, 0x08, 0x62, 0x88, - 0xea, 0x2c, 0x0e, 0x31, 0x57, 0xf1, 0x6f, 0x35, 0xc2, 0xd8, 0x6a, 0x38, 0x1a, 0xc6, 0x33, 0xd7, 0x71, 0x0e, 0x6a, - 0xe5, 0x81, 0x91, 0xdd, 0x54, 0xda, 0x30, 0xb3, 0x81, 0xeb, 0x58, 0xc1, 0x33, 0xdb, 0xeb, 0xd7, 0xee, 0x68, 0xc5, - 0x97, 0xe4, 0x10, 0xd9, 0x5f, 0xa7, 0x4f, 0xd6, 0xad, 0xda, 0x81, 0x34, 0xaa, 0x2a, 0xf3, 0x38, 0xb6, 0x9c, 0xf3, - 0xbf, 0x86, 0xf5, 0xab, 0x9f, 0x3c, 0x59, 0x52, 0x5c, 0x93, 0x21, 0x78, 0x43, 0x6e, 0xc1, 0x31, 0xfa, 0x8b, 0xf6, - 0x5c, 0x6b, 0xd1, 0xf1, 0x31, 0x8c, 0xa1, 0x0c, 0x97, 0x2d, 0x6c, 0xca, 0xd4, 0x06, 0x2a, 0x3d, 0xa6, 0x55, 0x0c, - 0xc7, 0xfd, 0xae, 0xb2, 0x42, 0xa2, 0xb7, 0x95, 0x5a, 0xc0, 0xf6, 0x37, 0x5c, 0x9f, 0xf6, 0x08, 0xfc, 0x12, 0x40, - 0x09, 0xf0, 0x9d, 0xbe, 0xb3, 0xc1, 0xd5, 0xb2, 0xdc, 0x5c, 0xf9, 0x92, 0xdc, 0xbf, 0x31, 0xbc, 0x74, 0x50, 0x86, - 0x26, 0xdb, 0x6b, 0xbe, 0xee, 0x1e, 0xd8, 0x24, 0x8b, 0x26, 0xe5, 0x06, 0x2b, 0xf7, 0xd7, 0xfe, 0xcd, 0x95, 0x30, - 0x0a, 0x04, 0x15, 0x88, 0x1b, 0x30, 0x4a, 0x1e, 0x47, 0xb8, 0xf9, 0xe9, 0xb8, 0x05, 0x7b, 0x51, 0x31, 0x58, 0x81, - 0x3c, 0x82, 0xc9, 0x6a, 0x0a, 0x53, 0x1c, 0x3c, 0x57, 0xa3, 0x59, 0x70, 0x4b, 0x10, 0xa2, 0x1b, 0x77, 0x62, 0x26, - 0x74, 0x0a, 0x8b, 0x3a, 0x01, 0xf7, 0x45, 0xb9, 0x2f, 0xd7, 0x3a, 0xd8, 0xcd, 0xb5, 0xce, 0x76, 0x71, 0xad, 0xc9, - 0x9c, 0xea, 0x36, 0xf1, 0x97, 0x8a, 0x45, 0x9e, 0x20, 0xce, 0x55, 0xc3, 0xbc, 0x12, 0xab, 0x1b, 0xad, 0xaf, 0x44, - 0xad, 0x5a, 0x6b, 0xa4, 0x25, 0x88, 0xec, 0x6f, 0xe5, 0x81, 0x22, 0x04, 0xea, 0x2a, 0x6f, 0xfc, 0xa2, 0xe0, 0x8d, - 0xd3, 0xab, 0xa6, 0x30, 0xa4, 0x11, 0xd4, 0xbf, 0x62, 0xa4, 0x26, 0x5f, 0x07, 0x85, 0xb1, 0x5a, 0x31, 0x52, 0xc5, - 0xfc, 0xaa, 0x78, 0x68, 0x28, 0x46, 0x7d, 0xe2, 0x95, 0x51, 0xb6, 0xed, 0x2b, 0x17, 0x2d, 0xac, 0xaf, 0x8a, 0x74, - 0xe0, 0xba, 0xe3, 0x90, 0x65, 0xb2, 0xba, 0x6d, 0xca, 0xe6, 0x37, 0x6a, 0xb6, 0xb2, 0x49, 0xa4, 0x9d, 0x0c, 0x01, - 0x58, 0xb0, 0xe9, 0x2b, 0x72, 0x6d, 0xa9, 0x03, 0x81, 0x83, 0x6c, 0x30, 0xeb, 0xdb, 0xcd, 0x9d, 0xa7, 0x78, 0x09, - 0x85, 0x14, 0x5e, 0xe5, 0x41, 0x20, 0x7c, 0xaf, 0xd6, 0x0d, 0xb7, 0x3c, 0x5e, 0xf2, 0xfc, 0x7e, 0x07, 0xf6, 0xa2, - 0xe6, 0xa8, 0x82, 0x7c, 0x3c, 0x99, 0x16, 0xa9, 0xe7, 0x62, 0xd1, 0x7a, 0xa3, 0xc4, 0xc4, 0x59, 0x73, 0xcb, 0x98, - 0x32, 0x8f, 0x9e, 0x97, 0xe8, 0x89, 0x7e, 0xf9, 0xd6, 0x49, 0x56, 0x11, 0xfa, 0xb6, 0xb7, 0xb2, 0xc4, 0x1f, 0x7f, - 0x52, 0x86, 0x2c, 0xf8, 0x9c, 0xc0, 0x03, 0x2e, 0x4b, 0x0a, 0xfa, 0x3e, 0xba, 0x82, 0x64, 0x3d, 0xdb, 0x4b, 0x15, - 0xee, 0x4b, 0xef, 0xb1, 0xd3, 0xf6, 0x5f, 0x4c, 0x0f, 0x2b, 0x4c, 0x51, 0xaf, 0x53, 0x66, 0x99, 0x6f, 0x18, 0x47, - 0x36, 0x5f, 0x2d, 0x46, 0x6b, 0x95, 0xb7, 0xaa, 0xb0, 0x5c, 0xeb, 0x6c, 0x56, 0xb5, 0xdb, 0xe9, 0x74, 0x5a, 0x66, - 0x34, 0x3a, 0xda, 0x21, 0x32, 0x0b, 0x1f, 0x3b, 0x8e, 0x53, 0x1d, 0xfb, 0x76, 0xb0, 0x5b, 0xc8, 0xb7, 0xed, 0x36, - 0x8e, 0x18, 0x61, 0xbb, 0x0b, 0x7e, 0x75, 0x70, 0xe4, 0x76, 0x71, 0xb2, 0x4b, 0x6a, 0x11, 0x7d, 0x52, 0x86, 0x08, - 0x32, 0xb6, 0x48, 0x7b, 0x63, 0x86, 0x32, 0x18, 0x5b, 0x39, 0xd0, 0xa8, 0x38, 0x60, 0xcd, 0x40, 0x55, 0xc4, 0x15, - 0xbb, 0xc2, 0xd1, 0x90, 0x1f, 0x5e, 0x63, 0xde, 0x8b, 0x4e, 0xf0, 0xa0, 0xac, 0xeb, 0x3c, 0x6d, 0x9c, 0x56, 0xc7, - 0xf9, 0x4b, 0xa9, 0x9c, 0x06, 0x17, 0xe0, 0x5a, 0x08, 0xb4, 0x89, 0x3f, 0x8b, 0x7f, 0x4b, 0xfe, 0xff, 0x8b, 0xe5, - 0x5d, 0x59, 0x7f, 0xa4, 0x0b, 0x1c, 0xed, 0xe2, 0xb4, 0xd0, 0xa8, 0x9b, 0xf6, 0x80, 0xd4, 0x32, 0x98, 0xaa, 0x02, - 0x74, 0x10, 0xd2, 0x97, 0x02, 0x80, 0x34, 0xb0, 0xdf, 0x91, 0x62, 0x86, 0x25, 0x2e, 0x58, 0x88, 0x45, 0xf8, 0x3a, - 0x98, 0x83, 0xf9, 0xbc, 0x8b, 0xf2, 0x83, 0xd2, 0x9e, 0x00, 0x69, 0x7c, 0x6d, 0x6e, 0x7b, 0xb1, 0xfb, 0xab, 0x72, - 0x2d, 0xd1, 0x30, 0x80, 0xcc, 0x85, 0x43, 0x88, 0x8a, 0x04, 0x5a, 0x65, 0x73, 0xd3, 0x28, 0x65, 0xae, 0x2a, 0x67, - 0x13, 0x03, 0xc3, 0xe6, 0x9a, 0x8b, 0x50, 0xdb, 0x42, 0x5a, 0x00, 0x93, 0xe5, 0xdb, 0x0f, 0xbf, 0x2d, 0x58, 0x62, - 0x75, 0x3f, 0xba, 0xb8, 0xe4, 0xb8, 0x7f, 0x2d, 0xbc, 0x3b, 0x53, 0x3a, 0xff, 0xc8, 0x5f, 0xfc, 0xa1, 0x91, 0xa1, - 0x77, 0x51, 0xe2, 0xd0, 0x71, 0x6d, 0x71, 0xcf, 0xd8, 0xab, 0xf4, 0x22, 0x88, 0xf6, 0x2f, 0xeb, 0xdf, 0xed, 0x5d, - 0x16, 0x2e, 0x8c, 0xbd, 0x0b, 0xc3, 0x8d, 0x43, 0x9a, 0x0b, 0xd9, 0xe0, 0x07, 0x85, 0xa1, 0xa8, 0x5a, 0x1d, 0xeb, - 0x58, 0x8b, 0xa8, 0xfc, 0x8b, 0xd5, 0x60, 0x78, 0x72, 0x76, 0xb7, 0x08, 0xb5, 0x1b, 0x96, 0x40, 0x68, 0x9f, 0x81, - 0xee, 0xda, 0x8e, 0xae, 0xa1, 0x0d, 0x6d, 0x10, 0xcd, 0x06, 0xfa, 0x2f, 0x17, 0x6f, 0xac, 0xae, 0x7e, 0x06, 0x22, - 0xda, 0x9b, 0x19, 0x5e, 0x7b, 0xe7, 0xfe, 0x3d, 0x4b, 0xae, 0x3d, 0x5d, 0xc3, 0x08, 0x3e, 0x74, 0xe1, 0x61, 0x9a, - 0xe6, 0xe9, 0x7b, 0x04, 0x8a, 0xd0, 0x44, 0xac, 0x37, 0x1d, 0x50, 0x8e, 0xeb, 0x75, 0x35, 0xd7, 0x3b, 0xb4, 0x8f, - 0xba, 0xfa, 0xe9, 0x37, 0x9a, 0x76, 0x32, 0x61, 0xd3, 0xf4, 0x14, 0x9f, 0x68, 0x27, 0x78, 0x47, 0xd0, 0x6f, 0x4d, - 0xb3, 0xc7, 0x61, 0x6a, 0xb9, 0xda, 0x9a, 0x7f, 0x6a, 0xda, 0x34, 0x08, 0xc3, 0x9e, 0xf6, 0x78, 0xea, 0x4d, 0x0f, - 0xa7, 0x2f, 0xfa, 0x3c, 0x39, 0xff, 0xa6, 0x54, 0xdc, 0xa4, 0x7f, 0x3d, 0xa5, 0x5a, 0x9a, 0x25, 0xf1, 0x27, 0xc6, - 0xd5, 0x4e, 0x34, 0xf9, 0x78, 0xac, 0x56, 0xf5, 0xea, 0x3d, 0xb9, 0xdd, 0xd1, 0x78, 0xea, 0x15, 0xc5, 0x71, 0x8c, - 0x07, 0x72, 0x90, 0x27, 0x07, 0x62, 0xe8, 0x27, 0x2a, 0x98, 0x5c, 0xab, 0x09, 0x50, 0xae, 0xce, 0xe7, 0x38, 0x13, - 0xf3, 0x3b, 0x01, 0x3f, 0x8c, 0xd2, 0x5c, 0x17, 0x46, 0xa0, 0x6b, 0x93, 0x81, 0xfe, 0xa3, 0xeb, 0x75, 0x4d, 0xd7, - 0x3d, 0xb2, 0x8f, 0xba, 0x63, 0xc7, 0x3c, 0xb4, 0x0f, 0xad, 0xb6, 0x7d, 0x64, 0x76, 0xad, 0xae, 0xd9, 0xfd, 0x5b, - 0x77, 0x6c, 0x1d, 0xda, 0x87, 0xa6, 0x63, 0x75, 0x21, 0xd1, 0xea, 0x5a, 0xdd, 0x1b, 0xeb, 0xb0, 0x3b, 0x76, 0x30, - 0xd5, 0xb3, 0x3b, 0x1d, 0xcb, 0x75, 0xec, 0x4e, 0xc7, 0xec, 0xd8, 0x47, 0x47, 0x96, 0xdb, 0xb6, 0x8f, 0x8e, 0xce, - 0x3b, 0x5d, 0xbb, 0x0d, 0x79, 0xed, 0xf6, 0xb8, 0x6d, 0xbb, 0xae, 0x05, 0x7f, 0x99, 0x5d, 0xdb, 0xa3, 0x1f, 0xae, - 0x6b, 0xb7, 0x5d, 0xd3, 0x09, 0x3b, 0x9e, 0x7d, 0xf4, 0xc2, 0xc4, 0xbf, 0xb1, 0x98, 0x89, 0x7f, 0x41, 0x33, 0xe6, - 0x0b, 0xdb, 0x3b, 0xa2, 0x5f, 0xd8, 0xe0, 0xcd, 0x61, 0xf7, 0x57, 0xfd, 0x60, 0xe3, 0x1c, 0x5c, 0x9a, 0x43, 0xb7, - 0x63, 0xb7, 0xdb, 0xe6, 0xa1, 0x6b, 0x77, 0xdb, 0x73, 0xeb, 0xd0, 0xb3, 0x8f, 0x8e, 0xc7, 0x96, 0x6b, 0x1f, 0x1f, - 0x9b, 0x8e, 0xd5, 0xb6, 0x3d, 0xd3, 0xb5, 0x0f, 0xdb, 0xf8, 0xa3, 0x6d, 0x7b, 0x37, 0xc7, 0x2f, 0xec, 0xa3, 0xce, - 0xfc, 0xc8, 0x3e, 0xfc, 0x78, 0xd8, 0xb5, 0xbd, 0xf6, 0xbc, 0x7d, 0x64, 0x7b, 0xc7, 0x37, 0x47, 0xf6, 0xe1, 0xdc, - 0xf2, 0x8e, 0xb6, 0xd6, 0x74, 0x3d, 0x1b, 0x60, 0x84, 0xd9, 0x90, 0x61, 0xf2, 0x0c, 0xf8, 0x33, 0xc7, 0xba, 0xff, - 0xc5, 0x66, 0xd2, 0x7a, 0xd5, 0x17, 0x76, 0xf7, 0x78, 0x4c, 0xc5, 0x21, 0xc1, 0x12, 0x25, 0xa0, 0xca, 0x8d, 0x45, - 0xdd, 0x62, 0x73, 0x96, 0x68, 0x48, 0xfc, 0xe1, 0x9d, 0xdd, 0x58, 0xd0, 0x31, 0xf5, 0xfb, 0x3f, 0x6d, 0x47, 0x2e, - 0x39, 0x44, 0xae, 0xfc, 0x86, 0xff, 0x43, 0x41, 0x5f, 0x86, 0xe6, 0xf9, 0x26, 0x41, 0xc5, 0xfb, 0xdd, 0x82, 0x8a, - 0x37, 0xab, 0x7d, 0x04, 0x15, 0xef, 0xbf, 0xba, 0xa0, 0xe2, 0xbc, 0xaa, 0x27, 0xff, 0xbe, 0xea, 0x9b, 0xfe, 0xd7, - 0x75, 0xf5, 0x19, 0x12, 0xf8, 0xad, 0xcb, 0x8b, 0xd5, 0x15, 0x78, 0x57, 0x7a, 0x1f, 0x0f, 0xde, 0xac, 0x4a, 0x4a, - 0x60, 0x31, 0xe0, 0xd8, 0xf7, 0x31, 0xe1, 0xd8, 0xdf, 0x57, 0x03, 0xd0, 0x3c, 0xe1, 0x74, 0x49, 0x30, 0xb1, 0xe6, - 0x7e, 0x38, 0x95, 0x34, 0x0d, 0xa4, 0xf4, 0x31, 0x19, 0xac, 0x12, 0xe0, 0xba, 0x06, 0x71, 0xd8, 0x6a, 0x11, 0xa5, - 0xbd, 0x23, 0x07, 0x2e, 0x52, 0x6f, 0x9a, 0xe4, 0x95, 0xca, 0xb6, 0xf0, 0x47, 0x75, 0xcd, 0xad, 0x26, 0x36, 0xe6, - 0xa3, 0x52, 0x60, 0x73, 0xeb, 0x6e, 0xbd, 0x5d, 0x0d, 0xb4, 0x6d, 0x84, 0xd2, 0x24, 0x90, 0x73, 0x4d, 0xf9, 0x65, - 0xd5, 0xbc, 0x8a, 0x32, 0xe6, 0xe6, 0x91, 0xc2, 0x48, 0xaa, 0xf5, 0xdd, 0xb2, 0x6a, 0xdf, 0xae, 0x69, 0x36, 0x74, - 0x5f, 0xaa, 0xbe, 0x45, 0xaf, 0x50, 0x36, 0x5c, 0x05, 0x55, 0x25, 0xb2, 0x5a, 0x23, 0x40, 0x0a, 0xea, 0xbe, 0x50, - 0x3e, 0x2c, 0x48, 0x4b, 0x47, 0x43, 0x7a, 0xc7, 0x51, 0xf2, 0x4a, 0x6d, 0xaa, 0x0a, 0x8b, 0xcf, 0xd6, 0x48, 0x71, - 0x07, 0xbf, 0x03, 0xe9, 0xc8, 0x29, 0x9e, 0x51, 0xac, 0xc2, 0x79, 0xad, 0xb4, 0x4b, 0x8f, 0x99, 0x7c, 0xee, 0xae, - 0xeb, 0xc4, 0xe3, 0x46, 0x55, 0x65, 0x97, 0x2d, 0x04, 0x15, 0x84, 0xdd, 0x93, 0x62, 0x70, 0x4e, 0xca, 0xdb, 0xa8, - 0xfb, 0xbc, 0xad, 0x31, 0x51, 0xee, 0x31, 0x6c, 0x62, 0x93, 0x7f, 0xa8, 0x7e, 0x01, 0xd6, 0x53, 0x88, 0x82, 0xdd, - 0x43, 0x32, 0x4d, 0xa1, 0x51, 0x3d, 0xd4, 0x62, 0xee, 0x6f, 0x51, 0xb0, 0x51, 0x1b, 0xe6, 0x8d, 0xa0, 0x36, 0xf4, - 0x36, 0x9d, 0x1c, 0x69, 0x3c, 0xb2, 0x2e, 0x89, 0xa8, 0xdd, 0xce, 0xb1, 0xe9, 0x1e, 0x99, 0xf6, 0x71, 0xc7, 0xc8, - 0xc5, 0x81, 0x53, 0x9b, 0x2c, 0x01, 0x04, 0x94, 0xa2, 0xe5, 0x30, 0x83, 0x28, 0xc8, 0x02, 0x3f, 0xcc, 0x81, 0x3e, - 0x2e, 0xbf, 0x2a, 0xfe, 0xb9, 0x4a, 0x33, 0x98, 0xa3, 0x20, 0x7a, 0x51, 0x21, 0xdc, 0x1a, 0xb1, 0xec, 0x96, 0xb1, - 0x68, 0x83, 0xb0, 0xbc, 0xaa, 0x5f, 0xfe, 0xe7, 0x69, 0xdb, 0xe6, 0xa4, 0xc9, 0x32, 0xca, 0x22, 0xbe, 0x3f, 0x84, - 0x32, 0x74, 0x3e, 0x34, 0x7f, 0xda, 0x84, 0x70, 0xff, 0xb9, 0x1b, 0xe1, 0x66, 0x6c, 0x1f, 0x84, 0xfb, 0xcf, 0xaf, - 0x8e, 0x70, 0x7f, 0x52, 0x11, 0x6e, 0xc9, 0x16, 0xa8, 0xe0, 0x3a, 0x7f, 0xc0, 0xef, 0x16, 0x38, 0x75, 0x7e, 0xae, - 0x1f, 0x10, 0x01, 0xaf, 0x2b, 0xc1, 0x76, 0x3f, 0x96, 0xa2, 0x07, 0x21, 0x53, 0x04, 0x9d, 0xd0, 0x52, 0xa4, 0x12, - 0x08, 0x44, 0x2b, 0x43, 0xaa, 0x43, 0x9b, 0x6f, 0xa3, 0x2c, 0xb4, 0xdf, 0xf3, 0x87, 0x1f, 0x08, 0x79, 0xde, 0xc4, - 0xc9, 0xc2, 0x47, 0x07, 0x7c, 0x3a, 0x46, 0x1d, 0x84, 0x0f, 0x07, 0xec, 0xcf, 0xc6, 0x71, 0x34, 0x91, 0x92, 0x0a, - 0x36, 0xb8, 0x24, 0x8a, 0x5b, 0xbf, 0x67, 0x7e, 0xa2, 0x9b, 0x94, 0x0d, 0x8b, 0xfb, 0xac, 0xed, 0x3c, 0xf3, 0x0e, - 0x9f, 0x1d, 0x39, 0xf0, 0xbf, 0xcb, 0xda, 0xb9, 0xc9, 0x0b, 0x2e, 0xe2, 0x08, 0x02, 0x9f, 0x88, 0x92, 0x9b, 0x8a, - 0xdd, 0x32, 0xf6, 0xa9, 0x28, 0x75, 0xdc, 0x5c, 0x68, 0xe2, 0xdf, 0x17, 0x65, 0x1a, 0x4b, 0xcc, 0xe3, 0x95, 0x32, - 0xac, 0x86, 0xd1, 0x04, 0xd1, 0x0a, 0x78, 0x6f, 0x4a, 0x09, 0x35, 0x9b, 0x4f, 0xb7, 0x98, 0x17, 0x6b, 0xe7, 0x57, - 0x45, 0x74, 0x25, 0x11, 0xe5, 0x65, 0x27, 0x04, 0xb9, 0xd8, 0xc2, 0x41, 0xdf, 0xec, 0x18, 0x5f, 0x48, 0x83, 0xd8, - 0x86, 0x62, 0x81, 0x7c, 0x5a, 0xa0, 0x2c, 0x59, 0x45, 0xe3, 0x16, 0xfe, 0xf4, 0x47, 0x69, 0x2b, 0x38, 0x00, 0xef, - 0xac, 0xd8, 0xb1, 0x81, 0xab, 0xe6, 0x9f, 0x3a, 0x45, 0x28, 0x8a, 0x54, 0xac, 0x8a, 0xff, 0x2c, 0x33, 0x13, 0x0a, - 0x60, 0x8b, 0x4b, 0x6b, 0x0d, 0xfc, 0x67, 0xb2, 0xe2, 0xb3, 0xcc, 0x84, 0x20, 0xb2, 0xb0, 0xdc, 0x4f, 0x9f, 0x52, - 0x29, 0x08, 0xeb, 0x48, 0xd3, 0x3a, 0x1b, 0x17, 0xee, 0xdd, 0x34, 0x7f, 0x16, 0x93, 0x87, 0xb7, 0xde, 0xd8, 0x8c, - 0x9f, 0x3f, 0x3f, 0x1d, 0xb8, 0x06, 0x0f, 0x4a, 0x5a, 0x8a, 0xa0, 0x75, 0xbe, 0x9f, 0xf2, 0x81, 0xd1, 0x68, 0x16, - 0xb7, 0x84, 0x37, 0x93, 0x23, 0x54, 0x94, 0x39, 0xf6, 0x82, 0x88, 0x16, 0x24, 0x64, 0xf4, 0x85, 0x12, 0x80, 0x28, - 0x23, 0x5f, 0x5d, 0x6d, 0xdb, 0xb1, 0x1d, 0x5d, 0x56, 0x9c, 0x06, 0xb3, 0xc1, 0x3a, 0xce, 0x7c, 0x88, 0x0d, 0x14, - 0xc6, 0x33, 0xb0, 0xad, 0xc9, 0x82, 0x2c, 0x84, 0x40, 0x33, 0x60, 0x64, 0xb3, 0xa0, 0x77, 0x79, 0xce, 0x35, 0x9e, - 0xfd, 0xe4, 0x13, 0x06, 0x1b, 0x14, 0x66, 0x75, 0xe8, 0x71, 0xe8, 0x47, 0xb8, 0x0c, 0x5b, 0x7a, 0x0b, 0x42, 0x5d, - 0xb2, 0x24, 0xb5, 0x54, 0x0b, 0x82, 0x9e, 0x06, 0x75, 0x20, 0x0c, 0x3d, 0x36, 0x30, 0x4d, 0xfc, 0x05, 0xf8, 0x64, - 0x5f, 0xe7, 0x26, 0xc7, 0xb4, 0x3a, 0x47, 0xb5, 0x9a, 0xfb, 0xe2, 0xc8, 0xd4, 0x3c, 0xd7, 0xd4, 0x1c, 0x40, 0xb7, - 0x7a, 0x6e, 0xae, 0xf3, 0xab, 0xfe, 0x2e, 0x21, 0x28, 0xe1, 0x97, 0xc7, 0x34, 0x0f, 0x12, 0x7f, 0x72, 0xf6, 0x72, - 0x46, 0x0e, 0x24, 0x5b, 0x8a, 0xb7, 0xf4, 0x80, 0x04, 0x21, 0x17, 0xec, 0x2e, 0x33, 0x30, 0x10, 0x0b, 0x2f, 0x12, - 0x18, 0x6b, 0x34, 0xfe, 0x0b, 0x22, 0x2d, 0xf8, 0xfc, 0xb9, 0x15, 0x80, 0x81, 0xc3, 0x40, 0x81, 0x0f, 0x7c, 0x1b, - 0x25, 0x80, 0x05, 0x85, 0xe8, 0x0e, 0x81, 0x05, 0xd6, 0x47, 0xf0, 0x6f, 0x91, 0x2c, 0x7e, 0x70, 0xd1, 0xa9, 0x1d, - 0xfa, 0xd1, 0x0c, 0x50, 0x9a, 0x1f, 0xcd, 0x6a, 0x2a, 0x1a, 0x64, 0xbf, 0x58, 0x49, 0x2d, 0x9a, 0x2a, 0xd4, 0x27, - 0xd2, 0xef, 0xef, 0x2f, 0x28, 0xd0, 0x14, 0x04, 0x35, 0xf7, 0x27, 0x68, 0x6c, 0x57, 0x48, 0x77, 0x9e, 0x0f, 0xbe, - 0x3d, 0x59, 0xb0, 0xcc, 0x27, 0xd6, 0x30, 0x3c, 0x7e, 0x81, 0x1c, 0xd0, 0xc6, 0x22, 0x48, 0x2c, 0x05, 0x93, 0x9f, - 0xb0, 0x9b, 0x60, 0xcc, 0xdf, 0xa5, 0xa6, 0xc6, 0xef, 0x29, 0x0b, 0xb5, 0xc0, 0x06, 0xae, 0x49, 0x4a, 0xc8, 0x63, - 0x1f, 0xdd, 0x4c, 0x0e, 0xa2, 0x58, 0x3f, 0xfd, 0x56, 0xda, 0x6b, 0x6d, 0x5a, 0x04, 0x88, 0xf6, 0x78, 0x99, 0xb0, - 0xf0, 0x5f, 0x83, 0x6f, 0xe1, 0xe2, 0xfe, 0xf6, 0x4a, 0x37, 0xfa, 0x99, 0x3d, 0x4f, 0xd8, 0x74, 0xf0, 0x6d, 0x43, - 0xd4, 0x43, 0x7c, 0xde, 0xd3, 0x58, 0xf4, 0xb6, 0x57, 0x38, 0x07, 0x6a, 0xef, 0xf5, 0xa8, 0x3f, 0xe5, 0xaf, 0x75, - 0x78, 0x01, 0xae, 0x4b, 0x6f, 0x6c, 0xb7, 0x8f, 0xef, 0xe7, 0x51, 0xe8, 0x8f, 0x3f, 0xf5, 0x29, 0xa7, 0xf4, 0x61, - 0xc1, 0x6d, 0x3d, 0xf6, 0x97, 0x3d, 0xbc, 0x5e, 0xd5, 0x44, 0x30, 0xd7, 0xa4, 0x54, 0x49, 0xd9, 0x35, 0xee, 0x65, - 0xdc, 0xca, 0x6b, 0xec, 0x19, 0xbb, 0xba, 0x9d, 0x07, 0x19, 0x13, 0x5d, 0xe1, 0x47, 0x9e, 0x8b, 0x87, 0x3a, 0x3d, - 0x51, 0xf1, 0x61, 0x6d, 0xb7, 0x35, 0xb7, 0xfb, 0xb7, 0xce, 0x8d, 0xeb, 0xcc, 0x3d, 0xd7, 0xee, 0x7e, 0x74, 0xbb, - 0xf3, 0xb6, 0x7d, 0x1c, 0x5a, 0x6d, 0xfb, 0x18, 0xfe, 0x7c, 0x3c, 0xb6, 0xbb, 0x73, 0xcb, 0xb3, 0x0f, 0x3f, 0xba, - 0x5e, 0x68, 0x75, 0xed, 0x63, 0xf8, 0x73, 0x4e, 0xb5, 0xe0, 0x01, 0x44, 0xef, 0x9d, 0x6f, 0x4b, 0x58, 0x40, 0xf9, - 0x2d, 0xe5, 0x34, 0x66, 0xe9, 0x7a, 0x6b, 0x90, 0xf5, 0x00, 0xca, 0xd0, 0x4d, 0xe1, 0x04, 0x32, 0xea, 0xb7, 0x20, - 0x0c, 0x3b, 0x06, 0x10, 0x10, 0x2a, 0x2f, 0xc2, 0x2e, 0x55, 0xb8, 0xd2, 0x6f, 0x3c, 0x46, 0xbc, 0x4e, 0xb3, 0xc3, - 0x75, 0x11, 0x99, 0x8a, 0x84, 0x43, 0xbf, 0x2c, 0xd1, 0x89, 0x91, 0x70, 0x11, 0xaf, 0x60, 0xa5, 0x22, 0x3a, 0x62, - 0xbe, 0x7b, 0xe0, 0x68, 0x99, 0xcb, 0x64, 0x74, 0x9e, 0xaf, 0xda, 0x36, 0x17, 0x18, 0xc9, 0xd6, 0xff, 0x68, 0x3b, - 0x18, 0x94, 0x96, 0xda, 0x11, 0xde, 0x5c, 0x27, 0x41, 0x22, 0x87, 0xa7, 0xa0, 0x68, 0xb7, 0xd9, 0x53, 0xbd, 0x01, - 0x61, 0x4c, 0xde, 0x02, 0x95, 0x7c, 0xe3, 0x87, 0x8a, 0x72, 0x8b, 0x52, 0xf3, 0x91, 0xc4, 0xfc, 0x4f, 0x9f, 0x16, - 0x83, 0xb3, 0x2a, 0xe3, 0x3e, 0x71, 0x3b, 0x70, 0xed, 0x76, 0x58, 0x7b, 0xab, 0x9e, 0xd5, 0x6e, 0x77, 0xc0, 0x85, - 0xbb, 0x50, 0xa1, 0x4b, 0x21, 0xa4, 0xb8, 0x1b, 0x95, 0xbd, 0x6a, 0x32, 0x5c, 0x70, 0xa4, 0x5c, 0x79, 0xea, 0xe8, - 0x46, 0x3f, 0x12, 0x22, 0xc9, 0x68, 0x8b, 0x0b, 0x64, 0xfe, 0x16, 0xd3, 0x01, 0x34, 0x5b, 0xe6, 0xb1, 0xc3, 0x68, - 0xf4, 0x7f, 0x3d, 0x09, 0x34, 0xe0, 0x02, 0x19, 0x6a, 0xe5, 0xb4, 0x96, 0x0c, 0x7a, 0xe4, 0xbd, 0x4a, 0x17, 0x2a, - 0x4b, 0xcf, 0x74, 0x48, 0x82, 0xf8, 0x56, 0x18, 0xd2, 0x4e, 0x2a, 0x90, 0xc9, 0xdb, 0xa2, 0x48, 0x30, 0x03, 0xf0, - 0x01, 0xde, 0x12, 0xc6, 0x64, 0xc6, 0xd3, 0xa7, 0x1b, 0x2f, 0x21, 0x12, 0xd8, 0xab, 0x91, 0x3d, 0x75, 0x15, 0xbf, - 0xe9, 0x2a, 0x8a, 0x91, 0xed, 0x22, 0xd6, 0x10, 0x7a, 0x6f, 0xb4, 0xf7, 0xf0, 0xe7, 0x88, 0xf9, 0x99, 0xcd, 0x25, - 0x4d, 0x2d, 0xe5, 0x72, 0x37, 0x5d, 0xd6, 0x06, 0x8d, 0x37, 0xee, 0xeb, 0x8c, 0xfb, 0x12, 0x7c, 0xb2, 0xfe, 0xb8, - 0xe2, 0x96, 0xde, 0xd0, 0xc6, 0x67, 0xa7, 0x70, 0x4f, 0xf3, 0x2e, 0xf3, 0xc9, 0x87, 0x89, 0x7a, 0xe5, 0xc6, 0x99, - 0x2f, 0xe2, 0xc8, 0x00, 0x5d, 0xde, 0x6f, 0x14, 0xc9, 0x2a, 0xd6, 0xe0, 0xa7, 0xef, 0x2e, 0xbe, 0xd3, 0xf8, 0xfe, - 0x27, 0x09, 0x22, 0x3e, 0x64, 0x28, 0xea, 0xc1, 0x80, 0xa2, 0x1e, 0x68, 0x3c, 0x8c, 0x08, 0xc4, 0x0e, 0xc8, 0x0f, - 0x08, 0x82, 0xc8, 0x80, 0x26, 0xb9, 0xea, 0x62, 0x15, 0x66, 0xc1, 0xd2, 0x4f, 0xb2, 0x03, 0xa8, 0x6a, 0x01, 0x92, - 0xd3, 0x37, 0xd9, 0x88, 0x93, 0x68, 0x56, 0xb8, 0xd8, 0xcb, 0x22, 0x21, 0x9b, 0x9d, 0x06, 0xa1, 0x14, 0xcd, 0x8a, - 0x0e, 0xfc, 0xf1, 0x98, 0x2d, 0xb3, 0x81, 0xee, 0x2f, 0x21, 0xfa, 0x05, 0xfa, 0xb3, 0x3e, 0x88, 0xc7, 0x19, 0xcb, - 0xac, 0x34, 0x4b, 0x98, 0xbf, 0xd0, 0xa5, 0x2b, 0xd7, 0x7a, 0x7b, 0xe9, 0x6a, 0xb4, 0x08, 0x32, 0xe9, 0x0b, 0x91, - 0x26, 0x08, 0x42, 0x52, 0x18, 0xe2, 0xe9, 0x30, 0xe7, 0x20, 0x3c, 0x8f, 0x67, 0x95, 0x1d, 0x55, 0x50, 0x2e, 0x67, - 0xe8, 0x69, 0x97, 0x47, 0x3c, 0x98, 0xa0, 0xcd, 0xd3, 0x35, 0xb7, 0x6b, 0x97, 0x2e, 0x1b, 0xf5, 0xd3, 0x13, 0xfe, - 0xbc, 0xd5, 0xd0, 0x15, 0x83, 0xde, 0x71, 0xc0, 0x97, 0xf0, 0x26, 0x8b, 0xf7, 0x03, 0x5e, 0x18, 0xae, 0x26, 0x6a, - 0x19, 0xfd, 0xbc, 0xd3, 0x58, 0x2e, 0x80, 0x10, 0x2a, 0x09, 0xd1, 0xe7, 0xee, 0xa9, 0x34, 0xb1, 0xc2, 0x51, 0x21, - 0xad, 0xf4, 0xf9, 0xf3, 0xcb, 0xe1, 0x7f, 0xfe, 0x0d, 0xce, 0xe8, 0xe7, 0xae, 0xb0, 0x33, 0xbf, 0x54, 0x4b, 0x71, - 0xea, 0xd3, 0x1c, 0xa2, 0x02, 0x05, 0x9b, 0x08, 0xc7, 0x2b, 0x62, 0x6b, 0xe5, 0xc3, 0x2b, 0xe1, 0x4c, 0x0b, 0x02, - 0x4e, 0x18, 0xc2, 0x1a, 0x7e, 0x08, 0xcb, 0x3b, 0x14, 0x4e, 0x18, 0xb4, 0xdf, 0xee, 0xbe, 0x3f, 0x06, 0x67, 0xcb, - 0xb5, 0x38, 0x10, 0xca, 0x00, 0x71, 0x0f, 0x9d, 0x9e, 0xf8, 0x1a, 0x12, 0x2d, 0x48, 0x7e, 0xa4, 0xbd, 0x03, 0x98, - 0xe6, 0x3c, 0x5e, 0x30, 0x3b, 0x88, 0x0f, 0x6e, 0xd9, 0xc8, 0xf2, 0x97, 0x01, 0xc9, 0xea, 0x91, 0xef, 0xa6, 0x11, - 0xe5, 0x27, 0x45, 0xe0, 0x44, 0x5f, 0xe7, 0x05, 0x28, 0xe3, 0x02, 0x50, 0xf0, 0xd3, 0x3f, 0x2d, 0xfb, 0x67, 0xb4, - 0x45, 0x84, 0x80, 0x32, 0x96, 0x3f, 0x23, 0x37, 0x8b, 0xc2, 0xa3, 0x62, 0xf1, 0x61, 0xc5, 0xd3, 0xa9, 0xea, 0x53, - 0xd1, 0x2e, 0xf7, 0x2f, 0xa1, 0x52, 0xec, 0xd9, 0x78, 0x49, 0x3d, 0xd5, 0xbb, 0x90, 0x3f, 0x21, 0x3a, 0x32, 0x77, - 0xbf, 0x09, 0xe7, 0xb9, 0xe6, 0x9b, 0x51, 0x82, 0xe4, 0x31, 0x15, 0xe2, 0x88, 0xa2, 0xea, 0x09, 0x7c, 0x03, 0x69, - 0xf2, 0x68, 0x30, 0x20, 0x3c, 0x56, 0x45, 0x67, 0x00, 0xa5, 0x86, 0x68, 0x09, 0x30, 0xd9, 0x0c, 0x2a, 0x5a, 0x64, - 0x23, 0x87, 0x95, 0xaa, 0xd3, 0xa9, 0x8f, 0xf1, 0xc0, 0x17, 0xfb, 0xab, 0xb4, 0x03, 0x61, 0x67, 0xf1, 0x85, 0x05, - 0x04, 0x2e, 0xda, 0xa9, 0xe0, 0x71, 0xed, 0xaf, 0x84, 0xb2, 0xad, 0xd0, 0xbf, 0x8f, 0x15, 0xdd, 0x05, 0xee, 0xc6, - 0xe0, 0x1c, 0x53, 0x2f, 0x84, 0xf9, 0x60, 0xed, 0x24, 0x49, 0x8f, 0xf3, 0xf5, 0xd3, 0xa4, 0xba, 0x88, 0xdf, 0x75, - 0x98, 0xd4, 0xb2, 0xe5, 0xc9, 0x20, 0x76, 0xcc, 0x8b, 0x83, 0x56, 0xca, 0xc4, 0x73, 0x9f, 0x9f, 0x1c, 0xc0, 0xfc, - 0xc0, 0xf5, 0x42, 0x89, 0x32, 0x0a, 0x0c, 0xf0, 0xef, 0xe0, 0xa7, 0xa4, 0x7f, 0xf1, 0x76, 0x22, 0x88, 0x3a, 0x7c, - 0x39, 0x4a, 0xe7, 0xaf, 0xa5, 0x22, 0x75, 0x62, 0xc5, 0x69, 0xa6, 0xf2, 0x76, 0x47, 0x68, 0xf8, 0x7d, 0x85, 0xe1, - 0x19, 0xf2, 0x7e, 0xc6, 0x84, 0x65, 0xf3, 0x79, 0xb6, 0xc1, 0xf8, 0x79, 0x53, 0x11, 0x22, 0x58, 0xb7, 0x14, 0x28, - 0xf6, 0xf1, 0xb6, 0x52, 0x05, 0x69, 0x24, 0x8b, 0x2d, 0xfd, 0x96, 0xfe, 0x18, 0x77, 0x7c, 0xad, 0x34, 0xa6, 0x42, - 0xb9, 0xf3, 0x6c, 0x00, 0x45, 0x05, 0xb3, 0xdd, 0x5f, 0x2e, 0xa9, 0xb0, 0xd1, 0x3f, 0x39, 0xa0, 0x77, 0xe7, 0x29, - 0xed, 0xb0, 0xd3, 0x13, 0xd0, 0xdf, 0xa4, 0x45, 0xf7, 0x97, 0x4b, 0xbe, 0xa4, 0xf4, 0x8b, 0x72, 0x0e, 0xe6, 0xd9, - 0x22, 0x3c, 0xfd, 0x3f, 0x1d, 0xdb, 0x6f, 0x83, 0x01, 0x5c, 0x03, 0x00}; + 0xdc, 0xb3, 0x37, 0xb7, 0x6d, 0x23, 0xff, 0x7f, 0x3f, 0x05, 0xc3, 0xe4, 0x52, 0x31, 0x21, 0x69, 0x92, 0xb2, 0x6c, + 0x45, 0xb2, 0xec, 0x6b, 0xf3, 0x98, 0x4b, 0xc7, 0x6d, 0x3a, 0x89, 0x9b, 0xb9, 0xab, 0xeb, 0xb1, 0x28, 0x09, 0x92, + 0x78, 0xa1, 0x48, 0x0d, 0x49, 0xf9, 0x51, 0x85, 0xf7, 0x59, 0xee, 0xb3, 0xdc, 0x27, 0xfb, 0xcd, 0xee, 0x02, 0x20, + 0xf8, 0xd0, 0xc3, 0x4d, 0x7a, 0xf7, 0x9b, 0x36, 0x89, 0x08, 0x02, 0x4b, 0x60, 0x01, 0x2c, 0x16, 0xfb, 0xf4, 0x67, + 0x5c, 0xf6, 0x62, 0xb6, 0xd8, 0x7e, 0x9f, 0xfb, 0xfc, 0x99, 0xd9, 0xb8, 0x24, 0x81, 0xe1, 0xb3, 0xb3, 0x78, 0x36, + 0x0b, 0x59, 0x4b, 0x17, 0xc9, 0x43, 0x74, 0x53, 0x7e, 0xe6, 0xec, 0x91, 0x23, 0x22, 0x76, 0x1a, 0xf9, 0xa6, 0xad, + 0x25, 0x46, 0xcc, 0x64, 0x48, 0x3b, 0xe2, 0x5c, 0x51, 0x36, 0x7b, 0x83, 0xea, 0x0d, 0x3e, 0x2f, 0xc5, 0xd6, 0xb5, + 0x26, 0xf1, 0x6a, 0x14, 0x32, 0x0b, 0x97, 0x3b, 0x7c, 0x72, 0x3d, 0x5a, 0x8d, 0x46, 0x90, 0xa5, 0xe5, 0x91, 0x63, + 0x42, 0xdc, 0x99, 0x38, 0xc5, 0xfb, 0x60, 0x6e, 0xf4, 0x61, 0x50, 0x76, 0x56, 0xed, 0x3e, 0xd8, 0x8a, 0x80, 0xa8, + 0x87, 0x3e, 0x90, 0xc1, 0xdd, 0xaf, 0x61, 0xd7, 0x0e, 0xf4, 0x0f, 0xb0, 0xfa, 0x52, 0xbd, 0xdf, 0xb4, 0xf5, 0x07, + 0x97, 0xfa, 0x07, 0xc4, 0x31, 0x66, 0x2f, 0x7e, 0x49, 0xab, 0x57, 0x37, 0x75, 0x52, 0x7a, 0xaf, 0x30, 0x8f, 0x01, + 0x08, 0x7d, 0x5f, 0x05, 0xfe, 0x2c, 0x8a, 0xd3, 0x2c, 0x18, 0xeb, 0x57, 0xfd, 0xb7, 0x41, 0xeb, 0x72, 0x91, 0xb5, + 0x8c, 0x2b, 0x73, 0x9c, 0xa9, 0x29, 0x50, 0x04, 0xc1, 0xc4, 0x0c, 0x28, 0x9b, 0x2a, 0xa9, 0x3b, 0x68, 0x6b, 0x45, + 0x41, 0x9a, 0xb1, 0xd2, 0x38, 0x1b, 0x40, 0xbd, 0x4a, 0x3e, 0x15, 0x4c, 0x0c, 0xa5, 0x63, 0x4b, 0xa3, 0x4f, 0x37, + 0x95, 0x97, 0xab, 0x35, 0x1e, 0xe5, 0x59, 0x71, 0x5a, 0x62, 0x0c, 0x60, 0xe1, 0x38, 0x43, 0xcf, 0x8f, 0x54, 0xa3, + 0xcf, 0xd2, 0xb9, 0x3b, 0xfc, 0xae, 0xcc, 0x17, 0xc0, 0xf9, 0x0d, 0x16, 0x17, 0x51, 0x9c, 0x69, 0x10, 0xd8, 0x06, + 0xbe, 0x38, 0xac, 0x1a, 0x89, 0x71, 0xa8, 0x2d, 0x23, 0xe7, 0xc4, 0xe0, 0x7b, 0x3c, 0xfc, 0x5a, 0x3c, 0xbc, 0x59, + 0x29, 0x82, 0x05, 0x5d, 0x16, 0x22, 0x98, 0xc0, 0x2c, 0x3e, 0x8f, 0x6f, 0xab, 0x7a, 0x90, 0x97, 0xc3, 0xdd, 0x67, + 0x6f, 0x4b, 0xb0, 0xc9, 0x22, 0xab, 0x5f, 0x8b, 0x27, 0x26, 0x15, 0x8c, 0x4e, 0x65, 0x4f, 0xa1, 0xe1, 0x87, 0xe0, + 0x61, 0x32, 0xb0, 0x13, 0xc3, 0xb3, 0x00, 0x48, 0x12, 0x3f, 0xa6, 0x87, 0xf9, 0xb5, 0x48, 0x9d, 0x2c, 0x12, 0x17, + 0x2b, 0x87, 0x33, 0x50, 0xd7, 0x68, 0xb9, 0xca, 0x30, 0xd4, 0x2e, 0x74, 0x80, 0xe5, 0xba, 0x86, 0xa1, 0x3b, 0x81, + 0x4a, 0x17, 0x6c, 0x62, 0xae, 0x6b, 0xc1, 0xa4, 0x5e, 0xc6, 0x99, 0x5e, 0x20, 0x5e, 0x48, 0xdf, 0x51, 0x50, 0x05, + 0x8f, 0x09, 0x1f, 0xc6, 0xd8, 0x2c, 0xe2, 0xd4, 0xb7, 0xc6, 0xa8, 0xd0, 0x69, 0xa0, 0x0c, 0x63, 0x82, 0xd3, 0x6f, + 0x85, 0x8d, 0x83, 0x85, 0xf0, 0x9b, 0xa5, 0x61, 0x0e, 0x9f, 0xac, 0xa3, 0xfc, 0xec, 0xc9, 0x3a, 0xcd, 0x07, 0x4f, + 0xd6, 0xbe, 0xb4, 0x15, 0xd0, 0x2f, 0x74, 0x32, 0x14, 0x18, 0x22, 0x1a, 0x86, 0xf9, 0x75, 0xe1, 0xb9, 0x53, 0x8c, + 0x17, 0x56, 0x19, 0x95, 0x6b, 0xa8, 0xba, 0x1f, 0x70, 0x05, 0xfd, 0x32, 0x09, 0x16, 0x7e, 0x72, 0x4f, 0xfa, 0x7c, + 0x53, 0x55, 0xfa, 0x1b, 0xba, 0x46, 0x84, 0x9e, 0x10, 0x40, 0x34, 0x5f, 0xd7, 0xfe, 0x2a, 0xcb, 0x18, 0x1f, 0xad, + 0x54, 0x6a, 0xc2, 0xb7, 0xae, 0xf5, 0xe7, 0xcc, 0x9e, 0xb0, 0xcc, 0x0f, 0x42, 0x6a, 0xd2, 0x17, 0xd9, 0xea, 0x6b, + 0xc3, 0x4b, 0xcb, 0xc3, 0x8b, 0xca, 0xeb, 0x07, 0x07, 0x43, 0x47, 0x00, 0xf5, 0x1b, 0x47, 0x86, 0x59, 0xac, 0x9a, + 0x67, 0x94, 0xde, 0xfd, 0x57, 0xa7, 0x83, 0xc1, 0x74, 0x44, 0x30, 0x1d, 0x2c, 0x1a, 0xc7, 0x13, 0xf6, 0xcb, 0xfb, + 0xb7, 0x32, 0x6d, 0x16, 0x48, 0x80, 0x86, 0x7c, 0x61, 0xa6, 0xc8, 0x3f, 0x24, 0xc8, 0x3b, 0x50, 0x82, 0x2b, 0x4d, + 0x2e, 0xa1, 0x24, 0xd7, 0xb5, 0x33, 0xea, 0x3b, 0x9b, 0x50, 0xaf, 0x07, 0x31, 0xb6, 0x4a, 0xf2, 0x93, 0x03, 0xaa, + 0x4d, 0xa7, 0x1d, 0x55, 0x02, 0x34, 0x24, 0x30, 0xc2, 0x02, 0x0b, 0x90, 0xe1, 0x73, 0xe0, 0x16, 0x17, 0x0a, 0x7b, + 0x81, 0x72, 0x76, 0xf7, 0xac, 0xcc, 0xaa, 0x60, 0x2b, 0xfd, 0xf4, 0x04, 0x73, 0x76, 0xc1, 0x79, 0x0d, 0x51, 0x3e, + 0x4e, 0x0e, 0xe8, 0x51, 0xab, 0xec, 0x88, 0x02, 0x88, 0xb8, 0xda, 0xf5, 0x38, 0x80, 0x07, 0x6d, 0x15, 0x48, 0x11, + 0x0f, 0xa5, 0x7e, 0xae, 0x6b, 0x0b, 0xce, 0x1a, 0xf1, 0x70, 0x42, 0x10, 0x6b, 0xc0, 0x81, 0xbd, 0xab, 0x6b, 0x0b, + 0xff, 0x0e, 0x47, 0x2e, 0xde, 0xf8, 0x77, 0x2d, 0x97, 0xbf, 0x2a, 0xf6, 0x5a, 0x5a, 0xde, 0x6b, 0x63, 0x3e, 0xb9, + 0xe0, 0x48, 0x20, 0x6f, 0xd6, 0x73, 0x54, 0xd0, 0x36, 0x4c, 0xee, 0x5c, 0x4c, 0xee, 0x64, 0xc3, 0xe4, 0x4e, 0xb6, + 0x4c, 0x6e, 0xc8, 0x27, 0x52, 0x93, 0xa8, 0x4b, 0xd0, 0x39, 0x4c, 0x22, 0x8f, 0x33, 0x1a, 0x3d, 0xbe, 0xcf, 0x10, + 0x4f, 0x56, 0x1a, 0x82, 0x71, 0xd4, 0x06, 0x5c, 0x35, 0xe1, 0x45, 0x41, 0x44, 0x7d, 0xe0, 0x72, 0xd7, 0x89, 0x71, + 0x43, 0x0e, 0xce, 0x56, 0x58, 0x1d, 0x2f, 0xac, 0x52, 0xca, 0x2f, 0xde, 0x9a, 0x6f, 0x18, 0xe9, 0x7c, 0xcb, 0x48, + 0xc7, 0xa5, 0xad, 0xcb, 0x87, 0x4d, 0x9b, 0x50, 0x1d, 0x14, 0xac, 0x41, 0x30, 0x18, 0xc5, 0x25, 0x53, 0x5e, 0x87, + 0x9b, 0x69, 0xac, 0xb2, 0xa2, 0x96, 0x7e, 0x9a, 0xde, 0xc6, 0x09, 0x68, 0x5c, 0x00, 0xcc, 0xc3, 0x96, 0xd4, 0x22, + 0x88, 0x78, 0x30, 0x97, 0x8d, 0x8b, 0xa9, 0x78, 0xaf, 0x2e, 0x29, 0xaf, 0xd3, 0xa1, 0x1a, 0x4b, 0x3f, 0xcb, 0x58, + 0x82, 0x48, 0xf7, 0x21, 0xea, 0xf7, 0xff, 0x93, 0x65, 0xd6, 0x40, 0x43, 0x42, 0x85, 0xaa, 0x23, 0x85, 0x5e, 0x02, + 0x6f, 0x95, 0x88, 0x83, 0x58, 0x09, 0x0c, 0x97, 0x48, 0xc4, 0xff, 0x84, 0xdb, 0xb5, 0x95, 0x28, 0xae, 0x4b, 0xee, + 0x91, 0x61, 0x2f, 0xfd, 0xc9, 0x07, 0x50, 0xec, 0xb5, 0x3c, 0x13, 0x8c, 0x74, 0xd5, 0x30, 0x70, 0x09, 0x31, 0x7b, + 0xe3, 0x82, 0x48, 0x22, 0x95, 0xe4, 0x26, 0x50, 0xe0, 0x3d, 0xe9, 0x5b, 0xd3, 0xab, 0xb5, 0x97, 0x1f, 0xcc, 0x02, + 0xa3, 0x46, 0x35, 0x81, 0xb4, 0x85, 0x83, 0x53, 0x79, 0xe7, 0x0a, 0x4d, 0xf7, 0xc8, 0x00, 0xc9, 0xef, 0x25, 0xe4, + 0x33, 0x75, 0xc4, 0x85, 0x76, 0x98, 0xc0, 0xa9, 0x75, 0xe9, 0x5c, 0xe5, 0x4f, 0x67, 0xf8, 0xcb, 0xbd, 0xca, 0x9f, + 0x8e, 0xf0, 0x97, 0x77, 0x85, 0x99, 0xeb, 0x1a, 0x2e, 0xf2, 0xca, 0x98, 0xf5, 0xd3, 0xd2, 0x7a, 0x22, 0xfb, 0xb3, + 0x07, 0x2c, 0x1b, 0x3e, 0xc1, 0x8f, 0x9f, 0xac, 0x53, 0xf0, 0xb8, 0x54, 0xc7, 0x10, 0xd9, 0x89, 0x91, 0x37, 0x96, + 0xcf, 0x36, 0x94, 0x8f, 0x8c, 0xff, 0xf2, 0xc1, 0x8f, 0xab, 0x24, 0x2e, 0xce, 0x94, 0xb2, 0x18, 0xe2, 0x7a, 0x14, + 0x44, 0x7e, 0x72, 0x7f, 0x4d, 0xd7, 0x8b, 0x96, 0xe0, 0xdd, 0xa5, 0x78, 0x85, 0xd8, 0xcb, 0xb2, 0xba, 0x2b, 0x53, + 0x04, 0xbc, 0xf7, 0xfc, 0xa0, 0x1f, 0xfc, 0x3d, 0x51, 0xd8, 0xb6, 0xd2, 0x05, 0x94, 0x4f, 0x48, 0xe9, 0x43, 0xd7, + 0x4f, 0xd6, 0x2d, 0x56, 0x07, 0x53, 0x19, 0x6d, 0x85, 0x2f, 0x84, 0xe9, 0xc1, 0xcb, 0xec, 0x62, 0x12, 0xf4, 0x50, + 0x9f, 0x35, 0x8a, 0xef, 0xac, 0x27, 0xeb, 0xec, 0x4c, 0x5f, 0xf8, 0xc9, 0x27, 0x36, 0xb1, 0xc6, 0x41, 0x32, 0x0e, + 0x99, 0xde, 0xd3, 0x47, 0xa1, 0x1f, 0x7d, 0xe2, 0x8f, 0x56, 0xbc, 0xca, 0x50, 0x43, 0xbd, 0xf3, 0xee, 0x2b, 0x70, + 0x42, 0x22, 0x3b, 0x64, 0x56, 0x1b, 0xb0, 0xa0, 0xbd, 0x94, 0x02, 0xaf, 0x82, 0x51, 0x2c, 0x6a, 0x99, 0x60, 0x60, + 0x09, 0x4a, 0x73, 0xf0, 0x58, 0x35, 0x75, 0x9c, 0x2f, 0xdd, 0x54, 0x87, 0x4a, 0xc2, 0x4a, 0x99, 0x72, 0xf1, 0x1a, + 0x21, 0xfc, 0xf1, 0xcf, 0x51, 0x32, 0xec, 0xfd, 0x3f, 0x27, 0xa1, 0x7c, 0xd9, 0x08, 0xa1, 0xd4, 0x22, 0x4f, 0x89, + 0x07, 0x7c, 0x9c, 0x33, 0x98, 0x9b, 0x3f, 0xad, 0x36, 0xf6, 0xd3, 0x74, 0xb5, 0x60, 0x13, 0xd2, 0x0c, 0x9e, 0x15, + 0x9d, 0x2a, 0xdf, 0x2c, 0xd4, 0x8e, 0xfd, 0xb6, 0xf2, 0x8e, 0x0f, 0x5f, 0x82, 0xc5, 0x02, 0x30, 0x94, 0xf1, 0x74, + 0xaa, 0x17, 0x77, 0xfc, 0x1d, 0xcd, 0xdc, 0xc3, 0xdf, 0x56, 0x6f, 0x5e, 0x3b, 0x6f, 0x64, 0xe3, 0x08, 0x18, 0x63, + 0xa1, 0x7e, 0xe5, 0x7c, 0xb1, 0xd2, 0x5f, 0x31, 0xa2, 0xa9, 0x1f, 0x6d, 0x1e, 0xce, 0x65, 0x69, 0x89, 0x2f, 0x19, + 0x9b, 0x00, 0xc3, 0x6d, 0xd6, 0x4a, 0xaf, 0x43, 0x76, 0xc3, 0xa4, 0x6a, 0xb7, 0xfe, 0xb1, 0x86, 0x16, 0x18, 0x7b, + 0x8e, 0xab, 0x8c, 0x39, 0x57, 0xa7, 0x0c, 0x69, 0x88, 0x63, 0xe0, 0x23, 0x57, 0xb7, 0x58, 0x65, 0x4b, 0x0d, 0x4d, + 0x5d, 0xe9, 0xc0, 0xc6, 0x9e, 0x9d, 0x6d, 0x28, 0xef, 0x61, 0xe2, 0xe9, 0xe6, 0xbe, 0x99, 0xae, 0xd1, 0x83, 0x58, + 0xdd, 0x1c, 0x4f, 0x21, 0xec, 0xbc, 0x56, 0x21, 0x0e, 0xd9, 0x84, 0xb1, 0x26, 0x21, 0x99, 0x4e, 0xd2, 0x17, 0x61, + 0xed, 0x88, 0x66, 0xbf, 0x42, 0x0e, 0xd5, 0x38, 0x37, 0x5a, 0x79, 0xe4, 0x23, 0x4c, 0xe8, 0x1a, 0xb1, 0x34, 0xdd, + 0x88, 0x30, 0x39, 0xe9, 0xa6, 0x5e, 0xd4, 0x2e, 0xe3, 0xa3, 0x28, 0x37, 0x1d, 0x13, 0x58, 0x02, 0x1c, 0x60, 0xf5, + 0x5b, 0x78, 0xbc, 0x5c, 0x2f, 0xb8, 0xbd, 0x4a, 0x32, 0x1b, 0xe9, 0xdc, 0x96, 0x60, 0xd3, 0xfb, 0x5b, 0x9d, 0x77, + 0xaa, 0x74, 0x4c, 0x37, 0x76, 0xad, 0x55, 0x22, 0xbd, 0x35, 0x71, 0x11, 0x02, 0x10, 0x7d, 0xaa, 0xd0, 0x57, 0x36, + 0x9d, 0xb2, 0x71, 0x96, 0x1a, 0x42, 0x78, 0x24, 0xa3, 0xc7, 0x82, 0xd7, 0xd0, 0xa3, 0x81, 0xfe, 0x13, 0xf8, 0xd0, + 0x8b, 0x20, 0x4b, 0xbc, 0x43, 0xe2, 0xce, 0xd4, 0x8c, 0x26, 0x82, 0x58, 0x46, 0x11, 0xff, 0x0a, 0x24, 0x07, 0x6f, + 0x28, 0xc7, 0xae, 0xf1, 0xf3, 0xa7, 0x58, 0x17, 0xb1, 0xb4, 0x6a, 0xd9, 0x4e, 0x8a, 0xb6, 0x6d, 0xdf, 0xb5, 0xfb, + 0xa6, 0xe3, 0x3a, 0xb9, 0x6e, 0x82, 0xef, 0xd6, 0xa7, 0x7d, 0x37, 0x3d, 0xb6, 0x6a, 0x43, 0xab, 0x55, 0xf4, 0x90, + 0x76, 0x9e, 0xfb, 0xc2, 0xd5, 0x4d, 0x32, 0x99, 0x53, 0x68, 0xdb, 0x38, 0xbe, 0x61, 0xc9, 0x17, 0x0f, 0xa5, 0x0c, + 0x7c, 0xbf, 0xfe, 0x1c, 0xb9, 0x0e, 0x10, 0xe1, 0x2c, 0x5e, 0x3e, 0x60, 0x08, 0x6d, 0xdd, 0xd4, 0xc7, 0x61, 0x9c, + 0x32, 0x75, 0x0c, 0x24, 0x04, 0xf9, 0xc2, 0x41, 0xfc, 0xfc, 0xfe, 0xf5, 0x87, 0x0f, 0xba, 0x89, 0x99, 0x40, 0x53, + 0x15, 0x3a, 0x5f, 0x50, 0x3b, 0xa8, 0x7f, 0xe3, 0xba, 0xa3, 0x13, 0x86, 0x2e, 0xb5, 0xe5, 0x35, 0x47, 0x65, 0xb5, + 0x25, 0xc7, 0x4f, 0x1e, 0xfe, 0x65, 0xba, 0x89, 0xee, 0x35, 0xae, 0x06, 0xda, 0xb0, 0xfd, 0x78, 0x2b, 0x95, 0x2c, + 0x82, 0xe8, 0xba, 0xa1, 0xd4, 0xbf, 0x6b, 0x28, 0x85, 0xab, 0x5c, 0x8d, 0x56, 0xad, 0xe2, 0x85, 0xc2, 0x1a, 0x40, + 0x22, 0xe7, 0x5d, 0xe8, 0x52, 0xee, 0x53, 0x5f, 0xd0, 0x69, 0x1e, 0xc9, 0xbd, 0xda, 0xeb, 0x86, 0x62, 0x7e, 0x09, + 0x92, 0xb8, 0x1d, 0x87, 0x60, 0xf0, 0xc7, 0x54, 0xad, 0x5c, 0x99, 0x6d, 0x94, 0xe6, 0xba, 0x0a, 0x10, 0x62, 0x6f, + 0xaf, 0x33, 0xb6, 0x58, 0xb2, 0xc4, 0xcf, 0x56, 0x09, 0xbb, 0x0e, 0xe3, 0xdb, 0x47, 0x85, 0x39, 0xfd, 0x8e, 0xca, + 0xf3, 0x60, 0x36, 0x97, 0xb5, 0xcf, 0x5a, 0x6c, 0x20, 0x27, 0x70, 0xeb, 0x07, 0xf2, 0xff, 0xfc, 0xdb, 0xb6, 0xff, + 0xf3, 0xef, 0x9d, 0x55, 0x01, 0x7c, 0x3e, 0x34, 0xb3, 0xc1, 0x1e, 0xeb, 0xa2, 0xf9, 0x4b, 0x65, 0x9c, 0x37, 0xd7, + 0xa9, 0x4d, 0x02, 0xbc, 0xaf, 0x4d, 0x41, 0xad, 0xb0, 0xbc, 0x6e, 0x1e, 0xd4, 0x31, 0x18, 0xd7, 0xce, 0x9e, 0x41, + 0xa5, 0x2f, 0xea, 0xda, 0xd0, 0xe8, 0xed, 0x35, 0x23, 0x7f, 0x1c, 0xc3, 0xbb, 0xc6, 0xf0, 0x85, 0xdd, 0xe7, 0x72, + 0xc9, 0x97, 0xc3, 0xa1, 0xcc, 0x2d, 0xa7, 0x36, 0x05, 0x13, 0xff, 0xb3, 0x5a, 0x09, 0x3f, 0x3c, 0x7b, 0x8e, 0x41, + 0xbe, 0xf7, 0x83, 0x97, 0x43, 0x34, 0x46, 0x3b, 0x19, 0x25, 0x05, 0xb3, 0xb2, 0x91, 0xb4, 0x91, 0x31, 0x79, 0x0d, + 0x68, 0x8d, 0xae, 0x41, 0x29, 0x26, 0x1c, 0xcb, 0x87, 0x86, 0xf9, 0x72, 0xc8, 0x05, 0x4b, 0xdc, 0xfe, 0xb5, 0x57, + 0x5d, 0xda, 0x5c, 0x2c, 0x5b, 0x42, 0xba, 0xa9, 0x91, 0xfe, 0x07, 0x2b, 0xb3, 0x42, 0x8e, 0x87, 0x02, 0x7e, 0x90, + 0x28, 0x0c, 0x73, 0xcc, 0x77, 0xf2, 0x6e, 0x93, 0x8d, 0xd8, 0xcf, 0xbb, 0x6d, 0xc4, 0x2e, 0xf6, 0xb2, 0x11, 0xfb, + 0xf9, 0xab, 0xdb, 0x88, 0xbd, 0x53, 0x6d, 0xc4, 0x60, 0x12, 0x5f, 0xb3, 0xbd, 0x0c, 0xb7, 0x84, 0xd5, 0x46, 0x7c, + 0x9b, 0x0e, 0x5c, 0xce, 0xd2, 0xa6, 0xe3, 0x39, 0x03, 0x19, 0x01, 0x9f, 0x95, 0x30, 0x9e, 0x81, 0x11, 0xd7, 0x9f, + 0x6f, 0x6e, 0x15, 0xc6, 0x33, 0xd5, 0xd8, 0x2a, 0xe2, 0x11, 0x5f, 0x8b, 0x28, 0x4e, 0x64, 0xe0, 0xe4, 0x98, 0x22, + 0xe6, 0x93, 0x75, 0x68, 0x28, 0x59, 0xad, 0xa5, 0xf5, 0x9a, 0x27, 0x4c, 0xa0, 0x7a, 0x68, 0x3d, 0x25, 0x1b, 0x7a, + 0xcf, 0x45, 0x6c, 0x0b, 0x15, 0x82, 0xb4, 0x12, 0xa6, 0x38, 0x11, 0x6b, 0xfd, 0xb7, 0x3b, 0xf7, 0xfb, 0x4b, 0xb7, + 0xdf, 0x76, 0xc1, 0x39, 0x1b, 0x6e, 0x98, 0x58, 0xe0, 0xf4, 0xdb, 0x6d, 0x28, 0xb8, 0x55, 0x0a, 0x3c, 0x28, 0x08, + 0x94, 0x82, 0x0e, 0x14, 0x8c, 0x95, 0x82, 0x23, 0x28, 0x98, 0x28, 0x05, 0xc7, 0x50, 0x70, 0xa3, 0xe7, 0x97, 0x91, + 0xec, 0xee, 0xb1, 0x71, 0x65, 0xd2, 0xa5, 0x42, 0x94, 0x1d, 0x9b, 0x2e, 0x58, 0x4d, 0xf9, 0xb3, 0x5e, 0x6c, 0x92, + 0x74, 0xb1, 0x97, 0x98, 0xb7, 0x73, 0x46, 0x81, 0xa2, 0x5f, 0xe1, 0x99, 0x63, 0x67, 0x31, 0xd8, 0x4d, 0x8b, 0x00, + 0x0c, 0x02, 0x0f, 0x9a, 0x6e, 0x80, 0xc0, 0xa8, 0x2f, 0x67, 0x4e, 0x04, 0xb1, 0x50, 0xe6, 0xb2, 0x78, 0x47, 0x9f, + 0xb3, 0xe4, 0x12, 0x28, 0x2c, 0x4e, 0x5a, 0xaa, 0x54, 0xf2, 0x6b, 0xd8, 0x1d, 0xbc, 0x62, 0xa3, 0xd5, 0x4c, 0x3b, + 0x8f, 0x67, 0x3b, 0x4d, 0x08, 0xd4, 0x57, 0xd0, 0x4b, 0x9d, 0xd4, 0x2f, 0x96, 0x58, 0x96, 0xfc, 0x5b, 0xf4, 0x98, + 0x97, 0xeb, 0x67, 0xd0, 0x37, 0x2d, 0x23, 0x03, 0x16, 0xf8, 0x0e, 0xe0, 0x48, 0xd1, 0xe1, 0x9f, 0x03, 0x9e, 0x95, + 0xe7, 0x0b, 0x5f, 0xe9, 0xcf, 0xe9, 0x8f, 0x2c, 0x4d, 0xfd, 0x99, 0xa8, 0x5f, 0xef, 0x27, 0x18, 0xed, 0xc8, 0xfb, + 0x17, 0x22, 0x10, 0x24, 0x79, 0x41, 0xcd, 0x36, 0x23, 0x89, 0x6f, 0x35, 0xb0, 0xfe, 0x81, 0x05, 0x55, 0xd8, 0x29, + 0x04, 0x36, 0x4c, 0x61, 0xd9, 0xa2, 0x00, 0x36, 0xff, 0x0d, 0x0b, 0xab, 0x85, 0x99, 0x3f, 0xab, 0x16, 0xd1, 0x3a, + 0xc8, 0xd5, 0xbe, 0x49, 0x85, 0x7e, 0xa9, 0xf0, 0x4b, 0x34, 0xd4, 0x61, 0x3c, 0xfb, 0x53, 0xd5, 0xd3, 0x5b, 0xcc, + 0x0a, 0x3e, 0x44, 0x66, 0x90, 0x0d, 0x6d, 0xc4, 0xb1, 0x66, 0x03, 0x0a, 0x7b, 0x51, 0x36, 0xb7, 0xd0, 0xb5, 0xac, + 0xe5, 0x45, 0x86, 0x69, 0xe3, 0xdc, 0xae, 0xab, 0x0e, 0xb5, 0xbd, 0x64, 0x36, 0xf2, 0x5b, 0xae, 0x77, 0x6c, 0x8a, + 0x3f, 0xb6, 0xd3, 0x31, 0x72, 0x84, 0xa0, 0x4d, 0x82, 0x9b, 0xf5, 0x34, 0x8e, 0x32, 0x6b, 0xea, 0x2f, 0x82, 0xf0, + 0xbe, 0xb7, 0x88, 0xa3, 0x38, 0x5d, 0xfa, 0x63, 0xd6, 0x2f, 0x2e, 0xd4, 0x7d, 0x0c, 0xd5, 0xc0, 0xbd, 0x05, 0x5d, + 0xdb, 0x4b, 0xd8, 0x82, 0x5a, 0xcb, 0x48, 0x0c, 0xd3, 0x90, 0xdd, 0xe5, 0xfc, 0xf3, 0xa5, 0xca, 0x54, 0x15, 0x97, + 0x1c, 0xb5, 0x00, 0x8e, 0x94, 0x87, 0x79, 0x80, 0xe0, 0x46, 0xfd, 0xa5, 0x3f, 0xc1, 0xc8, 0x84, 0xb6, 0xd7, 0x49, + 0xd8, 0x42, 0xb3, 0x3b, 0x1b, 0x81, 0x27, 0xf1, 0xed, 0x29, 0xf4, 0x16, 0x1b, 0x5b, 0x29, 0x0b, 0xa7, 0xf8, 0xc6, + 0x42, 0xcf, 0x12, 0x01, 0xc7, 0xc2, 0x8b, 0x38, 0x40, 0x63, 0x8b, 0x3e, 0xbc, 0xee, 0x79, 0x9a, 0xd3, 0x5f, 0x04, + 0x91, 0x45, 0xc3, 0x39, 0x76, 0x96, 0x0a, 0x2c, 0x15, 0x7f, 0xc6, 0x1a, 0xab, 0xbb, 0x9a, 0xd3, 0x87, 0xcb, 0xda, + 0x34, 0x8c, 0x6f, 0x7b, 0xf3, 0x60, 0x32, 0x61, 0x51, 0x1f, 0xfb, 0x2c, 0x0b, 0x59, 0x18, 0x06, 0xcb, 0x34, 0x48, + 0xfb, 0x0b, 0xff, 0x8e, 0x43, 0x3d, 0xdc, 0x04, 0xb5, 0xcd, 0xa1, 0xb6, 0xf7, 0x86, 0xaa, 0x80, 0x01, 0x2f, 0x16, + 0x82, 0xc3, 0xbb, 0xd6, 0xd1, 0x9c, 0xca, 0x38, 0xf7, 0x86, 0xba, 0x4c, 0xd8, 0x7a, 0xe1, 0x27, 0xb3, 0x20, 0xea, + 0x39, 0xb9, 0x7d, 0xb3, 0xa6, 0x85, 0xf1, 0xb8, 0xdb, 0xed, 0xe6, 0xf6, 0x44, 0x3c, 0x39, 0x93, 0x49, 0x6e, 0x8f, + 0xc5, 0xd3, 0x74, 0xea, 0x38, 0xd3, 0x69, 0x6e, 0x07, 0xa2, 0xa0, 0xed, 0x8d, 0x27, 0x6d, 0x2f, 0xb7, 0x6f, 0x95, + 0x1a, 0xb9, 0xcd, 0xf8, 0x53, 0xc2, 0x26, 0x7d, 0x5c, 0x48, 0x64, 0x56, 0xda, 0x3b, 0x76, 0x9c, 0x1c, 0x29, 0xc0, + 0x65, 0x89, 0x36, 0xa1, 0xac, 0xe7, 0x6a, 0xbd, 0x77, 0x4d, 0xad, 0xf8, 0xdc, 0x78, 0xdc, 0x58, 0x6f, 0xe2, 0x27, + 0x9f, 0xae, 0x34, 0x65, 0x14, 0xbe, 0x4f, 0xd5, 0xd6, 0x02, 0x0d, 0xd6, 0x5d, 0x0f, 0x42, 0x76, 0xf5, 0x47, 0x71, + 0x02, 0x7b, 0x36, 0xf1, 0x27, 0xc1, 0x2a, 0xed, 0xb9, 0xde, 0xf2, 0x4e, 0x14, 0xf1, 0xb5, 0x5e, 0x14, 0xe0, 0xde, + 0xeb, 0xa5, 0x71, 0x18, 0x4c, 0x44, 0xd1, 0xa6, 0xbd, 0xe4, 0x7a, 0x46, 0x1f, 0x1d, 0xd6, 0x03, 0x0c, 0xbb, 0xe0, + 0x87, 0xa1, 0x66, 0xb7, 0x53, 0x8d, 0xf9, 0x29, 0xca, 0x97, 0x35, 0x27, 0x25, 0xbc, 0xa0, 0x73, 0xba, 0x7b, 0xb8, + 0xbc, 0x93, 0x6b, 0xde, 0x3d, 0x5a, 0xde, 0xe5, 0x7f, 0x5d, 0xb0, 0x49, 0xe0, 0x6b, 0xad, 0x62, 0x35, 0xb9, 0x0e, + 0xc8, 0xa0, 0x8d, 0xf5, 0x86, 0x65, 0x2a, 0xb6, 0x05, 0x84, 0x36, 0x7c, 0x14, 0x2c, 0x96, 0x71, 0x92, 0xf9, 0x51, + 0x96, 0xe7, 0xc3, 0xab, 0x3c, 0xef, 0x5f, 0x04, 0xad, 0xcb, 0x7f, 0xb4, 0xe8, 0x9c, 0x26, 0x9d, 0x4d, 0x6e, 0x5c, + 0x99, 0xaf, 0x99, 0x6a, 0x33, 0x02, 0xc7, 0x18, 0xda, 0x8b, 0xa8, 0x95, 0xe9, 0x94, 0xac, 0x57, 0x26, 0x24, 0xcb, + 0xea, 0x64, 0x83, 0x52, 0xae, 0x82, 0x27, 0x10, 0x54, 0x78, 0xcd, 0x06, 0x17, 0x8a, 0xfd, 0x09, 0x30, 0x2b, 0x58, + 0x99, 0xfc, 0x0a, 0x9e, 0x6c, 0xe2, 0x19, 0xbf, 0xdb, 0xcd, 0x33, 0xfe, 0x9a, 0xed, 0xc3, 0x33, 0x7e, 0xf7, 0xd5, + 0x79, 0xc6, 0x27, 0x75, 0xbf, 0x82, 0xb7, 0xf1, 0x40, 0x97, 0x1a, 0x06, 0x38, 0x9a, 0x12, 0x8a, 0xd8, 0xf3, 0xf6, + 0x0f, 0xbb, 0x01, 0x08, 0x68, 0x94, 0x83, 0x8e, 0x4e, 0x6e, 0x90, 0xc7, 0xbe, 0x8b, 0x06, 0x7f, 0x4f, 0xd4, 0xe7, + 0xe9, 0x74, 0xf0, 0x2a, 0x56, 0x0a, 0xe4, 0x13, 0x37, 0xbe, 0x28, 0x45, 0x57, 0xa0, 0x37, 0xc2, 0x0a, 0x13, 0xf3, + 0x4f, 0x80, 0x73, 0x36, 0x59, 0x1d, 0x4f, 0xa4, 0xf5, 0x59, 0xbf, 0xdc, 0x85, 0x96, 0x34, 0xf9, 0x14, 0x2e, 0x38, + 0x35, 0x51, 0xe2, 0x8c, 0x65, 0xdc, 0x67, 0xf6, 0xfb, 0xfb, 0xb7, 0x93, 0xd6, 0xdb, 0xd8, 0xc8, 0x83, 0xf4, 0x5d, + 0xd5, 0x01, 0x86, 0xeb, 0x7e, 0x06, 0xea, 0x70, 0x72, 0x6e, 0x41, 0xa6, 0x26, 0x98, 0x86, 0xd7, 0xd4, 0xfc, 0xac, + 0x34, 0xd2, 0x9e, 0xda, 0x90, 0x27, 0xba, 0xaa, 0x1d, 0xc6, 0xdc, 0xfb, 0x60, 0xcd, 0x39, 0x40, 0xcc, 0xdd, 0x85, + 0x7e, 0xc3, 0x13, 0x6a, 0x1e, 0x4c, 0xf2, 0xdc, 0xe8, 0x0b, 0x44, 0x28, 0x07, 0x2d, 0xdb, 0xc5, 0xc4, 0xa5, 0xb7, + 0xd2, 0xa6, 0x81, 0x6b, 0x08, 0x49, 0xfd, 0xf7, 0x16, 0x14, 0xea, 0x5c, 0x59, 0xc8, 0x71, 0xa6, 0x6b, 0x84, 0x3e, + 0x32, 0xb4, 0x50, 0x06, 0x04, 0x1a, 0x60, 0x89, 0x7f, 0xf1, 0x4a, 0x14, 0xd4, 0x6d, 0x38, 0x09, 0x39, 0x68, 0x11, + 0x00, 0x5e, 0xfe, 0x42, 0xae, 0x4d, 0x64, 0x87, 0xd7, 0xc1, 0x87, 0x5c, 0x97, 0xbc, 0x1f, 0x2e, 0xbf, 0xd3, 0x93, + 0x03, 0x68, 0x70, 0x5a, 0x31, 0x1c, 0xd8, 0x61, 0xa1, 0x08, 0xac, 0x44, 0x7a, 0x6b, 0xda, 0xe9, 0xad, 0xf6, 0x6c, + 0x2d, 0x22, 0x64, 0x64, 0xfe, 0xd2, 0x82, 0x2b, 0x3e, 0xd2, 0x5e, 0x4e, 0xf1, 0x94, 0x60, 0x1c, 0xfd, 0x55, 0x0a, + 0xb4, 0x11, 0x2f, 0xaa, 0x48, 0x7f, 0xfa, 0xe3, 0x55, 0x92, 0xc6, 0x49, 0x6f, 0x19, 0x07, 0x51, 0xc6, 0x92, 0x1c, + 0x51, 0x75, 0x89, 0xf8, 0x11, 0xe8, 0xb9, 0x5a, 0xc7, 0x4b, 0x7f, 0x1c, 0x64, 0xf7, 0x3d, 0x87, 0xb3, 0x14, 0x4e, + 0x9f, 0x73, 0x07, 0x4e, 0x63, 0xfd, 0x1e, 0xc7, 0xe6, 0x73, 0x64, 0xfc, 0x92, 0x3a, 0x3b, 0xa3, 0x2e, 0xf3, 0xbe, + 0xf2, 0x96, 0x62, 0x84, 0x00, 0xfb, 0xe1, 0x27, 0xd6, 0x0c, 0xa8, 0x3c, 0x4c, 0xb5, 0x33, 0x61, 0x33, 0x13, 0xa9, + 0x36, 0xc8, 0xe5, 0xc5, 0x1f, 0xbb, 0x63, 0x68, 0x4e, 0x73, 0x31, 0x70, 0x3c, 0xc6, 0x3e, 0x3d, 0xeb, 0xf9, 0x90, + 0x51, 0xcb, 0xdc, 0xa7, 0xe6, 0x88, 0x4d, 0xe3, 0x84, 0x51, 0x3c, 0x59, 0xb7, 0xbb, 0xbc, 0xdb, 0x1f, 0xfc, 0xf6, + 0xe1, 0x37, 0xc3, 0x89, 0xe2, 0xac, 0x25, 0x80, 0x19, 0x3b, 0xa0, 0xd5, 0xcf, 0x33, 0x60, 0x0d, 0x09, 0xf3, 0x63, + 0x0a, 0xdd, 0xd5, 0xd3, 0xf5, 0x7e, 0x63, 0xd8, 0xae, 0x65, 0xcc, 0xcf, 0xbc, 0x84, 0x85, 0x7e, 0x16, 0xdc, 0x08, + 0x9e, 0xb1, 0x7d, 0xb4, 0xbc, 0x13, 0x73, 0x8c, 0x07, 0xde, 0x03, 0x26, 0xa9, 0xd2, 0x15, 0x31, 0x49, 0xd5, 0x62, + 0x9c, 0xa4, 0x7e, 0x6d, 0x34, 0x22, 0x92, 0x45, 0xe5, 0xa4, 0xef, 0x2c, 0xef, 0xd4, 0x23, 0xba, 0x68, 0x26, 0x4f, + 0xea, 0x6a, 0x08, 0xb2, 0x45, 0x30, 0x99, 0x84, 0x2c, 0x2f, 0x4d, 0x74, 0x79, 0x2e, 0x15, 0xe4, 0x48, 0x3c, 0xf8, + 0xa3, 0x34, 0x0e, 0x57, 0x19, 0x6b, 0x46, 0x17, 0x21, 0xc7, 0x73, 0x0a, 0xe4, 0xe0, 0xef, 0x72, 0x5f, 0x3b, 0xc0, + 0x6e, 0xc3, 0x32, 0x71, 0xfa, 0x10, 0x71, 0xd8, 0x6a, 0x97, 0xbb, 0x0e, 0xaf, 0x64, 0xa7, 0xcd, 0x86, 0x81, 0x98, + 0x70, 0x2c, 0x11, 0xf5, 0xd6, 0x6c, 0x97, 0x97, 0xc9, 0xa8, 0xab, 0xb2, 0x28, 0x2f, 0x0f, 0xe6, 0xcf, 0xd9, 0x63, + 0x2f, 0x9a, 0xf7, 0xd8, 0x0b, 0xb1, 0xc7, 0xb6, 0xaf, 0xcc, 0xc7, 0x53, 0x17, 0xfe, 0xeb, 0x17, 0x03, 0xea, 0x39, + 0x5a, 0x7b, 0x79, 0xa7, 0xb9, 0xcb, 0x3b, 0xcd, 0xf2, 0x96, 0x77, 0x1a, 0x82, 0x46, 0x7b, 0x10, 0xd3, 0xf6, 0x0c, + 0xd3, 0xd1, 0xa0, 0x10, 0xfe, 0x38, 0xa5, 0x57, 0xee, 0x21, 0xbc, 0x83, 0x56, 0x9d, 0xfa, 0x3b, 0x6f, 0xfb, 0x56, + 0xa7, 0xbd, 0x24, 0x88, 0xb6, 0x61, 0x67, 0xfe, 0x68, 0xc4, 0x26, 0xbd, 0x69, 0x3c, 0x5e, 0xa5, 0xff, 0xe2, 0xfd, + 0xe7, 0x48, 0xdc, 0x4a, 0x08, 0x2a, 0x70, 0x44, 0x53, 0x50, 0x94, 0xdc, 0x30, 0x01, 0x61, 0x2d, 0xe7, 0xa9, 0x47, + 0xe1, 0x91, 0x3d, 0xfb, 0xb0, 0x61, 0x91, 0x37, 0x23, 0xfa, 0x4f, 0x9b, 0xa5, 0xcd, 0x24, 0xe6, 0x0b, 0xd0, 0xb2, + 0x15, 0x1d, 0x0f, 0xc7, 0x06, 0x9f, 0x4d, 0xa7, 0xdb, 0xdc, 0xdd, 0x4b, 0xf1, 0xa5, 0x2b, 0x71, 0xa8, 0xf0, 0x73, + 0x8b, 0x3b, 0xa6, 0x6c, 0x87, 0xba, 0x69, 0x8d, 0xd4, 0xa0, 0x6e, 0x39, 0x10, 0x8a, 0xba, 0x7b, 0x52, 0xf9, 0xc7, + 0x2f, 0x0e, 0xe1, 0x3f, 0xe2, 0xea, 0x7f, 0xcd, 0x9a, 0x18, 0xf5, 0xb7, 0x65, 0x4b, 0x70, 0x62, 0x95, 0x90, 0x11, + 0xdf, 0xbf, 0xfe, 0x74, 0xfa, 0xb0, 0x06, 0x7b, 0xd7, 0x26, 0x53, 0xaa, 0x6a, 0xed, 0xef, 0xe3, 0x18, 0x52, 0x77, + 0xd6, 0xab, 0x0b, 0xf4, 0x90, 0xb1, 0x7b, 0x36, 0x80, 0x46, 0xe2, 0x1e, 0x41, 0x5a, 0x7c, 0x1d, 0xdb, 0xd0, 0x55, + 0xe2, 0xf5, 0xa6, 0xab, 0xc4, 0xab, 0xdd, 0x57, 0x89, 0x1f, 0xf6, 0xba, 0x4a, 0xbc, 0xfa, 0xea, 0x57, 0x89, 0xd7, + 0xf5, 0xab, 0xc4, 0x45, 0x2c, 0xec, 0x67, 0xcd, 0xb7, 0x2b, 0xfe, 0xf3, 0x23, 0x29, 0xe5, 0xce, 0xe3, 0x41, 0xc7, + 0xa1, 0x90, 0xc7, 0x17, 0x7f, 0xf8, 0x62, 0x81, 0x0b, 0xf1, 0x3d, 0x9a, 0x93, 0x15, 0x57, 0x0b, 0x4e, 0xd9, 0xf1, + 0x3b, 0x4a, 0x71, 0x18, 0x47, 0xb3, 0x9f, 0x41, 0x29, 0x0b, 0xe2, 0xc0, 0x44, 0x79, 0x11, 0xa4, 0x3f, 0xc7, 0xcb, + 0xd5, 0xf2, 0x2d, 0xc0, 0xfa, 0x18, 0xa4, 0xc1, 0x28, 0x64, 0xd2, 0x13, 0x99, 0xcc, 0xdf, 0xb8, 0x4c, 0x1c, 0x2c, + 0x4e, 0xc5, 0x4f, 0xff, 0x4e, 0xfc, 0x44, 0x9b, 0x54, 0xfe, 0x9b, 0xec, 0xea, 0xf4, 0xe6, 0x8b, 0x88, 0x50, 0x02, + 0x2a, 0x9d, 0x7e, 0xf8, 0x65, 0xe4, 0x22, 0x36, 0x1a, 0x46, 0x29, 0xec, 0x1d, 0x36, 0xc2, 0x61, 0xb5, 0x4b, 0xcd, + 0xca, 0x30, 0x65, 0x08, 0xae, 0xba, 0x18, 0x7e, 0x11, 0xaf, 0x52, 0x36, 0x89, 0x6f, 0x23, 0xdd, 0x8c, 0xa4, 0x93, + 0x01, 0x68, 0x38, 0x65, 0x1b, 0x4c, 0x1e, 0xf9, 0x01, 0x19, 0xe5, 0x38, 0x69, 0xe9, 0x90, 0xbb, 0x74, 0xb5, 0xb4, + 0x48, 0xd5, 0x6c, 0xe1, 0x10, 0x75, 0x99, 0xe5, 0xe8, 0x51, 0xab, 0x15, 0x0f, 0x1e, 0xd6, 0x52, 0x98, 0x6a, 0xc4, + 0x36, 0x97, 0x0a, 0xa7, 0xad, 0x48, 0x08, 0x17, 0x45, 0x1c, 0x8c, 0x86, 0x89, 0xe3, 0x6f, 0xc8, 0x75, 0xb5, 0x78, + 0x0b, 0x51, 0x44, 0xf2, 0x15, 0x9f, 0x0f, 0x1e, 0x15, 0x82, 0x1e, 0x5f, 0x2a, 0x68, 0x7c, 0x77, 0xc3, 0x92, 0xd0, + 0xbf, 0x6f, 0x19, 0x79, 0x1c, 0xfd, 0x08, 0x08, 0x78, 0x15, 0xdf, 0x46, 0x6a, 0x05, 0x4c, 0xd6, 0xd2, 0xb0, 0x96, + 0x1a, 0xe3, 0x97, 0x80, 0xe3, 0x8a, 0xd2, 0x03, 0x48, 0x93, 0x3b, 0x63, 0x7f, 0x37, 0xe9, 0xdf, 0x7f, 0x18, 0xb9, + 0x79, 0x1e, 0xcb, 0x0f, 0xfd, 0xb2, 0xdc, 0xe3, 0x33, 0x4f, 0x9f, 0x3e, 0xda, 0x3c, 0xec, 0x72, 0x7a, 0xf6, 0x86, + 0xd6, 0xc6, 0xc6, 0x5d, 0x00, 0xbd, 0xb8, 0x88, 0x57, 0xe3, 0x39, 0x1a, 0xba, 0x7e, 0xbd, 0xf1, 0x66, 0x00, 0x13, + 0xb3, 0x94, 0xca, 0xa1, 0x57, 0x8a, 0x0a, 0x2c, 0xe0, 0xf7, 0x5f, 0x43, 0x00, 0xce, 0xff, 0x21, 0x1a, 0xea, 0xab, + 0x86, 0xdf, 0xe2, 0x83, 0x87, 0x2d, 0xde, 0x3e, 0x24, 0xd3, 0xe4, 0xa1, 0x2d, 0x84, 0x72, 0xad, 0x99, 0xc8, 0xe4, + 0x55, 0xa4, 0xa9, 0x61, 0xe4, 0x36, 0x45, 0xc8, 0x13, 0x5f, 0x61, 0x36, 0x5d, 0xd3, 0xb9, 0xa3, 0x81, 0xc9, 0x38, + 0xb5, 0xaa, 0x10, 0x19, 0x6e, 0xf2, 0xc0, 0x90, 0x7c, 0x55, 0xdf, 0x2d, 0x82, 0xc8, 0xc4, 0x28, 0xf0, 0xf5, 0x37, + 0xfe, 0x1d, 0xc4, 0x41, 0x06, 0xe2, 0x56, 0x7d, 0x05, 0x85, 0xa6, 0xea, 0x37, 0x07, 0xa9, 0x9e, 0xf4, 0x46, 0x4c, + 0x08, 0x2d, 0xde, 0xf0, 0x1b, 0x4d, 0xd3, 0x34, 0x79, 0x8d, 0xd0, 0xe4, 0x3d, 0x02, 0xcb, 0xf1, 0x3a, 0x00, 0xda, + 0x92, 0x7c, 0x79, 0x47, 0x25, 0x70, 0x33, 0x40, 0x9d, 0xac, 0x28, 0xe0, 0xa1, 0xfe, 0x3a, 0x8e, 0x28, 0x10, 0x17, + 0x7a, 0x08, 0xd3, 0xe6, 0x27, 0x10, 0x11, 0xb8, 0xa7, 0xe1, 0x85, 0x1d, 0xdf, 0x72, 0x49, 0xb0, 0xe6, 0xd0, 0xe3, + 0xb0, 0xcf, 0x9a, 0x63, 0xc2, 0x45, 0x0a, 0x15, 0x04, 0xad, 0x43, 0x25, 0xc4, 0xb3, 0xc9, 0x1a, 0x68, 0x23, 0xde, + 0x8b, 0xee, 0xb2, 0x05, 0x8b, 0x56, 0x3a, 0xe6, 0x84, 0xc2, 0x18, 0x7d, 0x50, 0xe7, 0x15, 0x31, 0x5b, 0x40, 0x6d, + 0x9a, 0x5b, 0xce, 0xe9, 0x2c, 0x4c, 0x39, 0x49, 0xf5, 0xcd, 0x31, 0x57, 0x6c, 0xa6, 0x9c, 0xb6, 0x55, 0x4f, 0x08, + 0x3e, 0xa5, 0x71, 0xd5, 0x91, 0x8b, 0x2c, 0xa1, 0x01, 0x06, 0x45, 0xc7, 0xe0, 0xe2, 0x22, 0x81, 0xf6, 0x96, 0x5f, + 0x9d, 0x34, 0xa9, 0x91, 0xf1, 0x2b, 0x82, 0xa2, 0xc4, 0xa8, 0x83, 0xe1, 0xfd, 0x84, 0xc0, 0x44, 0x1b, 0xe1, 0x8c, + 0x6b, 0x70, 0x36, 0x0c, 0xfa, 0x13, 0xbb, 0xa7, 0x83, 0x84, 0x50, 0xf5, 0x89, 0xdd, 0x83, 0xed, 0xdf, 0x6b, 0x90, + 0xa6, 0xe8, 0x5b, 0xc8, 0xb5, 0x09, 0xa1, 0xfe, 0xc7, 0x10, 0xac, 0x6a, 0xcb, 0x06, 0x72, 0xf2, 0x2d, 0x54, 0x1c, + 0x51, 0x0c, 0x59, 0x9d, 0xc5, 0x26, 0xe6, 0x26, 0xfe, 0xad, 0x46, 0x1c, 0x5b, 0x0d, 0x5b, 0xc3, 0x78, 0xe6, 0x3a, + 0xce, 0x41, 0xad, 0x3e, 0x08, 0xb2, 0x9b, 0x6a, 0x1b, 0x66, 0x36, 0x70, 0x1d, 0x2b, 0x78, 0x66, 0x7b, 0xfd, 0xda, + 0x19, 0xad, 0xc4, 0x92, 0x1c, 0xa2, 0xf8, 0xeb, 0xf4, 0xc9, 0xba, 0x55, 0xdb, 0x90, 0x46, 0xd5, 0x64, 0x1e, 0xfb, + 0x96, 0x73, 0xf9, 0xd7, 0xb0, 0x7e, 0xf4, 0x53, 0x24, 0x4b, 0xca, 0x6b, 0x32, 0x84, 0x68, 0xc8, 0x2d, 0xd8, 0x46, + 0x7f, 0xd1, 0x9e, 0x6b, 0x2d, 0xda, 0x3e, 0x86, 0x31, 0x94, 0xe9, 0xb2, 0x85, 0x4f, 0x99, 0x0a, 0xa0, 0xf2, 0xc5, + 0xb4, 0x4a, 0xe1, 0x78, 0xdc, 0x55, 0x56, 0x68, 0xf4, 0xb6, 0x72, 0x0b, 0x08, 0x7f, 0xc3, 0xf1, 0x69, 0x8f, 0x20, + 0x2e, 0x01, 0xd4, 0x80, 0xd8, 0xe9, 0x3b, 0x01, 0xae, 0x96, 0x65, 0x70, 0xe5, 0x43, 0x72, 0x7f, 0x60, 0x78, 0xe8, + 0xa0, 0x0e, 0x4d, 0xc2, 0x6b, 0x3e, 0xee, 0x1e, 0x08, 0x92, 0x45, 0x93, 0x32, 0xc0, 0xca, 0xf9, 0xb5, 0x3f, 0xb8, + 0x12, 0x45, 0x81, 0xa4, 0x02, 0x71, 0x03, 0x45, 0xc9, 0xe3, 0x08, 0x17, 0x3f, 0x6d, 0xb7, 0x60, 0x2f, 0x2e, 0x06, + 0x1b, 0x50, 0x44, 0x30, 0xd9, 0x4c, 0x11, 0x8a, 0x43, 0xe4, 0x6a, 0x74, 0x0b, 0x6e, 0x09, 0x46, 0x74, 0xe3, 0x4a, + 0xcc, 0x84, 0x4d, 0x61, 0xd1, 0x26, 0xe0, 0xb1, 0x28, 0xf7, 0x95, 0x5a, 0x07, 0xbb, 0xa5, 0xd6, 0xd9, 0x2e, 0xa9, + 0x35, 0xb9, 0x53, 0xdd, 0x26, 0xfe, 0x52, 0xf1, 0xc8, 0x13, 0xcc, 0xb9, 0xea, 0x98, 0x57, 0x12, 0x75, 0xa3, 0xf7, + 0x95, 0x68, 0x55, 0x83, 0x46, 0x56, 0x82, 0x28, 0xfe, 0x56, 0x2e, 0x28, 0x42, 0xa1, 0xae, 0xca, 0xc6, 0x2f, 0x0a, + 0xd9, 0x38, 0xdd, 0x6a, 0x0a, 0x47, 0x1a, 0xc1, 0xfd, 0x2b, 0x4e, 0x6a, 0xf2, 0x76, 0x50, 0x38, 0xab, 0x15, 0x3d, + 0x55, 0xdc, 0xaf, 0x8a, 0x8b, 0x86, 0xe2, 0xd4, 0x27, 0x6e, 0x19, 0x65, 0xdf, 0xbe, 0x72, 0xd5, 0xc2, 0xfb, 0xaa, + 0x28, 0x07, 0xa9, 0x3b, 0x76, 0x59, 0x16, 0xab, 0xcb, 0xa6, 0xec, 0x7e, 0xa3, 0xbe, 0x56, 0x16, 0x89, 0xf4, 0x93, + 0x21, 0x04, 0x0b, 0x31, 0x7d, 0x45, 0xaf, 0x2d, 0x6d, 0x20, 0xb0, 0x93, 0x0d, 0x6e, 0x7d, 0xbb, 0xa5, 0xf3, 0x94, + 0x2f, 0xa1, 0xd0, 0xc2, 0xab, 0x32, 0x08, 0xc4, 0xef, 0xd5, 0xba, 0xe1, 0x94, 0xc7, 0x43, 0x9e, 0x9f, 0xef, 0x20, + 0x5e, 0xd4, 0x1c, 0x55, 0x91, 0x8f, 0x3b, 0xd3, 0x22, 0xf3, 0x5c, 0xac, 0x5a, 0x07, 0x4a, 0x42, 0x9c, 0x35, 0xf7, + 0x8c, 0x29, 0xcb, 0xe8, 0x79, 0x8d, 0x9e, 0xf8, 0x2e, 0x5f, 0x3a, 0xc9, 0x2a, 0xc2, 0xd8, 0xf6, 0x56, 0x96, 0xf8, + 0xe3, 0x4f, 0x4a, 0x97, 0x85, 0x9c, 0x13, 0x64, 0xc0, 0x65, 0x4d, 0x41, 0xdf, 0xc7, 0x50, 0x90, 0xac, 0x67, 0x7b, + 0xa9, 0x22, 0x7d, 0xe9, 0x3d, 0x76, 0xda, 0xfe, 0x8b, 0xe9, 0x61, 0x45, 0x28, 0xea, 0x75, 0xca, 0x22, 0xf3, 0x0d, + 0xfd, 0xc8, 0xe6, 0xab, 0xc5, 0x68, 0xad, 0xca, 0x56, 0x15, 0x91, 0x6b, 0x5d, 0xcc, 0xaa, 0x7e, 0x76, 0x3a, 0x9d, + 0x96, 0x05, 0x8d, 0x8e, 0x76, 0x88, 0xc2, 0xc2, 0xc7, 0x8e, 0xe3, 0x54, 0xfb, 0xbe, 0x1d, 0xed, 0x16, 0xca, 0x6d, + 0xbb, 0x8d, 0x3d, 0x46, 0xdc, 0xee, 0xc2, 0x5f, 0x1d, 0x1d, 0xb9, 0x5d, 0xec, 0xec, 0x92, 0x59, 0x44, 0x9f, 0x8c, + 0x21, 0x82, 0x8c, 0x2d, 0xd2, 0xde, 0x98, 0xa1, 0x0e, 0xc6, 0x56, 0x36, 0x34, 0x1a, 0x0e, 0x58, 0x33, 0x30, 0x15, + 0x71, 0xc5, 0xaa, 0x70, 0x34, 0x94, 0x87, 0xd7, 0x84, 0xf7, 0xe2, 0x23, 0xb8, 0x51, 0xd6, 0x75, 0x99, 0x36, 0x0e, + 0xab, 0xe3, 0xfc, 0xa5, 0x54, 0x4f, 0x83, 0x03, 0x70, 0x2d, 0x14, 0xda, 0x24, 0x9f, 0xc5, 0xbf, 0xa5, 0xfc, 0xff, + 0xc5, 0xf2, 0xae, 0x6c, 0x3f, 0xd2, 0x05, 0x89, 0x76, 0xb1, 0x5b, 0xa8, 0xd7, 0x4d, 0x6b, 0x40, 0x5a, 0x19, 0x4c, + 0x55, 0x05, 0x3a, 0x28, 0xe9, 0x4b, 0x09, 0x40, 0x1a, 0xc4, 0xef, 0xc8, 0x31, 0xc3, 0x14, 0x17, 0x22, 0xc4, 0x22, + 0x7d, 0x1d, 0x8c, 0xc1, 0x7c, 0xde, 0x45, 0xfd, 0x41, 0x69, 0x4d, 0x80, 0x36, 0xbe, 0x36, 0xb6, 0xbd, 0xc4, 0xfd, + 0x55, 0xbd, 0x96, 0x00, 0x0c, 0x28, 0x73, 0x61, 0x13, 0xa2, 0x21, 0x81, 0x56, 0x59, 0xdc, 0xd4, 0x4b, 0xf9, 0x56, + 0xd5, 0xb3, 0x89, 0x8e, 0x21, 0xb8, 0xe6, 0x2a, 0x04, 0x5b, 0x68, 0x0b, 0x60, 0xb0, 0x7c, 0xf9, 0xe1, 0xb3, 0x05, + 0x53, 0xac, 0xae, 0x47, 0x17, 0xa7, 0x1c, 0xd7, 0xaf, 0x85, 0x67, 0x67, 0x4a, 0xfb, 0x1f, 0xe5, 0x8b, 0x3f, 0x34, + 0x0a, 0xf4, 0x2e, 0x4a, 0x12, 0x3a, 0x6e, 0x2d, 0xee, 0x19, 0x7b, 0xd5, 0x5e, 0x04, 0xd1, 0xfe, 0x75, 0xfd, 0xbb, + 0xbd, 0xeb, 0xc2, 0x81, 0xb1, 0x77, 0x65, 0x38, 0x71, 0xc8, 0x72, 0x21, 0x1b, 0xfc, 0xa0, 0x08, 0x14, 0x55, 0xaf, + 0x63, 0x1d, 0x5b, 0x11, 0x97, 0x7f, 0xb1, 0x1a, 0x0c, 0x4f, 0xce, 0xee, 0x16, 0xa1, 0x76, 0xc3, 0x12, 0x48, 0xed, + 0x33, 0xd0, 0x5d, 0xdb, 0xd1, 0x35, 0xf4, 0xa1, 0x0d, 0xa2, 0xd9, 0x40, 0xff, 0xe5, 0xe2, 0x8d, 0xd5, 0xd5, 0xcf, + 0x40, 0x45, 0x7b, 0x33, 0xc3, 0x63, 0xef, 0xdc, 0xbf, 0x67, 0xc9, 0xb5, 0xa7, 0x6b, 0x98, 0xc1, 0x87, 0x0e, 0x3c, + 0x2c, 0xd3, 0x3c, 0x7d, 0x8f, 0x44, 0x11, 0x9a, 0xc8, 0xf5, 0xa6, 0x03, 0xc9, 0x71, 0xbd, 0xae, 0xe6, 0x7a, 0x87, + 0xf6, 0x51, 0x57, 0x3f, 0xfd, 0x46, 0xd3, 0x4e, 0x26, 0x6c, 0x9a, 0x9e, 0xe2, 0x15, 0xed, 0x04, 0xcf, 0x08, 0xfa, + 0xad, 0x69, 0xf6, 0x38, 0x4c, 0x2d, 0x57, 0x5b, 0xf3, 0x47, 0x4d, 0x9b, 0x06, 0x61, 0xd8, 0xd3, 0x1e, 0x4f, 0xbd, + 0xe9, 0xe1, 0xf4, 0x45, 0x9f, 0x17, 0xe7, 0xdf, 0x94, 0xaa, 0x9b, 0xf4, 0xaf, 0xa7, 0x34, 0x4b, 0xb3, 0x24, 0xfe, + 0xc4, 0xb8, 0xd9, 0x89, 0x26, 0x2f, 0x8f, 0xd5, 0xa6, 0x5e, 0xfd, 0x4b, 0x6e, 0x77, 0x34, 0x9e, 0x7a, 0x45, 0x75, + 0xec, 0xe3, 0x81, 0xec, 0xe4, 0xc9, 0x81, 0xe8, 0xfa, 0x89, 0x8a, 0x26, 0xd7, 0x6a, 0x42, 0x94, 0xab, 0xf3, 0x31, + 0xce, 0xc4, 0xf8, 0x4e, 0x20, 0x0e, 0xa3, 0x74, 0xd7, 0x85, 0x1e, 0xe8, 0xda, 0x64, 0xa0, 0xff, 0xe8, 0x7a, 0x5d, + 0xd3, 0x75, 0x8f, 0xec, 0xa3, 0xee, 0xd8, 0x31, 0x0f, 0xed, 0x43, 0xab, 0x6d, 0x1f, 0x99, 0x5d, 0xab, 0x6b, 0x76, + 0xff, 0xd6, 0x1d, 0x5b, 0x87, 0xf6, 0xa1, 0xe9, 0x58, 0x5d, 0x28, 0xb4, 0xba, 0x56, 0xf7, 0xc6, 0x3a, 0xec, 0x8e, + 0x1d, 0x2c, 0xf5, 0xec, 0x4e, 0xc7, 0x72, 0x1d, 0xbb, 0xd3, 0x31, 0x3b, 0xf6, 0xd1, 0x91, 0xe5, 0xb6, 0xed, 0xa3, + 0xa3, 0xf3, 0x4e, 0xd7, 0x6e, 0xc3, 0xbb, 0x76, 0x7b, 0xdc, 0xb6, 0x5d, 0xd7, 0x82, 0xbf, 0xcc, 0xae, 0xed, 0xd1, + 0x0f, 0xd7, 0xb5, 0xdb, 0xae, 0xe9, 0x84, 0x1d, 0xcf, 0x3e, 0x7a, 0x61, 0xe2, 0xdf, 0x58, 0xcd, 0xc4, 0xbf, 0x00, + 0x8c, 0xf9, 0xc2, 0xf6, 0x8e, 0xe8, 0x17, 0x02, 0xbc, 0x39, 0xec, 0xfe, 0xaa, 0x1f, 0x6c, 0x1c, 0x83, 0x4b, 0x63, + 0xe8, 0x76, 0xec, 0x76, 0xdb, 0x3c, 0x74, 0xed, 0x6e, 0x7b, 0x6e, 0x1d, 0x7a, 0xf6, 0xd1, 0xf1, 0xd8, 0x72, 0xed, + 0xe3, 0x63, 0xd3, 0xb1, 0xda, 0xb6, 0x67, 0xba, 0xf6, 0x61, 0x1b, 0x7f, 0xb4, 0x6d, 0xef, 0xe6, 0xf8, 0x85, 0x7d, + 0xd4, 0x99, 0x1f, 0xd9, 0x87, 0x1f, 0x0f, 0xbb, 0xb6, 0xd7, 0x9e, 0xb7, 0x8f, 0x6c, 0xef, 0xf8, 0xe6, 0xc8, 0x3e, + 0x9c, 0x5b, 0xde, 0xd1, 0xd6, 0x96, 0xae, 0x67, 0x03, 0x8e, 0xf0, 0x35, 0xbc, 0x30, 0xf9, 0x0b, 0xf8, 0x33, 0xc7, + 0xb6, 0xff, 0x45, 0x30, 0x69, 0xbd, 0xe9, 0x0b, 0xbb, 0x7b, 0x3c, 0xa6, 0xea, 0x50, 0x60, 0x89, 0x1a, 0xd0, 0xe4, + 0xc6, 0xa2, 0xcf, 0x22, 0x38, 0x4b, 0x00, 0x12, 0x7f, 0xf8, 0xc7, 0x6e, 0x2c, 0xf8, 0x30, 0x7d, 0xf7, 0x7f, 0x0a, + 0x47, 0x4e, 0x39, 0x64, 0xae, 0xfc, 0x86, 0xff, 0x43, 0x49, 0x5f, 0x86, 0xe6, 0xf9, 0x26, 0x45, 0xc5, 0xfb, 0xdd, + 0x8a, 0x8a, 0x37, 0xab, 0x7d, 0x14, 0x15, 0xef, 0xbf, 0xba, 0xa2, 0xe2, 0xbc, 0x6a, 0x27, 0xff, 0xbe, 0x1a, 0x9b, + 0xfe, 0xd7, 0x75, 0xf5, 0x1a, 0x12, 0xf8, 0xad, 0xcb, 0x8b, 0xd5, 0x15, 0x44, 0x57, 0x7a, 0x1f, 0x0f, 0xde, 0xac, + 0x4a, 0x46, 0x60, 0x31, 0xd0, 0xd8, 0xf7, 0x31, 0xd1, 0xd8, 0xdf, 0x57, 0x03, 0xb0, 0x3c, 0xe1, 0x7c, 0x49, 0x30, + 0xb1, 0xe6, 0x7e, 0x38, 0x95, 0x3c, 0x0d, 0x94, 0xf4, 0xb1, 0x18, 0xbc, 0x12, 0xe0, 0xb8, 0x06, 0x75, 0xd8, 0x6a, + 0x11, 0xa5, 0xbd, 0x23, 0x07, 0x0e, 0x52, 0x6f, 0x9a, 0xe4, 0x95, 0xc6, 0xb6, 0x88, 0x47, 0x75, 0xcd, 0xbd, 0x26, + 0x36, 0xbe, 0x47, 0xa3, 0xc0, 0x66, 0xe8, 0x6e, 0x1d, 0xae, 0x06, 0xd6, 0x36, 0xc2, 0x68, 0x12, 0xd8, 0xb9, 0xa6, + 0xf7, 0x65, 0xd3, 0xbc, 0x8a, 0x31, 0xe6, 0xe6, 0x9e, 0x42, 0x4f, 0xaa, 0xed, 0xdd, 0xb2, 0x69, 0xdf, 0xae, 0x61, + 0x36, 0x7c, 0xbe, 0xd4, 0x7c, 0x8b, 0x5d, 0xa1, 0x04, 0x5c, 0x45, 0x55, 0x25, 0xb3, 0x5a, 0x23, 0x42, 0x0a, 0xee, + 0xbe, 0x30, 0x3e, 0x2c, 0x58, 0x4b, 0x47, 0x43, 0x7e, 0xc7, 0x51, 0xde, 0x95, 0x60, 0xaa, 0x06, 0x8b, 0xcf, 0xd6, + 0xc8, 0x71, 0x07, 0xbf, 0x03, 0xeb, 0xc8, 0x39, 0x9e, 0x51, 0xac, 0xe2, 0x79, 0xad, 0xc0, 0xa5, 0xcb, 0x4c, 0x3e, + 0x77, 0xd7, 0x75, 0xe6, 0x71, 0xa3, 0xa9, 0xb2, 0xcb, 0x16, 0x82, 0x0b, 0xc2, 0xcf, 0x93, 0x61, 0x70, 0x4e, 0xc6, + 0xdb, 0x68, 0xfb, 0xbc, 0x0d, 0x98, 0xa8, 0xf7, 0x18, 0x16, 0xb1, 0xc9, 0x1f, 0xd4, 0xb8, 0x00, 0xeb, 0x29, 0x64, + 0xc1, 0xee, 0x21, 0x9b, 0xa6, 0xf0, 0xa8, 0x1e, 0x5a, 0x31, 0xf7, 0xb7, 0x18, 0xd8, 0xa8, 0x80, 0x39, 0x10, 0xb4, + 0x86, 0xde, 0x66, 0x93, 0x23, 0x9d, 0x47, 0xd6, 0x25, 0x15, 0xb5, 0xdb, 0x39, 0x36, 0xdd, 0x23, 0xd3, 0x3e, 0xee, + 0x18, 0xb9, 0xd8, 0x70, 0x2a, 0xc8, 0x12, 0x42, 0xc0, 0x28, 0x5a, 0x76, 0x33, 0x88, 0x82, 0x2c, 0xf0, 0xc3, 0x1c, + 0xf8, 0xe3, 0xf2, 0xad, 0xe2, 0x9f, 0xab, 0x34, 0x83, 0x31, 0x0a, 0xa6, 0x17, 0x0d, 0xc2, 0xad, 0x11, 0xcb, 0x6e, + 0x19, 0x8b, 0x36, 0x28, 0xcb, 0xab, 0xf6, 0xe5, 0x7f, 0x9e, 0xb5, 0x6d, 0x4e, 0x96, 0x2c, 0xa3, 0x2c, 0xe2, 0xeb, + 0x43, 0x18, 0x43, 0xe7, 0x43, 0xf3, 0xa7, 0x4d, 0x04, 0xf7, 0x9f, 0xbb, 0x09, 0x6e, 0xc6, 0xf6, 0x21, 0xb8, 0xff, + 0xfc, 0xea, 0x04, 0xf7, 0x27, 0x95, 0xe0, 0x96, 0x7c, 0x81, 0x0a, 0xa9, 0xf3, 0x07, 0x7c, 0x6e, 0x41, 0x50, 0xe7, + 0xe7, 0xfa, 0x01, 0x31, 0xf0, 0xba, 0x92, 0x6c, 0xf7, 0x63, 0x29, 0x7b, 0x10, 0x0a, 0x45, 0x30, 0x08, 0x2d, 0x65, + 0x2a, 0x81, 0x44, 0xb4, 0x32, 0xa5, 0x3a, 0xc0, 0x7c, 0x1b, 0x65, 0xa1, 0xfd, 0x9e, 0x5f, 0xfc, 0x40, 0xc9, 0xf3, + 0x26, 0x4e, 0x16, 0x3e, 0x06, 0xe0, 0xd3, 0x31, 0xeb, 0x20, 0x3c, 0x38, 0xe0, 0x7f, 0x36, 0x8e, 0xa3, 0x89, 0xd4, + 0x54, 0xb0, 0xc1, 0x25, 0x71, 0xdc, 0xfa, 0x3d, 0xf3, 0x13, 0xdd, 0xa4, 0xd7, 0x30, 0xb9, 0xcf, 0xda, 0xce, 0x33, + 0xef, 0xf0, 0xd9, 0x91, 0x03, 0xff, 0xbb, 0xac, 0x9d, 0x9b, 0xbc, 0xe2, 0x22, 0x8e, 0x20, 0xf1, 0x89, 0xa8, 0xb9, + 0xa9, 0xda, 0x2d, 0x63, 0x9f, 0x8a, 0x5a, 0xc7, 0xcd, 0x95, 0x26, 0xfe, 0x7d, 0x51, 0xa7, 0xb1, 0xc6, 0x3c, 0x5e, + 0x29, 0xdd, 0x6a, 0xe8, 0x4d, 0x10, 0xad, 0x40, 0xf6, 0xa6, 0xd4, 0x50, 0x5f, 0xf3, 0xe1, 0x16, 0xe3, 0x62, 0xed, + 0xfc, 0xaa, 0xc8, 0xae, 0x24, 0xb2, 0xbc, 0xec, 0xc4, 0x20, 0x57, 0x5b, 0x38, 0x18, 0x9b, 0x1d, 0xf3, 0x0b, 0x69, + 0x90, 0xdb, 0x50, 0x4c, 0x90, 0x4f, 0x13, 0x94, 0x25, 0xab, 0x68, 0xdc, 0xc2, 0x9f, 0xfe, 0x28, 0x6d, 0x05, 0x07, + 0x10, 0x9d, 0x15, 0x3f, 0x6c, 0xe0, 0xac, 0xf9, 0xa7, 0x4e, 0x91, 0x8a, 0x22, 0x15, 0xb3, 0xe2, 0x3f, 0xcb, 0xcc, + 0x84, 0x12, 0xd8, 0xe2, 0xd4, 0x5a, 0x03, 0xff, 0x99, 0x6c, 0xf8, 0x2c, 0x33, 0x21, 0x89, 0x2c, 0x4c, 0xf7, 0xd3, + 0xa7, 0x54, 0x0b, 0xd2, 0x3a, 0xd2, 0xb0, 0xce, 0xc6, 0x45, 0x78, 0x37, 0xcd, 0x9f, 0xc5, 0x14, 0xe1, 0xad, 0x37, + 0x36, 0xe3, 0xe7, 0xcf, 0x4f, 0x07, 0xae, 0xc1, 0x93, 0x92, 0x96, 0x32, 0x68, 0x9d, 0xef, 0x67, 0x7c, 0x60, 0x34, + 0xba, 0xc5, 0x2d, 0xe1, 0xce, 0xe4, 0x08, 0x13, 0x65, 0x4e, 0xbd, 0x20, 0xa3, 0x05, 0x29, 0x19, 0x7d, 0x61, 0x04, + 0x20, 0xea, 0xc8, 0x5b, 0x57, 0xdb, 0x76, 0x6c, 0x47, 0x97, 0x0d, 0xa7, 0xc1, 0x6c, 0xb0, 0x8e, 0x33, 0x1f, 0x72, + 0x03, 0x85, 0xf1, 0x0c, 0x7c, 0x6b, 0xb2, 0x20, 0x0b, 0x21, 0xd1, 0x0c, 0x38, 0xd9, 0x2c, 0xe8, 0x5e, 0x9e, 0x73, + 0x8b, 0x67, 0x3f, 0xf9, 0x84, 0xc9, 0x06, 0x85, 0x5b, 0x1d, 0x46, 0x1c, 0xfa, 0x11, 0x0e, 0xc3, 0x96, 0xde, 0x82, + 0x54, 0x97, 0x2c, 0x49, 0x2d, 0xd5, 0x83, 0xa0, 0xa7, 0x41, 0x1b, 0x48, 0x43, 0x8f, 0x00, 0xa6, 0x89, 0xbf, 0x80, + 0x98, 0xec, 0xeb, 0xdc, 0xe4, 0x94, 0x56, 0xe7, 0xa4, 0x56, 0x73, 0x5f, 0x1c, 0x99, 0x9a, 0xe7, 0x9a, 0x9a, 0x03, + 0xe4, 0x56, 0xcf, 0xcd, 0x75, 0x7e, 0xd5, 0xdf, 0xa5, 0x04, 0x25, 0xfa, 0xf2, 0x98, 0xc6, 0x41, 0xea, 0x4f, 0x2e, + 0x5e, 0xce, 0x28, 0x80, 0x64, 0x4b, 0x89, 0x96, 0x1e, 0x90, 0x22, 0xe4, 0x82, 0xdd, 0x65, 0x06, 0x26, 0x62, 0xe1, + 0x55, 0x02, 0x63, 0x8d, 0xce, 0x7f, 0x41, 0xa4, 0x05, 0x9f, 0x3f, 0xb7, 0x02, 0x70, 0x70, 0x18, 0x28, 0xf8, 0x81, + 0x67, 0xa3, 0x84, 0xb0, 0xa0, 0x50, 0xdd, 0x21, 0xb2, 0xc0, 0xfb, 0x08, 0xfe, 0x2d, 0x8a, 0xc5, 0x0f, 0xae, 0x3a, + 0xb5, 0x43, 0x3f, 0x9a, 0x01, 0x49, 0xf3, 0xa3, 0x59, 0xcd, 0x44, 0x83, 0xfc, 0x17, 0x2b, 0xa5, 0x05, 0xa8, 0xc2, + 0x7c, 0x22, 0xfd, 0xfe, 0xfe, 0x82, 0x12, 0x4d, 0x41, 0x52, 0x73, 0x7f, 0x82, 0xce, 0x76, 0x85, 0x76, 0xe7, 0xf9, + 0xe0, 0xdb, 0x93, 0x05, 0xcb, 0x7c, 0x12, 0x0d, 0xc3, 0xe5, 0x17, 0xd8, 0x01, 0x6d, 0x2c, 0x92, 0xc4, 0x52, 0x32, + 0xf9, 0x09, 0xbb, 0x09, 0xc6, 0xfc, 0x5e, 0x6a, 0x6a, 0xfc, 0x9c, 0xb2, 0xd0, 0x0a, 0x6c, 0xe0, 0x9a, 0x64, 0x84, + 0x3c, 0xf6, 0x31, 0xcc, 0xe4, 0x20, 0x8a, 0xf5, 0xd3, 0x6f, 0xa5, 0xbf, 0xd6, 0xa6, 0x49, 0x80, 0x6c, 0x8f, 0x97, + 0x09, 0x0b, 0xff, 0x35, 0xf8, 0x16, 0x0e, 0xee, 0x6f, 0xaf, 0x74, 0xa3, 0x9f, 0xd9, 0xf3, 0x84, 0x4d, 0x07, 0xdf, + 0x36, 0x64, 0x3d, 0xc4, 0xeb, 0x3d, 0xf5, 0x45, 0x6f, 0x7b, 0x45, 0x70, 0xa0, 0xf6, 0x5e, 0x97, 0xfa, 0x53, 0x7e, + 0x5b, 0x87, 0x1b, 0xe0, 0xba, 0x74, 0xc7, 0x76, 0xfb, 0x78, 0x7f, 0x1e, 0x85, 0xfe, 0xf8, 0x53, 0x9f, 0xde, 0x94, + 0x1e, 0x2c, 0x38, 0xad, 0xc7, 0xfe, 0xb2, 0x87, 0xc7, 0xab, 0x5a, 0x08, 0xee, 0x9a, 0x54, 0x2a, 0x39, 0xbb, 0xc6, + 0xb5, 0x8c, 0x4b, 0x79, 0x8d, 0x5f, 0xc6, 0x4f, 0xdd, 0xce, 0x83, 0x8c, 0x89, 0x4f, 0xe1, 0x43, 0x9e, 0x8b, 0x8b, + 0x3a, 0x5d, 0x51, 0xf1, 0x62, 0x6d, 0xb7, 0x35, 0xb7, 0xfb, 0xb7, 0xce, 0x8d, 0xeb, 0xcc, 0x3d, 0xd7, 0xee, 0x7e, + 0x74, 0xbb, 0xf3, 0xb6, 0x7d, 0x1c, 0x5a, 0x6d, 0xfb, 0x18, 0xfe, 0x7c, 0x3c, 0xb6, 0xbb, 0x73, 0xcb, 0xb3, 0x0f, + 0x3f, 0xba, 0x5e, 0x68, 0x75, 0xed, 0x63, 0xf8, 0x73, 0x4e, 0xad, 0xe0, 0x02, 0x44, 0xf7, 0x9d, 0x6f, 0x4b, 0x54, + 0x40, 0xf9, 0x2d, 0xf5, 0x34, 0x66, 0xe9, 0x78, 0x6b, 0xd0, 0xf5, 0x00, 0xc9, 0xd0, 0x4d, 0x11, 0x04, 0x32, 0xea, + 0xb7, 0x20, 0x0d, 0x3b, 0x26, 0x10, 0x10, 0x26, 0x2f, 0xc2, 0x2f, 0x55, 0x84, 0xd2, 0x6f, 0xdc, 0x46, 0xbc, 0x4d, + 0x73, 0xc0, 0x75, 0x91, 0x99, 0x8a, 0x94, 0x43, 0xbf, 0x2c, 0x31, 0x88, 0x91, 0x08, 0x11, 0xaf, 0x50, 0xa5, 0x22, + 0x3b, 0x62, 0xbe, 0xbb, 0xe3, 0xe8, 0x99, 0xcb, 0x64, 0x76, 0x9e, 0xaf, 0x0a, 0x9b, 0x2b, 0x8c, 0x24, 0xf4, 0x3f, + 0x0a, 0x07, 0x93, 0xd2, 0x12, 0x1c, 0x11, 0xcd, 0x75, 0x12, 0x24, 0xb2, 0x7b, 0x0a, 0x89, 0x76, 0x9b, 0x23, 0xd5, + 0x1b, 0x90, 0xc6, 0xe4, 0x2d, 0x70, 0xc9, 0x37, 0x7e, 0xa8, 0x18, 0xb7, 0x28, 0x2d, 0x1f, 0x49, 0xca, 0xff, 0xf4, + 0x69, 0xd1, 0x39, 0xab, 0xd2, 0xef, 0x13, 0xb7, 0x03, 0xc7, 0x6e, 0x87, 0xb5, 0xb7, 0xda, 0x59, 0xed, 0x0e, 0x07, + 0x5c, 0x84, 0x0b, 0x15, 0xb6, 0x14, 0x42, 0x8b, 0xbb, 0xd1, 0xd8, 0xab, 0xa6, 0xc3, 0x85, 0x40, 0xca, 0x95, 0xab, + 0x8e, 0x6e, 0xf4, 0x23, 0xa1, 0x92, 0x8c, 0xb6, 0x84, 0x40, 0xe6, 0x77, 0x31, 0x1d, 0x50, 0xb3, 0x65, 0x1c, 0x3b, + 0x9c, 0x46, 0xff, 0xd7, 0x83, 0x40, 0x07, 0x2e, 0xd0, 0xa1, 0x56, 0x76, 0x6b, 0xc9, 0xa1, 0x47, 0x9e, 0xab, 0x74, + 0xa0, 0xb2, 0xf4, 0x4c, 0x87, 0x22, 0xc8, 0x6f, 0x85, 0x29, 0xed, 0xa4, 0x01, 0x99, 0x3c, 0x2d, 0x8a, 0x02, 0x33, + 0x80, 0x18, 0xe0, 0x2d, 0xe1, 0x4c, 0x66, 0x3c, 0x7d, 0xba, 0xf1, 0x10, 0x22, 0x85, 0xbd, 0x9a, 0xd9, 0x53, 0x57, + 0xe9, 0x9b, 0xae, 0x92, 0x18, 0x09, 0x17, 0xa9, 0x86, 0xb0, 0x7b, 0xa3, 0xb5, 0x87, 0x3f, 0x47, 0xcc, 0xcf, 0x6c, + 0xae, 0x69, 0x6a, 0x29, 0x87, 0xbb, 0xe9, 0xb2, 0x36, 0x58, 0xbc, 0xf1, 0x58, 0x67, 0x3c, 0x96, 0xe0, 0x93, 0xf5, + 0xc7, 0x15, 0xf7, 0xf4, 0x06, 0x18, 0x9f, 0x9d, 0x22, 0x3c, 0xcd, 0xbb, 0xcc, 0xa7, 0x18, 0x26, 0xea, 0x91, 0x1b, + 0x67, 0xbe, 0xc8, 0x23, 0x03, 0x7c, 0x79, 0xbf, 0x51, 0x25, 0xab, 0x78, 0x83, 0x9f, 0xbe, 0xbb, 0xf8, 0x4e, 0xe3, + 0xeb, 0x9f, 0x34, 0x88, 0x78, 0x91, 0xa1, 0xac, 0x07, 0x03, 0xca, 0x7a, 0xa0, 0xf1, 0x34, 0x22, 0x90, 0x3b, 0x20, + 0x3f, 0x20, 0x0c, 0xa2, 0x00, 0x9a, 0xf4, 0xaa, 0x8b, 0x55, 0x98, 0x05, 0x4b, 0x3f, 0xc9, 0x0e, 0xa0, 0xa9, 0x05, + 0x44, 0x4e, 0xdf, 0xe4, 0x23, 0x4e, 0xaa, 0x59, 0x11, 0x62, 0x2f, 0x8b, 0x84, 0x6e, 0x76, 0x1a, 0x84, 0x52, 0x35, + 0x2b, 0x3e, 0xe0, 0x8f, 0xc7, 0x6c, 0x99, 0x0d, 0x74, 0x7f, 0x09, 0xd9, 0x2f, 0x30, 0x9e, 0xf5, 0x41, 0x3c, 0xce, + 0x58, 0x66, 0xa5, 0x59, 0xc2, 0xfc, 0x85, 0x2e, 0x43, 0xb9, 0xd6, 0xe1, 0xa5, 0xab, 0xd1, 0x22, 0xc8, 0x64, 0x2c, + 0x44, 0x1a, 0x20, 0x28, 0x49, 0xa1, 0x8b, 0xa7, 0xc3, 0x9c, 0xa3, 0xf0, 0x3c, 0x9e, 0x55, 0x56, 0x54, 0xc1, 0xb9, + 0x9c, 0x61, 0xa4, 0x5d, 0x9e, 0xf1, 0x60, 0x82, 0x3e, 0x4f, 0xd7, 0xdc, 0xaf, 0x5d, 0x86, 0x6c, 0xd4, 0x4f, 0x4f, + 0xf8, 0xf5, 0x56, 0xc3, 0x50, 0x0c, 0x7a, 0xc7, 0x81, 0x58, 0xc2, 0x9b, 0x3c, 0xde, 0x0f, 0x78, 0x65, 0x38, 0x9a, + 0x08, 0x32, 0xc6, 0x79, 0xa7, 0xbe, 0x5c, 0x00, 0x23, 0x54, 0x52, 0xa2, 0xcf, 0xdd, 0x53, 0xe9, 0x62, 0x85, 0xbd, + 0x42, 0x5e, 0xe9, 0xf3, 0xe7, 0x97, 0xc3, 0xff, 0xfc, 0x1b, 0x82, 0xd1, 0xcf, 0x5d, 0xe1, 0x67, 0x7e, 0xa9, 0xd6, + 0xe2, 0xdc, 0xa7, 0x39, 0x44, 0x03, 0x0a, 0x36, 0x11, 0x81, 0x57, 0xc4, 0xd2, 0xca, 0x87, 0x57, 0x22, 0x98, 0x16, + 0x24, 0x9c, 0x30, 0x84, 0x37, 0xfc, 0x10, 0xa6, 0x77, 0x28, 0x82, 0x30, 0x68, 0xbf, 0xdd, 0x7d, 0x7f, 0x0c, 0xc1, + 0x96, 0x6b, 0x79, 0x20, 0x94, 0x0e, 0xe2, 0x1a, 0x3a, 0x3d, 0xf1, 0x35, 0x64, 0x5a, 0x90, 0xfd, 0x48, 0x7b, 0x07, + 0x30, 0xcc, 0x79, 0xbc, 0x60, 0x76, 0x10, 0x1f, 0xdc, 0xb2, 0x91, 0xe5, 0x2f, 0x03, 0xd2, 0xd5, 0xa3, 0xdc, 0x4d, + 0x23, 0xce, 0x4f, 0xaa, 0xc0, 0x89, 0xbf, 0xce, 0x0b, 0x54, 0xc6, 0xe5, 0xe8, 0x69, 0x1d, 0xaf, 0x50, 0xdc, 0x81, + 0x4f, 0xb3, 0x82, 0xc7, 0xf8, 0xf4, 0xe4, 0xc0, 0x3f, 0x2d, 0x87, 0x6f, 0xb4, 0x45, 0x02, 0x81, 0xf2, 0x21, 0x70, + 0x46, 0x51, 0x18, 0x45, 0xc0, 0xc5, 0xe2, 0xc1, 0x8a, 0xa7, 0x53, 0x35, 0xe4, 0xa2, 0x5d, 0xee, 0x9e, 0x44, 0x5a, + 0xb1, 0xa4, 0xe3, 0x25, 0x7d, 0xa9, 0xfe, 0x09, 0xf9, 0x13, 0x92, 0x27, 0xf3, 0xe8, 0x9c, 0xb0, 0xdd, 0x6b, 0xa1, + 0x1b, 0x25, 0xc6, 0x1e, 0x53, 0x25, 0x4e, 0x47, 0xaa, 0x81, 0xc2, 0x37, 0x70, 0x2e, 0x8f, 0x06, 0x03, 0x22, 0x73, + 0x55, 0x6a, 0x07, 0x48, 0x6c, 0x48, 0xa6, 0x00, 0x83, 0xcd, 0xa0, 0xa1, 0x45, 0x2e, 0x74, 0xd8, 0xa8, 0x3a, 0x9c, + 0x7a, 0x1f, 0x0f, 0x7c, 0xb1, 0xfc, 0x4a, 0x0b, 0x14, 0x16, 0x1e, 0x9f, 0x77, 0xa0, 0xef, 0x02, 0x4e, 0x85, 0xcc, + 0x6b, 0x7f, 0x25, 0x8a, 0x6e, 0x85, 0xfe, 0x7d, 0xac, 0x98, 0x36, 0xf0, 0x28, 0x07, 0xe7, 0x58, 0x7a, 0x21, 0xbc, + 0x0b, 0x6b, 0x1b, 0x4d, 0x06, 0xa4, 0xaf, 0x6f, 0x36, 0x35, 0x82, 0xfc, 0xae, 0xbd, 0xa6, 0xd6, 0x2d, 0x0f, 0x06, + 0x89, 0x67, 0x5e, 0xec, 0xc3, 0xd2, 0x4b, 0x24, 0x0b, 0xf9, 0xc9, 0x01, 0x8c, 0x0f, 0x22, 0x33, 0x94, 0x18, 0xa7, + 0xc0, 0x80, 0xf0, 0x0f, 0x7e, 0x4a, 0xe6, 0x19, 0x6f, 0x27, 0x82, 0xe7, 0xc3, 0x8b, 0xa5, 0x8c, 0x0d, 0x5b, 0xaa, + 0x52, 0xe7, 0x65, 0x9c, 0x66, 0x26, 0x70, 0x77, 0x02, 0x87, 0xdf, 0x57, 0x98, 0xbd, 0x21, 0xef, 0x67, 0x4c, 0x38, + 0x3e, 0x9f, 0x67, 0x1b, 0x7c, 0xa3, 0x37, 0x55, 0x21, 0x7e, 0x76, 0x4b, 0x85, 0x62, 0x1d, 0x6f, 0xab, 0x55, 0x70, + 0x4e, 0xb2, 0xda, 0xd2, 0x6f, 0xe9, 0x8f, 0x71, 0xc5, 0xd7, 0x6a, 0x63, 0x29, 0xd4, 0x3b, 0xcf, 0x06, 0x50, 0x55, + 0xc8, 0xe2, 0xfd, 0xe5, 0x92, 0x2a, 0x1b, 0xfd, 0x93, 0x03, 0xba, 0x96, 0x9e, 0xd2, 0x0a, 0x3b, 0x3d, 0x01, 0xf3, + 0x4e, 0x9a, 0x74, 0x7f, 0xb9, 0xe4, 0x53, 0x4a, 0xbf, 0xe8, 0xcd, 0xc1, 0x3c, 0x5b, 0x84, 0xa7, 0xff, 0x07, 0xc0, + 0xb1, 0x34, 0x8b, 0x20, 0x5c, 0x03, 0x00}; } // namespace web_server } // namespace esphome From 08b8ab837a2b6da234691cbd750625eea9fe38c0 Mon Sep 17 00:00:00 2001 From: Colm Date: Thu, 11 Jul 2024 05:10:58 +0100 Subject: [PATCH 184/233] Add braces to if statement to avoid compiler warning. (#7036) --- esphome/components/aht10/aht10.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/aht10/aht10.cpp b/esphome/components/aht10/aht10.cpp index 332218b9e9..441c1ac9df 100644 --- a/esphome/components/aht10/aht10.cpp +++ b/esphome/components/aht10/aht10.cpp @@ -93,8 +93,9 @@ void AHT10Component::restart_read_() { void AHT10Component::read_data_() { uint8_t data[6]; - if (this->read_count_ > 1) + if (this->read_count_ > 1) { ESP_LOGD(TAG, "Read attempt %d at %ums", this->read_count_, (unsigned) (millis() - this->start_time_)); + } if (this->read(data, 6) != i2c::ERROR_OK) { this->status_set_warning("AHT10 read failed, retrying soon"); this->restart_read_(); @@ -119,8 +120,9 @@ void AHT10Component::read_data_() { return; } } - if (this->read_count_ > 1) + if (this->read_count_ > 1) { ESP_LOGD(TAG, "Success at %ums", (unsigned) (millis() - this->start_time_)); + } uint32_t raw_temperature = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]; uint32_t raw_humidity = ((data[1] << 16) | (data[2] << 8) | data[3]) >> 4; From 6e624ff7974311bc22058466f0688d554a340b1f Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Wed, 10 Jul 2024 23:21:24 -0500 Subject: [PATCH 185/233] [wifi] Fix EAP for IDF 5.1+, add test (#7061) --- esphome/components/wifi/wifi_component.h | 4 ++ .../wifi/wifi_component_esp_idf.cpp | 48 ++++++++++++++++--- tests/components/wifi/common-eap.yaml | 7 +++ tests/components/wifi/test-eap.esp32-ard.yaml | 8 +--- tests/components/wifi/test-eap.esp32-idf.yaml | 1 + 5 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 tests/components/wifi/common-eap.yaml create mode 100644 tests/components/wifi/test-eap.esp32-idf.yaml diff --git a/esphome/components/wifi/wifi_component.h b/esphome/components/wifi/wifi_component.h index 0b077819ae..d79cde0b18 100644 --- a/esphome/components/wifi/wifi_component.h +++ b/esphome/components/wifi/wifi_component.h @@ -20,8 +20,12 @@ #endif #if defined(USE_ESP_IDF) && defined(USE_WIFI_WPA2_EAP) +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) +#include +#else #include #endif +#endif #ifdef USE_ESP8266 #include diff --git a/esphome/components/wifi/wifi_component_esp_idf.cpp b/esphome/components/wifi/wifi_component_esp_idf.cpp index 96fa837767..a8d67ed44d 100644 --- a/esphome/components/wifi/wifi_component_esp_idf.cpp +++ b/esphome/components/wifi/wifi_component_esp_idf.cpp @@ -15,8 +15,12 @@ #include #include #ifdef USE_WIFI_WPA2_EAP +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) +#include +#else #include #endif +#endif #ifdef USE_WIFI_AP #include "dhcpserver/dhcpserver.h" @@ -364,48 +368,78 @@ bool WiFiComponent::wifi_sta_connect_(const WiFiAP &ap) { if (ap.get_eap().has_value()) { // note: all certificates and keys have to be null terminated. Lengths are appended by +1 to include \0. EAPAuth eap = ap.get_eap().value(); +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_identity((uint8_t *) eap.identity.c_str(), eap.identity.length()); +#else err = esp_wifi_sta_wpa2_ent_set_identity((uint8_t *) eap.identity.c_str(), eap.identity.length()); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_identity failed! %d", err); + ESP_LOGV(TAG, "set_identity failed %d", err); } int ca_cert_len = strlen(eap.ca_cert); int client_cert_len = strlen(eap.client_cert); int client_key_len = strlen(eap.client_key); if (ca_cert_len) { +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_ca_cert((uint8_t *) eap.ca_cert, ca_cert_len + 1); +#else err = esp_wifi_sta_wpa2_ent_set_ca_cert((uint8_t *) eap.ca_cert, ca_cert_len + 1); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_ca_cert failed! %d", err); + ESP_LOGV(TAG, "set_ca_cert failed %d", err); } } // workout what type of EAP this is // validation is not required as the config tool has already validated it if (client_cert_len && client_key_len) { // if we have certs, this must be EAP-TLS +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_certificate_and_key((uint8_t *) eap.client_cert, client_cert_len + 1, + (uint8_t *) eap.client_key, client_key_len + 1, + (uint8_t *) eap.password.c_str(), strlen(eap.password.c_str())); +#else err = esp_wifi_sta_wpa2_ent_set_cert_key((uint8_t *) eap.client_cert, client_cert_len + 1, (uint8_t *) eap.client_key, client_key_len + 1, (uint8_t *) eap.password.c_str(), strlen(eap.password.c_str())); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_cert_key failed! %d", err); + ESP_LOGV(TAG, "set_cert_key failed %d", err); } } else { // in the absence of certs, assume this is username/password based +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_username((uint8_t *) eap.username.c_str(), eap.username.length()); +#else err = esp_wifi_sta_wpa2_ent_set_username((uint8_t *) eap.username.c_str(), eap.username.length()); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_username failed! %d", err); + ESP_LOGV(TAG, "set_username failed %d", err); } +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_password((uint8_t *) eap.password.c_str(), eap.password.length()); +#else err = esp_wifi_sta_wpa2_ent_set_password((uint8_t *) eap.password.c_str(), eap.password.length()); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_password failed! %d", err); + ESP_LOGV(TAG, "set_password failed %d", err); } // set TTLS Phase 2, defaults to MSCHAPV2 +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_eap_client_set_ttls_phase2_method(eap.ttls_phase_2); +#else err = esp_wifi_sta_wpa2_ent_set_ttls_phase2_method(eap.ttls_phase_2); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_set_ttls_phase2_method failed! %d", err); + ESP_LOGV(TAG, "set_ttls_phase2_method failed %d", err); } } +#if (ESP_IDF_VERSION_MAJOR >= 5) && (ESP_IDF_VERSION_MINOR >= 1) + err = esp_wifi_sta_enterprise_enable(); +#else err = esp_wifi_sta_wpa2_ent_enable(); +#endif if (err != ESP_OK) { - ESP_LOGV(TAG, "esp_wifi_sta_wpa2_ent_enable failed! %d", err); + ESP_LOGV(TAG, "enterprise_enable failed %d", err); } } #endif // USE_WIFI_WPA2_EAP diff --git a/tests/components/wifi/common-eap.yaml b/tests/components/wifi/common-eap.yaml new file mode 100644 index 0000000000..779cd6b49a --- /dev/null +++ b/tests/components/wifi/common-eap.yaml @@ -0,0 +1,7 @@ +wifi: + networks: + - ssid: MySSID + eap: + username: username + password: password + identity: identity diff --git a/tests/components/wifi/test-eap.esp32-ard.yaml b/tests/components/wifi/test-eap.esp32-ard.yaml index 779cd6b49a..9177e5de10 100644 --- a/tests/components/wifi/test-eap.esp32-ard.yaml +++ b/tests/components/wifi/test-eap.esp32-ard.yaml @@ -1,7 +1 @@ -wifi: - networks: - - ssid: MySSID - eap: - username: username - password: password - identity: identity +<<: !include common-eap.yaml diff --git a/tests/components/wifi/test-eap.esp32-idf.yaml b/tests/components/wifi/test-eap.esp32-idf.yaml new file mode 100644 index 0000000000..9177e5de10 --- /dev/null +++ b/tests/components/wifi/test-eap.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-eap.yaml From 5ac875545fe14fa1d818336efb392f48f61b3fc1 Mon Sep 17 00:00:00 2001 From: ttaborda <80131527+ttaborda@users.noreply.github.com> Date: Thu, 11 Jul 2024 05:26:37 +0100 Subject: [PATCH 186/233] Update mitsubishi.cpp (#6909) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/mitsubishi/mitsubishi.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/esphome/components/mitsubishi/mitsubishi.cpp b/esphome/components/mitsubishi/mitsubishi.cpp index fd57adc586..a02aabf14d 100644 --- a/esphome/components/mitsubishi/mitsubishi.cpp +++ b/esphome/components/mitsubishi/mitsubishi.cpp @@ -52,6 +52,7 @@ const uint8_t MITSUBISHI_BYTE16 = 0X00; climate::ClimateTraits MitsubishiClimate::traits() { auto traits = climate::ClimateTraits(); + traits.set_supports_current_temperature(this->sensor_ != nullptr); traits.set_supports_action(false); traits.set_visual_min_temperature(MITSUBISHI_TEMP_MIN); traits.set_visual_max_temperature(MITSUBISHI_TEMP_MAX); From 66b36afe90431b89b8e7c26c782be2431f2e7890 Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Thu, 11 Jul 2024 08:23:29 +0300 Subject: [PATCH 187/233] [climate] fix dump output of unsupported features (#7005) --- esphome/components/climate/climate.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/esphome/components/climate/climate.cpp b/esphome/components/climate/climate.cpp index 1822707152..bc8d932089 100644 --- a/esphome/components/climate/climate.cpp +++ b/esphome/components/climate/climate.cpp @@ -574,21 +574,25 @@ void Climate::dump_traits_(const char *tag) { ESP_LOGCONFIG(tag, " - Max temperature: %.1f", traits.get_visual_max_temperature()); ESP_LOGCONFIG(tag, " - Temperature step:"); ESP_LOGCONFIG(tag, " Target: %.1f", traits.get_visual_target_temperature_step()); - ESP_LOGCONFIG(tag, " Current: %.1f", traits.get_visual_current_temperature_step()); - ESP_LOGCONFIG(tag, " - Min humidity: %.0f", traits.get_visual_min_humidity()); - ESP_LOGCONFIG(tag, " - Max humidity: %.0f", traits.get_visual_max_humidity()); if (traits.get_supports_current_temperature()) { - ESP_LOGCONFIG(tag, " [x] Supports current temperature"); + ESP_LOGCONFIG(tag, " Current: %.1f", traits.get_visual_current_temperature_step()); } - if (traits.get_supports_current_humidity()) { - ESP_LOGCONFIG(tag, " [x] Supports current humidity"); + if (traits.get_supports_target_humidity() || traits.get_supports_current_humidity()) { + ESP_LOGCONFIG(tag, " - Min humidity: %.0f", traits.get_visual_min_humidity()); + ESP_LOGCONFIG(tag, " - Max humidity: %.0f", traits.get_visual_max_humidity()); } if (traits.get_supports_two_point_target_temperature()) { ESP_LOGCONFIG(tag, " [x] Supports two-point target temperature"); } + if (traits.get_supports_current_temperature()) { + ESP_LOGCONFIG(tag, " [x] Supports current temperature"); + } if (traits.get_supports_target_humidity()) { ESP_LOGCONFIG(tag, " [x] Supports target humidity"); } + if (traits.get_supports_current_humidity()) { + ESP_LOGCONFIG(tag, " [x] Supports current humidity"); + } if (traits.get_supports_action()) { ESP_LOGCONFIG(tag, " [x] Supports action"); } From d071b05249fc4d4310fda64ed8227896bb3f51d6 Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Thu, 11 Jul 2024 08:24:36 +0300 Subject: [PATCH 188/233] [climate-traits] improved performance (#7006) --- esphome/components/climate/climate_traits.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esphome/components/climate/climate_traits.h b/esphome/components/climate/climate_traits.h index fd5b025a03..58d7b586d7 100644 --- a/esphome/components/climate/climate_traits.h +++ b/esphome/components/climate/climate_traits.h @@ -73,7 +73,7 @@ class ClimateTraits { ESPDEPRECATED("This method is deprecated, use set_supported_modes() instead", "v1.20") void set_supports_dry_mode(bool supports_dry_mode) { set_mode_support_(CLIMATE_MODE_DRY, supports_dry_mode); } bool supports_mode(ClimateMode mode) const { return supported_modes_.count(mode); } - std::set get_supported_modes() const { return supported_modes_; } + const std::set &get_supported_modes() const { return supported_modes_; } void set_supports_action(bool supports_action) { supports_action_ = supports_action; } bool get_supports_action() const { return supports_action_; } @@ -101,7 +101,7 @@ class ClimateTraits { void set_supports_fan_mode_diffuse(bool supported) { set_fan_mode_support_(CLIMATE_FAN_DIFFUSE, supported); } bool supports_fan_mode(ClimateFanMode fan_mode) const { return supported_fan_modes_.count(fan_mode); } bool get_supports_fan_modes() const { return !supported_fan_modes_.empty() || !supported_custom_fan_modes_.empty(); } - std::set get_supported_fan_modes() const { return supported_fan_modes_; } + const std::set &get_supported_fan_modes() const { return supported_fan_modes_; } void set_supported_custom_fan_modes(std::set supported_custom_fan_modes) { supported_custom_fan_modes_ = std::move(supported_custom_fan_modes); @@ -140,7 +140,7 @@ class ClimateTraits { } bool supports_swing_mode(ClimateSwingMode swing_mode) const { return supported_swing_modes_.count(swing_mode); } bool get_supports_swing_modes() const { return !supported_swing_modes_.empty(); } - std::set get_supported_swing_modes() const { return supported_swing_modes_; } + const std::set &get_supported_swing_modes() const { return supported_swing_modes_; } float get_visual_min_temperature() const { return visual_min_temperature_; } void set_visual_min_temperature(float visual_min_temperature) { visual_min_temperature_ = visual_min_temperature; } From d209a2b45acff1e975d7ab68af5b75959624284e Mon Sep 17 00:00:00 2001 From: leejoow Date: Thu, 11 Jul 2024 22:20:58 +0200 Subject: [PATCH 189/233] Add default icon to restart button (#7076) Co-authored-by: Leo Schelvis --- esphome/components/restart/button/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/restart/button/__init__.py b/esphome/components/restart/button/__init__.py index 1b2c991261..6aff8cb351 100644 --- a/esphome/components/restart/button/__init__.py +++ b/esphome/components/restart/button/__init__.py @@ -5,6 +5,7 @@ from esphome.const import ( CONF_ID, DEVICE_CLASS_RESTART, ENTITY_CATEGORY_CONFIG, + ICON_RESTART, ) restart_ns = cg.esphome_ns.namespace("restart") @@ -12,6 +13,7 @@ RestartButton = restart_ns.class_("RestartButton", button.Button, cg.Component) CONFIG_SCHEMA = button.button_schema( RestartButton, + icon=ICON_RESTART, device_class=DEVICE_CLASS_RESTART, entity_category=ENTITY_CATEGORY_CONFIG, ).extend(cv.COMPONENT_SCHEMA) From 2e8a2fdbd4677b9075ae9bb572b4d66b8fc67794 Mon Sep 17 00:00:00 2001 From: Tomi Junnila Date: Thu, 11 Jul 2024 23:32:38 +0300 Subject: [PATCH 190/233] Add support for the Gree YAC1FB9 in climate_ir (#7056) --- esphome/components/gree/climate.py | 1 + esphome/components/gree/gree.cpp | 14 +++++++++++--- esphome/components/gree/gree.h | 6 +++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/esphome/components/gree/climate.py b/esphome/components/gree/climate.py index 02ce7b12d4..c88a428391 100644 --- a/esphome/components/gree/climate.py +++ b/esphome/components/gree/climate.py @@ -16,6 +16,7 @@ MODELS = { "yan": Model.GREE_YAN, "yaa": Model.GREE_YAA, "yac": Model.GREE_YAC, + "yac1fb9": Model.GREE_YAC1FB9, } CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend( diff --git a/esphome/components/gree/gree.cpp b/esphome/components/gree/gree.cpp index 1bbb443fce..cce2a8ffee 100644 --- a/esphome/components/gree/gree.cpp +++ b/esphome/components/gree/gree.cpp @@ -24,7 +24,7 @@ void GreeClimate::transmit_state() { remote_state[4] |= (this->horizontal_swing_() << 4); } - if (this->model_ == GREE_YAA || this->model_ == GREE_YAC) { + if (this->model_ == GREE_YAA || this->model_ == GREE_YAC || this->model_ == GREE_YAC1FB9) { remote_state[2] = 0x20; // bits 0..3 always 0000, bits 4..7 TURBO,LIGHT,HEALTH,X-FAN remote_state[3] = 0x50; // bits 4..7 always 0101 remote_state[6] = 0x20; // YAA1FB, FAA1FB1, YB1F2 bits 4..7 always 0010 @@ -53,7 +53,11 @@ void GreeClimate::transmit_state() { data->set_carrier_frequency(GREE_IR_FREQUENCY); data->mark(GREE_HEADER_MARK); - data->space(GREE_HEADER_SPACE); + if (this->model_ == GREE_YAC1FB9) { + data->space(GREE_YAC1FB9_HEADER_SPACE); + } else { + data->space(GREE_HEADER_SPACE); + } for (int i = 0; i < 4; i++) { for (uint8_t mask = 1; mask > 0; mask <<= 1) { // iterate through bit mask @@ -71,7 +75,11 @@ void GreeClimate::transmit_state() { data->space(GREE_ZERO_SPACE); data->mark(GREE_BIT_MARK); - data->space(GREE_MESSAGE_SPACE); + if (this->model_ == GREE_YAC1FB9) { + data->space(GREE_YAC1FB9_MESSAGE_SPACE); + } else { + data->space(GREE_MESSAGE_SPACE); + } for (int i = 4; i < 8; i++) { for (uint8_t mask = 1; mask > 0; mask <<= 1) { // iterate through bit mask diff --git a/esphome/components/gree/gree.h b/esphome/components/gree/gree.h index e7131a2b89..524a95aebd 100644 --- a/esphome/components/gree/gree.h +++ b/esphome/components/gree/gree.h @@ -41,6 +41,10 @@ const uint32_t GREE_YAC_HEADER_MARK = 6000; const uint32_t GREE_YAC_HEADER_SPACE = 3000; const uint32_t GREE_YAC_BIT_MARK = 650; +// Timing specific to YAC1FB9 +const uint32_t GREE_YAC1FB9_HEADER_SPACE = 4500; +const uint32_t GREE_YAC1FB9_MESSAGE_SPACE = 19980; + // State Frame size const uint8_t GREE_STATE_FRAME_SIZE = 8; @@ -67,7 +71,7 @@ const uint8_t GREE_HDIR_MRIGHT = 0x05; const uint8_t GREE_HDIR_RIGHT = 0x06; // Model codes -enum Model { GREE_GENERIC, GREE_YAN, GREE_YAA, GREE_YAC }; +enum Model { GREE_GENERIC, GREE_YAN, GREE_YAA, GREE_YAC, GREE_YAC1FB9 }; class GreeClimate : public climate_ir::ClimateIR { public: From 99cba0ae7fa0e9897c7f0dfb764a329ba6d431f4 Mon Sep 17 00:00:00 2001 From: Eugen Date: Thu, 11 Jul 2024 23:26:04 +0200 Subject: [PATCH 191/233] add ESP32-C6 support to esp32_can (#7063) --- esphome/components/esp32_can/canbus.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/esphome/components/esp32_can/canbus.py b/esphome/components/esp32_can/canbus.py index 74f331f30b..f4ba032009 100644 --- a/esphome/components/esp32_can/canbus.py +++ b/esphome/components/esp32_can/canbus.py @@ -11,6 +11,7 @@ from esphome.components.esp32.const import ( VARIANT_ESP32S2, VARIANT_ESP32S3, VARIANT_ESP32C3, + VARIANT_ESP32C6, VARIANT_ESP32H2, ) @@ -47,6 +48,7 @@ CAN_SPEEDS_ESP32_S2 = { CAN_SPEEDS_ESP32_S3 = {**CAN_SPEEDS_ESP32_S2} CAN_SPEEDS_ESP32_C3 = {**CAN_SPEEDS_ESP32_S2} +CAN_SPEEDS_ESP32_C6 = {**CAN_SPEEDS_ESP32_S2} CAN_SPEEDS_ESP32_H2 = {**CAN_SPEEDS_ESP32_S2} CAN_SPEEDS = { @@ -54,6 +56,7 @@ CAN_SPEEDS = { VARIANT_ESP32S2: CAN_SPEEDS_ESP32_S2, VARIANT_ESP32S3: CAN_SPEEDS_ESP32_S3, VARIANT_ESP32C3: CAN_SPEEDS_ESP32_C3, + VARIANT_ESP32C6: CAN_SPEEDS_ESP32_C6, VARIANT_ESP32H2: CAN_SPEEDS_ESP32_H2, } From 7f83bcfdd91aba4fed05d0c1918c2899dac1682e Mon Sep 17 00:00:00 2001 From: soeffi Date: Thu, 11 Jul 2024 23:30:45 +0200 Subject: [PATCH 192/233] jsn_sr04t component: AJ_SR04M compatibility mode in checksum calculation (#7044) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/jsn_sr04t/jsn_sr04t.cpp | 19 ++++++++++++++++++- esphome/components/jsn_sr04t/jsn_sr04t.h | 8 +++++++- esphome/components/jsn_sr04t/sensor.py | 13 +++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/esphome/components/jsn_sr04t/jsn_sr04t.cpp b/esphome/components/jsn_sr04t/jsn_sr04t.cpp index b96bf8f762..077d4e58ea 100644 --- a/esphome/components/jsn_sr04t/jsn_sr04t.cpp +++ b/esphome/components/jsn_sr04t/jsn_sr04t.cpp @@ -31,7 +31,16 @@ void Jsnsr04tComponent::loop() { } void Jsnsr04tComponent::check_buffer_() { - uint8_t checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2]; + uint8_t checksum = 0; + switch (this->model_) { + case JSN_SR04T: + checksum = this->buffer_[0] + this->buffer_[1] + this->buffer_[2]; + break; + case AJ_SR04M: + checksum = this->buffer_[1] + this->buffer_[2]; + break; + } + if (this->buffer_[3] == checksum) { uint16_t distance = encode_uint16(this->buffer_[1], this->buffer_[2]); if (distance > 250) { @@ -49,6 +58,14 @@ void Jsnsr04tComponent::check_buffer_() { void Jsnsr04tComponent::dump_config() { LOG_SENSOR("", "JST_SR04T Sensor", this); + switch (this->model_) { + case JSN_SR04T: + ESP_LOGCONFIG(TAG, " sensor model: jsn_sr04t"); + break; + case AJ_SR04M: + ESP_LOGCONFIG(TAG, " sensor model: aj_sr04m"); + break; + } LOG_UPDATE_INTERVAL(this); } diff --git a/esphome/components/jsn_sr04t/jsn_sr04t.h b/esphome/components/jsn_sr04t/jsn_sr04t.h index bd43252be8..2a22ff92ec 100644 --- a/esphome/components/jsn_sr04t/jsn_sr04t.h +++ b/esphome/components/jsn_sr04t/jsn_sr04t.h @@ -9,9 +9,14 @@ namespace esphome { namespace jsn_sr04t { +enum Model { + JSN_SR04T, + AJ_SR04M, +}; + class Jsnsr04tComponent : public sensor::Sensor, public PollingComponent, public uart::UARTDevice { public: - // Nothing really public. + void set_model(Model model) { this->model_ = model; } // ========== INTERNAL METHODS ========== void update() override; @@ -20,6 +25,7 @@ class Jsnsr04tComponent : public sensor::Sensor, public PollingComponent, public protected: void check_buffer_(); + Model model_; std::vector buffer_; }; diff --git a/esphome/components/jsn_sr04t/sensor.py b/esphome/components/jsn_sr04t/sensor.py index 4b062e81e9..682cf06570 100644 --- a/esphome/components/jsn_sr04t/sensor.py +++ b/esphome/components/jsn_sr04t/sensor.py @@ -5,6 +5,7 @@ from esphome.const import ( STATE_CLASS_MEASUREMENT, UNIT_METER, ICON_ARROW_EXPAND_VERTICAL, + CONF_MODEL, ) CODEOWNERS = ["@Mafus1"] @@ -14,6 +15,11 @@ jsn_sr04t_ns = cg.esphome_ns.namespace("jsn_sr04t") Jsnsr04tComponent = jsn_sr04t_ns.class_( "Jsnsr04tComponent", sensor.Sensor, cg.PollingComponent, uart.UARTDevice ) +Model = jsn_sr04t_ns.enum("Model") +MODEL = { + "jsn_sr04t": Model.JSN_SR04T, + "aj_sr04m": Model.AJ_SR04M, +} CONFIG_SCHEMA = ( sensor.sensor_schema( @@ -25,6 +31,11 @@ CONFIG_SCHEMA = ( ) .extend(cv.polling_component_schema("60s")) .extend(uart.UART_DEVICE_SCHEMA) + .extend( + { + cv.Optional(CONF_MODEL, default="jsn_sr04t"): cv.enum(MODEL, upper=False), + } + ) ) FINAL_VALIDATE_SCHEMA = uart.final_validate_device_schema( @@ -42,3 +53,5 @@ async def to_code(config): var = await sensor.new_sensor(config) await cg.register_component(var, config) await uart.register_uart_device(var, config) + + cg.add(var.set_model(config[CONF_MODEL])) From 4a80a09db3c3a871f2825a2b7b7f1621ffab0f8b Mon Sep 17 00:00:00 2001 From: kevdliu <1766838+kevdliu@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:32:31 -0400 Subject: [PATCH 193/233] Fix voice assistant crash when no speaker configured (#7075) --- esphome/components/voice_assistant/voice_assistant.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/components/voice_assistant/voice_assistant.cpp b/esphome/components/voice_assistant/voice_assistant.cpp index 8a8a9e92aa..e4f388db68 100644 --- a/esphome/components/voice_assistant/voice_assistant.cpp +++ b/esphome/components/voice_assistant/voice_assistant.cpp @@ -684,7 +684,9 @@ void VoiceAssistant::on_event(const api::VoiceAssistantEventResponse &msg) { this->defer([this, text]() { this->tts_start_trigger_->trigger(text); #ifdef USE_SPEAKER - this->speaker_->start(); + if (this->speaker_ != nullptr) { + this->speaker_->start(); + } #endif }); break; From 8a3f0e3b93878a24a6cc9cdbe9babb846243c522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Fri, 12 Jul 2024 23:19:33 +0200 Subject: [PATCH 194/233] Bump HeatpumpIR, add protocols, remove IRremoteESP8266 (#6996) --- esphome/components/heatpumpir/climate.py | 11 ++++++----- esphome/components/heatpumpir/heatpumpir.cpp | 5 +++++ esphome/components/heatpumpir/heatpumpir.h | 5 +++++ platformio.ini | 6 +++--- .../heatpumpir/test.bk72xx-ard.yaml | 19 +++++++++++++++++++ 5 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 tests/components/heatpumpir/test.bk72xx-ard.yaml diff --git a/esphome/components/heatpumpir/climate.py b/esphome/components/heatpumpir/climate.py index b86d405b7e..80900d7db9 100644 --- a/esphome/components/heatpumpir/climate.py +++ b/esphome/components/heatpumpir/climate.py @@ -8,7 +8,6 @@ from esphome.const import ( CONF_PROTOCOL, CONF_VISUAL, ) -from esphome.core import CORE CODEOWNERS = ["@rob-deutsch"] @@ -67,6 +66,11 @@ PROTOCOLS = { "carrier_qlima_2": Protocol.PROTOCOL_QLIMA_2, "samsung_aqv12msan": Protocol.PROTOCOL_SAMSUNG_AQV12MSAN, "zhjg01": Protocol.PROTOCOL_ZHJG01, + "airway": Protocol.PROTOCOL_AIRWAY, + "bgh_aud": Protocol.PROTOCOL_BGH_AUD, + "panasonic_altdke": Protocol.PROTOCOL_PANASONIC_ALTDKE, + "vaillantvai8": Protocol.PROTOCOL_VAILLANTVAI8, + "r51m": Protocol.PROTOCOL_R51M, } CONF_HORIZONTAL_DEFAULT = "horizontal_default" @@ -122,7 +126,4 @@ def to_code(config): cg.add(var.set_max_temperature(config[CONF_MAX_TEMPERATURE])) cg.add(var.set_min_temperature(config[CONF_MIN_TEMPERATURE])) - cg.add_library("tonia/HeatpumpIR", "1.0.26") - - if CORE.is_esp8266 or CORE.is_esp32: - cg.add_library("crankyoldgit/IRremoteESP8266", "2.8.6") + cg.add_library("tonia/HeatpumpIR", "1.0.27") diff --git a/esphome/components/heatpumpir/heatpumpir.cpp b/esphome/components/heatpumpir/heatpumpir.cpp index 22a5779c8d..144dcc9bfa 100644 --- a/esphome/components/heatpumpir/heatpumpir.cpp +++ b/esphome/components/heatpumpir/heatpumpir.cpp @@ -61,6 +61,11 @@ const std::map> PROTOCOL_CONSTRUCTOR_MAP {PROTOCOL_QLIMA_2, []() { return new Qlima2HeatpumpIR(); }}, // NOLINT {PROTOCOL_SAMSUNG_AQV12MSAN, []() { return new SamsungAQV12MSANHeatpumpIR(); }}, // NOLINT {PROTOCOL_ZHJG01, []() { return new ZHJG01HeatpumpIR(); }}, // NOLINT + {PROTOCOL_AIRWAY, []() { return new AIRWAYHeatpumpIR(); }}, // NOLINT + {PROTOCOL_BGH_AUD, []() { return new BGHHeatpumpIR(); }}, // NOLINT + {PROTOCOL_PANASONIC_ALTDKE, []() { return new PanasonicAltDKEHeatpumpIR(); }}, // NOLINT + {PROTOCOL_VAILLANTVAI8, []() { return new VaillantHeatpumpIR(); }}, // NOLINT + {PROTOCOL_R51M, []() { return new R51MHeatpumpIR(); }}, // NOLINT }; void HeatpumpIRClimate::setup() { diff --git a/esphome/components/heatpumpir/heatpumpir.h b/esphome/components/heatpumpir/heatpumpir.h index 0e6ea2218f..f6e7ff3cd6 100644 --- a/esphome/components/heatpumpir/heatpumpir.h +++ b/esphome/components/heatpumpir/heatpumpir.h @@ -61,6 +61,11 @@ enum Protocol { PROTOCOL_QLIMA_2, PROTOCOL_SAMSUNG_AQV12MSAN, PROTOCOL_ZHJG01, + PROTOCOL_AIRWAY, + PROTOCOL_BGH_AUD, + PROTOCOL_PANASONIC_ALTDKE, + PROTOCOL_VAILLANTVAI8, + PROTOCOL_R51M, }; // Simple enum to represent horizontal directios diff --git a/platformio.ini b/platformio.ini index f07889526f..fc7f35b6c3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -65,7 +65,7 @@ lib_deps = glmnet/Dsmr@0.7 ; dsmr rweather/Crypto@0.4.0 ; dsmr dudanov/MideaUART@1.1.9 ; midea - tonia/HeatpumpIR@1.0.26 ; heatpumpir + tonia/HeatpumpIR@1.0.27 ; heatpumpir build_flags = ${common.build_flags} -DUSE_ARDUINO @@ -93,8 +93,8 @@ lib_deps = ESP8266HTTPClient ; http_request (Arduino built-in) ESP8266mDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) - crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.2 ; wireguard + build_flags = ${common:arduino.build_flags} -Wno-nonnull-compare @@ -123,8 +123,8 @@ lib_deps = ESPmDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) esphome/ESP32-audioI2S@2.0.7 ; i2s_audio - crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.2 ; wireguard + build_flags = ${common:arduino.build_flags} -DUSE_ESP32 diff --git a/tests/components/heatpumpir/test.bk72xx-ard.yaml b/tests/components/heatpumpir/test.bk72xx-ard.yaml new file mode 100644 index 0000000000..90259f1244 --- /dev/null +++ b/tests/components/heatpumpir/test.bk72xx-ard.yaml @@ -0,0 +1,19 @@ +remote_transmitter: + pin: 6 + carrier_duty_percent: 50% + +climate: + - platform: heatpumpir + protocol: daikin + horizontal_default: mleft + vertical_default: mup + name: HeatpumpIR Climate + min_temperature: 18 + max_temperature: 30 + - platform: heatpumpir + protocol: panasonic_altdke + horizontal_default: mright + vertical_default: mdown + name: HeatpumpIR Climate + min_temperature: 18 + max_temperature: 30 From feae794787ca3ad0cc1b20be9496a73117e6844f Mon Sep 17 00:00:00 2001 From: Anton Viktorov Date: Fri, 12 Jul 2024 21:42:41 +0000 Subject: [PATCH 195/233] LTR390 separate ALS and UV gain and resolution (#7026) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- CODEOWNERS | 2 +- esphome/components/ltr390/ltr390.cpp | 73 +++++++++++-------- esphome/components/ltr390/ltr390.h | 14 ++-- esphome/components/ltr390/sensor.py | 40 ++++++++-- tests/components/ltr390/test.esp32-ard.yaml | 18 +++++ tests/components/ltr390/test.esp8266-ard.yaml | 4 +- 6 files changed, 110 insertions(+), 41 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 5c14d30371..210c567f78 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -214,7 +214,7 @@ esphome/components/lightwaverf/* @max246 esphome/components/lilygo_t5_47/touchscreen/* @jesserockz esphome/components/lock/* @esphome/core esphome/components/logger/* @esphome/core -esphome/components/ltr390/* @sjtrny +esphome/components/ltr390/* @latonita @sjtrny esphome/components/ltr_als_ps/* @latonita esphome/components/matrix_keypad/* @ssieb esphome/components/max31865/* @DAVe3283 diff --git a/esphome/components/ltr390/ltr390.cpp b/esphome/components/ltr390/ltr390.cpp index 4eb1ff2c46..198d15ebd8 100644 --- a/esphome/components/ltr390/ltr390.cpp +++ b/esphome/components/ltr390/ltr390.cpp @@ -19,6 +19,7 @@ static const uint8_t LTR390_MAIN_STATUS = 0x07; static const float GAINVALUES[5] = {1.0, 3.0, 6.0, 9.0, 18.0}; static const float RESOLUTIONVALUE[6] = {4.0, 2.0, 1.0, 0.5, 0.25, 0.125}; +static const uint8_t RESOLUTION_BITS[6] = {20, 19, 18, 17, 16, 13}; // Request fastest measurement rate - will be slowed by device if conversion rate is slower. static const float RESOLUTION_SETTING[6] = {0x00, 0x10, 0x20, 0x30, 0x40, 0x50}; @@ -74,7 +75,7 @@ void LTR390Component::read_als_() { uint32_t als = *val; if (this->light_sensor_ != nullptr) { - float lux = ((0.6 * als) / (GAINVALUES[this->gain_] * RESOLUTIONVALUE[this->res_])) * this->wfac_; + float lux = ((0.6 * als) / (GAINVALUES[this->gain_als_] * RESOLUTIONVALUE[this->res_als_])) * this->wfac_; this->light_sensor_->publish_state(lux); } @@ -90,7 +91,7 @@ void LTR390Component::read_uvs_() { uint32_t uv = *val; if (this->uvi_sensor_ != nullptr) { - this->uvi_sensor_->publish_state((uv / this->sensitivity_) * this->wfac_); + this->uvi_sensor_->publish_state((uv / this->sensitivity_uv_) * this->wfac_); } if (this->uv_sensor_ != nullptr) { @@ -107,24 +108,38 @@ void LTR390Component::read_mode_(int mode_index) { ctrl[LTR390_CTRL_EN] = true; this->reg(LTR390_MAIN_CTRL) = ctrl.to_ulong(); - // After the sensor integration time do the following - this->set_timeout(((uint32_t) RESOLUTIONVALUE[this->res_]) * 100 + LTR390_WAKEUP_TIME + LTR390_SETTLE_TIME, - [this, mode_index]() { - // Read from the sensor - std::get<1>(this->mode_funcs_[mode_index])(); + uint32_t int_time{0}; + // Set gain, resolution and measurement rate + switch (mode) { + case LTR390_MODE_ALS: + this->reg(LTR390_GAIN) = this->gain_als_; + this->reg(LTR390_MEAS_RATE) = RESOLUTION_SETTING[this->res_als_]; + int_time = ((uint32_t) RESOLUTIONVALUE[this->res_als_]) * 100; + break; + case LTR390_MODE_UVS: + this->reg(LTR390_GAIN) = this->gain_uv_; + this->reg(LTR390_MEAS_RATE) = RESOLUTION_SETTING[this->res_uv_]; + int_time = ((uint32_t) RESOLUTIONVALUE[this->res_uv_]) * 100; + break; + } - // If there are more modes to read then begin the next - // otherwise stop - if (mode_index + 1 < (int) this->mode_funcs_.size()) { - this->read_mode_(mode_index + 1); - } else { - // put sensor in standby - std::bitset<8> ctrl = this->reg(LTR390_MAIN_CTRL).get(); - ctrl[LTR390_CTRL_EN] = false; - this->reg(LTR390_MAIN_CTRL) = ctrl.to_ulong(); - this->reading_ = false; - } - }); + // After the sensor integration time do the following + this->set_timeout(int_time + LTR390_WAKEUP_TIME + LTR390_SETTLE_TIME, [this, mode_index]() { + // Read from the sensor + std::get<1>(this->mode_funcs_[mode_index])(); + + // If there are more modes to read then begin the next + // otherwise stop + if (mode_index + 1 < (int) this->mode_funcs_.size()) { + this->read_mode_(mode_index + 1); + } else { + // put sensor in standby + std::bitset<8> ctrl = this->reg(LTR390_MAIN_CTRL).get(); + ctrl[LTR390_CTRL_EN] = false; + this->reg(LTR390_MAIN_CTRL) = ctrl.to_ulong(); + this->reading_ = false; + } + }); } void LTR390Component::setup() { @@ -151,16 +166,10 @@ void LTR390Component::setup() { return; } - // Set gain - this->reg(LTR390_GAIN) = gain_; - - // Set resolution and measurement rate - this->reg(LTR390_MEAS_RATE) = RESOLUTION_SETTING[this->res_]; - // Set sensitivity by linearly scaling against known value in the datasheet - float gain_scale = GAINVALUES[this->gain_] / GAIN_MAX; - float intg_scale = (RESOLUTIONVALUE[this->res_] * 100) / INTG_MAX; - this->sensitivity_ = SENSITIVITY_MAX * gain_scale * intg_scale; + float gain_scale_uv = GAINVALUES[this->gain_uv_] / GAIN_MAX; + float intg_scale_uv = (RESOLUTIONVALUE[this->res_uv_] * 100) / INTG_MAX; + this->sensitivity_uv_ = SENSITIVITY_MAX * gain_scale_uv * intg_scale_uv; // Set sensor read state this->reading_ = false; @@ -176,7 +185,13 @@ void LTR390Component::setup() { } } -void LTR390Component::dump_config() { LOG_I2C_DEVICE(this); } +void LTR390Component::dump_config() { + LOG_I2C_DEVICE(this); + ESP_LOGCONFIG(TAG, " ALS Gain: X%.0f", GAINVALUES[this->gain_als_]); + ESP_LOGCONFIG(TAG, " ALS Resolution: %u-bit", RESOLUTION_BITS[this->res_als_]); + ESP_LOGCONFIG(TAG, " UV Gain: X%.0f", GAINVALUES[this->gain_uv_]); + ESP_LOGCONFIG(TAG, " UV Resolution: %u-bit", RESOLUTION_BITS[this->res_uv_]); +} void LTR390Component::update() { if (!this->reading_ && !mode_funcs_.empty()) { diff --git a/esphome/components/ltr390/ltr390.h b/esphome/components/ltr390/ltr390.h index bc98518fe9..24afd3c411 100644 --- a/esphome/components/ltr390/ltr390.h +++ b/esphome/components/ltr390/ltr390.h @@ -49,8 +49,10 @@ class LTR390Component : public PollingComponent, public i2c::I2CDevice { void dump_config() override; void update() override; - void set_gain_value(LTR390GAIN gain) { this->gain_ = gain; } - void set_res_value(LTR390RESOLUTION res) { this->res_ = res; } + void set_als_gain_value(LTR390GAIN gain) { this->gain_als_ = gain; } + void set_uv_gain_value(LTR390GAIN gain) { this->gain_uv_ = gain; } + void set_als_res_value(LTR390RESOLUTION res) { this->res_als_ = res; } + void set_uv_res_value(LTR390RESOLUTION res) { this->res_uv_ = res; } void set_wfac_value(float wfac) { this->wfac_ = wfac; } void set_light_sensor(sensor::Sensor *light_sensor) { this->light_sensor_ = light_sensor; } @@ -71,9 +73,11 @@ class LTR390Component : public PollingComponent, public i2c::I2CDevice { // a list of modes and corresponding read functions std::vector>> mode_funcs_; - LTR390GAIN gain_; - LTR390RESOLUTION res_; - float sensitivity_; + LTR390GAIN gain_als_; + LTR390GAIN gain_uv_; + LTR390RESOLUTION res_als_; + LTR390RESOLUTION res_uv_; + float sensitivity_uv_; float wfac_; sensor::Sensor *light_sensor_{nullptr}; diff --git a/esphome/components/ltr390/sensor.py b/esphome/components/ltr390/sensor.py index 8b2676599c..62c3edf8cb 100644 --- a/esphome/components/ltr390/sensor.py +++ b/esphome/components/ltr390/sensor.py @@ -13,7 +13,7 @@ from esphome.const import ( UNIT_LUX, ) -CODEOWNERS = ["@sjtrny"] +CODEOWNERS = ["@sjtrny", "@latonita"] DEPENDENCIES = ["i2c"] ltr390_ns = cg.esphome_ns.namespace("ltr390") @@ -76,8 +76,24 @@ CONFIG_SCHEMA = cv.All( accuracy_decimals=1, device_class=DEVICE_CLASS_EMPTY, ), - cv.Optional(CONF_GAIN, default="X18"): cv.enum(GAIN_OPTIONS), - cv.Optional(CONF_RESOLUTION, default=20): cv.enum(RES_OPTIONS), + cv.Optional(CONF_GAIN, default="X18"): cv.Any( + cv.enum(GAIN_OPTIONS), + cv.Schema( + { + cv.Required(CONF_AMBIENT_LIGHT): cv.enum(GAIN_OPTIONS), + cv.Required(CONF_UV): cv.enum(GAIN_OPTIONS), + } + ), + ), + cv.Optional(CONF_RESOLUTION, default=20): cv.Any( + cv.enum(RES_OPTIONS), + cv.Schema( + { + cv.Required(CONF_AMBIENT_LIGHT): cv.enum(RES_OPTIONS), + cv.Required(CONF_UV): cv.enum(RES_OPTIONS), + } + ), + ), cv.Optional(CONF_WINDOW_CORRECTION_FACTOR, default=1.0): cv.float_range( min=1.0 ), @@ -101,11 +117,25 @@ async def to_code(config): await cg.register_component(var, config) await i2c.register_i2c_device(var, config) - cg.add(var.set_gain_value(config[CONF_GAIN])) - cg.add(var.set_res_value(config[CONF_RESOLUTION])) cg.add(var.set_wfac_value(config[CONF_WINDOW_CORRECTION_FACTOR])) for key, funcName in TYPES.items(): if key in config: sens = await sensor.new_sensor(config[key]) cg.add(getattr(var, funcName)(sens)) + + gain_value = config[CONF_GAIN] + if isinstance(gain_value, dict): + cg.add(var.set_als_gain_value(gain_value[CONF_AMBIENT_LIGHT])) + cg.add(var.set_uv_gain_value(gain_value[CONF_UV])) + else: + cg.add(var.set_als_gain_value(gain_value)) + cg.add(var.set_uv_gain_value(gain_value)) + + res_value = config[CONF_RESOLUTION] + if isinstance(res_value, dict): + cg.add(var.set_als_res_value(res_value[CONF_AMBIENT_LIGHT])) + cg.add(var.set_uv_res_value(res_value[CONF_UV])) + else: + cg.add(var.set_als_res_value(res_value)) + cg.add(var.set_uv_res_value(res_value)) diff --git a/tests/components/ltr390/test.esp32-ard.yaml b/tests/components/ltr390/test.esp32-ard.yaml index 9786c7dac3..bdfe349b77 100644 --- a/tests/components/ltr390/test.esp32-ard.yaml +++ b/tests/components/ltr390/test.esp32-ard.yaml @@ -18,3 +18,21 @@ sensor: window_correction_factor: 1.0 address: 0x53 update_interval: 60s + - platform: ltr390 + uv: + name: LTR390 UV + uv_index: + name: LTR390 UVI + light: + name: LTR390 Light + ambient_light: + name: LTR390 ALS + gain: + ambient_light: X9 + uv: X3 + resolution: + ambient_light: 18 + uv: 13 + window_correction_factor: 1.0 + address: 0x53 + update_interval: 60s diff --git a/tests/components/ltr390/test.esp8266-ard.yaml b/tests/components/ltr390/test.esp8266-ard.yaml index fee0f37ce1..149f46f9c8 100644 --- a/tests/components/ltr390/test.esp8266-ard.yaml +++ b/tests/components/ltr390/test.esp8266-ard.yaml @@ -13,7 +13,9 @@ sensor: name: LTR390 Light ambient_light: name: LTR390 ALS - gain: X3 + gain: + ambient_light: X9 + uv: X3 resolution: 18 window_correction_factor: 1.0 address: 0x53 From d1bfad98906433899d529875f9b0613d5fc6c9c0 Mon Sep 17 00:00:00 2001 From: Christian Ferbar <5595808+ferbar@users.noreply.github.com> Date: Thu, 11 Jul 2024 05:58:54 +0200 Subject: [PATCH 196/233] helpers.cpp: Fix GLIBCXX_RELEASE check < 8 (#7062) --- esphome/core/helpers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/core/helpers.cpp b/esphome/core/helpers.cpp index 7f040f855f..e75b06ccd3 100644 --- a/esphome/core/helpers.cpp +++ b/esphome/core/helpers.cpp @@ -78,7 +78,7 @@ static const uint16_t CRC16_1021_BE_LUT_H[] = {0x0000, 0x1231, 0x2462, 0x3653, 0 // STL backports -#if _GLIBCXX_RELEASE < 7 +#if _GLIBCXX_RELEASE < 8 std::string to_string(int value) { return str_snprintf("%d", 32, value); } // NOLINT std::string to_string(long value) { return str_snprintf("%ld", 32, value); } // NOLINT std::string to_string(long long value) { return str_snprintf("%lld", 32, value); } // NOLINT From 114476d8b15f173aac926ec653c69fccc2dccdc7 Mon Sep 17 00:00:00 2001 From: Z3LIFF Date: Thu, 11 Jul 2024 00:01:14 -0400 Subject: [PATCH 197/233] Fix pmsa003i cold boot marked as failed on ESP32 et al (#7064) --- esphome/components/pmsa003i/pmsa003i.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/esphome/components/pmsa003i/pmsa003i.cpp b/esphome/components/pmsa003i/pmsa003i.cpp index ca3d28367a..a9665c6a5a 100644 --- a/esphome/components/pmsa003i/pmsa003i.cpp +++ b/esphome/components/pmsa003i/pmsa003i.cpp @@ -13,6 +13,15 @@ void PMSA003IComponent::setup() { PM25AQIData data; bool successful_read = this->read_data_(&data); + if (!successful_read) { + for (int i = 0; i < 3; i++) { + successful_read = this->read_data_(&data); + if (successful_read) { + break; + } + } + } + if (!successful_read) { this->mark_failed(); return; From 8d28c53fd3e72120fcc8bd13759e67ee4892e91f Mon Sep 17 00:00:00 2001 From: guillempages Date: Thu, 11 Jul 2024 06:08:51 +0200 Subject: [PATCH 198/233] [http_request] Fix follow_redirects on arduino (#7054) --- esphome/components/http_request/http_request_arduino.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/esphome/components/http_request/http_request_arduino.cpp b/esphome/components/http_request/http_request_arduino.cpp index 248a85a439..95b1cdc38e 100644 --- a/esphome/components/http_request/http_request_arduino.cpp +++ b/esphome/components/http_request/http_request_arduino.cpp @@ -32,6 +32,13 @@ std::shared_ptr HttpRequestArduino::start(std::string url, std::s watchdog::WatchdogManager wdm(this->get_watchdog_timeout()); + if (this->follow_redirects_) { + container->client_.setFollowRedirects(HTTPC_FORCE_FOLLOW_REDIRECTS); + container->client_.setRedirectLimit(this->redirect_limit_); + } else { + container->client_.setFollowRedirects(HTTPC_DISABLE_FOLLOW_REDIRECTS); + } + #if defined(USE_ESP8266) std::unique_ptr stream_ptr; #ifdef USE_HTTP_REQUEST_ESP8266_HTTPS @@ -59,8 +66,6 @@ std::shared_ptr HttpRequestArduino::start(std::string url, std::s "in your YAML, or use HTTPS"); } #endif // USE_ARDUINO_VERSION_CODE - - container->client_.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS); bool status = container->client_.begin(*stream_ptr, url.c_str()); #elif defined(USE_RP2040) From 8a89dac5d541f631e491832965f00a4549eb0210 Mon Sep 17 00:00:00 2001 From: Jimmy Hedman Date: Thu, 11 Jul 2024 06:09:51 +0200 Subject: [PATCH 199/233] [ethernet] Fix compile warning for IPv6 (#7048) --- esphome/components/ethernet/ethernet_component.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/esphome/components/ethernet/ethernet_component.cpp b/esphome/components/ethernet/ethernet_component.cpp index 6b34157b9d..962a864a29 100644 --- a/esphome/components/ethernet/ethernet_component.cpp +++ b/esphome/components/ethernet/ethernet_component.cpp @@ -394,7 +394,7 @@ void EthernetComponent::got_ip_event_handler(void *arg, esp_event_base_t event_b const esp_netif_ip_info_t *ip_info = &event->ip_info; ESP_LOGV(TAG, "[Ethernet event] ETH Got IP " IPSTR, IP2STR(&ip_info->ip)); global_eth_component->got_ipv4_address_ = true; -#if USE_NETWORK_IPV6 +#if USE_NETWORK_IPV6 && (USE_NETWORK_MIN_IPV6_ADDR_COUNT > 0) global_eth_component->connected_ = global_eth_component->ipv6_count_ >= USE_NETWORK_MIN_IPV6_ADDR_COUNT; #else global_eth_component->connected_ = true; @@ -407,8 +407,12 @@ void EthernetComponent::got_ip6_event_handler(void *arg, esp_event_base_t event_ ip_event_got_ip6_t *event = (ip_event_got_ip6_t *) event_data; ESP_LOGV(TAG, "[Ethernet event] ETH Got IPv6: " IPV6STR, IPV62STR(event->ip6_info.ip)); global_eth_component->ipv6_count_ += 1; +#if (USE_NETWORK_MIN_IPV6_ADDR_COUNT > 0) global_eth_component->connected_ = global_eth_component->got_ipv4_address_ && (global_eth_component->ipv6_count_ >= USE_NETWORK_MIN_IPV6_ADDR_COUNT); +#else + global_eth_component->connected_ = global_eth_component->got_ipv4_address_; +#endif } #endif /* USE_NETWORK_IPV6 */ From bdd0a36aa3ada035ead9eff3a1bc29d2993e4cb5 Mon Sep 17 00:00:00 2001 From: esphomebot Date: Thu, 11 Jul 2024 16:10:18 +1200 Subject: [PATCH 200/233] Update webserver local assets to 20240704-081526 (#7041) --- .../components/web_server/server_index_v2.h | 83 +- .../components/web_server/server_index_v3.h | 735 +++++++++--------- 2 files changed, 410 insertions(+), 408 deletions(-) diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h index c942cda592..c9932624ba 100644 --- a/esphome/components/web_server/server_index_v2.h +++ b/esphome/components/web_server/server_index_v2.h @@ -68,7 +68,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe3, 0x9b, 0x82, 0xde, 0xc5, 0x0e, 0x21, 0xa9, 0x64, 0x54, 0x44, 0x2c, 0x97, 0x29, 0x21, 0x29, 0xc2, 0x3f, 0x90, 0x45, 0x68, 0xd6, 0x13, 0xec, 0x34, 0x30, 0x9c, 0xcb, 0x40, 0x71, 0x17, 0x3c, 0xe0, 0xc9, 0x9c, 0xa6, 0x82, 0xa6, 0xc1, 0x5f, 0x71, 0x4a, 0x87, 0x31, 0x40, 0xb1, 0xd3, 0xc4, 0xe3, 0x30, 0x3b, 0x1f, 0x87, 0xc9, 0x88, 0x46, 0xc1, - 0x8d, 0xc8, 0xf1, 0xdf, 0x89, 0x3b, 0x64, 0x49, 0x18, 0xb3, 0x5f, 0x69, 0xe4, 0x6a, 0x69, 0x70, 0xeb, 0xd0, 0x5b, + 0x8d, 0xc8, 0xf1, 0xdf, 0x89, 0x3b, 0x64, 0x49, 0x18, 0xb3, 0x5f, 0x69, 0xe4, 0x6a, 0x69, 0x70, 0xe6, 0xd0, 0x5b, 0x41, 0x93, 0x28, 0x73, 0x9e, 0xbf, 0x7b, 0xf9, 0x42, 0xef, 0x63, 0x45, 0x40, 0xa0, 0x45, 0x36, 0x9b, 0xd2, 0xd4, 0x43, 0x58, 0x0b, 0x88, 0x67, 0x4c, 0x32, 0xc7, 0x97, 0xe1, 0x54, 0x95, 0xb0, 0xec, 0xfd, 0x34, 0x0a, 0x05, 0x7d, 0x43, 0x93, 0x88, 0x25, 0x23, 0xb2, 0xd3, 0x54, 0xe5, 0xe3, 0x50, 0x57, 0x44, 0x45, 0xd1, 0xe5, 0xee, 0xb3, 0x58, @@ -150,19 +150,19 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xa6, 0x57, 0xfd, 0xcf, 0xf9, 0x64, 0x0a, 0xda, 0xd8, 0x0a, 0x49, 0x8f, 0xa8, 0x9e, 0xb0, 0xac, 0xcf, 0x37, 0x94, 0x55, 0xfa, 0xc8, 0xf3, 0x58, 0xa1, 0xa6, 0xc2, 0x5e, 0xde, 0x69, 0xe4, 0xb3, 0xa2, 0xa8, 0x60, 0x1c, 0x9b, 0x9c, 0x2a, 0xe7, 0xab, 0x2e, 0x19, 0x53, 0xf1, 0xda, 0x63, 0x8a, 0x0f, 0x33, 0xe0, 0x75, 0x16, 0xfb, 0x31, 0xe4, 0x6e, - 0xef, 0x7f, 0x5e, 0x22, 0x67, 0x91, 0xaf, 0xa0, 0x6f, 0x91, 0xe7, 0xb7, 0xca, 0xc8, 0xc6, 0xb7, 0xdb, 0xad, 0xe1, - 0xb2, 0x4e, 0x1b, 0x8b, 0xbd, 0x3e, 0xbe, 0x5d, 0x57, 0x1d, 0xc9, 0x62, 0xc2, 0x23, 0x1a, 0xb8, 0x7c, 0x4a, 0x13, - 0x37, 0x07, 0xaf, 0xaa, 0xde, 0xfb, 0x81, 0xf0, 0x16, 0x6f, 0xab, 0xee, 0xd5, 0xe0, 0x36, 0x07, 0xef, 0xd7, 0xd7, + 0xef, 0x7f, 0x5e, 0x22, 0x67, 0x91, 0xaf, 0xa0, 0x6f, 0x91, 0xe7, 0x67, 0xca, 0xc8, 0xc6, 0x67, 0xdb, 0xad, 0xe1, + 0xb2, 0x4e, 0x1b, 0x8b, 0xbd, 0x3e, 0x3e, 0x5b, 0x57, 0x1d, 0xc9, 0x62, 0xc2, 0x23, 0x1a, 0xb8, 0x7c, 0x4a, 0x13, + 0x37, 0x07, 0xaf, 0xaa, 0xde, 0xfb, 0x81, 0xf0, 0x16, 0x6f, 0xab, 0xee, 0xd5, 0xe0, 0x2c, 0x07, 0xef, 0xd7, 0xd7, 0xeb, 0x8e, 0xd7, 0xef, 0x69, 0x9a, 0x49, 0x45, 0xb4, 0xd0, 0x69, 0xbf, 0x2e, 0xc5, 0xd2, 0xd7, 0xc1, 0xd6, 0xf6, 0xa5, 0x09, 0xe2, 0x36, 0xfd, 0x63, 0xff, 0xc0, 0x45, 0xd2, 0x2d, 0xfc, 0x93, 0x3e, 0xf0, 0x1f, 0x8c, 0x5b, 0xf8, 0x19, 0xf9, 0x50, 0xf5, 0x0a, 0x47, 0x82, 0x3c, 0xeb, 0x3e, 0x33, 0x16, 0x33, 0x8f, 0xd9, 0xe0, 0xce, 0x73, 0x63, 0x26, 0xea, 0x10, 0x7a, 0x73, 0xf1, 0x42, 0x55, 0x80, 0x4b, 0x51, 0xba, 0xb3, 0x73, 0x63, 0xeb, 0x61, 0x21, 0x88, 0xbb, 0x1b, 0x33, 0xb1, 0xeb, 0xe2, 0x09, 0xb9, 0x82, 0x1f, 0xbb, 0x0b, 0xef, 0x65, 0x28, 0xc6, 0x7e, 0x1a, 0x26, - 0x11, 0x9f, 0x78, 0xa8, 0xe6, 0xba, 0xc8, 0xcf, 0xa4, 0xbd, 0xf1, 0x18, 0xe5, 0xbb, 0x57, 0xf8, 0x4c, 0x10, 0xb7, - 0xeb, 0xd6, 0x26, 0xf8, 0x95, 0x20, 0x57, 0xa7, 0xbb, 0x8b, 0x33, 0x91, 0x77, 0xae, 0xf0, 0x59, 0xe1, 0xb1, 0xc7, - 0x6f, 0x88, 0x87, 0x48, 0xe7, 0x4c, 0x43, 0x73, 0xce, 0x27, 0xca, 0x73, 0xef, 0x22, 0xfc, 0x1e, 0xe2, 0x2a, 0x69, - 0xc9, 0x6d, 0x74, 0x68, 0x65, 0x87, 0xb8, 0x5c, 0xba, 0x08, 0xdc, 0xbd, 0x3d, 0xab, 0xac, 0x50, 0x15, 0xf0, 0xad, - 0x20, 0x15, 0x83, 0x1c, 0xbf, 0x95, 0x11, 0x9a, 0x5b, 0xe1, 0xa5, 0xc8, 0x0c, 0xe3, 0x19, 0x3f, 0xb4, 0x3e, 0x9a, + 0x11, 0x9f, 0x78, 0xa8, 0xe6, 0xba, 0xc8, 0xcf, 0xa4, 0xbd, 0xf1, 0x18, 0xe5, 0xbb, 0x57, 0xf8, 0x56, 0x10, 0xb7, + 0xeb, 0xd6, 0x26, 0xf8, 0x95, 0x20, 0x57, 0xa7, 0xbb, 0x8b, 0x5b, 0x91, 0x77, 0xae, 0xf0, 0x6d, 0xe1, 0xb1, 0xc7, + 0x6f, 0x88, 0x87, 0x48, 0xe7, 0x56, 0x43, 0x73, 0xce, 0x27, 0xca, 0x73, 0xef, 0x22, 0xfc, 0x1e, 0xe2, 0x2a, 0x69, + 0xc9, 0x6d, 0x74, 0x68, 0x65, 0x87, 0xb8, 0x5c, 0xba, 0x08, 0xdc, 0xbd, 0x3d, 0xab, 0xac, 0x50, 0x15, 0xf0, 0x99, + 0x20, 0x15, 0x83, 0x1c, 0xbf, 0x95, 0x11, 0x9a, 0x33, 0xe1, 0xa5, 0xc8, 0x0c, 0xe3, 0x19, 0x3f, 0xb4, 0x3e, 0x9a, 0x69, 0x4f, 0x79, 0x18, 0x7c, 0x26, 0x68, 0x1a, 0x0a, 0x9e, 0xf6, 0x91, 0xad, 0x7e, 0xe0, 0xbf, 0x91, 0xab, 0x9e, 0xf3, 0x9f, 0xbe, 0xf8, 0x79, 0xf8, 0x73, 0xda, 0xbf, 0xc2, 0xaf, 0xc9, 0xfe, 0xa9, 0xd7, 0x0d, 0xbc, 0x9d, 0x7a, 0x7d, 0xf9, 0xf3, 0x7e, 0xef, 0x1f, 0x61, 0xfd, 0xd7, 0xb3, 0xfa, 0x4f, 0x7d, 0xb4, 0xf4, 0x7e, 0xde, 0xef, 0xf6, @@ -177,7 +177,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xf2, 0x03, 0x64, 0x81, 0xc0, 0xf3, 0x30, 0x9e, 0xd1, 0x2c, 0xa0, 0x39, 0xc2, 0x03, 0x72, 0x21, 0xbc, 0x26, 0xc2, 0xcf, 0x05, 0xfc, 0x68, 0x21, 0x7c, 0xa1, 0x03, 0x98, 0x70, 0x90, 0x15, 0x51, 0x25, 0x5c, 0x69, 0x2c, 0x2e, 0xc2, 0xd3, 0x0d, 0x95, 0x62, 0x0c, 0xde, 0x05, 0x84, 0x87, 0x95, 0x70, 0x27, 0xbe, 0x21, 0x86, 0x24, 0xde, 0xa5, 0x94, - 0xfe, 0x10, 0xc6, 0x1f, 0x69, 0xea, 0x9d, 0xe1, 0x66, 0xeb, 0x31, 0x96, 0x2e, 0xe8, 0x9d, 0x26, 0x6a, 0x17, 0xb1, + 0xfe, 0x10, 0xc6, 0x1f, 0x69, 0xea, 0xdd, 0xe2, 0x66, 0xeb, 0x31, 0x96, 0x2e, 0xe8, 0x9d, 0x26, 0x6a, 0x17, 0xb1, 0xaa, 0x73, 0xa1, 0x62, 0x04, 0x20, 0x64, 0xab, 0xbe, 0x18, 0xd8, 0xf1, 0x9d, 0x74, 0xcd, 0x61, 0x95, 0x86, 0x37, 0x2e, 0xaa, 0xc6, 0x45, 0x59, 0x32, 0x0f, 0x63, 0x16, 0x39, 0x82, 0x4e, 0xa6, 0x71, 0x28, 0xa8, 0xa3, 0xd7, 0xeb, 0x84, 0x30, 0x90, 0x5b, 0xa8, 0x0c, 0x91, 0x65, 0x70, 0x46, 0x26, 0xe0, 0x04, 0x67, 0xc5, 0x83, 0xe8, 0x94, 0x56, @@ -220,10 +220,10 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x73, 0xd4, 0x69, 0xa0, 0x45, 0xa5, 0xad, 0xd4, 0x99, 0xaa, 0x71, 0xf4, 0x82, 0x4f, 0xcf, 0x49, 0xa3, 0x3d, 0x3f, 0x1d, 0xb5, 0xe7, 0xb5, 0x1a, 0xca, 0x0c, 0x69, 0xcd, 0x7a, 0xf3, 0x3e, 0x7e, 0x03, 0x4e, 0x3d, 0x9b, 0x96, 0x70, 0x65, 0x79, 0x2d, 0xbd, 0xbc, 0x5a, 0x2d, 0xc9, 0x51, 0xdb, 0xea, 0x3a, 0x52, 0x5d, 0xf3, 0x5c, 0xe1, 0x64, 0x95, - 0xd4, 0x4e, 0x90, 0x2c, 0x81, 0x64, 0x28, 0x42, 0xc8, 0x99, 0x40, 0x1b, 0x47, 0x85, 0x31, 0xa1, 0xbb, 0x3c, 0xb3, + 0xd4, 0x4e, 0x90, 0x2c, 0x81, 0x64, 0x28, 0x42, 0xc8, 0xad, 0x40, 0x1b, 0x47, 0x85, 0x31, 0xa1, 0xbb, 0x3c, 0xb3, 0xc0, 0x3e, 0x95, 0x94, 0xf0, 0x00, 0x0b, 0xd0, 0xb5, 0xf0, 0x04, 0x4f, 0xf0, 0xac, 0xd6, 0x94, 0x64, 0x5e, 0x6f, 0xb6, 0xab, 0x63, 0x3d, 0x2a, 0xc7, 0xc2, 0xb3, 0x1a, 0x99, 0x14, 0x58, 0xca, 0x93, 0x5a, 0x2d, 0xaf, 0x06, 0x3b, - 0xcd, 0xc9, 0xad, 0x04, 0x20, 0xce, 0x56, 0x93, 0x32, 0x8c, 0x84, 0x2d, 0x65, 0x2a, 0xf3, 0x59, 0x92, 0xd0, 0x14, + 0xcd, 0xc9, 0xad, 0x04, 0x20, 0x6e, 0x57, 0x93, 0x32, 0x8c, 0x84, 0x2d, 0x65, 0x2a, 0xf3, 0x59, 0x92, 0xd0, 0x14, 0xa4, 0x28, 0x11, 0x98, 0xe5, 0x79, 0x29, 0xd9, 0x41, 0x8c, 0x62, 0x4a, 0x52, 0xe0, 0x3c, 0xd2, 0xee, 0xc2, 0x09, 0xe6, 0x78, 0x2c, 0xf9, 0x06, 0x21, 0xe4, 0xc2, 0xa4, 0xb3, 0x08, 0xc9, 0x83, 0x62, 0xc2, 0x2c, 0x99, 0x94, 0x11, 0xea, 0x5f, 0xee, 0x9e, 0xf3, 0x7b, 0x6d, 0xb2, 0x1e, 0xeb, 0x07, 0xb2, 0x59, 0xac, 0x39, 0x57, 0x48, 0xde, 0x7b, @@ -238,14 +238,14 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x13, 0xf3, 0xec, 0xa5, 0x5f, 0xd6, 0xca, 0xc6, 0x97, 0xbb, 0x67, 0xef, 0x37, 0x35, 0x83, 0xf2, 0x7c, 0x56, 0xda, 0xf8, 0x12, 0xbe, 0x05, 0x8d, 0x83, 0x85, 0x16, 0x0e, 0x01, 0xcb, 0xb1, 0x14, 0x48, 0x41, 0x96, 0x17, 0xae, 0x91, 0xa7, 0x38, 0x21, 0x32, 0x0c, 0x54, 0xdd, 0x35, 0xad, 0xe6, 0x31, 0x9e, 0x5c, 0x0c, 0xf8, 0x94, 0x6e, 0x89, 0x0d, - 0x9d, 0x21, 0x9f, 0x4d, 0x20, 0x75, 0x46, 0x82, 0xce, 0xf0, 0x4e, 0x03, 0xb5, 0xab, 0xe2, 0x2b, 0x91, 0x44, 0xca, + 0xdd, 0x22, 0x9f, 0x4d, 0x20, 0x75, 0x46, 0x82, 0xce, 0xf0, 0x4e, 0x03, 0xb5, 0xab, 0xe2, 0x2b, 0x91, 0x44, 0xca, 0x2b, 0xb2, 0x05, 0x8f, 0x49, 0x03, 0xc7, 0xa4, 0x81, 0x43, 0x92, 0xf5, 0x1a, 0x4a, 0x40, 0xb4, 0xc3, 0x62, 0x5c, 0x25, 0x66, 0x20, 0x2b, 0x4c, 0x9f, 0x56, 0x25, 0x80, 0xa3, 0x76, 0x28, 0x7d, 0x8f, 0x52, 0xa6, 0x47, 0x92, 0x2c, 0xde, 0x7a, 0x1c, 0x73, 0x39, 0xf0, 0x05, 0xbb, 0x8e, 0x21, 0xb1, 0x04, 0x56, 0x85, 0x05, 0x0a, 0x8a, 0xa6, 0x4d, 0xdd, 0x34, 0xf4, 0xe5, 0x3e, 0x71, 0x1c, 0xfa, 0xc0, 0xb9, 0x71, 0xa8, 0xf3, 0x70, 0xb2, 0xf5, 0x2e, 0xc7, 0x7b, 0x7b, 0x9e, 0xea, 0xf4, 0x8b, 0xf0, 0xb8, 0xa9, 0x2f, 0x23, 0x77, 0xdf, 0x2b, 0x5e, 0x11, 0x21, 0x09, 0x7f, 0xad, 0x16, 0xf7, 0x73, 0x08, 0x43, 0x7b, 0x61, 0x15, 0x83, 0x06, 0x78, 0xa9, 0xeb, 0x55, 0x97, 0x5f, 0xab, 0x15, 0x51, - 0xda, 0x2a, 0xb6, 0xce, 0x70, 0x92, 0xcf, 0xbd, 0x22, 0xf5, 0xa7, 0xb1, 0x96, 0x2f, 0x65, 0x40, 0x40, 0xcc, 0xa6, + 0xda, 0x2a, 0xb6, 0x6e, 0x71, 0x92, 0xcf, 0xbd, 0x22, 0xf5, 0xa7, 0xb1, 0x96, 0x2f, 0x65, 0x40, 0x40, 0xcc, 0xa6, 0x59, 0x66, 0x16, 0x63, 0x1d, 0x09, 0x06, 0xed, 0xbe, 0xd1, 0x59, 0x0b, 0x58, 0x66, 0x57, 0xe9, 0x46, 0x86, 0x9d, 0xb5, 0x50, 0x60, 0x1a, 0x41, 0x54, 0x0a, 0x1a, 0xd5, 0x72, 0x4d, 0xde, 0x6f, 0xd7, 0x73, 0x2e, 0x71, 0x86, 0xb4, 0x93, 0x4b, 0x42, 0x21, 0x91, 0xd5, 0x2a, 0x90, 0xf2, 0x9c, 0x4c, 0xb7, 0x93, 0xfc, 0x99, 0x45, 0xf2, 0x4f, 0x08, @@ -268,7 +268,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0x36, 0x44, 0x4d, 0xa5, 0xd4, 0x91, 0x2d, 0x50, 0xd1, 0xc1, 0x9f, 0x7b, 0x4c, 0x2b, 0x6e, 0x26, 0x6e, 0x06, 0x0c, 0xf8, 0x89, 0xf0, 0x54, 0x30, 0x0a, 0x64, 0x06, 0xf7, 0x67, 0x5e, 0x65, 0xea, 0x36, 0x97, 0xdd, 0xb0, 0x46, 0xdc, 0xd8, 0x46, 0x13, 0x97, 0x71, 0xbd, 0xf3, 0x92, 0x97, 0x0e, 0x55, 0x06, 0xb5, 0x30, 0x5c, 0xb0, 0x4c, 0x24, 0xb1, - 0x96, 0x3f, 0x54, 0x49, 0xd1, 0x45, 0x23, 0x4c, 0x25, 0x18, 0xef, 0xe4, 0x1e, 0xd0, 0x1c, 0xfe, 0x2e, 0x6e, 0x85, + 0x96, 0x3f, 0x54, 0x49, 0xd1, 0x45, 0x23, 0x4c, 0x25, 0x18, 0xef, 0xe4, 0x1e, 0xd0, 0x1c, 0xfe, 0x2e, 0xce, 0x84, 0xb5, 0xa3, 0xc6, 0x89, 0x2d, 0xe7, 0xb4, 0xa4, 0xfe, 0x5b, 0x48, 0x75, 0x59, 0x3d, 0xf3, 0xcf, 0xa5, 0x2c, 0x64, 0x38, 0xab, 0x30, 0xf6, 0x44, 0x32, 0x76, 0x04, 0x7a, 0x9a, 0x49, 0xfc, 0xee, 0xea, 0x8c, 0x17, 0xa6, 0xa5, 0x9c, 0x26, 0xb1, 0x37, 0x45, 0xb4, 0xdc, 0xfa, 0xbd, 0xb2, 0x1b, 0x01, 0x23, 0x90, 0x05, 0x84, 0x35, 0x67, 0x4f, 0x10, @@ -312,7 +312,7 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xf1, 0xb5, 0x7b, 0x78, 0x63, 0x02, 0x1e, 0xb4, 0x87, 0x4d, 0x61, 0x19, 0xdb, 0x99, 0xba, 0x07, 0x64, 0x8f, 0x4f, 0xb8, 0xd1, 0xdd, 0xaa, 0x56, 0xc6, 0x1b, 0xb0, 0xff, 0x11, 0x1e, 0x9b, 0xcb, 0x71, 0x54, 0x73, 0x60, 0x1a, 0x2c, 0xf2, 0xc2, 0x29, 0xc0, 0x95, 0xf2, 0x96, 0x22, 0xcc, 0x73, 0x19, 0xe0, 0xfe, 0x16, 0x7f, 0xa7, 0x59, 0xe2, 0xb0, - 0xe0, 0x38, 0xb7, 0x0f, 0xe5, 0x88, 0x0a, 0xfc, 0x22, 0x7e, 0x0f, 0x74, 0x2c, 0x29, 0x34, 0x37, 0x54, 0xf4, 0x94, + 0xe0, 0x38, 0x67, 0x0f, 0xe5, 0x88, 0x0a, 0xfc, 0x22, 0x7e, 0x0f, 0x74, 0x2c, 0x29, 0x34, 0x37, 0x54, 0xf4, 0x94, 0xeb, 0x85, 0x6c, 0x4d, 0x4b, 0xc5, 0xb4, 0x48, 0xa9, 0x91, 0xd3, 0x6c, 0xc8, 0xe3, 0x34, 0x56, 0xb6, 0x28, 0x4e, 0x55, 0x65, 0x5e, 0xb4, 0x05, 0x8b, 0x65, 0x68, 0x71, 0xb9, 0xf4, 0xaa, 0xa8, 0x26, 0xcc, 0x8a, 0x64, 0x20, 0xcc, 0xac, 0x8c, 0x8a, 0x8a, 0x66, 0xad, 0xfa, 0x78, 0x68, 0x35, 0xa1, 0xc8, 0xe8, 0xe6, 0x15, 0x38, 0x6c, 0x17, 0x82, @@ -612,31 +612,32 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xde, 0x0b, 0x3e, 0xda, 0x3c, 0x56, 0xcc, 0x47, 0x5d, 0x79, 0x05, 0x42, 0xdd, 0xb5, 0x35, 0xca, 0x2f, 0x8f, 0xdd, 0xce, 0xa9, 0x56, 0x06, 0x1c, 0x19, 0x0e, 0x77, 0x8f, 0x1a, 0xe6, 0x56, 0x45, 0xcc, 0x47, 0x70, 0x20, 0x55, 0x17, 0x6b, 0x92, 0x8a, 0xc7, 0x7d, 0xdc, 0xec, 0x9c, 0x86, 0x8e, 0xe4, 0x2d, 0x92, 0x79, 0x64, 0xc1, 0x3e, 0x74, 0x1e, - 0xf3, 0x09, 0xf5, 0x19, 0xdf, 0xbf, 0xa1, 0xd7, 0xf5, 0x70, 0xca, 0x4a, 0xf7, 0x36, 0x28, 0x1d, 0xc5, 0x94, 0xbc, - 0x9c, 0x09, 0x7e, 0x86, 0x2b, 0x8b, 0x94, 0x2c, 0x3c, 0xd7, 0xbe, 0x73, 0xb0, 0x55, 0x80, 0x84, 0x5c, 0x47, 0x71, - 0x78, 0xe3, 0x63, 0xd7, 0xb2, 0x37, 0x77, 0x3b, 0xff, 0xfa, 0x3f, 0xfe, 0x97, 0x76, 0x9b, 0x9f, 0xee, 0x8f, 0x9b, - 0x66, 0xac, 0x15, 0x44, 0xe7, 0xa7, 0x70, 0x11, 0xb1, 0x8c, 0xf3, 0xd2, 0xdb, 0xfa, 0x28, 0x65, 0x51, 0x7d, 0x1c, - 0xc6, 0x43, 0xb7, 0xb3, 0x1d, 0x41, 0xf6, 0x0d, 0x24, 0x0d, 0x75, 0xb5, 0x08, 0x48, 0xf0, 0x37, 0xdd, 0xa1, 0x31, - 0x57, 0x31, 0xe4, 0x69, 0xb5, 0x6f, 0xd4, 0x94, 0x07, 0xaa, 0x72, 0xab, 0x26, 0xd5, 0x5f, 0xaf, 0xd2, 0x4c, 0x2d, - 0xad, 0x5c, 0xa6, 0xc9, 0x5d, 0xa7, 0x88, 0x53, 0xfd, 0xdf, 0xff, 0xf9, 0x5f, 0xfe, 0x9b, 0x79, 0x84, 0xf0, 0xd3, - 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, 0x85, 0x0b, 0x18, 0x3a, 0x44, 0x25, 0xf9, 0x84, 0x53, 0xc6, - 0xa7, 0x14, 0xc3, 0x70, 0x20, 0x47, 0x71, 0xc2, 0x32, 0xc1, 0x06, 0xd5, 0xeb, 0x35, 0x17, 0x72, 0x42, 0x79, 0xd8, - 0x34, 0x74, 0xf2, 0xd0, 0xe6, 0x25, 0x8d, 0x54, 0x50, 0x2e, 0x69, 0x31, 0x3f, 0xdd, 0x07, 0x7c, 0x3f, 0xec, 0x46, - 0xa2, 0x5f, 0x6c, 0xc7, 0xc2, 0x38, 0x65, 0xa1, 0x24, 0x2f, 0xcb, 0x1d, 0x08, 0x97, 0x2c, 0xe0, 0x31, 0x68, 0x59, - 0xc5, 0x72, 0xf7, 0x2a, 0x7d, 0xda, 0x1f, 0x66, 0x99, 0x60, 0x43, 0x40, 0xb9, 0x72, 0xfd, 0xca, 0xc8, 0x74, 0x1d, - 0xd4, 0xbf, 0xf8, 0x2e, 0x97, 0xa3, 0x28, 0xdb, 0xfa, 0xf0, 0xe4, 0x4f, 0xf9, 0x5f, 0x26, 0xa0, 0x64, 0x39, 0xde, - 0x24, 0xbc, 0xd5, 0x16, 0xf7, 0x71, 0xa3, 0x31, 0xbd, 0x45, 0x8b, 0x72, 0x06, 0xbc, 0x6d, 0x32, 0xe9, 0x2e, 0xb6, - 0x07, 0x94, 0x21, 0xed, 0xc2, 0x33, 0xdd, 0x70, 0xc0, 0xbd, 0xed, 0x34, 0xf2, 0xfc, 0xcf, 0x0b, 0xe9, 0x1c, 0x65, - 0xbf, 0x42, 0xe8, 0x59, 0xfb, 0x91, 0xaf, 0xb9, 0xbd, 0xb8, 0x85, 0xd5, 0xab, 0xa5, 0x7a, 0x8d, 0x9b, 0xeb, 0x17, - 0xed, 0xec, 0xd0, 0xb9, 0x1d, 0xf4, 0x3e, 0x84, 0x30, 0xf6, 0xb8, 0x89, 0xc7, 0xad, 0x45, 0x31, 0xbc, 0x10, 0x7c, - 0x62, 0xc7, 0xca, 0x69, 0x48, 0x07, 0x74, 0x68, 0xfc, 0xef, 0xba, 0x5e, 0xc5, 0xc1, 0xf3, 0xf1, 0xc1, 0x86, 0xb9, - 0x34, 0x48, 0x32, 0x46, 0xee, 0x34, 0xf2, 0x2f, 0xe1, 0x04, 0x2e, 0x86, 0x31, 0x0f, 0x45, 0x20, 0x09, 0xb6, 0x6d, - 0x47, 0xdc, 0x43, 0x60, 0x33, 0x7c, 0x61, 0xc1, 0xd3, 0x56, 0x4d, 0xc1, 0x13, 0x5e, 0xbd, 0x0e, 0x99, 0xfb, 0xb2, - 0xbb, 0x3d, 0x94, 0x72, 0xa4, 0x7d, 0xaf, 0x03, 0xd9, 0xaf, 0x2a, 0x1e, 0x28, 0x2d, 0x63, 0x5a, 0x68, 0x73, 0xbd, - 0x12, 0xd5, 0xaa, 0xf6, 0x27, 0xe1, 0xb9, 0x12, 0x4c, 0x77, 0xb5, 0x95, 0x2c, 0x84, 0x56, 0xaf, 0xc8, 0xf7, 0x85, - 0x15, 0x14, 0x4e, 0xa7, 0xb2, 0x21, 0x6a, 0x9f, 0xee, 0x2b, 0xe5, 0x15, 0xb8, 0x87, 0xcc, 0xd2, 0x50, 0x49, 0x11, - 0xba, 0x91, 0x3e, 0x0a, 0xea, 0x97, 0x4e, 0x97, 0x80, 0xcf, 0x9a, 0x75, 0xfe, 0x1f, 0xd6, 0xb2, 0x30, 0xa4, 0x67, - 0x88, 0x00, 0x00}; + 0xf3, 0x09, 0xf5, 0x19, 0xdf, 0xbf, 0xa1, 0xd7, 0xf5, 0x70, 0xca, 0x4a, 0xf7, 0x36, 0x28, 0x1d, 0xc5, 0x94, 0xdc, + 0x78, 0xc4, 0xf5, 0x9d, 0xa3, 0x56, 0xe9, 0x6e, 0x3b, 0x04, 0x9b, 0xc7, 0xb8, 0xe6, 0xa4, 0x4f, 0xce, 0x02, 0x8b, + 0x77, 0x4e, 0xf7, 0xc3, 0x15, 0x8c, 0x48, 0x7e, 0x9f, 0x6b, 0x47, 0x3b, 0x18, 0x36, 0x40, 0x6f, 0xae, 0xa3, 0xc4, + 0x81, 0x71, 0xc8, 0x6b, 0x41, 0x9d, 0xbb, 0x9d, 0x7f, 0xfd, 0x1f, 0xff, 0x4b, 0xfb, 0xd8, 0x4f, 0xf7, 0xc7, 0x4d, + 0x33, 0xd6, 0xca, 0xae, 0xe4, 0xa7, 0x70, 0x6b, 0xb1, 0x0c, 0x0a, 0xd3, 0xdb, 0xfa, 0x28, 0x65, 0x51, 0x7d, 0x1c, + 0xc6, 0x43, 0xb7, 0xb3, 0x1d, 0x9b, 0xf6, 0x75, 0x25, 0x0d, 0x75, 0xb5, 0x08, 0xe8, 0xf5, 0x37, 0x5d, 0xb8, 0x31, + 0xf7, 0x36, 0xe4, 0xd1, 0xb6, 0xaf, 0xdf, 0x94, 0xa7, 0xaf, 0x72, 0x05, 0x27, 0xd5, 0x9f, 0xba, 0xd2, 0x1c, 0x30, + 0xad, 0xdc, 0xbc, 0xc9, 0x5d, 0xa7, 0x08, 0x6a, 0xfd, 0xdf, 0xff, 0xf9, 0x5f, 0xfe, 0x9b, 0x79, 0x84, 0x58, 0xd5, + 0xbf, 0xfe, 0xf7, 0xff, 0xfc, 0x7f, 0xfe, 0xf7, 0x7f, 0x85, 0xdb, 0x1a, 0x3a, 0x9e, 0x25, 0x99, 0x8a, 0x53, 0x06, + 0xb3, 0x14, 0x77, 0x71, 0x20, 0xa1, 0x71, 0xc2, 0x32, 0xc1, 0x06, 0xd5, 0xbb, 0x38, 0x17, 0x72, 0x42, 0x79, 0x32, + 0x35, 0x74, 0xf2, 0x84, 0xe7, 0x25, 0x41, 0x55, 0x50, 0x2e, 0x09, 0x37, 0x3f, 0xdd, 0x07, 0x7c, 0x3f, 0xec, 0xfa, + 0xa2, 0x5f, 0x6c, 0xc7, 0xc2, 0x90, 0x09, 0x94, 0xe4, 0x65, 0xb9, 0x03, 0xb1, 0x95, 0x05, 0x3c, 0x06, 0x2d, 0xab, + 0x58, 0xee, 0x5e, 0xa5, 0x4f, 0xfb, 0xc3, 0x2c, 0x13, 0x6c, 0x08, 0x28, 0x57, 0x7e, 0x62, 0x19, 0xc6, 0xae, 0x83, + 0xae, 0x18, 0xdf, 0xe5, 0x72, 0x14, 0x45, 0xa0, 0x87, 0x27, 0x7f, 0xca, 0xff, 0x32, 0x01, 0x8d, 0xcc, 0xf1, 0x26, + 0xe1, 0xad, 0x36, 0xcf, 0x8f, 0x1b, 0x8d, 0xe9, 0x2d, 0x5a, 0x94, 0x33, 0xe0, 0x6d, 0x93, 0x49, 0x3a, 0xb6, 0x07, + 0x94, 0xf1, 0xef, 0xc2, 0x8d, 0xdd, 0x70, 0xc0, 0x17, 0xee, 0x34, 0xf2, 0xfc, 0xcf, 0x0b, 0xe9, 0x49, 0x65, 0xbf, + 0x42, 0x9c, 0x5a, 0x3b, 0x9d, 0xaf, 0xb9, 0xbd, 0xb8, 0x85, 0xd5, 0xab, 0xa5, 0x7a, 0x8d, 0x9b, 0xeb, 0xb7, 0xf2, + 0xec, 0x38, 0xbb, 0x1d, 0x21, 0x3f, 0x84, 0x98, 0xf7, 0xb8, 0x89, 0xc7, 0xad, 0x45, 0x31, 0xbc, 0x10, 0x7c, 0x62, + 0x07, 0xd6, 0x69, 0x48, 0x07, 0x74, 0x68, 0x9c, 0xf5, 0xba, 0x5e, 0x05, 0xcd, 0xf3, 0xf1, 0xc1, 0x86, 0xb9, 0x34, + 0x48, 0x32, 0xa0, 0xee, 0x34, 0xf2, 0x2f, 0xe1, 0x04, 0x2e, 0x86, 0x31, 0x0f, 0x45, 0x20, 0x09, 0xb6, 0x6d, 0x87, + 0xe7, 0x43, 0xe0, 0x49, 0x7c, 0x61, 0xc1, 0xd3, 0x56, 0x4d, 0xc1, 0x6d, 0x5e, 0xbd, 0x3b, 0x99, 0xfb, 0xb2, 0xbb, + 0x3d, 0x94, 0xf2, 0xba, 0x7d, 0xaf, 0xa3, 0xde, 0xaf, 0x2a, 0xee, 0x2a, 0x2d, 0x90, 0x5a, 0x68, 0x73, 0xbd, 0x92, + 0xeb, 0xaa, 0xf6, 0x27, 0xe1, 0xb9, 0x12, 0x4c, 0x77, 0xb5, 0x95, 0x2c, 0x84, 0x56, 0xaf, 0xc8, 0xf7, 0x85, 0xc9, + 0x14, 0x4e, 0xa7, 0xb2, 0x21, 0x6a, 0x9f, 0xee, 0x2b, 0x4d, 0x17, 0xb8, 0x87, 0x4c, 0xe9, 0x50, 0x19, 0x14, 0xba, + 0x91, 0x3e, 0x0a, 0xea, 0x97, 0xce, 0xad, 0x80, 0x6f, 0xa0, 0x75, 0xfe, 0x1f, 0xa2, 0x48, 0xf6, 0xdd, 0x94, 0x88, + 0x00, 0x00}; } // namespace web_server } // namespace esphome diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h index bde1ce1fb5..0c16ea9f37 100644 --- a/esphome/components/web_server/server_index_v3.h +++ b/esphome/components/web_server/server_index_v3.h @@ -3632,373 +3632,374 @@ const uint8_t INDEX_GZ[] PROGMEM = { 0xe7, 0xec, 0xd8, 0x98, 0x31, 0x94, 0x4f, 0x43, 0x40, 0x9e, 0xd0, 0xf7, 0x01, 0xcd, 0x25, 0x67, 0x23, 0xad, 0x2b, 0xfb, 0x10, 0x17, 0x97, 0xdc, 0x84, 0x6a, 0x31, 0x6f, 0x2b, 0x3d, 0x2a, 0xc4, 0x1b, 0x16, 0x80, 0x65, 0xe9, 0x69, 0x93, 0x82, 0x6c, 0x94, 0x54, 0x45, 0xfe, 0x13, 0xbf, 0x03, 0xae, 0xad, 0xac, 0xe4, 0x0a, 0x78, 0xf5, 0xff, 0xd3, - 0xdc, 0x93, 0x2e, 0xb7, 0x6d, 0x24, 0xfd, 0x3f, 0x4f, 0x01, 0xc3, 0x5e, 0x87, 0xb0, 0x01, 0x08, 0x00, 0x45, 0x89, - 0x26, 0x45, 0x69, 0x13, 0x1f, 0xb5, 0x4e, 0x29, 0x71, 0xca, 0x56, 0x5c, 0xbb, 0x51, 0x54, 0x22, 0x48, 0x0e, 0x49, - 0xac, 0x41, 0x80, 0x05, 0x80, 0x3a, 0x42, 0x63, 0x9f, 0x65, 0x9f, 0x65, 0x9f, 0xec, 0xab, 0xee, 0x9e, 0x19, 0x0c, - 0x0e, 0x1e, 0x8a, 0x9d, 0xdd, 0xaf, 0x12, 0xdb, 0xc4, 0xdc, 0xd3, 0x33, 0xd3, 0xd3, 0xd3, 0xa7, 0x3f, 0xe3, 0xbc, - 0x17, 0xb3, 0xc5, 0xf6, 0xeb, 0xee, 0xf3, 0x67, 0x66, 0xe3, 0x96, 0x04, 0x82, 0xcf, 0xce, 0xe2, 0xd9, 0x2c, 0x64, - 0x2d, 0x5d, 0x04, 0x0f, 0xd1, 0x4d, 0xd9, 0xcd, 0xd9, 0x23, 0x47, 0x78, 0xec, 0x34, 0xf2, 0x4d, 0x47, 0x4b, 0xcc, - 0x98, 0x49, 0x97, 0x76, 0x44, 0xb9, 0x22, 0x6f, 0xf6, 0x06, 0xc5, 0x1b, 0x7c, 0x5d, 0x8a, 0xa3, 0x6b, 0x4d, 0xe2, - 0xd5, 0x28, 0x64, 0x16, 0x6e, 0x77, 0xe8, 0x72, 0x3d, 0x5a, 0x8d, 0x46, 0x10, 0xa5, 0xe5, 0x91, 0x63, 0x82, 0xdf, - 0x99, 0x38, 0xc5, 0xf7, 0x60, 0x6e, 0xf4, 0x61, 0x52, 0x76, 0x56, 0x1d, 0x3e, 0xe8, 0x8a, 0x00, 0xab, 0x87, 0x3a, - 0xc8, 0xe0, 0xed, 0xd7, 0x70, 0x6a, 0x07, 0xfa, 0x07, 0xd8, 0x7d, 0xa9, 0xde, 0x6f, 0x3a, 0xfa, 0x83, 0x4b, 0xfd, - 0x03, 0xc2, 0x18, 0xa3, 0x17, 0xbf, 0xa4, 0xdd, 0xab, 0x9b, 0x3a, 0x09, 0xbd, 0x57, 0x18, 0xc7, 0x00, 0x98, 0xbe, - 0xaf, 0x02, 0x7f, 0x16, 0xc5, 0x69, 0x16, 0x8c, 0xf5, 0xab, 0xfe, 0xdb, 0xa0, 0x75, 0xb9, 0xc8, 0x5a, 0xc6, 0x95, - 0x39, 0xce, 0xd4, 0x10, 0x28, 0x02, 0x61, 0x62, 0x04, 0x94, 0x4d, 0x85, 0xd4, 0x13, 0xb4, 0xb5, 0xa0, 0x40, 0xcd, - 0x58, 0x68, 0x9c, 0x0d, 0xa0, 0x5c, 0x25, 0x9e, 0x0a, 0x06, 0x86, 0xd2, 0xb1, 0xa6, 0xd1, 0xa7, 0x97, 0xca, 0xcb, - 0xd5, 0x1a, 0xaf, 0xf2, 0xac, 0xb8, 0x2d, 0xd1, 0x07, 0xb0, 0x30, 0x9c, 0xa1, 0xef, 0x47, 0xaa, 0xd2, 0x67, 0xe9, - 0xde, 0x1d, 0x7e, 0x57, 0xa6, 0x0b, 0xe0, 0xfe, 0x06, 0x8d, 0x8b, 0x28, 0xce, 0x34, 0x70, 0x6c, 0x03, 0x3d, 0x0e, - 0xab, 0x4a, 0x62, 0xbc, 0xd5, 0x96, 0x91, 0x73, 0x64, 0xf0, 0x3d, 0x5e, 0x7e, 0x2d, 0xee, 0xde, 0xac, 0xe4, 0xc1, - 0x82, 0x1e, 0x0b, 0x11, 0x2c, 0x60, 0x16, 0x9f, 0xc7, 0xb7, 0x55, 0x39, 0xc8, 0xcb, 0xe1, 0xee, 0xbb, 0xb7, 0x25, - 0xc8, 0x64, 0x11, 0xd5, 0xaf, 0xc5, 0x03, 0x93, 0x0a, 0x42, 0xa7, 0x72, 0xa6, 0x50, 0xf1, 0x43, 0xd0, 0x30, 0x19, - 0xe8, 0x89, 0xe1, 0x5d, 0x00, 0x28, 0x89, 0x5f, 0xd3, 0xc3, 0xfc, 0x5a, 0x84, 0x4e, 0x16, 0x81, 0x8b, 0x95, 0xcb, - 0x19, 0xb0, 0x6b, 0xb4, 0x5c, 0x65, 0xe8, 0x6a, 0x17, 0x06, 0xc0, 0x72, 0x5d, 0x43, 0xd7, 0x9d, 0x80, 0xa5, 0x0b, - 0x32, 0x31, 0xd7, 0xb5, 0x60, 0x52, 0x4f, 0xe3, 0x44, 0x2f, 0x20, 0x2f, 0xc4, 0xef, 0xc8, 0xa8, 0x82, 0xcf, 0x84, - 0x4f, 0x63, 0x6c, 0x16, 0x7e, 0xea, 0x5b, 0x63, 0x14, 0xe8, 0x34, 0x60, 0x86, 0x31, 0xb5, 0xd3, 0x6f, 0x85, 0x8d, - 0x93, 0x05, 0xf7, 0x9b, 0xa5, 0x69, 0x0e, 0x9f, 0xac, 0xa3, 0xfc, 0xec, 0xc9, 0x3a, 0xcd, 0x07, 0x4f, 0xd6, 0xbe, - 0xd4, 0x15, 0xd0, 0x2f, 0x74, 0x52, 0x14, 0x18, 0x22, 0x18, 0x86, 0xf9, 0x75, 0x61, 0xb9, 0x53, 0xcc, 0x17, 0x76, - 0x19, 0xa5, 0x6b, 0x28, 0xba, 0x1f, 0x70, 0x01, 0xfd, 0x32, 0x09, 0x16, 0x7e, 0x72, 0x4f, 0xf2, 0x7c, 0x53, 0x15, - 0xfa, 0x1b, 0xba, 0x46, 0x88, 0x9e, 0x00, 0x40, 0x38, 0x5f, 0xd7, 0xfe, 0x2a, 0xd3, 0x18, 0x9f, 0xad, 0x14, 0x6a, - 0x42, 0x5f, 0xd7, 0xfa, 0x73, 0x66, 0x4f, 0x58, 0xe6, 0x07, 0x21, 0x55, 0xe9, 0x8b, 0x68, 0xf5, 0xb5, 0xe9, 0xa5, - 0xe5, 0xe9, 0x45, 0xe5, 0xfd, 0x83, 0x93, 0xa1, 0x2b, 0x80, 0xc6, 0x8d, 0x33, 0xc3, 0x28, 0x56, 0xcd, 0x2b, 0x4a, - 0x79, 0xff, 0xd5, 0xe5, 0x60, 0xb0, 0x1c, 0x11, 0x2c, 0x07, 0x8b, 0xc6, 0xf1, 0x84, 0xfd, 0xf2, 0xfe, 0xad, 0x0c, - 0x9b, 0x05, 0x1c, 0xa0, 0x21, 0xdf, 0x98, 0x29, 0xd2, 0x0f, 0x09, 0xd2, 0x0e, 0x14, 0xe0, 0x4a, 0x93, 0x5b, 0x28, - 0xc9, 0x75, 0xed, 0x8c, 0xc6, 0xce, 0x26, 0x34, 0xea, 0x41, 0x8c, 0xb5, 0x92, 0xfc, 0xe4, 0x80, 0x4a, 0xd3, 0x6d, - 0x47, 0x85, 0x00, 0x0c, 0x09, 0xcc, 0xb0, 0x80, 0x02, 0x44, 0xf8, 0x1c, 0xb8, 0xc5, 0x83, 0xc2, 0x5e, 0x20, 0x9f, - 0xdd, 0x3d, 0x2b, 0x93, 0x2a, 0x58, 0x4b, 0x3f, 0x3d, 0xc1, 0x98, 0x5d, 0x70, 0x5f, 0x83, 0x97, 0x8f, 0x93, 0x03, - 0xfa, 0xd4, 0x2a, 0x27, 0xa2, 0x68, 0x44, 0x3c, 0xed, 0x7a, 0xbc, 0x81, 0x07, 0x1d, 0x15, 0x08, 0x11, 0x0f, 0xa9, - 0x7e, 0xae, 0x6b, 0x0b, 0x4e, 0x1a, 0x71, 0x77, 0x42, 0xe0, 0x6b, 0xc0, 0x81, 0xb3, 0xab, 0x6b, 0x0b, 0xff, 0x0e, - 0x67, 0x2e, 0x72, 0xfc, 0xbb, 0x96, 0xcb, 0xb3, 0x8a, 0xb3, 0x96, 0x96, 0xcf, 0xda, 0x98, 0x2f, 0x2e, 0x18, 0x12, - 0xc8, 0x97, 0xf5, 0x1c, 0x05, 0xb4, 0x0d, 0x8b, 0x3b, 0x17, 0x8b, 0x3b, 0xd9, 0xb0, 0xb8, 0x93, 0x2d, 0x8b, 0x1b, - 0xf2, 0x85, 0xd4, 0x24, 0xe8, 0x12, 0x34, 0x0e, 0x93, 0xc0, 0xe3, 0x84, 0x46, 0x8f, 0x9f, 0x33, 0x84, 0x93, 0x95, - 0x86, 0xa0, 0x1c, 0xb5, 0x01, 0x56, 0x4d, 0x70, 0x51, 0x00, 0x51, 0x9f, 0xb8, 0x3c, 0x75, 0x62, 0xde, 0x10, 0x83, - 0xb3, 0x15, 0x56, 0xe7, 0x0b, 0xbb, 0x94, 0xe2, 0x8b, 0xb7, 0xe6, 0x1b, 0x66, 0x3a, 0xdf, 0x32, 0xd3, 0x71, 0xe9, - 0xe8, 0xf2, 0x69, 0xd3, 0x21, 0x54, 0x27, 0x05, 0x7b, 0x10, 0x14, 0x46, 0x71, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x1c, - 0xab, 0xec, 0xa8, 0xa5, 0x9f, 0xa6, 0xb7, 0x71, 0x02, 0x12, 0x17, 0x68, 0xe6, 0x61, 0x5b, 0x6a, 0x11, 0x44, 0xdc, - 0x99, 0xcb, 0xc6, 0xcd, 0x54, 0xe4, 0xab, 0x5b, 0xca, 0xeb, 0x74, 0xa8, 0xc4, 0xd2, 0xcf, 0x32, 0x96, 0x20, 0xd0, - 0x7d, 0xf0, 0xfa, 0xfd, 0xff, 0x64, 0x9b, 0x35, 0xe0, 0x90, 0x50, 0xc1, 0xea, 0x88, 0xa1, 0x97, 0x40, 0x5b, 0x25, - 0xe2, 0x22, 0x56, 0x1c, 0xc3, 0x25, 0x12, 0xf0, 0x3f, 0xe1, 0x71, 0x6d, 0x25, 0x8a, 0xe9, 0x92, 0x7b, 0x64, 0xd8, - 0x4b, 0x7f, 0xf2, 0x01, 0x04, 0x7b, 0x2d, 0xcf, 0x04, 0x25, 0x5d, 0xd5, 0x0d, 0x5c, 0x42, 0xc4, 0xde, 0xb8, 0x40, - 0x92, 0x88, 0x25, 0xb9, 0x0a, 0x14, 0x58, 0x4f, 0xfa, 0xd6, 0xf4, 0x6a, 0xed, 0xe5, 0x07, 0xb3, 0xc0, 0xa8, 0x61, - 0x4d, 0x40, 0x6d, 0xe1, 0xe0, 0x54, 0xbe, 0xb9, 0x42, 0xd3, 0x3d, 0x32, 0x80, 0xf3, 0x7b, 0x09, 0xf1, 0x4c, 0x1d, - 0xf1, 0xa0, 0x1d, 0x26, 0x70, 0x6b, 0x5d, 0x3a, 0x57, 0xf9, 0xd3, 0x19, 0xfe, 0x72, 0xaf, 0xf2, 0xa7, 0x23, 0xfc, - 0xe5, 0x5d, 0x61, 0xe4, 0xba, 0x86, 0x87, 0xbc, 0x32, 0x67, 0xfd, 0xb4, 0xb4, 0x9f, 0x48, 0xff, 0xec, 0x01, 0xdb, - 0x86, 0x2f, 0xf0, 0xe3, 0x27, 0xeb, 0x14, 0x2c, 0x2e, 0xd5, 0x39, 0x44, 0x76, 0x62, 0xe4, 0x8d, 0xe9, 0xb3, 0x0d, - 0xe9, 0x23, 0xe3, 0xbf, 0x7c, 0xf1, 0xe3, 0x2e, 0x89, 0x8b, 0x3b, 0xa5, 0xcc, 0x86, 0xb8, 0x1e, 0x05, 0x91, 0x9f, - 0xdc, 0x5f, 0xd3, 0xf3, 0xa2, 0x25, 0x68, 0x77, 0xc9, 0x5e, 0x21, 0xf2, 0xb2, 0x2c, 0xee, 0xca, 0x14, 0x06, 0xef, - 0x3d, 0xbf, 0xe8, 0x07, 0x7f, 0x4f, 0x14, 0xb2, 0xad, 0xf4, 0x00, 0xe5, 0x0b, 0x52, 0xea, 0xe8, 0xfa, 0xc9, 0xba, - 0xc5, 0xea, 0xcd, 0x54, 0x66, 0x5b, 0xa1, 0x0b, 0x61, 0x79, 0xf0, 0x31, 0xbb, 0x98, 0x04, 0x3d, 0x94, 0x67, 0x8d, - 0xe2, 0x3b, 0xeb, 0xc9, 0x3a, 0x3b, 0xd3, 0x17, 0x7e, 0xf2, 0x89, 0x4d, 0xac, 0x71, 0x90, 0x8c, 0x43, 0xa6, 0xf7, - 0xf4, 0x51, 0xe8, 0x47, 0x9f, 0xf8, 0xa7, 0x15, 0xaf, 0x32, 0x94, 0x50, 0xef, 0x7c, 0xfb, 0x0a, 0x98, 0x10, 0xcb, - 0x0e, 0x89, 0xd5, 0x06, 0x28, 0x68, 0x2f, 0x25, 0xc3, 0xab, 0x20, 0x14, 0x8b, 0x52, 0x26, 0x28, 0x58, 0x82, 0xd0, - 0x1c, 0x2c, 0x56, 0x4d, 0x1d, 0xd7, 0x4b, 0x37, 0xd5, 0xa9, 0x12, 0xb3, 0x52, 0x86, 0x5c, 0xbc, 0xc6, 0x16, 0xfe, - 0x78, 0x77, 0x14, 0x0c, 0x7b, 0xff, 0xee, 0x64, 0x2b, 0x5f, 0x36, 0x43, 0x48, 0xb5, 0xc8, 0x52, 0xe2, 0x01, 0x9d, - 0x73, 0x02, 0x73, 0x73, 0xd7, 0x6a, 0x65, 0x3f, 0x4d, 0x57, 0x0b, 0x36, 0x21, 0xc9, 0xe0, 0x59, 0x31, 0xa8, 0xf2, - 0xcb, 0x42, 0x1d, 0xd8, 0x6f, 0x2b, 0xef, 0xf8, 0xf0, 0x25, 0x68, 0x2c, 0x00, 0x41, 0x19, 0x4f, 0xa7, 0x7a, 0xf1, - 0xc6, 0xdf, 0x51, 0xcd, 0x3d, 0xfc, 0x6d, 0xf5, 0xe6, 0xb5, 0xf3, 0x46, 0x56, 0x8e, 0x80, 0x30, 0x16, 0xe2, 0x57, - 0x4e, 0x17, 0x2b, 0xe3, 0x15, 0x33, 0x9a, 0xfa, 0xd1, 0xe6, 0xe9, 0x5c, 0x96, 0xb6, 0xf8, 0x92, 0xb1, 0x09, 0x10, - 0xdc, 0x66, 0x2d, 0xf5, 0x3a, 0x64, 0x37, 0x4c, 0x8a, 0x76, 0xeb, 0x9d, 0x35, 0xd4, 0x40, 0xdf, 0x73, 0x5c, 0x64, - 0xcc, 0xa9, 0x3a, 0x65, 0x4a, 0x43, 0x9c, 0x03, 0x9f, 0xb9, 0x7a, 0xc4, 0x2a, 0x47, 0x6a, 0x68, 0xea, 0xca, 0x00, - 0x36, 0x8e, 0xec, 0x6c, 0x43, 0x7a, 0x0f, 0x03, 0x4f, 0x37, 0x8f, 0xcd, 0x74, 0x8d, 0x1e, 0xf8, 0xea, 0xe6, 0x70, - 0x0a, 0xe1, 0xe4, 0xb5, 0x0a, 0x76, 0xc8, 0x26, 0x88, 0x35, 0x31, 0xc9, 0x74, 0xe2, 0xbe, 0x08, 0x6d, 0x47, 0x54, - 0xfb, 0x15, 0x7c, 0xa8, 0xc6, 0xb5, 0xd1, 0xca, 0x33, 0x1f, 0x61, 0x40, 0xd7, 0x88, 0xa5, 0xe9, 0x46, 0x80, 0xc9, - 0x45, 0x37, 0xf5, 0xa2, 0x74, 0x19, 0x1e, 0x45, 0xba, 0xe9, 0x98, 0x40, 0x12, 0xe0, 0x04, 0xab, 0x7d, 0xe1, 0xf5, - 0x72, 0xbd, 0xe0, 0xfa, 0x2a, 0xc9, 0x6c, 0xa4, 0x73, 0x5d, 0x82, 0x4d, 0xf9, 0xb7, 0x3a, 0x1f, 0x54, 0xe9, 0x9a, - 0x6e, 0x1c, 0x5a, 0xab, 0x84, 0x7a, 0x6b, 0xec, 0x22, 0x6c, 0x40, 0x8c, 0xa9, 0x82, 0x5f, 0xd9, 0x74, 0xca, 0xc6, - 0x59, 0x6a, 0x08, 0xe6, 0x91, 0xf4, 0x1e, 0x0b, 0x56, 0x43, 0x8f, 0x06, 0xfa, 0x4f, 0x60, 0x43, 0x2f, 0x9c, 0x2c, - 0xf1, 0x01, 0x89, 0x37, 0x53, 0x33, 0x98, 0xa8, 0xc5, 0x32, 0x88, 0x78, 0x2f, 0x10, 0x1c, 0xbc, 0x21, 0x1d, 0x87, - 0xc6, 0xef, 0x9f, 0x62, 0x5f, 0xc4, 0x52, 0xab, 0x65, 0x3b, 0x2a, 0xda, 0x76, 0x7c, 0xd7, 0xee, 0x9b, 0x8e, 0xeb, - 0xe4, 0xba, 0x09, 0xb6, 0x5b, 0x9f, 0xf6, 0x3d, 0xf4, 0x58, 0xab, 0x0d, 0xb5, 0x56, 0xd1, 0x43, 0xea, 0x79, 0xee, - 0x0b, 0x57, 0x37, 0x49, 0x65, 0x4e, 0xc1, 0x6d, 0xe3, 0xf8, 0x86, 0x25, 0x5f, 0x3c, 0x95, 0x72, 0xe3, 0xfb, 0x8d, - 0xe7, 0xc8, 0x75, 0x00, 0x09, 0x67, 0xf1, 0xf2, 0x01, 0x53, 0x68, 0xeb, 0xa6, 0x3e, 0x0e, 0xe3, 0x94, 0xa9, 0x73, - 0x20, 0x26, 0xc8, 0x17, 0x4e, 0xe2, 0xe7, 0xf7, 0xaf, 0x3f, 0x7c, 0xd0, 0x4d, 0x8c, 0x04, 0x9a, 0xaa, 0xad, 0xf3, - 0x0d, 0xb5, 0x03, 0xfb, 0x37, 0xee, 0x3b, 0xba, 0x61, 0xe8, 0x51, 0x5b, 0xde, 0x73, 0x94, 0x56, 0xdb, 0x72, 0xfc, - 0xe6, 0xe1, 0x3d, 0xd3, 0x4b, 0x74, 0xaf, 0x79, 0x35, 0xe0, 0x86, 0xed, 0xd7, 0x5b, 0x29, 0x65, 0x11, 0x44, 0xd7, - 0x0d, 0xa9, 0xfe, 0x5d, 0x43, 0x2a, 0x3c, 0xe5, 0x6a, 0xb8, 0x6a, 0x15, 0x2f, 0x14, 0xd2, 0x00, 0x02, 0x39, 0xef, - 0x02, 0x97, 0xf2, 0x9e, 0xfa, 0x82, 0x41, 0x73, 0x4f, 0xee, 0xd5, 0x51, 0x37, 0x24, 0xf3, 0x47, 0x90, 0x84, 0xed, - 0x38, 0x04, 0x85, 0x3f, 0xa6, 0x4a, 0xe5, 0xca, 0x64, 0xa3, 0x54, 0xd7, 0x55, 0x1a, 0x21, 0xf2, 0xf6, 0x3a, 0x63, - 0x8b, 0x25, 0x4b, 0xfc, 0x6c, 0x95, 0xb0, 0xeb, 0x30, 0xbe, 0x7d, 0x54, 0xa8, 0xd3, 0xef, 0x28, 0x3c, 0x0f, 0x66, - 0x73, 0x59, 0xfa, 0xac, 0xc5, 0x06, 0x72, 0x01, 0xb7, 0x76, 0x90, 0xff, 0xe7, 0xdf, 0xb6, 0xfd, 0x9f, 0x7f, 0xef, - 0x2c, 0x0a, 0xcd, 0xe7, 0x43, 0x33, 0x1b, 0xec, 0xb1, 0x2f, 0x9a, 0x7b, 0x2a, 0xc3, 0xbc, 0xb9, 0x4c, 0x6d, 0x11, - 0x20, 0xbf, 0xb6, 0x04, 0xb5, 0xc4, 0xf2, 0xbe, 0x79, 0xd0, 0xc0, 0x60, 0x5e, 0x3b, 0x47, 0x06, 0x85, 0xbe, 0x68, - 0x68, 0x43, 0xa3, 0xb7, 0xd7, 0x8a, 0xfc, 0x71, 0x08, 0xef, 0x9a, 0xc3, 0x17, 0x0e, 0x9f, 0xf3, 0x25, 0x5f, 0x0e, - 0x87, 0x32, 0xb6, 0x9c, 0x5a, 0x15, 0x54, 0xfc, 0xcf, 0x6a, 0x29, 0xfc, 0xf2, 0xec, 0x39, 0x06, 0xd9, 0xde, 0x0f, - 0x5e, 0x0e, 0x51, 0x19, 0xed, 0x64, 0x94, 0x14, 0xc4, 0xca, 0x46, 0xd4, 0x46, 0xca, 0xe4, 0xb5, 0x46, 0x6b, 0x78, - 0x0d, 0x52, 0x31, 0xe0, 0x58, 0x3e, 0x34, 0xcc, 0x97, 0x43, 0xce, 0x58, 0xe2, 0xfa, 0xaf, 0xbd, 0xea, 0xd6, 0xe6, - 0x6c, 0xd9, 0x12, 0xd0, 0x4d, 0x8d, 0xe4, 0x3f, 0x58, 0x98, 0x15, 0x7c, 0x3c, 0x64, 0xf0, 0x03, 0x47, 0x61, 0x98, - 0x63, 0xbc, 0x93, 0x77, 0x9b, 0x74, 0xc4, 0x7e, 0xde, 0xad, 0x23, 0x76, 0xb1, 0x97, 0x8e, 0xd8, 0xcf, 0x5f, 0x5d, - 0x47, 0xec, 0x9d, 0xaa, 0x23, 0x06, 0x8b, 0xf8, 0x9a, 0xed, 0xa5, 0xb8, 0x25, 0xb4, 0x36, 0xe2, 0xdb, 0x74, 0xe0, - 0x72, 0x92, 0x36, 0x1d, 0xcf, 0x19, 0xf0, 0x08, 0xf8, 0xaa, 0x84, 0xf1, 0x0c, 0x94, 0xb8, 0xfe, 0x7c, 0x75, 0xab, - 0x30, 0x9e, 0xa9, 0xca, 0x56, 0x11, 0xf7, 0xf8, 0x5a, 0x78, 0x71, 0x22, 0x05, 0x27, 0xc7, 0x14, 0x3e, 0x9f, 0xac, - 0x43, 0x43, 0x89, 0x6a, 0x2d, 0xb5, 0xd7, 0x3c, 0xa1, 0x02, 0xd5, 0x43, 0xed, 0x29, 0x59, 0xd1, 0x7b, 0x2e, 0x7c, - 0x5b, 0xa8, 0x2d, 0x48, 0x2d, 0x61, 0xf2, 0x13, 0xb1, 0xd6, 0x7f, 0xbb, 0x73, 0xbf, 0xbf, 0x74, 0xfb, 0x6d, 0x17, - 0x8c, 0xb3, 0xe1, 0x85, 0x89, 0x09, 0x4e, 0xbf, 0xdd, 0x86, 0x84, 0x5b, 0x25, 0xc1, 0x83, 0x84, 0x40, 0x49, 0xe8, - 0x40, 0xc2, 0x58, 0x49, 0x38, 0x82, 0x84, 0x89, 0x92, 0x70, 0x0c, 0x09, 0x37, 0x7a, 0x7e, 0x19, 0xc9, 0xe1, 0x1e, - 0x1b, 0x57, 0x26, 0x3d, 0x2a, 0x44, 0xda, 0xb1, 0xe9, 0x82, 0xd6, 0x94, 0x3f, 0xeb, 0xc5, 0x26, 0x71, 0x17, 0x7b, - 0x89, 0x79, 0x3b, 0x67, 0xe4, 0x28, 0xfa, 0x15, 0xde, 0x39, 0x76, 0x16, 0x83, 0xde, 0xb4, 0x70, 0xc0, 0x20, 0xe0, - 0xa0, 0xe9, 0x06, 0x30, 0x8c, 0xfa, 0x72, 0xe5, 0x84, 0x13, 0x0b, 0x65, 0x2d, 0x8b, 0x3c, 0xea, 0xce, 0x92, 0x5b, - 0xa0, 0xd0, 0x38, 0x69, 0xa9, 0x5c, 0xc9, 0xaf, 0xa1, 0x77, 0xf0, 0x8a, 0x8d, 0x56, 0x33, 0xed, 0x3c, 0x9e, 0xed, - 0x54, 0x21, 0x50, 0xb3, 0x60, 0x94, 0x3a, 0x89, 0x5f, 0x2c, 0xb1, 0x2d, 0x79, 0x5f, 0xf4, 0x99, 0x97, 0xcb, 0x67, - 0x30, 0x36, 0x2d, 0x23, 0x05, 0x16, 0xe8, 0x07, 0x60, 0xa4, 0xc8, 0xf0, 0xcf, 0x01, 0xce, 0xca, 0xf7, 0x85, 0xaf, - 0x8c, 0xe7, 0xf4, 0x47, 0x96, 0xa6, 0xfe, 0x4c, 0x94, 0xaf, 0x8f, 0x13, 0x94, 0x76, 0xe4, 0xfb, 0x0b, 0x01, 0x08, - 0x9c, 0xbc, 0xa0, 0xa6, 0x9b, 0x91, 0xc4, 0xb7, 0x1a, 0x68, 0xff, 0xc0, 0x86, 0x2a, 0xf4, 0x14, 0x02, 0x1b, 0x96, - 0xb0, 0xac, 0x51, 0x00, 0x87, 0xff, 0x86, 0x85, 0xd5, 0xc4, 0xcc, 0x9f, 0x55, 0x93, 0x68, 0x1f, 0xe4, 0xea, 0xd8, - 0xa4, 0x40, 0xbf, 0x94, 0xf8, 0x25, 0x12, 0xea, 0x30, 0x9e, 0xfd, 0xa9, 0xe2, 0xe9, 0x2d, 0x6a, 0x05, 0x1f, 0x22, - 0x33, 0xc8, 0x86, 0x36, 0xc2, 0x58, 0xb3, 0x01, 0x84, 0xbd, 0x28, 0x9b, 0x5b, 0x68, 0x5a, 0xd6, 0xf2, 0x22, 0xc3, - 0xb4, 0x71, 0x6d, 0xd7, 0x55, 0x83, 0xda, 0x5e, 0x32, 0x1b, 0xf9, 0x2d, 0xd7, 0x3b, 0x36, 0xc5, 0x1f, 0xdb, 0xe9, - 0x18, 0x39, 0xb6, 0xa0, 0x4d, 0x82, 0x9b, 0xf5, 0x34, 0x8e, 0x32, 0x6b, 0xea, 0x2f, 0x82, 0xf0, 0xbe, 0xb7, 0x88, - 0xa3, 0x38, 0x5d, 0xfa, 0x63, 0xd6, 0x2f, 0x1e, 0xd4, 0x7d, 0x74, 0xd5, 0xc0, 0xad, 0x05, 0x5d, 0xdb, 0x4b, 0xd8, - 0x82, 0x6a, 0x4b, 0x4f, 0x0c, 0xd3, 0x90, 0xdd, 0xe5, 0xbc, 0xfb, 0x52, 0x61, 0x2a, 0x8a, 0x5b, 0x8e, 0x6a, 0x00, - 0x45, 0xca, 0xdd, 0x3c, 0x80, 0x73, 0xa3, 0xfe, 0xd2, 0x9f, 0xa0, 0x67, 0x42, 0xdb, 0xeb, 0x24, 0x6c, 0xa1, 0xd9, - 0x9d, 0x8d, 0x8d, 0x27, 0xf1, 0xed, 0x29, 0x8c, 0x16, 0x2b, 0x5b, 0x29, 0x0b, 0xa7, 0x98, 0x63, 0xa1, 0x65, 0x89, - 0x68, 0xc7, 0xc2, 0x87, 0x38, 0xb4, 0xc6, 0x16, 0x7d, 0xc8, 0xee, 0x79, 0x9a, 0xd3, 0x5f, 0x04, 0x91, 0x45, 0xd3, - 0x39, 0x76, 0x96, 0x4a, 0x5b, 0x2a, 0xfc, 0x8c, 0x35, 0x16, 0x77, 0x35, 0xa7, 0x0f, 0x8f, 0xb5, 0x69, 0x18, 0xdf, - 0xf6, 0xe6, 0xc1, 0x64, 0xc2, 0xa2, 0x3e, 0x8e, 0x59, 0x26, 0xb2, 0x30, 0x0c, 0x96, 0x69, 0x90, 0xf6, 0x17, 0xfe, - 0x1d, 0x6f, 0xf5, 0x70, 0x53, 0xab, 0x6d, 0xde, 0x6a, 0x7b, 0xef, 0x56, 0x95, 0x66, 0xc0, 0x8a, 0x85, 0xda, 0xe1, - 0x43, 0xeb, 0x68, 0x4e, 0x65, 0x9e, 0x7b, 0xb7, 0xba, 0x4c, 0xd8, 0x7a, 0xe1, 0x27, 0xb3, 0x20, 0xea, 0x39, 0xb9, - 0x7d, 0xb3, 0xa6, 0x8d, 0xf1, 0xb8, 0xdb, 0xed, 0xe6, 0xf6, 0x44, 0x7c, 0x39, 0x93, 0x49, 0x6e, 0x8f, 0xc5, 0xd7, - 0x74, 0xea, 0x38, 0xd3, 0x69, 0x6e, 0x07, 0x22, 0xa1, 0xed, 0x8d, 0x27, 0x6d, 0x2f, 0xb7, 0x6f, 0x95, 0x12, 0xb9, - 0xcd, 0xf8, 0x57, 0xc2, 0x26, 0x7d, 0xdc, 0x48, 0xa4, 0x56, 0xda, 0x3b, 0x76, 0x9c, 0x1c, 0x31, 0xc0, 0x65, 0x09, - 0x37, 0x21, 0xaf, 0xe7, 0x6a, 0xbd, 0x77, 0x49, 0xad, 0xe8, 0x6e, 0x3c, 0x6e, 0x2c, 0x37, 0xf1, 0x93, 0x4f, 0x57, - 0x9a, 0x32, 0x0b, 0xdf, 0xa7, 0x62, 0x6b, 0x01, 0x06, 0xeb, 0xae, 0x07, 0x2e, 0xbb, 0xfa, 0xa3, 0x38, 0x81, 0x33, - 0x9b, 0xf8, 0x93, 0x60, 0x95, 0xf6, 0x5c, 0x6f, 0x79, 0x27, 0x92, 0xf8, 0x5e, 0x2f, 0x12, 0xf0, 0xec, 0xf5, 0xd2, - 0x38, 0x0c, 0x26, 0x22, 0x69, 0xd3, 0x59, 0x72, 0x3d, 0xa3, 0x8f, 0x06, 0xeb, 0x01, 0xba, 0x5d, 0xf0, 0xc3, 0x50, - 0xb3, 0xdb, 0xa9, 0xc6, 0xfc, 0x14, 0xf9, 0xcb, 0x9a, 0x93, 0x12, 0x5c, 0xd0, 0x38, 0xdd, 0x3d, 0x5c, 0xde, 0xc9, - 0x3d, 0xef, 0x1e, 0x2d, 0xef, 0xf2, 0xbf, 0x2e, 0xd8, 0x24, 0xf0, 0xb5, 0x56, 0xb1, 0x9b, 0x5c, 0x07, 0x78, 0xd0, - 0xc6, 0x7a, 0xc3, 0x36, 0x15, 0xc7, 0x02, 0x5c, 0x1b, 0x3e, 0x0a, 0x16, 0xcb, 0x38, 0xc9, 0xfc, 0x28, 0xcb, 0xf3, - 0xe1, 0x55, 0x9e, 0xf7, 0x2f, 0x82, 0xd6, 0xe5, 0x3f, 0x5a, 0x74, 0x4f, 0x93, 0xcc, 0x26, 0x37, 0xae, 0xcc, 0xd7, - 0x4c, 0xd5, 0x19, 0x81, 0x6b, 0x0c, 0xf5, 0x45, 0xd4, 0xc2, 0x74, 0x4b, 0xd6, 0x0b, 0x13, 0x90, 0x65, 0x71, 0xd2, - 0x41, 0x29, 0x17, 0xc1, 0x1b, 0x08, 0x0a, 0xbc, 0x66, 0x83, 0x0b, 0x45, 0xff, 0x04, 0x88, 0x15, 0x2c, 0x4c, 0x76, - 0x05, 0x4f, 0x36, 0xd1, 0x8c, 0xdf, 0xed, 0xa6, 0x19, 0x7f, 0xcd, 0xf6, 0xa1, 0x19, 0xbf, 0xfb, 0xea, 0x34, 0xe3, - 0x93, 0xba, 0x5d, 0xc1, 0xdb, 0x78, 0xa0, 0x4b, 0x09, 0x03, 0x5c, 0x4d, 0x09, 0x79, 0xec, 0x79, 0xfb, 0x87, 0xcd, - 0x00, 0x44, 0x6b, 0x14, 0x83, 0x8e, 0x6e, 0x6e, 0xe0, 0xc7, 0xbe, 0x8b, 0x06, 0x7f, 0x4f, 0xd4, 0xef, 0xe9, 0x74, - 0xf0, 0x2a, 0x56, 0x12, 0xe4, 0x17, 0x57, 0xbe, 0x28, 0x79, 0x57, 0xa0, 0x1c, 0xa1, 0x85, 0x89, 0xf1, 0x27, 0xc0, - 0x38, 0x9b, 0xb4, 0x8e, 0x27, 0x52, 0xfb, 0xac, 0x5f, 0x1e, 0x42, 0x4b, 0xaa, 0x7c, 0x0a, 0x13, 0x9c, 0x1a, 0x2b, - 0x71, 0xc6, 0x32, 0x6e, 0x33, 0xfb, 0xfd, 0xfd, 0xdb, 0x49, 0xeb, 0x6d, 0x6c, 0xe4, 0x41, 0xfa, 0xae, 0x6a, 0x00, - 0xc3, 0x65, 0x3f, 0x03, 0x75, 0x3a, 0x39, 0xd7, 0x20, 0x53, 0x03, 0x4c, 0x43, 0x36, 0x55, 0x3f, 0x2b, 0xcd, 0xb4, - 0xa7, 0x56, 0xe4, 0x81, 0xae, 0x6a, 0x97, 0x31, 0xb7, 0x3e, 0x58, 0x73, 0x0a, 0x10, 0x63, 0x77, 0xa1, 0xdd, 0xf0, - 0x84, 0xaa, 0x07, 0x93, 0x3c, 0x37, 0xfa, 0x02, 0x10, 0xca, 0x45, 0xcb, 0x76, 0x11, 0x71, 0xe9, 0xad, 0xd4, 0x69, - 0xe0, 0x12, 0x42, 0x12, 0xff, 0xbd, 0x05, 0x81, 0x3a, 0x17, 0x16, 0x72, 0x98, 0xe9, 0x1a, 0x81, 0x8f, 0x14, 0x2d, - 0x94, 0x09, 0x81, 0x04, 0x58, 0xc2, 0x5f, 0x64, 0x89, 0x84, 0xba, 0x0e, 0x27, 0x01, 0x07, 0x35, 0x02, 0xc0, 0xca, - 0x5f, 0xf0, 0xb5, 0x09, 0xed, 0xf0, 0x32, 0xf8, 0x91, 0xeb, 0x92, 0xf6, 0xc3, 0xed, 0x77, 0x7a, 0x72, 0x00, 0x15, - 0x4e, 0x2b, 0x8a, 0x03, 0x3b, 0x34, 0x14, 0x81, 0x94, 0x48, 0x6f, 0x4d, 0x3b, 0xbd, 0xd5, 0x9e, 0xad, 0x85, 0x87, - 0x8c, 0xcc, 0x5f, 0x5a, 0xf0, 0xc4, 0x47, 0xdc, 0xcb, 0x31, 0x9e, 0xe2, 0x8c, 0xa3, 0xbf, 0x4a, 0x01, 0x37, 0xe2, - 0x43, 0x15, 0xf1, 0x4f, 0x7f, 0xbc, 0x4a, 0xd2, 0x38, 0xe9, 0x2d, 0xe3, 0x20, 0xca, 0x58, 0x92, 0x23, 0xa8, 0x2e, - 0x11, 0x3e, 0x02, 0x3c, 0x57, 0xeb, 0x78, 0xe9, 0x8f, 0x83, 0xec, 0xbe, 0xe7, 0x70, 0x92, 0xc2, 0xe9, 0x73, 0xea, - 0xc0, 0x69, 0x2c, 0xdf, 0xe3, 0xd0, 0x7c, 0x8e, 0x84, 0x5f, 0x52, 0x27, 0x67, 0xd4, 0x6d, 0xde, 0x57, 0x72, 0xc9, - 0x47, 0x08, 0x90, 0x1f, 0x7e, 0x62, 0xcd, 0x00, 0xcb, 0xc3, 0x52, 0x3b, 0x13, 0x36, 0x33, 0x11, 0x6b, 0x03, 0x5f, - 0x5e, 0xfc, 0xb1, 0x3b, 0x86, 0xe6, 0x34, 0x27, 0x03, 0xc5, 0x63, 0xec, 0x33, 0xb2, 0x9e, 0x0f, 0x11, 0xb5, 0xcc, - 0x7d, 0x4a, 0x8e, 0xd8, 0x34, 0x4e, 0x18, 0xf9, 0x93, 0x75, 0xbb, 0xcb, 0xbb, 0xfd, 0x9b, 0xdf, 0x3e, 0xfd, 0xe6, - 0x76, 0xa2, 0x38, 0x6b, 0x89, 0xc6, 0x8c, 0x1d, 0xad, 0xd5, 0xef, 0x33, 0x20, 0x0d, 0x09, 0xf2, 0x63, 0x72, 0xdd, - 0xd5, 0xd3, 0xf5, 0x7e, 0xa3, 0xdb, 0xae, 0x65, 0xcc, 0xef, 0xbc, 0x84, 0x85, 0x7e, 0x16, 0xdc, 0x08, 0x9a, 0xb1, - 0x7d, 0xb4, 0xbc, 0x13, 0x6b, 0x8c, 0x17, 0xde, 0x03, 0x16, 0xa9, 0x32, 0x14, 0xb1, 0x48, 0xd5, 0x64, 0x5c, 0xa4, - 0x7e, 0x6d, 0x36, 0xc2, 0x93, 0x45, 0xe5, 0xa6, 0xef, 0x2c, 0xef, 0xd4, 0x2b, 0xba, 0xa8, 0x26, 0x6f, 0xea, 0xaa, - 0x0b, 0xb2, 0x45, 0x30, 0x99, 0x84, 0x2c, 0x2f, 0x2d, 0x74, 0x79, 0x2d, 0x15, 0xe0, 0x48, 0x38, 0xf8, 0xa3, 0x34, - 0x0e, 0x57, 0x19, 0x6b, 0x06, 0x17, 0x01, 0xc7, 0x73, 0x0a, 0xe0, 0xe0, 0xef, 0xf2, 0x58, 0x3b, 0x40, 0x6e, 0xc3, - 0x36, 0x71, 0xfa, 0xe0, 0x71, 0xd8, 0x6a, 0x97, 0x87, 0x0e, 0x59, 0x72, 0xd0, 0x66, 0xc3, 0x44, 0x4c, 0xb8, 0x96, - 0x08, 0x7b, 0x6b, 0xb6, 0xcb, 0xd3, 0xa4, 0xd7, 0x55, 0x99, 0x94, 0x97, 0x27, 0xf3, 0xe7, 0x9c, 0xb1, 0x17, 0xcd, - 0x67, 0xec, 0x85, 0x38, 0x63, 0xdb, 0x77, 0xe6, 0xe3, 0xa9, 0x0b, 0xff, 0xf5, 0x8b, 0x09, 0xf5, 0x1c, 0xad, 0xbd, - 0xbc, 0xd3, 0xdc, 0xe5, 0x9d, 0x66, 0x79, 0xcb, 0x3b, 0x0d, 0x9b, 0x46, 0x7d, 0x10, 0xd3, 0xf6, 0x0c, 0xd3, 0xd1, - 0x20, 0x11, 0xfe, 0x38, 0xa5, 0x2c, 0xf7, 0x10, 0xf2, 0xa0, 0x56, 0xa7, 0x9e, 0xe7, 0x6d, 0x3f, 0xea, 0x74, 0x96, - 0x04, 0xd2, 0x36, 0xec, 0xcc, 0x1f, 0x8d, 0xd8, 0xa4, 0x37, 0x8d, 0xc7, 0xab, 0xf4, 0x5f, 0x7c, 0xfc, 0x1c, 0x88, - 0x5b, 0x11, 0x41, 0xa5, 0x1d, 0x51, 0x15, 0x04, 0x25, 0x37, 0x4c, 0xb4, 0xb0, 0x96, 0xeb, 0xd4, 0x23, 0xf7, 0xc8, - 0x9e, 0x7d, 0xd8, 0xb0, 0xc9, 0x9b, 0x01, 0xfd, 0xa7, 0xad, 0xd2, 0x66, 0x14, 0xf3, 0x05, 0x60, 0xd9, 0x0a, 0x8e, - 0x87, 0x43, 0x83, 0xaf, 0xa6, 0xd3, 0x6d, 0x1e, 0xee, 0xa5, 0xe8, 0xe9, 0x4a, 0x5c, 0x2a, 0xfc, 0xde, 0xe2, 0x86, - 0x29, 0xdb, 0x5b, 0xdd, 0xb4, 0x47, 0x6a, 0xad, 0x6e, 0xb9, 0x10, 0x8a, 0xb2, 0x7b, 0x62, 0xf9, 0xc7, 0x2f, 0x0e, - 0xe1, 0x3f, 0xa2, 0xea, 0x7f, 0xcd, 0x9a, 0x08, 0xf5, 0xb7, 0x65, 0x4d, 0x70, 0x22, 0x95, 0x90, 0x10, 0xdf, 0xbf, - 0xfc, 0x74, 0xfa, 0xb0, 0x0a, 0x7b, 0x97, 0x26, 0x55, 0xaa, 0x6a, 0xe9, 0xef, 0xe3, 0x18, 0x42, 0x77, 0xd6, 0x8b, - 0x0b, 0xf0, 0x90, 0xb2, 0x7b, 0x36, 0x80, 0x4a, 0xe2, 0x1d, 0x41, 0x52, 0x7c, 0x1d, 0xeb, 0xd0, 0x53, 0xe2, 0xf5, - 0xa6, 0xa7, 0xc4, 0xab, 0xdd, 0x4f, 0x89, 0x1f, 0xf6, 0x7a, 0x4a, 0xbc, 0xfa, 0xea, 0x4f, 0x89, 0xd7, 0xf5, 0xa7, - 0xc4, 0x45, 0x2c, 0xf4, 0x67, 0xcd, 0xb7, 0x2b, 0xfe, 0xf3, 0x23, 0x09, 0xe5, 0xce, 0xe3, 0x41, 0xc7, 0x21, 0x97, - 0xc7, 0x17, 0x7f, 0xf8, 0x61, 0x81, 0x1b, 0xf1, 0x3d, 0xaa, 0x93, 0x15, 0x4f, 0x0b, 0x8e, 0xd9, 0xb1, 0x1f, 0x25, - 0x39, 0x8c, 0xa3, 0xd9, 0xcf, 0x20, 0x94, 0x05, 0x76, 0x60, 0xa2, 0x64, 0x04, 0xe9, 0xcf, 0xf1, 0x72, 0xb5, 0x7c, - 0x0b, 0x6d, 0x7d, 0x0c, 0xd2, 0x60, 0x14, 0x32, 0x69, 0x89, 0x4c, 0xea, 0x6f, 0x9c, 0x27, 0x0e, 0x1a, 0xa7, 0xe2, - 0xa7, 0x7f, 0x27, 0x7e, 0xa2, 0x4e, 0x2a, 0xff, 0x4d, 0x7a, 0x75, 0x7a, 0xf3, 0x43, 0x44, 0x08, 0x01, 0x95, 0x41, - 0x3f, 0xfc, 0x31, 0x72, 0x11, 0x1b, 0x0d, 0xb3, 0x14, 0xfa, 0x0e, 0x1b, 0xdb, 0x61, 0xb5, 0x47, 0xcd, 0xca, 0x30, - 0xa5, 0x0b, 0xae, 0x3a, 0x1b, 0x7e, 0x11, 0xaf, 0x52, 0x36, 0x89, 0x6f, 0x23, 0xdd, 0x8c, 0xa4, 0x91, 0x01, 0x48, - 0x38, 0x65, 0x1d, 0x0c, 0x1e, 0xf9, 0x01, 0x09, 0xe5, 0x38, 0x69, 0xe9, 0x10, 0xbb, 0x74, 0xb5, 0xb4, 0x48, 0xd4, - 0x6c, 0xe1, 0x14, 0x75, 0x19, 0xe5, 0xe8, 0x51, 0xab, 0x15, 0x0f, 0x1e, 0x56, 0x53, 0xa8, 0x6a, 0xc4, 0x36, 0xe7, - 0x0a, 0xa7, 0xad, 0x48, 0x30, 0x17, 0x85, 0x1f, 0x8c, 0x86, 0x85, 0xe3, 0x39, 0x64, 0xba, 0x5a, 0xe4, 0x82, 0x17, - 0x91, 0x7c, 0xc5, 0xd7, 0x83, 0x7b, 0x85, 0xa0, 0xcf, 0x97, 0x0a, 0x18, 0xdf, 0xdd, 0xb0, 0x24, 0xf4, 0xef, 0x5b, - 0x46, 0x1e, 0x47, 0x3f, 0x02, 0x00, 0x5e, 0xc5, 0xb7, 0x91, 0x5a, 0x00, 0x83, 0xb5, 0x34, 0xec, 0xa5, 0x46, 0xff, - 0x25, 0x60, 0xb8, 0xa2, 0x8c, 0x00, 0xc2, 0xe4, 0xce, 0xd8, 0xdf, 0x4d, 0xfa, 0xf7, 0x1f, 0x46, 0x6e, 0x9e, 0xc7, - 0xb2, 0xa3, 0x5f, 0x96, 0x7b, 0x74, 0xf3, 0xf4, 0xe9, 0xa3, 0xcd, 0xd3, 0x2e, 0x87, 0x67, 0x6f, 0xa8, 0x6d, 0x6c, - 0x3c, 0x05, 0x30, 0x8a, 0x8b, 0x78, 0x35, 0x9e, 0xa3, 0xa2, 0xeb, 0xd7, 0x9b, 0x6f, 0x06, 0x6d, 0x62, 0x94, 0x52, - 0x39, 0xf5, 0x4a, 0x52, 0x01, 0x05, 0xec, 0xff, 0x35, 0x38, 0xe0, 0xfc, 0x1f, 0x82, 0xa1, 0xbe, 0x6b, 0xf8, 0x2b, - 0x3e, 0x78, 0xd8, 0xe6, 0xed, 0x43, 0x30, 0x4d, 0xee, 0xda, 0x42, 0x08, 0xd7, 0x9a, 0x91, 0x4c, 0x5e, 0x05, 0x9a, - 0xea, 0x46, 0x6e, 0x93, 0x87, 0x3c, 0xd1, 0x0b, 0xb3, 0xe9, 0x99, 0xce, 0x0d, 0x0d, 0x4c, 0xc6, 0xb1, 0x55, 0x05, - 0xc9, 0x70, 0x95, 0x07, 0x86, 0xe8, 0xab, 0x9a, 0xb7, 0x08, 0x22, 0x13, 0xbd, 0xc0, 0xd7, 0x73, 0xfc, 0x3b, 0xf0, - 0x83, 0x0c, 0xc8, 0xad, 0x9a, 0x05, 0x89, 0xa6, 0x6a, 0x37, 0x07, 0xa1, 0x9e, 0xf4, 0x46, 0x48, 0x08, 0x29, 0xde, - 0xf0, 0x1b, 0x4d, 0xd3, 0x34, 0xf9, 0x8c, 0xd0, 0xe4, 0x3b, 0x02, 0xd3, 0xf1, 0x39, 0x00, 0xd2, 0x92, 0x7c, 0x79, - 0x47, 0x29, 0xf0, 0x32, 0x40, 0x99, 0xac, 0x48, 0xe0, 0xae, 0xfe, 0x3a, 0x8e, 0x48, 0x10, 0x0f, 0x7a, 0x70, 0xd3, - 0xe6, 0x27, 0xe0, 0x11, 0xb8, 0xa7, 0xe1, 0x83, 0x1d, 0x73, 0x39, 0x27, 0x58, 0x73, 0xe8, 0x73, 0xd8, 0x67, 0xcd, - 0x3e, 0xe1, 0x22, 0x05, 0x0b, 0x82, 0xd4, 0xa1, 0xe2, 0xe2, 0xd9, 0x64, 0x0d, 0xb8, 0x11, 0xdf, 0x45, 0x77, 0xd9, - 0x82, 0x45, 0x2b, 0x1d, 0x63, 0x42, 0xa1, 0x8f, 0x3e, 0x28, 0xf3, 0x8a, 0x88, 0x2d, 0xc0, 0x36, 0xcd, 0x35, 0xe7, - 0x74, 0x17, 0xa6, 0x1c, 0xa5, 0xfa, 0xe6, 0x98, 0x0b, 0x36, 0x53, 0x8e, 0xdb, 0xaa, 0x37, 0x04, 0x5f, 0xd2, 0xb8, - 0x6a, 0xc8, 0x45, 0x9a, 0xd0, 0xd0, 0x06, 0x79, 0xc7, 0xe0, 0xec, 0x22, 0x01, 0xf6, 0x96, 0x5f, 0x5d, 0x34, 0x29, - 0x91, 0xf1, 0x2b, 0x8c, 0xa2, 0xc4, 0xa8, 0x37, 0xc3, 0xc7, 0x09, 0x8e, 0x89, 0x36, 0xb6, 0x33, 0xae, 0xb5, 0xb3, - 0x61, 0xd2, 0x9f, 0xd8, 0x3d, 0x5d, 0x24, 0x04, 0xaa, 0x4f, 0xec, 0x1e, 0x74, 0xff, 0x5e, 0x03, 0x37, 0x45, 0xdf, - 0x82, 0xae, 0x4d, 0x70, 0xf5, 0x3f, 0x06, 0x67, 0x55, 0x5b, 0x0e, 0x90, 0x93, 0x6f, 0xc1, 0xe2, 0x08, 0x62, 0x88, - 0xea, 0x2c, 0x0e, 0x31, 0x57, 0xf1, 0x6f, 0x35, 0xc2, 0xd8, 0x6a, 0x38, 0x1a, 0xc6, 0x33, 0xd7, 0x71, 0x0e, 0x6a, - 0xe5, 0x81, 0x91, 0xdd, 0x54, 0xda, 0x30, 0xb3, 0x81, 0xeb, 0x58, 0xc1, 0x33, 0xdb, 0xeb, 0xd7, 0xee, 0x68, 0xc5, - 0x97, 0xe4, 0x10, 0xd9, 0x5f, 0xa7, 0x4f, 0xd6, 0xad, 0xda, 0x81, 0x34, 0xaa, 0x2a, 0xf3, 0x38, 0xb6, 0x9c, 0xf3, - 0xbf, 0x86, 0xf5, 0xab, 0x9f, 0x3c, 0x59, 0x52, 0x5c, 0x93, 0x21, 0x78, 0x43, 0x6e, 0xc1, 0x31, 0xfa, 0x8b, 0xf6, - 0x5c, 0x6b, 0xd1, 0xf1, 0x31, 0x8c, 0xa1, 0x0c, 0x97, 0x2d, 0x6c, 0xca, 0xd4, 0x06, 0x2a, 0x3d, 0xa6, 0x55, 0x0c, - 0xc7, 0xfd, 0xae, 0xb2, 0x42, 0xa2, 0xb7, 0x95, 0x5a, 0xc0, 0xf6, 0x37, 0x5c, 0x9f, 0xf6, 0x08, 0xfc, 0x12, 0x40, - 0x09, 0xf0, 0x9d, 0xbe, 0xb3, 0xc1, 0xd5, 0xb2, 0xdc, 0x5c, 0xf9, 0x92, 0xdc, 0xbf, 0x31, 0xbc, 0x74, 0x50, 0x86, - 0x26, 0xdb, 0x6b, 0xbe, 0xee, 0x1e, 0xd8, 0x24, 0x8b, 0x26, 0xe5, 0x06, 0x2b, 0xf7, 0xd7, 0xfe, 0xcd, 0x95, 0x30, - 0x0a, 0x04, 0x15, 0x88, 0x1b, 0x30, 0x4a, 0x1e, 0x47, 0xb8, 0xf9, 0xe9, 0xb8, 0x05, 0x7b, 0x51, 0x31, 0x58, 0x81, - 0x3c, 0x82, 0xc9, 0x6a, 0x0a, 0x53, 0x1c, 0x3c, 0x57, 0xa3, 0x59, 0x70, 0x4b, 0x10, 0xa2, 0x1b, 0x77, 0x62, 0x26, - 0x74, 0x0a, 0x8b, 0x3a, 0x01, 0xf7, 0x45, 0xb9, 0x2f, 0xd7, 0x3a, 0xd8, 0xcd, 0xb5, 0xce, 0x76, 0x71, 0xad, 0xc9, - 0x9c, 0xea, 0x36, 0xf1, 0x97, 0x8a, 0x45, 0x9e, 0x20, 0xce, 0x55, 0xc3, 0xbc, 0x12, 0xab, 0x1b, 0xad, 0xaf, 0x44, - 0xad, 0x5a, 0x6b, 0xa4, 0x25, 0x88, 0xec, 0x6f, 0xe5, 0x81, 0x22, 0x04, 0xea, 0x2a, 0x6f, 0xfc, 0xa2, 0xe0, 0x8d, - 0xd3, 0xab, 0xa6, 0x30, 0xa4, 0x11, 0xd4, 0xbf, 0x62, 0xa4, 0x26, 0x5f, 0x07, 0x85, 0xb1, 0x5a, 0x31, 0x52, 0xc5, - 0xfc, 0xaa, 0x78, 0x68, 0x28, 0x46, 0x7d, 0xe2, 0x95, 0x51, 0xb6, 0xed, 0x2b, 0x17, 0x2d, 0xac, 0xaf, 0x8a, 0x74, - 0xe0, 0xba, 0xe3, 0x90, 0x65, 0xb2, 0xba, 0x6d, 0xca, 0xe6, 0x37, 0x6a, 0xb6, 0xb2, 0x49, 0xa4, 0x9d, 0x0c, 0x01, - 0x58, 0xb0, 0xe9, 0x2b, 0x72, 0x6d, 0xa9, 0x03, 0x81, 0x83, 0x6c, 0x30, 0xeb, 0xdb, 0xcd, 0x9d, 0xa7, 0x78, 0x09, - 0x85, 0x14, 0x5e, 0xe5, 0x41, 0x20, 0x7c, 0xaf, 0xd6, 0x0d, 0xb7, 0x3c, 0x5e, 0xf2, 0xfc, 0x7e, 0x07, 0xf6, 0xa2, - 0xe6, 0xa8, 0x82, 0x7c, 0x3c, 0x99, 0x16, 0xa9, 0xe7, 0x62, 0xd1, 0x7a, 0xa3, 0xc4, 0xc4, 0x59, 0x73, 0xcb, 0x98, - 0x32, 0x8f, 0x9e, 0x97, 0xe8, 0x89, 0x7e, 0xf9, 0xd6, 0x49, 0x56, 0x11, 0xfa, 0xb6, 0xb7, 0xb2, 0xc4, 0x1f, 0x7f, - 0x52, 0x86, 0x2c, 0xf8, 0x9c, 0xc0, 0x03, 0x2e, 0x4b, 0x0a, 0xfa, 0x3e, 0xba, 0x82, 0x64, 0x3d, 0xdb, 0x4b, 0x15, - 0xee, 0x4b, 0xef, 0xb1, 0xd3, 0xf6, 0x5f, 0x4c, 0x0f, 0x2b, 0x4c, 0x51, 0xaf, 0x53, 0x66, 0x99, 0x6f, 0x18, 0x47, - 0x36, 0x5f, 0x2d, 0x46, 0x6b, 0x95, 0xb7, 0xaa, 0xb0, 0x5c, 0xeb, 0x6c, 0x56, 0xb5, 0xdb, 0xe9, 0x74, 0x5a, 0x66, - 0x34, 0x3a, 0xda, 0x21, 0x32, 0x0b, 0x1f, 0x3b, 0x8e, 0x53, 0x1d, 0xfb, 0x76, 0xb0, 0x5b, 0xc8, 0xb7, 0xed, 0x36, - 0x8e, 0x18, 0x61, 0xbb, 0x0b, 0x7e, 0x75, 0x70, 0xe4, 0x76, 0x71, 0xb2, 0x4b, 0x6a, 0x11, 0x7d, 0x52, 0x86, 0x08, - 0x32, 0xb6, 0x48, 0x7b, 0x63, 0x86, 0x32, 0x18, 0x5b, 0x39, 0xd0, 0xa8, 0x38, 0x60, 0xcd, 0x40, 0x55, 0xc4, 0x15, - 0xbb, 0xc2, 0xd1, 0x90, 0x1f, 0x5e, 0x63, 0xde, 0x8b, 0x4e, 0xf0, 0xa0, 0xac, 0xeb, 0x3c, 0x6d, 0x9c, 0x56, 0xc7, - 0xf9, 0x4b, 0xa9, 0x9c, 0x06, 0x17, 0xe0, 0x5a, 0x08, 0xb4, 0x89, 0x3f, 0x8b, 0x7f, 0x4b, 0xfe, 0xff, 0x8b, 0xe5, - 0x5d, 0x59, 0x7f, 0xa4, 0x0b, 0x1c, 0xed, 0xe2, 0xb4, 0xd0, 0xa8, 0x9b, 0xf6, 0x80, 0xd4, 0x32, 0x98, 0xaa, 0x02, - 0x74, 0x10, 0xd2, 0x97, 0x02, 0x80, 0x34, 0xb0, 0xdf, 0x91, 0x62, 0x86, 0x25, 0x2e, 0x58, 0x88, 0x45, 0xf8, 0x3a, - 0x98, 0x83, 0xf9, 0xbc, 0x8b, 0xf2, 0x83, 0xd2, 0x9e, 0x00, 0x69, 0x7c, 0x6d, 0x6e, 0x7b, 0xb1, 0xfb, 0xab, 0x72, - 0x2d, 0xd1, 0x30, 0x80, 0xcc, 0x85, 0x43, 0x88, 0x8a, 0x04, 0x5a, 0x65, 0x73, 0xd3, 0x28, 0x65, 0xae, 0x2a, 0x67, - 0x13, 0x03, 0xc3, 0xe6, 0x9a, 0x8b, 0x50, 0xdb, 0x42, 0x5a, 0x00, 0x93, 0xe5, 0xdb, 0x0f, 0xbf, 0x2d, 0x58, 0x62, - 0x75, 0x3f, 0xba, 0xb8, 0xe4, 0xb8, 0x7f, 0x2d, 0xbc, 0x3b, 0x53, 0x3a, 0xff, 0xc8, 0x5f, 0xfc, 0xa1, 0x91, 0xa1, - 0x77, 0x51, 0xe2, 0xd0, 0x71, 0x6d, 0x71, 0xcf, 0xd8, 0xab, 0xf4, 0x22, 0x88, 0xf6, 0x2f, 0xeb, 0xdf, 0xed, 0x5d, - 0x16, 0x2e, 0x8c, 0xbd, 0x0b, 0xc3, 0x8d, 0x43, 0x9a, 0x0b, 0xd9, 0xe0, 0x07, 0x85, 0xa1, 0xa8, 0x5a, 0x1d, 0xeb, - 0x58, 0x8b, 0xa8, 0xfc, 0x8b, 0xd5, 0x60, 0x78, 0x72, 0x76, 0xb7, 0x08, 0xb5, 0x1b, 0x96, 0x40, 0x68, 0x9f, 0x81, - 0xee, 0xda, 0x8e, 0xae, 0xa1, 0x0d, 0x6d, 0x10, 0xcd, 0x06, 0xfa, 0x2f, 0x17, 0x6f, 0xac, 0xae, 0x7e, 0x06, 0x22, - 0xda, 0x9b, 0x19, 0x5e, 0x7b, 0xe7, 0xfe, 0x3d, 0x4b, 0xae, 0x3d, 0x5d, 0xc3, 0x08, 0x3e, 0x74, 0xe1, 0x61, 0x9a, - 0xe6, 0xe9, 0x7b, 0x04, 0x8a, 0xd0, 0x44, 0xac, 0x37, 0x1d, 0x50, 0x8e, 0xeb, 0x75, 0x35, 0xd7, 0x3b, 0xb4, 0x8f, - 0xba, 0xfa, 0xe9, 0x37, 0x9a, 0x76, 0x32, 0x61, 0xd3, 0xf4, 0x14, 0x9f, 0x68, 0x27, 0x78, 0x47, 0xd0, 0x6f, 0x4d, - 0xb3, 0xc7, 0x61, 0x6a, 0xb9, 0xda, 0x9a, 0x7f, 0x6a, 0xda, 0x34, 0x08, 0xc3, 0x9e, 0xf6, 0x78, 0xea, 0x4d, 0x0f, - 0xa7, 0x2f, 0xfa, 0x3c, 0x39, 0xff, 0xa6, 0x54, 0xdc, 0xa4, 0x7f, 0x3d, 0xa5, 0x5a, 0x9a, 0x25, 0xf1, 0x27, 0xc6, - 0xd5, 0x4e, 0x34, 0xf9, 0x78, 0xac, 0x56, 0xf5, 0xea, 0x3d, 0xb9, 0xdd, 0xd1, 0x78, 0xea, 0x15, 0xc5, 0x71, 0x8c, - 0x07, 0x72, 0x90, 0x27, 0x07, 0x62, 0xe8, 0x27, 0x2a, 0x98, 0x5c, 0xab, 0x09, 0x50, 0xae, 0xce, 0xe7, 0x38, 0x13, - 0xf3, 0x3b, 0x01, 0x3f, 0x8c, 0xd2, 0x5c, 0x17, 0x46, 0xa0, 0x6b, 0x93, 0x81, 0xfe, 0xa3, 0xeb, 0x75, 0x4d, 0xd7, - 0x3d, 0xb2, 0x8f, 0xba, 0x63, 0xc7, 0x3c, 0xb4, 0x0f, 0xad, 0xb6, 0x7d, 0x64, 0x76, 0xad, 0xae, 0xd9, 0xfd, 0x5b, - 0x77, 0x6c, 0x1d, 0xda, 0x87, 0xa6, 0x63, 0x75, 0x21, 0xd1, 0xea, 0x5a, 0xdd, 0x1b, 0xeb, 0xb0, 0x3b, 0x76, 0x30, - 0xd5, 0xb3, 0x3b, 0x1d, 0xcb, 0x75, 0xec, 0x4e, 0xc7, 0xec, 0xd8, 0x47, 0x47, 0x96, 0xdb, 0xb6, 0x8f, 0x8e, 0xce, - 0x3b, 0x5d, 0xbb, 0x0d, 0x79, 0xed, 0xf6, 0xb8, 0x6d, 0xbb, 0xae, 0x05, 0x7f, 0x99, 0x5d, 0xdb, 0xa3, 0x1f, 0xae, - 0x6b, 0xb7, 0x5d, 0xd3, 0x09, 0x3b, 0x9e, 0x7d, 0xf4, 0xc2, 0xc4, 0xbf, 0xb1, 0x98, 0x89, 0x7f, 0x41, 0x33, 0xe6, - 0x0b, 0xdb, 0x3b, 0xa2, 0x5f, 0xd8, 0xe0, 0xcd, 0x61, 0xf7, 0x57, 0xfd, 0x60, 0xe3, 0x1c, 0x5c, 0x9a, 0x43, 0xb7, - 0x63, 0xb7, 0xdb, 0xe6, 0xa1, 0x6b, 0x77, 0xdb, 0x73, 0xeb, 0xd0, 0xb3, 0x8f, 0x8e, 0xc7, 0x96, 0x6b, 0x1f, 0x1f, - 0x9b, 0x8e, 0xd5, 0xb6, 0x3d, 0xd3, 0xb5, 0x0f, 0xdb, 0xf8, 0xa3, 0x6d, 0x7b, 0x37, 0xc7, 0x2f, 0xec, 0xa3, 0xce, - 0xfc, 0xc8, 0x3e, 0xfc, 0x78, 0xd8, 0xb5, 0xbd, 0xf6, 0xbc, 0x7d, 0x64, 0x7b, 0xc7, 0x37, 0x47, 0xf6, 0xe1, 0xdc, - 0xf2, 0x8e, 0xb6, 0xd6, 0x74, 0x3d, 0x1b, 0x60, 0x84, 0xd9, 0x90, 0x61, 0xf2, 0x0c, 0xf8, 0x33, 0xc7, 0xba, 0xff, - 0xc5, 0x66, 0xd2, 0x7a, 0xd5, 0x17, 0x76, 0xf7, 0x78, 0x4c, 0xc5, 0x21, 0xc1, 0x12, 0x25, 0xa0, 0xca, 0x8d, 0x45, - 0xdd, 0x62, 0x73, 0x96, 0x68, 0x48, 0xfc, 0xe1, 0x9d, 0xdd, 0x58, 0xd0, 0x31, 0xf5, 0xfb, 0x3f, 0x6d, 0x47, 0x2e, - 0x39, 0x44, 0xae, 0xfc, 0x86, 0xff, 0x43, 0x41, 0x5f, 0x86, 0xe6, 0xf9, 0x26, 0x41, 0xc5, 0xfb, 0xdd, 0x82, 0x8a, - 0x37, 0xab, 0x7d, 0x04, 0x15, 0xef, 0xbf, 0xba, 0xa0, 0xe2, 0xbc, 0xaa, 0x27, 0xff, 0xbe, 0xea, 0x9b, 0xfe, 0xd7, - 0x75, 0xf5, 0x19, 0x12, 0xf8, 0xad, 0xcb, 0x8b, 0xd5, 0x15, 0x78, 0x57, 0x7a, 0x1f, 0x0f, 0xde, 0xac, 0x4a, 0x4a, - 0x60, 0x31, 0xe0, 0xd8, 0xf7, 0x31, 0xe1, 0xd8, 0xdf, 0x57, 0x03, 0xd0, 0x3c, 0xe1, 0x74, 0x49, 0x30, 0xb1, 0xe6, - 0x7e, 0x38, 0x95, 0x34, 0x0d, 0xa4, 0xf4, 0x31, 0x19, 0xac, 0x12, 0xe0, 0xba, 0x06, 0x71, 0xd8, 0x6a, 0x11, 0xa5, - 0xbd, 0x23, 0x07, 0x2e, 0x52, 0x6f, 0x9a, 0xe4, 0x95, 0xca, 0xb6, 0xf0, 0x47, 0x75, 0xcd, 0xad, 0x26, 0x36, 0xe6, - 0xa3, 0x52, 0x60, 0x73, 0xeb, 0x6e, 0xbd, 0x5d, 0x0d, 0xb4, 0x6d, 0x84, 0xd2, 0x24, 0x90, 0x73, 0x4d, 0xf9, 0x65, - 0xd5, 0xbc, 0x8a, 0x32, 0xe6, 0xe6, 0x91, 0xc2, 0x48, 0xaa, 0xf5, 0xdd, 0xb2, 0x6a, 0xdf, 0xae, 0x69, 0x36, 0x74, - 0x5f, 0xaa, 0xbe, 0x45, 0xaf, 0x50, 0x36, 0x5c, 0x05, 0x55, 0x25, 0xb2, 0x5a, 0x23, 0x40, 0x0a, 0xea, 0xbe, 0x50, - 0x3e, 0x2c, 0x48, 0x4b, 0x47, 0x43, 0x7a, 0xc7, 0x51, 0xf2, 0x4a, 0x6d, 0xaa, 0x0a, 0x8b, 0xcf, 0xd6, 0x48, 0x71, - 0x07, 0xbf, 0x03, 0xe9, 0xc8, 0x29, 0x9e, 0x51, 0xac, 0xc2, 0x79, 0xad, 0xb4, 0x4b, 0x8f, 0x99, 0x7c, 0xee, 0xae, - 0xeb, 0xc4, 0xe3, 0x46, 0x55, 0x65, 0x97, 0x2d, 0x04, 0x15, 0x84, 0xdd, 0x93, 0x62, 0x70, 0x4e, 0xca, 0xdb, 0xa8, - 0xfb, 0xbc, 0xad, 0x31, 0x51, 0xee, 0x31, 0x6c, 0x62, 0x93, 0x7f, 0xa8, 0x7e, 0x01, 0xd6, 0x53, 0x88, 0x82, 0xdd, - 0x43, 0x32, 0x4d, 0xa1, 0x51, 0x3d, 0xd4, 0x62, 0xee, 0x6f, 0x51, 0xb0, 0x51, 0x1b, 0xe6, 0x8d, 0xa0, 0x36, 0xf4, - 0x36, 0x9d, 0x1c, 0x69, 0x3c, 0xb2, 0x2e, 0x89, 0xa8, 0xdd, 0xce, 0xb1, 0xe9, 0x1e, 0x99, 0xf6, 0x71, 0xc7, 0xc8, - 0xc5, 0x81, 0x53, 0x9b, 0x2c, 0x01, 0x04, 0x94, 0xa2, 0xe5, 0x30, 0x83, 0x28, 0xc8, 0x02, 0x3f, 0xcc, 0x81, 0x3e, - 0x2e, 0xbf, 0x2a, 0xfe, 0xb9, 0x4a, 0x33, 0x98, 0xa3, 0x20, 0x7a, 0x51, 0x21, 0xdc, 0x1a, 0xb1, 0xec, 0x96, 0xb1, - 0x68, 0x83, 0xb0, 0xbc, 0xaa, 0x5f, 0xfe, 0xe7, 0x69, 0xdb, 0xe6, 0xa4, 0xc9, 0x32, 0xca, 0x22, 0xbe, 0x3f, 0x84, - 0x32, 0x74, 0x3e, 0x34, 0x7f, 0xda, 0x84, 0x70, 0xff, 0xb9, 0x1b, 0xe1, 0x66, 0x6c, 0x1f, 0x84, 0xfb, 0xcf, 0xaf, - 0x8e, 0x70, 0x7f, 0x52, 0x11, 0x6e, 0xc9, 0x16, 0xa8, 0xe0, 0x3a, 0x7f, 0xc0, 0xef, 0x16, 0x38, 0x75, 0x7e, 0xae, - 0x1f, 0x10, 0x01, 0xaf, 0x2b, 0xc1, 0x76, 0x3f, 0x96, 0xa2, 0x07, 0x21, 0x53, 0x04, 0x9d, 0xd0, 0x52, 0xa4, 0x12, - 0x08, 0x44, 0x2b, 0x43, 0xaa, 0x43, 0x9b, 0x6f, 0xa3, 0x2c, 0xb4, 0xdf, 0xf3, 0x87, 0x1f, 0x08, 0x79, 0xde, 0xc4, - 0xc9, 0xc2, 0x47, 0x07, 0x7c, 0x3a, 0x46, 0x1d, 0x84, 0x0f, 0x07, 0xec, 0xcf, 0xc6, 0x71, 0x34, 0x91, 0x92, 0x0a, - 0x36, 0xb8, 0x24, 0x8a, 0x5b, 0xbf, 0x67, 0x7e, 0xa2, 0x9b, 0x94, 0x0d, 0x8b, 0xfb, 0xac, 0xed, 0x3c, 0xf3, 0x0e, - 0x9f, 0x1d, 0x39, 0xf0, 0xbf, 0xcb, 0xda, 0xb9, 0xc9, 0x0b, 0x2e, 0xe2, 0x08, 0x02, 0x9f, 0x88, 0x92, 0x9b, 0x8a, - 0xdd, 0x32, 0xf6, 0xa9, 0x28, 0x75, 0xdc, 0x5c, 0x68, 0xe2, 0xdf, 0x17, 0x65, 0x1a, 0x4b, 0xcc, 0xe3, 0x95, 0x32, - 0xac, 0x86, 0xd1, 0x04, 0xd1, 0x0a, 0x78, 0x6f, 0x4a, 0x09, 0x35, 0x9b, 0x4f, 0xb7, 0x98, 0x17, 0x6b, 0xe7, 0x57, - 0x45, 0x74, 0x25, 0x11, 0xe5, 0x65, 0x27, 0x04, 0xb9, 0xd8, 0xc2, 0x41, 0xdf, 0xec, 0x18, 0x5f, 0x48, 0x83, 0xd8, - 0x86, 0x62, 0x81, 0x7c, 0x5a, 0xa0, 0x2c, 0x59, 0x45, 0xe3, 0x16, 0xfe, 0xf4, 0x47, 0x69, 0x2b, 0x38, 0x00, 0xef, - 0xac, 0xd8, 0xb1, 0x81, 0xab, 0xe6, 0x9f, 0x3a, 0x45, 0x28, 0x8a, 0x54, 0xac, 0x8a, 0xff, 0x2c, 0x33, 0x13, 0x0a, - 0x60, 0x8b, 0x4b, 0x6b, 0x0d, 0xfc, 0x67, 0xb2, 0xe2, 0xb3, 0xcc, 0x84, 0x20, 0xb2, 0xb0, 0xdc, 0x4f, 0x9f, 0x52, - 0x29, 0x08, 0xeb, 0x48, 0xd3, 0x3a, 0x1b, 0x17, 0xee, 0xdd, 0x34, 0x7f, 0x16, 0x93, 0x87, 0xb7, 0xde, 0xd8, 0x8c, - 0x9f, 0x3f, 0x3f, 0x1d, 0xb8, 0x06, 0x0f, 0x4a, 0x5a, 0x8a, 0xa0, 0x75, 0xbe, 0x9f, 0xf2, 0x81, 0xd1, 0x68, 0x16, - 0xb7, 0x84, 0x37, 0x93, 0x23, 0x54, 0x94, 0x39, 0xf6, 0x82, 0x88, 0x16, 0x24, 0x64, 0xf4, 0x85, 0x12, 0x80, 0x28, - 0x23, 0x5f, 0x5d, 0x6d, 0xdb, 0xb1, 0x1d, 0x5d, 0x56, 0x9c, 0x06, 0xb3, 0xc1, 0x3a, 0xce, 0x7c, 0x88, 0x0d, 0x14, - 0xc6, 0x33, 0xb0, 0xad, 0xc9, 0x82, 0x2c, 0x84, 0x40, 0x33, 0x60, 0x64, 0xb3, 0xa0, 0x77, 0x79, 0xce, 0x35, 0x9e, - 0xfd, 0xe4, 0x13, 0x06, 0x1b, 0x14, 0x66, 0x75, 0xe8, 0x71, 0xe8, 0x47, 0xb8, 0x0c, 0x5b, 0x7a, 0x0b, 0x42, 0x5d, - 0xb2, 0x24, 0xb5, 0x54, 0x0b, 0x82, 0x9e, 0x06, 0x75, 0x20, 0x0c, 0x3d, 0x36, 0x30, 0x4d, 0xfc, 0x05, 0xf8, 0x64, - 0x5f, 0xe7, 0x26, 0xc7, 0xb4, 0x3a, 0x47, 0xb5, 0x9a, 0xfb, 0xe2, 0xc8, 0xd4, 0x3c, 0xd7, 0xd4, 0x1c, 0x40, 0xb7, - 0x7a, 0x6e, 0xae, 0xf3, 0xab, 0xfe, 0x2e, 0x21, 0x28, 0xe1, 0x97, 0xc7, 0x34, 0x0f, 0x12, 0x7f, 0x72, 0xf6, 0x72, - 0x46, 0x0e, 0x24, 0x5b, 0x8a, 0xb7, 0xf4, 0x80, 0x04, 0x21, 0x17, 0xec, 0x2e, 0x33, 0x30, 0x10, 0x0b, 0x2f, 0x12, - 0x18, 0x6b, 0x34, 0xfe, 0x0b, 0x22, 0x2d, 0xf8, 0xfc, 0xb9, 0x15, 0x80, 0x81, 0xc3, 0x40, 0x81, 0x0f, 0x7c, 0x1b, - 0x25, 0x80, 0x05, 0x85, 0xe8, 0x0e, 0x81, 0x05, 0xd6, 0x47, 0xf0, 0x6f, 0x91, 0x2c, 0x7e, 0x70, 0xd1, 0xa9, 0x1d, - 0xfa, 0xd1, 0x0c, 0x50, 0x9a, 0x1f, 0xcd, 0x6a, 0x2a, 0x1a, 0x64, 0xbf, 0x58, 0x49, 0x2d, 0x9a, 0x2a, 0xd4, 0x27, - 0xd2, 0xef, 0xef, 0x2f, 0x28, 0xd0, 0x14, 0x04, 0x35, 0xf7, 0x27, 0x68, 0x6c, 0x57, 0x48, 0x77, 0x9e, 0x0f, 0xbe, - 0x3d, 0x59, 0xb0, 0xcc, 0x27, 0xd6, 0x30, 0x3c, 0x7e, 0x81, 0x1c, 0xd0, 0xc6, 0x22, 0x48, 0x2c, 0x05, 0x93, 0x9f, - 0xb0, 0x9b, 0x60, 0xcc, 0xdf, 0xa5, 0xa6, 0xc6, 0xef, 0x29, 0x0b, 0xb5, 0xc0, 0x06, 0xae, 0x49, 0x4a, 0xc8, 0x63, - 0x1f, 0xdd, 0x4c, 0x0e, 0xa2, 0x58, 0x3f, 0xfd, 0x56, 0xda, 0x6b, 0x6d, 0x5a, 0x04, 0x88, 0xf6, 0x78, 0x99, 0xb0, - 0xf0, 0x5f, 0x83, 0x6f, 0xe1, 0xe2, 0xfe, 0xf6, 0x4a, 0x37, 0xfa, 0x99, 0x3d, 0x4f, 0xd8, 0x74, 0xf0, 0x6d, 0x43, - 0xd4, 0x43, 0x7c, 0xde, 0xd3, 0x58, 0xf4, 0xb6, 0x57, 0x38, 0x07, 0x6a, 0xef, 0xf5, 0xa8, 0x3f, 0xe5, 0xaf, 0x75, - 0x78, 0x01, 0xae, 0x4b, 0x6f, 0x6c, 0xb7, 0x8f, 0xef, 0xe7, 0x51, 0xe8, 0x8f, 0x3f, 0xf5, 0x29, 0xa7, 0xf4, 0x61, - 0xc1, 0x6d, 0x3d, 0xf6, 0x97, 0x3d, 0xbc, 0x5e, 0xd5, 0x44, 0x30, 0xd7, 0xa4, 0x54, 0x49, 0xd9, 0x35, 0xee, 0x65, - 0xdc, 0xca, 0x6b, 0xec, 0x19, 0xbb, 0xba, 0x9d, 0x07, 0x19, 0x13, 0x5d, 0xe1, 0x47, 0x9e, 0x8b, 0x87, 0x3a, 0x3d, - 0x51, 0xf1, 0x61, 0x6d, 0xb7, 0x35, 0xb7, 0xfb, 0xb7, 0xce, 0x8d, 0xeb, 0xcc, 0x3d, 0xd7, 0xee, 0x7e, 0x74, 0xbb, - 0xf3, 0xb6, 0x7d, 0x1c, 0x5a, 0x6d, 0xfb, 0x18, 0xfe, 0x7c, 0x3c, 0xb6, 0xbb, 0x73, 0xcb, 0xb3, 0x0f, 0x3f, 0xba, - 0x5e, 0x68, 0x75, 0xed, 0x63, 0xf8, 0x73, 0x4e, 0xb5, 0xe0, 0x01, 0x44, 0xef, 0x9d, 0x6f, 0x4b, 0x58, 0x40, 0xf9, - 0x2d, 0xe5, 0x34, 0x66, 0xe9, 0x7a, 0x6b, 0x90, 0xf5, 0x00, 0xca, 0xd0, 0x4d, 0xe1, 0x04, 0x32, 0xea, 0xb7, 0x20, - 0x0c, 0x3b, 0x06, 0x10, 0x10, 0x2a, 0x2f, 0xc2, 0x2e, 0x55, 0xb8, 0xd2, 0x6f, 0x3c, 0x46, 0xbc, 0x4e, 0xb3, 0xc3, - 0x75, 0x11, 0x99, 0x8a, 0x84, 0x43, 0xbf, 0x2c, 0xd1, 0x89, 0x91, 0x70, 0x11, 0xaf, 0x60, 0xa5, 0x22, 0x3a, 0x62, - 0xbe, 0x7b, 0xe0, 0x68, 0x99, 0xcb, 0x64, 0x74, 0x9e, 0xaf, 0xda, 0x36, 0x17, 0x18, 0xc9, 0xd6, 0xff, 0x68, 0x3b, - 0x18, 0x94, 0x96, 0xda, 0x11, 0xde, 0x5c, 0x27, 0x41, 0x22, 0x87, 0xa7, 0xa0, 0x68, 0xb7, 0xd9, 0x53, 0xbd, 0x01, - 0x61, 0x4c, 0xde, 0x02, 0x95, 0x7c, 0xe3, 0x87, 0x8a, 0x72, 0x8b, 0x52, 0xf3, 0x91, 0xc4, 0xfc, 0x4f, 0x9f, 0x16, - 0x83, 0xb3, 0x2a, 0xe3, 0x3e, 0x71, 0x3b, 0x70, 0xed, 0x76, 0x58, 0x7b, 0xab, 0x9e, 0xd5, 0x6e, 0x77, 0xc0, 0x85, - 0xbb, 0x50, 0xa1, 0x4b, 0x21, 0xa4, 0xb8, 0x1b, 0x95, 0xbd, 0x6a, 0x32, 0x5c, 0x70, 0xa4, 0x5c, 0x79, 0xea, 0xe8, - 0x46, 0x3f, 0x12, 0x22, 0xc9, 0x68, 0x8b, 0x0b, 0x64, 0xfe, 0x16, 0xd3, 0x01, 0x34, 0x5b, 0xe6, 0xb1, 0xc3, 0x68, - 0xf4, 0x7f, 0x3d, 0x09, 0x34, 0xe0, 0x02, 0x19, 0x6a, 0xe5, 0xb4, 0x96, 0x0c, 0x7a, 0xe4, 0xbd, 0x4a, 0x17, 0x2a, - 0x4b, 0xcf, 0x74, 0x48, 0x82, 0xf8, 0x56, 0x18, 0xd2, 0x4e, 0x2a, 0x90, 0xc9, 0xdb, 0xa2, 0x48, 0x30, 0x03, 0xf0, - 0x01, 0xde, 0x12, 0xc6, 0x64, 0xc6, 0xd3, 0xa7, 0x1b, 0x2f, 0x21, 0x12, 0xd8, 0xab, 0x91, 0x3d, 0x75, 0x15, 0xbf, - 0xe9, 0x2a, 0x8a, 0x91, 0xed, 0x22, 0xd6, 0x10, 0x7a, 0x6f, 0xb4, 0xf7, 0xf0, 0xe7, 0x88, 0xf9, 0x99, 0xcd, 0x25, - 0x4d, 0x2d, 0xe5, 0x72, 0x37, 0x5d, 0xd6, 0x06, 0x8d, 0x37, 0xee, 0xeb, 0x8c, 0xfb, 0x12, 0x7c, 0xb2, 0xfe, 0xb8, - 0xe2, 0x96, 0xde, 0xd0, 0xc6, 0x67, 0xa7, 0x70, 0x4f, 0xf3, 0x2e, 0xf3, 0xc9, 0x87, 0x89, 0x7a, 0xe5, 0xc6, 0x99, - 0x2f, 0xe2, 0xc8, 0x00, 0x5d, 0xde, 0x6f, 0x14, 0xc9, 0x2a, 0xd6, 0xe0, 0xa7, 0xef, 0x2e, 0xbe, 0xd3, 0xf8, 0xfe, - 0x27, 0x09, 0x22, 0x3e, 0x64, 0x28, 0xea, 0xc1, 0x80, 0xa2, 0x1e, 0x68, 0x3c, 0x8c, 0x08, 0xc4, 0x0e, 0xc8, 0x0f, - 0x08, 0x82, 0xc8, 0x80, 0x26, 0xb9, 0xea, 0x62, 0x15, 0x66, 0xc1, 0xd2, 0x4f, 0xb2, 0x03, 0xa8, 0x6a, 0x01, 0x92, - 0xd3, 0x37, 0xd9, 0x88, 0x93, 0x68, 0x56, 0xb8, 0xd8, 0xcb, 0x22, 0x21, 0x9b, 0x9d, 0x06, 0xa1, 0x14, 0xcd, 0x8a, - 0x0e, 0xfc, 0xf1, 0x98, 0x2d, 0xb3, 0x81, 0xee, 0x2f, 0x21, 0xfa, 0x05, 0xfa, 0xb3, 0x3e, 0x88, 0xc7, 0x19, 0xcb, - 0xac, 0x34, 0x4b, 0x98, 0xbf, 0xd0, 0xa5, 0x2b, 0xd7, 0x7a, 0x7b, 0xe9, 0x6a, 0xb4, 0x08, 0x32, 0xe9, 0x0b, 0x91, - 0x26, 0x08, 0x42, 0x52, 0x18, 0xe2, 0xe9, 0x30, 0xe7, 0x20, 0x3c, 0x8f, 0x67, 0x95, 0x1d, 0x55, 0x50, 0x2e, 0x67, - 0xe8, 0x69, 0x97, 0x47, 0x3c, 0x98, 0xa0, 0xcd, 0xd3, 0x35, 0xb7, 0x6b, 0x97, 0x2e, 0x1b, 0xf5, 0xd3, 0x13, 0xfe, - 0xbc, 0xd5, 0xd0, 0x15, 0x83, 0xde, 0x71, 0xc0, 0x97, 0xf0, 0x26, 0x8b, 0xf7, 0x03, 0x5e, 0x18, 0xae, 0x26, 0x6a, - 0x19, 0xfd, 0xbc, 0xd3, 0x58, 0x2e, 0x80, 0x10, 0x2a, 0x09, 0xd1, 0xe7, 0xee, 0xa9, 0x34, 0xb1, 0xc2, 0x51, 0x21, - 0xad, 0xf4, 0xf9, 0xf3, 0xcb, 0xe1, 0x7f, 0xfe, 0x0d, 0xce, 0xe8, 0xe7, 0xae, 0xb0, 0x33, 0xbf, 0x54, 0x4b, 0x71, - 0xea, 0xd3, 0x1c, 0xa2, 0x02, 0x05, 0x9b, 0x08, 0xc7, 0x2b, 0x62, 0x6b, 0xe5, 0xc3, 0x2b, 0xe1, 0x4c, 0x0b, 0x02, - 0x4e, 0x18, 0xc2, 0x1a, 0x7e, 0x08, 0xcb, 0x3b, 0x14, 0x4e, 0x18, 0xb4, 0xdf, 0xee, 0xbe, 0x3f, 0x06, 0x67, 0xcb, - 0xb5, 0x38, 0x10, 0xca, 0x00, 0x71, 0x0f, 0x9d, 0x9e, 0xf8, 0x1a, 0x12, 0x2d, 0x48, 0x7e, 0xa4, 0xbd, 0x03, 0x98, - 0xe6, 0x3c, 0x5e, 0x30, 0x3b, 0x88, 0x0f, 0x6e, 0xd9, 0xc8, 0xf2, 0x97, 0x01, 0xc9, 0xea, 0x91, 0xef, 0xa6, 0x11, - 0xe5, 0x27, 0x45, 0xe0, 0x44, 0x5f, 0xe7, 0x05, 0x28, 0xe3, 0x02, 0x50, 0xf0, 0xd3, 0x3f, 0x2d, 0xfb, 0x67, 0xb4, - 0x45, 0x84, 0x80, 0x32, 0x96, 0x3f, 0x23, 0x37, 0x8b, 0xc2, 0xa3, 0x62, 0xf1, 0x61, 0xc5, 0xd3, 0xa9, 0xea, 0x53, - 0xd1, 0x2e, 0xf7, 0x2f, 0xa1, 0x52, 0xec, 0xd9, 0x78, 0x49, 0x3d, 0xd5, 0xbb, 0x90, 0x3f, 0x21, 0x3a, 0x32, 0x77, - 0xbf, 0x09, 0xe7, 0xb9, 0xe6, 0x9b, 0x51, 0x82, 0xe4, 0x31, 0x15, 0xe2, 0x88, 0xa2, 0xea, 0x09, 0x7c, 0x03, 0x69, - 0xf2, 0x68, 0x30, 0x20, 0x3c, 0x56, 0x45, 0x67, 0x00, 0xa5, 0x86, 0x68, 0x09, 0x30, 0xd9, 0x0c, 0x2a, 0x5a, 0x64, - 0x23, 0x87, 0x95, 0xaa, 0xd3, 0xa9, 0x8f, 0xf1, 0xc0, 0x17, 0xfb, 0xab, 0xb4, 0x03, 0x61, 0x67, 0xf1, 0x85, 0x05, - 0x04, 0x2e, 0xda, 0xa9, 0xe0, 0x71, 0xed, 0xaf, 0x84, 0xb2, 0xad, 0xd0, 0xbf, 0x8f, 0x15, 0xdd, 0x05, 0xee, 0xc6, - 0xe0, 0x1c, 0x53, 0x2f, 0x84, 0xf9, 0x60, 0xed, 0x24, 0x49, 0x8f, 0xf3, 0xf5, 0xd3, 0xa4, 0xba, 0x88, 0xdf, 0x75, - 0x98, 0xd4, 0xb2, 0xe5, 0xc9, 0x20, 0x76, 0xcc, 0x8b, 0x83, 0x56, 0xca, 0xc4, 0x73, 0x9f, 0x9f, 0x1c, 0xc0, 0xfc, - 0xc0, 0xf5, 0x42, 0x89, 0x32, 0x0a, 0x0c, 0xf0, 0xef, 0xe0, 0xa7, 0xa4, 0x7f, 0xf1, 0x76, 0x22, 0x88, 0x3a, 0x7c, - 0x39, 0x4a, 0xe7, 0xaf, 0xa5, 0x22, 0x75, 0x62, 0xc5, 0x69, 0xa6, 0xf2, 0x76, 0x47, 0x68, 0xf8, 0x7d, 0x85, 0xe1, - 0x19, 0xf2, 0x7e, 0xc6, 0x84, 0x65, 0xf3, 0x79, 0xb6, 0xc1, 0xf8, 0x79, 0x53, 0x11, 0x22, 0x58, 0xb7, 0x14, 0x28, - 0xf6, 0xf1, 0xb6, 0x52, 0x05, 0x69, 0x24, 0x8b, 0x2d, 0xfd, 0x96, 0xfe, 0x18, 0x77, 0x7c, 0xad, 0x34, 0xa6, 0x42, - 0xb9, 0xf3, 0x6c, 0x00, 0x45, 0x05, 0xb3, 0xdd, 0x5f, 0x2e, 0xa9, 0xb0, 0xd1, 0x3f, 0x39, 0xa0, 0x77, 0xe7, 0x29, - 0xed, 0xb0, 0xd3, 0x13, 0xd0, 0xdf, 0xa4, 0x45, 0xf7, 0x97, 0x4b, 0xbe, 0xa4, 0xf4, 0x8b, 0x72, 0x0e, 0xe6, 0xd9, - 0x22, 0x3c, 0xfd, 0x3f, 0x1d, 0xdb, 0x6f, 0x83, 0x01, 0x5c, 0x03, 0x00}; + 0xdc, 0xb3, 0x37, 0xb7, 0x6d, 0x23, 0xff, 0x7f, 0x3f, 0x05, 0xc3, 0xe4, 0x52, 0x31, 0x21, 0x69, 0x92, 0xb2, 0x6c, + 0x45, 0xb2, 0xec, 0x6b, 0xf3, 0x98, 0x4b, 0xc7, 0x6d, 0x3a, 0x89, 0x9b, 0xb9, 0xab, 0xeb, 0xb1, 0x28, 0x09, 0x92, + 0x78, 0xa1, 0x48, 0x0d, 0x49, 0xf9, 0x51, 0x85, 0xf7, 0x59, 0xee, 0xb3, 0xdc, 0x27, 0xfb, 0xcd, 0xee, 0x02, 0x20, + 0xf8, 0xd0, 0xc3, 0x4d, 0x7a, 0xf7, 0x9b, 0x36, 0x89, 0x08, 0x02, 0x4b, 0x60, 0x01, 0x2c, 0x16, 0xfb, 0xf4, 0x67, + 0x5c, 0xf6, 0x62, 0xb6, 0xd8, 0x7e, 0x9f, 0xfb, 0xfc, 0x99, 0xd9, 0xb8, 0x24, 0x81, 0xe1, 0xb3, 0xb3, 0x78, 0x36, + 0x0b, 0x59, 0x4b, 0x17, 0xc9, 0x43, 0x74, 0x53, 0x7e, 0xe6, 0xec, 0x91, 0x23, 0x22, 0x76, 0x1a, 0xf9, 0xa6, 0xad, + 0x25, 0x46, 0xcc, 0x64, 0x48, 0x3b, 0xe2, 0x5c, 0x51, 0x36, 0x7b, 0x83, 0xea, 0x0d, 0x3e, 0x2f, 0xc5, 0xd6, 0xb5, + 0x26, 0xf1, 0x6a, 0x14, 0x32, 0x0b, 0x97, 0x3b, 0x7c, 0x72, 0x3d, 0x5a, 0x8d, 0x46, 0x90, 0xa5, 0xe5, 0x91, 0x63, + 0x42, 0xdc, 0x99, 0x38, 0xc5, 0xfb, 0x60, 0x6e, 0xf4, 0x61, 0x50, 0x76, 0x56, 0xed, 0x3e, 0xd8, 0x8a, 0x80, 0xa8, + 0x87, 0x3e, 0x90, 0xc1, 0xdd, 0xaf, 0x61, 0xd7, 0x0e, 0xf4, 0x0f, 0xb0, 0xfa, 0x52, 0xbd, 0xdf, 0xb4, 0xf5, 0x07, + 0x97, 0xfa, 0x07, 0xc4, 0x31, 0x66, 0x2f, 0x7e, 0x49, 0xab, 0x57, 0x37, 0x75, 0x52, 0x7a, 0xaf, 0x30, 0x8f, 0x01, + 0x08, 0x7d, 0x5f, 0x05, 0xfe, 0x2c, 0x8a, 0xd3, 0x2c, 0x18, 0xeb, 0x57, 0xfd, 0xb7, 0x41, 0xeb, 0x72, 0x91, 0xb5, + 0x8c, 0x2b, 0x73, 0x9c, 0xa9, 0x29, 0x50, 0x04, 0xc1, 0xc4, 0x0c, 0x28, 0x9b, 0x2a, 0xa9, 0x3b, 0x68, 0x6b, 0x45, + 0x41, 0x9a, 0xb1, 0xd2, 0x38, 0x1b, 0x40, 0xbd, 0x4a, 0x3e, 0x15, 0x4c, 0x0c, 0xa5, 0x63, 0x4b, 0xa3, 0x4f, 0x37, + 0x95, 0x97, 0xab, 0x35, 0x1e, 0xe5, 0x59, 0x71, 0x5a, 0x62, 0x0c, 0x60, 0xe1, 0x38, 0x43, 0xcf, 0x8f, 0x54, 0xa3, + 0xcf, 0xd2, 0xb9, 0x3b, 0xfc, 0xae, 0xcc, 0x17, 0xc0, 0xf9, 0x0d, 0x16, 0x17, 0x51, 0x9c, 0x69, 0x10, 0xd8, 0x06, + 0xbe, 0x38, 0xac, 0x1a, 0x89, 0x71, 0xa8, 0x2d, 0x23, 0xe7, 0xc4, 0xe0, 0x7b, 0x3c, 0xfc, 0x5a, 0x3c, 0xbc, 0x59, + 0x29, 0x82, 0x05, 0x5d, 0x16, 0x22, 0x98, 0xc0, 0x2c, 0x3e, 0x8f, 0x6f, 0xab, 0x7a, 0x90, 0x97, 0xc3, 0xdd, 0x67, + 0x6f, 0x4b, 0xb0, 0xc9, 0x22, 0xab, 0x5f, 0x8b, 0x27, 0x26, 0x15, 0x8c, 0x4e, 0x65, 0x4f, 0xa1, 0xe1, 0x87, 0xe0, + 0x61, 0x32, 0xb0, 0x13, 0xc3, 0xb3, 0x00, 0x48, 0x12, 0x3f, 0xa6, 0x87, 0xf9, 0xb5, 0x48, 0x9d, 0x2c, 0x12, 0x17, + 0x2b, 0x87, 0x33, 0x50, 0xd7, 0x68, 0xb9, 0xca, 0x30, 0xd4, 0x2e, 0x74, 0x80, 0xe5, 0xba, 0x86, 0xa1, 0x3b, 0x81, + 0x4a, 0x17, 0x6c, 0x62, 0xae, 0x6b, 0xc1, 0xa4, 0x5e, 0xc6, 0x99, 0x5e, 0x20, 0x5e, 0x48, 0xdf, 0x51, 0x50, 0x05, + 0x8f, 0x09, 0x1f, 0xc6, 0xd8, 0x2c, 0xe2, 0xd4, 0xb7, 0xc6, 0xa8, 0xd0, 0x69, 0xa0, 0x0c, 0x63, 0x82, 0xd3, 0x6f, + 0x85, 0x8d, 0x83, 0x85, 0xf0, 0x9b, 0xa5, 0x61, 0x0e, 0x9f, 0xac, 0xa3, 0xfc, 0xec, 0xc9, 0x3a, 0xcd, 0x07, 0x4f, + 0xd6, 0xbe, 0xb4, 0x15, 0xd0, 0x2f, 0x74, 0x32, 0x14, 0x18, 0x22, 0x1a, 0x86, 0xf9, 0x75, 0xe1, 0xb9, 0x53, 0x8c, + 0x17, 0x56, 0x19, 0x95, 0x6b, 0xa8, 0xba, 0x1f, 0x70, 0x05, 0xfd, 0x32, 0x09, 0x16, 0x7e, 0x72, 0x4f, 0xfa, 0x7c, + 0x53, 0x55, 0xfa, 0x1b, 0xba, 0x46, 0x84, 0x9e, 0x10, 0x40, 0x34, 0x5f, 0xd7, 0xfe, 0x2a, 0xcb, 0x18, 0x1f, 0xad, + 0x54, 0x6a, 0xc2, 0xb7, 0xae, 0xf5, 0xe7, 0xcc, 0x9e, 0xb0, 0xcc, 0x0f, 0x42, 0x6a, 0xd2, 0x17, 0xd9, 0xea, 0x6b, + 0xc3, 0x4b, 0xcb, 0xc3, 0x8b, 0xca, 0xeb, 0x07, 0x07, 0x43, 0x47, 0x00, 0xf5, 0x1b, 0x47, 0x86, 0x59, 0xac, 0x9a, + 0x67, 0x94, 0xde, 0xfd, 0x57, 0xa7, 0x83, 0xc1, 0x74, 0x44, 0x30, 0x1d, 0x2c, 0x1a, 0xc7, 0x13, 0xf6, 0xcb, 0xfb, + 0xb7, 0x32, 0x6d, 0x16, 0x48, 0x80, 0x86, 0x7c, 0x61, 0xa6, 0xc8, 0x3f, 0x24, 0xc8, 0x3b, 0x50, 0x82, 0x2b, 0x4d, + 0x2e, 0xa1, 0x24, 0xd7, 0xb5, 0x33, 0xea, 0x3b, 0x9b, 0x50, 0xaf, 0x07, 0x31, 0xb6, 0x4a, 0xf2, 0x93, 0x03, 0xaa, + 0x4d, 0xa7, 0x1d, 0x55, 0x02, 0x34, 0x24, 0x30, 0xc2, 0x02, 0x0b, 0x90, 0xe1, 0x73, 0xe0, 0x16, 0x17, 0x0a, 0x7b, + 0x81, 0x72, 0x76, 0xf7, 0xac, 0xcc, 0xaa, 0x60, 0x2b, 0xfd, 0xf4, 0x04, 0x73, 0x76, 0xc1, 0x79, 0x0d, 0x51, 0x3e, + 0x4e, 0x0e, 0xe8, 0x51, 0xab, 0xec, 0x88, 0x02, 0x88, 0xb8, 0xda, 0xf5, 0x38, 0x80, 0x07, 0x6d, 0x15, 0x48, 0x11, + 0x0f, 0xa5, 0x7e, 0xae, 0x6b, 0x0b, 0xce, 0x1a, 0xf1, 0x70, 0x42, 0x10, 0x6b, 0xc0, 0x81, 0xbd, 0xab, 0x6b, 0x0b, + 0xff, 0x0e, 0x47, 0x2e, 0xde, 0xf8, 0x77, 0x2d, 0x97, 0xbf, 0x2a, 0xf6, 0x5a, 0x5a, 0xde, 0x6b, 0x63, 0x3e, 0xb9, + 0xe0, 0x48, 0x20, 0x6f, 0xd6, 0x73, 0x54, 0xd0, 0x36, 0x4c, 0xee, 0x5c, 0x4c, 0xee, 0x64, 0xc3, 0xe4, 0x4e, 0xb6, + 0x4c, 0x6e, 0xc8, 0x27, 0x52, 0x93, 0xa8, 0x4b, 0xd0, 0x39, 0x4c, 0x22, 0x8f, 0x33, 0x1a, 0x3d, 0xbe, 0xcf, 0x10, + 0x4f, 0x56, 0x1a, 0x82, 0x71, 0xd4, 0x06, 0x5c, 0x35, 0xe1, 0x45, 0x41, 0x44, 0x7d, 0xe0, 0x72, 0xd7, 0x89, 0x71, + 0x43, 0x0e, 0xce, 0x56, 0x58, 0x1d, 0x2f, 0xac, 0x52, 0xca, 0x2f, 0xde, 0x9a, 0x6f, 0x18, 0xe9, 0x7c, 0xcb, 0x48, + 0xc7, 0xa5, 0xad, 0xcb, 0x87, 0x4d, 0x9b, 0x50, 0x1d, 0x14, 0xac, 0x41, 0x30, 0x18, 0xc5, 0x25, 0x53, 0x5e, 0x87, + 0x9b, 0x69, 0xac, 0xb2, 0xa2, 0x96, 0x7e, 0x9a, 0xde, 0xc6, 0x09, 0x68, 0x5c, 0x00, 0xcc, 0xc3, 0x96, 0xd4, 0x22, + 0x88, 0x78, 0x30, 0x97, 0x8d, 0x8b, 0xa9, 0x78, 0xaf, 0x2e, 0x29, 0xaf, 0xd3, 0xa1, 0x1a, 0x4b, 0x3f, 0xcb, 0x58, + 0x82, 0x48, 0xf7, 0x21, 0xea, 0xf7, 0xff, 0x93, 0x65, 0xd6, 0x40, 0x43, 0x42, 0x85, 0xaa, 0x23, 0x85, 0x5e, 0x02, + 0x6f, 0x95, 0x88, 0x83, 0x58, 0x09, 0x0c, 0x97, 0x48, 0xc4, 0xff, 0x84, 0xdb, 0xb5, 0x95, 0x28, 0xae, 0x4b, 0xee, + 0x91, 0x61, 0x2f, 0xfd, 0xc9, 0x07, 0x50, 0xec, 0xb5, 0x3c, 0x13, 0x8c, 0x74, 0xd5, 0x30, 0x70, 0x09, 0x31, 0x7b, + 0xe3, 0x82, 0x48, 0x22, 0x95, 0xe4, 0x26, 0x50, 0xe0, 0x3d, 0xe9, 0x5b, 0xd3, 0xab, 0xb5, 0x97, 0x1f, 0xcc, 0x02, + 0xa3, 0x46, 0x35, 0x81, 0xb4, 0x85, 0x83, 0x53, 0x79, 0xe7, 0x0a, 0x4d, 0xf7, 0xc8, 0x00, 0xc9, 0xef, 0x25, 0xe4, + 0x33, 0x75, 0xc4, 0x85, 0x76, 0x98, 0xc0, 0xa9, 0x75, 0xe9, 0x5c, 0xe5, 0x4f, 0x67, 0xf8, 0xcb, 0xbd, 0xca, 0x9f, + 0x8e, 0xf0, 0x97, 0x77, 0x85, 0x99, 0xeb, 0x1a, 0x2e, 0xf2, 0xca, 0x98, 0xf5, 0xd3, 0xd2, 0x7a, 0x22, 0xfb, 0xb3, + 0x07, 0x2c, 0x1b, 0x3e, 0xc1, 0x8f, 0x9f, 0xac, 0x53, 0xf0, 0xb8, 0x54, 0xc7, 0x10, 0xd9, 0x89, 0x91, 0x37, 0x96, + 0xcf, 0x36, 0x94, 0x8f, 0x8c, 0xff, 0xf2, 0xc1, 0x8f, 0xab, 0x24, 0x2e, 0xce, 0x94, 0xb2, 0x18, 0xe2, 0x7a, 0x14, + 0x44, 0x7e, 0x72, 0x7f, 0x4d, 0xd7, 0x8b, 0x96, 0xe0, 0xdd, 0xa5, 0x78, 0x85, 0xd8, 0xcb, 0xb2, 0xba, 0x2b, 0x53, + 0x04, 0xbc, 0xf7, 0xfc, 0xa0, 0x1f, 0xfc, 0x3d, 0x51, 0xd8, 0xb6, 0xd2, 0x05, 0x94, 0x4f, 0x48, 0xe9, 0x43, 0xd7, + 0x4f, 0xd6, 0x2d, 0x56, 0x07, 0x53, 0x19, 0x6d, 0x85, 0x2f, 0x84, 0xe9, 0xc1, 0xcb, 0xec, 0x62, 0x12, 0xf4, 0x50, + 0x9f, 0x35, 0x8a, 0xef, 0xac, 0x27, 0xeb, 0xec, 0x4c, 0x5f, 0xf8, 0xc9, 0x27, 0x36, 0xb1, 0xc6, 0x41, 0x32, 0x0e, + 0x99, 0xde, 0xd3, 0x47, 0xa1, 0x1f, 0x7d, 0xe2, 0x8f, 0x56, 0xbc, 0xca, 0x50, 0x43, 0xbd, 0xf3, 0xee, 0x2b, 0x70, + 0x42, 0x22, 0x3b, 0x64, 0x56, 0x1b, 0xb0, 0xa0, 0xbd, 0x94, 0x02, 0xaf, 0x82, 0x51, 0x2c, 0x6a, 0x99, 0x60, 0x60, + 0x09, 0x4a, 0x73, 0xf0, 0x58, 0x35, 0x75, 0x9c, 0x2f, 0xdd, 0x54, 0x87, 0x4a, 0xc2, 0x4a, 0x99, 0x72, 0xf1, 0x1a, + 0x21, 0xfc, 0xf1, 0xcf, 0x51, 0x32, 0xec, 0xfd, 0x3f, 0x27, 0xa1, 0x7c, 0xd9, 0x08, 0xa1, 0xd4, 0x22, 0x4f, 0x89, + 0x07, 0x7c, 0x9c, 0x33, 0x98, 0x9b, 0x3f, 0xad, 0x36, 0xf6, 0xd3, 0x74, 0xb5, 0x60, 0x13, 0xd2, 0x0c, 0x9e, 0x15, + 0x9d, 0x2a, 0xdf, 0x2c, 0xd4, 0x8e, 0xfd, 0xb6, 0xf2, 0x8e, 0x0f, 0x5f, 0x82, 0xc5, 0x02, 0x30, 0x94, 0xf1, 0x74, + 0xaa, 0x17, 0x77, 0xfc, 0x1d, 0xcd, 0xdc, 0xc3, 0xdf, 0x56, 0x6f, 0x5e, 0x3b, 0x6f, 0x64, 0xe3, 0x08, 0x18, 0x63, + 0xa1, 0x7e, 0xe5, 0x7c, 0xb1, 0xd2, 0x5f, 0x31, 0xa2, 0xa9, 0x1f, 0x6d, 0x1e, 0xce, 0x65, 0x69, 0x89, 0x2f, 0x19, + 0x9b, 0x00, 0xc3, 0x6d, 0xd6, 0x4a, 0xaf, 0x43, 0x76, 0xc3, 0xa4, 0x6a, 0xb7, 0xfe, 0xb1, 0x86, 0x16, 0x18, 0x7b, + 0x8e, 0xab, 0x8c, 0x39, 0x57, 0xa7, 0x0c, 0x69, 0x88, 0x63, 0xe0, 0x23, 0x57, 0xb7, 0x58, 0x65, 0x4b, 0x0d, 0x4d, + 0x5d, 0xe9, 0xc0, 0xc6, 0x9e, 0x9d, 0x6d, 0x28, 0xef, 0x61, 0xe2, 0xe9, 0xe6, 0xbe, 0x99, 0xae, 0xd1, 0x83, 0x58, + 0xdd, 0x1c, 0x4f, 0x21, 0xec, 0xbc, 0x56, 0x21, 0x0e, 0xd9, 0x84, 0xb1, 0x26, 0x21, 0x99, 0x4e, 0xd2, 0x17, 0x61, + 0xed, 0x88, 0x66, 0xbf, 0x42, 0x0e, 0xd5, 0x38, 0x37, 0x5a, 0x79, 0xe4, 0x23, 0x4c, 0xe8, 0x1a, 0xb1, 0x34, 0xdd, + 0x88, 0x30, 0x39, 0xe9, 0xa6, 0x5e, 0xd4, 0x2e, 0xe3, 0xa3, 0x28, 0x37, 0x1d, 0x13, 0x58, 0x02, 0x1c, 0x60, 0xf5, + 0x5b, 0x78, 0xbc, 0x5c, 0x2f, 0xb8, 0xbd, 0x4a, 0x32, 0x1b, 0xe9, 0xdc, 0x96, 0x60, 0xd3, 0xfb, 0x5b, 0x9d, 0x77, + 0xaa, 0x74, 0x4c, 0x37, 0x76, 0xad, 0x55, 0x22, 0xbd, 0x35, 0x71, 0x11, 0x02, 0x10, 0x7d, 0xaa, 0xd0, 0x57, 0x36, + 0x9d, 0xb2, 0x71, 0x96, 0x1a, 0x42, 0x78, 0x24, 0xa3, 0xc7, 0x82, 0xd7, 0xd0, 0xa3, 0x81, 0xfe, 0x13, 0xf8, 0xd0, + 0x8b, 0x20, 0x4b, 0xbc, 0x43, 0xe2, 0xce, 0xd4, 0x8c, 0x26, 0x82, 0x58, 0x46, 0x11, 0xff, 0x0a, 0x24, 0x07, 0x6f, + 0x28, 0xc7, 0xae, 0xf1, 0xf3, 0xa7, 0x58, 0x17, 0xb1, 0xb4, 0x6a, 0xd9, 0x4e, 0x8a, 0xb6, 0x6d, 0xdf, 0xb5, 0xfb, + 0xa6, 0xe3, 0x3a, 0xb9, 0x6e, 0x82, 0xef, 0xd6, 0xa7, 0x7d, 0x37, 0x3d, 0xb6, 0x6a, 0x43, 0xab, 0x55, 0xf4, 0x90, + 0x76, 0x9e, 0xfb, 0xc2, 0xd5, 0x4d, 0x32, 0x99, 0x53, 0x68, 0xdb, 0x38, 0xbe, 0x61, 0xc9, 0x17, 0x0f, 0xa5, 0x0c, + 0x7c, 0xbf, 0xfe, 0x1c, 0xb9, 0x0e, 0x10, 0xe1, 0x2c, 0x5e, 0x3e, 0x60, 0x08, 0x6d, 0xdd, 0xd4, 0xc7, 0x61, 0x9c, + 0x32, 0x75, 0x0c, 0x24, 0x04, 0xf9, 0xc2, 0x41, 0xfc, 0xfc, 0xfe, 0xf5, 0x87, 0x0f, 0xba, 0x89, 0x99, 0x40, 0x53, + 0x15, 0x3a, 0x5f, 0x50, 0x3b, 0xa8, 0x7f, 0xe3, 0xba, 0xa3, 0x13, 0x86, 0x2e, 0xb5, 0xe5, 0x35, 0x47, 0x65, 0xb5, + 0x25, 0xc7, 0x4f, 0x1e, 0xfe, 0x65, 0xba, 0x89, 0xee, 0x35, 0xae, 0x06, 0xda, 0xb0, 0xfd, 0x78, 0x2b, 0x95, 0x2c, + 0x82, 0xe8, 0xba, 0xa1, 0xd4, 0xbf, 0x6b, 0x28, 0x85, 0xab, 0x5c, 0x8d, 0x56, 0xad, 0xe2, 0x85, 0xc2, 0x1a, 0x40, + 0x22, 0xe7, 0x5d, 0xe8, 0x52, 0xee, 0x53, 0x5f, 0xd0, 0x69, 0x1e, 0xc9, 0xbd, 0xda, 0xeb, 0x86, 0x62, 0x7e, 0x09, + 0x92, 0xb8, 0x1d, 0x87, 0x60, 0xf0, 0xc7, 0x54, 0xad, 0x5c, 0x99, 0x6d, 0x94, 0xe6, 0xba, 0x0a, 0x10, 0x62, 0x6f, + 0xaf, 0x33, 0xb6, 0x58, 0xb2, 0xc4, 0xcf, 0x56, 0x09, 0xbb, 0x0e, 0xe3, 0xdb, 0x47, 0x85, 0x39, 0xfd, 0x8e, 0xca, + 0xf3, 0x60, 0x36, 0x97, 0xb5, 0xcf, 0x5a, 0x6c, 0x20, 0x27, 0x70, 0xeb, 0x07, 0xf2, 0xff, 0xfc, 0xdb, 0xb6, 0xff, + 0xf3, 0xef, 0x9d, 0x55, 0x01, 0x7c, 0x3e, 0x34, 0xb3, 0xc1, 0x1e, 0xeb, 0xa2, 0xf9, 0x4b, 0x65, 0x9c, 0x37, 0xd7, + 0xa9, 0x4d, 0x02, 0xbc, 0xaf, 0x4d, 0x41, 0xad, 0xb0, 0xbc, 0x6e, 0x1e, 0xd4, 0x31, 0x18, 0xd7, 0xce, 0x9e, 0x41, + 0xa5, 0x2f, 0xea, 0xda, 0xd0, 0xe8, 0xed, 0x35, 0x23, 0x7f, 0x1c, 0xc3, 0xbb, 0xc6, 0xf0, 0x85, 0xdd, 0xe7, 0x72, + 0xc9, 0x97, 0xc3, 0xa1, 0xcc, 0x2d, 0xa7, 0x36, 0x05, 0x13, 0xff, 0xb3, 0x5a, 0x09, 0x3f, 0x3c, 0x7b, 0x8e, 0x41, + 0xbe, 0xf7, 0x83, 0x97, 0x43, 0x34, 0x46, 0x3b, 0x19, 0x25, 0x05, 0xb3, 0xb2, 0x91, 0xb4, 0x91, 0x31, 0x79, 0x0d, + 0x68, 0x8d, 0xae, 0x41, 0x29, 0x26, 0x1c, 0xcb, 0x87, 0x86, 0xf9, 0x72, 0xc8, 0x05, 0x4b, 0xdc, 0xfe, 0xb5, 0x57, + 0x5d, 0xda, 0x5c, 0x2c, 0x5b, 0x42, 0xba, 0xa9, 0x91, 0xfe, 0x07, 0x2b, 0xb3, 0x42, 0x8e, 0x87, 0x02, 0x7e, 0x90, + 0x28, 0x0c, 0x73, 0xcc, 0x77, 0xf2, 0x6e, 0x93, 0x8d, 0xd8, 0xcf, 0xbb, 0x6d, 0xc4, 0x2e, 0xf6, 0xb2, 0x11, 0xfb, + 0xf9, 0xab, 0xdb, 0x88, 0xbd, 0x53, 0x6d, 0xc4, 0x60, 0x12, 0x5f, 0xb3, 0xbd, 0x0c, 0xb7, 0x84, 0xd5, 0x46, 0x7c, + 0x9b, 0x0e, 0x5c, 0xce, 0xd2, 0xa6, 0xe3, 0x39, 0x03, 0x19, 0x01, 0x9f, 0x95, 0x30, 0x9e, 0x81, 0x11, 0xd7, 0x9f, + 0x6f, 0x6e, 0x15, 0xc6, 0x33, 0xd5, 0xd8, 0x2a, 0xe2, 0x11, 0x5f, 0x8b, 0x28, 0x4e, 0x64, 0xe0, 0xe4, 0x98, 0x22, + 0xe6, 0x93, 0x75, 0x68, 0x28, 0x59, 0xad, 0xa5, 0xf5, 0x9a, 0x27, 0x4c, 0xa0, 0x7a, 0x68, 0x3d, 0x25, 0x1b, 0x7a, + 0xcf, 0x45, 0x6c, 0x0b, 0x15, 0x82, 0xb4, 0x12, 0xa6, 0x38, 0x11, 0x6b, 0xfd, 0xb7, 0x3b, 0xf7, 0xfb, 0x4b, 0xb7, + 0xdf, 0x76, 0xc1, 0x39, 0x1b, 0x6e, 0x98, 0x58, 0xe0, 0xf4, 0xdb, 0x6d, 0x28, 0xb8, 0x55, 0x0a, 0x3c, 0x28, 0x08, + 0x94, 0x82, 0x0e, 0x14, 0x8c, 0x95, 0x82, 0x23, 0x28, 0x98, 0x28, 0x05, 0xc7, 0x50, 0x70, 0xa3, 0xe7, 0x97, 0x91, + 0xec, 0xee, 0xb1, 0x71, 0x65, 0xd2, 0xa5, 0x42, 0x94, 0x1d, 0x9b, 0x2e, 0x58, 0x4d, 0xf9, 0xb3, 0x5e, 0x6c, 0x92, + 0x74, 0xb1, 0x97, 0x98, 0xb7, 0x73, 0x46, 0x81, 0xa2, 0x5f, 0xe1, 0x99, 0x63, 0x67, 0x31, 0xd8, 0x4d, 0x8b, 0x00, + 0x0c, 0x02, 0x0f, 0x9a, 0x6e, 0x80, 0xc0, 0xa8, 0x2f, 0x67, 0x4e, 0x04, 0xb1, 0x50, 0xe6, 0xb2, 0x78, 0x47, 0x9f, + 0xb3, 0xe4, 0x12, 0x28, 0x2c, 0x4e, 0x5a, 0xaa, 0x54, 0xf2, 0x6b, 0xd8, 0x1d, 0xbc, 0x62, 0xa3, 0xd5, 0x4c, 0x3b, + 0x8f, 0x67, 0x3b, 0x4d, 0x08, 0xd4, 0x57, 0xd0, 0x4b, 0x9d, 0xd4, 0x2f, 0x96, 0x58, 0x96, 0xfc, 0x5b, 0xf4, 0x98, + 0x97, 0xeb, 0x67, 0xd0, 0x37, 0x2d, 0x23, 0x03, 0x16, 0xf8, 0x0e, 0xe0, 0x48, 0xd1, 0xe1, 0x9f, 0x03, 0x9e, 0x95, + 0xe7, 0x0b, 0x5f, 0xe9, 0xcf, 0xe9, 0x8f, 0x2c, 0x4d, 0xfd, 0x99, 0xa8, 0x5f, 0xef, 0x27, 0x18, 0xed, 0xc8, 0xfb, + 0x17, 0x22, 0x10, 0x24, 0x79, 0x41, 0xcd, 0x36, 0x23, 0x89, 0x6f, 0x35, 0xb0, 0xfe, 0x81, 0x05, 0x55, 0xd8, 0x29, + 0x04, 0x36, 0x4c, 0x61, 0xd9, 0xa2, 0x00, 0x36, 0xff, 0x0d, 0x0b, 0xab, 0x85, 0x99, 0x3f, 0xab, 0x16, 0xd1, 0x3a, + 0xc8, 0xd5, 0xbe, 0x49, 0x85, 0x7e, 0xa9, 0xf0, 0x4b, 0x34, 0xd4, 0x61, 0x3c, 0xfb, 0x53, 0xd5, 0xd3, 0x5b, 0xcc, + 0x0a, 0x3e, 0x44, 0x66, 0x90, 0x0d, 0x6d, 0xc4, 0xb1, 0x66, 0x03, 0x0a, 0x7b, 0x51, 0x36, 0xb7, 0xd0, 0xb5, 0xac, + 0xe5, 0x45, 0x86, 0x69, 0xe3, 0xdc, 0xae, 0xab, 0x0e, 0xb5, 0xbd, 0x64, 0x36, 0xf2, 0x5b, 0xae, 0x77, 0x6c, 0x8a, + 0x3f, 0xb6, 0xd3, 0x31, 0x72, 0x84, 0xa0, 0x4d, 0x82, 0x9b, 0xf5, 0x34, 0x8e, 0x32, 0x6b, 0xea, 0x2f, 0x82, 0xf0, + 0xbe, 0xb7, 0x88, 0xa3, 0x38, 0x5d, 0xfa, 0x63, 0xd6, 0x2f, 0x2e, 0xd4, 0x7d, 0x0c, 0xd5, 0xc0, 0xbd, 0x05, 0x5d, + 0xdb, 0x4b, 0xd8, 0x82, 0x5a, 0xcb, 0x48, 0x0c, 0xd3, 0x90, 0xdd, 0xe5, 0xfc, 0xf3, 0xa5, 0xca, 0x54, 0x15, 0x97, + 0x1c, 0xb5, 0x00, 0x8e, 0x94, 0x87, 0x79, 0x80, 0xe0, 0x46, 0xfd, 0xa5, 0x3f, 0xc1, 0xc8, 0x84, 0xb6, 0xd7, 0x49, + 0xd8, 0x42, 0xb3, 0x3b, 0x1b, 0x81, 0x27, 0xf1, 0xed, 0x29, 0xf4, 0x16, 0x1b, 0x5b, 0x29, 0x0b, 0xa7, 0xf8, 0xc6, + 0x42, 0xcf, 0x12, 0x01, 0xc7, 0xc2, 0x8b, 0x38, 0x40, 0x63, 0x8b, 0x3e, 0xbc, 0xee, 0x79, 0x9a, 0xd3, 0x5f, 0x04, + 0x91, 0x45, 0xc3, 0x39, 0x76, 0x96, 0x0a, 0x2c, 0x15, 0x7f, 0xc6, 0x1a, 0xab, 0xbb, 0x9a, 0xd3, 0x87, 0xcb, 0xda, + 0x34, 0x8c, 0x6f, 0x7b, 0xf3, 0x60, 0x32, 0x61, 0x51, 0x1f, 0xfb, 0x2c, 0x0b, 0x59, 0x18, 0x06, 0xcb, 0x34, 0x48, + 0xfb, 0x0b, 0xff, 0x8e, 0x43, 0x3d, 0xdc, 0x04, 0xb5, 0xcd, 0xa1, 0xb6, 0xf7, 0x86, 0xaa, 0x80, 0x01, 0x2f, 0x16, + 0x82, 0xc3, 0xbb, 0xd6, 0xd1, 0x9c, 0xca, 0x38, 0xf7, 0x86, 0xba, 0x4c, 0xd8, 0x7a, 0xe1, 0x27, 0xb3, 0x20, 0xea, + 0x39, 0xb9, 0x7d, 0xb3, 0xa6, 0x85, 0xf1, 0xb8, 0xdb, 0xed, 0xe6, 0xf6, 0x44, 0x3c, 0x39, 0x93, 0x49, 0x6e, 0x8f, + 0xc5, 0xd3, 0x74, 0xea, 0x38, 0xd3, 0x69, 0x6e, 0x07, 0xa2, 0xa0, 0xed, 0x8d, 0x27, 0x6d, 0x2f, 0xb7, 0x6f, 0x95, + 0x1a, 0xb9, 0xcd, 0xf8, 0x53, 0xc2, 0x26, 0x7d, 0x5c, 0x48, 0x64, 0x56, 0xda, 0x3b, 0x76, 0x9c, 0x1c, 0x29, 0xc0, + 0x65, 0x89, 0x36, 0xa1, 0xac, 0xe7, 0x6a, 0xbd, 0x77, 0x4d, 0xad, 0xf8, 0xdc, 0x78, 0xdc, 0x58, 0x6f, 0xe2, 0x27, + 0x9f, 0xae, 0x34, 0x65, 0x14, 0xbe, 0x4f, 0xd5, 0xd6, 0x02, 0x0d, 0xd6, 0x5d, 0x0f, 0x42, 0x76, 0xf5, 0x47, 0x71, + 0x02, 0x7b, 0x36, 0xf1, 0x27, 0xc1, 0x2a, 0xed, 0xb9, 0xde, 0xf2, 0x4e, 0x14, 0xf1, 0xb5, 0x5e, 0x14, 0xe0, 0xde, + 0xeb, 0xa5, 0x71, 0x18, 0x4c, 0x44, 0xd1, 0xa6, 0xbd, 0xe4, 0x7a, 0x46, 0x1f, 0x1d, 0xd6, 0x03, 0x0c, 0xbb, 0xe0, + 0x87, 0xa1, 0x66, 0xb7, 0x53, 0x8d, 0xf9, 0x29, 0xca, 0x97, 0x35, 0x27, 0x25, 0xbc, 0xa0, 0x73, 0xba, 0x7b, 0xb8, + 0xbc, 0x93, 0x6b, 0xde, 0x3d, 0x5a, 0xde, 0xe5, 0x7f, 0x5d, 0xb0, 0x49, 0xe0, 0x6b, 0xad, 0x62, 0x35, 0xb9, 0x0e, + 0xc8, 0xa0, 0x8d, 0xf5, 0x86, 0x65, 0x2a, 0xb6, 0x05, 0x84, 0x36, 0x7c, 0x14, 0x2c, 0x96, 0x71, 0x92, 0xf9, 0x51, + 0x96, 0xe7, 0xc3, 0xab, 0x3c, 0xef, 0x5f, 0x04, 0xad, 0xcb, 0x7f, 0xb4, 0xe8, 0x9c, 0x26, 0x9d, 0x4d, 0x6e, 0x5c, + 0x99, 0xaf, 0x99, 0x6a, 0x33, 0x02, 0xc7, 0x18, 0xda, 0x8b, 0xa8, 0x95, 0xe9, 0x94, 0xac, 0x57, 0x26, 0x24, 0xcb, + 0xea, 0x64, 0x83, 0x52, 0xae, 0x82, 0x27, 0x10, 0x54, 0x78, 0xcd, 0x06, 0x17, 0x8a, 0xfd, 0x09, 0x30, 0x2b, 0x58, + 0x99, 0xfc, 0x0a, 0x9e, 0x6c, 0xe2, 0x19, 0xbf, 0xdb, 0xcd, 0x33, 0xfe, 0x9a, 0xed, 0xc3, 0x33, 0x7e, 0xf7, 0xd5, + 0x79, 0xc6, 0x27, 0x75, 0xbf, 0x82, 0xb7, 0xf1, 0x40, 0x97, 0x1a, 0x06, 0x38, 0x9a, 0x12, 0x8a, 0xd8, 0xf3, 0xf6, + 0x0f, 0xbb, 0x01, 0x08, 0x68, 0x94, 0x83, 0x8e, 0x4e, 0x6e, 0x90, 0xc7, 0xbe, 0x8b, 0x06, 0x7f, 0x4f, 0xd4, 0xe7, + 0xe9, 0x74, 0xf0, 0x2a, 0x56, 0x0a, 0xe4, 0x13, 0x37, 0xbe, 0x28, 0x45, 0x57, 0xa0, 0x37, 0xc2, 0x0a, 0x13, 0xf3, + 0x4f, 0x80, 0x73, 0x36, 0x59, 0x1d, 0x4f, 0xa4, 0xf5, 0x59, 0xbf, 0xdc, 0x85, 0x96, 0x34, 0xf9, 0x14, 0x2e, 0x38, + 0x35, 0x51, 0xe2, 0x8c, 0x65, 0xdc, 0x67, 0xf6, 0xfb, 0xfb, 0xb7, 0x93, 0xd6, 0xdb, 0xd8, 0xc8, 0x83, 0xf4, 0x5d, + 0xd5, 0x01, 0x86, 0xeb, 0x7e, 0x06, 0xea, 0x70, 0x72, 0x6e, 0x41, 0xa6, 0x26, 0x98, 0x86, 0xd7, 0xd4, 0xfc, 0xac, + 0x34, 0xd2, 0x9e, 0xda, 0x90, 0x27, 0xba, 0xaa, 0x1d, 0xc6, 0xdc, 0xfb, 0x60, 0xcd, 0x39, 0x40, 0xcc, 0xdd, 0x85, + 0x7e, 0xc3, 0x13, 0x6a, 0x1e, 0x4c, 0xf2, 0xdc, 0xe8, 0x0b, 0x44, 0x28, 0x07, 0x2d, 0xdb, 0xc5, 0xc4, 0xa5, 0xb7, + 0xd2, 0xa6, 0x81, 0x6b, 0x08, 0x49, 0xfd, 0xf7, 0x16, 0x14, 0xea, 0x5c, 0x59, 0xc8, 0x71, 0xa6, 0x6b, 0x84, 0x3e, + 0x32, 0xb4, 0x50, 0x06, 0x04, 0x1a, 0x60, 0x89, 0x7f, 0xf1, 0x4a, 0x14, 0xd4, 0x6d, 0x38, 0x09, 0x39, 0x68, 0x11, + 0x00, 0x5e, 0xfe, 0x42, 0xae, 0x4d, 0x64, 0x87, 0xd7, 0xc1, 0x87, 0x5c, 0x97, 0xbc, 0x1f, 0x2e, 0xbf, 0xd3, 0x93, + 0x03, 0x68, 0x70, 0x5a, 0x31, 0x1c, 0xd8, 0x61, 0xa1, 0x08, 0xac, 0x44, 0x7a, 0x6b, 0xda, 0xe9, 0xad, 0xf6, 0x6c, + 0x2d, 0x22, 0x64, 0x64, 0xfe, 0xd2, 0x82, 0x2b, 0x3e, 0xd2, 0x5e, 0x4e, 0xf1, 0x94, 0x60, 0x1c, 0xfd, 0x55, 0x0a, + 0xb4, 0x11, 0x2f, 0xaa, 0x48, 0x7f, 0xfa, 0xe3, 0x55, 0x92, 0xc6, 0x49, 0x6f, 0x19, 0x07, 0x51, 0xc6, 0x92, 0x1c, + 0x51, 0x75, 0x89, 0xf8, 0x11, 0xe8, 0xb9, 0x5a, 0xc7, 0x4b, 0x7f, 0x1c, 0x64, 0xf7, 0x3d, 0x87, 0xb3, 0x14, 0x4e, + 0x9f, 0x73, 0x07, 0x4e, 0x63, 0xfd, 0x1e, 0xc7, 0xe6, 0x73, 0x64, 0xfc, 0x92, 0x3a, 0x3b, 0xa3, 0x2e, 0xf3, 0xbe, + 0xf2, 0x96, 0x62, 0x84, 0x00, 0xfb, 0xe1, 0x27, 0xd6, 0x0c, 0xa8, 0x3c, 0x4c, 0xb5, 0x33, 0x61, 0x33, 0x13, 0xa9, + 0x36, 0xc8, 0xe5, 0xc5, 0x1f, 0xbb, 0x63, 0x68, 0x4e, 0x73, 0x31, 0x70, 0x3c, 0xc6, 0x3e, 0x3d, 0xeb, 0xf9, 0x90, + 0x51, 0xcb, 0xdc, 0xa7, 0xe6, 0x88, 0x4d, 0xe3, 0x84, 0x51, 0x3c, 0x59, 0xb7, 0xbb, 0xbc, 0xdb, 0x1f, 0xfc, 0xf6, + 0xe1, 0x37, 0xc3, 0x89, 0xe2, 0xac, 0x25, 0x80, 0x19, 0x3b, 0xa0, 0xd5, 0xcf, 0x33, 0x60, 0x0d, 0x09, 0xf3, 0x63, + 0x0a, 0xdd, 0xd5, 0xd3, 0xf5, 0x7e, 0x63, 0xd8, 0xae, 0x65, 0xcc, 0xcf, 0xbc, 0x84, 0x85, 0x7e, 0x16, 0xdc, 0x08, + 0x9e, 0xb1, 0x7d, 0xb4, 0xbc, 0x13, 0x73, 0x8c, 0x07, 0xde, 0x03, 0x26, 0xa9, 0xd2, 0x15, 0x31, 0x49, 0xd5, 0x62, + 0x9c, 0xa4, 0x7e, 0x6d, 0x34, 0x22, 0x92, 0x45, 0xe5, 0xa4, 0xef, 0x2c, 0xef, 0xd4, 0x23, 0xba, 0x68, 0x26, 0x4f, + 0xea, 0x6a, 0x08, 0xb2, 0x45, 0x30, 0x99, 0x84, 0x2c, 0x2f, 0x4d, 0x74, 0x79, 0x2e, 0x15, 0xe4, 0x48, 0x3c, 0xf8, + 0xa3, 0x34, 0x0e, 0x57, 0x19, 0x6b, 0x46, 0x17, 0x21, 0xc7, 0x73, 0x0a, 0xe4, 0xe0, 0xef, 0x72, 0x5f, 0x3b, 0xc0, + 0x6e, 0xc3, 0x32, 0x71, 0xfa, 0x10, 0x71, 0xd8, 0x6a, 0x97, 0xbb, 0x0e, 0xaf, 0x64, 0xa7, 0xcd, 0x86, 0x81, 0x98, + 0x70, 0x2c, 0x11, 0xf5, 0xd6, 0x6c, 0x97, 0x97, 0xc9, 0xa8, 0xab, 0xb2, 0x28, 0x2f, 0x0f, 0xe6, 0xcf, 0xd9, 0x63, + 0x2f, 0x9a, 0xf7, 0xd8, 0x0b, 0xb1, 0xc7, 0xb6, 0xaf, 0xcc, 0xc7, 0x53, 0x17, 0xfe, 0xeb, 0x17, 0x03, 0xea, 0x39, + 0x5a, 0x7b, 0x79, 0xa7, 0xb9, 0xcb, 0x3b, 0xcd, 0xf2, 0x96, 0x77, 0x1a, 0x82, 0x46, 0x7b, 0x10, 0xd3, 0xf6, 0x0c, + 0xd3, 0xd1, 0xa0, 0x10, 0xfe, 0x38, 0xa5, 0x57, 0xee, 0x21, 0xbc, 0x83, 0x56, 0x9d, 0xfa, 0x3b, 0x6f, 0xfb, 0x56, + 0xa7, 0xbd, 0x24, 0x88, 0xb6, 0x61, 0x67, 0xfe, 0x68, 0xc4, 0x26, 0xbd, 0x69, 0x3c, 0x5e, 0xa5, 0xff, 0xe2, 0xfd, + 0xe7, 0x48, 0xdc, 0x4a, 0x08, 0x2a, 0x70, 0x44, 0x53, 0x50, 0x94, 0xdc, 0x30, 0x01, 0x61, 0x2d, 0xe7, 0xa9, 0x47, + 0xe1, 0x91, 0x3d, 0xfb, 0xb0, 0x61, 0x91, 0x37, 0x23, 0xfa, 0x4f, 0x9b, 0xa5, 0xcd, 0x24, 0xe6, 0x0b, 0xd0, 0xb2, + 0x15, 0x1d, 0x0f, 0xc7, 0x06, 0x9f, 0x4d, 0xa7, 0xdb, 0xdc, 0xdd, 0x4b, 0xf1, 0xa5, 0x2b, 0x71, 0xa8, 0xf0, 0x73, + 0x8b, 0x3b, 0xa6, 0x6c, 0x87, 0xba, 0x69, 0x8d, 0xd4, 0xa0, 0x6e, 0x39, 0x10, 0x8a, 0xba, 0x7b, 0x52, 0xf9, 0xc7, + 0x2f, 0x0e, 0xe1, 0x3f, 0xe2, 0xea, 0x7f, 0xcd, 0x9a, 0x18, 0xf5, 0xb7, 0x65, 0x4b, 0x70, 0x62, 0x95, 0x90, 0x11, + 0xdf, 0xbf, 0xfe, 0x74, 0xfa, 0xb0, 0x06, 0x7b, 0xd7, 0x26, 0x53, 0xaa, 0x6a, 0xed, 0xef, 0xe3, 0x18, 0x52, 0x77, + 0xd6, 0xab, 0x0b, 0xf4, 0x90, 0xb1, 0x7b, 0x36, 0x80, 0x46, 0xe2, 0x1e, 0x41, 0x5a, 0x7c, 0x1d, 0xdb, 0xd0, 0x55, + 0xe2, 0xf5, 0xa6, 0xab, 0xc4, 0xab, 0xdd, 0x57, 0x89, 0x1f, 0xf6, 0xba, 0x4a, 0xbc, 0xfa, 0xea, 0x57, 0x89, 0xd7, + 0xf5, 0xab, 0xc4, 0x45, 0x2c, 0xec, 0x67, 0xcd, 0xb7, 0x2b, 0xfe, 0xf3, 0x23, 0x29, 0xe5, 0xce, 0xe3, 0x41, 0xc7, + 0xa1, 0x90, 0xc7, 0x17, 0x7f, 0xf8, 0x62, 0x81, 0x0b, 0xf1, 0x3d, 0x9a, 0x93, 0x15, 0x57, 0x0b, 0x4e, 0xd9, 0xf1, + 0x3b, 0x4a, 0x71, 0x18, 0x47, 0xb3, 0x9f, 0x41, 0x29, 0x0b, 0xe2, 0xc0, 0x44, 0x79, 0x11, 0xa4, 0x3f, 0xc7, 0xcb, + 0xd5, 0xf2, 0x2d, 0xc0, 0xfa, 0x18, 0xa4, 0xc1, 0x28, 0x64, 0xd2, 0x13, 0x99, 0xcc, 0xdf, 0xb8, 0x4c, 0x1c, 0x2c, + 0x4e, 0xc5, 0x4f, 0xff, 0x4e, 0xfc, 0x44, 0x9b, 0x54, 0xfe, 0x9b, 0xec, 0xea, 0xf4, 0xe6, 0x8b, 0x88, 0x50, 0x02, + 0x2a, 0x9d, 0x7e, 0xf8, 0x65, 0xe4, 0x22, 0x36, 0x1a, 0x46, 0x29, 0xec, 0x1d, 0x36, 0xc2, 0x61, 0xb5, 0x4b, 0xcd, + 0xca, 0x30, 0x65, 0x08, 0xae, 0xba, 0x18, 0x7e, 0x11, 0xaf, 0x52, 0x36, 0x89, 0x6f, 0x23, 0xdd, 0x8c, 0xa4, 0x93, + 0x01, 0x68, 0x38, 0x65, 0x1b, 0x4c, 0x1e, 0xf9, 0x01, 0x19, 0xe5, 0x38, 0x69, 0xe9, 0x90, 0xbb, 0x74, 0xb5, 0xb4, + 0x48, 0xd5, 0x6c, 0xe1, 0x10, 0x75, 0x99, 0xe5, 0xe8, 0x51, 0xab, 0x15, 0x0f, 0x1e, 0xd6, 0x52, 0x98, 0x6a, 0xc4, + 0x36, 0x97, 0x0a, 0xa7, 0xad, 0x48, 0x08, 0x17, 0x45, 0x1c, 0x8c, 0x86, 0x89, 0xe3, 0x6f, 0xc8, 0x75, 0xb5, 0x78, + 0x0b, 0x51, 0x44, 0xf2, 0x15, 0x9f, 0x0f, 0x1e, 0x15, 0x82, 0x1e, 0x5f, 0x2a, 0x68, 0x7c, 0x77, 0xc3, 0x92, 0xd0, + 0xbf, 0x6f, 0x19, 0x79, 0x1c, 0xfd, 0x08, 0x08, 0x78, 0x15, 0xdf, 0x46, 0x6a, 0x05, 0x4c, 0xd6, 0xd2, 0xb0, 0x96, + 0x1a, 0xe3, 0x97, 0x80, 0xe3, 0x8a, 0xd2, 0x03, 0x48, 0x93, 0x3b, 0x63, 0x7f, 0x37, 0xe9, 0xdf, 0x7f, 0x18, 0xb9, + 0x79, 0x1e, 0xcb, 0x0f, 0xfd, 0xb2, 0xdc, 0xe3, 0x33, 0x4f, 0x9f, 0x3e, 0xda, 0x3c, 0xec, 0x72, 0x7a, 0xf6, 0x86, + 0xd6, 0xc6, 0xc6, 0x5d, 0x00, 0xbd, 0xb8, 0x88, 0x57, 0xe3, 0x39, 0x1a, 0xba, 0x7e, 0xbd, 0xf1, 0x66, 0x00, 0x13, + 0xb3, 0x94, 0xca, 0xa1, 0x57, 0x8a, 0x0a, 0x2c, 0xe0, 0xf7, 0x5f, 0x43, 0x00, 0xce, 0xff, 0x21, 0x1a, 0xea, 0xab, + 0x86, 0xdf, 0xe2, 0x83, 0x87, 0x2d, 0xde, 0x3e, 0x24, 0xd3, 0xe4, 0xa1, 0x2d, 0x84, 0x72, 0xad, 0x99, 0xc8, 0xe4, + 0x55, 0xa4, 0xa9, 0x61, 0xe4, 0x36, 0x45, 0xc8, 0x13, 0x5f, 0x61, 0x36, 0x5d, 0xd3, 0xb9, 0xa3, 0x81, 0xc9, 0x38, + 0xb5, 0xaa, 0x10, 0x19, 0x6e, 0xf2, 0xc0, 0x90, 0x7c, 0x55, 0xdf, 0x2d, 0x82, 0xc8, 0xc4, 0x28, 0xf0, 0xf5, 0x37, + 0xfe, 0x1d, 0xc4, 0x41, 0x06, 0xe2, 0x56, 0x7d, 0x05, 0x85, 0xa6, 0xea, 0x37, 0x07, 0xa9, 0x9e, 0xf4, 0x46, 0x4c, + 0x08, 0x2d, 0xde, 0xf0, 0x1b, 0x4d, 0xd3, 0x34, 0x79, 0x8d, 0xd0, 0xe4, 0x3d, 0x02, 0xcb, 0xf1, 0x3a, 0x00, 0xda, + 0x92, 0x7c, 0x79, 0x47, 0x25, 0x70, 0x33, 0x40, 0x9d, 0xac, 0x28, 0xe0, 0xa1, 0xfe, 0x3a, 0x8e, 0x28, 0x10, 0x17, + 0x7a, 0x08, 0xd3, 0xe6, 0x27, 0x10, 0x11, 0xb8, 0xa7, 0xe1, 0x85, 0x1d, 0xdf, 0x72, 0x49, 0xb0, 0xe6, 0xd0, 0xe3, + 0xb0, 0xcf, 0x9a, 0x63, 0xc2, 0x45, 0x0a, 0x15, 0x04, 0xad, 0x43, 0x25, 0xc4, 0xb3, 0xc9, 0x1a, 0x68, 0x23, 0xde, + 0x8b, 0xee, 0xb2, 0x05, 0x8b, 0x56, 0x3a, 0xe6, 0x84, 0xc2, 0x18, 0x7d, 0x50, 0xe7, 0x15, 0x31, 0x5b, 0x40, 0x6d, + 0x9a, 0x5b, 0xce, 0xe9, 0x2c, 0x4c, 0x39, 0x49, 0xf5, 0xcd, 0x31, 0x57, 0x6c, 0xa6, 0x9c, 0xb6, 0x55, 0x4f, 0x08, + 0x3e, 0xa5, 0x71, 0xd5, 0x91, 0x8b, 0x2c, 0xa1, 0x01, 0x06, 0x45, 0xc7, 0xe0, 0xe2, 0x22, 0x81, 0xf6, 0x96, 0x5f, + 0x9d, 0x34, 0xa9, 0x91, 0xf1, 0x2b, 0x82, 0xa2, 0xc4, 0xa8, 0x83, 0xe1, 0xfd, 0x84, 0xc0, 0x44, 0x1b, 0xe1, 0x8c, + 0x6b, 0x70, 0x36, 0x0c, 0xfa, 0x13, 0xbb, 0xa7, 0x83, 0x84, 0x50, 0xf5, 0x89, 0xdd, 0x83, 0xed, 0xdf, 0x6b, 0x90, + 0xa6, 0xe8, 0x5b, 0xc8, 0xb5, 0x09, 0xa1, 0xfe, 0xc7, 0x10, 0xac, 0x6a, 0xcb, 0x06, 0x72, 0xf2, 0x2d, 0x54, 0x1c, + 0x51, 0x0c, 0x59, 0x9d, 0xc5, 0x26, 0xe6, 0x26, 0xfe, 0xad, 0x46, 0x1c, 0x5b, 0x0d, 0x5b, 0xc3, 0x78, 0xe6, 0x3a, + 0xce, 0x41, 0xad, 0x3e, 0x08, 0xb2, 0x9b, 0x6a, 0x1b, 0x66, 0x36, 0x70, 0x1d, 0x2b, 0x78, 0x66, 0x7b, 0xfd, 0xda, + 0x19, 0xad, 0xc4, 0x92, 0x1c, 0xa2, 0xf8, 0xeb, 0xf4, 0xc9, 0xba, 0x55, 0xdb, 0x90, 0x46, 0xd5, 0x64, 0x1e, 0xfb, + 0x96, 0x73, 0xf9, 0xd7, 0xb0, 0x7e, 0xf4, 0x53, 0x24, 0x4b, 0xca, 0x6b, 0x32, 0x84, 0x68, 0xc8, 0x2d, 0xd8, 0x46, + 0x7f, 0xd1, 0x9e, 0x6b, 0x2d, 0xda, 0x3e, 0x86, 0x31, 0x94, 0xe9, 0xb2, 0x85, 0x4f, 0x99, 0x0a, 0xa0, 0xf2, 0xc5, + 0xb4, 0x4a, 0xe1, 0x78, 0xdc, 0x55, 0x56, 0x68, 0xf4, 0xb6, 0x72, 0x0b, 0x08, 0x7f, 0xc3, 0xf1, 0x69, 0x8f, 0x20, + 0x2e, 0x01, 0xd4, 0x80, 0xd8, 0xe9, 0x3b, 0x01, 0xae, 0x96, 0x65, 0x70, 0xe5, 0x43, 0x72, 0x7f, 0x60, 0x78, 0xe8, + 0xa0, 0x0e, 0x4d, 0xc2, 0x6b, 0x3e, 0xee, 0x1e, 0x08, 0x92, 0x45, 0x93, 0x32, 0xc0, 0xca, 0xf9, 0xb5, 0x3f, 0xb8, + 0x12, 0x45, 0x81, 0xa4, 0x02, 0x71, 0x03, 0x45, 0xc9, 0xe3, 0x08, 0x17, 0x3f, 0x6d, 0xb7, 0x60, 0x2f, 0x2e, 0x06, + 0x1b, 0x50, 0x44, 0x30, 0xd9, 0x4c, 0x11, 0x8a, 0x43, 0xe4, 0x6a, 0x74, 0x0b, 0x6e, 0x09, 0x46, 0x74, 0xe3, 0x4a, + 0xcc, 0x84, 0x4d, 0x61, 0xd1, 0x26, 0xe0, 0xb1, 0x28, 0xf7, 0x95, 0x5a, 0x07, 0xbb, 0xa5, 0xd6, 0xd9, 0x2e, 0xa9, + 0x35, 0xb9, 0x53, 0xdd, 0x26, 0xfe, 0x52, 0xf1, 0xc8, 0x13, 0xcc, 0xb9, 0xea, 0x98, 0x57, 0x12, 0x75, 0xa3, 0xf7, + 0x95, 0x68, 0x55, 0x83, 0x46, 0x56, 0x82, 0x28, 0xfe, 0x56, 0x2e, 0x28, 0x42, 0xa1, 0xae, 0xca, 0xc6, 0x2f, 0x0a, + 0xd9, 0x38, 0xdd, 0x6a, 0x0a, 0x47, 0x1a, 0xc1, 0xfd, 0x2b, 0x4e, 0x6a, 0xf2, 0x76, 0x50, 0x38, 0xab, 0x15, 0x3d, + 0x55, 0xdc, 0xaf, 0x8a, 0x8b, 0x86, 0xe2, 0xd4, 0x27, 0x6e, 0x19, 0x65, 0xdf, 0xbe, 0x72, 0xd5, 0xc2, 0xfb, 0xaa, + 0x28, 0x07, 0xa9, 0x3b, 0x76, 0x59, 0x16, 0xab, 0xcb, 0xa6, 0xec, 0x7e, 0xa3, 0xbe, 0x56, 0x16, 0x89, 0xf4, 0x93, + 0x21, 0x04, 0x0b, 0x31, 0x7d, 0x45, 0xaf, 0x2d, 0x6d, 0x20, 0xb0, 0x93, 0x0d, 0x6e, 0x7d, 0xbb, 0xa5, 0xf3, 0x94, + 0x2f, 0xa1, 0xd0, 0xc2, 0xab, 0x32, 0x08, 0xc4, 0xef, 0xd5, 0xba, 0xe1, 0x94, 0xc7, 0x43, 0x9e, 0x9f, 0xef, 0x20, + 0x5e, 0xd4, 0x1c, 0x55, 0x91, 0x8f, 0x3b, 0xd3, 0x22, 0xf3, 0x5c, 0xac, 0x5a, 0x07, 0x4a, 0x42, 0x9c, 0x35, 0xf7, + 0x8c, 0x29, 0xcb, 0xe8, 0x79, 0x8d, 0x9e, 0xf8, 0x2e, 0x5f, 0x3a, 0xc9, 0x2a, 0xc2, 0xd8, 0xf6, 0x56, 0x96, 0xf8, + 0xe3, 0x4f, 0x4a, 0x97, 0x85, 0x9c, 0x13, 0x64, 0xc0, 0x65, 0x4d, 0x41, 0xdf, 0xc7, 0x50, 0x90, 0xac, 0x67, 0x7b, + 0xa9, 0x22, 0x7d, 0xe9, 0x3d, 0x76, 0xda, 0xfe, 0x8b, 0xe9, 0x61, 0x45, 0x28, 0xea, 0x75, 0xca, 0x22, 0xf3, 0x0d, + 0xfd, 0xc8, 0xe6, 0xab, 0xc5, 0x68, 0xad, 0xca, 0x56, 0x15, 0x91, 0x6b, 0x5d, 0xcc, 0xaa, 0x7e, 0x76, 0x3a, 0x9d, + 0x96, 0x05, 0x8d, 0x8e, 0x76, 0x88, 0xc2, 0xc2, 0xc7, 0x8e, 0xe3, 0x54, 0xfb, 0xbe, 0x1d, 0xed, 0x16, 0xca, 0x6d, + 0xbb, 0x8d, 0x3d, 0x46, 0xdc, 0xee, 0xc2, 0x5f, 0x1d, 0x1d, 0xb9, 0x5d, 0xec, 0xec, 0x92, 0x59, 0x44, 0x9f, 0x8c, + 0x21, 0x82, 0x8c, 0x2d, 0xd2, 0xde, 0x98, 0xa1, 0x0e, 0xc6, 0x56, 0x36, 0x34, 0x1a, 0x0e, 0x58, 0x33, 0x30, 0x15, + 0x71, 0xc5, 0xaa, 0x70, 0x34, 0x94, 0x87, 0xd7, 0x84, 0xf7, 0xe2, 0x23, 0xb8, 0x51, 0xd6, 0x75, 0x99, 0x36, 0x0e, + 0xab, 0xe3, 0xfc, 0xa5, 0x54, 0x4f, 0x83, 0x03, 0x70, 0x2d, 0x14, 0xda, 0x24, 0x9f, 0xc5, 0xbf, 0xa5, 0xfc, 0xff, + 0xc5, 0xf2, 0xae, 0x6c, 0x3f, 0xd2, 0x05, 0x89, 0x76, 0xb1, 0x5b, 0xa8, 0xd7, 0x4d, 0x6b, 0x40, 0x5a, 0x19, 0x4c, + 0x55, 0x05, 0x3a, 0x28, 0xe9, 0x4b, 0x09, 0x40, 0x1a, 0xc4, 0xef, 0xc8, 0x31, 0xc3, 0x14, 0x17, 0x22, 0xc4, 0x22, + 0x7d, 0x1d, 0x8c, 0xc1, 0x7c, 0xde, 0x45, 0xfd, 0x41, 0x69, 0x4d, 0x80, 0x36, 0xbe, 0x36, 0xb6, 0xbd, 0xc4, 0xfd, + 0x55, 0xbd, 0x96, 0x00, 0x0c, 0x28, 0x73, 0x61, 0x13, 0xa2, 0x21, 0x81, 0x56, 0x59, 0xdc, 0xd4, 0x4b, 0xf9, 0x56, + 0xd5, 0xb3, 0x89, 0x8e, 0x21, 0xb8, 0xe6, 0x2a, 0x04, 0x5b, 0x68, 0x0b, 0x60, 0xb0, 0x7c, 0xf9, 0xe1, 0xb3, 0x05, + 0x53, 0xac, 0xae, 0x47, 0x17, 0xa7, 0x1c, 0xd7, 0xaf, 0x85, 0x67, 0x67, 0x4a, 0xfb, 0x1f, 0xe5, 0x8b, 0x3f, 0x34, + 0x0a, 0xf4, 0x2e, 0x4a, 0x12, 0x3a, 0x6e, 0x2d, 0xee, 0x19, 0x7b, 0xd5, 0x5e, 0x04, 0xd1, 0xfe, 0x75, 0xfd, 0xbb, + 0xbd, 0xeb, 0xc2, 0x81, 0xb1, 0x77, 0x65, 0x38, 0x71, 0xc8, 0x72, 0x21, 0x1b, 0xfc, 0xa0, 0x08, 0x14, 0x55, 0xaf, + 0x63, 0x1d, 0x5b, 0x11, 0x97, 0x7f, 0xb1, 0x1a, 0x0c, 0x4f, 0xce, 0xee, 0x16, 0xa1, 0x76, 0xc3, 0x12, 0x48, 0xed, + 0x33, 0xd0, 0x5d, 0xdb, 0xd1, 0x35, 0xf4, 0xa1, 0x0d, 0xa2, 0xd9, 0x40, 0xff, 0xe5, 0xe2, 0x8d, 0xd5, 0xd5, 0xcf, + 0x40, 0x45, 0x7b, 0x33, 0xc3, 0x63, 0xef, 0xdc, 0xbf, 0x67, 0xc9, 0xb5, 0xa7, 0x6b, 0x98, 0xc1, 0x87, 0x0e, 0x3c, + 0x2c, 0xd3, 0x3c, 0x7d, 0x8f, 0x44, 0x11, 0x9a, 0xc8, 0xf5, 0xa6, 0x03, 0xc9, 0x71, 0xbd, 0xae, 0xe6, 0x7a, 0x87, + 0xf6, 0x51, 0x57, 0x3f, 0xfd, 0x46, 0xd3, 0x4e, 0x26, 0x6c, 0x9a, 0x9e, 0xe2, 0x15, 0xed, 0x04, 0xcf, 0x08, 0xfa, + 0xad, 0x69, 0xf6, 0x38, 0x4c, 0x2d, 0x57, 0x5b, 0xf3, 0x47, 0x4d, 0x9b, 0x06, 0x61, 0xd8, 0xd3, 0x1e, 0x4f, 0xbd, + 0xe9, 0xe1, 0xf4, 0x45, 0x9f, 0x17, 0xe7, 0xdf, 0x94, 0xaa, 0x9b, 0xf4, 0xaf, 0xa7, 0x34, 0x4b, 0xb3, 0x24, 0xfe, + 0xc4, 0xb8, 0xd9, 0x89, 0x26, 0x2f, 0x8f, 0xd5, 0xa6, 0x5e, 0xfd, 0x4b, 0x6e, 0x77, 0x34, 0x9e, 0x7a, 0x45, 0x75, + 0xec, 0xe3, 0x81, 0xec, 0xe4, 0xc9, 0x81, 0xe8, 0xfa, 0x89, 0x8a, 0x26, 0xd7, 0x6a, 0x42, 0x94, 0xab, 0xf3, 0x31, + 0xce, 0xc4, 0xf8, 0x4e, 0x20, 0x0e, 0xa3, 0x74, 0xd7, 0x85, 0x1e, 0xe8, 0xda, 0x64, 0xa0, 0xff, 0xe8, 0x7a, 0x5d, + 0xd3, 0x75, 0x8f, 0xec, 0xa3, 0xee, 0xd8, 0x31, 0x0f, 0xed, 0x43, 0xab, 0x6d, 0x1f, 0x99, 0x5d, 0xab, 0x6b, 0x76, + 0xff, 0xd6, 0x1d, 0x5b, 0x87, 0xf6, 0xa1, 0xe9, 0x58, 0x5d, 0x28, 0xb4, 0xba, 0x56, 0xf7, 0xc6, 0x3a, 0xec, 0x8e, + 0x1d, 0x2c, 0xf5, 0xec, 0x4e, 0xc7, 0x72, 0x1d, 0xbb, 0xd3, 0x31, 0x3b, 0xf6, 0xd1, 0x91, 0xe5, 0xb6, 0xed, 0xa3, + 0xa3, 0xf3, 0x4e, 0xd7, 0x6e, 0xc3, 0xbb, 0x76, 0x7b, 0xdc, 0xb6, 0x5d, 0xd7, 0x82, 0xbf, 0xcc, 0xae, 0xed, 0xd1, + 0x0f, 0xd7, 0xb5, 0xdb, 0xae, 0xe9, 0x84, 0x1d, 0xcf, 0x3e, 0x7a, 0x61, 0xe2, 0xdf, 0x58, 0xcd, 0xc4, 0xbf, 0x00, + 0x8c, 0xf9, 0xc2, 0xf6, 0x8e, 0xe8, 0x17, 0x02, 0xbc, 0x39, 0xec, 0xfe, 0xaa, 0x1f, 0x6c, 0x1c, 0x83, 0x4b, 0x63, + 0xe8, 0x76, 0xec, 0x76, 0xdb, 0x3c, 0x74, 0xed, 0x6e, 0x7b, 0x6e, 0x1d, 0x7a, 0xf6, 0xd1, 0xf1, 0xd8, 0x72, 0xed, + 0xe3, 0x63, 0xd3, 0xb1, 0xda, 0xb6, 0x67, 0xba, 0xf6, 0x61, 0x1b, 0x7f, 0xb4, 0x6d, 0xef, 0xe6, 0xf8, 0x85, 0x7d, + 0xd4, 0x99, 0x1f, 0xd9, 0x87, 0x1f, 0x0f, 0xbb, 0xb6, 0xd7, 0x9e, 0xb7, 0x8f, 0x6c, 0xef, 0xf8, 0xe6, 0xc8, 0x3e, + 0x9c, 0x5b, 0xde, 0xd1, 0xd6, 0x96, 0xae, 0x67, 0x03, 0x8e, 0xf0, 0x35, 0xbc, 0x30, 0xf9, 0x0b, 0xf8, 0x33, 0xc7, + 0xb6, 0xff, 0x45, 0x30, 0x69, 0xbd, 0xe9, 0x0b, 0xbb, 0x7b, 0x3c, 0xa6, 0xea, 0x50, 0x60, 0x89, 0x1a, 0xd0, 0xe4, + 0xc6, 0xa2, 0xcf, 0x22, 0x38, 0x4b, 0x00, 0x12, 0x7f, 0xf8, 0xc7, 0x6e, 0x2c, 0xf8, 0x30, 0x7d, 0xf7, 0x7f, 0x0a, + 0x47, 0x4e, 0x39, 0x64, 0xae, 0xfc, 0x86, 0xff, 0x43, 0x49, 0x5f, 0x86, 0xe6, 0xf9, 0x26, 0x45, 0xc5, 0xfb, 0xdd, + 0x8a, 0x8a, 0x37, 0xab, 0x7d, 0x14, 0x15, 0xef, 0xbf, 0xba, 0xa2, 0xe2, 0xbc, 0x6a, 0x27, 0xff, 0xbe, 0x1a, 0x9b, + 0xfe, 0xd7, 0x75, 0xf5, 0x1a, 0x12, 0xf8, 0xad, 0xcb, 0x8b, 0xd5, 0x15, 0x44, 0x57, 0x7a, 0x1f, 0x0f, 0xde, 0xac, + 0x4a, 0x46, 0x60, 0x31, 0xd0, 0xd8, 0xf7, 0x31, 0xd1, 0xd8, 0xdf, 0x57, 0x03, 0xb0, 0x3c, 0xe1, 0x7c, 0x49, 0x30, + 0xb1, 0xe6, 0x7e, 0x38, 0x95, 0x3c, 0x0d, 0x94, 0xf4, 0xb1, 0x18, 0xbc, 0x12, 0xe0, 0xb8, 0x06, 0x75, 0xd8, 0x6a, + 0x11, 0xa5, 0xbd, 0x23, 0x07, 0x0e, 0x52, 0x6f, 0x9a, 0xe4, 0x95, 0xc6, 0xb6, 0x88, 0x47, 0x75, 0xcd, 0xbd, 0x26, + 0x36, 0xbe, 0x47, 0xa3, 0xc0, 0x66, 0xe8, 0x6e, 0x1d, 0xae, 0x06, 0xd6, 0x36, 0xc2, 0x68, 0x12, 0xd8, 0xb9, 0xa6, + 0xf7, 0x65, 0xd3, 0xbc, 0x8a, 0x31, 0xe6, 0xe6, 0x9e, 0x42, 0x4f, 0xaa, 0xed, 0xdd, 0xb2, 0x69, 0xdf, 0xae, 0x61, + 0x36, 0x7c, 0xbe, 0xd4, 0x7c, 0x8b, 0x5d, 0xa1, 0x04, 0x5c, 0x45, 0x55, 0x25, 0xb3, 0x5a, 0x23, 0x42, 0x0a, 0xee, + 0xbe, 0x30, 0x3e, 0x2c, 0x58, 0x4b, 0x47, 0x43, 0x7e, 0xc7, 0x51, 0xde, 0x95, 0x60, 0xaa, 0x06, 0x8b, 0xcf, 0xd6, + 0xc8, 0x71, 0x07, 0xbf, 0x03, 0xeb, 0xc8, 0x39, 0x9e, 0x51, 0xac, 0xe2, 0x79, 0xad, 0xc0, 0xa5, 0xcb, 0x4c, 0x3e, + 0x77, 0xd7, 0x75, 0xe6, 0x71, 0xa3, 0xa9, 0xb2, 0xcb, 0x16, 0x82, 0x0b, 0xc2, 0xcf, 0x93, 0x61, 0x70, 0x4e, 0xc6, + 0xdb, 0x68, 0xfb, 0xbc, 0x0d, 0x98, 0xa8, 0xf7, 0x18, 0x16, 0xb1, 0xc9, 0x1f, 0xd4, 0xb8, 0x00, 0xeb, 0x29, 0x64, + 0xc1, 0xee, 0x21, 0x9b, 0xa6, 0xf0, 0xa8, 0x1e, 0x5a, 0x31, 0xf7, 0xb7, 0x18, 0xd8, 0xa8, 0x80, 0x39, 0x10, 0xb4, + 0x86, 0xde, 0x66, 0x93, 0x23, 0x9d, 0x47, 0xd6, 0x25, 0x15, 0xb5, 0xdb, 0x39, 0x36, 0xdd, 0x23, 0xd3, 0x3e, 0xee, + 0x18, 0xb9, 0xd8, 0x70, 0x2a, 0xc8, 0x12, 0x42, 0xc0, 0x28, 0x5a, 0x76, 0x33, 0x88, 0x82, 0x2c, 0xf0, 0xc3, 0x1c, + 0xf8, 0xe3, 0xf2, 0xad, 0xe2, 0x9f, 0xab, 0x34, 0x83, 0x31, 0x0a, 0xa6, 0x17, 0x0d, 0xc2, 0xad, 0x11, 0xcb, 0x6e, + 0x19, 0x8b, 0x36, 0x28, 0xcb, 0xab, 0xf6, 0xe5, 0x7f, 0x9e, 0xb5, 0x6d, 0x4e, 0x96, 0x2c, 0xa3, 0x2c, 0xe2, 0xeb, + 0x43, 0x18, 0x43, 0xe7, 0x43, 0xf3, 0xa7, 0x4d, 0x04, 0xf7, 0x9f, 0xbb, 0x09, 0x6e, 0xc6, 0xf6, 0x21, 0xb8, 0xff, + 0xfc, 0xea, 0x04, 0xf7, 0x27, 0x95, 0xe0, 0x96, 0x7c, 0x81, 0x0a, 0xa9, 0xf3, 0x07, 0x7c, 0x6e, 0x41, 0x50, 0xe7, + 0xe7, 0xfa, 0x01, 0x31, 0xf0, 0xba, 0x92, 0x6c, 0xf7, 0x63, 0x29, 0x7b, 0x10, 0x0a, 0x45, 0x30, 0x08, 0x2d, 0x65, + 0x2a, 0x81, 0x44, 0xb4, 0x32, 0xa5, 0x3a, 0xc0, 0x7c, 0x1b, 0x65, 0xa1, 0xfd, 0x9e, 0x5f, 0xfc, 0x40, 0xc9, 0xf3, + 0x26, 0x4e, 0x16, 0x3e, 0x06, 0xe0, 0xd3, 0x31, 0xeb, 0x20, 0x3c, 0x38, 0xe0, 0x7f, 0x36, 0x8e, 0xa3, 0x89, 0xd4, + 0x54, 0xb0, 0xc1, 0x25, 0x71, 0xdc, 0xfa, 0x3d, 0xf3, 0x13, 0xdd, 0xa4, 0xd7, 0x30, 0xb9, 0xcf, 0xda, 0xce, 0x33, + 0xef, 0xf0, 0xd9, 0x91, 0x03, 0xff, 0xbb, 0xac, 0x9d, 0x9b, 0xbc, 0xe2, 0x22, 0x8e, 0x20, 0xf1, 0x89, 0xa8, 0xb9, + 0xa9, 0xda, 0x2d, 0x63, 0x9f, 0x8a, 0x5a, 0xc7, 0xcd, 0x95, 0x26, 0xfe, 0x7d, 0x51, 0xa7, 0xb1, 0xc6, 0x3c, 0x5e, + 0x29, 0xdd, 0x6a, 0xe8, 0x4d, 0x10, 0xad, 0x40, 0xf6, 0xa6, 0xd4, 0x50, 0x5f, 0xf3, 0xe1, 0x16, 0xe3, 0x62, 0xed, + 0xfc, 0xaa, 0xc8, 0xae, 0x24, 0xb2, 0xbc, 0xec, 0xc4, 0x20, 0x57, 0x5b, 0x38, 0x18, 0x9b, 0x1d, 0xf3, 0x0b, 0x69, + 0x90, 0xdb, 0x50, 0x4c, 0x90, 0x4f, 0x13, 0x94, 0x25, 0xab, 0x68, 0xdc, 0xc2, 0x9f, 0xfe, 0x28, 0x6d, 0x05, 0x07, + 0x10, 0x9d, 0x15, 0x3f, 0x6c, 0xe0, 0xac, 0xf9, 0xa7, 0x4e, 0x91, 0x8a, 0x22, 0x15, 0xb3, 0xe2, 0x3f, 0xcb, 0xcc, + 0x84, 0x12, 0xd8, 0xe2, 0xd4, 0x5a, 0x03, 0xff, 0x99, 0x6c, 0xf8, 0x2c, 0x33, 0x21, 0x89, 0x2c, 0x4c, 0xf7, 0xd3, + 0xa7, 0x54, 0x0b, 0xd2, 0x3a, 0xd2, 0xb0, 0xce, 0xc6, 0x45, 0x78, 0x37, 0xcd, 0x9f, 0xc5, 0x14, 0xe1, 0xad, 0x37, + 0x36, 0xe3, 0xe7, 0xcf, 0x4f, 0x07, 0xae, 0xc1, 0x93, 0x92, 0x96, 0x32, 0x68, 0x9d, 0xef, 0x67, 0x7c, 0x60, 0x34, + 0xba, 0xc5, 0x2d, 0xe1, 0xce, 0xe4, 0x08, 0x13, 0x65, 0x4e, 0xbd, 0x20, 0xa3, 0x05, 0x29, 0x19, 0x7d, 0x61, 0x04, + 0x20, 0xea, 0xc8, 0x5b, 0x57, 0xdb, 0x76, 0x6c, 0x47, 0x97, 0x0d, 0xa7, 0xc1, 0x6c, 0xb0, 0x8e, 0x33, 0x1f, 0x72, + 0x03, 0x85, 0xf1, 0x0c, 0x7c, 0x6b, 0xb2, 0x20, 0x0b, 0x21, 0xd1, 0x0c, 0x38, 0xd9, 0x2c, 0xe8, 0x5e, 0x9e, 0x73, + 0x8b, 0x67, 0x3f, 0xf9, 0x84, 0xc9, 0x06, 0x85, 0x5b, 0x1d, 0x46, 0x1c, 0xfa, 0x11, 0x0e, 0xc3, 0x96, 0xde, 0x82, + 0x54, 0x97, 0x2c, 0x49, 0x2d, 0xd5, 0x83, 0xa0, 0xa7, 0x41, 0x1b, 0x48, 0x43, 0x8f, 0x00, 0xa6, 0x89, 0xbf, 0x80, + 0x98, 0xec, 0xeb, 0xdc, 0xe4, 0x94, 0x56, 0xe7, 0xa4, 0x56, 0x73, 0x5f, 0x1c, 0x99, 0x9a, 0xe7, 0x9a, 0x9a, 0x03, + 0xe4, 0x56, 0xcf, 0xcd, 0x75, 0x7e, 0xd5, 0xdf, 0xa5, 0x04, 0x25, 0xfa, 0xf2, 0x98, 0xc6, 0x41, 0xea, 0x4f, 0x2e, + 0x5e, 0xce, 0x28, 0x80, 0x64, 0x4b, 0x89, 0x96, 0x1e, 0x90, 0x22, 0xe4, 0x82, 0xdd, 0x65, 0x06, 0x26, 0x62, 0xe1, + 0x55, 0x02, 0x63, 0x8d, 0xce, 0x7f, 0x41, 0xa4, 0x05, 0x9f, 0x3f, 0xb7, 0x02, 0x70, 0x70, 0x18, 0x28, 0xf8, 0x81, + 0x67, 0xa3, 0x84, 0xb0, 0xa0, 0x50, 0xdd, 0x21, 0xb2, 0xc0, 0xfb, 0x08, 0xfe, 0x2d, 0x8a, 0xc5, 0x0f, 0xae, 0x3a, + 0xb5, 0x43, 0x3f, 0x9a, 0x01, 0x49, 0xf3, 0xa3, 0x59, 0xcd, 0x44, 0x83, 0xfc, 0x17, 0x2b, 0xa5, 0x05, 0xa8, 0xc2, + 0x7c, 0x22, 0xfd, 0xfe, 0xfe, 0x82, 0x12, 0x4d, 0x41, 0x52, 0x73, 0x7f, 0x82, 0xce, 0x76, 0x85, 0x76, 0xe7, 0xf9, + 0xe0, 0xdb, 0x93, 0x05, 0xcb, 0x7c, 0x12, 0x0d, 0xc3, 0xe5, 0x17, 0xd8, 0x01, 0x6d, 0x2c, 0x92, 0xc4, 0x52, 0x32, + 0xf9, 0x09, 0xbb, 0x09, 0xc6, 0xfc, 0x5e, 0x6a, 0x6a, 0xfc, 0x9c, 0xb2, 0xd0, 0x0a, 0x6c, 0xe0, 0x9a, 0x64, 0x84, + 0x3c, 0xf6, 0x31, 0xcc, 0xe4, 0x20, 0x8a, 0xf5, 0xd3, 0x6f, 0xa5, 0xbf, 0xd6, 0xa6, 0x49, 0x80, 0x6c, 0x8f, 0x97, + 0x09, 0x0b, 0xff, 0x35, 0xf8, 0x16, 0x0e, 0xee, 0x6f, 0xaf, 0x74, 0xa3, 0x9f, 0xd9, 0xf3, 0x84, 0x4d, 0x07, 0xdf, + 0x36, 0x64, 0x3d, 0xc4, 0xeb, 0x3d, 0xf5, 0x45, 0x6f, 0x7b, 0x45, 0x70, 0xa0, 0xf6, 0x5e, 0x97, 0xfa, 0x53, 0x7e, + 0x5b, 0x87, 0x1b, 0xe0, 0xba, 0x74, 0xc7, 0x76, 0xfb, 0x78, 0x7f, 0x1e, 0x85, 0xfe, 0xf8, 0x53, 0x9f, 0xde, 0x94, + 0x1e, 0x2c, 0x38, 0xad, 0xc7, 0xfe, 0xb2, 0x87, 0xc7, 0xab, 0x5a, 0x08, 0xee, 0x9a, 0x54, 0x2a, 0x39, 0xbb, 0xc6, + 0xb5, 0x8c, 0x4b, 0x79, 0x8d, 0x5f, 0xc6, 0x4f, 0xdd, 0xce, 0x83, 0x8c, 0x89, 0x4f, 0xe1, 0x43, 0x9e, 0x8b, 0x8b, + 0x3a, 0x5d, 0x51, 0xf1, 0x62, 0x6d, 0xb7, 0x35, 0xb7, 0xfb, 0xb7, 0xce, 0x8d, 0xeb, 0xcc, 0x3d, 0xd7, 0xee, 0x7e, + 0x74, 0xbb, 0xf3, 0xb6, 0x7d, 0x1c, 0x5a, 0x6d, 0xfb, 0x18, 0xfe, 0x7c, 0x3c, 0xb6, 0xbb, 0x73, 0xcb, 0xb3, 0x0f, + 0x3f, 0xba, 0x5e, 0x68, 0x75, 0xed, 0x63, 0xf8, 0x73, 0x4e, 0xad, 0xe0, 0x02, 0x44, 0xf7, 0x9d, 0x6f, 0x4b, 0x54, + 0x40, 0xf9, 0x2d, 0xf5, 0x34, 0x66, 0xe9, 0x78, 0x6b, 0xd0, 0xf5, 0x00, 0xc9, 0xd0, 0x4d, 0x11, 0x04, 0x32, 0xea, + 0xb7, 0x20, 0x0d, 0x3b, 0x26, 0x10, 0x10, 0x26, 0x2f, 0xc2, 0x2f, 0x55, 0x84, 0xd2, 0x6f, 0xdc, 0x46, 0xbc, 0x4d, + 0x73, 0xc0, 0x75, 0x91, 0x99, 0x8a, 0x94, 0x43, 0xbf, 0x2c, 0x31, 0x88, 0x91, 0x08, 0x11, 0xaf, 0x50, 0xa5, 0x22, + 0x3b, 0x62, 0xbe, 0xbb, 0xe3, 0xe8, 0x99, 0xcb, 0x64, 0x76, 0x9e, 0xaf, 0x0a, 0x9b, 0x2b, 0x8c, 0x24, 0xf4, 0x3f, + 0x0a, 0x07, 0x93, 0xd2, 0x12, 0x1c, 0x11, 0xcd, 0x75, 0x12, 0x24, 0xb2, 0x7b, 0x0a, 0x89, 0x76, 0x9b, 0x23, 0xd5, + 0x1b, 0x90, 0xc6, 0xe4, 0x2d, 0x70, 0xc9, 0x37, 0x7e, 0xa8, 0x18, 0xb7, 0x28, 0x2d, 0x1f, 0x49, 0xca, 0xff, 0xf4, + 0x69, 0xd1, 0x39, 0xab, 0xd2, 0xef, 0x13, 0xb7, 0x03, 0xc7, 0x6e, 0x87, 0xb5, 0xb7, 0xda, 0x59, 0xed, 0x0e, 0x07, + 0x5c, 0x84, 0x0b, 0x15, 0xb6, 0x14, 0x42, 0x8b, 0xbb, 0xd1, 0xd8, 0xab, 0xa6, 0xc3, 0x85, 0x40, 0xca, 0x95, 0xab, + 0x8e, 0x6e, 0xf4, 0x23, 0xa1, 0x92, 0x8c, 0xb6, 0x84, 0x40, 0xe6, 0x77, 0x31, 0x1d, 0x50, 0xb3, 0x65, 0x1c, 0x3b, + 0x9c, 0x46, 0xff, 0xd7, 0x83, 0x40, 0x07, 0x2e, 0xd0, 0xa1, 0x56, 0x76, 0x6b, 0xc9, 0xa1, 0x47, 0x9e, 0xab, 0x74, + 0xa0, 0xb2, 0xf4, 0x4c, 0x87, 0x22, 0xc8, 0x6f, 0x85, 0x29, 0xed, 0xa4, 0x01, 0x99, 0x3c, 0x2d, 0x8a, 0x02, 0x33, + 0x80, 0x18, 0xe0, 0x2d, 0xe1, 0x4c, 0x66, 0x3c, 0x7d, 0xba, 0xf1, 0x10, 0x22, 0x85, 0xbd, 0x9a, 0xd9, 0x53, 0x57, + 0xe9, 0x9b, 0xae, 0x92, 0x18, 0x09, 0x17, 0xa9, 0x86, 0xb0, 0x7b, 0xa3, 0xb5, 0x87, 0x3f, 0x47, 0xcc, 0xcf, 0x6c, + 0xae, 0x69, 0x6a, 0x29, 0x87, 0xbb, 0xe9, 0xb2, 0x36, 0x58, 0xbc, 0xf1, 0x58, 0x67, 0x3c, 0x96, 0xe0, 0x93, 0xf5, + 0xc7, 0x15, 0xf7, 0xf4, 0x06, 0x18, 0x9f, 0x9d, 0x22, 0x3c, 0xcd, 0xbb, 0xcc, 0xa7, 0x18, 0x26, 0xea, 0x91, 0x1b, + 0x67, 0xbe, 0xc8, 0x23, 0x03, 0x7c, 0x79, 0xbf, 0x51, 0x25, 0xab, 0x78, 0x83, 0x9f, 0xbe, 0xbb, 0xf8, 0x4e, 0xe3, + 0xeb, 0x9f, 0x34, 0x88, 0x78, 0x91, 0xa1, 0xac, 0x07, 0x03, 0xca, 0x7a, 0xa0, 0xf1, 0x34, 0x22, 0x90, 0x3b, 0x20, + 0x3f, 0x20, 0x0c, 0xa2, 0x00, 0x9a, 0xf4, 0xaa, 0x8b, 0x55, 0x98, 0x05, 0x4b, 0x3f, 0xc9, 0x0e, 0xa0, 0xa9, 0x05, + 0x44, 0x4e, 0xdf, 0xe4, 0x23, 0x4e, 0xaa, 0x59, 0x11, 0x62, 0x2f, 0x8b, 0x84, 0x6e, 0x76, 0x1a, 0x84, 0x52, 0x35, + 0x2b, 0x3e, 0xe0, 0x8f, 0xc7, 0x6c, 0x99, 0x0d, 0x74, 0x7f, 0x09, 0xd9, 0x2f, 0x30, 0x9e, 0xf5, 0x41, 0x3c, 0xce, + 0x58, 0x66, 0xa5, 0x59, 0xc2, 0xfc, 0x85, 0x2e, 0x43, 0xb9, 0xd6, 0xe1, 0xa5, 0xab, 0xd1, 0x22, 0xc8, 0x64, 0x2c, + 0x44, 0x1a, 0x20, 0x28, 0x49, 0xa1, 0x8b, 0xa7, 0xc3, 0x9c, 0xa3, 0xf0, 0x3c, 0x9e, 0x55, 0x56, 0x54, 0xc1, 0xb9, + 0x9c, 0x61, 0xa4, 0x5d, 0x9e, 0xf1, 0x60, 0x82, 0x3e, 0x4f, 0xd7, 0xdc, 0xaf, 0x5d, 0x86, 0x6c, 0xd4, 0x4f, 0x4f, + 0xf8, 0xf5, 0x56, 0xc3, 0x50, 0x0c, 0x7a, 0xc7, 0x81, 0x58, 0xc2, 0x9b, 0x3c, 0xde, 0x0f, 0x78, 0x65, 0x38, 0x9a, + 0x08, 0x32, 0xc6, 0x79, 0xa7, 0xbe, 0x5c, 0x00, 0x23, 0x54, 0x52, 0xa2, 0xcf, 0xdd, 0x53, 0xe9, 0x62, 0x85, 0xbd, + 0x42, 0x5e, 0xe9, 0xf3, 0xe7, 0x97, 0xc3, 0xff, 0xfc, 0x1b, 0x82, 0xd1, 0xcf, 0x5d, 0xe1, 0x67, 0x7e, 0xa9, 0xd6, + 0xe2, 0xdc, 0xa7, 0x39, 0x44, 0x03, 0x0a, 0x36, 0x11, 0x81, 0x57, 0xc4, 0xd2, 0xca, 0x87, 0x57, 0x22, 0x98, 0x16, + 0x24, 0x9c, 0x30, 0x84, 0x37, 0xfc, 0x10, 0xa6, 0x77, 0x28, 0x82, 0x30, 0x68, 0xbf, 0xdd, 0x7d, 0x7f, 0x0c, 0xc1, + 0x96, 0x6b, 0x79, 0x20, 0x94, 0x0e, 0xe2, 0x1a, 0x3a, 0x3d, 0xf1, 0x35, 0x64, 0x5a, 0x90, 0xfd, 0x48, 0x7b, 0x07, + 0x30, 0xcc, 0x79, 0xbc, 0x60, 0x76, 0x10, 0x1f, 0xdc, 0xb2, 0x91, 0xe5, 0x2f, 0x03, 0xd2, 0xd5, 0xa3, 0xdc, 0x4d, + 0x23, 0xce, 0x4f, 0xaa, 0xc0, 0x89, 0xbf, 0xce, 0x0b, 0x54, 0xc6, 0xe5, 0xe8, 0x69, 0x1d, 0xaf, 0x50, 0xdc, 0x81, + 0x4f, 0xb3, 0x82, 0xc7, 0xf8, 0xf4, 0xe4, 0xc0, 0x3f, 0x2d, 0x87, 0x6f, 0xb4, 0x45, 0x02, 0x81, 0xf2, 0x21, 0x70, + 0x46, 0x51, 0x18, 0x45, 0xc0, 0xc5, 0xe2, 0xc1, 0x8a, 0xa7, 0x53, 0x35, 0xe4, 0xa2, 0x5d, 0xee, 0x9e, 0x44, 0x5a, + 0xb1, 0xa4, 0xe3, 0x25, 0x7d, 0xa9, 0xfe, 0x09, 0xf9, 0x13, 0x92, 0x27, 0xf3, 0xe8, 0x9c, 0xb0, 0xdd, 0x6b, 0xa1, + 0x1b, 0x25, 0xc6, 0x1e, 0x53, 0x25, 0x4e, 0x47, 0xaa, 0x81, 0xc2, 0x37, 0x70, 0x2e, 0x8f, 0x06, 0x03, 0x22, 0x73, + 0x55, 0x6a, 0x07, 0x48, 0x6c, 0x48, 0xa6, 0x00, 0x83, 0xcd, 0xa0, 0xa1, 0x45, 0x2e, 0x74, 0xd8, 0xa8, 0x3a, 0x9c, + 0x7a, 0x1f, 0x0f, 0x7c, 0xb1, 0xfc, 0x4a, 0x0b, 0x14, 0x16, 0x1e, 0x9f, 0x77, 0xa0, 0xef, 0x02, 0x4e, 0x85, 0xcc, + 0x6b, 0x7f, 0x25, 0x8a, 0x6e, 0x85, 0xfe, 0x7d, 0xac, 0x98, 0x36, 0xf0, 0x28, 0x07, 0xe7, 0x58, 0x7a, 0x21, 0xbc, + 0x0b, 0x6b, 0x1b, 0x4d, 0x06, 0xa4, 0xaf, 0x6f, 0x36, 0x35, 0x82, 0xfc, 0xae, 0xbd, 0xa6, 0xd6, 0x2d, 0x0f, 0x06, + 0x89, 0x67, 0x5e, 0xec, 0xc3, 0xd2, 0x4b, 0x24, 0x0b, 0xf9, 0xc9, 0x01, 0x8c, 0x0f, 0x22, 0x33, 0x94, 0x18, 0xa7, + 0xc0, 0x80, 0xf0, 0x0f, 0x7e, 0x4a, 0xe6, 0x19, 0x6f, 0x27, 0x82, 0xe7, 0xc3, 0x8b, 0xa5, 0x8c, 0x0d, 0x5b, 0xaa, + 0x52, 0xe7, 0x65, 0x9c, 0x66, 0x26, 0x70, 0x77, 0x02, 0x87, 0xdf, 0x57, 0x98, 0xbd, 0x21, 0xef, 0x67, 0x4c, 0x38, + 0x3e, 0x9f, 0x67, 0x1b, 0x7c, 0xa3, 0x37, 0x55, 0x21, 0x7e, 0x76, 0x4b, 0x85, 0x62, 0x1d, 0x6f, 0xab, 0x55, 0x70, + 0x4e, 0xb2, 0xda, 0xd2, 0x6f, 0xe9, 0x8f, 0x71, 0xc5, 0xd7, 0x6a, 0x63, 0x29, 0xd4, 0x3b, 0xcf, 0x06, 0x50, 0x55, + 0xc8, 0xe2, 0xfd, 0xe5, 0x92, 0x2a, 0x1b, 0xfd, 0x93, 0x03, 0xba, 0x96, 0x9e, 0xd2, 0x0a, 0x3b, 0x3d, 0x01, 0xf3, + 0x4e, 0x9a, 0x74, 0x7f, 0xb9, 0xe4, 0x53, 0x4a, 0xbf, 0xe8, 0xcd, 0xc1, 0x3c, 0x5b, 0x84, 0xa7, 0xff, 0x07, 0xc0, + 0xb1, 0x34, 0x8b, 0x20, 0x5c, 0x03, 0x00}; } // namespace web_server } // namespace esphome From d7f6d4436e1b4e894306ded3489f6ea337dfffbc Mon Sep 17 00:00:00 2001 From: Colm Date: Thu, 11 Jul 2024 05:10:58 +0100 Subject: [PATCH 201/233] Add braces to if statement to avoid compiler warning. (#7036) --- esphome/components/aht10/aht10.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/esphome/components/aht10/aht10.cpp b/esphome/components/aht10/aht10.cpp index 332218b9e9..441c1ac9df 100644 --- a/esphome/components/aht10/aht10.cpp +++ b/esphome/components/aht10/aht10.cpp @@ -93,8 +93,9 @@ void AHT10Component::restart_read_() { void AHT10Component::read_data_() { uint8_t data[6]; - if (this->read_count_ > 1) + if (this->read_count_ > 1) { ESP_LOGD(TAG, "Read attempt %d at %ums", this->read_count_, (unsigned) (millis() - this->start_time_)); + } if (this->read(data, 6) != i2c::ERROR_OK) { this->status_set_warning("AHT10 read failed, retrying soon"); this->restart_read_(); @@ -119,8 +120,9 @@ void AHT10Component::read_data_() { return; } } - if (this->read_count_ > 1) + if (this->read_count_ > 1) { ESP_LOGD(TAG, "Success at %ums", (unsigned) (millis() - this->start_time_)); + } uint32_t raw_temperature = ((data[3] & 0x0F) << 16) | (data[4] << 8) | data[5]; uint32_t raw_humidity = ((data[1] << 16) | (data[2] << 8) | data[3]) >> 4; From 2d826768b05f33951d1bdd917f62f9db3792c7ce Mon Sep 17 00:00:00 2001 From: ttaborda <80131527+ttaborda@users.noreply.github.com> Date: Thu, 11 Jul 2024 05:26:37 +0100 Subject: [PATCH 202/233] Update mitsubishi.cpp (#6909) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- esphome/components/mitsubishi/mitsubishi.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/esphome/components/mitsubishi/mitsubishi.cpp b/esphome/components/mitsubishi/mitsubishi.cpp index fd57adc586..a02aabf14d 100644 --- a/esphome/components/mitsubishi/mitsubishi.cpp +++ b/esphome/components/mitsubishi/mitsubishi.cpp @@ -52,6 +52,7 @@ const uint8_t MITSUBISHI_BYTE16 = 0X00; climate::ClimateTraits MitsubishiClimate::traits() { auto traits = climate::ClimateTraits(); + traits.set_supports_current_temperature(this->sensor_ != nullptr); traits.set_supports_action(false); traits.set_visual_min_temperature(MITSUBISHI_TEMP_MIN); traits.set_visual_max_temperature(MITSUBISHI_TEMP_MAX); From 531f33a158370f59fa246c064d01e28b80610bbc Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Thu, 11 Jul 2024 08:23:29 +0300 Subject: [PATCH 203/233] [climate] fix dump output of unsupported features (#7005) --- esphome/components/climate/climate.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/esphome/components/climate/climate.cpp b/esphome/components/climate/climate.cpp index 1822707152..bc8d932089 100644 --- a/esphome/components/climate/climate.cpp +++ b/esphome/components/climate/climate.cpp @@ -574,21 +574,25 @@ void Climate::dump_traits_(const char *tag) { ESP_LOGCONFIG(tag, " - Max temperature: %.1f", traits.get_visual_max_temperature()); ESP_LOGCONFIG(tag, " - Temperature step:"); ESP_LOGCONFIG(tag, " Target: %.1f", traits.get_visual_target_temperature_step()); - ESP_LOGCONFIG(tag, " Current: %.1f", traits.get_visual_current_temperature_step()); - ESP_LOGCONFIG(tag, " - Min humidity: %.0f", traits.get_visual_min_humidity()); - ESP_LOGCONFIG(tag, " - Max humidity: %.0f", traits.get_visual_max_humidity()); if (traits.get_supports_current_temperature()) { - ESP_LOGCONFIG(tag, " [x] Supports current temperature"); + ESP_LOGCONFIG(tag, " Current: %.1f", traits.get_visual_current_temperature_step()); } - if (traits.get_supports_current_humidity()) { - ESP_LOGCONFIG(tag, " [x] Supports current humidity"); + if (traits.get_supports_target_humidity() || traits.get_supports_current_humidity()) { + ESP_LOGCONFIG(tag, " - Min humidity: %.0f", traits.get_visual_min_humidity()); + ESP_LOGCONFIG(tag, " - Max humidity: %.0f", traits.get_visual_max_humidity()); } if (traits.get_supports_two_point_target_temperature()) { ESP_LOGCONFIG(tag, " [x] Supports two-point target temperature"); } + if (traits.get_supports_current_temperature()) { + ESP_LOGCONFIG(tag, " [x] Supports current temperature"); + } if (traits.get_supports_target_humidity()) { ESP_LOGCONFIG(tag, " [x] Supports target humidity"); } + if (traits.get_supports_current_humidity()) { + ESP_LOGCONFIG(tag, " [x] Supports current humidity"); + } if (traits.get_supports_action()) { ESP_LOGCONFIG(tag, " [x] Supports action"); } From 91bb38553d9eeec1f5a0347e48f9ffc5a70dadbf Mon Sep 17 00:00:00 2001 From: Sergey Dudanov Date: Thu, 11 Jul 2024 08:24:36 +0300 Subject: [PATCH 204/233] [climate-traits] improved performance (#7006) --- esphome/components/climate/climate_traits.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/esphome/components/climate/climate_traits.h b/esphome/components/climate/climate_traits.h index fd5b025a03..58d7b586d7 100644 --- a/esphome/components/climate/climate_traits.h +++ b/esphome/components/climate/climate_traits.h @@ -73,7 +73,7 @@ class ClimateTraits { ESPDEPRECATED("This method is deprecated, use set_supported_modes() instead", "v1.20") void set_supports_dry_mode(bool supports_dry_mode) { set_mode_support_(CLIMATE_MODE_DRY, supports_dry_mode); } bool supports_mode(ClimateMode mode) const { return supported_modes_.count(mode); } - std::set get_supported_modes() const { return supported_modes_; } + const std::set &get_supported_modes() const { return supported_modes_; } void set_supports_action(bool supports_action) { supports_action_ = supports_action; } bool get_supports_action() const { return supports_action_; } @@ -101,7 +101,7 @@ class ClimateTraits { void set_supports_fan_mode_diffuse(bool supported) { set_fan_mode_support_(CLIMATE_FAN_DIFFUSE, supported); } bool supports_fan_mode(ClimateFanMode fan_mode) const { return supported_fan_modes_.count(fan_mode); } bool get_supports_fan_modes() const { return !supported_fan_modes_.empty() || !supported_custom_fan_modes_.empty(); } - std::set get_supported_fan_modes() const { return supported_fan_modes_; } + const std::set &get_supported_fan_modes() const { return supported_fan_modes_; } void set_supported_custom_fan_modes(std::set supported_custom_fan_modes) { supported_custom_fan_modes_ = std::move(supported_custom_fan_modes); @@ -140,7 +140,7 @@ class ClimateTraits { } bool supports_swing_mode(ClimateSwingMode swing_mode) const { return supported_swing_modes_.count(swing_mode); } bool get_supports_swing_modes() const { return !supported_swing_modes_.empty(); } - std::set get_supported_swing_modes() const { return supported_swing_modes_; } + const std::set &get_supported_swing_modes() const { return supported_swing_modes_; } float get_visual_min_temperature() const { return visual_min_temperature_; } void set_visual_min_temperature(float visual_min_temperature) { visual_min_temperature_ = visual_min_temperature; } From a34cec217e50e9bbf26ce8494f9bec5abf9951ab Mon Sep 17 00:00:00 2001 From: leejoow Date: Thu, 11 Jul 2024 22:20:58 +0200 Subject: [PATCH 205/233] Add default icon to restart button (#7076) Co-authored-by: Leo Schelvis --- esphome/components/restart/button/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/esphome/components/restart/button/__init__.py b/esphome/components/restart/button/__init__.py index 1b2c991261..6aff8cb351 100644 --- a/esphome/components/restart/button/__init__.py +++ b/esphome/components/restart/button/__init__.py @@ -5,6 +5,7 @@ from esphome.const import ( CONF_ID, DEVICE_CLASS_RESTART, ENTITY_CATEGORY_CONFIG, + ICON_RESTART, ) restart_ns = cg.esphome_ns.namespace("restart") @@ -12,6 +13,7 @@ RestartButton = restart_ns.class_("RestartButton", button.Button, cg.Component) CONFIG_SCHEMA = button.button_schema( RestartButton, + icon=ICON_RESTART, device_class=DEVICE_CLASS_RESTART, entity_category=ENTITY_CATEGORY_CONFIG, ).extend(cv.COMPONENT_SCHEMA) From 54b77a1174b0912e028c5d8c1ba56068e30bc84e Mon Sep 17 00:00:00 2001 From: Tomi Junnila Date: Thu, 11 Jul 2024 23:32:38 +0300 Subject: [PATCH 206/233] Add support for the Gree YAC1FB9 in climate_ir (#7056) --- esphome/components/gree/climate.py | 1 + esphome/components/gree/gree.cpp | 14 +++++++++++--- esphome/components/gree/gree.h | 6 +++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/esphome/components/gree/climate.py b/esphome/components/gree/climate.py index 02ce7b12d4..c88a428391 100644 --- a/esphome/components/gree/climate.py +++ b/esphome/components/gree/climate.py @@ -16,6 +16,7 @@ MODELS = { "yan": Model.GREE_YAN, "yaa": Model.GREE_YAA, "yac": Model.GREE_YAC, + "yac1fb9": Model.GREE_YAC1FB9, } CONFIG_SCHEMA = climate_ir.CLIMATE_IR_WITH_RECEIVER_SCHEMA.extend( diff --git a/esphome/components/gree/gree.cpp b/esphome/components/gree/gree.cpp index 1bbb443fce..cce2a8ffee 100644 --- a/esphome/components/gree/gree.cpp +++ b/esphome/components/gree/gree.cpp @@ -24,7 +24,7 @@ void GreeClimate::transmit_state() { remote_state[4] |= (this->horizontal_swing_() << 4); } - if (this->model_ == GREE_YAA || this->model_ == GREE_YAC) { + if (this->model_ == GREE_YAA || this->model_ == GREE_YAC || this->model_ == GREE_YAC1FB9) { remote_state[2] = 0x20; // bits 0..3 always 0000, bits 4..7 TURBO,LIGHT,HEALTH,X-FAN remote_state[3] = 0x50; // bits 4..7 always 0101 remote_state[6] = 0x20; // YAA1FB, FAA1FB1, YB1F2 bits 4..7 always 0010 @@ -53,7 +53,11 @@ void GreeClimate::transmit_state() { data->set_carrier_frequency(GREE_IR_FREQUENCY); data->mark(GREE_HEADER_MARK); - data->space(GREE_HEADER_SPACE); + if (this->model_ == GREE_YAC1FB9) { + data->space(GREE_YAC1FB9_HEADER_SPACE); + } else { + data->space(GREE_HEADER_SPACE); + } for (int i = 0; i < 4; i++) { for (uint8_t mask = 1; mask > 0; mask <<= 1) { // iterate through bit mask @@ -71,7 +75,11 @@ void GreeClimate::transmit_state() { data->space(GREE_ZERO_SPACE); data->mark(GREE_BIT_MARK); - data->space(GREE_MESSAGE_SPACE); + if (this->model_ == GREE_YAC1FB9) { + data->space(GREE_YAC1FB9_MESSAGE_SPACE); + } else { + data->space(GREE_MESSAGE_SPACE); + } for (int i = 4; i < 8; i++) { for (uint8_t mask = 1; mask > 0; mask <<= 1) { // iterate through bit mask diff --git a/esphome/components/gree/gree.h b/esphome/components/gree/gree.h index e7131a2b89..524a95aebd 100644 --- a/esphome/components/gree/gree.h +++ b/esphome/components/gree/gree.h @@ -41,6 +41,10 @@ const uint32_t GREE_YAC_HEADER_MARK = 6000; const uint32_t GREE_YAC_HEADER_SPACE = 3000; const uint32_t GREE_YAC_BIT_MARK = 650; +// Timing specific to YAC1FB9 +const uint32_t GREE_YAC1FB9_HEADER_SPACE = 4500; +const uint32_t GREE_YAC1FB9_MESSAGE_SPACE = 19980; + // State Frame size const uint8_t GREE_STATE_FRAME_SIZE = 8; @@ -67,7 +71,7 @@ const uint8_t GREE_HDIR_MRIGHT = 0x05; const uint8_t GREE_HDIR_RIGHT = 0x06; // Model codes -enum Model { GREE_GENERIC, GREE_YAN, GREE_YAA, GREE_YAC }; +enum Model { GREE_GENERIC, GREE_YAN, GREE_YAA, GREE_YAC, GREE_YAC1FB9 }; class GreeClimate : public climate_ir::ClimateIR { public: From fbab0aceb024175c86b330048c6f45814248ae97 Mon Sep 17 00:00:00 2001 From: Eugen Date: Thu, 11 Jul 2024 23:26:04 +0200 Subject: [PATCH 207/233] add ESP32-C6 support to esp32_can (#7063) --- esphome/components/esp32_can/canbus.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/esphome/components/esp32_can/canbus.py b/esphome/components/esp32_can/canbus.py index 74f331f30b..f4ba032009 100644 --- a/esphome/components/esp32_can/canbus.py +++ b/esphome/components/esp32_can/canbus.py @@ -11,6 +11,7 @@ from esphome.components.esp32.const import ( VARIANT_ESP32S2, VARIANT_ESP32S3, VARIANT_ESP32C3, + VARIANT_ESP32C6, VARIANT_ESP32H2, ) @@ -47,6 +48,7 @@ CAN_SPEEDS_ESP32_S2 = { CAN_SPEEDS_ESP32_S3 = {**CAN_SPEEDS_ESP32_S2} CAN_SPEEDS_ESP32_C3 = {**CAN_SPEEDS_ESP32_S2} +CAN_SPEEDS_ESP32_C6 = {**CAN_SPEEDS_ESP32_S2} CAN_SPEEDS_ESP32_H2 = {**CAN_SPEEDS_ESP32_S2} CAN_SPEEDS = { @@ -54,6 +56,7 @@ CAN_SPEEDS = { VARIANT_ESP32S2: CAN_SPEEDS_ESP32_S2, VARIANT_ESP32S3: CAN_SPEEDS_ESP32_S3, VARIANT_ESP32C3: CAN_SPEEDS_ESP32_C3, + VARIANT_ESP32C6: CAN_SPEEDS_ESP32_C6, VARIANT_ESP32H2: CAN_SPEEDS_ESP32_H2, } From c6c1d3a3ad2e6fefecd6de60584eea1e263734e2 Mon Sep 17 00:00:00 2001 From: kevdliu <1766838+kevdliu@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:32:31 -0400 Subject: [PATCH 208/233] Fix voice assistant crash when no speaker configured (#7075) --- esphome/components/voice_assistant/voice_assistant.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/components/voice_assistant/voice_assistant.cpp b/esphome/components/voice_assistant/voice_assistant.cpp index 8a8a9e92aa..e4f388db68 100644 --- a/esphome/components/voice_assistant/voice_assistant.cpp +++ b/esphome/components/voice_assistant/voice_assistant.cpp @@ -684,7 +684,9 @@ void VoiceAssistant::on_event(const api::VoiceAssistantEventResponse &msg) { this->defer([this, text]() { this->tts_start_trigger_->trigger(text); #ifdef USE_SPEAKER - this->speaker_->start(); + if (this->speaker_ != nullptr) { + this->speaker_->start(); + } #endif }); break; From 0c2f9b9dbbfaa14af7b608e6c6223fd6527bda52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=2E=20=C3=81rkosi=20R=C3=B3bert?= Date: Fri, 12 Jul 2024 23:19:33 +0200 Subject: [PATCH 209/233] Bump HeatpumpIR, add protocols, remove IRremoteESP8266 (#6996) --- esphome/components/heatpumpir/climate.py | 11 ++++++----- esphome/components/heatpumpir/heatpumpir.cpp | 5 +++++ esphome/components/heatpumpir/heatpumpir.h | 5 +++++ platformio.ini | 6 +++--- .../heatpumpir/test.bk72xx-ard.yaml | 19 +++++++++++++++++++ 5 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 tests/components/heatpumpir/test.bk72xx-ard.yaml diff --git a/esphome/components/heatpumpir/climate.py b/esphome/components/heatpumpir/climate.py index b86d405b7e..80900d7db9 100644 --- a/esphome/components/heatpumpir/climate.py +++ b/esphome/components/heatpumpir/climate.py @@ -8,7 +8,6 @@ from esphome.const import ( CONF_PROTOCOL, CONF_VISUAL, ) -from esphome.core import CORE CODEOWNERS = ["@rob-deutsch"] @@ -67,6 +66,11 @@ PROTOCOLS = { "carrier_qlima_2": Protocol.PROTOCOL_QLIMA_2, "samsung_aqv12msan": Protocol.PROTOCOL_SAMSUNG_AQV12MSAN, "zhjg01": Protocol.PROTOCOL_ZHJG01, + "airway": Protocol.PROTOCOL_AIRWAY, + "bgh_aud": Protocol.PROTOCOL_BGH_AUD, + "panasonic_altdke": Protocol.PROTOCOL_PANASONIC_ALTDKE, + "vaillantvai8": Protocol.PROTOCOL_VAILLANTVAI8, + "r51m": Protocol.PROTOCOL_R51M, } CONF_HORIZONTAL_DEFAULT = "horizontal_default" @@ -122,7 +126,4 @@ def to_code(config): cg.add(var.set_max_temperature(config[CONF_MAX_TEMPERATURE])) cg.add(var.set_min_temperature(config[CONF_MIN_TEMPERATURE])) - cg.add_library("tonia/HeatpumpIR", "1.0.26") - - if CORE.is_esp8266 or CORE.is_esp32: - cg.add_library("crankyoldgit/IRremoteESP8266", "2.8.6") + cg.add_library("tonia/HeatpumpIR", "1.0.27") diff --git a/esphome/components/heatpumpir/heatpumpir.cpp b/esphome/components/heatpumpir/heatpumpir.cpp index 22a5779c8d..144dcc9bfa 100644 --- a/esphome/components/heatpumpir/heatpumpir.cpp +++ b/esphome/components/heatpumpir/heatpumpir.cpp @@ -61,6 +61,11 @@ const std::map> PROTOCOL_CONSTRUCTOR_MAP {PROTOCOL_QLIMA_2, []() { return new Qlima2HeatpumpIR(); }}, // NOLINT {PROTOCOL_SAMSUNG_AQV12MSAN, []() { return new SamsungAQV12MSANHeatpumpIR(); }}, // NOLINT {PROTOCOL_ZHJG01, []() { return new ZHJG01HeatpumpIR(); }}, // NOLINT + {PROTOCOL_AIRWAY, []() { return new AIRWAYHeatpumpIR(); }}, // NOLINT + {PROTOCOL_BGH_AUD, []() { return new BGHHeatpumpIR(); }}, // NOLINT + {PROTOCOL_PANASONIC_ALTDKE, []() { return new PanasonicAltDKEHeatpumpIR(); }}, // NOLINT + {PROTOCOL_VAILLANTVAI8, []() { return new VaillantHeatpumpIR(); }}, // NOLINT + {PROTOCOL_R51M, []() { return new R51MHeatpumpIR(); }}, // NOLINT }; void HeatpumpIRClimate::setup() { diff --git a/esphome/components/heatpumpir/heatpumpir.h b/esphome/components/heatpumpir/heatpumpir.h index 0e6ea2218f..f6e7ff3cd6 100644 --- a/esphome/components/heatpumpir/heatpumpir.h +++ b/esphome/components/heatpumpir/heatpumpir.h @@ -61,6 +61,11 @@ enum Protocol { PROTOCOL_QLIMA_2, PROTOCOL_SAMSUNG_AQV12MSAN, PROTOCOL_ZHJG01, + PROTOCOL_AIRWAY, + PROTOCOL_BGH_AUD, + PROTOCOL_PANASONIC_ALTDKE, + PROTOCOL_VAILLANTVAI8, + PROTOCOL_R51M, }; // Simple enum to represent horizontal directios diff --git a/platformio.ini b/platformio.ini index f07889526f..fc7f35b6c3 100644 --- a/platformio.ini +++ b/platformio.ini @@ -65,7 +65,7 @@ lib_deps = glmnet/Dsmr@0.7 ; dsmr rweather/Crypto@0.4.0 ; dsmr dudanov/MideaUART@1.1.9 ; midea - tonia/HeatpumpIR@1.0.26 ; heatpumpir + tonia/HeatpumpIR@1.0.27 ; heatpumpir build_flags = ${common.build_flags} -DUSE_ARDUINO @@ -93,8 +93,8 @@ lib_deps = ESP8266HTTPClient ; http_request (Arduino built-in) ESP8266mDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) - crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.2 ; wireguard + build_flags = ${common:arduino.build_flags} -Wno-nonnull-compare @@ -123,8 +123,8 @@ lib_deps = ESPmDNS ; mdns (Arduino built-in) DNSServer ; captive_portal (Arduino built-in) esphome/ESP32-audioI2S@2.0.7 ; i2s_audio - crankyoldgit/IRremoteESP8266@2.8.6 ; heatpumpir droscy/esp_wireguard@0.4.2 ; wireguard + build_flags = ${common:arduino.build_flags} -DUSE_ESP32 diff --git a/tests/components/heatpumpir/test.bk72xx-ard.yaml b/tests/components/heatpumpir/test.bk72xx-ard.yaml new file mode 100644 index 0000000000..90259f1244 --- /dev/null +++ b/tests/components/heatpumpir/test.bk72xx-ard.yaml @@ -0,0 +1,19 @@ +remote_transmitter: + pin: 6 + carrier_duty_percent: 50% + +climate: + - platform: heatpumpir + protocol: daikin + horizontal_default: mleft + vertical_default: mup + name: HeatpumpIR Climate + min_temperature: 18 + max_temperature: 30 + - platform: heatpumpir + protocol: panasonic_altdke + horizontal_default: mright + vertical_default: mdown + name: HeatpumpIR Climate + min_temperature: 18 + max_temperature: 30 From 316a0e1c967ad28f4ec43144cafea512f519d0a4 Mon Sep 17 00:00:00 2001 From: Anton Viktorov Date: Fri, 12 Jul 2024 21:42:41 +0000 Subject: [PATCH 210/233] LTR390 separate ALS and UV gain and resolution (#7026) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- CODEOWNERS | 2 +- esphome/components/ltr390/ltr390.cpp | 73 +++++++++++-------- esphome/components/ltr390/ltr390.h | 14 ++-- esphome/components/ltr390/sensor.py | 40 ++++++++-- tests/components/ltr390/test.esp32-ard.yaml | 18 +++++ tests/components/ltr390/test.esp8266-ard.yaml | 4 +- 6 files changed, 110 insertions(+), 41 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 5c14d30371..210c567f78 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -214,7 +214,7 @@ esphome/components/lightwaverf/* @max246 esphome/components/lilygo_t5_47/touchscreen/* @jesserockz esphome/components/lock/* @esphome/core esphome/components/logger/* @esphome/core -esphome/components/ltr390/* @sjtrny +esphome/components/ltr390/* @latonita @sjtrny esphome/components/ltr_als_ps/* @latonita esphome/components/matrix_keypad/* @ssieb esphome/components/max31865/* @DAVe3283 diff --git a/esphome/components/ltr390/ltr390.cpp b/esphome/components/ltr390/ltr390.cpp index 4eb1ff2c46..198d15ebd8 100644 --- a/esphome/components/ltr390/ltr390.cpp +++ b/esphome/components/ltr390/ltr390.cpp @@ -19,6 +19,7 @@ static const uint8_t LTR390_MAIN_STATUS = 0x07; static const float GAINVALUES[5] = {1.0, 3.0, 6.0, 9.0, 18.0}; static const float RESOLUTIONVALUE[6] = {4.0, 2.0, 1.0, 0.5, 0.25, 0.125}; +static const uint8_t RESOLUTION_BITS[6] = {20, 19, 18, 17, 16, 13}; // Request fastest measurement rate - will be slowed by device if conversion rate is slower. static const float RESOLUTION_SETTING[6] = {0x00, 0x10, 0x20, 0x30, 0x40, 0x50}; @@ -74,7 +75,7 @@ void LTR390Component::read_als_() { uint32_t als = *val; if (this->light_sensor_ != nullptr) { - float lux = ((0.6 * als) / (GAINVALUES[this->gain_] * RESOLUTIONVALUE[this->res_])) * this->wfac_; + float lux = ((0.6 * als) / (GAINVALUES[this->gain_als_] * RESOLUTIONVALUE[this->res_als_])) * this->wfac_; this->light_sensor_->publish_state(lux); } @@ -90,7 +91,7 @@ void LTR390Component::read_uvs_() { uint32_t uv = *val; if (this->uvi_sensor_ != nullptr) { - this->uvi_sensor_->publish_state((uv / this->sensitivity_) * this->wfac_); + this->uvi_sensor_->publish_state((uv / this->sensitivity_uv_) * this->wfac_); } if (this->uv_sensor_ != nullptr) { @@ -107,24 +108,38 @@ void LTR390Component::read_mode_(int mode_index) { ctrl[LTR390_CTRL_EN] = true; this->reg(LTR390_MAIN_CTRL) = ctrl.to_ulong(); - // After the sensor integration time do the following - this->set_timeout(((uint32_t) RESOLUTIONVALUE[this->res_]) * 100 + LTR390_WAKEUP_TIME + LTR390_SETTLE_TIME, - [this, mode_index]() { - // Read from the sensor - std::get<1>(this->mode_funcs_[mode_index])(); + uint32_t int_time{0}; + // Set gain, resolution and measurement rate + switch (mode) { + case LTR390_MODE_ALS: + this->reg(LTR390_GAIN) = this->gain_als_; + this->reg(LTR390_MEAS_RATE) = RESOLUTION_SETTING[this->res_als_]; + int_time = ((uint32_t) RESOLUTIONVALUE[this->res_als_]) * 100; + break; + case LTR390_MODE_UVS: + this->reg(LTR390_GAIN) = this->gain_uv_; + this->reg(LTR390_MEAS_RATE) = RESOLUTION_SETTING[this->res_uv_]; + int_time = ((uint32_t) RESOLUTIONVALUE[this->res_uv_]) * 100; + break; + } - // If there are more modes to read then begin the next - // otherwise stop - if (mode_index + 1 < (int) this->mode_funcs_.size()) { - this->read_mode_(mode_index + 1); - } else { - // put sensor in standby - std::bitset<8> ctrl = this->reg(LTR390_MAIN_CTRL).get(); - ctrl[LTR390_CTRL_EN] = false; - this->reg(LTR390_MAIN_CTRL) = ctrl.to_ulong(); - this->reading_ = false; - } - }); + // After the sensor integration time do the following + this->set_timeout(int_time + LTR390_WAKEUP_TIME + LTR390_SETTLE_TIME, [this, mode_index]() { + // Read from the sensor + std::get<1>(this->mode_funcs_[mode_index])(); + + // If there are more modes to read then begin the next + // otherwise stop + if (mode_index + 1 < (int) this->mode_funcs_.size()) { + this->read_mode_(mode_index + 1); + } else { + // put sensor in standby + std::bitset<8> ctrl = this->reg(LTR390_MAIN_CTRL).get(); + ctrl[LTR390_CTRL_EN] = false; + this->reg(LTR390_MAIN_CTRL) = ctrl.to_ulong(); + this->reading_ = false; + } + }); } void LTR390Component::setup() { @@ -151,16 +166,10 @@ void LTR390Component::setup() { return; } - // Set gain - this->reg(LTR390_GAIN) = gain_; - - // Set resolution and measurement rate - this->reg(LTR390_MEAS_RATE) = RESOLUTION_SETTING[this->res_]; - // Set sensitivity by linearly scaling against known value in the datasheet - float gain_scale = GAINVALUES[this->gain_] / GAIN_MAX; - float intg_scale = (RESOLUTIONVALUE[this->res_] * 100) / INTG_MAX; - this->sensitivity_ = SENSITIVITY_MAX * gain_scale * intg_scale; + float gain_scale_uv = GAINVALUES[this->gain_uv_] / GAIN_MAX; + float intg_scale_uv = (RESOLUTIONVALUE[this->res_uv_] * 100) / INTG_MAX; + this->sensitivity_uv_ = SENSITIVITY_MAX * gain_scale_uv * intg_scale_uv; // Set sensor read state this->reading_ = false; @@ -176,7 +185,13 @@ void LTR390Component::setup() { } } -void LTR390Component::dump_config() { LOG_I2C_DEVICE(this); } +void LTR390Component::dump_config() { + LOG_I2C_DEVICE(this); + ESP_LOGCONFIG(TAG, " ALS Gain: X%.0f", GAINVALUES[this->gain_als_]); + ESP_LOGCONFIG(TAG, " ALS Resolution: %u-bit", RESOLUTION_BITS[this->res_als_]); + ESP_LOGCONFIG(TAG, " UV Gain: X%.0f", GAINVALUES[this->gain_uv_]); + ESP_LOGCONFIG(TAG, " UV Resolution: %u-bit", RESOLUTION_BITS[this->res_uv_]); +} void LTR390Component::update() { if (!this->reading_ && !mode_funcs_.empty()) { diff --git a/esphome/components/ltr390/ltr390.h b/esphome/components/ltr390/ltr390.h index bc98518fe9..24afd3c411 100644 --- a/esphome/components/ltr390/ltr390.h +++ b/esphome/components/ltr390/ltr390.h @@ -49,8 +49,10 @@ class LTR390Component : public PollingComponent, public i2c::I2CDevice { void dump_config() override; void update() override; - void set_gain_value(LTR390GAIN gain) { this->gain_ = gain; } - void set_res_value(LTR390RESOLUTION res) { this->res_ = res; } + void set_als_gain_value(LTR390GAIN gain) { this->gain_als_ = gain; } + void set_uv_gain_value(LTR390GAIN gain) { this->gain_uv_ = gain; } + void set_als_res_value(LTR390RESOLUTION res) { this->res_als_ = res; } + void set_uv_res_value(LTR390RESOLUTION res) { this->res_uv_ = res; } void set_wfac_value(float wfac) { this->wfac_ = wfac; } void set_light_sensor(sensor::Sensor *light_sensor) { this->light_sensor_ = light_sensor; } @@ -71,9 +73,11 @@ class LTR390Component : public PollingComponent, public i2c::I2CDevice { // a list of modes and corresponding read functions std::vector>> mode_funcs_; - LTR390GAIN gain_; - LTR390RESOLUTION res_; - float sensitivity_; + LTR390GAIN gain_als_; + LTR390GAIN gain_uv_; + LTR390RESOLUTION res_als_; + LTR390RESOLUTION res_uv_; + float sensitivity_uv_; float wfac_; sensor::Sensor *light_sensor_{nullptr}; diff --git a/esphome/components/ltr390/sensor.py b/esphome/components/ltr390/sensor.py index 8b2676599c..62c3edf8cb 100644 --- a/esphome/components/ltr390/sensor.py +++ b/esphome/components/ltr390/sensor.py @@ -13,7 +13,7 @@ from esphome.const import ( UNIT_LUX, ) -CODEOWNERS = ["@sjtrny"] +CODEOWNERS = ["@sjtrny", "@latonita"] DEPENDENCIES = ["i2c"] ltr390_ns = cg.esphome_ns.namespace("ltr390") @@ -76,8 +76,24 @@ CONFIG_SCHEMA = cv.All( accuracy_decimals=1, device_class=DEVICE_CLASS_EMPTY, ), - cv.Optional(CONF_GAIN, default="X18"): cv.enum(GAIN_OPTIONS), - cv.Optional(CONF_RESOLUTION, default=20): cv.enum(RES_OPTIONS), + cv.Optional(CONF_GAIN, default="X18"): cv.Any( + cv.enum(GAIN_OPTIONS), + cv.Schema( + { + cv.Required(CONF_AMBIENT_LIGHT): cv.enum(GAIN_OPTIONS), + cv.Required(CONF_UV): cv.enum(GAIN_OPTIONS), + } + ), + ), + cv.Optional(CONF_RESOLUTION, default=20): cv.Any( + cv.enum(RES_OPTIONS), + cv.Schema( + { + cv.Required(CONF_AMBIENT_LIGHT): cv.enum(RES_OPTIONS), + cv.Required(CONF_UV): cv.enum(RES_OPTIONS), + } + ), + ), cv.Optional(CONF_WINDOW_CORRECTION_FACTOR, default=1.0): cv.float_range( min=1.0 ), @@ -101,11 +117,25 @@ async def to_code(config): await cg.register_component(var, config) await i2c.register_i2c_device(var, config) - cg.add(var.set_gain_value(config[CONF_GAIN])) - cg.add(var.set_res_value(config[CONF_RESOLUTION])) cg.add(var.set_wfac_value(config[CONF_WINDOW_CORRECTION_FACTOR])) for key, funcName in TYPES.items(): if key in config: sens = await sensor.new_sensor(config[key]) cg.add(getattr(var, funcName)(sens)) + + gain_value = config[CONF_GAIN] + if isinstance(gain_value, dict): + cg.add(var.set_als_gain_value(gain_value[CONF_AMBIENT_LIGHT])) + cg.add(var.set_uv_gain_value(gain_value[CONF_UV])) + else: + cg.add(var.set_als_gain_value(gain_value)) + cg.add(var.set_uv_gain_value(gain_value)) + + res_value = config[CONF_RESOLUTION] + if isinstance(res_value, dict): + cg.add(var.set_als_res_value(res_value[CONF_AMBIENT_LIGHT])) + cg.add(var.set_uv_res_value(res_value[CONF_UV])) + else: + cg.add(var.set_als_res_value(res_value)) + cg.add(var.set_uv_res_value(res_value)) diff --git a/tests/components/ltr390/test.esp32-ard.yaml b/tests/components/ltr390/test.esp32-ard.yaml index 9786c7dac3..bdfe349b77 100644 --- a/tests/components/ltr390/test.esp32-ard.yaml +++ b/tests/components/ltr390/test.esp32-ard.yaml @@ -18,3 +18,21 @@ sensor: window_correction_factor: 1.0 address: 0x53 update_interval: 60s + - platform: ltr390 + uv: + name: LTR390 UV + uv_index: + name: LTR390 UVI + light: + name: LTR390 Light + ambient_light: + name: LTR390 ALS + gain: + ambient_light: X9 + uv: X3 + resolution: + ambient_light: 18 + uv: 13 + window_correction_factor: 1.0 + address: 0x53 + update_interval: 60s diff --git a/tests/components/ltr390/test.esp8266-ard.yaml b/tests/components/ltr390/test.esp8266-ard.yaml index fee0f37ce1..149f46f9c8 100644 --- a/tests/components/ltr390/test.esp8266-ard.yaml +++ b/tests/components/ltr390/test.esp8266-ard.yaml @@ -13,7 +13,9 @@ sensor: name: LTR390 Light ambient_light: name: LTR390 ALS - gain: X3 + gain: + ambient_light: X9 + uv: X3 resolution: 18 window_correction_factor: 1.0 address: 0x53 From bb92ab01d736d8bffa0a2d90713d12ff2f03d774 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Sat, 13 Jul 2024 09:46:08 +1200 Subject: [PATCH 211/233] Bump version to 2024.7.0b2 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index d672cc92af..4776de4d67 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.7.0b1" +__version__ = "2024.7.0b2" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 44d609b205c1549ae4c2ab7be31d81b0f67e8755 Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Sun, 14 Jul 2024 22:05:02 +0200 Subject: [PATCH 212/233] [CI] compile entire web_server during tests (#7084) --- tests/components/web_server/common.yaml | 35 +++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/tests/components/web_server/common.yaml b/tests/components/web_server/common.yaml index 94388726c3..338d9e97d2 100644 --- a/tests/components/web_server/common.yaml +++ b/tests/components/web_server/common.yaml @@ -5,3 +5,38 @@ wifi: web_server: port: 8080 version: 2 + +binary_sensor: +cover: +fan: +light: +sensor: +switch: +button: +text_sensor: +climate: +number: +text: +select: +lock: +valve: +alarm_control_panel: +api: +time: + - platform: homeassistant + id: homeassistant_time +datetime: + - platform: template + id: my_datetime_date + type: date + optimistic: yes + - platform: template + id: my_datetime_time + type: time + optimistic: yes + - platform: template + id: my_datetime + type: datetime + optimistic: yes +event: +update: From 896af84acc967aca74bc3cf832fb4e7da47ad032 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Sun, 14 Jul 2024 15:06:10 -0500 Subject: [PATCH 213/233] [improv_serial] Fix linker error created in #6998 (#7082) --- esphome/components/improv_serial/improv_serial_component.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esphome/components/improv_serial/improv_serial_component.cpp b/esphome/components/improv_serial/improv_serial_component.cpp index 02ffa9f31c..12809e38cb 100644 --- a/esphome/components/improv_serial/improv_serial_component.cpp +++ b/esphome/components/improv_serial/improv_serial_component.cpp @@ -57,7 +57,7 @@ optional ImprovSerialComponent::read_byte_() { } } break; -#ifdef USE_LOGGER_USB_CDC +#if defined(USE_LOGGER_USB_CDC) && defined(CONFIG_ESP_CONSOLE_USB_CDC) case logger::UART_SELECTION_USB_CDC: #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) if (esp_usb_console_available_for_read()) { @@ -99,7 +99,7 @@ void ImprovSerialComponent::write_data_(std::vector &data) { #endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3 uart_write_bytes(this->uart_num_, data.data(), data.size()); break; -#ifdef USE_LOGGER_USB_CDC +#if defined(USE_LOGGER_USB_CDC) && defined(CONFIG_ESP_CONSOLE_USB_CDC) case logger::UART_SELECTION_USB_CDC: { const char *msg = (char *) data.data(); esp_usb_console_write_buf(msg, data.size()); @@ -109,6 +109,7 @@ void ImprovSerialComponent::write_data_(std::vector &data) { #ifdef USE_LOGGER_USB_SERIAL_JTAG case logger::UART_SELECTION_USB_SERIAL_JTAG: usb_serial_jtag_write_bytes((char *) data.data(), data.size(), 20 / portTICK_PERIOD_MS); + delay(10); usb_serial_jtag_ll_txfifo_flush(); // fixes for issue in IDF 4.4.7 break; #endif // USE_LOGGER_USB_SERIAL_JTAG From 07b78fea760e78e5be5c0dbbf506f2fca490cff0 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Sun, 14 Jul 2024 15:32:10 -0500 Subject: [PATCH 214/233] [CI] Add more ``improv_serial`` tests (#7081) Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com> --- .../improv_serial/{common.yaml => common-uart0.yaml} | 3 +++ tests/components/improv_serial/common-usb_cdc.yaml | 8 ++++++++ .../components/improv_serial/common-usb_serial_jtag.yaml | 8 ++++++++ tests/components/improv_serial/test-uart0.esp32-ard.yaml | 1 + .../components/improv_serial/test-uart0.esp32-c3-ard.yaml | 1 + .../components/improv_serial/test-uart0.esp32-c3-idf.yaml | 1 + tests/components/improv_serial/test-uart0.esp32-idf.yaml | 1 + .../components/improv_serial/test-uart0.esp32-s2-ard.yaml | 1 + .../components/improv_serial/test-uart0.esp32-s2-idf.yaml | 1 + .../components/improv_serial/test-uart0.esp32-s3-ard.yaml | 1 + .../components/improv_serial/test-uart0.esp32-s3-idf.yaml | 1 + .../components/improv_serial/test-uart0.esp8266-ard.yaml | 1 + tests/components/improv_serial/test-uart0.rp2040-ard.yaml | 1 + .../improv_serial/test-usb_cdc.esp32-c3-ard.yaml | 1 + .../improv_serial/test-usb_cdc.esp32-s2-ard.yaml | 1 + .../improv_serial/test-usb_cdc.esp32-s2-idf.yaml | 1 + .../improv_serial/test-usb_cdc.esp32-s3-ard.yaml | 1 + .../components/improv_serial/test-usb_cdc.rp2040-ard.yaml | 1 + .../improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml | 1 + .../improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml | 1 + tests/components/improv_serial/test.esp32-ard.yaml | 1 - tests/components/improv_serial/test.esp32-c3-ard.yaml | 1 - tests/components/improv_serial/test.esp32-c3-idf.yaml | 1 - tests/components/improv_serial/test.esp32-idf.yaml | 1 - tests/components/improv_serial/test.esp8266-ard.yaml | 1 - tests/components/improv_serial/test.rp2040-ard.yaml | 1 - 26 files changed, 36 insertions(+), 6 deletions(-) rename tests/components/improv_serial/{common.yaml => common-uart0.yaml} (64%) create mode 100644 tests/components/improv_serial/common-usb_cdc.yaml create mode 100644 tests/components/improv_serial/common-usb_serial_jtag.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-c3-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-c3-idf.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-idf.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-s2-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-s2-idf.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-s3-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp32-s3-idf.yaml create mode 100644 tests/components/improv_serial/test-uart0.esp8266-ard.yaml create mode 100644 tests/components/improv_serial/test-uart0.rp2040-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.esp32-c3-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.esp32-s2-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.esp32-s2-idf.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.esp32-s3-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_cdc.rp2040-ard.yaml create mode 100644 tests/components/improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml create mode 100644 tests/components/improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml delete mode 100644 tests/components/improv_serial/test.esp32-ard.yaml delete mode 100644 tests/components/improv_serial/test.esp32-c3-ard.yaml delete mode 100644 tests/components/improv_serial/test.esp32-c3-idf.yaml delete mode 100644 tests/components/improv_serial/test.esp32-idf.yaml delete mode 100644 tests/components/improv_serial/test.esp8266-ard.yaml delete mode 100644 tests/components/improv_serial/test.rp2040-ard.yaml diff --git a/tests/components/improv_serial/common.yaml b/tests/components/improv_serial/common-uart0.yaml similarity index 64% rename from tests/components/improv_serial/common.yaml rename to tests/components/improv_serial/common-uart0.yaml index b36fe5a4a7..7b7730fd46 100644 --- a/tests/components/improv_serial/common.yaml +++ b/tests/components/improv_serial/common-uart0.yaml @@ -2,4 +2,7 @@ wifi: ssid: MySSID password: password1 +logger: + hardware_uart: UART0 + improv_serial: diff --git a/tests/components/improv_serial/common-usb_cdc.yaml b/tests/components/improv_serial/common-usb_cdc.yaml new file mode 100644 index 0000000000..fc72b6aa7e --- /dev/null +++ b/tests/components/improv_serial/common-usb_cdc.yaml @@ -0,0 +1,8 @@ +wifi: + ssid: MySSID + password: password1 + +logger: + hardware_uart: USB_CDC + +improv_serial: diff --git a/tests/components/improv_serial/common-usb_serial_jtag.yaml b/tests/components/improv_serial/common-usb_serial_jtag.yaml new file mode 100644 index 0000000000..0abcc07168 --- /dev/null +++ b/tests/components/improv_serial/common-usb_serial_jtag.yaml @@ -0,0 +1,8 @@ +wifi: + ssid: MySSID + password: password1 + +logger: + hardware_uart: USB_SERIAL_JTAG + +improv_serial: diff --git a/tests/components/improv_serial/test-uart0.esp32-ard.yaml b/tests/components/improv_serial/test-uart0.esp32-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-c3-ard.yaml b/tests/components/improv_serial/test-uart0.esp32-c3-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-c3-idf.yaml b/tests/components/improv_serial/test-uart0.esp32-c3-idf.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-idf.yaml b/tests/components/improv_serial/test-uart0.esp32-idf.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-idf.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-s2-ard.yaml b/tests/components/improv_serial/test-uart0.esp32-s2-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-s2-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-s2-idf.yaml b/tests/components/improv_serial/test-uart0.esp32-s2-idf.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-s2-idf.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-s3-ard.yaml b/tests/components/improv_serial/test-uart0.esp32-s3-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-s3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp32-s3-idf.yaml b/tests/components/improv_serial/test-uart0.esp32-s3-idf.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp32-s3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.esp8266-ard.yaml b/tests/components/improv_serial/test-uart0.esp8266-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.esp8266-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-uart0.rp2040-ard.yaml b/tests/components/improv_serial/test-uart0.rp2040-ard.yaml new file mode 100644 index 0000000000..ef8c799241 --- /dev/null +++ b/tests/components/improv_serial/test-uart0.rp2040-ard.yaml @@ -0,0 +1 @@ +<<: !include common-uart0.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.esp32-c3-ard.yaml b/tests/components/improv_serial/test-usb_cdc.esp32-c3-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.esp32-c3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.esp32-s2-ard.yaml b/tests/components/improv_serial/test-usb_cdc.esp32-s2-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.esp32-s2-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.esp32-s2-idf.yaml b/tests/components/improv_serial/test-usb_cdc.esp32-s2-idf.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.esp32-s2-idf.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.esp32-s3-ard.yaml b/tests/components/improv_serial/test-usb_cdc.esp32-s3-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.esp32-s3-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_cdc.rp2040-ard.yaml b/tests/components/improv_serial/test-usb_cdc.rp2040-ard.yaml new file mode 100644 index 0000000000..cfdaec9771 --- /dev/null +++ b/tests/components/improv_serial/test-usb_cdc.rp2040-ard.yaml @@ -0,0 +1 @@ +<<: !include common-usb_cdc.yaml diff --git a/tests/components/improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml b/tests/components/improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml new file mode 100644 index 0000000000..46a927ff10 --- /dev/null +++ b/tests/components/improv_serial/test-usb_serial_jtag.esp32-c3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-usb_serial_jtag.yaml diff --git a/tests/components/improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml b/tests/components/improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml new file mode 100644 index 0000000000..46a927ff10 --- /dev/null +++ b/tests/components/improv_serial/test-usb_serial_jtag.esp32-s3-idf.yaml @@ -0,0 +1 @@ +<<: !include common-usb_serial_jtag.yaml diff --git a/tests/components/improv_serial/test.esp32-ard.yaml b/tests/components/improv_serial/test.esp32-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp32-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.esp32-c3-ard.yaml b/tests/components/improv_serial/test.esp32-c3-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp32-c3-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.esp32-c3-idf.yaml b/tests/components/improv_serial/test.esp32-c3-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp32-c3-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.esp32-idf.yaml b/tests/components/improv_serial/test.esp32-idf.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp32-idf.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.esp8266-ard.yaml b/tests/components/improv_serial/test.esp8266-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.esp8266-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml diff --git a/tests/components/improv_serial/test.rp2040-ard.yaml b/tests/components/improv_serial/test.rp2040-ard.yaml deleted file mode 100644 index dade44d145..0000000000 --- a/tests/components/improv_serial/test.rp2040-ard.yaml +++ /dev/null @@ -1 +0,0 @@ -<<: !include common.yaml From f1d19416be8753ff189562f5719b3e96a783414f Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:28:41 +1200 Subject: [PATCH 215/233] [i2s_audio] Allow config for primary/secondary i2s mode (#7092) --- esphome/components/i2s_audio/__init__.py | 10 ++++++++++ esphome/components/i2s_audio/microphone/__init__.py | 7 +++++++ .../i2s_audio/microphone/i2s_audio_microphone.cpp | 5 ++--- .../i2s_audio/microphone/i2s_audio_microphone.h | 3 +++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/esphome/components/i2s_audio/__init__.py b/esphome/components/i2s_audio/__init__.py index d72e13630f..05e44696d8 100644 --- a/esphome/components/i2s_audio/__init__.py +++ b/esphome/components/i2s_audio/__init__.py @@ -25,6 +25,10 @@ CONF_I2S_LRCLK_PIN = "i2s_lrclk_pin" CONF_I2S_AUDIO = "i2s_audio" CONF_I2S_AUDIO_ID = "i2s_audio_id" +CONF_I2S_MODE = "i2s_mode" +CONF_PRIMARY = "primary" +CONF_SECONDARY = "secondary" + i2s_audio_ns = cg.esphome_ns.namespace("i2s_audio") I2SAudioComponent = i2s_audio_ns.class_("I2SAudioComponent", cg.Component) I2SAudioIn = i2s_audio_ns.class_("I2SAudioIn", cg.Parented.template(I2SAudioComponent)) @@ -32,6 +36,12 @@ I2SAudioOut = i2s_audio_ns.class_( "I2SAudioOut", cg.Parented.template(I2SAudioComponent) ) +i2s_mode_t = cg.global_ns.enum("i2s_mode_t") +I2S_MODE_OPTIONS = { + CONF_PRIMARY: i2s_mode_t.I2S_MODE_MASTER, # NOLINT + CONF_SECONDARY: i2s_mode_t.I2S_MODE_SLAVE, # NOLINT +} + # https://github.com/espressif/esp-idf/blob/master/components/soc/{variant}/include/soc/soc_caps.h I2S_PORTS = { VARIANT_ESP32: 2, diff --git a/esphome/components/i2s_audio/microphone/__init__.py b/esphome/components/i2s_audio/microphone/__init__.py index d9c31e8e7b..844f176bea 100644 --- a/esphome/components/i2s_audio/microphone/__init__.py +++ b/esphome/components/i2s_audio/microphone/__init__.py @@ -7,6 +7,9 @@ from esphome.components import microphone, esp32 from esphome.components.adc import ESP32_VARIANT_ADC1_PIN_TO_CHANNEL, validate_adc_pin from .. import ( + CONF_I2S_MODE, + CONF_PRIMARY, + I2S_MODE_OPTIONS, i2s_audio_ns, I2SAudioComponent, I2SAudioIn, @@ -68,6 +71,9 @@ BASE_SCHEMA = microphone.MICROPHONE_SCHEMA.extend( _validate_bits, cv.enum(BITS_PER_SAMPLE) ), cv.Optional(CONF_USE_APLL, default=False): cv.boolean, + cv.Optional(CONF_I2S_MODE, default=CONF_PRIMARY): cv.enum( + I2S_MODE_OPTIONS, lower=True + ), } ).extend(cv.COMPONENT_SCHEMA) @@ -107,6 +113,7 @@ async def to_code(config): cg.add(var.set_din_pin(config[CONF_I2S_DIN_PIN])) cg.add(var.set_pdm(config[CONF_PDM])) + cg.add(var.set_i2s_mode(config[CONF_I2S_MODE])) cg.add(var.set_channel(config[CONF_CHANNEL])) cg.add(var.set_sample_rate(config[CONF_SAMPLE_RATE])) cg.add(var.set_bits_per_sample(config[CONF_BITS_PER_SAMPLE])) diff --git a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp index a672348d85..009fecdf90 100644 --- a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +++ b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp @@ -46,7 +46,7 @@ void I2SAudioMicrophone::start_() { return; // Waiting for another i2s to return lock } i2s_driver_config_t config = { - .mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_RX), + .mode = (i2s_mode_t) (this->i2s_mode_ | I2S_MODE_RX), .sample_rate = this->sample_rate_, .bits_per_sample = this->bits_per_sample_, .channel_format = this->channel_, @@ -174,8 +174,7 @@ size_t I2SAudioMicrophone::read(int16_t *buf, size_t len) { size_t samples_read = bytes_read / sizeof(int32_t); samples.resize(samples_read); for (size_t i = 0; i < samples_read; i++) { - int32_t temp = reinterpret_cast(buf)[i] >> 14; - samples[i] = clamp(temp, INT16_MIN, INT16_MAX); + samples[i] = reinterpret_cast(buf)[i] >> 16; } memcpy(buf, samples.data(), samples_read * sizeof(int16_t)); return samples_read * sizeof(int16_t); diff --git a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h index 68b9a94fbd..07ca0528aa 100644 --- a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +++ b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h @@ -30,6 +30,8 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub } #endif + void set_i2s_mode(i2s_mode_t mode) { this->i2s_mode_ = mode; } + void set_channel(i2s_channel_fmt_t channel) { this->channel_ = channel; } void set_sample_rate(uint32_t sample_rate) { this->sample_rate_ = sample_rate; } void set_bits_per_sample(i2s_bits_per_sample_t bits_per_sample) { this->bits_per_sample_ = bits_per_sample; } @@ -46,6 +48,7 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub bool adc_{false}; #endif bool pdm_{false}; + i2s_mode_t i2s_mode_{}; i2s_channel_fmt_t channel_; uint32_t sample_rate_; i2s_bits_per_sample_t bits_per_sample_; From c910fdf7e52354e8d4945bdeac44cd2000448d4c Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:29:45 +1200 Subject: [PATCH 216/233] [micro_wake_word] Allow simpler model config (#7094) --- esphome/components/micro_wake_word/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/components/micro_wake_word/__init__.py b/esphome/components/micro_wake_word/__init__.py index 3d3459ccab..c2faca25f4 100644 --- a/esphome/components/micro_wake_word/__init__.py +++ b/esphome/components/micro_wake_word/__init__.py @@ -357,7 +357,9 @@ CONFIG_SCHEMA = cv.All( { cv.GenerateID(): cv.declare_id(MicroWakeWord), cv.GenerateID(CONF_MICROPHONE): cv.use_id(microphone.Microphone), - cv.Required(CONF_MODELS): cv.ensure_list(MODEL_SCHEMA), + cv.Required(CONF_MODELS): cv.ensure_list( + cv.maybe_simple_value(MODEL_SCHEMA, key=CONF_MODEL) + ), cv.Optional(CONF_ON_WAKE_WORD_DETECTED): automation.validate_automation( single=True ), From eaf2bb70d9008d040427ec446cf9c4f7e515d524 Mon Sep 17 00:00:00 2001 From: Keith Burzinski Date: Sun, 14 Jul 2024 15:06:10 -0500 Subject: [PATCH 217/233] [improv_serial] Fix linker error created in #6998 (#7082) --- esphome/components/improv_serial/improv_serial_component.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esphome/components/improv_serial/improv_serial_component.cpp b/esphome/components/improv_serial/improv_serial_component.cpp index 02ffa9f31c..12809e38cb 100644 --- a/esphome/components/improv_serial/improv_serial_component.cpp +++ b/esphome/components/improv_serial/improv_serial_component.cpp @@ -57,7 +57,7 @@ optional ImprovSerialComponent::read_byte_() { } } break; -#ifdef USE_LOGGER_USB_CDC +#if defined(USE_LOGGER_USB_CDC) && defined(CONFIG_ESP_CONSOLE_USB_CDC) case logger::UART_SELECTION_USB_CDC: #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) if (esp_usb_console_available_for_read()) { @@ -99,7 +99,7 @@ void ImprovSerialComponent::write_data_(std::vector &data) { #endif // !USE_ESP32_VARIANT_ESP32C3 && !USE_ESP32_VARIANT_ESP32S2 && !USE_ESP32_VARIANT_ESP32S3 uart_write_bytes(this->uart_num_, data.data(), data.size()); break; -#ifdef USE_LOGGER_USB_CDC +#if defined(USE_LOGGER_USB_CDC) && defined(CONFIG_ESP_CONSOLE_USB_CDC) case logger::UART_SELECTION_USB_CDC: { const char *msg = (char *) data.data(); esp_usb_console_write_buf(msg, data.size()); @@ -109,6 +109,7 @@ void ImprovSerialComponent::write_data_(std::vector &data) { #ifdef USE_LOGGER_USB_SERIAL_JTAG case logger::UART_SELECTION_USB_SERIAL_JTAG: usb_serial_jtag_write_bytes((char *) data.data(), data.size(), 20 / portTICK_PERIOD_MS); + delay(10); usb_serial_jtag_ll_txfifo_flush(); // fixes for issue in IDF 4.4.7 break; #endif // USE_LOGGER_USB_SERIAL_JTAG From 41baf7066040900571bee2caeb5388578ce70268 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:28:41 +1200 Subject: [PATCH 218/233] [i2s_audio] Allow config for primary/secondary i2s mode (#7092) --- esphome/components/i2s_audio/__init__.py | 10 ++++++++++ esphome/components/i2s_audio/microphone/__init__.py | 7 +++++++ .../i2s_audio/microphone/i2s_audio_microphone.cpp | 5 ++--- .../i2s_audio/microphone/i2s_audio_microphone.h | 3 +++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/esphome/components/i2s_audio/__init__.py b/esphome/components/i2s_audio/__init__.py index d72e13630f..05e44696d8 100644 --- a/esphome/components/i2s_audio/__init__.py +++ b/esphome/components/i2s_audio/__init__.py @@ -25,6 +25,10 @@ CONF_I2S_LRCLK_PIN = "i2s_lrclk_pin" CONF_I2S_AUDIO = "i2s_audio" CONF_I2S_AUDIO_ID = "i2s_audio_id" +CONF_I2S_MODE = "i2s_mode" +CONF_PRIMARY = "primary" +CONF_SECONDARY = "secondary" + i2s_audio_ns = cg.esphome_ns.namespace("i2s_audio") I2SAudioComponent = i2s_audio_ns.class_("I2SAudioComponent", cg.Component) I2SAudioIn = i2s_audio_ns.class_("I2SAudioIn", cg.Parented.template(I2SAudioComponent)) @@ -32,6 +36,12 @@ I2SAudioOut = i2s_audio_ns.class_( "I2SAudioOut", cg.Parented.template(I2SAudioComponent) ) +i2s_mode_t = cg.global_ns.enum("i2s_mode_t") +I2S_MODE_OPTIONS = { + CONF_PRIMARY: i2s_mode_t.I2S_MODE_MASTER, # NOLINT + CONF_SECONDARY: i2s_mode_t.I2S_MODE_SLAVE, # NOLINT +} + # https://github.com/espressif/esp-idf/blob/master/components/soc/{variant}/include/soc/soc_caps.h I2S_PORTS = { VARIANT_ESP32: 2, diff --git a/esphome/components/i2s_audio/microphone/__init__.py b/esphome/components/i2s_audio/microphone/__init__.py index d9c31e8e7b..844f176bea 100644 --- a/esphome/components/i2s_audio/microphone/__init__.py +++ b/esphome/components/i2s_audio/microphone/__init__.py @@ -7,6 +7,9 @@ from esphome.components import microphone, esp32 from esphome.components.adc import ESP32_VARIANT_ADC1_PIN_TO_CHANNEL, validate_adc_pin from .. import ( + CONF_I2S_MODE, + CONF_PRIMARY, + I2S_MODE_OPTIONS, i2s_audio_ns, I2SAudioComponent, I2SAudioIn, @@ -68,6 +71,9 @@ BASE_SCHEMA = microphone.MICROPHONE_SCHEMA.extend( _validate_bits, cv.enum(BITS_PER_SAMPLE) ), cv.Optional(CONF_USE_APLL, default=False): cv.boolean, + cv.Optional(CONF_I2S_MODE, default=CONF_PRIMARY): cv.enum( + I2S_MODE_OPTIONS, lower=True + ), } ).extend(cv.COMPONENT_SCHEMA) @@ -107,6 +113,7 @@ async def to_code(config): cg.add(var.set_din_pin(config[CONF_I2S_DIN_PIN])) cg.add(var.set_pdm(config[CONF_PDM])) + cg.add(var.set_i2s_mode(config[CONF_I2S_MODE])) cg.add(var.set_channel(config[CONF_CHANNEL])) cg.add(var.set_sample_rate(config[CONF_SAMPLE_RATE])) cg.add(var.set_bits_per_sample(config[CONF_BITS_PER_SAMPLE])) diff --git a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp index a672348d85..009fecdf90 100644 --- a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +++ b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp @@ -46,7 +46,7 @@ void I2SAudioMicrophone::start_() { return; // Waiting for another i2s to return lock } i2s_driver_config_t config = { - .mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_RX), + .mode = (i2s_mode_t) (this->i2s_mode_ | I2S_MODE_RX), .sample_rate = this->sample_rate_, .bits_per_sample = this->bits_per_sample_, .channel_format = this->channel_, @@ -174,8 +174,7 @@ size_t I2SAudioMicrophone::read(int16_t *buf, size_t len) { size_t samples_read = bytes_read / sizeof(int32_t); samples.resize(samples_read); for (size_t i = 0; i < samples_read; i++) { - int32_t temp = reinterpret_cast(buf)[i] >> 14; - samples[i] = clamp(temp, INT16_MIN, INT16_MAX); + samples[i] = reinterpret_cast(buf)[i] >> 16; } memcpy(buf, samples.data(), samples_read * sizeof(int16_t)); return samples_read * sizeof(int16_t); diff --git a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h index 68b9a94fbd..07ca0528aa 100644 --- a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h +++ b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.h @@ -30,6 +30,8 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub } #endif + void set_i2s_mode(i2s_mode_t mode) { this->i2s_mode_ = mode; } + void set_channel(i2s_channel_fmt_t channel) { this->channel_ = channel; } void set_sample_rate(uint32_t sample_rate) { this->sample_rate_ = sample_rate; } void set_bits_per_sample(i2s_bits_per_sample_t bits_per_sample) { this->bits_per_sample_ = bits_per_sample; } @@ -46,6 +48,7 @@ class I2SAudioMicrophone : public I2SAudioIn, public microphone::Microphone, pub bool adc_{false}; #endif bool pdm_{false}; + i2s_mode_t i2s_mode_{}; i2s_channel_fmt_t channel_; uint32_t sample_rate_; i2s_bits_per_sample_t bits_per_sample_; From 0bbefb5b2a08f0f6b163f4d86c05b025e704b648 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:29:45 +1200 Subject: [PATCH 219/233] [micro_wake_word] Allow simpler model config (#7094) --- esphome/components/micro_wake_word/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/esphome/components/micro_wake_word/__init__.py b/esphome/components/micro_wake_word/__init__.py index 3d3459ccab..c2faca25f4 100644 --- a/esphome/components/micro_wake_word/__init__.py +++ b/esphome/components/micro_wake_word/__init__.py @@ -357,7 +357,9 @@ CONFIG_SCHEMA = cv.All( { cv.GenerateID(): cv.declare_id(MicroWakeWord), cv.GenerateID(CONF_MICROPHONE): cv.use_id(microphone.Microphone), - cv.Required(CONF_MODELS): cv.ensure_list(MODEL_SCHEMA), + cv.Required(CONF_MODELS): cv.ensure_list( + cv.maybe_simple_value(MODEL_SCHEMA, key=CONF_MODEL) + ), cv.Optional(CONF_ON_WAKE_WORD_DETECTED): automation.validate_automation( single=True ), From 4af8230b4f1b8c420caf53e7270d9f8e31d988c4 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 16:51:13 +1200 Subject: [PATCH 220/233] Bump version to 2024.7.0b3 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index 4776de4d67..dacd839eab 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.7.0b2" +__version__ = "2024.7.0b3" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From 0b3fe73b74b44f0be4f282a4cbe74252ba51453c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 17:13:02 +1200 Subject: [PATCH 221/233] Bump docker/build-push-action from 6.3.0 to 6.4.0 in /.github/actions/build-image (#7089) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index d5baf339aa..ac9a6ae53a 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.4.0 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.3.0 + uses: docker/build-push-action@v6.4.0 with: context: . file: ./docker/Dockerfile From 8980996b1aa84316e71b8ba5dea26c38c7b3f364 Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Tue, 16 Jul 2024 07:14:33 +0200 Subject: [PATCH 222/233] [CI] add web_server v1 test (#7090) --- tests/components/web_server/common.yaml | 4 ---- tests/components/web_server/common_v1.yaml | 5 +++++ tests/components/web_server/common_v2.yaml | 5 +++++ tests/components/web_server/test.esp32-ard.yaml | 2 +- tests/components/web_server/test.esp32-c3-ard.yaml | 2 +- tests/components/web_server/test.esp32-c3-idf.yaml | 2 +- tests/components/web_server/test.esp32-idf.yaml | 2 +- tests/components/web_server/test.esp8266-ard.yaml | 2 +- tests/components/web_server/test_v1.esp32-ard.yaml | 1 + 9 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 tests/components/web_server/common_v1.yaml create mode 100644 tests/components/web_server/common_v2.yaml create mode 100644 tests/components/web_server/test_v1.esp32-ard.yaml diff --git a/tests/components/web_server/common.yaml b/tests/components/web_server/common.yaml index 338d9e97d2..eb768eeb91 100644 --- a/tests/components/web_server/common.yaml +++ b/tests/components/web_server/common.yaml @@ -2,10 +2,6 @@ wifi: ssid: MySSID password: password1 -web_server: - port: 8080 - version: 2 - binary_sensor: cover: fan: diff --git a/tests/components/web_server/common_v1.yaml b/tests/components/web_server/common_v1.yaml new file mode 100644 index 0000000000..bf5aab4ce6 --- /dev/null +++ b/tests/components/web_server/common_v1.yaml @@ -0,0 +1,5 @@ +<<: !include common.yaml + +web_server: + port: 8080 + version: 1 diff --git a/tests/components/web_server/common_v2.yaml b/tests/components/web_server/common_v2.yaml new file mode 100644 index 0000000000..564c43e553 --- /dev/null +++ b/tests/components/web_server/common_v2.yaml @@ -0,0 +1,5 @@ +<<: !include common.yaml + +web_server: + port: 8080 + version: 2 diff --git a/tests/components/web_server/test.esp32-ard.yaml b/tests/components/web_server/test.esp32-ard.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp32-ard.yaml +++ b/tests/components/web_server/test.esp32-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test.esp32-c3-ard.yaml b/tests/components/web_server/test.esp32-c3-ard.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp32-c3-ard.yaml +++ b/tests/components/web_server/test.esp32-c3-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test.esp32-c3-idf.yaml b/tests/components/web_server/test.esp32-c3-idf.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp32-c3-idf.yaml +++ b/tests/components/web_server/test.esp32-c3-idf.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test.esp32-idf.yaml b/tests/components/web_server/test.esp32-idf.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp32-idf.yaml +++ b/tests/components/web_server/test.esp32-idf.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test.esp8266-ard.yaml b/tests/components/web_server/test.esp8266-ard.yaml index dade44d145..7e6658e20e 100644 --- a/tests/components/web_server/test.esp8266-ard.yaml +++ b/tests/components/web_server/test.esp8266-ard.yaml @@ -1 +1 @@ -<<: !include common.yaml +<<: !include common_v2.yaml diff --git a/tests/components/web_server/test_v1.esp32-ard.yaml b/tests/components/web_server/test_v1.esp32-ard.yaml new file mode 100644 index 0000000000..389a930284 --- /dev/null +++ b/tests/components/web_server/test_v1.esp32-ard.yaml @@ -0,0 +1 @@ +<<: !include common_v1.yaml From 659fdefccb851fa9e76d560b7574e5589b890d24 Mon Sep 17 00:00:00 2001 From: NewoPL <27411874+NewoPL@users.noreply.github.com> Date: Tue, 16 Jul 2024 08:28:23 +0200 Subject: [PATCH 223/233] [wifi] Hostname may not be set as expected on Arduino platform (#7050) * bug #6014: workaround for not setting hostname on arduino plarform * moving handle initailisation to ESPHOME_EVENT_ID_WIFI_STA_START callback --- esphome/components/wifi/wifi_component_esp32_arduino.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esphome/components/wifi/wifi_component_esp32_arduino.cpp b/esphome/components/wifi/wifi_component_esp32_arduino.cpp index fc954a2333..71548b7a3e 100644 --- a/esphome/components/wifi/wifi_component_esp32_arduino.cpp +++ b/esphome/components/wifi/wifi_component_esp32_arduino.cpp @@ -82,8 +82,8 @@ bool WiFiComponent::wifi_mode_(optional sta, optional ap) { // WiFiClass::mode above calls esp_netif_create_default_wifi_sta() and // esp_netif_create_default_wifi_ap(), which creates the interfaces. - if (set_sta) - s_sta_netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); + // s_sta_netif handle is set during ESPHOME_EVENT_ID_WIFI_STA_START event + #ifdef USE_WIFI_AP if (set_ap) s_ap_netif = esp_netif_get_handle_from_ifkey("WIFI_AP_DEF"); @@ -495,6 +495,7 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_ case ESPHOME_EVENT_ID_WIFI_STA_START: { ESP_LOGV(TAG, "Event: WiFi STA start"); // apply hostname + s_sta_netif = esp_netif_get_handle_from_ifkey("WIFI_STA_DEF"); esp_err_t err = esp_netif_set_hostname(s_sta_netif, App.get_name().c_str()); if (err != ERR_OK) { ESP_LOGW(TAG, "esp_netif_set_hostname failed: %s", esp_err_to_name(err)); From 193db50668d7f343e5ae22bcf6e3a5b1e2309adf Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 19:18:43 +1200 Subject: [PATCH 224/233] [ota] Print Arduino update errors (#7096) --- .../ota/ota_backend_arduino_esp32.cpp | 29 ++++++++++++----- .../ota/ota_backend_arduino_esp8266.cpp | 31 ++++++++++++++----- .../ota/ota_backend_arduino_libretiny.cpp | 29 ++++++++++++----- .../ota/ota_backend_arduino_rp2040.cpp | 29 ++++++++++++----- 4 files changed, 89 insertions(+), 29 deletions(-) diff --git a/esphome/components/ota/ota_backend_arduino_esp32.cpp b/esphome/components/ota/ota_backend_arduino_esp32.cpp index 62c6a72388..15dfc98a6c 100644 --- a/esphome/components/ota/ota_backend_arduino_esp32.cpp +++ b/esphome/components/ota/ota_backend_arduino_esp32.cpp @@ -1,14 +1,17 @@ #ifdef USE_ESP32_FRAMEWORK_ARDUINO #include "esphome/core/defines.h" +#include "esphome/core/log.h" -#include "ota_backend_arduino_esp32.h" #include "ota_backend.h" +#include "ota_backend_arduino_esp32.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_esp32"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoESP32OTABackend::begin(size_t image_size) { @@ -20,6 +23,9 @@ OTAResponseTypes ArduinoESP32OTABackend::begin(size_t image_size) { uint8_t error = Update.getError(); if (error == UPDATE_ERROR_SIZE) return OTA_RESPONSE_ERROR_ESP32_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -27,16 +33,25 @@ void ArduinoESP32OTABackend::set_update_md5(const char *md5) { Update.setMD5(md5 OTAResponseTypes ArduinoESP32OTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoESP32OTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoESP32OTABackend::abort() { Update.abort(); } diff --git a/esphome/components/ota/ota_backend_arduino_esp8266.cpp b/esphome/components/ota/ota_backend_arduino_esp8266.cpp index b317075bd0..42edbf5d2b 100644 --- a/esphome/components/ota/ota_backend_arduino_esp8266.cpp +++ b/esphome/components/ota/ota_backend_arduino_esp8266.cpp @@ -1,16 +1,19 @@ #ifdef USE_ARDUINO #ifdef USE_ESP8266 -#include "ota_backend.h" #include "ota_backend_arduino_esp8266.h" +#include "ota_backend.h" -#include "esphome/core/defines.h" #include "esphome/components/esp8266/preferences.h" +#include "esphome/core/defines.h" +#include "esphome/core/log.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_esp8266"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoESP8266OTABackend::begin(size_t image_size) { @@ -29,6 +32,9 @@ OTAResponseTypes ArduinoESP8266OTABackend::begin(size_t image_size) { return OTA_RESPONSE_ERROR_WRONG_CURRENT_FLASH_CONFIG; if (error == UPDATE_ERROR_SPACE) return OTA_RESPONSE_ERROR_ESP8266_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -36,16 +42,25 @@ void ArduinoESP8266OTABackend::set_update_md5(const char *md5) { Update.setMD5(m OTAResponseTypes ArduinoESP8266OTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoESP8266OTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoESP8266OTABackend::abort() { diff --git a/esphome/components/ota/ota_backend_arduino_libretiny.cpp b/esphome/components/ota/ota_backend_arduino_libretiny.cpp index df4e774ebc..6b2cf80684 100644 --- a/esphome/components/ota/ota_backend_arduino_libretiny.cpp +++ b/esphome/components/ota/ota_backend_arduino_libretiny.cpp @@ -1,14 +1,17 @@ #ifdef USE_LIBRETINY -#include "ota_backend.h" #include "ota_backend_arduino_libretiny.h" +#include "ota_backend.h" #include "esphome/core/defines.h" +#include "esphome/core/log.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_libretiny"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoLibreTinyOTABackend::begin(size_t image_size) { @@ -20,6 +23,9 @@ OTAResponseTypes ArduinoLibreTinyOTABackend::begin(size_t image_size) { uint8_t error = Update.getError(); if (error == UPDATE_ERROR_SIZE) return OTA_RESPONSE_ERROR_ESP32_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -27,16 +33,25 @@ void ArduinoLibreTinyOTABackend::set_update_md5(const char *md5) { Update.setMD5 OTAResponseTypes ArduinoLibreTinyOTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoLibreTinyOTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoLibreTinyOTABackend::abort() { Update.abort(); } diff --git a/esphome/components/ota/ota_backend_arduino_rp2040.cpp b/esphome/components/ota/ota_backend_arduino_rp2040.cpp index 4448b0c95e..ffeab2e93f 100644 --- a/esphome/components/ota/ota_backend_arduino_rp2040.cpp +++ b/esphome/components/ota/ota_backend_arduino_rp2040.cpp @@ -1,16 +1,19 @@ #ifdef USE_ARDUINO #ifdef USE_RP2040 -#include "ota_backend.h" #include "ota_backend_arduino_rp2040.h" +#include "ota_backend.h" #include "esphome/components/rp2040/preferences.h" #include "esphome/core/defines.h" +#include "esphome/core/log.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_rp2040"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoRP2040OTABackend::begin(size_t image_size) { @@ -29,6 +32,9 @@ OTAResponseTypes ArduinoRP2040OTABackend::begin(size_t image_size) { return OTA_RESPONSE_ERROR_WRONG_CURRENT_FLASH_CONFIG; if (error == UPDATE_ERROR_SPACE) return OTA_RESPONSE_ERROR_RP2040_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -36,16 +42,25 @@ void ArduinoRP2040OTABackend::set_update_md5(const char *md5) { Update.setMD5(md OTAResponseTypes ArduinoRP2040OTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoRP2040OTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoRP2040OTABackend::abort() { From 10205e06cb1de3b65e81dfcdc5a20fe890155162 Mon Sep 17 00:00:00 2001 From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com> Date: Tue, 16 Jul 2024 19:06:27 +1000 Subject: [PATCH 225/233] Add host uart support for MacOS (#7095) --- esphome/components/uart/uart_component_host.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/esphome/components/uart/uart_component_host.cpp b/esphome/components/uart/uart_component_host.cpp index d8d2fd75b8..40d3e91ab2 100644 --- a/esphome/components/uart/uart_component_host.cpp +++ b/esphome/components/uart/uart_component_host.cpp @@ -5,8 +5,8 @@ #include "esphome/core/helpers.h" #include "esphome/core/log.h" -#ifndef __linux__ -#error This HostUartComponent implementation is only for Linux +#if !(defined(__linux__) || defined(__APPLE__)) +#error This HostUartComponent implementation is not supported on this host OS #endif #include @@ -24,6 +24,9 @@ namespace { speed_t get_baud(int baud) { +#ifdef __APPLE__ + return baud; +#else switch (baud) { case 50: return B50; @@ -88,6 +91,7 @@ speed_t get_baud(int baud) { default: return B0; } +#endif } } // namespace From f153a7b0fd20bdf9a6b0772553c99f05021b04b7 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Tue, 16 Jul 2024 19:18:43 +1200 Subject: [PATCH 226/233] [ota] Print Arduino update errors (#7096) --- .../ota/ota_backend_arduino_esp32.cpp | 29 ++++++++++++----- .../ota/ota_backend_arduino_esp8266.cpp | 31 ++++++++++++++----- .../ota/ota_backend_arduino_libretiny.cpp | 29 ++++++++++++----- .../ota/ota_backend_arduino_rp2040.cpp | 29 ++++++++++++----- 4 files changed, 89 insertions(+), 29 deletions(-) diff --git a/esphome/components/ota/ota_backend_arduino_esp32.cpp b/esphome/components/ota/ota_backend_arduino_esp32.cpp index 62c6a72388..15dfc98a6c 100644 --- a/esphome/components/ota/ota_backend_arduino_esp32.cpp +++ b/esphome/components/ota/ota_backend_arduino_esp32.cpp @@ -1,14 +1,17 @@ #ifdef USE_ESP32_FRAMEWORK_ARDUINO #include "esphome/core/defines.h" +#include "esphome/core/log.h" -#include "ota_backend_arduino_esp32.h" #include "ota_backend.h" +#include "ota_backend_arduino_esp32.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_esp32"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoESP32OTABackend::begin(size_t image_size) { @@ -20,6 +23,9 @@ OTAResponseTypes ArduinoESP32OTABackend::begin(size_t image_size) { uint8_t error = Update.getError(); if (error == UPDATE_ERROR_SIZE) return OTA_RESPONSE_ERROR_ESP32_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -27,16 +33,25 @@ void ArduinoESP32OTABackend::set_update_md5(const char *md5) { Update.setMD5(md5 OTAResponseTypes ArduinoESP32OTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoESP32OTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoESP32OTABackend::abort() { Update.abort(); } diff --git a/esphome/components/ota/ota_backend_arduino_esp8266.cpp b/esphome/components/ota/ota_backend_arduino_esp8266.cpp index b317075bd0..42edbf5d2b 100644 --- a/esphome/components/ota/ota_backend_arduino_esp8266.cpp +++ b/esphome/components/ota/ota_backend_arduino_esp8266.cpp @@ -1,16 +1,19 @@ #ifdef USE_ARDUINO #ifdef USE_ESP8266 -#include "ota_backend.h" #include "ota_backend_arduino_esp8266.h" +#include "ota_backend.h" -#include "esphome/core/defines.h" #include "esphome/components/esp8266/preferences.h" +#include "esphome/core/defines.h" +#include "esphome/core/log.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_esp8266"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoESP8266OTABackend::begin(size_t image_size) { @@ -29,6 +32,9 @@ OTAResponseTypes ArduinoESP8266OTABackend::begin(size_t image_size) { return OTA_RESPONSE_ERROR_WRONG_CURRENT_FLASH_CONFIG; if (error == UPDATE_ERROR_SPACE) return OTA_RESPONSE_ERROR_ESP8266_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -36,16 +42,25 @@ void ArduinoESP8266OTABackend::set_update_md5(const char *md5) { Update.setMD5(m OTAResponseTypes ArduinoESP8266OTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoESP8266OTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoESP8266OTABackend::abort() { diff --git a/esphome/components/ota/ota_backend_arduino_libretiny.cpp b/esphome/components/ota/ota_backend_arduino_libretiny.cpp index df4e774ebc..6b2cf80684 100644 --- a/esphome/components/ota/ota_backend_arduino_libretiny.cpp +++ b/esphome/components/ota/ota_backend_arduino_libretiny.cpp @@ -1,14 +1,17 @@ #ifdef USE_LIBRETINY -#include "ota_backend.h" #include "ota_backend_arduino_libretiny.h" +#include "ota_backend.h" #include "esphome/core/defines.h" +#include "esphome/core/log.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_libretiny"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoLibreTinyOTABackend::begin(size_t image_size) { @@ -20,6 +23,9 @@ OTAResponseTypes ArduinoLibreTinyOTABackend::begin(size_t image_size) { uint8_t error = Update.getError(); if (error == UPDATE_ERROR_SIZE) return OTA_RESPONSE_ERROR_ESP32_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -27,16 +33,25 @@ void ArduinoLibreTinyOTABackend::set_update_md5(const char *md5) { Update.setMD5 OTAResponseTypes ArduinoLibreTinyOTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoLibreTinyOTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoLibreTinyOTABackend::abort() { Update.abort(); } diff --git a/esphome/components/ota/ota_backend_arduino_rp2040.cpp b/esphome/components/ota/ota_backend_arduino_rp2040.cpp index 4448b0c95e..ffeab2e93f 100644 --- a/esphome/components/ota/ota_backend_arduino_rp2040.cpp +++ b/esphome/components/ota/ota_backend_arduino_rp2040.cpp @@ -1,16 +1,19 @@ #ifdef USE_ARDUINO #ifdef USE_RP2040 -#include "ota_backend.h" #include "ota_backend_arduino_rp2040.h" +#include "ota_backend.h" #include "esphome/components/rp2040/preferences.h" #include "esphome/core/defines.h" +#include "esphome/core/log.h" #include namespace esphome { namespace ota { +static const char *const TAG = "ota.arduino_rp2040"; + std::unique_ptr make_ota_backend() { return make_unique(); } OTAResponseTypes ArduinoRP2040OTABackend::begin(size_t image_size) { @@ -29,6 +32,9 @@ OTAResponseTypes ArduinoRP2040OTABackend::begin(size_t image_size) { return OTA_RESPONSE_ERROR_WRONG_CURRENT_FLASH_CONFIG; if (error == UPDATE_ERROR_SPACE) return OTA_RESPONSE_ERROR_RP2040_NOT_ENOUGH_SPACE; + + ESP_LOGE(TAG, "Begin error: %d", error); + return OTA_RESPONSE_ERROR_UNKNOWN; } @@ -36,16 +42,25 @@ void ArduinoRP2040OTABackend::set_update_md5(const char *md5) { Update.setMD5(md OTAResponseTypes ArduinoRP2040OTABackend::write(uint8_t *data, size_t len) { size_t written = Update.write(data, len); - if (written != len) { - return OTA_RESPONSE_ERROR_WRITING_FLASH; + if (written == len) { + return OTA_RESPONSE_OK; } - return OTA_RESPONSE_OK; + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "Write error: %d", error); + + return OTA_RESPONSE_ERROR_WRITING_FLASH; } OTAResponseTypes ArduinoRP2040OTABackend::end() { - if (!Update.end()) - return OTA_RESPONSE_ERROR_UPDATE_END; - return OTA_RESPONSE_OK; + if (Update.end()) { + return OTA_RESPONSE_OK; + } + + uint8_t error = Update.getError(); + ESP_LOGE(TAG, "End error: %d", error); + + return OTA_RESPONSE_ERROR_UPDATE_END; } void ArduinoRP2040OTABackend::abort() { From c512d5ebb66346cea81144b207408f19936f006d Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 17 Jul 2024 11:15:19 +1200 Subject: [PATCH 227/233] Bump version to 2024.7.0b4 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index dacd839eab..b59a2e9517 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.7.0b3" +__version__ = "2024.7.0b4" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From e15d0ee150e879e2a6dce7b53ad7d35a2d500624 Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Wed, 17 Jul 2024 14:54:44 +1200 Subject: [PATCH 228/233] Bump version to 2024.7.0 --- esphome/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esphome/const.py b/esphome/const.py index b59a2e9517..d581f68470 100644 --- a/esphome/const.py +++ b/esphome/const.py @@ -1,6 +1,6 @@ """Constants used by esphome.""" -__version__ = "2024.7.0b4" +__version__ = "2024.7.0" ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_" VALID_SUBSTITUTIONS_CHARACTERS = ( From dd20c5eab0ca2441e7911ae85638a5a8237534cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:33:30 +1200 Subject: [PATCH 229/233] Bump docker/build-push-action from 6.4.0 to 6.4.1 in /.github/actions/build-image (#7102) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/actions/build-image/action.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/build-image/action.yaml b/.github/actions/build-image/action.yaml index ac9a6ae53a..e2febdad1b 100644 --- a/.github/actions/build-image/action.yaml +++ b/.github/actions/build-image/action.yaml @@ -46,7 +46,7 @@ runs: - name: Build and push to ghcr by digest id: build-ghcr - uses: docker/build-push-action@v6.4.0 + uses: docker/build-push-action@v6.4.1 with: context: . file: ./docker/Dockerfile @@ -69,7 +69,7 @@ runs: - name: Build and push to dockerhub by digest id: build-dockerhub - uses: docker/build-push-action@v6.4.0 + uses: docker/build-push-action@v6.4.1 with: context: . file: ./docker/Dockerfile From b32078a5fe8b05f6f3bf4234b24ec8b3a6871d02 Mon Sep 17 00:00:00 2001 From: Alex Cortelyou <1689668+acortelyou@users.noreply.github.com> Date: Thu, 18 Jul 2024 15:04:11 -0700 Subject: [PATCH 230/233] Prevent rename from deleting new config (#7104) --- esphome/__main__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/__main__.py b/esphome/__main__.py index 5ff1a28ec7..b13f96daf7 100644 --- a/esphome/__main__.py +++ b/esphome/__main__.py @@ -695,7 +695,8 @@ def command_rename(args, config): os.remove(new_path) return 1 - os.remove(CORE.config_path) + if CORE.config_path != new_path: + os.remove(CORE.config_path) print(color(Fore.BOLD_GREEN, "SUCCESS")) print() From 0fb89d186964bc31b28b9873d3245981d19ce8df Mon Sep 17 00:00:00 2001 From: Jesse Hills <3060199+jesserockz@users.noreply.github.com> Date: Fri, 19 Jul 2024 11:26:21 +1200 Subject: [PATCH 231/233] [code-quality] Add some ruff configuration (#7103) --- pyproject.toml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index fe558f695f..cfc279845f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -105,3 +105,33 @@ disable = [ [tool.pylint.FORMAT] expected-line-ending-format = "LF" + +[tool.ruff] +required-version = ">=0.5.0" + +[tool.ruff.lint] +select = [ + "E", # pycodestyle + "F", # pyflakes/autoflake + "I", # isort + "PL", # pylint + "UP", # pyupgrade +] + +ignore = [ + "E501", # line too long + "PLR0911", # Too many return statements ({returns} > {max_returns}) + "PLR0912", # Too many branches ({branches} > {max_branches}) + "PLR0913", # Too many arguments to function call ({c_args} > {max_args}) + "PLR0915", # Too many statements ({statements} > {max_statements}) + "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable + "PLW2901", # Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target +] + +[tool.ruff.lint.isort] +force-sort-within-sections = true +known-first-party = [ + "esphome", +] +combine-as-imports = true +split-on-trailing-comma = false From c5b77f45902c7a3497278ecbadc6c4b799927d11 Mon Sep 17 00:00:00 2001 From: tomaszduda23 Date: Fri, 19 Jul 2024 06:35:41 +0200 Subject: [PATCH 232/233] [web_server] move v1 code to separate file (#7091) --- esphome/components/web_server/web_server.cpp | 209 ----------------- .../components/web_server/web_server_v1.cpp | 217 ++++++++++++++++++ 2 files changed, 217 insertions(+), 209 deletions(-) create mode 100644 esphome/components/web_server/web_server_v1.cpp diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp index 9a1641e86f..6fb04f558a 100644 --- a/esphome/components/web_server/web_server.cpp +++ b/esphome/components/web_server/web_server.cpp @@ -46,29 +46,6 @@ static const char *const HEADER_CORS_REQ_PNA = "Access-Control-Request-Private-N static const char *const HEADER_CORS_ALLOW_PNA = "Access-Control-Allow-Private-Network"; #endif -#if USE_WEBSERVER_VERSION == 1 -void write_row(AsyncResponseStream *stream, EntityBase *obj, const std::string &klass, const std::string &action, - const std::function &action_func = nullptr) { - stream->print("print(klass.c_str()); - if (obj->is_internal()) - stream->print(" internal"); - stream->print("\" id=\""); - stream->print(klass.c_str()); - stream->print("-"); - stream->print(obj->get_object_id().c_str()); - stream->print("\">"); - stream->print(obj->get_name().c_str()); - stream->print(""); - stream->print(action.c_str()); - if (action_func) { - action_func(*stream, obj); - } - stream->print(""); - stream->print(""); -} -#endif - UrlMatch match_url(const std::string &url, bool only_domain = false) { UrlMatch match; match.valid = false; @@ -102,11 +79,6 @@ WebServer::WebServer(web_server_base::WebServerBase *base) #endif } -#if USE_WEBSERVER_VERSION == 1 -void WebServer::set_css_url(const char *css_url) { this->css_url_ = css_url; } -void WebServer::set_js_url(const char *js_url) { this->js_url_ = js_url; } -#endif - #ifdef USE_WEBSERVER_CSS_INCLUDE void WebServer::set_css_include(const char *css_include) { this->css_include_ = css_include; } #endif @@ -181,187 +153,6 @@ void WebServer::handle_index_request(AsyncWebServerRequest *request) { response->addHeader("Content-Encoding", "gzip"); request->send(response); } -#elif USE_WEBSERVER_VERSION == 1 -void WebServer::handle_index_request(AsyncWebServerRequest *request) { - AsyncResponseStream *stream = request->beginResponseStream("text/html"); - const std::string &title = App.get_name(); - stream->print(F("")); - stream->print(title.c_str()); - stream->print(F("")); -#ifdef USE_WEBSERVER_CSS_INCLUDE - stream->print(F("")); -#endif - if (strlen(this->css_url_) > 0) { - stream->print(F(R"(print(this->css_url_); - stream->print(F("\">")); - } - stream->print(F("")); - stream->print(F("

")); - stream->print(title.c_str()); - stream->print(F("

")); - stream->print(F("

States

")); - -#ifdef USE_SENSOR - for (auto *obj : App.get_sensors()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "sensor", ""); - } -#endif - -#ifdef USE_SWITCH - for (auto *obj : App.get_switches()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "switch", ""); - } -#endif - -#ifdef USE_BUTTON - for (auto *obj : App.get_buttons()) - write_row(stream, obj, "button", ""); -#endif - -#ifdef USE_BINARY_SENSOR - for (auto *obj : App.get_binary_sensors()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "binary_sensor", ""); - } -#endif - -#ifdef USE_FAN - for (auto *obj : App.get_fans()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "fan", ""); - } -#endif - -#ifdef USE_LIGHT - for (auto *obj : App.get_lights()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "light", ""); - } -#endif - -#ifdef USE_TEXT_SENSOR - for (auto *obj : App.get_text_sensors()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "text_sensor", ""); - } -#endif - -#ifdef USE_COVER - for (auto *obj : App.get_covers()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "cover", ""); - } -#endif - -#ifdef USE_NUMBER - for (auto *obj : App.get_numbers()) { - if (this->include_internal_ || !obj->is_internal()) { - write_row(stream, obj, "number", "", [](AsyncResponseStream &stream, EntityBase *obj) { - number::Number *number = (number::Number *) obj; - stream.print(R"(traits.get_min_value()); - stream.print(R"(" max=")"); - stream.print(number->traits.get_max_value()); - stream.print(R"(" step=")"); - stream.print(number->traits.get_step()); - stream.print(R"(" value=")"); - stream.print(number->state); - stream.print(R"("/>)"); - }); - } - } -#endif - -#ifdef USE_TEXT - for (auto *obj : App.get_texts()) { - if (this->include_internal_ || !obj->is_internal()) { - write_row(stream, obj, "text", "", [](AsyncResponseStream &stream, EntityBase *obj) { - text::Text *text = (text::Text *) obj; - auto mode = (int) text->traits.get_mode(); - stream.print(R"(traits.get_min_length()); - stream.print(R"(" maxlength=")"); - stream.print(text->traits.get_max_length()); - stream.print(R"(" pattern=")"); - stream.print(text->traits.get_pattern().c_str()); - stream.print(R"(" value=")"); - stream.print(text->state.c_str()); - stream.print(R"("/>)"); - }); - } - } -#endif - -#ifdef USE_SELECT - for (auto *obj : App.get_selects()) { - if (this->include_internal_ || !obj->is_internal()) { - write_row(stream, obj, "select", "", [](AsyncResponseStream &stream, EntityBase *obj) { - select::Select *select = (select::Select *) obj; - stream.print(""); - }); - } - } -#endif - -#ifdef USE_LOCK - for (auto *obj : App.get_locks()) { - if (this->include_internal_ || !obj->is_internal()) { - write_row(stream, obj, "lock", "", [](AsyncResponseStream &stream, EntityBase *obj) { - lock::Lock *lock = (lock::Lock *) obj; - stream.print(""); - if (lock->traits.get_supports_open()) { - stream.print(""); - } - }); - } - } -#endif - -#ifdef USE_CLIMATE - for (auto *obj : App.get_climates()) { - if (this->include_internal_ || !obj->is_internal()) - write_row(stream, obj, "climate", ""); - } -#endif - - stream->print(F("
NameStateActions

See ESPHome Web API for " - "REST API documentation.

")); - if (this->allow_ota_) { - stream->print( - F("

OTA Update

")); - } - stream->print(F("

Debug Log

"));
-#ifdef USE_WEBSERVER_JS_INCLUDE
-  if (this->js_include_ != nullptr) {
-    stream->print(F(""));
-  }
-#endif
-  if (strlen(this->js_url_) > 0) {
-    stream->print(F(""));
-  }
-  stream->print(F("
")); - request->send(stream); -} #elif USE_WEBSERVER_VERSION >= 2 void WebServer::handle_index_request(AsyncWebServerRequest *request) { AsyncWebServerResponse *response = diff --git a/esphome/components/web_server/web_server_v1.cpp b/esphome/components/web_server/web_server_v1.cpp new file mode 100644 index 0000000000..c9b38a2dc4 --- /dev/null +++ b/esphome/components/web_server/web_server_v1.cpp @@ -0,0 +1,217 @@ +#include "web_server.h" +#include "esphome/core/application.h" + +#if USE_WEBSERVER_VERSION == 1 + +namespace esphome { +namespace web_server { + +void write_row(AsyncResponseStream *stream, EntityBase *obj, const std::string &klass, const std::string &action, + const std::function &action_func = nullptr) { + stream->print("print(klass.c_str()); + if (obj->is_internal()) + stream->print(" internal"); + stream->print("\" id=\""); + stream->print(klass.c_str()); + stream->print("-"); + stream->print(obj->get_object_id().c_str()); + stream->print("\">"); + stream->print(obj->get_name().c_str()); + stream->print(""); + stream->print(action.c_str()); + if (action_func) { + action_func(*stream, obj); + } + stream->print(""); + stream->print(""); +} + +void WebServer::set_css_url(const char *css_url) { this->css_url_ = css_url; } + +void WebServer::set_js_url(const char *js_url) { this->js_url_ = js_url; } + +void WebServer::handle_index_request(AsyncWebServerRequest *request) { + AsyncResponseStream *stream = request->beginResponseStream("text/html"); + const std::string &title = App.get_name(); + stream->print(F("")); + stream->print(title.c_str()); + stream->print(F("")); +#ifdef USE_WEBSERVER_CSS_INCLUDE + stream->print(F("")); +#endif + if (strlen(this->css_url_) > 0) { + stream->print(F(R"(print(this->css_url_); + stream->print(F("\">")); + } + stream->print(F("")); + stream->print(F("

")); + stream->print(title.c_str()); + stream->print(F("

")); + stream->print(F("

States

")); + +#ifdef USE_SENSOR + for (auto *obj : App.get_sensors()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "sensor", ""); + } +#endif + +#ifdef USE_SWITCH + for (auto *obj : App.get_switches()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "switch", ""); + } +#endif + +#ifdef USE_BUTTON + for (auto *obj : App.get_buttons()) + write_row(stream, obj, "button", ""); +#endif + +#ifdef USE_BINARY_SENSOR + for (auto *obj : App.get_binary_sensors()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "binary_sensor", ""); + } +#endif + +#ifdef USE_FAN + for (auto *obj : App.get_fans()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "fan", ""); + } +#endif + +#ifdef USE_LIGHT + for (auto *obj : App.get_lights()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "light", ""); + } +#endif + +#ifdef USE_TEXT_SENSOR + for (auto *obj : App.get_text_sensors()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "text_sensor", ""); + } +#endif + +#ifdef USE_COVER + for (auto *obj : App.get_covers()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "cover", ""); + } +#endif + +#ifdef USE_NUMBER + for (auto *obj : App.get_numbers()) { + if (this->include_internal_ || !obj->is_internal()) { + write_row(stream, obj, "number", "", [](AsyncResponseStream &stream, EntityBase *obj) { + number::Number *number = (number::Number *) obj; + stream.print(R"(traits.get_min_value()); + stream.print(R"(" max=")"); + stream.print(number->traits.get_max_value()); + stream.print(R"(" step=")"); + stream.print(number->traits.get_step()); + stream.print(R"(" value=")"); + stream.print(number->state); + stream.print(R"("/>)"); + }); + } + } +#endif + +#ifdef USE_TEXT + for (auto *obj : App.get_texts()) { + if (this->include_internal_ || !obj->is_internal()) { + write_row(stream, obj, "text", "", [](AsyncResponseStream &stream, EntityBase *obj) { + text::Text *text = (text::Text *) obj; + auto mode = (int) text->traits.get_mode(); + stream.print(R"(traits.get_min_length()); + stream.print(R"(" maxlength=")"); + stream.print(text->traits.get_max_length()); + stream.print(R"(" pattern=")"); + stream.print(text->traits.get_pattern().c_str()); + stream.print(R"(" value=")"); + stream.print(text->state.c_str()); + stream.print(R"("/>)"); + }); + } + } +#endif + +#ifdef USE_SELECT + for (auto *obj : App.get_selects()) { + if (this->include_internal_ || !obj->is_internal()) { + write_row(stream, obj, "select", "", [](AsyncResponseStream &stream, EntityBase *obj) { + select::Select *select = (select::Select *) obj; + stream.print(""); + }); + } + } +#endif + +#ifdef USE_LOCK + for (auto *obj : App.get_locks()) { + if (this->include_internal_ || !obj->is_internal()) { + write_row(stream, obj, "lock", "", [](AsyncResponseStream &stream, EntityBase *obj) { + lock::Lock *lock = (lock::Lock *) obj; + stream.print(""); + if (lock->traits.get_supports_open()) { + stream.print(""); + } + }); + } + } +#endif + +#ifdef USE_CLIMATE + for (auto *obj : App.get_climates()) { + if (this->include_internal_ || !obj->is_internal()) + write_row(stream, obj, "climate", ""); + } +#endif + + stream->print(F("
NameStateActions

See ESPHome Web API for " + "REST API documentation.

")); + if (this->allow_ota_) { + stream->print( + F("

OTA Update

")); + } + stream->print(F("

Debug Log

"));
+#ifdef USE_WEBSERVER_JS_INCLUDE
+  if (this->js_include_ != nullptr) {
+    stream->print(F(""));
+  }
+#endif
+  if (strlen(this->js_url_) > 0) {
+    stream->print(F(""));
+  }
+  stream->print(F("
")); + request->send(stream); +} + +} // namespace web_server +} // namespace esphome +#endif From 32b927de7e319a4a1357a047959d365ccb85e919 Mon Sep 17 00:00:00 2001 From: Kevin Ahrendt Date: Fri, 19 Jul 2024 15:15:11 -0400 Subject: [PATCH 233/233] revert bit shift to match previous behavior (#7109) --- .../components/i2s_audio/microphone/i2s_audio_microphone.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp index 009fecdf90..cb49a744fc 100644 --- a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp +++ b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp @@ -174,7 +174,8 @@ size_t I2SAudioMicrophone::read(int16_t *buf, size_t len) { size_t samples_read = bytes_read / sizeof(int32_t); samples.resize(samples_read); for (size_t i = 0; i < samples_read; i++) { - samples[i] = reinterpret_cast(buf)[i] >> 16; + int32_t temp = reinterpret_cast(buf)[i] >> 14; + samples[i] = clamp(temp, INT16_MIN, INT16_MAX); } memcpy(buf, samples.data(), samples_read * sizeof(int16_t)); return samples_read * sizeof(int16_t);